Merge pull request #16 from GRA0007/dev

Translations and bug fixes
This commit is contained in:
Benjamin Grant 2021-05-25 17:32:06 +10:00 committed by GitHub
commit 837cd91974
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
44 changed files with 1114 additions and 109 deletions

View file

@ -18,8 +18,8 @@
"i18next": "^20.2.4",
"i18next-browser-languagedetector": "^6.1.1",
"i18next-http-backend": "^1.2.4",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-hook-form": "^6.15.4",
"react-i18next": "^11.8.15",
"react-router-dom": "^5.2.0",

View file

@ -14,7 +14,7 @@
"choose": "Wählen Sie einen spendenbetrag"
},
"messages": {
"about": "Wussten Sie, dass Crab Fit mehr als $100 pro monat kostet? Wenn es Ihnen heraus überhaupt geholfen hat, zu prüfen, um hilfe zu spenden hält es läuft. 🦀",
"about": "Wenn es Ihnen heraus überhaupt geholfen hat, zu prüfen, um hilfe zu spenden hält es läuft. 🦀",
"success": "Vielen dank für Ihre spende! Ohne dich wäre Crab Fit nicht kostenlos, also danke und sei weiterhin super toll!",
"error": "Kann nicht spende durch Google machen. Bitte versuchen Sie über die website crab.fit zu spenden 🦀"
}

View file

@ -51,7 +51,7 @@
"p2": "Viele Crab Fits erstellen? Holen Sie sich die <1>Chrome-Erweiterung</1> oder <3>Firefox-Erweiterung</3> für Ihren browser! Sie können die <5>Android-App</5> auch unterwegs auf Crab Fit herunterladen.",
"p3": "Crab Fit wurde von <1>Ben Grant</1> entwickelt und ist die moderne lösung für Ihre debatten zur planung von gruppenveranstaltungen.",
"p4": "Der code für Crab Fit ist open source. Wenn sie probleme finden oder einen beitrag leisten möchten, können Sie das <1>repository</1> besuchen. Durch die verwendung von Crab Fit stimmen sie den <3>datenschutzbestimmungen</3>.",
"p5": "Crab Fit kostet mehr als <strong>$100 pro monat</strong>. Erwägen sie unten zu spenden, wenn es Ihnen geholfen hat, damit es für alle kostenlos bleibt. 🦀"
"p5": "Erwägen sie unten zu spenden, wenn es Ihnen geholfen hat, damit es für alle kostenlos bleibt. 🦀"
}
}
}

View file

@ -14,7 +14,7 @@
"choose": "Choose an amount"
},
"messages": {
"about": "Did you know that Crab Fit costs more that $100 per month? If it's helped you out at all, consider donating to help keep it running. 🦀",
"about": "If it's helped you out at all, consider donating to help keep it running. 🦀",
"success": "Thank you for your donation! Without you, Crab Fit wouldn't be free, so thank you and keep being super awesome!",
"error": "Cannot make donation through Google. Please try donating through the website crab.fit 🦀"
}

View file

@ -51,7 +51,7 @@
"p2": "Create a lot of Crab Fits? Get the <1>Chrome extension</1> or <3>Firefox extension</3> for your browser! You can also download the <5>Android app</5> to Crab Fit on the go.",
"p3": "Created by <1>Ben Grant</1>, Crab Fit is the modern-day solution to your group event planning debates.",
"p4": "The code for Crab Fit is open source, if you find any issues or want to contribute, you can visit the <1>repository</1>. By using Crab Fit you agree to the <3>privacy policy</3>.",
"p5": "Crab Fit costs more than <strong>$100 per month</strong> to run. Consider donating below if it helped you out so it can stay free for everyone. 🦀"
"p5": "Consider donating below if it helped you out so it can stay free for everyone. 🦀"
}
}
}

View file

@ -0,0 +1,58 @@
{
"name": "Crab Fit",
"tagline": "Crea tu propio",
"cta": "¡Crea tu propio Crab Fit!",
"created": "Creado {{date}}",
"donate": {
"info": "Gracias por usar Crab Fit. Si te gusta, considera hacer una donación.",
"button": "Donar",
"title": "Cada cantidad cuenta :)",
"options": {
"$2": "Donar $2",
"$5": "Donar $5",
"$10": "Donar $10",
"choose": "Elige una cantidad"
},
"messages": {
"about": "Si es que le ayudó en absoluto, considere donar para ayudar a mantenerlo en funcionamiento. 🦀",
"success": "¡Gracias por tu donación! Sin ti, cangrejo Fit no sería libre, así que gracias y seguir siendo muy impresionante!",
"error": "No se pudo realizar la donación a través de Google. Intente donar a través del sitio web crab.fit 🦀"
}
},
"options": {
"name": "Opciones",
"weekStart": {
"label": "La semana empieza el",
"options": {
"Sunday": "domingo",
"Monday": "lunes"
}
},
"timeFormat": {
"label": "Formato de tiempo",
"options": {
"12h": "12h",
"24h": "24h"
}
},
"theme": {
"label": "Tema",
"options": {
"System": "Sistema",
"Light": "Claro",
"Dark": "Oscuro"
}
},
"highlight": {
"label": "Resalte la mayor disponibilidad",
"title": "Destaque la mayor disponibilidad en el mapa de calor",
"options": {
"Off": "Apagado",
"On": "Encendido"
}
},
"language": {
"label": "Idioma"
}
}
}

View file

@ -0,0 +1,63 @@
{
"available": "disponible",
"nav": {
"title": "Haga clic para copiar",
"copied": "¡Copiado!",
"shareinfo": "Copie el enlace a esta página o compártalo por <1>correo electrónico</1>.",
"shareinfo_alt": "Haga clic en el enlace de arriba para copiarlo en su portapapeles o compartirlo por <1>correo electrónico</1>.",
"email_subject": "Programación de {{event_name}}",
"email_body": "Visite este enlace para ingresar sus disponibilidades:"
},
"form": {
"signed_out": "Inicia sesión para añadir su disponibilidad",
"signed_in": "Has iniciado sesión como {{name}}",
"name": "Tu nombre",
"password": "Contraseña (opcional)",
"button": "Iniciar sesión",
"info": "Estos detalles son solo para este evento. Utilice una contraseña para evitar que otros cambien su disponibilidad.",
"timezone": "Tu zona horaria",
"errors": {
"password_incorrect": "La contraseña es incorrecta. Compruebe que su nombre esté bien escrito.",
"unknown": "Error al iniciar sesión. Inténtalo de nuevo."
},
"created_in_timezone": "Este evento se creó en la zona horaria <strong>{{timezone}}</strong>. <3>Haga clic aquí</3> para usarlo.",
"local_timezone": "Se detecta que su zona horaria local es <strong>{{timezone}}</strong>. <3>Haga clic aquí</3> para usarlo."
},
"offline": {
"title": "Estas desconectado",
"body": "Un Crab Fit no funciona sin conexión.<br />Asegúrate de estar conectado a Internet y vuelve a intentarlo."
},
"error": {
"title": "Evento no encontrado",
"body": "Verifique que la URL que ingresó sea correcta."
},
"tabs": {
"you": "Tu disponibilidad",
"you_tooltip": "Inicie sesión para establecer su disponibilidad",
"group": "Disponibilidad grupal"
},
"group": {
"legend_tooltip": "Haga clic para resaltar la disponibilidad más alta",
"info1": "Pase el ratón o toque el calendario de abajo para ver quién está disponible",
"info2": "Haga clic en los nombres a continuación para ver a las personas individualmente"
},
"you": {
"info": "Haga clic y arrastre el calendario a continuación para configurar sus disponibilidades",
"google_cal": {
"login": "Sincronizar con Google Calendar",
"logout": "cerrar sesión",
"select_all": "Seleccionar todo",
"select_none": "Seleccionar ninguno",
"info": "La importación sobrescribirá su disponibilidad actual",
"button": "Disponibilidad de importación"
}
}
}

View file

@ -0,0 +1,23 @@
{
"name": "How to Crab Fit",
"p1": "Crab Fit is a tool that helps you when planning events with friends or coworkers. You just create an event, enter your availability, send it out, and see when everyone is free!",
"p2": "See below for detailed steps of how to Crab Fit your event.",
"s1": "Step 1",
"p3": "Use the form at <1>crab.fit</1> to make a new event. You only need to put in the rough time period for when your event occurs here, not your availability.",
"p4": "For example, we'll use \"Jenny's Birthday Lunch\". Jenny wants her birthday lunch to happen on the same week as her birthday, the 15th of April, but she knows that not all of her friends are available on the 15th. She also doesn't want to do it on the weekend.",
"p5": "Jenny also knows that since it's a lunch event, it can't start before 11am or go any later than 5pm.",
"s2": "Step 2",
"p6": "Enter your availability for the event you just created.",
"p7": "In our example, Jenny now puts in her availability for her birthday lunch. She is free all week, except after 3pm on Tuesday and Wednesday, and before 1pm on Friday.",
"s3": "Step 3",
"p8": "Send the link to everyone you want to come.",
"p9": "After Jenny has sent the link to her friends and waited for them to also fill out their availabilities, she can now easily see them all on the heatmap below and choose the darkest area for a time that suits everyone!",
"p10": "In this example, 1pm to 3pm on Friday the 16th works for all Jenny's friends."
}

View file

@ -0,0 +1,57 @@
{
"create": "CREA UN",
"recently_visited": "Recientemente visitado",
"nav": {
"about": "Info",
"donate": "Donar"
},
"form": {
"name": {
"label": "¡Dale un nombre a tu evento!",
"sublabel": "O dejar en blanco para generar uno"
},
"dates": {
"label": "¿Qué fechas podrían funcionar?",
"sublabel": "Haga clic y arrastre para seleccionar",
"options": {
"specific": "Fechas específicas",
"week": "Días de la semana"
},
"tooltips": {
"previous": "Mes anterior",
"next": "Próximo mes",
"today": "hoy"
}
},
"times": {
"label": "¿A qué horas podría funcionar?",
"sublabel": "Haga clic y arrastre para seleccionar un rango de tiempo"
},
"timezone": {
"label": "Y la zona horaria",
"defaultOption": "Seleccione..."
},
"button": "Crear",
"errors": {
"no_dates": "No hay fechas seleccionadas",
"same_times": "Las horas de inicio y finalización no pueden ser las mismas",
"no_time": "No hay ningún tiempo seleccionado",
"unknown": "Algo salió mal. Por favor, inténtelo de nuevo más tarde."
}
},
"offline": "No puede crear un Crab Fit si no tiene conexión a Internet. Asegúrate de estar conectado.",
"about": {
"name": "Acerca de Crab Fit",
"events": "Eventos creados",
"availabilities": "Disponibilidades ingresadas",
"content": {
"p1": "Crab Fit te ayuda a adaptar tu evento a los horarios de todos. Simplemente cree un evento arriba y envíe el enlace a todos los participantes. Los resultados se actualizan en vivo y podrá ver un mapa de calor de cuándo todos están libres.<1/><2>Obtenga más información sobre cómo Crab Fit.</2>",
"p2": "¿Cree muchos Crab Fits? Obtenga la <1>extensión de Chrome</1> o la <3>extensión de Firefox</3> para su navegador. También puede descargar la <5>aplicación de Android</5> en Crab Fit sobre la marcha.",
"p3": "Creado por <1>Ben Grant</1>, Crab Fit es la solución moderna para sus debates de planificación de eventos grupales.",
"p4": "El código de Crab Fit es de código abierto, si encuentra algún problema o desea contribuir, puede visitar el <1>repositorio</1>. Al utilizar Crab Fit, acepta la <3>política de privacidad</3>.",
"p5": "Considere hacer una donación a continuación si lo ayudó para que pueda ser gratuito para todos. 🦀"
}
}
}

View file

@ -0,0 +1,52 @@
{
"name": "Privacy Policy",
"p1": "This SERVICE is provided by Benjamin Grant at no cost and is intended for use as is.",
"p2": "This page is used to inform visitors regarding the policies of the collection, use, and disclosure of Personal Information if using the Service.",
"p3": "If you choose to use the Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that is collected is used for providing and improving the Service. Your information will not be used or shared with anyone except as described in this Privacy Policy.",
"h1": "Information Collection and Use",
"p4": "The Service uses third party services that may collect information used to identify you.",
"p5": "Links to privacy policies of the third party service providers used by the Service:",
"link": "Google Play Services",
"h2": "Log Data",
"p6": "When you use the Service, in the case of an error, data and information is collected to improve the Service, which may include your IP address, device name, operating system version, app configuration and the time and date of the error.",
"h3": "Cookies",
"p7": "Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.",
"p8": "Cookies are used by Google Analytics to track you across the web and provide anonymous statistics to improve the Service.",
"h4": "Service Providers",
"p9": "Third-party companies may be employed for the following reasons:",
"l1": "To facilitate the Service",
"l2": "To provide the Service on our behalf",
"l3": "To perform Service-related services",
"l4": "To assist in analyzing how the Service is used",
"p10": "To perform these tasks, the third parties may have access to your Personal Information, but are obligated not to disclose or use this information for any purpose except the above.",
"h5": "Security",
"p11": "Personal Information that is shared via the Service is protected, however remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, so take care when sharing Personal Information.",
"h6": "Links to Other Sites",
"p12": "The Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by the Service. Therefore, you are advised to review the Privacy Policy of these websites.",
"h7": "Children's Privacy",
"p13": "The Service does not address anyone under the age of 13. Personally identifiable information is not knowingly collected from children under 13. If discovered that a child under 13 has provided the Service with personal information, such information will be immediately deleted from the servers. If you are a parent or guardian and you are aware that your child has provided the Service with personal information, please <1>contact us</1> so that this information can be removed.",
"h8": "Changes to This Privacy Policy",
"p14": "This Privacy Policy may be updated from time to time. Thus, you are advised to review this page periodically for any changes.",
"p15": "This policy is effective as of 2021-04-20",
"h9": "Contact Us",
"p16": "If you have any questions or suggestions about the Privacy Policy, do not hesitate to contact us at <1>benjamin.grantGRA0007+crabfit@gmail.com</1>."
}

View file

@ -0,0 +1,58 @@
{
"name": "Crab Fit",
"tagline": "Crée le tien",
"cta": "Créez votre propre Crab Fit!",
"created": "Créé {{date}}",
"donate": {
"info": "Merci d'utiliser Crab Fit. Si vous l'aimez, pensez à faire un don.",
"button": "Faire un don",
"title": "Chaque montant compte :)",
"options": {
"$2": "Faites un don de $2",
"$5": "Faites un don de $5",
"$10": "Faites un don de $10",
"choose": "Choisissez un montant"
},
"messages": {
"about": "Si cela vous a aidé à tous, envisager de faire don pour aider à maintenir en cours d'exécution. 🦀",
"success": "Merci pour votre don! Sans vous, Crab Fit ne serait pas gratuit, alors merci et continuez à être super génial!",
"error": "Impossible de faire un don via Google. Veuillez essayer de faire un don via le site Web crab.fit 🦀"
}
},
"options": {
"name": "Options",
"weekStart": {
"label": "La semaine commence le",
"options": {
"Sunday": "dimanche",
"Monday": "lundi"
}
},
"timeFormat": {
"label": "Format de l'heure",
"options": {
"12h": "12h",
"24h": "24h"
}
},
"theme": {
"label": "Thème",
"options": {
"System": "Système",
"Light": "Clair",
"Dark": "Foncé"
}
},
"highlight": {
"label": "Mettre en évidence la plus haute disponibilité",
"title": "Faites ressortir la disponibilité la plus élevée sur la carte thermique",
"options": {
"Off": "Éteint",
"On": "Allumé"
}
},
"language": {
"label": "Langue"
}
}
}

View file

@ -0,0 +1,63 @@
{
"available": "disponible",
"nav": {
"title": "Cliquez pour copier",
"copied": "Copié!",
"shareinfo": "Copiez le lien vers cette page ou partagez-le par <1>e-mail</1>.",
"shareinfo_alt": "Cliquez sur le lien ci-dessus pour le copier dans votre presse-papiers ou le partager par <1>e-mail</1>.",
"email_subject": "Planification {{event_name}}",
"email_body": "Visitez ce lien pour saisir vos disponibilités:"
},
"form": {
"signed_out": "Connectez-vous pour ajouter votre disponibilité",
"signed_in": "Connecté en tant que {{name}}",
"name": "Votre nom",
"password": "Mot de passe (facultatif)",
"button": "Connexion",
"info": "Ces détails ne concernent que cet événement. Utilisez un mot de passe pour empêcher les autres de modifier votre disponibilité.",
"timezone": "Votre fuseau horaire",
"errors": {
"password_incorrect": "Le mot de passe est incorrect. Vérifiez que votre nom est correctement orthographié.",
"unknown": "Échec de la connexion. Veuillez réessayer."
},
"created_in_timezone": "Cet événement a été créé dans le fuseau horaire <strong>{{timezone}}</strong>. <3>Cliquez ici</3> pour l'utiliser.",
"local_timezone": "Votre fuseau horaire local est détecté comme <strong>{{timezone}}</strong>. <3>Cliquez ici</3> pour l'utiliser."
},
"offline": {
"title": "Tu es hors ligne",
"body": "Un Crab Fit ne fonctionne pas hors ligne.<br />Assurez-vous que vous êtes connecté à Internet et réessayez."
},
"error": {
"title": "Événement introuvable",
"body": "Vérifiez que l'URL que vous avez saisie est correcte."
},
"tabs": {
"you": "Votre disponibilité",
"you_tooltip": "Connectez-vous pour définir votre disponibilité",
"group": "Disponibilité de groupe"
},
"group": {
"legend_tooltip": "Cliquez pour mettre en évidence la plus haute disponibilité",
"info1": "Survolez ou appuyez sur le calendrier ci-dessous pour voir qui est disponible",
"info2": "Cliquez sur les noms ci-dessous pour afficher les personnes individuellement"
},
"you": {
"info": "Cliquez et faites glisser le calendrier ci-dessous pour définir vos disponibilités",
"google_cal": {
"login": "Synchroniser avec Google Agenda",
"logout": "déconnexion",
"select_all": "Tout sélectionner",
"select_none": "Tout déselectionner",
"info": "L'importation écrasera votre disponibilité actuelle",
"button": "Importer la disponibilité"
}
}
}

View file

@ -0,0 +1,23 @@
{
"name": "How to Crab Fit",
"p1": "Crab Fit is a tool that helps you when planning events with friends or coworkers. You just create an event, enter your availability, send it out, and see when everyone is free!",
"p2": "See below for detailed steps of how to Crab Fit your event.",
"s1": "Step 1",
"p3": "Use the form at <1>crab.fit</1> to make a new event. You only need to put in the rough time period for when your event occurs here, not your availability.",
"p4": "For example, we'll use \"Jenny's Birthday Lunch\". Jenny wants her birthday lunch to happen on the same week as her birthday, the 15th of April, but she knows that not all of her friends are available on the 15th. She also doesn't want to do it on the weekend.",
"p5": "Jenny also knows that since it's a lunch event, it can't start before 11am or go any later than 5pm.",
"s2": "Step 2",
"p6": "Enter your availability for the event you just created.",
"p7": "In our example, Jenny now puts in her availability for her birthday lunch. She is free all week, except after 3pm on Tuesday and Wednesday, and before 1pm on Friday.",
"s3": "Step 3",
"p8": "Send the link to everyone you want to come.",
"p9": "After Jenny has sent the link to her friends and waited for them to also fill out their availabilities, she can now easily see them all on the heatmap below and choose the darkest area for a time that suits everyone!",
"p10": "In this example, 1pm to 3pm on Friday the 16th works for all Jenny's friends."
}

View file

@ -0,0 +1,57 @@
{
"create": "CREER UN",
"recently_visited": "Récemment visité",
"nav": {
"about": "Info",
"donate": "Faire un don"
},
"form": {
"name": {
"label": "Donnez un nom à votre événement!",
"sublabel": "Ou laissez vide pour en générer un"
},
"dates": {
"label": "Quelles dates pourraient fonctionner?",
"sublabel": "Cliquez et faites glisser pour sélectionner",
"options": {
"specific": "Dates spécifiques",
"week": "Jours de la semaine"
},
"tooltips": {
"previous": "Mois précédent",
"next": "Mois prochain",
"today": "aujourd'hui"
}
},
"times": {
"label": "Quels temps pourraient fonctionner?",
"sublabel": "Cliquez et faites glisser pour sélectionner une plage de temps"
},
"timezone": {
"label": "Et le fuseau horaire",
"defaultOption": "Sélectionner..."
},
"button": "Créer",
"errors": {
"no_dates": "Il n'y a pas de dates sélectionnées",
"same_times": "Les heures de début et de fin ne peuvent pas être les mêmes",
"no_time": "Il n'y a aucune heure sélectionnée",
"unknown": "Un problème est survenu. Veuillez réessayer plus tard."
}
},
"offline": "Vous ne pouvez pas créer un Crab Fit si vous ne disposez pas d'une connexion Internet. Veuillez vous assurer que vous êtes connecté.",
"about": {
"name": "À propos de Crab Fit",
"events": "Événements créés",
"availabilities": "Disponibilités saisies",
"content": {
"p1": "Crab Fit vous aide à adapter votre événement aux horaires de chacun. Créez simplement un événement ci-dessus et envoyez le lien à tous les participants. Les résultats sont mis à jour en direct et vous pourrez voir une carte thermique de quand tout le monde est libre.<1/><2>En savoir plus sur la façon de Crab Fit</2>.",
"p2": "Créer beaucoup d'ajustements de crabe? Obtenez <1>l'extension Chrome</1> ou <3>l'extension Firefox</3> pour votre navigateur! Vous pouvez également télécharger <5>l'application Android</5> sur Crab Fit lors de vos déplacements.",
"p3": "Créé par <1>Ben Grant</1>, Crab Fit est la solution moderne pour vos débats de planification d'événements de groupe.",
"p4": "Le code de Crab Fit est open source, si vous trouvez des problèmes ou souhaitez contribuer, vous pouvez visiter le <1>référentiel</1>. En utilisant Crab Fit, vous acceptez la <3>politique de confidentialité</3>.",
"p5": "Pensez à faire un don ci-dessous si cela vous a aidé afin qu'il puisse rester gratuit pour tout le monde. 🦀"
}
}
}

View file

@ -0,0 +1,52 @@
{
"name": "Privacy Policy",
"p1": "This SERVICE is provided by Benjamin Grant at no cost and is intended for use as is.",
"p2": "This page is used to inform visitors regarding the policies of the collection, use, and disclosure of Personal Information if using the Service.",
"p3": "If you choose to use the Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that is collected is used for providing and improving the Service. Your information will not be used or shared with anyone except as described in this Privacy Policy.",
"h1": "Information Collection and Use",
"p4": "The Service uses third party services that may collect information used to identify you.",
"p5": "Links to privacy policies of the third party service providers used by the Service:",
"link": "Google Play Services",
"h2": "Log Data",
"p6": "When you use the Service, in the case of an error, data and information is collected to improve the Service, which may include your IP address, device name, operating system version, app configuration and the time and date of the error.",
"h3": "Cookies",
"p7": "Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.",
"p8": "Cookies are used by Google Analytics to track you across the web and provide anonymous statistics to improve the Service.",
"h4": "Service Providers",
"p9": "Third-party companies may be employed for the following reasons:",
"l1": "To facilitate the Service",
"l2": "To provide the Service on our behalf",
"l3": "To perform Service-related services",
"l4": "To assist in analyzing how the Service is used",
"p10": "To perform these tasks, the third parties may have access to your Personal Information, but are obligated not to disclose or use this information for any purpose except the above.",
"h5": "Security",
"p11": "Personal Information that is shared via the Service is protected, however remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, so take care when sharing Personal Information.",
"h6": "Links to Other Sites",
"p12": "The Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by the Service. Therefore, you are advised to review the Privacy Policy of these websites.",
"h7": "Children's Privacy",
"p13": "The Service does not address anyone under the age of 13. Personally identifiable information is not knowingly collected from children under 13. If discovered that a child under 13 has provided the Service with personal information, such information will be immediately deleted from the servers. If you are a parent or guardian and you are aware that your child has provided the Service with personal information, please <1>contact us</1> so that this information can be removed.",
"h8": "Changes to This Privacy Policy",
"p14": "This Privacy Policy may be updated from time to time. Thus, you are advised to review this page periodically for any changes.",
"p15": "This policy is effective as of 2021-04-20",
"h9": "Contact Us",
"p16": "If you have any questions or suggestions about the Privacy Policy, do not hesitate to contact us at <1>benjamin.grantGRA0007+crabfit@gmail.com</1>."
}

View file

@ -0,0 +1,58 @@
{
"name": "Crab Fit",
"tagline": "अपना स्वयं का बनाएं",
"cta": "अपना खुद का Crab Fit बनाएं!",
"created": "{{date}} बनाया गया",
"donate": {
"info": "Crab Fit का उपयोग करने के लिए धन्यवाद। अगर आपको यह पसंद है, तो दान करने पर विचार करें।",
"button": "दान करना",
"title": "हर राशि मायने रखती है :)",
"options": {
"$2": "$२ दान करें",
"$5": "$५ दान करें",
"$10": "$१० दान करें",
"choose": "एक राशि चुनें"
},
"messages": {
"about": "अगर इससे आपको बिल्कुल भी मदद मिली है, तो इसे चालू रखने में मदद करने के लिए दान करने पर विचार करें। 🦀",
"success": "आपके दान के लिए शुक्रिया! आपके बिना, Crab Fit मुफ़्त नहीं होता, इसलिए धन्यवाद और सुपर ज़बरदस्त बने रहें!",
"error": "Google के माध्यम से दान नहीं कर सकते। कृपया वेबसाइट crab.fit के माध्यम से दान करने का प्रयास करें 🦀"
}
},
"options": {
"name": "समायोजन",
"weekStart": {
"label": "सप्ताह शुरू होता है",
"options": {
"Sunday": "रविवार",
"Monday": "सोमवार"
}
},
"timeFormat": {
"label": "समय प्रारूप",
"options": {
"12h": "12 घंटे",
"24h": "24 घंटे"
}
},
"theme": {
"label": "रंग",
"options": {
"System": "प्रणाली",
"Light": "रोशनी",
"Dark": "अंधेरा"
}
},
"highlight": {
"label": "उच्चतम उपलब्धता हाइलाइट करें",
"title": "हीटमैप पर उच्चतम उपलब्धता को विशिष्ट बनाएं",
"options": {
"Off": "निष्क्रिय",
"On": "सक्रिय"
}
},
"language": {
"label": "भाषा"
}
}
}

View file

@ -0,0 +1,63 @@
{
"available": "उपलब्ध",
"nav": {
"title": "कॉपी करने के लिए क्लिक करें",
"copied": "कॉपी किया गया!",
"shareinfo": "इस पृष्ठ के लिंक को कॉपी करें, या <1>ईमेल</1> के माध्यम से साझा करें।",
"shareinfo_alt": "इसे अपने क्लिपबोर्ड पर कॉपी करने के लिए ऊपर दिए गए लिंक पर क्लिक करें, या <1>ईमेल</1> के माध्यम से साझा करें।",
"email_subject": "शेड्यूलिंग {{event_name}}",
"email_body": "अपने की उपलब्धता में प्रवेश के लिए इस लिंक पर जाएं:"
},
"form": {
"signed_out": "अपनी उपलब्धता जोड़ने के लिए साइन इन करें",
"signed_in": "{{name}} के रूप में साइन इन किया",
"name": "तुम्हारा नाम",
"password": "पासवर्ड (वैकल्पिक)",
"button": "लॉगिन",
"info": "ये विवरण केवल इस घटना के लिए हैं। अपनी उपलब्धता परिवर्तित करने से रोकने के लिए एक पासवर्ड का उपयोग करें।",
"timezone": "आपका समय क्षेत्र",
"errors": {
"password_incorrect": "पासवर्ड गलत है। जांचें कि आपका नाम सही वर्तनी है।",
"unknown": "लॉगिन करने में विफल। कृपया पुन: प्रयास करें।"
},
"created_in_timezone": "यह इवेंट टाइमज़ोन <strong>{{timezone}}</strong> में बनाया गया था। इसका उपयोग करने के लिए <3>यहां क्लिक करें</3>।",
"local_timezone": "आपका स्थानीय समय क्षेत्र <strong>{{timezone}}</strong> पाया गया है। इसका उपयोग करने के लिए <3>यहां क्लिक करें</3>।"
},
"offline": {
"title": "आप ऑफलाइन हैं",
"body": "Crab Fit ऑफ़लाइन काम नहीं करता है।<br />सुनिश्चित करें कि आप इंटरनेट से कनेक्ट हैं और पुनः प्रयास करें।"
},
"error": {
"title": "घटना नहीं मिली",
"body": "जांचें कि आपने जो यूआरएल डाला है वह सही है।"
},
"tabs": {
"you": "आपकी उपलब्धता",
"you_tooltip": "अपनी उपलब्धता सेट करने के लिए लॉगिन करें",
"group": "समूह उपलब्धता"
},
"group": {
"legend_tooltip": "उच्चतम उपलब्धता को हाइलाइट करने के लिए क्लिक करें",
"info1": "कौन उपलब्ध है यह देखने के लिए नीचे दिए गए कैलेंडर को होवर या टैप करें",
"info2": "विशिष्ट लोगों को देखने के लिए नीचे दिए गए नामों पर क्लिक करें"
},
"you": {
"info": "अपनी उपलब्धता सेट करने के लिए नीचे कैलेंडर को क्लिक करें और खींचें",
"google_cal": {
"login": "Google कैलेंडर के साथ समन्वयित करें",
"logout": "लॉग आउट",
"select_all": "सभी का चयन करे",
"select_none": "सबको अचयनित करो",
"info": "आयात करना आपकी वर्तमान उपलब्धता को अधिलेखित कर देगा",
"button": "आयात उपलब्धता"
}
}
}

View file

@ -0,0 +1,23 @@
{
"name": "How to Crab Fit",
"p1": "Crab Fit is a tool that helps you when planning events with friends or coworkers. You just create an event, enter your availability, send it out, and see when everyone is free!",
"p2": "See below for detailed steps of how to Crab Fit your event.",
"s1": "Step 1",
"p3": "Use the form at <1>crab.fit</1> to make a new event. You only need to put in the rough time period for when your event occurs here, not your availability.",
"p4": "For example, we'll use \"Jenny's Birthday Lunch\". Jenny wants her birthday lunch to happen on the same week as her birthday, the 15th of April, but she knows that not all of her friends are available on the 15th. She also doesn't want to do it on the weekend.",
"p5": "Jenny also knows that since it's a lunch event, it can't start before 11am or go any later than 5pm.",
"s2": "Step 2",
"p6": "Enter your availability for the event you just created.",
"p7": "In our example, Jenny now puts in her availability for her birthday lunch. She is free all week, except after 3pm on Tuesday and Wednesday, and before 1pm on Friday.",
"s3": "Step 3",
"p8": "Send the link to everyone you want to come.",
"p9": "After Jenny has sent the link to her friends and waited for them to also fill out their availabilities, she can now easily see them all on the heatmap below and choose the darkest area for a time that suits everyone!",
"p10": "In this example, 1pm to 3pm on Friday the 16th works for all Jenny's friends."
}

View file

@ -0,0 +1,57 @@
{
"create": "एक बनाने के",
"recently_visited": "हाल ही में देखी",
"nav": {
"about": "जानकारी",
"donate": "दान करना"
},
"form": {
"name": {
"label": "अपने ईवेंट को एक नाम दें!",
"sublabel": "या एक उत्पन्न करने के लिए खाली छोड़ दें"
},
"dates": {
"label": "कौन सी तिथियां काम कर सकती हैं?",
"sublabel": "चयन करने के लिए क्लिक करें और खींचें",
"options": {
"specific": "विशिष्ट तिथियां",
"week": "सप्ताह के दिन"
},
"tooltips": {
"previous": "पिछ्ला महिना",
"next": "अगले महीने",
"today": "आज"
}
},
"times": {
"label": "कौन सा समय काम कर सकता है?",
"sublabel": "समय सीमा चुनने के लिए क्लिक करें और खींचें"
},
"timezone": {
"label": "और समयक्षेत्र",
"defaultOption": "चुनते हैं..."
},
"button": "बनाएँ",
"errors": {
"no_dates": "चयनित किसी भी दिनांक नहीं हैं",
"same_times": "प्रारंभ और समाप्ति समय समान नहीं हो सकते",
"no_time": "कोई समय नहीं चुना गया है",
"unknown": "कुछ गलत हो गया। बाद में पुन: प्रयास करें।"
}
},
"offline": "जब आपके पास इंटरनेट कनेक्शन न हो तो आप Crab Fit नहीं बना सकते। कृपया सुनिश्चित करें कि आप जुड़े हुए हैं।",
"about": {
"name": "Crab Fit के बारे में",
"events": "ईवेंट की संख्या",
"availabilities": "उपलब्धता की संख्या",
"content": {
"p1": "Crab Fit आपको अपने कार्यक्रम को सभी के शेड्यूल के आसपास फिट करने में मदद करता है। बस ऊपर एक ईवेंट बनाएं और भाग लेने वाले सभी लोगों को लिंक भेजें। परिणाम लाइव अपडेट होते हैं और आप सभी के फ्री होने पर हीट-मैप देख पाएंगे।<1 /><2>क्रैब फ़िट करने के तरीके के बारे में और जानें</2>।",
"p2": "बहुत सारी घटनाओं की योजना बनाएं? अपने ब्राउज़र के लिए <1>क्रोम एक्सटेंशन</1> या <3>फ़ायरफ़ॉक्स एक्सटेंशन</3> प्राप्त करें! चलते-फिरते योजना बनाने के लिए आप <5>एंड्रॉइड ऐप</5> भी डाउनलोड कर सकते हैं।",
"p3": "<1>बेन ग्रांट</1> द्वारा बनाया गया, Crab Fit आपके ग्रुप इवेंट प्लानिंग डिबेट्स का आधुनिक समाधान है।",
"p4": "Crab Fit के लिए कोड खुला स्रोत है, यदि आपको कोई समस्या मिलती है या आप योगदान देना चाहते हैं, तो आप <1>रिपॉजिटरी</1> पर जा सकते हैं। Crab Fit का उपयोग करके आप <3>गोपनीयता नीति</3> से सहमत होते हैं।",
"p5": "नीचे दान करने पर विचार करें यदि इससे आपको मदद मिली है तो यह सभी के लिए निःशुल्क रह सकता है। 🦀"
}
}
}

View file

@ -0,0 +1,52 @@
{
"name": "Privacy Policy",
"p1": "This SERVICE is provided by Benjamin Grant at no cost and is intended for use as is.",
"p2": "This page is used to inform visitors regarding the policies of the collection, use, and disclosure of Personal Information if using the Service.",
"p3": "If you choose to use the Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that is collected is used for providing and improving the Service. Your information will not be used or shared with anyone except as described in this Privacy Policy.",
"h1": "Information Collection and Use",
"p4": "The Service uses third party services that may collect information used to identify you.",
"p5": "Links to privacy policies of the third party service providers used by the Service:",
"link": "Google Play Services",
"h2": "Log Data",
"p6": "When you use the Service, in the case of an error, data and information is collected to improve the Service, which may include your IP address, device name, operating system version, app configuration and the time and date of the error.",
"h3": "Cookies",
"p7": "Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.",
"p8": "Cookies are used by Google Analytics to track you across the web and provide anonymous statistics to improve the Service.",
"h4": "Service Providers",
"p9": "Third-party companies may be employed for the following reasons:",
"l1": "To facilitate the Service",
"l2": "To provide the Service on our behalf",
"l3": "To perform Service-related services",
"l4": "To assist in analyzing how the Service is used",
"p10": "To perform these tasks, the third parties may have access to your Personal Information, but are obligated not to disclose or use this information for any purpose except the above.",
"h5": "Security",
"p11": "Personal Information that is shared via the Service is protected, however remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, so take care when sharing Personal Information.",
"h6": "Links to Other Sites",
"p12": "The Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by the Service. Therefore, you are advised to review the Privacy Policy of these websites.",
"h7": "Children's Privacy",
"p13": "The Service does not address anyone under the age of 13. Personally identifiable information is not knowingly collected from children under 13. If discovered that a child under 13 has provided the Service with personal information, such information will be immediately deleted from the servers. If you are a parent or guardian and you are aware that your child has provided the Service with personal information, please <1>contact us</1> so that this information can be removed.",
"h8": "Changes to This Privacy Policy",
"p14": "This Privacy Policy may be updated from time to time. Thus, you are advised to review this page periodically for any changes.",
"p15": "This policy is effective as of 2021-04-20",
"h9": "Contact Us",
"p16": "If you have any questions or suggestions about the Privacy Policy, do not hesitate to contact us at <1>benjamin.grantGRA0007+crabfit@gmail.com</1>."
}

View file

@ -0,0 +1,58 @@
{
"name": "Crab Fit",
"tagline": "Buat milik Anda sendiri",
"cta": "Buat Crab Fit Anda sendiri!",
"created": "Dibuat {{date}}",
"donate": {
"info": "Terima kasih telah menggunakan Crab Fit. Jika Anda menyukainya, pertimbangkan untuk berdonasi.",
"button": "Menyumbangkan",
"title": "Setiap jumlah berarti :)",
"options": {
"$2": "Menyumbangkan $2",
"$5": "Menyumbangkan $5",
"$10": "Menyumbangkan $10",
"choose": "Pilih jumlahnya"
},
"messages": {
"about": "Jika Crab Fit telah membantu Anda sama sekali, pertimbangkan untuk berdonasi agar tetap berjalan. 🦀",
"success": "Terima kasih atas donasi Anda! Tanpa Anda, Crab Fit tidak akan gratis, jadi terima kasih dan tetaplah hebat!",
"error": "Gagal memberikan donasi melalui Google. Silahkan coba berdonasi melalui website crab.fit 🦀"
}
},
"options": {
"name": "Pengaturan",
"weekStart": {
"label": "Minggu dimulai",
"options": {
"Sunday": "Minggu",
"Monday": "Senin"
}
},
"timeFormat": {
"label": "Format waktu",
"options": {
"12h": "12 jam",
"24h": "24 jam"
}
},
"theme": {
"label": "Tema",
"options": {
"System": "Sistem",
"Light": "Terang",
"Dark": "Petang"
}
},
"highlight": {
"label": "Sorot ketersediaan tertinggi",
"title": "Tonjolkan ketersediaan tertinggi pada peta panas",
"options": {
"Off": "Mati",
"On": "Diaktifkan"
}
},
"language": {
"label": "Bahasa"
}
}
}

View file

@ -0,0 +1,63 @@
{
"available": "tersedia",
"nav": {
"title": "Klik untuk menyalin",
"copied": "Disalin!",
"shareinfo": "Salin link ke halaman ini, atau bagikan melalui <1>email</1>.",
"shareinfo_alt": "Klik link di atas untuk menyalinnya ke clipboard Anda, atau bagikan melalui <1>email</1>.",
"email_subject": "Penjadwalan {{event_name}}",
"email_body": "Kunjungi tautan ini untuk memasukkan ketersediaan Anda:"
},
"form": {
"signed_out": "Masuk untuk menambahkan ketersediaan Anda",
"signed_in": "Masuk sebagai {{name}}",
"name": "Namamu",
"password": "Kata sandi (opsional)",
"button": "Masuk",
"info": "Rincian ini hanya untuk acara ini. Gunakan kata sandi untuk mencegah orang lain mengubah ketersediaan Anda.",
"timezone": "Zona waktu Anda",
"errors": {
"password_incorrect": "Kata sandi salah. Periksa nama Anda dieja dengan benar.",
"unknown": "Gagal untuk masuk. Silakan coba lagi."
},
"created_in_timezone": "Acara ini dibuat di zona waktu <strong>{{timezone}}</strong>. <3>Klik di sini</3> untuk menggunakannya.",
"local_timezone": "Zona waktu lokal Anda terdeteksi sebagai <strong>{{timezone}}</strong>. <3>Klik di sini</3> untuk menggunakannya."
},
"offline": {
"title": "Anda sedang offline",
"body": "Crab Fit tidak berfungsi saat offline.<br />Pastikan Anda terhubung ke internet dan coba lagi."
},
"error": {
"title": "Acara tidak ditemukan",
"body": "Periksa apakah url yang Anda masukkan benar."
},
"tabs": {
"you": "Ketersediaan Anda",
"you_tooltip": "Masuk untuk mengatur ketersediaan Anda",
"group": "Ketersediaan grup"
},
"group": {
"legend_tooltip": "Klik untuk menyoroti ketersediaan tertinggi",
"info1": "Arahkan atau ketuk kalender di bawah untuk melihat siapa yang tersedia",
"info2": "Klik nama di bawah untuk melihat orang satu per satu"
},
"you": {
"info": "Klik dan seret kalender di bawah ini untuk mengatur ketersediaan Anda",
"google_cal": {
"login": "Sinkronkan dengan Google Kalender",
"logout": "keluar",
"select_all": "Pilih semua",
"select_none": "Hapus semua",
"info": "Mengimpor akan menimpa ketersediaan Anda saat ini",
"button": "Impor ketersediaan Anda"
}
}
}

View file

@ -0,0 +1,23 @@
{
"name": "How to Crab Fit",
"p1": "Crab Fit is a tool that helps you when planning events with friends or coworkers. You just create an event, enter your availability, send it out, and see when everyone is free!",
"p2": "See below for detailed steps of how to Crab Fit your event.",
"s1": "Step 1",
"p3": "Use the form at <1>crab.fit</1> to make a new event. You only need to put in the rough time period for when your event occurs here, not your availability.",
"p4": "For example, we'll use \"Jenny's Birthday Lunch\". Jenny wants her birthday lunch to happen on the same week as her birthday, the 15th of April, but she knows that not all of her friends are available on the 15th. She also doesn't want to do it on the weekend.",
"p5": "Jenny also knows that since it's a lunch event, it can't start before 11am or go any later than 5pm.",
"s2": "Step 2",
"p6": "Enter your availability for the event you just created.",
"p7": "In our example, Jenny now puts in her availability for her birthday lunch. She is free all week, except after 3pm on Tuesday and Wednesday, and before 1pm on Friday.",
"s3": "Step 3",
"p8": "Send the link to everyone you want to come.",
"p9": "After Jenny has sent the link to her friends and waited for them to also fill out their availabilities, she can now easily see them all on the heatmap below and choose the darkest area for a time that suits everyone!",
"p10": "In this example, 1pm to 3pm on Friday the 16th works for all Jenny's friends."
}

View file

@ -0,0 +1,57 @@
{
"create": "BUAT",
"recently_visited": "Baru-baru ini dikunjungi",
"nav": {
"about": "Info",
"donate": "Menyumbangkan"
},
"form": {
"name": {
"label": "Beri nama acara Anda!",
"sublabel": "Atau biarkan kosong untuk membuat nama"
},
"dates": {
"label": "Tanggal berapa mungkin berhasil?",
"sublabel": "Klik dan seret untuk memilih",
"options": {
"specific": "Tanggal tertentu",
"week": "Hari dalam seminggu"
},
"tooltips": {
"previous": "Bulan sebelumnya",
"next": "Bulan depan",
"today": "hari ini"
}
},
"times": {
"label": "Kali apa yang mungkin bekerja?",
"sublabel": "Klik dan seret untuk memilih rentang waktu"
},
"timezone": {
"label": "Dan zona waktu",
"defaultOption": "Pilih..."
},
"button": "Membuat",
"errors": {
"no_dates": "Tidak ada tanggal yang dipilih",
"same_times": "Waktu mulai dan akhir tidak boleh sama",
"no_time": "Tidak ada waktu yang dipilih",
"unknown": "Ada yang salah. Silakan coba lagi nanti."
}
},
"offline": "Anda tidak dapat membuat Crab Fit saat Anda tidak memiliki koneksi internet. Harap pastikan Anda terhubung.",
"about": {
"name": "Tentang Crab Fit",
"events": "Acara dibuat",
"availabilities": "Ketersediaan dibuat",
"content": {
"p1": "Crab Fit membantu Anda menyesuaikan acara dengan jadwal semua orang. Cukup buat acara di atas dan kirim tautan ke semua orang yang berpartisipasi. Hasil diperbarui secara langsung dan Anda akan dapat melihat peta panas saat semua orang bebas.<1 /><2>Pelajari lebih lanjut tentang cara Crab Fit</2>.",
"p2": "Apakah Anda membuat banyak? Dapatkan <1>ekstensi Chrome</1> atau <3>ekstensi Firefox</3> untuk browser Anda! Anda juga dapat mengunduh <5>aplikasi Android</5> untuk merencanakan saat dalam perjalanan.",
"p3": "Dibuat oleh <1>Ben Grant</1>, Crab Fit adalah solusi modern untuk debat perencanaan acara grup Anda.",
"p4": "Kode Crab Fit adalah open source, jika Anda menemukan masalah atau ingin berkontribusi, Anda dapat mengunjungi <1>repositori</1>. Dengan menggunakan Crab Fit, Anda menyetujui <3>kebijakan privasi</3>.",
"p5": "Pertimbangkan untuk berdonasi di bawah jika itu membantu Anda sehingga dapat tetap gratis untuk semua orang. 🦀"
}
}
}

View file

@ -0,0 +1,52 @@
{
"name": "Privacy Policy",
"p1": "This SERVICE is provided by Benjamin Grant at no cost and is intended for use as is.",
"p2": "This page is used to inform visitors regarding the policies of the collection, use, and disclosure of Personal Information if using the Service.",
"p3": "If you choose to use the Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that is collected is used for providing and improving the Service. Your information will not be used or shared with anyone except as described in this Privacy Policy.",
"h1": "Information Collection and Use",
"p4": "The Service uses third party services that may collect information used to identify you.",
"p5": "Links to privacy policies of the third party service providers used by the Service:",
"link": "Google Play Services",
"h2": "Log Data",
"p6": "When you use the Service, in the case of an error, data and information is collected to improve the Service, which may include your IP address, device name, operating system version, app configuration and the time and date of the error.",
"h3": "Cookies",
"p7": "Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.",
"p8": "Cookies are used by Google Analytics to track you across the web and provide anonymous statistics to improve the Service.",
"h4": "Service Providers",
"p9": "Third-party companies may be employed for the following reasons:",
"l1": "To facilitate the Service",
"l2": "To provide the Service on our behalf",
"l3": "To perform Service-related services",
"l4": "To assist in analyzing how the Service is used",
"p10": "To perform these tasks, the third parties may have access to your Personal Information, but are obligated not to disclose or use this information for any purpose except the above.",
"h5": "Security",
"p11": "Personal Information that is shared via the Service is protected, however remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, so take care when sharing Personal Information.",
"h6": "Links to Other Sites",
"p12": "The Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by the Service. Therefore, you are advised to review the Privacy Policy of these websites.",
"h7": "Children's Privacy",
"p13": "The Service does not address anyone under the age of 13. Personally identifiable information is not knowingly collected from children under 13. If discovered that a child under 13 has provided the Service with personal information, such information will be immediately deleted from the servers. If you are a parent or guardian and you are aware that your child has provided the Service with personal information, please <1>contact us</1> so that this information can be removed.",
"h8": "Changes to This Privacy Policy",
"p14": "This Privacy Policy may be updated from time to time. Thus, you are advised to review this page periodically for any changes.",
"p15": "This policy is effective as of 2021-04-20",
"h9": "Contact Us",
"p16": "If you have any questions or suggestions about the Privacy Policy, do not hesitate to contact us at <1>benjamin.grantGRA0007+crabfit@gmail.com</1>."
}

View file

@ -14,7 +14,7 @@
"choose": "금액을 선택하세요"
},
"messages": {
"about": "Crab Fit이 한 달에 $ 100 이상이라는 사실을 알고 계셨습니까? 도움이 되었으면 계속해서 운영 할 수 있도록 기부하는 것을 고려하십시오. 🦀",
"about": "도움이 되었으면 계속해서 운영 할 수 있도록 기부하는 것을 고려하십시오. 🦀",
"success": "기부 해 주셔서 감사합니다! 당신이 없었다면 Crab Fit은 무료가 될 수 없으니 감사하고 계속해서 최고가 되세요!",
"error": "Google을 통해 기부 할 수 없습니다. 웹 사이트 crab.fit을 통해 기부 해주세요 🦀"
}

View file

@ -51,7 +51,7 @@
"p2": "많이 만드시겠습니까? 브라우저 용 <1>Chrome 확장</1> 프로그램 또는 <3>Firefox 확장</3> 프로그램을 받으세요! <5>Android 앱을</5> 다운로드하여 이동 중에 Crab Fit을 사용할 수도 있습니다.",
"p3": "<1>Ben Grant</1>가 만든 Crab Fit은 그룹 이벤트 계획 토론에 대한 현대적인 솔루션입니다.",
"p4": "Crab Fit의 코드는 오픈 소스이므로 문제를 발견하거나 기여하고 싶다면 <1>저장소를</1> 방문 할 수 있습니다. Crab Fit을 사용하면 <3>개인 정보 보호 정책에</3> 동의하게됩니다.",
"p5": "Crab Fit을 실행하는 데 <strong>월 $ 100</strong> 이상이 듭니다. 모든 사람이 무료로 사용할 수 있도록 아래 기부를 고려하세요. 🦀"
"p5": "모든 사람이 무료로 사용할 수 있도록 아래 기부를 고려하세요. 🦀"
}
}
}

View file

@ -1,5 +1,6 @@
import { useState, useRef, Fragment } from 'react';
import { useTranslation } from 'react-i18next';
import { useLocaleUpdateStore } from 'stores';
import dayjs from 'dayjs';
import localeData from 'dayjs/plugin/localeData';
import customParseFormat from 'dayjs/plugin/customParseFormat';
@ -38,6 +39,8 @@ const AvailabilityEditor = ({
...props
}) => {
const { t } = useTranslation('event');
const locale = useLocaleUpdateStore(state => state.locale);
const [selectingTimes, _setSelectingTimes] = useState([]);
const staticSelectingTimes = useRef([]);
const setSelectingTimes = newTimes => {
@ -56,7 +59,7 @@ const AvailabilityEditor = ({
return (
<>
<StyledMain>
<Center>{t('event:you.info')}</Center>
<Center style={{textAlign: 'center'}}>{t('event:you.info')}</Center>
</StyledMain>
{isSpecificDates && (
<StyledMain>
@ -73,7 +76,7 @@ const AvailabilityEditor = ({
</StyledMain>
)}
<Wrapper>
<Wrapper locale={locale}>
<ScrollWrapper>
<Container>
<TimeLabels>

View file

@ -5,7 +5,7 @@ import localeData from 'dayjs/plugin/localeData';
import customParseFormat from 'dayjs/plugin/customParseFormat';
import relativeTime from 'dayjs/plugin/relativeTime';
import { useSettingsStore } from 'stores';
import { useSettingsStore, useLocaleUpdateStore } from 'stores';
import { Legend, Center } from 'components';
import {
@ -52,7 +52,9 @@ const AvailabilityViewer = ({
const [touched, setTouched] = useState(false);
const [tempFocus, setTempFocus] = useState(null);
const [focusCount, setFocusCount] = useState(null);
const { t } = useTranslation('event');
const locale = useLocaleUpdateStore(state => state.locale);
const wrapper = useRef();
@ -118,7 +120,7 @@ const AvailabilityViewer = ({
return (
<Fragment key={i}>
<Date>
{isSpecificDates && <DateLabel>{parsedDate.format('MMM D')}</DateLabel>}
{isSpecificDates && <DateLabel locale={locale}>{parsedDate.format('MMM D')}</DateLabel>}
<DayLabel>{parsedDate.format('ddd')}</DayLabel>
<Times

View file

@ -6,7 +6,7 @@ import localeData from 'dayjs/plugin/localeData';
import updateLocale from 'dayjs/plugin/updateLocale';
import { Button, ToggleField } from 'components';
import { useSettingsStore } from 'stores';
import { useSettingsStore, useLocaleUpdateStore } from 'stores';
import {
Wrapper,
@ -19,7 +19,7 @@ import {
Day,
} from './calendarFieldStyle';
import supportedLocales from 'res/dayjs_locales.json';
import localeImports from 'res/dayjs_locales';
dayjs.extend(isToday);
dayjs.extend(localeData);
@ -57,6 +57,8 @@ const CalendarField = ({
...props
}) => {
const weekStart = useSettingsStore(state => state.weekStart);
const locale = useLocaleUpdateStore(state => state.locale);
const setLocale = useLocaleUpdateStore(state => state.setLocale);
const { t, i18n } = useTranslation('home');
const [type, setType] = useState(0);
@ -90,9 +92,10 @@ const CalendarField = ({
};
useEffect(() => {
if (Array.from(supportedLocales).includes(i18n.language)) {
import(`dayjs/locale/${i18n.language}.js`).then(() => {
if (Object.keys(localeImports).includes(i18n.language)) {
localeImports[i18n.language]().then(() => {
dayjs.locale(i18n.language);
setLocale(dayjs.locale());
if (weekStart !== dayjs.Ls[i18n.language].weekStart) {
dayjs.updateLocale(i18n.language, { weekStart });
}
@ -104,10 +107,10 @@ const CalendarField = ({
}
}
setDates(calculateMonth(month, year, weekStart));
}, [weekStart, month, year, i18n.language]);
}, [weekStart, month, year, i18n.language, setLocale]);
return (
<Wrapper>
<Wrapper locale={locale}>
{label && <StyledLabel htmlFor={id}>{label}</StyledLabel>}
{subLabel && <StyledSubLabel htmlFor={id}>{subLabel}</StyledSubLabel>}
<input
@ -213,11 +216,11 @@ const CalendarField = ({
</>
) : (
<CalendarBody>
{dayjs.weekdaysShort().map((name, i) =>
{(weekStart ? [...dayjs.weekdaysShort().filter((_,i) => i !== 0), dayjs.weekdaysShort()[0]] : dayjs.weekdaysShort()).map((name, i) =>
<Date
key={name}
isToday={dayjs.weekdaysShort()[dayjs().day()-weekStart] === name}
title={dayjs.weekdaysShort()[dayjs().day()-weekStart] === name ? t('form.dates.tooltips.today') : ''}
isToday={(weekStart ? [...dayjs.weekdaysShort().filter((_,i) => i !== 0), dayjs.weekdaysShort()[0]] : dayjs.weekdaysShort())[dayjs().day()-weekStart] === name}
title={(weekStart ? [...dayjs.weekdaysShort().filter((_,i) => i !== 0), dayjs.weekdaysShort()[0]] : dayjs.weekdaysShort())[dayjs().day()-weekStart] === name ? t('form.dates.tooltips.today') : ''}
selected={selectedDays.includes(((i + weekStart) % 7 + 7) % 7)}
selecting={selectingDays.includes(((i + weekStart) % 7 + 7) % 7)}
mode={mode}

View file

@ -93,7 +93,7 @@ const Donate = ({ onDonate = null }) => {
>
<Button
buttonHeight="30px"
buttonWidth="90px"
buttonWidth={`${Math.max(t('donate.button').length*10, 90)}px`}
type="button"
tabIndex="-1"
title={t('donate.title')}

View file

@ -98,7 +98,7 @@ const GoogleCalendar = ({ timeZone, timeMin, timeMax, onImport }) => {
<Button
onClick={() => signIn()}
isLoading={signedIn === undefined}
buttonWidth="270px"
buttonWidth={`${Math.max(t('event:you.google_cal.login').length*10, 270)}px`}
primaryColor="#4286F5"
secondaryColor="#3367BD">
<LoginButton>

View file

@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next';
import { useRecentsStore } from 'stores';
import { useRecentsStore, useLocaleUpdateStore } from 'stores';
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
@ -10,6 +10,7 @@ dayjs.extend(relativeTime);
const Recents = () => {
const recents = useRecentsStore(state => state.recents);
const locale = useLocaleUpdateStore(state => state.locale);
const { t } = useTranslation(['home', 'common']);
return !!recents.length && (
@ -19,7 +20,7 @@ const Recents = () => {
{recents.map(event => (
<Recent href={`/${event.id}`} key={event.id}>
<span className="name">{event.name}</span>
<span className="date" title={dayjs.unix(event.created).format('D MMMM, YYYY')}>{t('common:created', { date: dayjs.unix(event.created).fromNow() })}</span>
<span locale={locale} className="date" title={dayjs.unix(event.created).format('D MMMM, YYYY')}>{t('common:created', { date: dayjs.unix(event.created).fromNow() })}</span>
</Recent>
))}
</StyledMain>

View file

@ -43,6 +43,11 @@ export const StyledSelect = styled.select`
border-radius: 3px;
outline: none;
transition: border-color .15s, box-shadow .15s;
appearance: none;
background-image: url("data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><foreignObject width=%22100px%22 height=%22100px%22><div xmlns=%22http://www.w3.org/1999/xhtml%22 style=%22color:${props => encodeURIComponent(props.theme.primary)};font-size:60px;display:flex;align-items:center;justify-content:center;height:100%25;width:100%25%22>▼</div></foreignObject></svg>");
background-repeat: no-repeat;
background-position: right 10px center;
background-size: 1em;
&:focus {
border: 1px solid ${props => props.theme.primary};

View file

@ -89,8 +89,12 @@ const Settings = () => {
name="language"
id="language"
options={{
'en': 'English (US)',
'de': 'Deutsch',
'en': 'English',
'es': 'Español',
'fr': 'Français',
'hi': 'हिंदी',
'id': 'Indonesia',
'ko': '한국어',
...process.env.NODE_ENV !== 'production' && { 'cimode': 'DEV' },
}}

View file

@ -1,6 +1,7 @@
import { useState, useEffect, useRef } from 'react';
import dayjs from 'dayjs';
import { useSettingsStore } from 'stores';
import { useSettingsStore, useLocaleUpdateStore } from 'stores';
import {
Wrapper,
@ -11,62 +12,7 @@ import {
Selected,
} from './timeRangeFieldStyle';
const times = {
'12h': [
'12am',
'1am',
'2am',
'3am',
'4am',
'5am',
'6am',
'7am',
'8am',
'9am',
'10am',
'11am',
'12pm',
'1pm',
'2pm',
'3pm',
'4pm',
'5pm',
'6pm',
'7pm',
'8pm',
'9pm',
'10pm',
'11pm',
'12am',
],
'24h': [
'00',
'01',
'02',
'03',
'04',
'05',
'06',
'07',
'08',
'09',
'10',
'11',
'12',
'13',
'14',
'15',
'16',
'17',
'18',
'19',
'20',
'21',
'22',
'23',
'24',
],
};
const times = ['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24'];
const TimeRangeField = ({
label,
@ -76,6 +22,7 @@ const TimeRangeField = ({
...props
}) => {
const timeFormat = useSettingsStore(state => state.timeFormat);
const locale = useLocaleUpdateStore(state => state.locale);
const [start, setStart] = useState(9);
const [end, setEnd] = useState(17);
@ -107,7 +54,7 @@ const TimeRangeField = ({
};
return (
<Wrapper>
<Wrapper locale={locale}>
{label && <StyledLabel htmlFor={id}>{label}</StyledLabel>}
{subLabel && <StyledSubLabel htmlFor={id}>{subLabel}</StyledSubLabel>}
<input
@ -123,7 +70,7 @@ const TimeRangeField = ({
{start > end && <Selected start={start > end ? 0 : start} end={end} />}
<Handle
value={start}
label={times[timeFormat][start]}
label={timeFormat === '24h' ? times[start] : dayjs().hour(times[start]).format('ha')}
extraPadding={end - start === 1 ? 'padding-right: 20px;' : (start - end === 1 ? 'padding-left: 20px;' : '')}
onMouseDown={() => {
document.addEventListener('mousemove', handleMouseMove);
@ -146,7 +93,7 @@ const TimeRangeField = ({
/>
<Handle
value={end}
label={times[timeFormat][end]}
label={timeFormat === '24h' ? times[end] : dayjs().hour(times[end]).format('ha')}
extraPadding={end - start === 1 ? 'padding-left: 20px;' : (start - end === 1 ? 'padding-right: 20px;' : '')}
onMouseDown={() => {
document.addEventListener('mousemove', handleMouseMove);

View file

@ -60,6 +60,7 @@ export const Handle = styled.div`
text-align: center;
left: 50%;
transform: translateX(-50%);
white-space: nowrap;
${props => props.extraPadding}
}
`;

View file

@ -3,12 +3,17 @@ import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import Backend from 'i18next-http-backend';
import locales from 'res/dayjs_locales';
i18n
.use(LanguageDetector)
.use(Backend)
.use(initReactI18next)
.init({
fallbackLng: 'en',
supportedLngs: Object.keys(locales),
ns: 'common',
defaultNS: 'common',
debug: process.env.NODE_ENV !== 'production',
interpolation: {
escapeValue: false,

View file

@ -35,11 +35,11 @@ import {
} from './eventStyle';
import api from 'services';
import { useSettingsStore, useRecentsStore } from 'stores';
import { useSettingsStore, useRecentsStore, useLocaleUpdateStore } from 'stores';
import logo from 'res/logo.svg';
import timezones from 'res/timezones.json';
import supportedLocales from 'res/dayjs_locales.json';
import localeImports from 'res/dayjs_locales';
dayjs.extend(utc);
dayjs.extend(timezone);
@ -51,6 +51,8 @@ const Event = (props) => {
const weekStart = useSettingsStore(state => state.weekStart);
const addRecent = useRecentsStore(state => state.addRecent);
const setLocale = useLocaleUpdateStore(state => state.setLocale);
const locale = useLocaleUpdateStore(state => state.locale);
const { t, i18n } = useTranslation(['common', 'event']);
@ -76,10 +78,13 @@ const Event = (props) => {
const [copied, setCopied] = useState(null);
useEffect(() => {
if (Array.from(supportedLocales).includes(i18n.language)) {
import(`dayjs/locale/${i18n.language}.js`).then(() => dayjs.locale(i18n.language));
if (Object.keys(localeImports).includes(i18n.language)) {
localeImports[i18n.language]().then(() => {
dayjs.locale(i18n.language);
setLocale(dayjs.locale());
});
}
}, [i18n.language]);
}, [i18n.language, setLocale]);
useEffect(() => {
const fetchEvent = async () => {
@ -210,7 +215,7 @@ const Event = (props) => {
return [...allDates, date];
}, []));
}
}, [times, timeFormat]);
}, [times, timeFormat, locale]);
useEffect(() => {
const fetchUser = async () => {
@ -296,7 +301,7 @@ const Event = (props) => {
{(!!event || isLoading) ? (
<>
<EventName isLoading={isLoading}>{event?.name}</EventName>
<EventDate isLoading={isLoading} title={event?.created && dayjs.unix(event?.created).format('D MMMM, YYYY')}>{event?.created && t('common:created', { date: dayjs.unix(event?.created).fromNow() })}</EventDate>
<EventDate isLoading={isLoading} locale={locale} title={event?.created && dayjs.unix(event?.created).format('D MMMM, YYYY')}>{event?.created && t('common:created', { date: dayjs.unix(event?.created).fromNow() })}</EventDate>
<ShareInfo
onClick={() => navigator.clipboard?.writeText(`https://crab.fit/${id}`)
.then(() => {
@ -364,6 +369,7 @@ const Event = (props) => {
type="submit"
isLoading={isLoginLoading}
disabled={isLoginLoading || isLoading}
buttonWidth={`${Math.max(t('event:form.button').length*11, 100)}px`}
>{t('event:form.button')}</Button>
</LoginForm>
{error && <Error onClose={() => setError(null)}>{error}</Error>}

View file

@ -63,7 +63,7 @@ export const EventDate = styled.span`
export const LoginForm = styled.form`
display: grid;
grid-template-columns: 1fr 1fr 100px;
grid-template-columns: 1fr 1fr auto;
align-items: flex-end;
grid-gap: 18px;

View file

@ -83,11 +83,11 @@ const Home = ({ offline }) => {
const dates = JSON.parse(data.dates);
if (dates.length === 0) {
return setError(`You haven't selected any dates!`);
return setError(t('home:form.errors.no_dates'));
}
const isSpecificDates = typeof dates[0] === 'string' && dates[0].length === 8;
if (start === end) {
return setError(`The start and end times can't be the same`);
return setError(t('home:form.errors.same_times'));
}
let times = dates.reduce((times, date) => {
@ -124,7 +124,7 @@ const Home = ({ offline }) => {
}, []);
if (times.length === 0) {
return setError(`You don't have any time selected`);
return setError(t('home:form.errors.no_time'));
}
const response = await api.post('/event', {
@ -139,7 +139,7 @@ const Home = ({ offline }) => {
'event_category': 'home',
});
} catch (e) {
setError('An error ocurred while creating the event. Please try again later.');
setError(t('home:form.errors.unknown'));
console.error(e);
} finally {
setIsLoading(false);
@ -236,7 +236,7 @@ const Home = ({ offline }) => {
{/* eslint-disable-next-line */}
<P><Trans i18nKey="home:about.content.p3">Created by <a href="https://bengrant.dev" target="_blank">Ben Grant</a>, Crab Fit is the modern-day solution to your group event planning debates.</Trans></P>
<P><Trans i18nKey="home:about.content.p4">The code for Crab Fit is open source, if you find any issues or want to contribute, you can visit the <a href="https://github.com/GRA0007/crab.fit" target="_blank" rel="noreferrer">repository</a>. By using Crab Fit you agree to the <Link to="/privacy">privacy policy</Link>.</Trans></P>
<P><Trans i18nKey="home:about.content.p5">Crab Fit costs more than <strong>$100 per month</strong> to run. Consider donating below if it helped you out so it can stay free for everyone. 🦀</Trans></P>
<P><Trans i18nKey="home:about.content.p5">Consider donating below if it helped you out so it can stay free for everyone. 🦀</Trans></P>
</StyledMain>
</AboutSection>

View file

@ -0,0 +1,11 @@
const locales = {
en: () => import('dayjs/locale/en'),
de: () => import('dayjs/locale/de'),
es: () => import('dayjs/locale/es'),
ko: () => import('dayjs/locale/ko'),
fr: () => import('dayjs/locale/fr'),
id: () => import('dayjs/locale/id'),
hi: () => import('dayjs/locale/hi'),
};
export default locales;

View file

@ -39,3 +39,8 @@ export const useTWAStore = create(set => ({
TWA: undefined,
setTWA: TWA => set({ TWA }),
}));
export const useLocaleUpdateStore = create(set => ({
locale: undefined,
setLocale: locale => set({ locale }),
}));

View file

@ -9181,14 +9181,14 @@ react-dev-utils@^11.0.3:
strip-ansi "6.0.0"
text-table "0.2.0"
react-dom@^17.0.1:
version "17.0.1"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6"
integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==
react-dom@^17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
scheduler "^0.20.1"
scheduler "^0.20.2"
react-error-overlay@^6.0.9:
version "6.0.9"
@ -9318,7 +9318,7 @@ react-scripts@4.0.3:
optionalDependencies:
fsevents "^2.1.3"
react@^17.0.1:
react@^17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
@ -9837,10 +9837,10 @@ saxes@^5.0.0:
dependencies:
xmlchars "^2.2.0"
scheduler@^0.20.1:
version "0.20.1"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c"
integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==
scheduler@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"