Merge pull request #176 from krawieck/l10n

This commit is contained in:
Filip Krawczyk 2021-03-09 22:33:24 +01:00 committed by GitHub
commit 22729dc2e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
70 changed files with 6261 additions and 154 deletions

View File

@ -6,6 +6,14 @@
From issues to wikis: everything is on [GitHub](https://github.com/krawieck/lemmur)
## Linting / Formatting
Everything is formatted with `dartfmt` (no flags) and linted with `dartanalyzer` ([see rules](analysis_options.yaml)). Both are enforced by the CI.
## Translations
<!-- TODO -->
## Architecture
Lemmur is written in Dart using [Flutter](https://flutter.dev/docs). To communicate with Lemmy instances [lemmy_api_client](https://github.com/krawieck/lemmy_api_client) is used.
@ -19,6 +27,7 @@ Lemmur is written in Dart using [Flutter](https://flutter.dev/docs). To communic
(relative to `lib/`)
- `hooks/`: reusable state hooks
- `l10n/`: files with localized strings and localizations tools
- `pages/`: fullscreen pages that you navigate to
- `stores/`: global stores
- `util/`: utilities
@ -30,6 +39,12 @@ Lemmur is written in Dart using [Flutter](https://flutter.dev/docs). To communic
- Be aware that Lemmur supports arbitrary Lemmy instances, don't hardcode instance urls
- Remember that a user is not obligated to be logged in, contributed widgets should handle this case
## Linting / Formatting
### For React developers
Everything is formatted with `dartfmt` (no flags) and linted with `dartanalyzer` ([see rules](analysis_options.yaml)). Both are enforced by the CI.
If you come from a React background Flutter shouldn't be anything hard to grasp for you.
- Components are called 'widgets' in flutter
- `flutter_hooks` is a React hooks port to flutter. Though you will come to see that `flutter_hooks` are not as powerful
- There is no CSS. You compose your layout with other widgets and style them by passing properties to them
- There are no functional components, everything has to be a class
- Creating wrapping widgets is not as nice as in React, there is no `{ ...props }`. In flutter you need to pass each argument one by one

6
l10n.yaml Normal file
View File

@ -0,0 +1,6 @@
arb-dir: lib/l10n
template-arb-file: intl_en.arb
output-localization-file: l10n.dart
preferred-supported-locales: [en]
output-class: L10n
untranslated-messages-file: lib/l10n/untranslated.json

81
lib/l10n/intl_ar.arb Normal file
View File

@ -0,0 +1,81 @@
{
"@@locale": "ar",
"settings": "الإعدادات",
"password": "الكلمة السرية",
"email_or_username": "عنوان البريد أو اسم المستخدم",
"posts": "منشورات",
"comments": "التعليقات",
"modlog": "تأريخ الإشراف",
"community": "المجتمع",
"url": "الرابط",
"title": "العنوان",
"body": "المحتوى",
"nsfw": "محتوى حساس",
"post": "منشور",
"save": "حفظ",
"subscribed": "مُتابِعون",
"all": "الكل",
"replies": "الإجابات",
"mentions": "الإشارات",
"to": "إلى",
"deleted_by_creator": "حذفه صاحبه",
"more": "المزيد",
"mark_as_read": "تعيين كمقروء",
"mark_as_unread": "تعيين كغير مقروء بعد",
"reply": "رد",
"edit": "تعديل",
"delete": "حذف",
"restore": "استعادة",
"yes": "نعم",
"no": "لا",
"avatar": "الصورة الرمزية",
"email": "البريد الإلكتروني",
"matrix_user": "مستخدم ماتريكس",
"sort_type": "ترتيب حسب",
"type": "النوع",
"show_nsfw": "إظهار المحتوى الحساس",
"send_notifications_to_email": "إرسال الإشعارات عبر البريد الإلكتروني",
"delete_account": "حذف الحساب",
"saved": "تم حفظه",
"communities": "المجتمعات",
"users": "المستخدِمون",
"theme": "المظهر",
"language": "اللغة",
"hot": "المتداولة",
"new_": "جديد",
"old": "قديم",
"top": "المتداولة",
"chat": "دردشة",
"admin": "مدير",
"by": "مِن",
"not_an_admin": "لستَ مديرا.",
"not_logged_in": "لستَ متصلا.",
"site_ban": "لقد تم طردك مِن هذا الموقع",
"community_ban": "لقد تم طردك مِن هذا المجتمع.",
"downvotes_disabled": "تم تعطيل التصويتات السلبية",
"locked": "محظور",
"couldnt_create_comment": "تعذّر إنشاءالتعليق.",
"password_incorrect": "الكلمة السرية خاطئة.",
"registration_closed": "إنشاء الحسابات معطل",
"passwords_dont_match": "الكلمات السرية غير متطابقة.",
"email_already_exists": "عنوان البريد الإلكتروني هذا موجود بالفعل.",
"user_already_exists": "هذا المستخدِم موجود بالفعل.",
"unsubscribe": "إلغاء الإشتراك",
"subscribe": "اتبع",
"messages": "لرسائل",
"banned_users": "المستخدمون المحظورون",
"new_password": "لكلمة السرية الجديدة",
"verify_password": "تأكيد الكلمة السرية",
"old_password": "الكلمة السرية القديمة",
"show_avatars": "إظهار الصور الرمزية",
"search": "البحث",
"send_message": "أرسل الرسالة",
"top_day": "المتداول",
"top_week": "المتداول هذا",
"top_month": "المتداول هذا",
"top_year": "المتداول هذه",
"top_all": "المتداولة",
"most_comments": "الأكثر",
"new_comments": "الأحدث",
"active": "النشط"
}

132
lib/l10n/intl_ca.arb Normal file
View File

@ -0,0 +1,132 @@
{
"@@locale": "ca",
"settings": "Configuració",
"password": "Contrasenya",
"email_or_username": "Adreça electrònica o usuari",
"posts": "Publicacions",
"comments": "Comentaris",
"modlog": "Historial de moderació",
"community": "Comunitat",
"url": "URL",
"title": "Títol",
"body": "Cos",
"nsfw": "Per a adults",
"post": "publicar",
"save": "desa",
"subscribed": "Subscrit",
"local": "Local",
"all": "Tot",
"replies": "Respostes",
"mentions": "Mencions",
"from": "des de",
"to": "a",
"deleted_by_creator": "suprimit pel creador",
"more": "més",
"mark_as_read": "marca com a llegit",
"mark_as_unread": "marca com a no llegit",
"reply": "respon",
"edit": "edita",
"delete": "suprimeix",
"restore": "restaura",
"yes": "sí",
"no": "no",
"avatar": "Avatar",
"banner": "Capçalera",
"display_name": "Nom a mostrar",
"bio": "Biografia",
"email": "Correu electrònic",
"matrix_user": "Usuari del Matrix",
"sort_type": "Tipus dordenació",
"type": "Tipus",
"show_nsfw": "Mostra el contingut per a adults",
"send_notifications_to_email": "Envia notificacions al correu",
"delete_account": "Suprimeix el compte",
"saved": "Desat",
"communities": "Comunitats",
"users": "Usuaris",
"theme": "Tema",
"language": "Llengua",
"hot": "Popular",
"new_": "Nou",
"old": "Antic",
"top": "Millor",
"chat": "Xat",
"admin": "administrador",
"by": "per",
"not_an_admin": "No és un administrador.",
"couldnt_find_post": "No sha pogut trobar lapunt.",
"not_logged_in": "No heu iniciat una sessió.",
"site_ban": "Us han expulsat del lloc",
"community_ban": "Us han expulsat daquesta comunitat.",
"downvotes_disabled": "Vots negatius inhabilitats",
"invalid_url": "URL invàlida.",
"locked": "blocat",
"couldnt_create_comment": "No sha pogut crear el comentari.",
"couldnt_like_comment": "No sha pogut donar «magrada» al comentari.",
"couldnt_update_comment": "No sha pogut actualitzar el comentari.",
"no_comment_edit_allowed": "No teniu permisos per a editar el comentari.",
"couldnt_save_comment": "No sha pogut desar el comentari.",
"couldnt_get_comments": "No shan pogut recuperar els comentaris.",
"report_reason_required": "Motiu de l'informe necessari.",
"report_too_long": "Informe massa llarg.",
"couldnt_create_report": "No s'ha pogut crear l'informe.",
"couldnt_resolve_report": "No s'ha pogut resoldre l'informe.",
"invalid_post_title": "Títol de la publicació invàlid",
"couldnt_create_post": "No sha pogut crear lapunt.",
"couldnt_like_post": "No sha pogut donar «magrada» a lapunt.",
"couldnt_find_community": "No sha pogut trobar la comunitat.",
"couldnt_get_posts": "No shan pogut recuperar els apunts",
"no_post_edit_allowed": "No teniu permisos per a editar lapunt.",
"couldnt_save_post": "No sha pogut desar lapunt.",
"site_already_exists": "El lloc ja existeix.",
"couldnt_update_site": "No sha pogut actualitzar el lloc.",
"invalid_community_name": "El nom no és vàlid.",
"community_already_exists": "Aquesta comunitat ja existeix.",
"community_moderator_already_exists": "Aquest moderador de la comunitat ja existeix.",
"community_follower_already_exists": "Aquest seguidor de la comunitat ja existeix.",
"not_a_moderator": "No ets un moderador.",
"couldnt_update_community": "No sha pogut actualitzar la comunitat.",
"no_community_edit_allowed": "No teniu permisos per a editar la comunitat.",
"system_err_login": "Error del sistema. Intenti tancar sessió i ingressar de nou.",
"community_user_already_banned": "Aquest usuari de la comunitat ja fou expulsat.",
"couldnt_find_that_username_or_email": "No sha pogut trobar aquest nom de usuari o adreça electrònica.",
"password_incorrect": "Contrasenya incorrecta.",
"registration_closed": "Shan tancat els registres",
"invalid_password": "Contrasenya no vàlida. La contrasenya ha de tenir <= 60 caràcters.",
"passwords_dont_match": "Les contrasenyes no coincideixen.",
"captcha_incorrect": "Captcha incorrecte.",
"invalid_username": "El nom dusuari no és vàlid.",
"bio_length_overflow": "La biografia d'usuari no pot excedir els 300 caràcters.",
"couldnt_update_user": "No sha pogut actualitzar lusuari.",
"couldnt_update_private_message": "No sha pogut actualitzar el missatge privat.",
"couldnt_update_post": "No sha pogut actualitzar lapunt",
"couldnt_create_private_message": "No sha pogut crear el missatge privat.",
"no_private_message_edit_allowed": "No teniu permisos per a editar el missatge privat.",
"post_title_too_long": "El títol de lapunt és massa llarg.",
"email_already_exists": "Ladreça ja és en ús.",
"user_already_exists": "Lusuari ja existeix.",
"number_of_users_online": "{count,plural, =1{{count} usuari en línia} other{{count} usuaris en línia}}",
"number_of_comments": "{count,plural, =1{{count} comentari} other{{count} comentaris}}",
"number_of_posts": "{count,plural, =1{{count} Publicació} other{{count} Publicacions}}",
"number_of_subscribers": "{count,plural, =1{{count} subscriptor} other{{count} subscriptors}}",
"number_of_users": "{count,plural, =1{{count} usuari} other{{count} usuaris}}",
"unsubscribe": "Dónat de baixa",
"subscribe": "Subscriu-thi",
"messages": "Missatges",
"banned_users": "Usuaris expulsats",
"delete_account_confirm": "Atenció: aquesta acció suprimirà permanentment la vostra informació. Introduïu la vostra contrasenya per a confirmar.",
"new_password": "Contrasenya nova",
"verify_password": "Verifica la contrasenya",
"old_password": "Contrasenya antiga",
"show_avatars": "Mostra els avatars",
"search": "Cerca",
"send_message": "Envia el missatge",
"top_day": "El millor del dia",
"top_week": "El millor de la setmana",
"top_month": "El millor del mes",
"top_year": "El millor de l'any",
"top_all": "El millor de tots els temps",
"most_comments": "Més comentaris",
"new_comments": "Comentaris nous",
"active": "Actiu"
}

126
lib/l10n/intl_da.arb Normal file
View File

@ -0,0 +1,126 @@
{
"@@locale": "da",
"settings": "Indstillinger",
"password": "Kodeord",
"email_or_username": "Email eller Brugernavn",
"posts": "Indlæg",
"comments": "Kommentarer",
"modlog": "Moderator log",
"community": "Forum",
"url": "URL",
"title": "Titel",
"body": "Korpus",
"nsfw": "NSFW",
"post": "indlæg",
"save": "gem",
"subscribed": "Abboneret",
"local": "Lokal",
"all": "Alle",
"replies": "Svar",
"mentions": "Nævnt dig",
"from": "fra",
"to": "til",
"deleted_by_creator": "slettet af forfatter",
"more": "mere",
"mark_as_read": "marker som læst",
"mark_as_unread": "marker som ulæst",
"reply": "svar",
"edit": "ret",
"delete": "slet",
"restore": "genskab",
"yes": "ja",
"no": "nej",
"avatar": "Avatar",
"banner": "Banner",
"display_name": "Visnings navn",
"bio": "Beskrivelse",
"email": "Email",
"matrix_user": "Matrix Bruger",
"sort_type": "Sortering",
"type": "Type",
"show_nsfw": "Vis NSFW indhold",
"send_notifications_to_email": "Send notifikationer til email",
"delete_account": "Slet Konto",
"saved": "Gemt",
"communities": "Forummer",
"users": "Brugere",
"theme": "Tema",
"language": "Sprog",
"hot": "Hot",
"new_": "New",
"old": "Old",
"top": "Top",
"chat": "Chat",
"admin": "administrator",
"by": "af",
"not_an_admin": "Ej en administrator.",
"couldnt_find_post": "Kunne ikke finde indlæg.",
"not_logged_in": "Ikke logget ind.",
"site_ban": "Du er udelukket fra denne site",
"community_ban": "Du er blevet udelukket fra dette forum.",
"downvotes_disabled": "Nedstem deaktiveret",
"invalid_url": "Ugyldig URL.",
"locked": "låst",
"couldnt_create_comment": "Kunne ikke oprette kommentar.",
"couldnt_like_comment": "Kunne ikke like kommentar.",
"couldnt_update_comment": "Kunne ikke opdatere kommentar.",
"no_comment_edit_allowed": "Ej tilladt at ændre kommentar.",
"couldnt_save_comment": "Kunne ikke gemme kommentar.",
"couldnt_get_comments": "Kunne ikke hente kommentarer.",
"report_reason_required": "Angiv grund påkrævet.",
"report_too_long": "Angivelsen er for lang.",
"couldnt_create_report": "Kunne ikke oprette angivelse.",
"couldnt_resolve_report": "Kunne ikke løse angivelse.",
"invalid_post_title": "Ugyldig indlægstitel",
"couldnt_create_post": "Kunne ikke oprette indlæg.",
"couldnt_like_post": "Kunne ikke like indlæg.",
"couldnt_find_community": "Kunne ikke finde forum.",
"couldnt_get_posts": "Kunne ikke hente indlæg",
"no_post_edit_allowed": "Ej tilladt at ændre indlæg.",
"couldnt_save_post": "Kunne ikke gemme indlæg.",
"site_already_exists": "Site findes allerede.",
"couldnt_update_site": "Kunne ikke opdatere site.",
"invalid_community_name": "Ugyldigt navn.",
"community_already_exists": "Forum findes allerede.",
"community_moderator_already_exists": "Forum moderator findes allerede.",
"community_follower_already_exists": "Forum abonnent findes allerede.",
"not_a_moderator": "Ej en moderator.",
"couldnt_update_community": "Kunne ikke opdatere forum.",
"no_community_edit_allowed": "Ej tilladt at ændre forum.",
"system_err_login": "System fejl. Prøv at logge ud- og ind igen.",
"community_user_already_banned": "Forum bruger allerede udelukket.",
"couldnt_find_that_username_or_email": "Kunne ikke finde bruger eller email.",
"password_incorrect": "Kodeord forkert.",
"registration_closed": "Tilmelding lukket",
"invalid_password": "Ugyldigt kodeord. Kodeord skal have <= 60 tegn.",
"passwords_dont_match": "Kodeord matcher ikke.",
"captcha_incorrect": "Captcha forkert.",
"invalid_username": "Fejl i brugernavn.",
"bio_length_overflow": "Brugerbeskrivelse skal være mindre end 300 tegn.",
"couldnt_update_user": "Kunne ikke opdatere brugeren.",
"couldnt_update_private_message": "Kunne ej opdatere privat besked.",
"couldnt_update_post": "Kunne ikke opdatere indlæg",
"couldnt_create_private_message": "Kunne ikke oprette privat besked.",
"no_private_message_edit_allowed": "Ulovligt at ændre i privat besked.",
"post_title_too_long": "Indlægstitel for lang.",
"email_already_exists": "Emailen findes allerede.",
"user_already_exists": "Brugeren findes allerede.",
"number_of_users_online": "{count,plural, =1{{count} Bruger Online} other{{count} Brugere Online}}",
"number_of_comments": "{count,plural, =1{{count} Kommentar} other{{count} Kommentarer}}",
"number_of_posts": "{count,plural, =1{{count} Indlæg} other{{count} Indlæg}}",
"number_of_subscribers": "{count,plural, =1{{count} Abonnent} other{{count} Abonnenter}}",
"number_of_users": "{count,plural, =1{{count} Bruger} other{{count} Brugere}}",
"unsubscribe": "Afmeld abbonement",
"subscribe": "Abboner",
"messages": "Beskeder",
"banned_users": "Udelukkede Brugere",
"delete_account_confirm": "Advarsel: Dette vil slette alle dine data. Indtast adgangskode for at bekræfte.",
"new_password": "Nyt Kodeord",
"verify_password": "Check Kodeord",
"old_password": "Tidligere Kodeord",
"show_avatars": "Vis Avatarer",
"search": "Søg",
"send_message": "Send Besked",
"top_day": "Top dag",
"active": "Active"
}

122
lib/l10n/intl_de.arb Normal file
View File

@ -0,0 +1,122 @@
{
"@@locale": "de",
"settings": "Einstellungen",
"password": "Passwort",
"email_or_username": "E-mail oder Username",
"posts": "Beiträge",
"comments": "Kommentare",
"modlog": "Moderations-Log",
"community": "Community",
"url": "URL",
"title": "Titel",
"body": "Text",
"nsfw": "NSFW",
"post": "Beitrag",
"save": "speichern",
"subscribed": "Abonniert",
"local": "Lokal",
"all": "Alle",
"replies": "Antworten",
"mentions": "Erwähnung",
"from": "von",
"to": "in",
"deleted_by_creator": "vom Ersteller gelöscht",
"more": "mehr",
"mark_as_read": "als gelesen markieren",
"mark_as_unread": "als ungelesen markieren",
"reply": "antworten",
"edit": "editieren",
"delete": "löschen",
"restore": "wiederherstellen",
"yes": "Ja",
"no": "Nein",
"avatar": "Avatar",
"banner": "Banner",
"display_name": "Anzeigename",
"bio": "Biographie",
"email": "E-Mail",
"matrix_user": "Matrix Benutzer",
"sort_type": "Sortieren nach",
"type": "Typ",
"show_nsfw": "NSFW-Inhalte anzeigen",
"send_notifications_to_email": "Sende Benachrichtigungen per Email",
"delete_account": "Konto löschen",
"saved": "Gespeichert",
"communities": "Communitys",
"users": "Benutzer",
"theme": "Aussehen",
"language": "Sprache",
"hot": "Heiß",
"new_": "Neu",
"old": "Alt",
"top": "Top",
"chat": "Chat",
"admin": "Administrator",
"by": "von",
"not_an_admin": "Kein Administrator.",
"couldnt_find_post": "Konnte Beitrag nicht finden.",
"not_logged_in": "Nicht eingeloggt.",
"site_ban": "Du wurdest von dieser Seite gebannt",
"community_ban": "Du wurdest von dieser Community gebannt.",
"downvotes_disabled": "Downvotes deaktiviert",
"invalid_url": "Ungültige URL.",
"locked": "gesperrt",
"couldnt_create_comment": "Konnte Kommentar nicht anlegen.",
"couldnt_like_comment": "Konnte nicht liken.",
"couldnt_update_comment": "Konnte Kommentar nicht aktualisieren.",
"no_comment_edit_allowed": "Keine Erlaubnis Kommentar zu editieren.",
"couldnt_save_comment": "Konnte Kommentar nicht speichern.",
"couldnt_get_comments": "Konnte Kommentare nicht laden.",
"invalid_post_title": "Ungültiger Post Titel",
"couldnt_create_post": "Konnte Beitrag nicht anlegen.",
"couldnt_like_post": "Konnte Beitrag nicht liken.",
"couldnt_find_community": "Konnte Community nicht finden.",
"couldnt_get_posts": "Konnte Beiträge nicht holen",
"no_post_edit_allowed": "Keine Erlaubnis Beitrag zu editieren.",
"couldnt_save_post": "Konnte Beitrag nicht speichern.",
"site_already_exists": "Seite existiert bereits.",
"couldnt_update_site": "Konnte Seite nicht aktualisieren.",
"invalid_community_name": "Ungültiger Name.",
"community_already_exists": "Die Community existiert bereits.",
"community_moderator_already_exists": "Community-Moderator*in existiert bereits.",
"community_follower_already_exists": "Community-Abonnent*in existiert bereits.",
"not_a_moderator": "Kein Moderator.",
"couldnt_update_community": "Konnte die Community nicht aktualisieren.",
"no_community_edit_allowed": "Keine Erlaubnis, die Community zu editieren.",
"system_err_login": "Systemfehler. Versuche dich aus- und wieder einzuloggen.",
"community_user_already_banned": "Der*die Community-Benutzer*in ist schon gebannt.",
"couldnt_find_that_username_or_email": "Konnte Username oder E-Mail nicht finden.",
"password_incorrect": "Passwort falsch.",
"registration_closed": "Registrierung geschlossen",
"invalid_password": "Ungültiges Passwort. Das Passwort muss <= 60 Zeichen enthalten.",
"passwords_dont_match": "Passwörter stimmen nicht überein.",
"captcha_incorrect": "Das Captcha ist inkorrekt.",
"invalid_username": "Ungültiger Benutzername.",
"bio_length_overflow": "Die Benutzerbiographie darf nicht länger als 300 Zeichen sein.",
"couldnt_update_user": "Konnte Nutzer nicht aktualisieren.",
"couldnt_update_private_message": "Konnte Privatnachricht nicht aktualisieren.",
"couldnt_update_post": "Konnte Beitrag nicht aktualisieren",
"couldnt_create_private_message": "Konnte Privatnachricht nicht erstelllen.",
"no_private_message_edit_allowed": "Editieren der Privatnachricht nicht erlaubt.",
"post_title_too_long": "Posttitel zu lang.",
"email_already_exists": "Email existiert bereits.",
"user_already_exists": "Nutzer existiert bereits.",
"number_of_users_online": "{count,plural, =1{{count} Benutzer online} other{{count} Benutzer*innen online}}",
"number_of_comments": "{count,plural, =1{{count} Kommentar} other{{count} Kommentare}}",
"number_of_posts": "{count,plural, =1{{count} Beitrag} other{{count} Beiträge}}",
"number_of_subscribers": "{count,plural, =1{{count} Abonnent} other{{count} Abonnent*innen}}",
"number_of_users": "{count,plural, =1{{count} Benutzer} other{{count} Benutzer*innen}}",
"unsubscribe": "Deabonnieren",
"subscribe": "Abonnieren",
"messages": "Nachrichten",
"banned_users": "Gebannte Benutzer",
"delete_account_confirm": "Achtung: Dadurch werden alle Ihre Daten dauerhaft gelöscht. Geben Sie zur Bestätigung Ihr Passwort ein.",
"new_password": "Neues Passwort",
"verify_password": "Passwort überprüfen",
"old_password": "Letztes Passwort",
"show_avatars": "Avatare anzeigen",
"search": "Suchen",
"send_message": "Nachricht absenden",
"top_day": "Top täglich",
"active": "Aktiv"
}

132
lib/l10n/intl_el.arb Normal file
View File

@ -0,0 +1,132 @@
{
"@@locale": "el",
"settings": "Ρυθμίσεις",
"password": "Κωδικός",
"email_or_username": "Διεύθυνση ηλεκτρονικού ταχυδρομείου ή όνομα χρήστη",
"posts": "Δημοσιεύσεις",
"comments": "Σχόλια",
"modlog": "Ιστορικό συντονισμού",
"community": "Κοινότητα",
"url": "URL",
"title": "Επικεφαλίδα",
"body": "Κορμός",
"nsfw": "Ακατάλληλο για ανηλίκους",
"post": "δημοσίευση",
"save": "αποθήκευση",
"subscribed": "Συνδρομές",
"local": "Τοπικά",
"all": "Όλα",
"replies": "Απαντήσεις",
"mentions": "Αναφορές",
"from": "από",
"to": "προς",
"deleted_by_creator": "διαγράφηκε από τον δημιουργό",
"more": "περισσότερα",
"mark_as_read": "επισήμανση ως διαβασμένο",
"mark_as_unread": "επισήμανση ως μη διαβασμένο",
"reply": "απάντηση",
"edit": "επεξεργασία",
"delete": "διαγραφή",
"restore": "επαναφορά",
"yes": "ναι",
"no": "όχι",
"avatar": "Άβαταρ",
"banner": "Μπάνερ",
"display_name": "Προβαλλόμενο όνομα",
"bio": "Βιογραφικό",
"email": "Email",
"matrix_user": "Χρήστης Matrix",
"sort_type": "Ταξινόμηση κατά",
"type": "Είδος",
"show_nsfw": "Προβολή περιεχομένου ακατάλληλου για ανηλίκους",
"send_notifications_to_email": "Αποστολή ειδοποιήσεων στη διεύθυνση ηλεκτρονικού ταχυδρομείου",
"delete_account": "Διαγραφή λογαριασμού",
"saved": "Αποθηκευμένα",
"communities": "Κοινότητες",
"users": "Χρήστες",
"theme": "Θέμα",
"language": "Γλώσσα",
"hot": "Δημοφιλία",
"new_": "Φρεσκάδα",
"old": "Παλιά",
"top": "Κορυφαία",
"chat": "Συνομιλία",
"admin": "διαχειριστής",
"by": "από",
"not_an_admin": "Ο χρήστης δεν είναι διαχειριστής.",
"couldnt_find_post": "Δεν μπόρεσε να βρεθεί η δημοσίευση.",
"not_logged_in": "Αποσυνδεδέμενος.",
"site_ban": "Έχετε αποβληθεί από τον ιστότοπο",
"community_ban": "Έχετε αποβληθεί από αυτή την κοινότητα.",
"downvotes_disabled": "Αρνητικές ψήφοι απενεργοποιημένες",
"invalid_url": "Μη έγκυρο URL.",
"locked": "κλειδωμένο",
"couldnt_create_comment": "Αδυναμία δημιουργίας σχόλιου.",
"couldnt_like_comment": "Δεν μπόρεσε να ψηφισθεί θετικά το σχόλιο.",
"couldnt_update_comment": "Δεν μπόρεσε να ενημερωθεί το σχόλιο.",
"no_comment_edit_allowed": "Δεν επιτρέπεται η επεξεργασία του σχολίου.",
"couldnt_save_comment": "Δεν μπόρεσε να αποθηκευτεί το σχόλιο.",
"couldnt_get_comments": "Δεν μπόρεσαν να φορτώσουν τα σχόλια.",
"report_reason_required": "Απαιτείται λόγος αναφοράς.",
"report_too_long": "Η αναφορά είναι υπερβολικά μεγάλη.",
"couldnt_create_report": "Αδυναμία δημιουργίας αναφοράς.",
"couldnt_resolve_report": "Αδυναμία επίλυσης αναφοράς.",
"invalid_post_title": "Μη έγκυρη επικεφαλίδα δημοσίευσης",
"couldnt_create_post": "Δεν μπόρεσε να δημιουργηθεί η δημοσίευση.",
"couldnt_like_post": "Δεν μπόρεσε να ψηφισθεί θετικά η δημοσίευση.",
"couldnt_find_community": "Δεν μπόρεσε να βρεθεί η κοινότητα.",
"couldnt_get_posts": "Αδυναμία εύρεσης δημοσιεύσων",
"no_post_edit_allowed": "Δεν επιτρέπεται η επεξεργασία της δημοσίευσης.",
"couldnt_save_post": "Δεν μπόρεσε να αποθηκευτεί η δημοσίευση.",
"site_already_exists": "Ο ιστότοπος υπάρχει ήδη.",
"couldnt_update_site": "Αδυναμία ενημέρωσης ιστότοπου.",
"invalid_community_name": "Άκυρο όνομα.",
"community_already_exists": "Η κοινότητα υπάρχει ήδη.",
"community_moderator_already_exists": "Ο χρήστης είναι ήδη συντονιστής της κοινότητας.",
"community_follower_already_exists": "Ο χρήστης είναι ήδη εγγεγραμμένος στην κοινότητα.",
"not_a_moderator": "Δεν είναι συντονιστής.",
"couldnt_update_community": "Δεν μπόρεσε να ενημερωθεί η κοινότητα.",
"no_community_edit_allowed": "Δεν επιτρέπεται η επεξεργασία της κοινότητας.",
"system_err_login": "Σφάλμα στο σύστημα. Προσπαθήστε να αποσυνδεθείτε και να συνδεθείτε ξανά.",
"community_user_already_banned": "Ο χρήστης έχει ήδη αποβληθεί από την κοινότητα.",
"couldnt_find_that_username_or_email": "Αδυναμία εύρεσης χρήστη ή διεύθυνσης ηλεκτρονικού ταχυδρομείου.",
"password_incorrect": "Λάθος κωδικός.",
"registration_closed": "Εγγραφή κλειστή",
"invalid_password": "Άκυρος κωδικός. Ο κωδικός πρέπει να είναι <= 60 χαρακτήρες.",
"passwords_dont_match": "Οι κωδικοί δεν ταιριάζουν.",
"captcha_incorrect": "Εσφαλμένο captcha.",
"invalid_username": "Λάθος όνομα χρήστη.",
"bio_length_overflow": "Το βιογραφικό χρήστη δεν μπορεί να ξεπερνά τους 300 χαρακτήρες.",
"couldnt_update_user": "Αδυναμία ενημέρωσης χρήστη.",
"couldnt_update_private_message": "Αδυναμία ενημέρωσης προσωπικού μηνύματος.",
"couldnt_update_post": "Αδυναμία ενημέρωσης δημοσιεύσης",
"couldnt_create_private_message": "Αδυναμία δημιουργίας προσωπικού μηνύματος.",
"no_private_message_edit_allowed": "Δεν επιτρέπεται η επεξεργασία του προσωπικού μηνύματος.",
"post_title_too_long": "Η επικεφαλίδα της δημοσίευσης είναι υπερβολικά μεγάλη.",
"email_already_exists": "Η διεύθυνση ηλεκτρονικού ταχυδρομείου υπάρχει ήδη.",
"user_already_exists": "Ο χρήστης υπάρχει ήδη.",
"number_of_users_online": "{count,plural, =1{{count} ενεργός χρήστης} other{{count} ενεργοί χρήστες}}",
"number_of_comments": "{count,plural, =1{{count} Σχόλιο} other{{count} Σχόλια}}",
"number_of_posts": "{count,plural, =1{{count} Δημοσίευση} other{{count} Δημοσιεύσεις}}",
"number_of_subscribers": "{count,plural, =1{{count} εγγεγραμμένος} other{{count} εγγεγραμμένοι}}",
"number_of_users": "{count,plural, =1{{count} χρήστης} other{{count} χρήστες}}",
"unsubscribe": "Απεγγραφή",
"subscribe": "Εγγραφή",
"messages": "Μηνύματα",
"banned_users": "Αποβεβλημένοι χρήστες",
"delete_account_confirm": "Προσοχή: αυτό θα διαγράψει όλα τα δεδομένα σας. Είσαγετε τον κωδικό σας για επιβεβαίωση.",
"new_password": "Νέος κωδικός",
"verify_password": "Επαλήθευση κωδικού",
"old_password": "Παλιός κωδικός",
"show_avatars": "Εμφάνιση των άβαταρς",
"search": "Αναζήτηση",
"send_message": "Αποστολή μηνύματος",
"top_day": "Κορυφαία σήμερα",
"top_week": "Κορυφαία της εβδομάδας",
"top_month": "Κορυφαία του μήνα",
"top_year": "Κορυφαία φέτος",
"top_all": "Κορυφαία από πάντα",
"most_comments": "Περισσότερα σχόλια",
"new_comments": "Νέα σχόλια",
"active": "Δραστηριότητα"
}

289
lib/l10n/intl_en.arb Normal file
View File

@ -0,0 +1,289 @@
{
"@@locale": "en",
"settings": "Settings",
"@settings": {},
"password": "Password",
"@password": {},
"email_or_username": "Email or Username",
"@email_or_username": {},
"posts": "Posts",
"@posts": {},
"comments": "Comments",
"@comments": {},
"modlog": "Modlog",
"@modlog": {},
"community": "Community",
"@community": {},
"url": "URL",
"@url": {},
"title": "Title",
"@title": {},
"body": "Body",
"@body": {},
"nsfw": "NSFW",
"@nsfw": {},
"post": "post",
"@post": {},
"save": "save",
"@save": {},
"subscribed": "Subscribed",
"@subscribed": {},
"local": "Local",
"@local": {},
"all": "All",
"@all": {},
"replies": "Replies",
"@replies": {},
"mentions": "Mentions",
"@mentions": {},
"from": "from",
"@from": {},
"to": "to",
"@to": {},
"deleted_by_creator": "deleted by creator",
"@deleted_by_creator": {},
"more": "more",
"@more": {},
"mark_as_read": "mark as read",
"@mark_as_read": {},
"mark_as_unread": "mark as unread",
"@mark_as_unread": {},
"reply": "reply",
"@reply": {},
"edit": "edit",
"@edit": {},
"delete": "delete",
"@delete": {},
"restore": "restore",
"@restore": {},
"yes": "yes",
"@yes": {},
"no": "no",
"@no": {},
"avatar": "Avatar",
"@avatar": {},
"banner": "Banner",
"@banner": {},
"display_name": "Display name",
"@display_name": {},
"bio": "Bio",
"@bio": {},
"email": "Email",
"@email": {},
"matrix_user": "Matrix User",
"@matrix_user": {},
"sort_type": "Sort type",
"@sort_type": {},
"type": "Type",
"@type": {},
"show_nsfw": "Show NSFW content",
"@show_nsfw": {},
"send_notifications_to_email": "Send notifications to Email",
"@send_notifications_to_email": {},
"delete_account": "Delete account",
"@delete_account": {},
"saved": "Saved",
"@saved": {},
"communities": "Communities",
"@communities": {},
"users": "Users",
"@users": {},
"theme": "Theme",
"@theme": {},
"language": "Language",
"@language": {},
"hot": "Hot",
"@hot": {},
"new_": "New",
"@new_": {},
"old": "Old",
"@old": {},
"top": "Top",
"@top": {},
"chat": "Chat",
"@chat": {},
"admin": "admin",
"@admin": {},
"by": "by",
"@by": {},
"not_a_mod_or_admin": "Not a moderator or admin.",
"@not_a_mod_or_admin": {},
"not_an_admin": "Not an admin.",
"@not_an_admin": {},
"couldnt_find_post": "Couldn't find post.",
"@couldnt_find_post": {},
"not_logged_in": "Not logged in.",
"@not_logged_in": {},
"site_ban": "You have been banned from the site",
"@site_ban": {},
"community_ban": "You have been banned from this community.",
"@community_ban": {},
"downvotes_disabled": "Downvotes disabled",
"@downvotes_disabled": {},
"invalid_url": "Invalid URL.",
"@invalid_url": {},
"locked": "locked",
"@locked": {},
"couldnt_create_comment": "Couldn't create comment.",
"@couldnt_create_comment": {},
"couldnt_like_comment": "Couldn't like comment.",
"@couldnt_like_comment": {},
"couldnt_update_comment": "Couldn't update comment.",
"@couldnt_update_comment": {},
"no_comment_edit_allowed": "Not allowed to edit comment.",
"@no_comment_edit_allowed": {},
"couldnt_save_comment": "Couldn't save comment.",
"@couldnt_save_comment": {},
"couldnt_get_comments": "Couldn't get comments.",
"@couldnt_get_comments": {},
"report_reason_required": "Report reason required.",
"@report_reason_required": {},
"report_too_long": "Report too long.",
"@report_too_long": {},
"couldnt_create_report": "Couldn't create report.",
"@couldnt_create_report": {},
"couldnt_resolve_report": "Couldn't resolve report.",
"@couldnt_resolve_report": {},
"invalid_post_title": "Invalid post title",
"@invalid_post_title": {},
"couldnt_create_post": "Couldn't create post.",
"@couldnt_create_post": {},
"couldnt_like_post": "Couldn't like post.",
"@couldnt_like_post": {},
"couldnt_find_community": "Couldn't find community.",
"@couldnt_find_community": {},
"couldnt_get_posts": "Couldn't get posts",
"@couldnt_get_posts": {},
"no_post_edit_allowed": "Not allowed to edit post.",
"@no_post_edit_allowed": {},
"couldnt_save_post": "Couldn't save post.",
"@couldnt_save_post": {},
"site_already_exists": "Site already exists.",
"@site_already_exists": {},
"couldnt_update_site": "Couldn't update site.",
"@couldnt_update_site": {},
"invalid_community_name": "Invalid name.",
"@invalid_community_name": {},
"community_already_exists": "Community already exists.",
"@community_already_exists": {},
"community_moderator_already_exists": "Community moderator already exists.",
"@community_moderator_already_exists": {},
"community_follower_already_exists": "Community follower already exists.",
"@community_follower_already_exists": {},
"not_a_moderator": "Not a moderator.",
"@not_a_moderator": {},
"couldnt_update_community": "Couldn't update Community.",
"@couldnt_update_community": {},
"no_community_edit_allowed": "Not allowed to edit community.",
"@no_community_edit_allowed": {},
"system_err_login": "System error. Try logging out and back in.",
"@system_err_login": {},
"community_user_already_banned": "Community user already banned.",
"@community_user_already_banned": {},
"couldnt_find_that_username_or_email": "Couldn't find that username or email.",
"@couldnt_find_that_username_or_email": {},
"password_incorrect": "Password incorrect.",
"@password_incorrect": {},
"registration_closed": "Registration closed",
"@registration_closed": {},
"invalid_password": "Invalid password. Password must be <= 60 characters.",
"@invalid_password": {},
"passwords_dont_match": "Passwords do not match.",
"@passwords_dont_match": {},
"captcha_incorrect": "Captcha incorrect.",
"@captcha_incorrect": {},
"invalid_username": "Invalid username.",
"@invalid_username": {},
"bio_length_overflow": "User bio cannot exceed 300 characters.",
"@bio_length_overflow": {},
"couldnt_update_user": "Couldn't update user.",
"@couldnt_update_user": {},
"couldnt_update_private_message": "Couldn't update private message.",
"@couldnt_update_private_message": {},
"couldnt_update_post": "Couldn't update post",
"@couldnt_update_post": {},
"couldnt_create_private_message": "Couldn't create private message.",
"@couldnt_create_private_message": {},
"no_private_message_edit_allowed": "Not allowed to edit private message.",
"@no_private_message_edit_allowed": {},
"post_title_too_long": "Post title too long.",
"@post_title_too_long": {},
"email_already_exists": "Email already exists.",
"@email_already_exists": {},
"user_already_exists": "User already exists.",
"@user_already_exists": {},
"number_of_users_online": "{count,plural, =1{{count} user online} other{{count} users online}}",
"@number_of_users_online": {
"placeholders": {
"count": {}
}
},
"number_of_comments": "{count,plural, =1{{count} comment} other{{count} comments}}",
"@number_of_comments": {
"placeholders": {
"count": {
"type": "int",
"format": "compact"
}
}
},
"number_of_posts": "{count,plural, =1{{count} post} other{{count} posts}}",
"@number_of_posts": {
"placeholders": {
"count": {
"type": "int",
"format": "compact"
}
}
},
"number_of_subscribers": "{count,plural, =1{{count} subscriber} other{{count} subscribers}}",
"@number_of_subscribers": {
"placeholders": {
"count": {}
}
},
"number_of_users": "{count,plural, =1{{count} user} other{{count} users}}",
"@number_of_users": {
"placeholders": {
"count": {}
}
},
"unsubscribe": "unsubscribe",
"@unsubscribe": {},
"subscribe": "subscribe",
"@subscribe": {},
"messages": "Messages",
"@messages": {},
"banned_users": "Banned users",
"@banned_users": {},
"delete_account_confirm": "Warning: this will permanently delete all your data. Enter your password to confirm.",
"@delete_account_confirm": {},
"new_password": "New password",
"@new_password": {},
"verify_password": "Verify password",
"@verify_password": {},
"old_password": "Old password",
"@old_password": {},
"show_avatars": "Show avatars",
"@show_avatars": {},
"search": "search",
"@search": {},
"send_message": "Send message",
"@send_message": {},
"top_day": "Top Day",
"@top_day": {},
"top_week": "Top Week",
"@top_week": {},
"top_month": "Top Month",
"@top_month": {},
"top_year": "Top Year",
"@top_year": {},
"top_all": "Top All Time",
"@top_all": {},
"most_comments": "Most Comments",
"@most_comments": {},
"new_comments": "New Comments",
"@new_comments": {},
"active": "Active",
"@active": {}
}

132
lib/l10n/intl_eo.arb Normal file
View File

@ -0,0 +1,132 @@
{
"@@locale": "eo",
"settings": "Agordoj",
"password": "Pasvorto",
"email_or_username": "Retpoŝtadreso aŭ uzantonomo",
"posts": "Afiŝoj",
"comments": "Komentoj",
"modlog": "Protokolo de reguligado",
"community": "Komunumo",
"url": "URL",
"title": "Titolo",
"body": "Ĉefparto",
"nsfw": "Konsterna",
"post": "Afiŝi",
"save": "konservi",
"subscribed": "Abonita",
"local": "Loka",
"all": "Ĉiam",
"replies": "Respondoj",
"mentions": "Mencioj",
"from": "de",
"to": "al",
"deleted_by_creator": "forigita de la kreinto",
"more": "pli",
"mark_as_read": "marki legita",
"mark_as_unread": "marki nelegita",
"reply": "respondi",
"edit": "redakti",
"delete": "forigi",
"restore": "revenigi",
"yes": "jes",
"no": "ne",
"avatar": "Profilbildo",
"banner": "Standardo",
"display_name": "Prezenta nomo",
"bio": "Prio",
"email": "Retpoŝtadreso",
"matrix_user": "Uzanto de Matrix",
"sort_type": "Ordigilo",
"type": "Tipo",
"show_nsfw": "Montri konsternan enhavon",
"send_notifications_to_email": "Sendi sciigojn al retpoŝtadreso",
"delete_account": "Forigi konton",
"saved": "Konservita",
"communities": "Komunumoj",
"users": "Uzantoj",
"theme": "Haŭto",
"language": "Lingvo",
"hot": "Furoraj",
"new_": "Novaj",
"old": "Malnovaj",
"top": "Supraj",
"chat": "Babilo",
"admin": "administranto",
"by": "de",
"not_an_admin": "Ne estas administranto.",
"couldnt_find_post": "Ne povis trovi la afiŝon.",
"not_logged_in": "Nesalutinta.",
"site_ban": "Vi estas forbarita de la retejo",
"community_ban": "Vi estas forbarita de la komunumo.",
"downvotes_disabled": "Kontraŭvoĉoj malŝaltiĝis",
"invalid_url": "Nevalida URL.",
"locked": "ŝlosita",
"couldnt_create_comment": "Ne povis krei la komenton.",
"couldnt_like_comment": "Ne povis ŝati la komenton.",
"couldnt_update_comment": "Ne povis ĝisdatigi la komenton.",
"no_comment_edit_allowed": "Ne rajtas redakti la komenton.",
"couldnt_save_comment": "Ne povis konservi la komenton.",
"couldnt_get_comments": "Ne povis akiri la komentojn.",
"report_reason_required": "Necesas kialo de raporto.",
"report_too_long": "Raporto estas tro longa.",
"couldnt_create_report": "Ne povis krei raporton.",
"couldnt_resolve_report": "Ne povis trakti raporton.",
"invalid_post_title": "Nevalida titolo de afiŝo",
"couldnt_create_post": "Ne povis krei la afiŝon.",
"couldnt_like_post": "Ne povis ŝati la afiŝon.",
"couldnt_find_community": "Ne povis trovi la komunumon.",
"couldnt_get_posts": "Ne povis akiri afiŝojn",
"no_post_edit_allowed": "Ne rajtas redakti la afiŝon.",
"couldnt_save_post": "Ne povis konservi la afiŝon.",
"site_already_exists": "Retejo jam ekzistas.",
"couldnt_update_site": "Ne povis ĝisdatigi la retejon.",
"invalid_community_name": "Nevalida nomo.",
"community_already_exists": "Komunumo jam ekzistas.",
"community_moderator_already_exists": "Reguligisto de komunumo jam ekzistas.",
"community_follower_already_exists": "Abonanto de komunumo jam ekzistas.",
"not_a_moderator": "Nereguligisto.",
"couldnt_update_community": "Ne povis ĝisdatigi la komunumon.",
"no_community_edit_allowed": "Ne rajtas redakti la komunumon.",
"system_err_login": "Sistema eraro. Provu adiaŭi kaj resaluti.",
"community_user_already_banned": "Uzanto de komunumo jam estas forbarita.",
"couldnt_find_that_username_or_email": "Ne povis trovi tiun uzantonomon aŭ retpoŝtadreson.",
"password_incorrect": "Pasvorto malĝustas.",
"registration_closed": "Registrado malebliĝis",
"invalid_password": "Nevalido pasvorto. Pasvorto devas havi ≤ 60 signojn.",
"passwords_dont_match": "Pasvortoj ne samas.",
"captcha_incorrect": "Neĝuste solvita kontrolo de homeco.",
"invalid_username": "Nevalida uzantonomo.",
"bio_length_overflow": "Prio de uzanto ne povas havi pli ol 300 signojn.",
"couldnt_update_user": "Ne povis ĝisdatigi la uzanton.",
"couldnt_update_private_message": "Ne povis ĝisdatigi la privatan mesaĝon.",
"couldnt_update_post": "Ne povis ĝisdatigi la afiŝon",
"couldnt_create_private_message": "Ne povis krei privatan mesaĝon.",
"no_private_message_edit_allowed": "Ne rajtas redakti la privatan mesaĝon.",
"post_title_too_long": "Titolo de afiŝo estas tro longa.",
"email_already_exists": "Retpoŝtadreso jam ekzistas.",
"user_already_exists": "Uzanto jam ekzistas.",
"number_of_users_online": "{count,plural, =1{{count} uzanto enreta} other{{count} uzantoj enretaj}}",
"number_of_comments": "{count,plural, =1{{count} komento} other{{count} komentoj}}",
"number_of_posts": "{count,plural, =1{{count} afiŝo} other{{count} afiŝoj}}",
"number_of_subscribers": "{count,plural, =1{{count} abonanto} other{{count} abonantoj}}",
"number_of_users": "{count,plural, =1{{count} uzanto} other{{count} uzantoj}}",
"unsubscribe": "Malaboni",
"subscribe": "Aboni",
"messages": "Mesaĝoj",
"banned_users": "Forbaritaj uzantoj",
"delete_account_confirm": "Averto: ĉi tio por ĉiam forigos ĉiujn viajn datumojn. Enigu pasvorton por konfirmi.",
"new_password": "Nova pasvorto",
"verify_password": "Konfirmu vian pasvorton",
"old_password": "Malnova pasvorto",
"show_avatars": "Montri profilbildojn",
"search": "Serĉi",
"send_message": "Sendi mesaĝon",
"top_day": "Supraj tagaj",
"top_week": "Supraj semajnaj",
"top_month": "Supraj monataj",
"top_year": "Supraj jaraj",
"top_all": "Supraj ĉiamaj",
"most_comments": "Plej komentitaj",
"new_comments": "Nove komentitaj",
"active": "Aktiva"
}

132
lib/l10n/intl_es.arb Normal file
View File

@ -0,0 +1,132 @@
{
"@@locale": "es",
"settings": "Configuración",
"password": "Contraseña",
"email_or_username": "Correo o usuario",
"posts": "Publicaciones",
"comments": "Comentarios",
"modlog": "Historial de moderación",
"community": "Comunidad",
"url": "URL",
"title": "Título",
"body": "Descripción",
"nsfw": "Para adultos",
"post": "publicar",
"save": "guardar",
"subscribed": "Suscrito",
"local": "Local",
"all": "Todo",
"replies": "Respuestas",
"mentions": "Menciones",
"from": "desde",
"to": "a",
"deleted_by_creator": "eliminado por creador",
"more": "más",
"mark_as_read": "marcar como leído",
"mark_as_unread": "marcar como no leído",
"reply": "responder",
"edit": "editar",
"delete": "eliminar",
"restore": "restaurar",
"yes": "sí",
"no": "no",
"avatar": "Avatar",
"banner": "Banner",
"display_name": "Nombre para visualizar",
"bio": "Biografía",
"email": "Correo electrónico",
"matrix_user": "Usuario Matrix",
"sort_type": "Tipo de orden",
"type": "Tipo",
"show_nsfw": "Mostrar contenido para adultos",
"send_notifications_to_email": "Enviar notificaciones al correo",
"delete_account": "Eliminar cuenta",
"saved": "Guardado",
"communities": "Comunidades",
"users": "Usuarios",
"theme": "Tema",
"language": "Idioma",
"hot": "Popular",
"new_": "Nuevo",
"old": "Antiguo",
"top": "Lo mejor",
"chat": "Chat",
"admin": "administrador",
"by": "por",
"not_an_admin": "No es un administrador.",
"couldnt_find_post": "No se pudo encontrar la publicación.",
"not_logged_in": "No has iniciado sesión.",
"site_ban": "Has sido expulsado del sitio",
"community_ban": "Has sido expulsado de esta comunidad.",
"downvotes_disabled": "Votos negativos deshabilitados",
"invalid_url": "URL no válido.",
"locked": "bloqueado",
"couldnt_create_comment": "No se pudo crear el comentario.",
"couldnt_like_comment": "No se pudo dar me gusta al comentario.",
"couldnt_update_comment": "No se pudo actualizar el comentario.",
"no_comment_edit_allowed": "No tiene permisos para editar el comentario.",
"couldnt_save_comment": "No se pudo guardar el comentario.",
"couldnt_get_comments": "No se pudo obtener los comentarios.",
"report_reason_required": "Motivo del informe necesario.",
"report_too_long": "Informe demasiado largo.",
"couldnt_create_report": "No se pudo generar el informe.",
"couldnt_resolve_report": "No se pudo resolver el informe.",
"invalid_post_title": "Título de la publicación no válido",
"couldnt_create_post": "No se pudo crear la publicación.",
"couldnt_like_post": "No se pudo dar me gusta a la publicación.",
"couldnt_find_community": "No se pudo encontrar la comunidad.",
"couldnt_get_posts": "No se pudo obtener las publicaciones",
"no_post_edit_allowed": "No tiene permisos para editar la publicación.",
"couldnt_save_post": "No se pudo guardar la publicación.",
"site_already_exists": "El sitio ya existe.",
"couldnt_update_site": "No se pudo actualizar el sitio.",
"invalid_community_name": "Nombre no válido.",
"community_already_exists": "Esta comunidad ya existe.",
"community_moderator_already_exists": "Este moderador de la comunidad ya existe.",
"community_follower_already_exists": "Este seguidor de la comunidad ya existe.",
"not_a_moderator": "No eres moderador.",
"couldnt_update_community": "No se pudo actualizar la comunidad.",
"no_community_edit_allowed": "No tiene permisos para editar la comunidad.",
"system_err_login": "Error del sistema. Intente cerrar sesión e ingresar de nuevo.",
"community_user_already_banned": "Este usuario de la comunidad ya fue expulsado.",
"couldnt_find_that_username_or_email": "No se pudo encontrar ese nombre de usuario o correo electrónico.",
"password_incorrect": "Contraseña incorrecta.",
"registration_closed": "Registro cerrado",
"invalid_password": "Contraseña no válida. La contraseña debe ser <= 60 carácteres.",
"passwords_dont_match": "Las contraseñas no coinciden.",
"captcha_incorrect": "Captcha incorrecto.",
"invalid_username": "Nombre de usuario inválido.",
"bio_length_overflow": "La biografía del usuario no puede exceder los 300 caracteres.",
"couldnt_update_user": "No se pudo actualizar el usuario.",
"couldnt_update_private_message": "No se pudo actualizar el mensaje privado.",
"couldnt_update_post": "No se pudo actualizar la publicación",
"couldnt_create_private_message": "No se pudo crear el mensaje privado.",
"no_private_message_edit_allowed": "Sin permisos para editar el mensaje privado.",
"post_title_too_long": "El título de la publicación es muy largo.",
"email_already_exists": "El correo ya está en uso.",
"user_already_exists": "El usuario ya existe.",
"number_of_users_online": "{count,plural, =1{{count} usuario en línea} other{{count} usuarios en línea}}",
"number_of_comments": "{count,plural, =1{{count} Comentario} other{{count} Comentarios}}",
"number_of_posts": "{count,plural, =1{{count} Publicación} other{{count} Publicaciones}}",
"number_of_subscribers": "{count,plural, =1{{count} suscriptor} other{{count} suscriptores}}",
"number_of_users": "{count,plural, =1{{count} usuario} other{{count} usuarios}}",
"unsubscribe": "Desuscribirse",
"subscribe": "Suscribirse",
"messages": "Mensajes",
"banned_users": "Usuarios expulsados",
"delete_account_confirm": "Advertencia: esta acción eliminará permanentemente toda su información. Introduzca su contraseña para confirmar.",
"new_password": "Nueva contraseña",
"verify_password": "Verificar contraseña",
"old_password": "Antigua contraseña",
"show_avatars": "Mostrar avatares",
"search": "Buscar",
"send_message": "Enviar mensaje",
"top_day": "Lo mejor del día",
"top_week": "Lo mejor de la semana",
"top_month": "Lo mejor del mes",
"top_year": "Lo mejor del año",
"top_all": "Lo mejor de todos los tiempos",
"most_comments": "La mayoría de los comentarios",
"new_comments": "Nuevos Comentarios",
"active": "Activo"
}

132
lib/l10n/intl_eu.arb Normal file
View File

@ -0,0 +1,132 @@
{
"@@locale": "eu",
"settings": "Ezarpenak",
"password": "Pasahitza",
"email_or_username": "Eposta edo erabiltzaile-izena",
"posts": "Bidalketak",
"comments": "Iruzkinak",
"modlog": "Moderazio loga",
"community": "Komunitatea",
"url": "URL",
"title": "Izenburua",
"body": "Gorputza",
"nsfw": "Eduki hunkigarriak (NSFW)",
"post": "bidali",
"save": "gorde",
"subscribed": "Harpidetuta",
"local": "Lokala",
"all": "Guztiak",
"replies": "Erantzunak",
"mentions": "Aipamenak",
"from": "nork",
"to": "non:",
"deleted_by_creator": "sortzaileak ezabatu du",
"more": "gehiago",
"mark_as_read": "markatu irakurritako gisa",
"mark_as_unread": "markatu ez irakurrita",
"reply": "erantzun",
"edit": "editatu",
"delete": "ezabatu",
"restore": "leheneratu",
"yes": "bai",
"no": "ez",
"avatar": "Avatarra",
"banner": "Banerra",
"display_name": "Bistaratzeko izena",
"bio": "Biografia",
"email": "Eposta",
"matrix_user": "Matrix erabiltzailea",
"sort_type": "Ordena-mota",
"type": "Mota",
"show_nsfw": "Erakutsi eduki hunkigarriak (NSFW)",
"send_notifications_to_email": "Bidali jakinarazpenak epostara",
"delete_account": "Ezabatu kontua",
"saved": "Gordeta",
"communities": "Komunitateak",
"users": "Erabiltzaileak",
"theme": "Itxura",
"language": "Hizkuntza",
"hot": "Pil-pilean",
"new_": "Berriak",
"old": "Zaharrak",
"top": "Bozkatuenak",
"chat": "Txata",
"admin": "administratzailea",
"by": "egilea:",
"not_an_admin": "Ez zara administratzailea.",
"couldnt_find_post": "Ezin izan da bidalketarik aurkitu.",
"not_logged_in": "Ez duzu saiorik hasi.",
"site_ban": "Gune honetan sartzea debekatu dizute",
"community_ban": "Komunitate honetan sartzea debekatu dizute.",
"downvotes_disabled": "Kontrako bozkak desgaituta",
"invalid_url": "URL baliogabea.",
"locked": "blokeatuta",
"couldnt_create_comment": "Ezin izan da iruzkina sortu.",
"couldnt_like_comment": "Ezin izan da iruzkinari datsegit eman.",
"couldnt_update_comment": "Ezin izan da iruzkina eguneratu.",
"no_comment_edit_allowed": "Ezin duzu iruzkina editatu.",
"couldnt_save_comment": "Ezin izan da iruzkina gorde.",
"couldnt_get_comments": "Ezin izan da iruzkinik lortu.",
"report_reason_required": "Salaketaren arrazoia ezinbestekoa da.",
"report_too_long": "Salaketa luzeegia.",
"couldnt_create_report": "Ezin izan da salaketa sortu.",
"couldnt_resolve_report": "Ezin izan da salaketa itxi.",
"invalid_post_title": "Bidalketa izenburu baliogabea",
"couldnt_create_post": "Ezin izan da bidalketa sortu.",
"couldnt_like_post": "Ezin izan da bidalketari datsegit eman.",
"couldnt_find_community": "Ezin izan da komunitaterik aurkitu.",
"couldnt_get_posts": "Ezin izan da bidalketa lortu",
"no_post_edit_allowed": "Ezin duzu bidalketa editatu.",
"couldnt_save_post": "Ezin izan da bidalketa gorde.",
"site_already_exists": "Gunea dagoeneko existitzen da.",
"couldnt_update_site": "Ezin izan da gunea eguneratu.",
"invalid_community_name": "Izen baliogabea.",
"community_already_exists": "Komunitate hori dagoeneko existitzen da.",
"community_moderator_already_exists": "Komunitateko moderatzaile hori dagoeneko existitzen da.",
"community_follower_already_exists": "Komunitateko jarraitzaile hori dagoeneko existitzen da.",
"not_a_moderator": "Ez zara moderatzailea.",
"couldnt_update_community": "Ezin izan da komunitatea eguneratu.",
"no_community_edit_allowed": "Ezin duzu komunitatea editatu.",
"system_err_login": "Sistemaren errorea. Saiatu saioa ixten eta berriz hasten.",
"community_user_already_banned": "Komunitateko erabiltzaile hau dagoeneko debekatuta dago.",
"couldnt_find_that_username_or_email": "Ezin izan da aurkitu erabiltzaile-izen edo eposta hori.",
"password_incorrect": "Pasahitz okerra.",
"registration_closed": "Izen-ematea itxira",
"invalid_password": "Pasahitz baliogabea. Pasahitzak <= 60 karaktere izan behar ditu.",
"passwords_dont_match": "Pasahitzak ez dira berdinak.",
"captcha_incorrect": "Okerreko captcha.",
"invalid_username": "Erabiltzaile-izen baliogabea.",
"bio_length_overflow": "Erabiltzailearen biografiak ezin ditu 300 hizki baino gehiago izan.",
"couldnt_update_user": "Ezin izan da erabiltzailea eguneratu.",
"couldnt_update_private_message": "Ezin izan da mezu pribatu hori eguneratu.",
"couldnt_update_post": "Ezin izan da bidalketa eguneratu",
"couldnt_create_private_message": "Ezin izan da mezu pribatu hori sortu.",
"no_private_message_edit_allowed": "Ezin duzu mezu pribaturik editatu.",
"post_title_too_long": "Bidalketaren izenburua luzeegia da.",
"email_already_exists": "Eposta hori dagoeneko existitzen da.",
"user_already_exists": "Erabiltzaile hori dagoeneko existitzen da.",
"number_of_users_online": "{count,plural, =1{Erabiltzaile {count} konektatuta} other{{count} erabiltzaile konektatuta}}",
"number_of_comments": "{count,plural, =1{Iruzkin {count}} other{{count} iruzkin}}",
"number_of_posts": "{count,plural, =1{Bidalketa {count}} other{{count} bidalketa}}",
"number_of_subscribers": "{count,plural, =1{Harpidetu {count}} other{{count} harpidetu}}",
"number_of_users": "{count,plural, =1{Erabiltzaile {count}} other{{count} erabiltzaile}}",
"unsubscribe": "Ezabatu harpidetza",
"subscribe": "Harpidetu",
"messages": "Mezuak",
"banned_users": "Debekatutako erabiltzaileak",
"delete_account_confirm": "Abisua: honek zure datu guztiak betirako ezabatu ditu. Sartu zure pasahitza baieztatzeko.",
"new_password": "Pasahitz berria",
"verify_password": "Balioztatu pasahitza",
"old_password": "Aurreko pasahitza",
"show_avatars": "Erakutsi avatarrak",
"search": "Bilatu",
"send_message": "Bidali mezua",
"top_day": "Gaur pil-pilean",
"top_week": "Asteko Onena",
"top_month": "Hilabeteko Onena",
"top_year": "Urteko Onena",
"top_all": "Onena",
"most_comments": "Iruzkin gehienak",
"new_comments": "Iruzkin berriak",
"active": "Aktibo"
}

82
lib/l10n/intl_fa.arb Normal file
View File

@ -0,0 +1,82 @@
{
"@@locale": "fa",
"settings": "تنظیمات",
"password": "گذرواژه",
"email_or_username": "رایانامه یا نام‌کاربری",
"posts": "مطالب",
"comments": "نظرات",
"title": "عنوان",
"nsfw": "NSFW",
"post": "مطلب",
"save": "ذخیره",
"all": "همه",
"replies": "پاسخ‌ها",
"mentions": "اشاره‌ها",
"deleted_by_creator": "پاک شد",
"mark_as_read": "علامت‌گذاری به عنوان خوانده شده",
"mark_as_unread": "علامت‌گذاری به عنوان خوانده نشده",
"reply": "پاسخ",
"edit": "ویرایش",
"delete": "پاک کردن",
"restore": "بازگردانی",
"yes": "بله",
"no": "خیر",
"avatar": "آواتار",
"email": "رایانامه",
"sort_type": "نوع ترتیب",
"type": "نوع",
"show_nsfw": "نمایش محتوای NSFW",
"send_notifications_to_email": "فرستادن اعلانات به رایانامه",
"delete_account": "پاک کردن حساب",
"communities": "جوامع",
"users": "کاربران",
"language": "زبان",
"hot": "داغ",
"new_": "تازه",
"top": "بالاترین",
"chat": "گپ",
"admin": "مدیر",
"not_an_admin": "مدیر نیستید.",
"couldnt_find_post": "ناتوانی در یافتن مطلب.",
"not_logged_in": "وارد نشده‌اید.",
"site_ban": "فعالیت شما در این پایگاه ممنوع شده است",
"community_ban": "فعالیت شما در این جامعه ممنوع شده است.",
"downvotes_disabled": "رای پایین غیرفعال است",
"locked": "قفل شد",
"couldnt_create_comment": "ناتوانی در ایجاد نظر.",
"couldnt_like_comment": "ناتوانی در پسنیدن نظر.",
"couldnt_update_comment": "ناتوانی در به‌روزرسانی نظر.",
"no_comment_edit_allowed": "مجاز به ویرایش نظر نیستید.",
"couldnt_save_comment": "ناتوانی در ذخیره نظر.",
"couldnt_create_post": "ناتوانی در ایجاد مطلب.",
"couldnt_like_post": "ناتوانی در پسندیدن مطلب.",
"couldnt_find_community": "ناتوانی در یافتن جامعه.",
"couldnt_get_posts": "ناتوانی در دریافت مطالب",
"no_post_edit_allowed": "مجاز به ویرایش مطلب نیستید.",
"couldnt_save_post": "ناتوانی در ذخیره مطلب.",
"site_already_exists": "این پایگاه از قبل وجود داشته است.",
"couldnt_update_site": "ناتوانی در به‌روزرسانی پایگاه.",
"community_already_exists": "این جامعه از قبل وجود داشته است.",
"couldnt_update_community": "ناتوانی در به‌روزرسانی جامعه.",
"no_community_edit_allowed": "مجاز به ویرایش جامعه نیستید.",
"system_err_login": "خطای سامانه. سعی کنید خارج شده و دوباره وارد شوید.",
"couldnt_find_that_username_or_email": "ناتوانی در یافتن این نام کاربری یا رایانامه.",
"password_incorrect": "گذرواژه نادرست.",
"registration_closed": "نام‌نویسی بسته است",
"passwords_dont_match": "گذرواژه‌ها با هم منطبق نیستند.",
"couldnt_update_user": "ناتوانی در به‌روزرسانی کاربر.",
"couldnt_update_post": "ناتوای در به‌روزرسانی مطلب",
"email_already_exists": "این رایانامه از قبل وجود دارد.",
"user_already_exists": "این کاربر از قبل وجود دارد.",
"number_of_users_online": "{count,plural, =1{{count} کاربر برخط}}",
"number_of_comments": "{count,plural, =1{{count} نظر}}",
"number_of_posts": "{count,plural, =1{{count} مطلب}}",
"number_of_users": "{count,plural, =1{{count} کاربر}}",
"delete_account_confirm": "هشدار: این کنش، تمام اطلاعات شما را برای همیشه پاک می‌کند. برای تایید، گذرواژه خود را وارد کنید.",
"new_password": "گذرواژه جدید",
"verify_password": "تایید گذرواژه",
"old_password": "پسورد پیشین",
"show_avatars": "نمایش آواتارها",
"search": "جستجو",
"top_day": "بهترین‌های روز"
}

110
lib/l10n/intl_fi.arb Normal file
View File

@ -0,0 +1,110 @@
{
"@@locale": "fi",
"settings": "Asetukset",
"password": "Salasana",
"email_or_username": "Sähköposti tai käyttäjätunnus",
"posts": "Viestit",
"comments": "Kommentit",
"modlog": "Moderoinnin loki",
"community": "Yhteisö",
"url": "URL",
"title": "Otsikko",
"body": "Sisältö",
"nsfw": "NSFW",
"post": "viesti",
"save": "tallenna",
"subscribed": "Tilattu",
"all": "Kaikki",
"replies": "Vastaukset",
"mentions": "Maininnat",
"from": "paikasta",
"to": "yhteisössä",
"deleted_by_creator": "poistettu",
"more": "lisää",
"mark_as_read": "merkitse luetuksi",
"mark_as_unread": "merkitse lukemattomaksi",
"reply": "vastaa",
"edit": "muokkaa",
"delete": "poista",
"restore": "palauta",
"yes": "kyllä",
"no": "ei",
"avatar": "avatar",
"email": "Sähköposti",
"matrix_user": "Matrix-käyttäjä",
"sort_type": "Lajittele tyypin mukaan",
"type": "Tyyppi",
"show_nsfw": "Näytä NSFW-sisältö",
"send_notifications_to_email": "Lähetä ilmoitukset sähköpostiin",
"delete_account": "Poista tili",
"saved": "Tallennettu",
"communities": "Yhteisöt",
"users": "Käyttäjät",
"theme": "Teema",
"language": "Kieli",
"hot": "Kuumat",
"new_": "Uudet",
"old": "Vanhat",
"top": "Parhaimmat",
"chat": "Chat",
"admin": "ylläpitäjä",
"by": "käyttäjältä",
"not_an_admin": "Ei ole ylläpitäjä.",
"couldnt_find_post": "Viestiä ei löytynyt.",
"not_logged_in": "Ei kirjautunut sisään.",
"site_ban": "Sinut on asetettu porttikieltoon tällä sivustolla",
"community_ban": "Sinulle on asetettu porttikielto tähän yhteisöön.",
"downvotes_disabled": "Alaäänet otettu pois päältä",
"locked": "lukittu",
"couldnt_create_comment": "Kommenttia ei pystytty luomaan.",
"couldnt_like_comment": "Kommentista ei voitu tykätä.",
"couldnt_update_comment": "Kommenttia ei voitu päivittää.",
"no_comment_edit_allowed": "Sinulla ei ole oikeutta muokata kommenttia.",
"couldnt_save_comment": "Kommenttia ei voitu tallentaa.",
"couldnt_get_comments": "Kommentteja ei voitu hakea.",
"invalid_post_title": "Väärä viestin otsikko",
"couldnt_create_post": "Ei voitu luoda viestiä.",
"couldnt_like_post": "Viestistä ei voitu tykätä.",
"couldnt_find_community": "Yhteisöä ei voitu löytää.",
"couldnt_get_posts": "Viestejä ei saatu",
"no_post_edit_allowed": "Sinulla ei ole oikeutta muokata viestiä.",
"couldnt_save_post": "Viestiä ei voitu tallentaa.",
"site_already_exists": "Sivusto on jo olemassa.",
"couldnt_update_site": "Sivustoa ei voitu päivittää.",
"community_already_exists": "Yhteisö on jo olemassa.",
"community_moderator_already_exists": "Yhteisön moderaattori on jo olemassa.",
"community_follower_already_exists": "Yhteisön seuraaja on jo olemassa.",
"couldnt_update_community": "Yhteisöä ei voitu päivittää.",
"no_community_edit_allowed": "Sinulla ei ole oikeutta muokata yhteisöä.",
"system_err_login": "Järjestelmävirhe. Yritä kirjautua ulos ja kirjautua uudestaan sisään.",
"community_user_already_banned": "Yhteisön käyttäjä on jo porttikiellossa.",
"couldnt_find_that_username_or_email": "Käyttäjänimeä tai sähköpostia ei onnistuttu löytämään.",
"password_incorrect": "Salasana on väärin.",
"registration_closed": "Rekisteröityminen suljettu",
"passwords_dont_match": "Salasanat eivät täsmää.",
"couldnt_update_user": "Käyttäjää ei voitu päivittää.",
"couldnt_update_private_message": "Yksityisviestiä ei voitu päivittää.",
"couldnt_update_post": "Viestiä ei voitu päivittää",
"couldnt_create_private_message": "Yksityisviestiä ei voitu luoda.",
"no_private_message_edit_allowed": "Sinulla ei ole oikeutta muokata yksityisviestiä.",
"post_title_too_long": "Viestin otsikko on liian pitkä.",
"email_already_exists": "Sähköposti on jo olemassa.",
"user_already_exists": "Käyttäjä on jo olemassa.",
"number_of_users_online": "{count,plural, =1{{count} käyttäjä aktiivisena} other{{count} käyttäjää aktiivisena}}",
"number_of_comments": "{count,plural, =1{{count} kommentti} other{{count} kommenttia}}",
"number_of_posts": "{count,plural, =1{{count} viesti} other{{count} viestiä}}",
"number_of_subscribers": "{count,plural, =1{{count} tilaaja} other{{count} tilaajaa}}",
"number_of_users": "{count,plural, =1{{count} käyttäjä} other{{count} käyttäjää}}",
"unsubscribe": "Poista tilaus",
"subscribe": "Tilaa",
"messages": "Viestit",
"banned_users": "Porttikieltoon asetetut käyttäjät",
"delete_account_confirm": "Varoitus: tämä poistaa pysyvästi kaiken datasi. Anna salasanasi varmistukseksi.",
"new_password": "Uusi salasana",
"verify_password": "Vahvista salasana",
"old_password": "Vanha salasana",
"show_avatars": "Näytä avatarit",
"search": "Etsi",
"send_message": "Lähetä viesti",
"top_day": "Päivän parhaimmat"
}

131
lib/l10n/intl_fr.arb Normal file
View File

@ -0,0 +1,131 @@
{
"@@locale": "fr",
"settings": "Paramètres",
"password": "Mot de passe",
"email_or_username": "Email ou nom dutilisateur·rice",
"posts": "Publications",
"comments": "Commentaires",
"modlog": "Historique de modération",
"community": "Communauté",
"url": "URL",
"title": "Titre",
"body": "Texte",
"nsfw": "Pas sûr pour le travail (NSFW)",
"post": "publication",
"save": "sauvegarder",
"subscribed": "Abonnés",
"local": "Local",
"all": "Tout",
"replies": "Réponses",
"mentions": "Mentions",
"from": "de",
"to": "dans",
"deleted_by_creator": "supprimé par le créateur",
"more": "plus",
"mark_as_read": "marquer comme lu",
"mark_as_unread": "marquer comme non-lu",
"reply": "répondre",
"edit": "éditer",
"delete": "supprimer",
"restore": "restaurer",
"yes": "oui",
"no": "non",
"avatar": "Avatar",
"banner": "Bannière",
"display_name": "Nom affiché",
"bio": "Bio",
"email": "Email",
"matrix_user": "Utilisateur Matrix",
"sort_type": "Trier",
"type": "Type",
"show_nsfw": "Afficher le contenu NSFW",
"send_notifications_to_email": "Envoyer des notifications par email",
"delete_account": "Supprimer le compte",
"saved": "Sauvegardé",
"communities": "Communautés",
"users": "Utilisateurs",
"theme": "Thème",
"language": "Langue",
"hot": "Tendances",
"new_": "Nouveaux",
"old": "Ancien",
"top": "Top",
"chat": "Chat",
"admin": "admin",
"by": "par",
"not_an_admin": "Pas administrateur.",
"couldnt_find_post": "Impossible de trouver la publication.",
"not_logged_in": "Vous nêtes pas connecté.",
"site_ban": "Vous avez été banni du site",
"community_ban": "Vous avez été banni de cette communauté.",
"downvotes_disabled": "Votes négatifs désactivés",
"invalid_url": "URL invalide.",
"locked": "verrouillé",
"couldnt_create_comment": "Impossible de publier le commentaire.",
"couldnt_like_comment": "Impossible daimer le commentaire.",
"couldnt_update_comment": "Impossible de mettre à jour le commentaire.",
"no_comment_edit_allowed": "Vous nêtes pas autorisé à éditer ce commentaire.",
"couldnt_save_comment": "Impossible de sauvegarder le commentaire.",
"couldnt_get_comments": "Impossible d'obtenir les commentaires.",
"report_reason_required": "Raison du signalement requise.",
"couldnt_create_report": "Impossible de créer le signalement.",
"couldnt_resolve_report": "Impossible de résoudre le rapport.",
"invalid_post_title": "Titre du post invalide",
"couldnt_create_post": "Impossible de créer la publication.",
"couldnt_like_post": "Impossible daimer la publication.",
"couldnt_find_community": "Impossible de trouver cette communauté.",
"couldnt_get_posts": "Impossible dobtenir les publications",
"no_post_edit_allowed": "Vous nêtes pas autorisé à éditer cette publication.",
"couldnt_save_post": "Impossible de sauvegarder la publication.",
"site_already_exists": "Le site existe déjà.",
"couldnt_update_site": "Impossible de mettre à jour le site.",
"invalid_community_name": "Nom invalide.",
"community_already_exists": "Cette communauté existe déjà.",
"community_moderator_already_exists": "Ce membre est déjà modérateur.",
"community_follower_already_exists": "Ce membre est déjà abonné.",
"not_a_moderator": "N'êtes pas un modérateur.",
"couldnt_update_community": "Impossible de mettre à jour cette communauté.",
"no_community_edit_allowed": "Vous nêtes pas autorisé à éditer cette communauté.",
"system_err_login": "Erreur système. Essayez de vous déconnecter puis de vous reconnecter.",
"community_user_already_banned": "Ce membre est déjà banni.",
"couldnt_find_that_username_or_email": "Impossible de trouver cet·te utilisateur·rice ou cet email.",
"password_incorrect": "Mot de passe incorrect.",
"registration_closed": "Inscriptions fermées",
"invalid_password": "Mot de passe erroné. La longueur du mot de passe doit être <= 60 caractères.",
"passwords_dont_match": "Les mots de passes ne correspondent pas.",
"captcha_incorrect": "Captcha erroné.",
"invalid_username": "Nom d'utilisateur invalide.",
"bio_length_overflow": "La bio utilisateur ne peut dépasser 300 caractères.",
"couldnt_update_user": "Impossible de mettre à jour lutilisateur·rice.",
"couldnt_update_private_message": "Impossible de modifier le message privé.",
"couldnt_update_post": "Impossible de mettre à jour la publication",
"couldnt_create_private_message": "Impossible de créer un message privé.",
"no_private_message_edit_allowed": "Pas autorisé à modifier un message privé.",
"post_title_too_long": "Le titre de la publication est trop long.",
"email_already_exists": "Lemail existe déjà.",
"user_already_exists": "Lutilisateur·rice existe déjà.",
"number_of_users_online": "{count,plural, =1{{count} Utilisateur en ligne} other{{count} Utilisateurs en ligne}}",
"number_of_comments": "{count,plural, =1{{count} Commentaire} other{{count} Commentaires}}",
"number_of_posts": "{count,plural, =1{{count} Publication} other{{count} Publications}}",
"number_of_subscribers": "{count,plural, =1{{count} Abonné} other{{count} Abonnés}}",
"number_of_users": "{count,plural, =1{{count} Utilisateur} other{{count} Utilisateurs}}",
"unsubscribe": "Se désabonner",
"subscribe": "Sabonner",
"messages": "Messages",
"banned_users": "Utilisateurs interdits",
"delete_account_confirm": "Avertissement : cette action supprimera toutes vos données de façons permanente ! Saisissez votre mot de passe pour confirmer.",
"new_password": "Nouveau mot de passe",
"verify_password": "Vérifiez le mot de passe",
"old_password": "Ancien mot de passe",
"show_avatars": "Afficher les avatars",
"search": "Rechercher",
"send_message": "Envoyer le message",
"top_day": "Top du jour",
"top_week": "Top de la semaine",
"top_month": "Top du mois",
"top_year": "Top de l'année",
"top_all": "Top",
"most_comments": "Plus commentés",
"new_comments": "Nouveaux commentaires",
"active": "Actif"
}

123
lib/l10n/intl_ga.arb Normal file
View File

@ -0,0 +1,123 @@
{
"@@locale": "ga",
"settings": "Socruithe",
"password": "Pasfhocal",
"email_or_username": "Ríomhphost nó Ainm Úsáideora",
"posts": "Postálacha",
"comments": "Tráchtanna",
"modlog": "Logamod",
"community": "Pobal",
"url": "URL",
"title": "Teideal",
"body": "Corp",
"nsfw": "NSFW",
"post": "postáil",
"save": "sábháil",
"subscribed": "Suibscríofa",
"local": "Áitiúil",
"all": "Gach",
"replies": "Freagraí",
"mentions": "Luann",
"from": "ó",
"to": "chun",
"deleted_by_creator": "scriosta ag cruthaitheoir",
"more": "tuilleadh",
"mark_as_read": "marc mar a léitear",
"mark_as_unread": "marc mar neamhléite",
"reply": "freagra",
"edit": "cuir in eagar",
"delete": "scriosadh",
"restore": "athchóirigh",
"yes": "tá",
"no": "níl",
"avatar": "Abhatár",
"banner": "Meirge",
"display_name": "Ainm taispeána",
"bio": "Beathaisnéis",
"email": "Ríomhphost",
"matrix_user": "Úsáideoir Matrix",
"sort_type": "Cineál sórtála",
"type": "Cineál",
"show_nsfw": "Taispeáin ábhar NSFW",
"send_notifications_to_email": "Seol fógraí chuig Ríomhphost",
"delete_account": "Scrios Cuntas",
"saved": "Coinníodh",
"communities": "Pobail",
"users": "Úsáideoirí",
"theme": "Téama",
"language": "Teanga",
"hot": "Te",
"new_": "Nua",
"old": "Sean",
"top": "Barr",
"chat": "Comhrá",
"admin": "riarthóir",
"by": "le",
"not_an_admin": "Ní riarthóir é.",
"couldnt_find_post": "Níorbh fhéidir an post a aimsiú.",
"not_logged_in": "Ní logáilte isteach.",
"site_ban": "Cuireadh cosc ort ón suíomh",
"community_ban": "Cuireadh cosc ort ón bpobal seo.",
"downvotes_disabled": "Síosvótaí faoi mhíchumas",
"invalid_url": "URL neamhbhailí.",
"locked": "glasáilte",
"couldnt_create_comment": "Níorbh fhéidir a chruthú trácht.",
"couldnt_like_comment": "Níorbh fhéidir a is maith trácht.",
"couldnt_update_comment": "Níorbh fhéidir trácht a nuashonrú.",
"no_comment_edit_allowed": "Ní cheadaítear trácht a chur in eagar.",
"couldnt_save_comment": "Níorbh fhéidir trácht a shábháil.",
"couldnt_get_comments": "Níorbh fhéidir tuairimí a fháil.",
"invalid_post_title": "Teideal poist neamhbhailí",
"couldnt_create_post": "Níorbh fhéidir postáil a chruthú.",
"couldnt_like_post": "Níorbh fhéidir a is maith post.",
"couldnt_find_community": "Níorbh fhéidir Pobal a aimsiú.",
"couldnt_get_posts": "Níorbh fhéidir an post a fháil",
"no_post_edit_allowed": "Ní cheadaítear an post a chur in eagar.",
"couldnt_save_post": "Níorbh fhéidir an post a shábháil.",
"site_already_exists": "Suíomh ann cheana.",
"couldnt_update_site": "Níorbh fhéidir an suíomh a nuashonrú.",
"invalid_community_name": "Ainm neamhbhailí.",
"community_already_exists": "Pobal ann cheana féin.",
"community_moderator_already_exists": "Tá modhnóir pobail ann cheana féin.",
"community_follower_already_exists": "Tá leantóir pobail ann cheana féin.",
"not_a_moderator": "Ní modhnóir.",
"couldnt_update_community": "Níorbh fhéidir an Pobal a nuashonrú.",
"no_community_edit_allowed": "Ní cheadaítear an pobal a chur in eagar.",
"system_err_login": "Earráid chórais. Bain triail as logáil amach agus ar ais isteach.",
"community_user_already_banned": "Toirmisctear úsáideoir pobail cheana féin.",
"couldnt_find_that_username_or_email": "Níorbh fhéidir an t-ainm úsáideora nó an ríomhphost sin a fháil.",
"password_incorrect": "Pasfhocal mícheart.",
"registration_closed": "Clárú dúnta",
"invalid_password": "Pasfhocal neamhbhailí. Caithfidh <= 60 carachtar a bheith sa phasfhocal.",
"passwords_dont_match": "Ní hionann pasfhocail.",
"captcha_incorrect": "Ta Captcha mícheart.",
"invalid_username": "Ainm Úsáideora neamhbhailí.",
"bio_length_overflow": "Ní féidir le bith-úsáideoir níos mó ná 300 carachtar.",
"couldnt_update_user": "Níorbh fhéidir an t-úsáideoir a nuashonrú.",
"couldnt_update_private_message": "Níorbh fhéidir teachtaireacht phríobháideach a nuashonrú.",
"couldnt_update_post": "Níorbh fhéidir an post a nuashonrú",
"couldnt_create_private_message": "Níorbh fhéidir teachtaireacht phríobháideach a chruthú.",
"no_private_message_edit_allowed": "Ní cheadaítear teachtaireacht phríobháideach a chur in eagar.",
"post_title_too_long": "Tá teideal an postáil ró-fhada.",
"email_already_exists": "Tá ríomhphost ann cheana féin.",
"user_already_exists": "Úsáideoir ann cheana.",
"unsubscribe": "Díliostáil",
"subscribe": "Liostáil",
"messages": "Teachtaireachtaí",
"banned_users": "Úsáideoirí Coisceadh",
"delete_account_confirm": "Rabhadh: scriosfaidh sé seo do chuid sonraí go buan. Iontráil do phasfhocal le deimhniú.",
"new_password": "Focal Faire Nua",
"verify_password": "Deimhnigh Pasfhocal",
"old_password": "Sean Pasfhocal",
"show_avatars": "Taispeáin Abhatáranna",
"search": "Cuardaigh",
"send_message": "Seol Teachtaireacht",
"top_day": "Lá Barr",
"top_week": "Seachtain Barr",
"top_month": "Barr Mí",
"top_year": "Bar Bliain",
"top_all": "Barr an Ama Uile",
"most_comments": "Tuairimí an chuid is mó",
"new_comments": "Tráchtaireachtaí Nua",
"active": "Gnóthach"
}

3
lib/l10n/intl_gl.arb Normal file
View File

@ -0,0 +1,3 @@
{
"@@locale": "gl"
}

24
lib/l10n/intl_hi.arb Normal file
View File

@ -0,0 +1,24 @@
{
"@@locale": "hi",
"settings": "समायोजन (सेटिंग्स)",
"posts": "पोस्ट",
"comments": "टिप्पणी (कमेंट )",
"community": "समुदाय",
"post": "पोस्ट",
"more": "और भी",
"reply": "जवाब दें",
"edit": "संपादित करें ( एडिट करें )",
"avatar": "अवतार",
"communities": "सामुदायिक",
"users": "उपयोगकर्ता",
"admin": "प्रशासक",
"couldnt_find_post": "पोस्ट नहीं ढूंढ़ पाएं |",
"locked": "बंद",
"couldnt_create_comment": "टिप्पणी (कमेंट) नहीं बना पाईं |",
"couldnt_find_community": "समुदायों नहीं ढूंढ़ पाएं |",
"community_already_exists": "यह समुदाय पहले स मौजूद है |",
"number_of_comments": "{count,plural, =1{{{ count }} टिप्पणी (कमेंट )} other{{{ count }} टिप्पणियाँ (कोम्मेंट्स )}}",
"number_of_posts": "{count,plural, =1{{count} पोस्ट} other{{count} पोस्ट्स}}",
"show_avatars": "अवतार दिखाएँ",
"send_message": "संदेश भेजें"
}

3
lib/l10n/intl_hr.arb Normal file
View File

@ -0,0 +1,3 @@
{
"@@locale": "hr"
}

111
lib/l10n/intl_hu.arb Normal file
View File

@ -0,0 +1,111 @@
{
"@@locale": "hu",
"settings": "Beállítások",
"password": "Jelszó",
"email_or_username": "Email vagy felhasználónév",
"posts": "Bejegyzések",
"comments": "Hozzászólások",
"modlog": "Moderációs napló",
"community": "Közösség",
"url": "URL",
"title": "Cím",
"body": "Törzs",
"nsfw": "Korhatáros tartalom",
"post": "Elküld",
"save": "mentés",
"subscribed": "Feliratkozva",
"all": "Mind",
"replies": "Válaszok",
"mentions": "Említések",
"from": "küldő",
"to": "címzett",
"deleted_by_creator": "eltávolítva a szerző által",
"more": "több",
"mark_as_read": "megjelölés olvasottnak",
"mark_as_unread": "megjelölés olvasatlannak",
"reply": "válasz",
"edit": "szerkesztés",
"delete": "törlés",
"restore": "visszaállítás",
"yes": "igen",
"no": "nem",
"avatar": "Avatár",
"email": "Email",
"matrix_user": "Matrix felhasználó",
"sort_type": "Rendezési mód",
"type": "Típus",
"show_nsfw": "Korhatáros tartalom megjelenítése",
"send_notifications_to_email": "Értesítések küldése emailen keresztül",
"delete_account": "FIók törlése",
"saved": "Mentve",
"communities": "Közösségek",
"users": "Felhasználók",
"theme": "Téma",
"language": "Nyelv",
"hot": "Népszerű",
"new_": "Új",
"old": "Régi",
"top": "Legjobb",
"chat": "Csevegés",
"admin": "admin",
"by": "szerző",
"not_an_admin": "Nem egy admin.",
"couldnt_find_post": "A bejegyzés nem található.",
"not_logged_in": "Nem vagy bejelentkezve.",
"site_ban": "Ki lettél tiltva az oldalról",
"community_ban": "Ki lettél tiltva ebből a közösségből.",
"downvotes_disabled": "Negatív szavazatok letiltva",
"locked": "zárolva",
"couldnt_create_comment": "Nem lehetett létrehozni a hozzászólást.",
"couldnt_like_comment": "Nem lehetett kedvelni a hozzászólást.",
"couldnt_update_comment": "Nem lehetett frissíteni a hozzászólást.",
"no_comment_edit_allowed": "A hozzászólás szerkesztése nem engedélyezett.",
"couldnt_save_comment": "Nem lehetett menteni a hozzászólást.",
"couldnt_get_comments": "Nem lehetett lekérdezni a hozzászólást.",
"couldnt_create_post": "Nem lehetett létrehozni a bejegyzést.",
"couldnt_like_post": "Nem lehetett kedvelni a bejegyzést.",
"couldnt_find_community": "A közösség nem található.",
"couldnt_get_posts": "Nem lehetett lekérdezni a bejegyzéseket",
"no_post_edit_allowed": "A bejegyzés szerkesztése nem engedélyezett.",
"couldnt_save_post": "Nem lehetett menteni a bejegyzést.",
"site_already_exists": "Az oldal már létezik.",
"couldnt_update_site": "Nem lehetett frissíteni az oldalt.",
"invalid_community_name": "Érvénytelen név.",
"community_already_exists": "A közösség már létezik.",
"community_moderator_already_exists": "Már létezik a közösségi moderátor.",
"community_follower_already_exists": "Már létezik a közösségi követő.",
"couldnt_update_community": "Nem lehetett frissíteni a közösséget.",
"no_community_edit_allowed": "A közösség szerkesztése nem engedélyezett.",
"system_err_login": "Rendszerhiba. Próbálj meg ki- és bejelentkezni!",
"community_user_already_banned": "A közösségi felhasználó már ki lett tiltva.",
"couldnt_find_that_username_or_email": "Az a felhasználónév vagy email nem található.",
"password_incorrect": "Rossz jelszó.",
"registration_closed": "Regisztráció lezárva",
"passwords_dont_match": "A jelszavak nem egyeznek.",
"invalid_username": "Érvénytelen felhasználónév.",
"couldnt_update_user": "Nem lehetett frissíteni a felhasználót.",
"couldnt_update_private_message": "Nem lehetett frissíteni a privát üzenetet.",
"couldnt_update_post": "Nem lehetett frissíteni a bejegyzést",
"couldnt_create_private_message": "Nem lehetett létrehozni a privát üzenetet.",
"no_private_message_edit_allowed": "A privát üzenet szerkesztése nem engedélyezett.",
"post_title_too_long": "A bejegyzés címe túl hosszú.",
"email_already_exists": "Az email már létezik.",
"user_already_exists": "A felhasználó már létezik.",
"number_of_users_online": "{count,plural, =1{{count} online felhasználó} other{{count} online felhasználó}}",
"number_of_comments": "{count,plural, =1{{count} hozzászólás} other{{count} hozzászólás}}",
"number_of_posts": "{count,plural, =1{{count} bejegyzés} other{{count} bejegyzés}}",
"number_of_subscribers": "{count,plural, =1{{count} feliratkozó} other{{count} feliratkozó}}",
"number_of_users": "{count,plural, =1{{count} felhasználó} other{{count} felhasználó}}",
"unsubscribe": "Leiratkozás",
"subscribe": "Feliratkozás",
"messages": "Üzenetek",
"banned_users": "Kitiltott felhasználók",
"delete_account_confirm": "Figyelmeztetés: ez véglegesen törölni fogja az összes adatodat. A megerősítéshez írd be a jelszavad!",
"new_password": "Új jelszó",
"verify_password": "Jelszó megerősítése",
"old_password": "Régi jelszó",
"show_avatars": "Avatárok mutatása",
"search": "Keresés",
"send_message": "Üzenet küldése",
"top_day": "A nap bejegyzése"
}

132
lib/l10n/intl_it.arb Normal file
View File

@ -0,0 +1,132 @@
{
"@@locale": "it",
"settings": "Impostazioni",
"password": "Password",
"email_or_username": "Email o Nome Utente",
"posts": "Pubblicazioni",
"comments": "Commenti",
"modlog": "Registro di moderazione",
"community": "Comunità",
"url": "URL",
"title": "Titolo",
"body": "Contenuto",
"nsfw": "NSFW",
"post": "pubblica",
"save": "salva",
"subscribed": "Iscritto",
"local": "Locale",
"all": "Tutti",
"replies": "Risposte",
"mentions": "Menzioni",
"from": "da",
"to": "su",
"deleted_by_creator": "eliminato dal creatore",
"more": "altro",
"mark_as_read": "segna come letto",
"mark_as_unread": "segna come non letto",
"reply": "rispondi",
"edit": "modifica",
"delete": "cancella",
"restore": "ripristina",
"yes": "sì",
"no": "no",
"avatar": "Avatar",
"banner": "Banner",
"display_name": "Nome visualizzato",
"bio": "Descrizione",
"email": "Email",
"matrix_user": "Utente Matrix",
"sort_type": "Ordina per",
"type": "Tipo",
"show_nsfw": "Mostra contenuto NSFW",
"send_notifications_to_email": "Invia notifiche via email",
"delete_account": "Cancella Account",
"saved": "Salvati",
"communities": "Comunità",
"users": "Utenti",
"theme": "Tema",
"language": "Lingua",
"hot": "Popolari",
"new_": "Nuovi",
"old": "Vecchi",
"top": "Migliori",
"chat": "Chat",
"admin": "amministratore",
"by": "di",
"not_an_admin": "Non un amministratore.",
"couldnt_find_post": "Impossibile trovare la pubblicazione.",
"not_logged_in": "Non hai effettuato l'accesso.",
"site_ban": "Sei stato escluso dal sito",
"community_ban": "Sei stato escluso da questa comunità.",
"downvotes_disabled": "Voti negativi disabilitati",
"invalid_url": "URL non valido.",
"locked": "bloccato",
"couldnt_create_comment": "Impossibile creare il commento.",
"couldnt_like_comment": "Impossibile apprezzare il commento.",
"couldnt_update_comment": "Impossibile aggiornare il commento.",
"no_comment_edit_allowed": "Non sei autorizzato a modificare il commento.",
"couldnt_save_comment": "Impossibile salvare il commento.",
"couldnt_get_comments": "Impossibile ottenere i commenti.",
"report_reason_required": "Motivazione della segnalazione obbligatoria.",
"report_too_long": "Segnalazione troppo lunga.",
"couldnt_create_report": "Impossibile creare segnalazione.",
"couldnt_resolve_report": "Impossibile risolvere segnalazione.",
"invalid_post_title": "Titolo della pubblicazione non valido",
"couldnt_create_post": "Impossibile creare la pubblicazione.",
"couldnt_like_post": "Impossibile apprezzare la pubblicazione.",
"couldnt_find_community": "Impossibile trovare la comunità.",
"couldnt_get_posts": "Impossibile recuperare le pubblicazioni",
"no_post_edit_allowed": "Non sei autorizzato a modificare la pubblicazione.",
"couldnt_save_post": "Impossibile salvare la pubblicazione.",
"site_already_exists": "Il sito esiste già.",
"couldnt_update_site": "Impossibile aggiornare il sito.",
"invalid_community_name": "Nome non valido.",
"community_already_exists": "La comunità esiste già.",
"community_moderator_already_exists": "Questo utente è già moderatore della comunità.",
"community_follower_already_exists": "Utente già membro della comunità.",
"not_a_moderator": "Non moderatore.",
"couldnt_update_community": "Impossibile aggiornare la comunità.",
"no_community_edit_allowed": "Non sei autorizzato a modificare la comunità.",
"system_err_login": "Si è verificato un errore. Prova ad effettuare nuovamente l'accesso.",
"community_user_already_banned": "L'utente della comunità è già stato espulso.",
"couldnt_find_that_username_or_email": "Il nome utente o l'email non sono stati trovati.",
"password_incorrect": "Password non corretta.",
"registration_closed": "Registrazione Chiusa",
"invalid_password": "Password non valida. La password deve contenere <= 60 caratteri.",
"passwords_dont_match": "Le password non corrispondono.",
"captcha_incorrect": "Captcha errato.",
"invalid_username": "Nome utente non valido.",
"bio_length_overflow": "La descrizione non può superare i 300 caratteri.",
"couldnt_update_user": "Impossibile aggiornare l'utente.",
"couldnt_update_private_message": "Impossibile aggiornare un messaggio privato.",
"couldnt_update_post": "Impossibile aggiornare la pubblicazione",
"couldnt_create_private_message": "Impossibile creare un messaggio privato.",
"no_private_message_edit_allowed": "Non hai i permessi per modificare un messaggio privato.",
"post_title_too_long": "Titolo della pubblicazione troppo lungo.",
"email_already_exists": "Indirizzo email già presente.",
"user_already_exists": "L'utente esiste già.",
"number_of_users_online": "{count,plural, =1{{count} utente connesso} other{{count} utenti connessi}}",
"number_of_comments": "{count,plural, =1{{count} Commento} other{{count} Commenti}}",
"number_of_posts": "{count,plural, =1{{count} Pubblicazione} other{{count} Pubblicazioni}}",
"number_of_subscribers": "{count,plural, =1{{count} iscritto} other{{count} iscritti}}",
"number_of_users": "{count,plural, =1{{count} utente} other{{count} utenti}}",
"unsubscribe": "Disiscriviti",
"subscribe": "Iscriviti",
"messages": "Messaggi",
"banned_users": "Utenti Espulsi",
"delete_account_confirm": "Attenzione: stai per cancellare permanentemente tutti i tuoi dati. Inserisci la tua password per confermare questa azione.",
"new_password": "Nuova Password",
"verify_password": "Verifica Password",
"old_password": "Vecchia Password",
"show_avatars": "Mostra Avatar",
"search": "Cerca",
"send_message": "Invia Messaggio",
"top_day": "Migliori della giornata",
"top_week": "Migliori della settimana",
"top_month": "Migliori del mese",
"top_year": "Migliori dell'anno",
"top_all": "Migliori di sempre",
"most_comments": "Più commenti",
"new_comments": "Nuovi Commenti",
"active": "Attivi"
}

113
lib/l10n/intl_ja.arb Normal file
View File

@ -0,0 +1,113 @@
{
"@@locale": "ja",
"settings": "設定",
"password": "パスワード",
"email_or_username": "メールアドレスまたはユーザー名",
"posts": "投稿",
"comments": "コメント",
"modlog": "モデレーションログ",
"community": "コミュニティ",
"url": "URL",
"title": "タイトル",
"body": "本文",
"nsfw": "閲覧注意",
"post": "投稿",
"save": "保存",
"subscribed": "登録済み",
"all": "全て",
"replies": "返信",
"mentions": "言及",
"from": "から",
"to": "宛先",
"deleted_by_creator": "削除済み",
"more": "さらに表示",
"mark_as_read": "既読にする",
"mark_as_unread": "未読にする",
"reply": "返信",
"edit": "編集",
"delete": "削除",
"restore": "復元",
"yes": "はい",
"no": "いいえ",
"avatar": "アバター",
"banner": "バナー",
"display_name": "表示名",
"bio": "自己紹介",
"email": "メールアドレス",
"matrix_user": "Matrix のユーザーアカウント",
"sort_type": "並び順の種類",
"type": "種類",
"show_nsfw": "閲覧注意のコンテンツを表示",
"send_notifications_to_email": "通知をメール送信",
"delete_account": "アカウントを削除",
"saved": "保存済み",
"communities": "コミュニティ",
"users": "ユーザー",
"theme": "テーマ",
"language": "言語",
"hot": "人気",
"new_": "新しい順",
"old": "古い順",
"top": "トップ",
"chat": "会話",
"admin": "管理者",
"by": "投稿者",
"not_an_admin": "管理者ではありません。",
"couldnt_find_post": "投稿が見付かりません。",
"not_logged_in": "ログインしていません。",
"site_ban": "サイトへのアクセスを禁止されています",
"community_ban": "このコミュニティへのアクセスを禁止されています。",
"downvotes_disabled": "反対票を無効化",
"locked": "凍結中",
"couldnt_create_comment": "投稿を作成できませんでした。",
"couldnt_like_comment": "コメントが「いいね」できない。",
"couldnt_update_comment": "コメントが更新されない。",
"no_comment_edit_allowed": "コメントの編集権限がありません。",
"couldnt_save_comment": "コメントが保存されない。",
"couldnt_get_comments": "コメントが取得されない。",
"couldnt_create_post": "投稿ができない。",
"couldnt_like_post": "投稿が「いいね」できない。",
"couldnt_find_community": "コミュニティが見付かりません。",
"couldnt_get_posts": "投稿が取得できない",
"no_post_edit_allowed": "投稿の編集権限がありません。",
"couldnt_save_post": "投稿が保存されない。",
"site_already_exists": "サイトは既に存在します。",
"couldnt_update_site": "サイトが更新されない。",
"community_already_exists": "コミュニティは既に存在します。",
"community_moderator_already_exists": "コミュニティ管理人は既に存在します。",
"community_follower_already_exists": "コミュニティフォロワーは既に存在します。",
"couldnt_update_community": "コミュニティが更新されない。",
"no_community_edit_allowed": "コミュニティの編集許可がありません。",
"system_err_login": "システムエラーが発生しました。一度ログアウトして、再度ログインをお試しください。",
"community_user_already_banned": "コミュニティユーザーは既に禁止されています。",
"couldnt_find_that_username_or_email": "ユーザー名またはメールアドレスが見付かりません。",
"password_incorrect": "パスワードが不正です。",
"registration_closed": "登録は受け付けていません",
"passwords_dont_match": "パスワードが一致しません。",
"bio_length_overflow": "自己紹介は 300 文字までです。",
"couldnt_update_user": "ユーザーが更新されない。",
"couldnt_update_private_message": "プライベートメッセージが更新されない。",
"couldnt_update_post": "投稿が更新されない",
"couldnt_create_private_message": "プライベートメッセージが作成されない。",
"no_private_message_edit_allowed": "プライベートメッセージの編集許可がありません。",
"post_title_too_long": "投稿のタイトルが長すぎます。",
"email_already_exists": "メールアドレスが既に使用されています。",
"user_already_exists": "ユーザーは既に存在します。",
"number_of_users_online": "{count,plural, =1{{count} 名のユーザーがオンライン}}",
"number_of_comments": "{count,plural, =1{{count} 件のコメント}}",
"number_of_posts": "{count,plural, =1{{count} 件の投稿}}",
"number_of_subscribers": "{count,plural, =1{{count} 名の登録者}}",
"number_of_users": "{count,plural, =1{{count} 名のユーザー}}",
"unsubscribe": "登録解除",
"subscribe": "登録",
"messages": "メッセージ",
"delete_account_confirm": "警告: あなたのデータを全て恒久的に削除します。確認のためパスワードを入力してください。",
"new_password": "新しいパスワード",
"verify_password": "パスワードの確認",
"old_password": "現在のパスワード",
"show_avatars": "アバターを表示",
"search": "検索",
"send_message": "メッセージを送信",
"top_day": "日間トップ",
"active": "活発さ"
}

106
lib/l10n/intl_ka.arb Normal file
View File

@ -0,0 +1,106 @@
{
"@@locale": "ka",
"settings": "პარამეტრები",
"password": "პაროლი",
"email_or_username": "ელ-პოსტა ან მომხმარებლის სახელი",
"posts": "პოსტები",
"comments": "კომენტარები",
"modlog": "მოდ-ლოგი",
"community": "თემა",
"url": "მისამართი",
"title": "სათაური",
"body": "ტექსტი",
"nsfw": "NSFW",
"post": "პოსტი",
"save": "დამახსოვრება",
"subscribed": "გამოწერილია",
"all": "ყველა",
"replies": "პასუხები",
"mentions": "ხსენებები",
"from": "from",
"to": "to",
"deleted_by_creator": "წაშლილია",
"more": "მეტი",
"mark_as_read": "მონიშნე როგორც წაკითხული",
"mark_as_unread": "მონიშნე როგორც წაუკითხავი",
"reply": "პასუხის გაცემა",
"edit": "რადექტირება",
"delete": "წაშლა",
"restore": "რასტორაცია",
"yes": "კი",
"no": "არა",
"avatar": "ავატარი",
"email": "ელ-პოსტა",
"matrix_user": "მატრიცული მომხმარებელი",
"sort_type": "სორტირების ტიპი",
"type": "ტიპი",
"show_nsfw": "Show NSFW content",
"send_notifications_to_email": "შეტყობინების გაგზავნა ელ-პოსტაზე",
"delete_account": "ჩემი ანგარიშის წაშლა",
"saved": "შანახული",
"communities": "თემები",
"users": "მომხმარებელი",
"theme": "საიტის თემა",
"language": "ენა",
"hot": "ცხელი",
"new_": "ახალი",
"old": "ძველი",
"top": "ტოპ",
"chat": "ჩეტი",
"admin": "ადმინი",
"by": "by",
"not_an_admin": "ადმინი არ არის",
"couldnt_find_post": "პოსტი ვერ მოიძებნა.",
"not_logged_in": "შასული არ ხართ",
"site_ban": "საიტიდან გაშავებული ხარ.",
"community_ban": "შენ ამ თემისგან გაშავებული ხარ.",
"downvotes_disabled": "არმოწონები გამორთულია",
"locked": "ჩაკეტილი",
"couldnt_create_comment": "კომენტარის შექმნა ვერ მოხერხდა.",
"couldnt_like_comment": "კომენტარის მოწონება ვერ მოხერხდა.",
"couldnt_update_comment": "კომენტარის განახლება ვერ მოხერხდა.",
"no_comment_edit_allowed": "კომენტარის რედაკტირება არ შეიძლება.",
"couldnt_save_comment": "კომენტარის შენახვა ვერ მოხერხდა.",
"couldnt_get_comments": "კომენტარების ნახვა ვერ მოხერხდა.",
"couldnt_create_post": "პოსტი ვერ შეიქმნა.",
"couldnt_like_post": "პოსტის მოწონება ვერ მოხერხდა.",
"couldnt_find_community": "ტემა არ მოიძებნა.",
"couldnt_get_posts": "პოსტები არ არის.",
"no_post_edit_allowed": "პოსტის რედაკტირება არ შეიძლება.",
"couldnt_save_post": "პოსტის დასეივება ვერ მოხერხდა.",
"site_already_exists": "Site already exists.",
"couldnt_update_site": "Couldn't update site.",
"community_already_exists": "ეს თემა უკვე არსებობს.",
"community_moderator_already_exists": "ამ თემის მოდერატორი უკვე არსებობს.",
"community_follower_already_exists": "თემის ფოლოვორი უკვე არსებობს.",
"couldnt_update_community": "თემა ვერ განახლდა.",
"no_community_edit_allowed": "თემის რედაკტირება არ შეიძლება.",
"system_err_login": "ერორი. თავიდან შემოსვლა ცადეთ.",
"community_user_already_banned": "თემის მომხმარებელი უკვე შავ სიაშია.",
"couldnt_find_that_username_or_email": "სახელი ან ელ-პოსტა ვერ მოიძებნა.",
"password_incorrect": "პაროლი არასწორია .",
"registration_closed": "რეგისტრაცია დახურულია",
"passwords_dont_match": "პაროლები იგივი არ არის.",
"couldnt_update_user": "მომხმარებლის განახლება ვერ მოხერხდა.",
"couldnt_update_post": "პოსტი ვერ განახლდა",
"post_title_too_long": "პოსტის სათაური ძალიან გრძელია.",
"email_already_exists": "ელ-პოსტა უკვე არსებობს.",
"user_already_exists": "მომხმარებელი უკვე არსებობს.",
"number_of_users_online": "{count,plural, =1{მომხმარებელი საიტზე} other{მომხმარებელი საიტზე}}",
"number_of_comments": "{count,plural, =1{კომენტარი} other{კომანტარები}}",
"number_of_posts": "{count,plural, =1{თარგმნა} other{თარგმნა}}",
"number_of_subscribers": "{count,plural, =1{გამომწერი} other{გამომწერები}}",
"number_of_users": "{count,plural, =1{მომხმარებელი} other{მომხმარებლები}}",
"unsubscribe": "გამოწერის გაუქმნება",
"subscribe": "გამოწერა",
"messages": "მესეჯები",
"banned_users": "გაშავებული მომხმარებლები",
"delete_account_confirm": "გაფთხილება: ეს შენს ყველაფერს წაშლის. პაროლი ჩაწერეთ რომ დაადასტუროთ.",
"new_password": "ახალი პაროლი",
"verify_password": "პაროლის დადასტურება",
"old_password": "ძველი პაროლი",
"show_avatars": "ავატარები გამოჩენა",
"search": "ძებმა",
"send_message": "მესეჯის გაგზავნა",
"top_day": "ტოპ დღეს"
}

3
lib/l10n/intl_km.arb Normal file
View File

@ -0,0 +1,3 @@
{
"@@locale": "km"
}

132
lib/l10n/intl_ko.arb Normal file
View File

@ -0,0 +1,132 @@
{
"@@locale": "ko",
"settings": "설정",
"password": "비밀번호",
"email_or_username": "이메일 또는 유저명",
"posts": "게시글",
"comments": "덧글",
"modlog": "관리기록",
"community": "커뮤니티",
"url": "URL",
"title": "제목",
"body": "내용",
"nsfw": "민감한 콘텐츠(후방주의, 성인)",
"post": "등록",
"save": "저장",
"subscribed": "구독",
"local": "Local",
"all": "모두",
"replies": "댓글",
"mentions": "언급",
"from": "에서",
"to": "to",
"deleted_by_creator": "글쓴이에 의해 삭제됨",
"more": "더 보기",
"mark_as_read": "읽은 상태로 표시",
"mark_as_unread": "읽지 않은 상태로 표시",
"reply": "댓글",
"edit": "수정",
"delete": "삭제",
"restore": "복원",
"yes": "네",
"no": "아니오",
"avatar": "아바타",
"banner": "배너",
"display_name": "표시 이름",
"bio": "자기 소개",
"email": "이메일",
"matrix_user": "메트릭스 사용자",
"sort_type": "정렬",
"type": "유형",
"show_nsfw": "민감한 콘텐츠 보기",
"send_notifications_to_email": "이메일로 알림 보내기",
"delete_account": "계정 삭제",
"saved": "저장한글",
"communities": "커뮤니티",
"users": "유저",
"theme": "테마",
"language": "언어",
"hot": "인기있는",
"new_": "새로운",
"old": "오래된",
"top": "Top",
"chat": "대화",
"admin": "관리자",
"by": "작성",
"not_an_admin": "관리자가 아닙니다.",
"couldnt_find_post": "게시물을 찾을 수 없습니다.",
"not_logged_in": "로그인하지 않았습니다.",
"site_ban": "당신은 사이트에서 추방되었습니다",
"community_ban": "이 커뮤니티에서 추방되었습니다.",
"downvotes_disabled": "내림 비활성화",
"invalid_url": "잘못된 URL.",
"locked": "잠김",
"couldnt_create_comment": "덧글을 작성할 수 없습니다.",
"couldnt_like_comment": "덧글에 좋아요 표시를 할 수 없습니다.",
"couldnt_update_comment": "덧글을 업데이트 할 수 없습니다.",
"no_comment_edit_allowed": "덧글을 수정할 수 없습니다.",
"couldnt_save_comment": "덧글을 저장할 수 없습니다.",
"couldnt_get_comments": "덧글을 가져올 수 없습니다.",
"report_reason_required": "사유를 제출해야합니다.",
"report_too_long": "보고 글이 너무 길어요.",
"couldnt_create_report": "보고서를 생성할 수 없습니다.",
"couldnt_resolve_report": "보고서를 해결할 수 없습니다.",
"invalid_post_title": "잘못된 게시물 제목",
"couldnt_create_post": "게시물을 작성할 수 없습니다.",
"couldnt_like_post": "이 게시물에 좋아요 표시를 할 수 없습니다.",
"couldnt_find_community": "커뮤니티를 찾을 수 없습니다.",
"couldnt_get_posts": "게시물을 가져올 수 없습니다",
"no_post_edit_allowed": "게시물을 수정할 수 없습니다.",
"couldnt_save_post": "게시물을 저장할 수 없습니다.",
"site_already_exists": "사이트가 이미 존재합니다.",
"couldnt_update_site": "사이트를 업데이트 할 수 없습니다.",
"invalid_community_name": "잘못된 이름.",
"community_already_exists": "커뮤니티가 이미 존재합니다.",
"community_moderator_already_exists": "커뮤니티 운영자가 이미 존재합니다.",
"community_follower_already_exists": "커뮤니티 팔로어가 이미 존재합니다.",
"not_a_moderator": "중재자가 아닙니다.",
"couldnt_update_community": "커뮤니티를 업데이트 할 수 없습니다.",
"no_community_edit_allowed": "커뮤니티를 수정할 수 없습니다.",
"system_err_login": "시스템 오류. 다시 로그인하십시오.",
"community_user_already_banned": "커뮤니티 사용자가 이미 차단되었습니다.",
"couldnt_find_that_username_or_email": "해당 사용자 이름이나 이메일을 찾을 수 없습니다.",
"password_incorrect": "잘못된 비밀번호입니다.",
"registration_closed": "등록 닫기",
"invalid_password": "잘못된 비밀번호입니다. 비밀번호는 60글자이하로 만들어야 합니다.",
"passwords_dont_match": "비밀번호가 일치하지 않습니다.",
"captcha_incorrect": "보안문자가 일치하지 않습니다.",
"invalid_username": "잘못된 사용자 이름.",
"bio_length_overflow": "자기 소개는 300자를 초과 할 수 없습니다.",
"couldnt_update_user": "사용자를 업데이트 할 수 없습니다.",
"couldnt_update_private_message": "개인 메시지를 업데이트 할 수 없습니다.",
"couldnt_update_post": "게시물을 업데이트 할 수 없습니다",
"couldnt_create_private_message": "개인 메시지를 만들 수 없습니다.",
"no_private_message_edit_allowed": "개인 메시지를 편집 할 수 없습니다.",
"post_title_too_long": "게시물 제목이 너무 깁니다.",
"email_already_exists": "이메일이 이미 존재합니다.",
"user_already_exists": "사용자가 이미 존재합니다.",
"number_of_users_online": "{count,plural, =1{접속자수 {count}}}",
"number_of_comments": "{count,plural, =1{덧글수 {count}}}",
"number_of_posts": "{count,plural, =1{게시물 수 {count}}}",
"number_of_subscribers": "{count,plural, =1{구독자수{count}}}",
"number_of_users": "{count,plural, =1{가입자수 {count}}}",
"unsubscribe": "구독취소",
"subscribe": "구독",
"messages": "메세지",
"banned_users": "금지 된 사용자",
"delete_account_confirm": "경고 : 모든 데이터가 영구적으로 삭제됩니다. 확인을 위해 비밀번호를 입력하십시오.",
"new_password": "새 비밀번호",
"verify_password": "비밀번호 재입력",
"old_password": "기존 비밀번호",
"show_avatars": "아바타 보기",
"search": "검색",
"send_message": "메세지 전송",
"top_day": "일별",
"top_week": "주별",
"top_month": "월별",
"top_year": "년간",
"top_all": "전체",
"most_comments": "최근 댓글",
"new_comments": "새 덧글",
"active": "활발한"
}

111
lib/l10n/intl_nl.arb Normal file
View File

@ -0,0 +1,111 @@
{
"@@locale": "nl",
"settings": "Instellingen",
"password": "Wachtwoord",
"email_or_username": "E-mail of gebruikersnaam",
"posts": "Posts",
"comments": "Reacties",
"modlog": "Moderatorlog",
"community": "Community",
"url": "url",
"title": "Titel",
"body": "Tekst",
"nsfw": "NSFW",
"post": "post",
"save": "opslaan",
"subscribed": "Geabonneerd",
"all": "Alle",
"replies": "Reacties",
"mentions": "vermeldingen",
"from": "van",
"to": "aan",
"deleted_by_creator": "verwijderd door maker",
"more": "meer",
"mark_as_read": "markeer als gelezen",
"mark_as_unread": "markeer als ongelezen",
"reply": "reageer",
"edit": "bewerk",
"delete": "verwijder",
"restore": "herstellen",
"yes": "ja",
"no": "nee",
"avatar": "Avatar",
"email": "E-mail",
"matrix_user": "Matrix gebruikers-id",
"sort_type": "Sorteertype",
"type": "Type",
"show_nsfw": "Laat NSFW-inhoud zien",
"send_notifications_to_email": "Stuur meldingen naar je email",
"delete_account": "Verwijder account",
"saved": "Opgeslagen",
"communities": "Gemeenschappen",
"users": "Gebruikers",
"theme": "Thema",
"language": "Taal",
"hot": "Populair",
"new_": "Nieuw",
"old": "Oud",
"top": "Top",
"chat": "Praat",
"admin": "beheerder",
"by": "door",
"not_an_admin": "Niet een beheerder.",
"couldnt_find_post": "Kon post niet vinden.",
"not_logged_in": "Niet ingelogd.",
"site_ban": "Je bent verbannen van deze site",
"community_ban": "Je bent verbannen uit deze community.",
"downvotes_disabled": "Downvotes geblokkeerd",
"locked": "gesloten",
"couldnt_create_comment": "Kon reactie niet maken.",
"couldnt_like_comment": "Kon reactie niet leuk vinden.",
"couldnt_update_comment": "Kon reactie niet bijwerken.",
"no_comment_edit_allowed": "Niet toegestaan om reactie te bewerken.",
"couldnt_save_comment": "Kon reactie niet opslaan.",
"couldnt_get_comments": "Kon reacties niet ophalen.",
"couldnt_create_post": "Kon post niet maken.",
"couldnt_like_post": "Kon post niet leuk vinden.",
"couldnt_find_community": "Kon community niet vinden.",
"couldnt_get_posts": "Kon posts niet ophalen",
"no_post_edit_allowed": "Niet toegestaan om posts te bewerken.",
"couldnt_save_post": "Kon post niet opslaan.",
"site_already_exists": "Site bestaat al.",
"couldnt_update_site": "Kon site niet bijwerken.",
"invalid_community_name": "Ongeldige naam.",
"community_already_exists": "Community bestaat al.",
"community_moderator_already_exists": "Community-moderator bestaat al.",
"community_follower_already_exists": "Community-volger bestaat al.",
"couldnt_update_community": "Kon community niet bijwerken.",
"no_community_edit_allowed": "Niet toegestaan om community te bewerken.",
"system_err_login": "Systeemfout. Probeer uit te loggen en weer in te loggen.",
"community_user_already_banned": "Community-gebruiker reeds verbannen.",
"couldnt_find_that_username_or_email": "Kon gebruikersnaam of e-mailadres niet vinden.",
"password_incorrect": "Wachtwoord incorrect.",
"registration_closed": "Registratie gesloten",
"passwords_dont_match": "Wachtwoorden zijn niet gelijk.",
"invalid_username": "Ongeldige gebruikersnaam.",
"couldnt_update_user": "Kon gebruiker niet bijwerken.",
"couldnt_update_private_message": "Kan beveiligd bericht niet bijwerken.",
"couldnt_update_post": "Kon post niet bijwerken",
"couldnt_create_private_message": "Kan beveiligd bericht niet maken.",
"no_private_message_edit_allowed": "Niet toegestaan om privé berichten te wijzigen.",
"post_title_too_long": "Posttitel te lang.",
"email_already_exists": "Email bestaat al.",
"user_already_exists": "Gebruiker bestaat al.",
"number_of_users_online": "{count,plural, =1{{count} gebruiker online} other{{count} gebruikers online}}",
"number_of_comments": "{count,plural, =1{{count} reactie} other{{count} reacties}}",
"number_of_posts": "{count,plural, =1{{count} post} other{{count} posts}}",
"number_of_subscribers": "{count,plural, =1{{count} abonnee} other{{count} abonnees}}",
"number_of_users": "{count,plural, =1{{count} gebruiker} other{{count} gebruikers}}",
"unsubscribe": "Afmelden",
"subscribe": "Abonneren",
"messages": "Berichten",
"banned_users": "Verbannen gebruikers",
"delete_account_confirm": "Waarschuwing: dit zal al uw data voorgoed verwijderen, vul uw wachtwoord in om te bevestigen.",
"new_password": "Nieuw wachtwoord",
"verify_password": "Herhaal wachtwoord",
"old_password": "Oud wachtwoord",
"show_avatars": "Toon avatars",
"search": "Zoek",
"send_message": "Verstuur bericht",
"top_day": "Dagelijkse top"
}

3
lib/l10n/intl_oc.arb Normal file
View File

@ -0,0 +1,3 @@
{
"@@locale": "oc"
}

126
lib/l10n/intl_pl.arb Normal file
View File

@ -0,0 +1,126 @@
{
"@@locale": "pl",
"settings": "Ustawienia",
"password": "Hasło",
"email_or_username": "Email lub Nazwa Użytkownika",
"posts": "Posty",
"comments": "Komentarze",
"modlog": "Log moderatorski",
"community": "Społeczność",
"url": "URL",
"title": "Tytuł",
"body": "Treść",
"nsfw": "NSFW",
"post": "post",
"save": "zapisz",
"subscribed": "Zasubskrybowane",
"local": "Lokalne",
"all": "Wszystko",
"replies": "Odpowiedzi",
"mentions": "Wzmianki",
"from": "od",
"to": "do",
"deleted_by_creator": "usunięte przez autora",
"more": "więcej",
"mark_as_read": "zaznacz jako przeczytane",
"mark_as_unread": "zaznacz jako nieprzeczytane",
"reply": "odpowiedz",
"edit": "edytuj",
"delete": "usuń",
"restore": "przywróć",
"yes": "tak",
"no": "nie",
"avatar": "Awatar",
"banner": "Banner",
"display_name": "Nazwa wyświetlana",
"bio": "Opis",
"email": "Email",
"matrix_user": "Użytkownik Matrixa",
"sort_type": "Sortuj typ",
"type": "Rodzaj",
"show_nsfw": "Pokaż treści NSFW (+18)",
"send_notifications_to_email": "Wysyłaj powiadomienia na Email",
"delete_account": "Usuń Konto",
"saved": "Zapisane",
"communities": "Społeczności",
"users": "Użytkownicy",
"theme": "Motyw",
"language": "Język",
"hot": "Popularne",
"new_": "Nowe",
"old": "Stare",
"top": "Najpopularniejsze",
"chat": "Czat",
"admin": "administrator",
"by": "przez",
"not_an_admin": "Nie jest administratorem.",
"couldnt_find_post": "Nie udało się znaleźć posta.",
"not_logged_in": "Nie jesteś zalogowana/y.",
"site_ban": "Zostałaś/eś zbanowana/y z tej witryny",
"community_ban": "Zostałaś/eś zbanowana/y z tej społeczności.",
"downvotes_disabled": "Wdółgłosy wyłączone",
"invalid_url": "Nieprawidłowy URL.",
"locked": "zablokowane",
"couldnt_create_comment": "Nie udało się stworzyć komentarza.",
"couldnt_like_comment": "Polubienie komentarza nie powiodło się.",
"couldnt_update_comment": "Zaktualizowanie komentarza nie powiodło się.",
"no_comment_edit_allowed": "Nie masz uprawnień do edycji komentarza.",
"couldnt_save_comment": "Zapisanie komentarza nie powiodło się.",
"couldnt_get_comments": "Pobranie komentarzy nie powiodło się.",
"report_reason_required": "Wymagane jest uzasadnienie zgłoszenia.",
"report_too_long": "Zgłoszenie jest zbyt długie.",
"couldnt_create_report": "Nie udało się stworzyć zgłoszenia.",
"couldnt_resolve_report": "Nie udało się rozwiazać zgłoszenia.",
"invalid_post_title": "Nieprawidłowy tytuł posta",
"couldnt_create_post": "Nie udało się stworzyć posta.",
"couldnt_like_post": "Nie udało się polubić posta.",
"couldnt_find_community": "Nie udało się znaleźć społeczności.",
"couldnt_get_posts": "Nie udało się pobrać postów",
"no_post_edit_allowed": "Nie masz uprawnień do edycji posta.",
"couldnt_save_post": "Nie udało się zapisać posta.",
"site_already_exists": "Witryna już istnieje.",
"couldnt_update_site": "Nie udało się zaktualizować witryny.",
"invalid_community_name": "Niepoprawna nazwa.",
"community_already_exists": "Społeczność już istnieje.",
"community_moderator_already_exists": "Moderator społeczności już istnieje.",
"community_follower_already_exists": "Osoba obserwująca społeczność już istnieje.",
"not_a_moderator": "Nie jest moderatorem.",
"couldnt_update_community": "Nie udało się zaktualizować Społeczności.",
"no_community_edit_allowed": "Nie masz uprawnień do edycji społeczności.",
"system_err_login": "Błąd systemu. Spróbuj wylogować się i następnie zalogować ponownie.",
"community_user_already_banned": "Użytkownik społeczności jest już zbanowany.",
"couldnt_find_that_username_or_email": "Nie udało się znaleźć takiej nazwy użytkownika lub adresu email.",
"password_incorrect": "Hasło niepoprawne.",
"registration_closed": "Rejestracja Zamknięta",
"invalid_password": "Nieprawidłowe hasło. Hasło musi mieć mniej niż 60 znaków.",
"passwords_dont_match": "Hasła nie pasują do siebie.",
"captcha_incorrect": "Captcha niepoprawna.",
"invalid_username": "Nieprawidłowa nazwa użytkownika.",
"bio_length_overflow": "To pole nie może przekraczać 300 znaków.",
"couldnt_update_user": "Nie udało się zaktualizować użytkownika.",
"couldnt_update_private_message": "Nie udało się zaktualizować prywatnej wiadomości.",
"couldnt_update_post": "Nie udało się zaktualizować postów",
"couldnt_create_private_message": "Nie udało się stworzyć prywatnej wiadomości.",
"no_private_message_edit_allowed": "Brak uprawnień do edycji prywatnej wiadomości.",
"post_title_too_long": "Tytuł posta zbyt długi.",
"email_already_exists": "Email już istnieje.",
"user_already_exists": "Użytkownik już istnieje.",
"unsubscribe": "Odsubskrybuj",
"subscribe": "Subskrybuj",
"messages": "Wiadomości",
"banned_users": "Zbanowani Użytkownicy",
"delete_account_confirm": "Ostrzeżenie: twoje dane zostaną bezpowrotnie usunięte. Wpisz swoje hasło aby potwierdzić.",
"new_password": "Nowe Hasło",
"verify_password": "Zweryfikuj Hasło",
"old_password": "Stare Hasło",
"show_avatars": "Pokaż Awatary",
"search": "Szukaj",
"send_message": "Wyślij Wiadomość",
"top_day": "Najpopularniejsze dziś",
"top_week": "Najpopularniejsze tydzień",
"top_month": "Najpopularniejsze miesiąc",
"top_year": "Najpopularniejsze rok",
"top_all": "Najpopularniejsze kiedykolwiek",
"most_comments": "Najwięcej komentarzy",
"active": "Aktywne"
}

1
lib/l10n/intl_pt.arb Normal file
View File

@ -0,0 +1 @@
{}

122
lib/l10n/intl_pt_BR.arb Normal file
View File

@ -0,0 +1,122 @@
{
"@@locale": "pt_BR",
"settings": "Configurações",
"password": "Senha",
"email_or_username": "E-mail ou nome de usuário",
"posts": "Publicações",
"comments": "Comentários",
"modlog": "Registro de moderação",
"community": "Comunidade",
"url": "URL",
"title": "Título",
"body": "Conteúdo",
"nsfw": "NSFW",
"post": "publicação",
"save": "guardar",
"subscribed": "Inscrito",
"local": "Local",
"all": "Tudo",
"replies": "Respostas",
"mentions": "Menções",
"from": "de",
"to": "para",
"deleted_by_creator": "apagado pelo criador",
"more": "mais",
"mark_as_read": "marcar como lido",
"mark_as_unread": "marcar como não lido",
"reply": "responder",
"edit": "editar",
"delete": "apagar",
"restore": "restaurar",
"yes": "sim",
"no": "não",
"avatar": "Avatar",
"banner": "Banner",
"display_name": "Nome de exibição",
"bio": "Biografia",
"email": "E-mail",
"matrix_user": "Usuário Matrix",
"sort_type": "Ordenação",
"type": "Tipo",
"show_nsfw": "Mostrar conteúdo NSFW",
"send_notifications_to_email": "Enviar notificações para o e-mail",
"delete_account": "Apagar conta",
"saved": "Guardado",
"communities": "Comunidades",
"users": "Usuários",
"theme": "Tema",
"language": "Idioma",
"hot": "Popular",
"new_": "Novo",
"old": "Velho",
"top": "Top",
"chat": "Chat",
"admin": "administrador",
"by": "por",
"not_an_admin": "Não é administrador.",
"couldnt_find_post": "Não foi possível encontrar a publicação.",
"not_logged_in": "Não autenticado.",
"site_ban": "Você foi banido do site",
"community_ban": "Você foi banido desta comunidade.",
"downvotes_disabled": "Votos negativos desativados",
"invalid_url": "URL inválida.",
"locked": "trancado",
"couldnt_create_comment": "Não foi possível criar o comentário.",
"couldnt_like_comment": "Não foi possível curtir o comentário.",
"couldnt_update_comment": "Não foi possível atualizar o comentário.",
"no_comment_edit_allowed": "Sem permissão para editar comentário.",
"couldnt_save_comment": "Não foi possível salvar o comentário.",
"couldnt_get_comments": "Não foi possível obter os comentários.",
"invalid_post_title": "Título de publicação inválido",
"couldnt_create_post": "Não foi possível criar a publicação.",
"couldnt_like_post": "Não foi possível curtir a publicação.",
"couldnt_find_community": "Não foi possível encontrar a comunidade.",
"couldnt_get_posts": "Não foi possível obter as publicações",
"no_post_edit_allowed": "Sem permissão para editar publicação.",
"couldnt_save_post": "Não foi possível guardar a publicação.",
"site_already_exists": "O site já existe.",
"couldnt_update_site": "Não foi possível atualizar o site.",
"invalid_community_name": "Nome inválido.",
"community_already_exists": "Esta comunidade já existe.",
"community_moderator_already_exists": "Este moderador da comunidade já existe.",
"community_follower_already_exists": "Este seguidor da comunidade já existe.",
"not_a_moderator": "Não é da moderação.",
"couldnt_update_community": "Não foi possível atualizar a comunidade.",
"no_community_edit_allowed": "Sem permissão para editar comunidade.",
"system_err_login": "Erro no sistema. Tente sair e autenticar-se outra vez.",
"community_user_already_banned": "Este usuário da comunidade já foi banido.",
"couldnt_find_that_username_or_email": "Não foi possível encontrar esse usuário ou e-mail.",
"password_incorrect": "Senha incorreta.",
"registration_closed": "Registros desativados",
"invalid_password": "Senha inválida. A senha deve ter no máximo 60 caracteres.",
"passwords_dont_match": "As senhas não são iguais.",
"captcha_incorrect": "Captcha incorreto.",
"invalid_username": "Nome de usuário inválido.",
"bio_length_overflow": "Uma biografia de usuário não pode ter mais de 300 caracters.",
"couldnt_update_user": "Não foi possível atualizar o usuário.",
"couldnt_update_private_message": "Não foi possível atualizar a mensagem privada.",
"couldnt_update_post": "Não foi possível atualizar a publicação",
"couldnt_create_private_message": "Não foi possível criar mensagem privada.",
"no_private_message_edit_allowed": "Sem permissão para editar mensagem privada.",
"post_title_too_long": "Título da publicação muito longo.",
"email_already_exists": "Este e-mail já existe.",
"user_already_exists": "Este usuário já existe.",
"number_of_users_online": "{count,plural, =1{{count} usuário online} other{{count} usuários online}}",
"number_of_comments": "{count,plural, =1{{count} comentário} other{{count} comentários}}",
"number_of_posts": "{count,plural, =1{{count} publicação} other{{count} publicações}}",
"number_of_subscribers": "{count,plural, =1{{count} inscrito} other{{count} inscritos}}",
"number_of_users": "{count,plural, =1{{count} usuário} other{{count} usuários}}",
"unsubscribe": "Cancelar inscrição",
"subscribe": "Inscrever-se",
"messages": "Mensagens",
"banned_users": "Usuários Banidos",
"delete_account_confirm": "Aviso: isso vai apagar seus dados de forma permanente. Escreva sua senha para confirmar.",
"new_password": "Nova senha",
"verify_password": "Verifique a senha",
"old_password": "Senha antiga",
"show_avatars": "Mostrar Avatares",
"search": "Busca",
"send_message": "Enviar mensagem",
"top_day": "Top do dia",
"active": "Ativo"
}

125
lib/l10n/intl_ru.arb Normal file
View File

@ -0,0 +1,125 @@
{
"@@locale": "ru",
"settings": "Настройки",
"password": "Пароль",
"email_or_username": "Электронная почта или имя пользователя",
"posts": "Записи",
"comments": "Комментарии",
"modlog": "Модлог",
"community": "Сообщество",
"url": "URL",
"title": "Название",
"body": "Тело",
"nsfw": "NSFW",
"post": "запись",
"save": "сохранить",
"subscribed": "Подписаны",
"local": "Местное",
"all": "Всё",
"replies": "Ответы",
"mentions": "Упоминания",
"from": "от",
"to": "в",
"deleted_by_creator": "удалено автором",
"more": "больше",
"mark_as_read": "пометить как прочитанное",
"mark_as_unread": "пометить как непрочитанное",
"reply": "ответить",
"edit": "редактировать",
"delete": "удалить",
"restore": "восстановить",
"yes": "да",
"no": "нет",
"avatar": "Аватар",
"banner": "Баннер",
"display_name": "Отображаемое имя",
"bio": "Описание пользователя",
"email": "Электронная почта",
"matrix_user": "Адрес в Matrix",
"sort_type": "Тип сортировки",
"type": "Тип",
"show_nsfw": "Показывать NSFW-контент",
"send_notifications_to_email": "Посылать уведомления на e-mail адрес",
"delete_account": "Удалить аккаунт",
"saved": "Сохранено",
"communities": "Сообщества",
"users": "Пользователи",
"theme": "Визуальная тема",
"language": "Язык",
"hot": "Популярно",
"new_": "Новое",
"old": "Старое",
"top": "Лучшее",
"chat": "Чат",
"admin": "администратор",
"by": "от",
"not_an_admin": "Не администратор.",
"couldnt_find_post": "Не получилось найти запись.",
"not_logged_in": "Не авторизованы.",
"site_ban": "Вы были заблокированы на данном сайте",
"community_ban": "Вы были заблокированы в данном сообществе.",
"downvotes_disabled": "Отрицательное голосование отключено",
"invalid_url": "Недопустимый URL.",
"locked": "заблокировано",
"couldnt_create_comment": "Не получилось создать комментарий.",
"couldnt_like_comment": "Не получилось лайкнуть комментарий.",
"couldnt_update_comment": "Не получилось обновить комментарий.",
"no_comment_edit_allowed": "Невозможно отредактировать комментарий.",
"couldnt_save_comment": "Не получилось сохранить комментарий.",
"couldnt_get_comments": "Не удалось получить комментарии.",
"report_reason_required": "Укажите причину жалобы.",
"report_too_long": "Жалоба слишком длинная.",
"couldnt_create_report": "Невозможно создать жалобу.",
"couldnt_resolve_report": "Невозможно разрешить жалобу.",
"invalid_post_title": "Недопустимый заголовок записи",
"couldnt_create_post": "Не получилось создать запись.",
"couldnt_like_post": "Не получилось лайкнуть запись.",
"couldnt_find_community": "Не получилось найти сообщество.",
"couldnt_get_posts": "Не получилось найти записи",
"no_post_edit_allowed": "Невозможно отредактировать запись.",
"couldnt_save_post": "Не получилось сохранить запись.",
"site_already_exists": "Сайт уже существует.",
"couldnt_update_site": "Не получилось обновить сайт.",
"invalid_community_name": "Неверное имя пользователя.",
"community_already_exists": "Сообщество уже существует.",
"community_moderator_already_exists": "Модератор сообщества уже существует.",
"community_follower_already_exists": "Подписчик сообщества уже существует.",
"not_a_moderator": "Не модератор.",
"couldnt_update_community": "Не получилось обновить сообщество.",
"no_community_edit_allowed": "Невозможно отредактировать сообщество.",
"system_err_login": "Системная ошибка. Попробуйте выйти из системы и вернуться обратно.",
"community_user_already_banned": "Пользователь сообщества уже заблокирован.",
"couldnt_find_that_username_or_email": "Не получилось найти данное имя пользователя или электронную почту.",
"password_incorrect": "Неверный пароль.",
"registration_closed": "Регистрация закрыта",
"invalid_password": "Некорректный пароль. Пароль должен быть не длиннее 60 символов.",
"passwords_dont_match": "Пароли не совпадают.",
"captcha_incorrect": "Некорректная капча.",
"invalid_username": "Неверное имя пользователя.",
"bio_length_overflow": "Описание пользователя не может быть длиннее 300 символов.",
"couldnt_update_user": "Не получилось обновить пользователя.",
"couldnt_update_private_message": "Не удалось обновить личное сообщение.",
"couldnt_update_post": "Не получилось обновить запись",
"couldnt_create_private_message": "Не удалось создать личное сообщение.",
"no_private_message_edit_allowed": "Не разрешается редактировать личное сообщение.",
"post_title_too_long": "Длина названия записи превышает допустимый лимит.",
"email_already_exists": "E-mail уже существует.",
"user_already_exists": "Пользователь уже существует.",
"unsubscribe": "Отписаться",
"subscribe": "Подписаться",
"messages": "Сообщения",
"banned_users": "Забаненные пользователи",
"delete_account_confirm": "Предупреждение: это действие полностью уничтожит все данные вашего аккаунта. Введите свой пароль для подтверждения.",
"new_password": "Новый пароль",
"verify_password": "Повторите пароль",
"old_password": "Действующий пароль",
"show_avatars": "Показывать аватары",
"search": "Поиск",
"send_message": "Послать сообщение",
"top_day": "Лучшее за день",
"top_week": "Лучшее за неделю",
"top_month": "Лучшее за месяц",
"top_year": "Лучшее за год",
"top_all": "Лучшее за все время",
"active": "Активное"
}

111
lib/l10n/intl_sq.arb Normal file
View File

@ -0,0 +1,111 @@
{
"@@locale": "sq",
"settings": "Konfigurimet",
"password": "Fjalëkalimi",
"email_or_username": "Email-i ose Emri Virtual",
"posts": "Postime",
"comments": "Komentet",
"modlog": "Ditari i moderimit",
"community": "Komuniteti",
"url": "URL",
"title": "Titulli",
"body": "Teksti",
"nsfw": "NSFW",
"post": "publiko",
"save": "ruaj",
"subscribed": "Jeni abonuar",
"all": "Gjithçka",
"replies": "Përgjigjet",
"mentions": "Përmendur",
"from": "nga",
"to": "në",
"deleted_by_creator": "është fshirë nga autori",
"more": "më shumë",
"mark_as_read": "shëno si të lexuar",
"mark_as_unread": "shëno si të palexuar",
"reply": "përgjigju",
"edit": "redakto",
"delete": "fshije",
"restore": "riktheje",
"yes": "po",
"no": "jo",
"avatar": "Fotoja e profilit",
"email": "Email",
"matrix_user": "Përdorues i Matrix-it",
"sort_type": "Radhit sipas",
"type": "Lloji",
"show_nsfw": "Shfaq përmbajtje NSFW",
"send_notifications_to_email": "Dërgo njoftimet në Email",
"delete_account": "Fshije Account-in",
"saved": "E ruajtur",
"communities": "Komunitetet",
"users": "Përdoruesit",
"theme": "Pamja",
"language": "Gjuha",
"hot": "Popullore",
"new_": "Të rejat",
"old": "Të vjetrat",
"top": "Më të pëqlyerat",
"chat": "Chat",
"admin": "administrator",
"by": "nga",
"not_an_admin": "Nuk je administrator.",
"couldnt_find_post": "Nuk mund të gjendeshin postimet.",
"not_logged_in": "Nuk jeni kyçur.",
"site_ban": "Jeni dëbuar nga kjo faqe",
"community_ban": "Jeni dëbuar nga ky komunitet.",
"downvotes_disabled": "Votat negative janë të çaktivizuara",
"locked": "mbyllur",
"couldnt_create_comment": "Krijimi i komentit nuk ishte i mundshëm.",
"couldnt_like_comment": "Pëlqimi i komentit nuk ishte i mundshëm.",
"couldnt_update_comment": "Përditësimi i komentit nuk ishte i mundshëm.",
"no_comment_edit_allowed": "Nuk të lejohet redaktimi i komentit.",
"couldnt_save_comment": "Ruajtja e komentit nuk ishte e mundshme.",
"couldnt_get_comments": "Nuk mund të merrnim komentet.",
"couldnt_create_post": "Nuk mund të krijohej postimi.",
"couldnt_like_post": "Nuk mund të pëlqehej postimi.",
"couldnt_find_community": "Komuniteti nuk mund të gjendej.",
"couldnt_get_posts": "Nuk mund të merreshin postimet",
"no_post_edit_allowed": "Nuk lejohet redaktimi i postimit.",
"couldnt_save_post": "Postimi nuk u ruajt.",
"site_already_exists": "Faqja tashmë ekziston.",
"couldnt_update_site": "Faqja nuk mund të përditësohej.",
"invalid_community_name": "Emër invalid.",
"community_already_exists": "Komuniteti ekziston më.",
"community_moderator_already_exists": "Moderatori i komunitetit tashmë ekziston.",
"community_follower_already_exists": "Ndjekësi i komunitetit tashmë ekziston.",
"couldnt_update_community": "Komuniteti nuk mundi të përditësohej.",
"no_community_edit_allowed": "Nuk të lejohet redaktimi i komunitetit.",
"system_err_login": "Gabim sistemi. Provo të shkyçesh dhe të kyçesh përsëri.",
"community_user_already_banned": "Anëtari i komunitetit tashmë është dëbuar.",
"couldnt_find_that_username_or_email": "Nuk mund të gjendej ky emër virtual ose email.",
"password_incorrect": "Fjalëkalimi është i pasaktë.",
"registration_closed": "Regjistrimi u mbyll",
"passwords_dont_match": "Fjalëkalimet nuk janë të njëjta.",
"invalid_username": "Emri virtual është invalid.",
"couldnt_update_user": "Përditësimi i përdoruesit nuk ishte i mundshëm.",
"couldnt_update_private_message": "Nuk mundëm të përditësonim mesazhin privat.",
"couldnt_update_post": "Postimi nuk mundi të përditësohej",
"couldnt_create_private_message": "Nuk mund të krijohej mesazhi privat.",
"no_private_message_edit_allowed": "Nuk lejohet redaktimi i mesazhit privat.",
"post_title_too_long": "Titulli i postimit ishte shumë i gjatë.",
"email_already_exists": "Email-i tashmë ekziston.",
"user_already_exists": "Përdoruesi tashmë ekziston.",
"number_of_users_online": "{count,plural, =1{{count} Përdorues Online} other{{count} Përdoruesa Online}}",
"number_of_comments": "{count,plural, =1{{count} Koment} other{{count} Komente}}",
"number_of_posts": "{count,plural, =1{{count} Postim} other{{count} Postime}}",
"number_of_subscribers": "{count,plural, =1{{count} i abonuar} other{{count} të abonuar}}",
"number_of_users": "{count,plural, =1{{count} Përdorues} other{{count} Përdoruesa}}",
"unsubscribe": "Ndalo Abonimin",
"subscribe": "Abonohu",
"messages": "Mesazhet",
"banned_users": "Pëdoruesit e dëbuar",
"delete_account_confirm": "Paralajmërim: kjo do të fshij të gjitha të dhënat e juaja përgjithmonë. Shtyp fjalëkalimin tënd për ta konfirmuar.",
"new_password": "Fjalëkalimi i ri",
"verify_password": "Konfirmo Fjalëkalimin",
"old_password": "Fjalëkalimi i vjetër",
"show_avatars": "Shfaq fotot e profilit",
"search": "Kërko",
"send_message": "Dërgo Mesazh",
"top_day": "Më të pëlqyerat e ditës"
}

1
lib/l10n/intl_sr.arb Normal file
View File

@ -0,0 +1 @@
{}

25
lib/l10n/intl_sr_Latn.arb Normal file
View File

@ -0,0 +1,25 @@
{
"@@locale": "sr_Latn",
"password": "Lozinka",
"community": "Zajednica",
"url": "URL",
"body": "Sadržaj",
"nsfw": "NSFW",
"from": "od",
"to": "do",
"yes": "da",
"no": "ne",
"email": "Email",
"matrix_user": "Korisnik Matrixa",
"show_nsfw": "Prikaži NSFW sadržaj",
"send_notifications_to_email": "Primajte notifikacie na Vaš Email",
"theme": "Tema",
"language": "Jezik",
"chat": "Ćaskanje",
"by": "od",
"downvotes_disabled": "Onemogućite negativne glasove",
"registration_closed": "Zatvorena registracija",
"new_password": "Nova Lozinka",
"verify_password": "Potvrdite Loziku",
"old_password": "Stara Lozinka"
}

131
lib/l10n/intl_sv.arb Normal file
View File

@ -0,0 +1,131 @@
{
"@@locale": "sv",
"settings": "Inställningar",
"password": "Lösenord",
"email_or_username": "E-postadress eller användarnamn",
"posts": "Inlägg",
"comments": "Kommentarer",
"modlog": "Moderationslogg",
"community": "Gemenskap",
"url": "URL",
"title": "Titel",
"body": "Text",
"nsfw": "Känsligt eller oförbehållsamt innehåll",
"post": "publicera",
"save": "spara",
"subscribed": "Prenumererar",
"local": "Lokalt",
"all": "Allt",
"replies": "Svar",
"mentions": "Nämner",
"from": "från",
"to": "till",
"deleted_by_creator": "raderad av skapare",
"more": "mer",
"mark_as_read": "markera som läst",
"mark_as_unread": "markera som oläst",
"reply": "svara",
"edit": "redigera",
"delete": "radera",
"restore": "återställ",
"yes": "ja",
"no": "nej",
"avatar": "Profilbild",
"banner": "Omslagsbild",
"display_name": "Visningsnamn",
"bio": "Presentation",
"email": "E-postadress",
"matrix_user": "Matrix-användare",
"sort_type": "Sortering",
"type": "Typ",
"show_nsfw": "Visa känsligt eller oförbehållsamt innehåll",
"send_notifications_to_email": "Skicka aviseringar till e-postadress",
"delete_account": "Ta bort konto",
"saved": "Sparade",
"communities": "Gemenskaper",
"users": "Användare",
"theme": "Utseende",
"language": "Språk",
"hot": "Hett",
"new_": "Nytt",
"old": "Gammalt",
"top": "Topp",
"chat": "Chatta",
"admin": "administratör",
"by": "av",
"not_an_admin": "Inte en administratör.",
"couldnt_find_post": "Kunde inte hitta inlägg.",
"not_logged_in": "Inte inloggad.",
"site_ban": "Du har blockerats från webbplatsen",
"community_ban": "Du har blockerats från den här gemenskapen.",
"downvotes_disabled": "Nedröstningar inaktiverade",
"invalid_url": "Ogiltig URL.",
"locked": "låst",
"couldnt_create_comment": "Kunde inte skapa kommentar.",
"couldnt_like_comment": "Kunde inte gilla kommentar.",
"couldnt_update_comment": "Kunde inte uppdatera kommentar.",
"no_comment_edit_allowed": "Har inte behörighet att redigera kommentar.",
"couldnt_save_comment": "Kunde inte spara kommentar.",
"couldnt_get_comments": "Kunde inte hämta kommentarer.",
"report_reason_required": "En anledning måste anges.",
"report_too_long": "Anmälan är för lång.",
"couldnt_create_report": "Kunde inte skapa anmälan.",
"couldnt_resolve_report": "Kunde inte markera anmälan som löst.",
"invalid_post_title": "Ogiltig inläggstitel",
"couldnt_create_post": "Kunde inte skapa inlägg.",
"couldnt_like_post": "Kunde inte gilla inlägg.",
"couldnt_find_community": "Kunde inte hitta gemenskap.",
"couldnt_get_posts": "Kunde inte hämta inlägg",
"no_post_edit_allowed": "Har inte behörighet att redigera inlägg.",
"couldnt_save_post": "Kunde inte spara inlägg.",
"site_already_exists": "Webbplatsen finns redan.",
"couldnt_update_site": "Kunde inte uppdatera webbplats.",
"invalid_community_name": "Ogiltigt namn.",
"community_already_exists": "Gemenskapen finns redan.",
"community_moderator_already_exists": "Gemenskapsmoderatorn finns redan.",
"community_follower_already_exists": "Gemenskapsföljaren finns redan.",
"not_a_moderator": "Inte en moderator.",
"couldnt_update_community": "Kunde inte uppdatera gemenskap.",
"no_community_edit_allowed": "Har inte behörighet att redigera gemenskap.",
"system_err_login": "Systemfel. Försök att logga ut och sedan in igen.",
"community_user_already_banned": "Gemenskapsanvändaren redan blockerad.",
"couldnt_find_that_username_or_email": "Kunde inte hitta det användarnamnet eller e-postadressen.",
"password_incorrect": "Ogiltigt lösenord.",
"registration_closed": "Registrering stängd",
"invalid_password": "Ogiltigt lösenord. Lösenordet måste innehålla minst 60 tecken.",
"passwords_dont_match": "Lösenorden stämmer inte överens.",
"captcha_incorrect": "Captchan stämmer inte.",
"invalid_username": "Ogiltigt användarnamn.",
"bio_length_overflow": "Användarpresentationen får inte innehålla fler än 300 tecken.",
"couldnt_update_user": "Kunde inte uppdatera användare.",
"couldnt_update_private_message": "Kunde inte uppdatera privat meddelande.",
"couldnt_update_post": "Kunde inte uppdatera inlägg",
"couldnt_create_private_message": "Kunde inte skapa privat meddelande.",
"no_private_message_edit_allowed": "Inte tillåtet att redigera privata meddelanden.",
"post_title_too_long": "Inläggstiteln är för lång.",
"email_already_exists": "E-post finns redan.",
"user_already_exists": "Användaren finns redan.",
"number_of_users_online": "{count,plural, =1{{count} användare inloggad} other{{count} användare inloggade}}",
"number_of_comments": "{count,plural, =1{{count} kommentar} other{{count} kommentarer}}",
"number_of_posts": "{count,plural, =1{{count} inlägg} other{{count} inlägg}}",
"number_of_subscribers": "{count,plural, =1{{count} prenumerant} other{{count} prenumeranter}}",
"number_of_users": "{count,plural, =1{{count} användare} other{{count} användare}}",
"unsubscribe": "Avsluta prenumeration",
"subscribe": "Prenumerera",
"messages": "Meddelanden",
"banned_users": "Blockerade användare",
"delete_account_confirm": "Varning: den här åtgärden kommer radera alla dina data permanent. Skriv in ditt lösenord för att bekräfta.",
"new_password": "Nytt lösenord",
"verify_password": "Bekräfta lösenord",
"old_password": "Gammalt lösenord",
"show_avatars": "Visa profilbilder",
"search": "Sök",
"send_message": "Skicka meddelande",
"top_day": "Dagstoppen",
"top_week": "Veckotoppen",
"top_month": "Månadstoppen",
"top_year": "Årstoppen",
"top_all": "Totaltoppen",
"most_comments": "Flest kommentarer",
"active": "Aktivt"
}

3
lib/l10n/intl_th.arb Normal file
View File

@ -0,0 +1,3 @@
{
"@@locale": "th"
}

111
lib/l10n/intl_tr.arb Normal file
View File

@ -0,0 +1,111 @@
{
"@@locale": "tr",
"settings": "Ayarlar",
"password": "Şifre",
"email_or_username": "E-mail ya da Kullanıcı Adı",
"posts": "Paylaşımlar",
"comments": "Yorumlar",
"modlog": "İdare geçmişi",
"community": "Topluluk",
"url": "URL",
"title": "Başlık",
"body": "Metin",
"nsfw": "Müstehcen",
"post": "paylaşım",
"save": "kaydet",
"subscribed": "Takibe alındı",
"all": "Hepsi",
"replies": "Cevaplar",
"mentions": "Bahisler",
"from": "tarafından",
"to": "tarafına",
"deleted_by_creator": "yazarı tarafından silindi",
"more": "dahası",
"mark_as_read": "okunmuş olarak işaretle",
"mark_as_unread": "okunmamış olarak işaretle",
"reply": "cevapla",
"edit": "düzenle",
"delete": "sil",
"restore": "geri al",
"yes": "evet",
"no": "hayır",
"avatar": "Avatar",
"email": "E-mail",
"matrix_user": "Matrix Kullanıcısı",
"sort_type": "Sıralama metodu",
"type": "Tür",
"show_nsfw": "Müstehcen içerikleri göster",
"send_notifications_to_email": "E-maile bildirim yolla",
"delete_account": "Hesabı Sil",
"saved": "Kaydedildi",
"communities": "Topluluklar",
"users": "Kullanıcılar",
"theme": "Tema",
"language": "Dil",
"hot": "Flaş",
"new_": "Yeni",
"old": "Eski",
"top": "En iyiler",
"chat": "Sohbet",
"admin": "baş idareci",
"by": "tarafından",
"not_an_admin": "Baş idareci değil.",
"couldnt_find_post": "Paylaşım bulunamadı.",
"not_logged_in": "Hesaba giriş yapılmamış.",
"site_ban": "Bu siteden yasaklandınız",
"community_ban": "Bu topluluğa yazmanız yasaklandı.",
"downvotes_disabled": "Eksi puan verme özelliği kaldırıldı",
"locked": "kilitlendi",
"couldnt_create_comment": "Yorum yapılamadı.",
"couldnt_like_comment": "Yorum beğenilemedi.",
"couldnt_update_comment": "Yorum güncellenemedi.",
"no_comment_edit_allowed": "Yorumu düzenleme izniniz yok.",
"couldnt_save_comment": "Yorum kaydedilemedi.",
"couldnt_get_comments": "Yorumlar yüklenemedi.",
"couldnt_create_post": "Paylaşım yapılamadı.",
"couldnt_like_post": "Paylaşım beğenilemedi.",
"couldnt_find_community": "Topluluk bulunamadı.",
"couldnt_get_posts": "Paylaşımlar yüklenemedi",
"no_post_edit_allowed": "Paylaşımı düzenleme izniniz yok.",
"couldnt_save_post": "Paylaşım kaydedilemedi.",
"site_already_exists": "Bu site zaten var.",
"couldnt_update_site": "Site güncellenemedi.",
"invalid_community_name": "Hatalı ad.",
"community_already_exists": "Böyle bir topluluk zaten var.",
"community_moderator_already_exists": "Bu kullanıcı zaten bu topluluğun bir idarecisi.",
"community_follower_already_exists": "Topluluğun böyle bir takipçisi zaten var.",
"couldnt_update_community": "Topluluk bilgisi güncellenemedi.",
"no_community_edit_allowed": "Topluluğu düzenleme yetkiniz yok.",
"system_err_login": "Sistem hatası. Hesaptan çıkıp tekrar girmeyi deneyin.",
"community_user_already_banned": "Bu kullanıcı zaten bu toplulukta yasaklı.",
"couldnt_find_that_username_or_email": "Böyle bir e-mail ya da kullanıcı adı bulunamadı.",
"password_incorrect": "Şifre yanlış.",
"registration_closed": "Kayıt kapalı",
"passwords_dont_match": "Şifreler eşleşmiyor.",
"invalid_username": "Hatalı kullanıcı adı.",
"couldnt_update_user": "Kullanıcı bilgisi güncellenemedi.",
"couldnt_update_private_message": "Şahsa özel mesaj güncellenemedi.",
"couldnt_update_post": "Paylaşım güncellenemedi",
"couldnt_create_private_message": "Şahsa özel mesaj yaratılamadı.",
"no_private_message_edit_allowed": "Şahsa özel mesajı düzenlemek mümkün değil.",
"post_title_too_long": "Paylaşım başlığı çok uzun.",
"email_already_exists": "Böyle bir e-mail adresi zaten var.",
"user_already_exists": "Böyle bir kullanıcı zaten var.",
"number_of_users_online": "{count,plural, =1{{count} Kullanıcı Hatta} other{{count} Kullanıcı Hatta}}",
"number_of_comments": "{count,plural, =1{{count} Yorum} other{{count} Yorum}}",
"number_of_posts": "{count,plural, =1{{count} Paylaşım} other{{count} Paylaşım}}",
"number_of_subscribers": "{count,plural, =1{{count} Takipçi} other{{count} Takipçi}}",
"number_of_users": "{count,plural, =1{{count} Kullanıcı} other{{count} Kullanıcı}}",
"unsubscribe": "Takibi bırak",
"subscribe": "Takip et",
"messages": "Mesajlar",
"banned_users": "Yasaklanmış Kullanıcılar",
"delete_account_confirm": "Uyarı: Devam etmek bütün verilerinizi kalıcı olarak silecektir. Onaylamak için şifrenizi girin.",
"new_password": "Yeni şifre",
"verify_password": "Şifreyi doğrulayın",
"old_password": "Eski şifre",
"show_avatars": "Avatarları Göster",
"search": "Ara",
"send_message": "Mesaj Yolla",
"top_day": "Günün en iyileri"
}

106
lib/l10n/intl_uk.arb Normal file
View File

@ -0,0 +1,106 @@
{
"@@locale": "uk",
"settings": "Налаштування",
"password": "Пароль",
"email_or_username": "email або ім'я користувача",
"posts": "Записи",
"comments": "Коментарі",
"modlog": "Модлог",
"community": "Спільнота",
"url": "URL",
"title": "Назва",
"body": "Тіло",
"nsfw": "NSFW",
"post": "Запис",
"save": "зберегти",
"subscribed": "Підписані",
"all": "Все",
"replies": "Відповіді",
"mentions": "Згадування",
"from": "від",
"to": "в",
"deleted_by_creator": "видалено автором",
"more": "більше",
"mark_as_read": "позначити як прочитані",
"mark_as_unread": "позначити як непрочитані",
"reply": "відповісти",
"edit": "редагувати",
"delete": "видалити",
"restore": "відновити",
"yes": "так",
"no": "ні",
"avatar": "Аватар",
"email": "email",
"matrix_user": "Matrix айді користувача",
"sort_type": "Тип сортування",
"type": "Тип",
"show_nsfw": "Показувати NSFW-контент",
"send_notifications_to_email": "Посилати повідомлення на e-mail адресу",
"delete_account": "Видалити акаунт",
"saved": "Збережено",
"communities": "Спільноти",
"users": "Користувачі",
"theme": "Візуальна тема",
"language": "Мова",
"hot": "Популярне",
"new_": "Нове",
"old": "Старе",
"top": "Найкраще",
"chat": "Чат",
"admin": "адміністратор",
"by": "від",
"not_an_admin": "Не адміністратор.",
"couldnt_find_post": "Не вдалося знайти запис.",
"not_logged_in": "Не авторизовані.",
"site_ban": "Ви були заблоковані на данному сайті",
"community_ban": "Ви були заблоковані в цій спільноті.",
"downvotes_disabled": "Від'ємне голосування вимкненно.",
"locked": "заблоковоано",
"couldnt_create_comment": "Не вдалося створити коментар.",
"couldnt_like_comment": "Не вдалося лайкнути коментар.",
"couldnt_update_comment": "Не вдалося обновити коментар.",
"no_comment_edit_allowed": "Неможливо відредагувати коментар.",
"couldnt_save_comment": "Не вдалося зберегти коментар.",
"couldnt_get_comments": "Не вдалося отримати коментар.",
"couldnt_create_post": "Не вдалося створити запис.",
"couldnt_like_post": "Не вдалося лайкнути запис.",
"couldnt_find_community": "Не вдалося знайти спільноту.",
"couldnt_get_posts": "Не вдалося знайти записи",
"no_post_edit_allowed": "Неможливо відредагувати запис.",
"couldnt_save_post": "Не вдалося зберегти запис.",
"site_already_exists": "Сайт вже існує.",
"couldnt_update_site": "Не вдалося оновити сайт.",
"invalid_community_name": "Неправильне ім'я користувача.",
"community_already_exists": "Спільнота вже існує.",
"community_moderator_already_exists": "Модератор спільноти вже існує.",
"community_follower_already_exists": "Підписник спільноти вже існує.",
"couldnt_update_community": "Не вдалося обновити спільноту.",
"no_community_edit_allowed": "Неможливо відредагувати спільноту.",
"system_err_login": "Системна помилка. Спробуйте вийти та зайти назад.",
"community_user_already_banned": "Член спільноти вже забаниний..",
"couldnt_find_that_username_or_email": "Не вдалося знайти ім'я користувача чи email.",
"password_incorrect": "Неправильний пароль.",
"registration_closed": "Реєстрацію закрито",
"passwords_dont_match": "Паролі не співпадають.",
"invalid_username": "Неправильне ім'я користувача.",
"couldnt_update_user": "Не вдалося оновити користувача.",
"couldnt_update_private_message": "Не вдалося оновити особисте повідомлення.",
"couldnt_update_post": "Не вдалося обновити запис",
"couldnt_create_private_message": "Не вдалося отримати особисте повідомлення.",
"no_private_message_edit_allowed": "Не можна редагувати особисті повідомлення.",
"post_title_too_long": "Довжина назви перебільшує допустимий ліміт.",
"email_already_exists": "E-mail вже існує.",
"user_already_exists": "Користувач вже існує.",
"unsubscribe": "Відписатися",
"subscribe": "Підписатися",
"messages": "Повідомлення",
"banned_users": "Забанані користувачі",
"delete_account_confirm": "Попередження: ця дія повністю знищить всі данні вашего акаунта. Введіть свій пароль для підтвердження.",
"new_password": "Новий пароль",
"verify_password": "Повторіть пароль",
"old_password": "Діючий пароль",
"show_avatars": "Показувати аватари",
"search": "Пошук",
"send_message": "Послати повідомлення",
"top_day": "Найкраще за день"
}

132
lib/l10n/intl_zh.arb Normal file
View File

@ -0,0 +1,132 @@
{
"@@locale": "zh",
"settings": "设置",
"password": "密码",
"email_or_username": "邮箱或用户名",
"posts": "帖子",
"comments": "评论",
"modlog": "管理记录",
"community": "社群",
"url": "相关网址",
"title": "标语",
"body": "内容",
"nsfw": "工作场所不宜",
"post": "回帖",
"save": "保存",
"subscribed": "已订阅",
"local": "本地",
"all": "所有",
"replies": "回复",
"mentions": "提到",
"from": "由",
"to": "发布到",
"deleted_by_creator": "作者已删除",
"more": "更多",
"mark_as_read": "标记为已读",
"mark_as_unread": "标记为未读",
"reply": "回复",
"edit": "编辑",
"delete": "删除",
"restore": "恢复",
"yes": "是",
"no": "否",
"avatar": "头像",
"banner": "横幅",
"display_name": "显示名称",
"bio": "简介",
"email": "邮箱",
"matrix_user": "Matrix用户",
"sort_type": "排序方式",
"type": "类型",
"show_nsfw": "显示工作场所不宜内容",
"send_notifications_to_email": "向邮箱发送通知",
"delete_account": "删除账号",
"saved": "保存",
"communities": "社群",
"users": "用户",
"theme": "主题",
"language": "语言",
"hot": "最热",
"new_": "最新",
"old": "最早",
"top": "推荐",
"chat": "聊天",
"admin": "总管理员",
"by": " ",
"not_an_admin": "不是管理员。",
"couldnt_find_post": "无法找到帖子。",
"not_logged_in": "未登录.",
"site_ban": "你已被本站拉黑",
"community_ban": "你已被此社群拉黑。",
"downvotes_disabled": "踩已禁用",
"invalid_url": "URL无效.",
"locked": "已锁定",
"couldnt_create_comment": "无法创建评论。",
"couldnt_like_comment": "无法点赞评论。",
"couldnt_update_comment": "无法更新评论。",
"no_comment_edit_allowed": "没有编辑评论的权限。",
"couldnt_save_comment": "无法保存评论。",
"couldnt_get_comments": "无法获取评论。",
"report_reason_required": "需要报告原因.",
"report_too_long": "报告时间过长.",
"couldnt_create_report": "无法创建报告.",
"couldnt_resolve_report": "无法解析报告.",
"invalid_post_title": "帖子标题无效",
"couldnt_create_post": "无法创建帖子。",
"couldnt_like_post": "无法点赞帖子。",
"couldnt_find_community": "无法找到社群。",
"couldnt_get_posts": "无法获取帖子",
"no_post_edit_allowed": "没有编辑帖子的权限。",
"couldnt_save_post": "无法保存帖子。",
"site_already_exists": "站点已存在。",
"couldnt_update_site": "无法更新站点。",
"invalid_community_name": "无效名称.",
"community_already_exists": "社群已存在。",
"community_moderator_already_exists": "社群监管人已存在。",
"community_follower_already_exists": "社群关注者已存在。",
"not_a_moderator": "不是仲裁员.",
"couldnt_update_community": "无法更新社群。",
"no_community_edit_allowed": "没有编辑社群的权限。",
"system_err_login": "系统错误。请尝试注销后重新登入。",
"community_user_already_banned": "社群用户已被禁止。",
"couldnt_find_that_username_or_email": "用户名/邮箱不存在。",
"password_incorrect": "密码不正确。",
"registration_closed": "注册功能已关闭",
"invalid_password": "密码无效。密码长度必须小于60个字符。",
"passwords_dont_match": "密码不匹配。",
"captcha_incorrect": "验证码不正确。",
"invalid_username": "用户名无效",
"bio_length_overflow": "自我介绍不能超过300个字符。",
"couldnt_update_user": "无法更新用户。",
"couldnt_update_private_message": "无法更新私信。",
"couldnt_update_post": "无法更新帖子",
"couldnt_create_private_message": "无法创建私信。",
"no_private_message_edit_allowed": "没有编辑私信的权限。",
"post_title_too_long": "帖子标题过长。",
"email_already_exists": "邮箱已占用.",
"user_already_exists": "用户已存在。",
"number_of_users_online": "{count,plural, =1{{count} 在线用户} other{{count} 名在线用户}}",
"number_of_comments": "{count,plural, =1{{count} 条评论} other{{count} 条评论}}",
"number_of_posts": "{count,plural, =1{{count} 个帖子} other{{count} 条帖子}}",
"number_of_subscribers": "{count,plural, =1{{count} 订阅者} other{{count} 名订阅者}}",
"number_of_users": "{count,plural, =1{{count} 用户} other{{count} 名用户}}",
"unsubscribe": "取消订阅",
"subscribe": "订阅",
"messages": "信息",
"banned_users": "被禁止用户",
"delete_account_confirm": "警告:此操作将永久删除你的数据,请输入密码进行确认。",
"new_password": "新密码",
"verify_password": "确认密码",
"old_password": "当前密码",
"show_avatars": "显示头像",
"search": "搜索",
"send_message": "发送消息",
"top_day": "日推荐",
"top_week": "周推荐",
"top_month": "月推荐",
"top_year": "年推荐",
"top_all": "全部推荐",
"most_comments": "最多评论",
"new_comments": "新评论",
"active": "活跃"
}

61
lib/l10n/l10n.dart Normal file
View File

@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
export 'package:flutter_gen/gen_l10n/l10n.dart';
export 'l10n_api.dart';
export 'l10n_from_string.dart';
abstract class LocaleSerde {
static Locale fromJson(String json) {
if (json == null) return null;
final lang = json.split('-');
return Locale(lang[0], lang.length > 1 ? lang[1] : null);
}
static String toJson(Locale locale) => locale.toLanguageTag();
}
const _languageNames = {
'ca': 'Català',
'ar': 'عربي',
'en': 'English',
'el': 'Ελληνικά',
'eu': 'Euskara',
'eo': 'Esperanto',
'es': 'Español',
'da': 'Dansk',
'de': 'Deutsch',
'ga': 'Gaeilge',
'gl': 'Galego',
'hr': 'hrvatski',
'hu': 'Magyar Nyelv',
'ka': 'ქართული ენა',
'ko': '한국어',
'km': 'ភាសាខ្មែរ',
'hi': 'मानक हिन्दी',
'fa': 'فارسی',
'ja': '日本語',
'oc': 'Occitan',
'pl': 'Polski',
'pt': 'Português',
'pt_BR': 'Português Brasileiro',
'zh': '中文',
'fi': 'Suomi',
'fr': 'Français',
'sv': 'Svenska',
'sq': 'Shqip',
'sr_Latn': 'srpski',
'th': 'ภาษาไทย',
'tr': 'Türkçe',
'uk': 'Українська Mова',
'ru': 'Русский',
'nl': 'Nederlands',
'it': 'Italiano',
};
extension LanguageName on Locale {
/// returns the name of the language in the given language
String get languageName => _languageNames[toString()] ?? toString();
}

70
lib/l10n/l10n_api.dart Normal file
View File

@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:lemmy_api_client/v2.dart';
extension SortTypeL10n on SortType {
String tr(BuildContext context) {
switch (this) {
case SortType.hot:
return L10n.of(context).hot;
case SortType.new_:
return L10n.of(context).new_;
case SortType.topYear:
return L10n.of(context).top_year;
case SortType.topMonth:
return L10n.of(context).top_month;
case SortType.topWeek:
return L10n.of(context).top_week;
case SortType.topDay:
return L10n.of(context).top_day;
case SortType.topAll:
return L10n.of(context).top_all;
case SortType.newComments:
return L10n.of(context).new_comments;
case SortType.active:
return L10n.of(context).active;
case SortType.mostComments:
return L10n.of(context).most_comments;
default:
throw Exception('unreachable');
}
}
}
extension PostListingTypeL10n on PostListingType {
String tr(BuildContext context) {
switch (this) {
case PostListingType.all:
return L10n.of(context).all;
case PostListingType.community:
return L10n.of(context).community;
case PostListingType.local:
return L10n.of(context).local;
case PostListingType.subscribed:
return L10n.of(context).subscribed;
default:
throw Exception('unreachable');
}
}
}
extension SearchTypeL10n on SearchType {
String tr(BuildContext context) {
switch (this) {
case SearchType.all:
return L10n.of(context).all;
case SearchType.comments:
return L10n.of(context).comments;
case SearchType.communities:
return L10n.of(context).communities;
case SearchType.posts:
return L10n.of(context).posts;
case SearchType.url:
return L10n.of(context).url;
case SearchType.users:
return L10n.of(context).users;
default:
throw Exception('unreachable');
}
}
}

View File

@ -0,0 +1,404 @@
// FILE GENERATED AUTOMATICALLY, TO NOT EDIT BY HAND
// ignore_for_file: constant_identifier_names
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
abstract class L10nStrings {
static const settings = 'settings';
static const password = 'password';
static const email_or_username = 'email_or_username';
static const posts = 'posts';
static const comments = 'comments';
static const modlog = 'modlog';
static const community = 'community';
static const url = 'url';
static const title = 'title';
static const body = 'body';
static const nsfw = 'nsfw';
static const post = 'post';
static const save = 'save';
static const subscribed = 'subscribed';
static const local = 'local';
static const all = 'all';
static const replies = 'replies';
static const mentions = 'mentions';
static const from = 'from';
static const to = 'to';
static const deleted_by_creator = 'deleted_by_creator';
static const more = 'more';
static const mark_as_read = 'mark_as_read';
static const mark_as_unread = 'mark_as_unread';
static const reply = 'reply';
static const edit = 'edit';
static const delete = 'delete';
static const restore = 'restore';
static const yes = 'yes';
static const no = 'no';
static const avatar = 'avatar';
static const banner = 'banner';
static const display_name = 'display_name';
static const bio = 'bio';
static const email = 'email';
static const matrix_user = 'matrix_user';
static const sort_type = 'sort_type';
static const type = 'type';
static const show_nsfw = 'show_nsfw';
static const send_notifications_to_email = 'send_notifications_to_email';
static const delete_account = 'delete_account';
static const saved = 'saved';
static const communities = 'communities';
static const users = 'users';
static const theme = 'theme';
static const language = 'language';
static const hot = 'hot';
static const new_ = 'new_';
static const old = 'old';
static const top = 'top';
static const chat = 'chat';
static const admin = 'admin';
static const by = 'by';
static const not_a_mod_or_admin = 'not_a_mod_or_admin';
static const not_an_admin = 'not_an_admin';
static const couldnt_find_post = 'couldnt_find_post';
static const not_logged_in = 'not_logged_in';
static const site_ban = 'site_ban';
static const community_ban = 'community_ban';
static const downvotes_disabled = 'downvotes_disabled';
static const invalid_url = 'invalid_url';
static const locked = 'locked';
static const couldnt_create_comment = 'couldnt_create_comment';
static const couldnt_like_comment = 'couldnt_like_comment';
static const couldnt_update_comment = 'couldnt_update_comment';
static const no_comment_edit_allowed = 'no_comment_edit_allowed';
static const couldnt_save_comment = 'couldnt_save_comment';
static const couldnt_get_comments = 'couldnt_get_comments';
static const report_reason_required = 'report_reason_required';
static const report_too_long = 'report_too_long';
static const couldnt_create_report = 'couldnt_create_report';
static const couldnt_resolve_report = 'couldnt_resolve_report';
static const invalid_post_title = 'invalid_post_title';
static const couldnt_create_post = 'couldnt_create_post';
static const couldnt_like_post = 'couldnt_like_post';
static const couldnt_find_community = 'couldnt_find_community';
static const couldnt_get_posts = 'couldnt_get_posts';
static const no_post_edit_allowed = 'no_post_edit_allowed';
static const couldnt_save_post = 'couldnt_save_post';
static const site_already_exists = 'site_already_exists';
static const couldnt_update_site = 'couldnt_update_site';
static const invalid_community_name = 'invalid_community_name';
static const community_already_exists = 'community_already_exists';
static const community_moderator_already_exists =
'community_moderator_already_exists';
static const community_follower_already_exists =
'community_follower_already_exists';
static const not_a_moderator = 'not_a_moderator';
static const couldnt_update_community = 'couldnt_update_community';
static const no_community_edit_allowed = 'no_community_edit_allowed';
static const system_err_login = 'system_err_login';
static const community_user_already_banned = 'community_user_already_banned';
static const couldnt_find_that_username_or_email =
'couldnt_find_that_username_or_email';
static const password_incorrect = 'password_incorrect';
static const registration_closed = 'registration_closed';
static const invalid_password = 'invalid_password';
static const passwords_dont_match = 'passwords_dont_match';
static const captcha_incorrect = 'captcha_incorrect';
static const invalid_username = 'invalid_username';
static const bio_length_overflow = 'bio_length_overflow';
static const couldnt_update_user = 'couldnt_update_user';
static const couldnt_update_private_message =
'couldnt_update_private_message';
static const couldnt_update_post = 'couldnt_update_post';
static const couldnt_create_private_message =
'couldnt_create_private_message';
static const no_private_message_edit_allowed =
'no_private_message_edit_allowed';
static const post_title_too_long = 'post_title_too_long';
static const email_already_exists = 'email_already_exists';
static const user_already_exists = 'user_already_exists';
static const number_of_users_online = 'number_of_users_online';
static const number_of_comments = 'number_of_comments';
static const number_of_posts = 'number_of_posts';
static const number_of_subscribers = 'number_of_subscribers';
static const number_of_users = 'number_of_users';
static const unsubscribe = 'unsubscribe';
static const subscribe = 'subscribe';
static const messages = 'messages';
static const banned_users = 'banned_users';
static const delete_account_confirm = 'delete_account_confirm';
static const new_password = 'new_password';
static const verify_password = 'verify_password';
static const old_password = 'old_password';
static const show_avatars = 'show_avatars';
static const search = 'search';
static const send_message = 'send_message';
static const top_day = 'top_day';
static const top_week = 'top_week';
static const top_month = 'top_month';
static const top_year = 'top_year';
static const top_all = 'top_all';
static const most_comments = 'most_comments';
static const new_comments = 'new_comments';
static const active = 'active';
}
extension L10nFromString on String {
String tr(BuildContext context) {
switch (this) {
case L10nStrings.settings:
return L10n.of(context).settings;
case L10nStrings.password:
return L10n.of(context).password;
case L10nStrings.email_or_username:
return L10n.of(context).email_or_username;
case L10nStrings.posts:
return L10n.of(context).posts;
case L10nStrings.comments:
return L10n.of(context).comments;
case L10nStrings.modlog:
return L10n.of(context).modlog;
case L10nStrings.community:
return L10n.of(context).community;
case L10nStrings.url:
return L10n.of(context).url;
case L10nStrings.title:
return L10n.of(context).title;
case L10nStrings.body:
return L10n.of(context).body;
case L10nStrings.nsfw:
return L10n.of(context).nsfw;
case L10nStrings.post:
return L10n.of(context).post;
case L10nStrings.save:
return L10n.of(context).save;
case L10nStrings.subscribed:
return L10n.of(context).subscribed;
case L10nStrings.local:
return L10n.of(context).local;
case L10nStrings.all:
return L10n.of(context).all;
case L10nStrings.replies:
return L10n.of(context).replies;
case L10nStrings.mentions:
return L10n.of(context).mentions;
case L10nStrings.from:
return L10n.of(context).from;
case L10nStrings.to:
return L10n.of(context).to;
case L10nStrings.deleted_by_creator:
return L10n.of(context).deleted_by_creator;
case L10nStrings.more:
return L10n.of(context).more;
case L10nStrings.mark_as_read:
return L10n.of(context).mark_as_read;
case L10nStrings.mark_as_unread:
return L10n.of(context).mark_as_unread;
case L10nStrings.reply:
return L10n.of(context).reply;
case L10nStrings.edit:
return L10n.of(context).edit;
case L10nStrings.delete:
return L10n.of(context).delete;
case L10nStrings.restore:
return L10n.of(context).restore;
case L10nStrings.yes:
return L10n.of(context).yes;
case L10nStrings.no:
return L10n.of(context).no;
case L10nStrings.avatar:
return L10n.of(context).avatar;
case L10nStrings.banner:
return L10n.of(context).banner;
case L10nStrings.display_name:
return L10n.of(context).display_name;
case L10nStrings.bio:
return L10n.of(context).bio;
case L10nStrings.email:
return L10n.of(context).email;
case L10nStrings.matrix_user:
return L10n.of(context).matrix_user;
case L10nStrings.sort_type:
return L10n.of(context).sort_type;
case L10nStrings.type:
return L10n.of(context).type;
case L10nStrings.show_nsfw:
return L10n.of(context).show_nsfw;
case L10nStrings.send_notifications_to_email:
return L10n.of(context).send_notifications_to_email;
case L10nStrings.delete_account:
return L10n.of(context).delete_account;
case L10nStrings.saved:
return L10n.of(context).saved;
case L10nStrings.communities:
return L10n.of(context).communities;
case L10nStrings.users:
return L10n.of(context).users;
case L10nStrings.theme:
return L10n.of(context).theme;
case L10nStrings.language:
return L10n.of(context).language;
case L10nStrings.hot:
return L10n.of(context).hot;
case L10nStrings.new_:
return L10n.of(context).new_;
case L10nStrings.old:
return L10n.of(context).old;
case L10nStrings.top:
return L10n.of(context).top;
case L10nStrings.chat:
return L10n.of(context).chat;
case L10nStrings.admin:
return L10n.of(context).admin;
case L10nStrings.by:
return L10n.of(context).by;
case L10nStrings.not_a_mod_or_admin:
return L10n.of(context).not_a_mod_or_admin;
case L10nStrings.not_an_admin:
return L10n.of(context).not_an_admin;
case L10nStrings.couldnt_find_post:
return L10n.of(context).couldnt_find_post;
case L10nStrings.not_logged_in:
return L10n.of(context).not_logged_in;
case L10nStrings.site_ban:
return L10n.of(context).site_ban;
case L10nStrings.community_ban:
return L10n.of(context).community_ban;
case L10nStrings.downvotes_disabled:
return L10n.of(context).downvotes_disabled;
case L10nStrings.invalid_url:
return L10n.of(context).invalid_url;
case L10nStrings.locked:
return L10n.of(context).locked;
case L10nStrings.couldnt_create_comment:
return L10n.of(context).couldnt_create_comment;
case L10nStrings.couldnt_like_comment:
return L10n.of(context).couldnt_like_comment;
case L10nStrings.couldnt_update_comment:
return L10n.of(context).couldnt_update_comment;
case L10nStrings.no_comment_edit_allowed:
return L10n.of(context).no_comment_edit_allowed;
case L10nStrings.couldnt_save_comment:
return L10n.of(context).couldnt_save_comment;
case L10nStrings.couldnt_get_comments:
return L10n.of(context).couldnt_get_comments;
case L10nStrings.report_reason_required:
return L10n.of(context).report_reason_required;
case L10nStrings.report_too_long:
return L10n.of(context).report_too_long;
case L10nStrings.couldnt_create_report:
return L10n.of(context).couldnt_create_report;
case L10nStrings.couldnt_resolve_report:
return L10n.of(context).couldnt_resolve_report;
case L10nStrings.invalid_post_title:
return L10n.of(context).invalid_post_title;
case L10nStrings.couldnt_create_post:
return L10n.of(context).couldnt_create_post;
case L10nStrings.couldnt_like_post:
return L10n.of(context).couldnt_like_post;
case L10nStrings.couldnt_find_community:
return L10n.of(context).couldnt_find_community;
case L10nStrings.couldnt_get_posts:
return L10n.of(context).couldnt_get_posts;
case L10nStrings.no_post_edit_allowed:
return L10n.of(context).no_post_edit_allowed;
case L10nStrings.couldnt_save_post:
return L10n.of(context).couldnt_save_post;
case L10nStrings.site_already_exists:
return L10n.of(context).site_already_exists;
case L10nStrings.couldnt_update_site:
return L10n.of(context).couldnt_update_site;
case L10nStrings.invalid_community_name:
return L10n.of(context).invalid_community_name;
case L10nStrings.community_already_exists:
return L10n.of(context).community_already_exists;
case L10nStrings.community_moderator_already_exists:
return L10n.of(context).community_moderator_already_exists;
case L10nStrings.community_follower_already_exists:
return L10n.of(context).community_follower_already_exists;
case L10nStrings.not_a_moderator:
return L10n.of(context).not_a_moderator;
case L10nStrings.couldnt_update_community:
return L10n.of(context).couldnt_update_community;
case L10nStrings.no_community_edit_allowed:
return L10n.of(context).no_community_edit_allowed;
case L10nStrings.system_err_login:
return L10n.of(context).system_err_login;
case L10nStrings.community_user_already_banned:
return L10n.of(context).community_user_already_banned;
case L10nStrings.couldnt_find_that_username_or_email:
return L10n.of(context).couldnt_find_that_username_or_email;
case L10nStrings.password_incorrect:
return L10n.of(context).password_incorrect;
case L10nStrings.registration_closed:
return L10n.of(context).registration_closed;
case L10nStrings.invalid_password:
return L10n.of(context).invalid_password;
case L10nStrings.passwords_dont_match:
return L10n.of(context).passwords_dont_match;
case L10nStrings.captcha_incorrect:
return L10n.of(context).captcha_incorrect;
case L10nStrings.invalid_username:
return L10n.of(context).invalid_username;
case L10nStrings.bio_length_overflow:
return L10n.of(context).bio_length_overflow;
case L10nStrings.couldnt_update_user:
return L10n.of(context).couldnt_update_user;
case L10nStrings.couldnt_update_private_message:
return L10n.of(context).couldnt_update_private_message;
case L10nStrings.couldnt_update_post:
return L10n.of(context).couldnt_update_post;
case L10nStrings.couldnt_create_private_message:
return L10n.of(context).couldnt_create_private_message;
case L10nStrings.no_private_message_edit_allowed:
return L10n.of(context).no_private_message_edit_allowed;
case L10nStrings.post_title_too_long:
return L10n.of(context).post_title_too_long;
case L10nStrings.email_already_exists:
return L10n.of(context).email_already_exists;
case L10nStrings.user_already_exists:
return L10n.of(context).user_already_exists;
case L10nStrings.unsubscribe:
return L10n.of(context).unsubscribe;
case L10nStrings.subscribe:
return L10n.of(context).subscribe;
case L10nStrings.messages:
return L10n.of(context).messages;
case L10nStrings.banned_users:
return L10n.of(context).banned_users;
case L10nStrings.delete_account_confirm:
return L10n.of(context).delete_account_confirm;
case L10nStrings.new_password:
return L10n.of(context).new_password;
case L10nStrings.verify_password:
return L10n.of(context).verify_password;
case L10nStrings.old_password:
return L10n.of(context).old_password;
case L10nStrings.show_avatars:
return L10n.of(context).show_avatars;
case L10nStrings.search:
return L10n.of(context).search;
case L10nStrings.send_message:
return L10n.of(context).send_message;
case L10nStrings.top_day:
return L10n.of(context).top_day;
case L10nStrings.top_week:
return L10n.of(context).top_week;
case L10nStrings.top_month:
return L10n.of(context).top_month;
case L10nStrings.top_year:
return L10n.of(context).top_year;
case L10nStrings.top_all:
return L10n.of(context).top_all;
case L10nStrings.most_comments:
return L10n.of(context).most_comments;
case L10nStrings.new_comments:
return L10n.of(context).new_comments;
case L10nStrings.active:
return L10n.of(context).active;
default:
return this;
}
}
}

1587
lib/l10n/untranslated.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:provider/provider.dart';
import 'hooks/stores.dart';
import 'l10n/l10n.dart';
import 'pages/communities_tab.dart';
import 'pages/create_post.dart';
import 'pages/home_tab.dart';
@ -42,8 +43,11 @@ class MyApp extends HookWidget {
return MaterialApp(
title: 'lemmur',
supportedLocales: L10n.supportedLocales,
localizationsDelegates: L10n.localizationsDelegates,
themeMode: configStore.theme,
darkTheme: configStore.amoledDarkMode ? amoledTheme : darkTheme,
locale: configStore.locale,
theme: lightTheme,
home: const MyHomePage(),
);

View File

@ -7,6 +7,7 @@ import 'package:url_launcher/url_launcher.dart' as ul;
import '../hooks/delayed_loading.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../widgets/fullscreenable_image.dart';
import '../widgets/radio_picker.dart';
import 'add_instance.dart';
@ -110,13 +111,14 @@ class AddAccountPage extends HookWidget {
TextField(
autofocus: true,
controller: usernameController,
decoration: const InputDecoration(labelText: 'Username or email'),
decoration:
InputDecoration(labelText: L10n.of(context).email_or_username),
),
const SizedBox(height: 5),
TextField(
controller: passwordController,
obscureText: true,
decoration: const InputDecoration(labelText: 'Password'),
decoration: InputDecoration(labelText: L10n.of(context).password),
),
ElevatedButton(
onPressed: usernameController.text.isEmpty ||
@ -138,6 +140,7 @@ class AddAccountPage extends HookWidget {
),
TextButton(
onPressed: () {
// TODO: extract to LemmyUrls or something
ul.launch('https://${selectedInstance.value}/login');
},
child: const Text('Register'),

View File

@ -10,6 +10,7 @@ import '../hooks/delayed_loading.dart';
import '../hooks/logged_in_action.dart';
import '../hooks/memo_future.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/extensions/api.dart';
import '../util/extensions/spaced.dart';
import '../util/goto.dart';
@ -171,11 +172,11 @@ class CommunityPage extends HookWidget {
preferredSize: const TabBar(tabs: []).preferredSize,
child: Material(
color: theme.cardColor,
child: const TabBar(
child: TabBar(
tabs: [
Tab(text: 'Posts'),
Tab(text: 'Comments'),
Tab(text: 'About'),
Tab(text: L10n.of(context).posts),
Tab(text: L10n.of(context).comments),
const Tab(text: 'About'),
],
),
),
@ -397,10 +398,12 @@ class _AboutTab extends StatelessWidget {
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.symmetric(horizontal: 15),
children: [
Chip(label: Text('${onlineUsers ?? 'X'} users online')),
Chip(
label: Text(
'${community.counts.subscribers} subscriber${pluralS(community.counts.subscribers)}')),
label: Text(L10n.of(context)
.number_of_users_online(onlineUsers ?? 0))),
Chip(
label: Text(L10n.of(context)
.number_of_subscribers(community.counts.subscribers))),
Chip(
label: Text(
'${community.counts.posts} post${pluralS(community.counts.posts)}')),
@ -430,7 +433,7 @@ class _AboutTab extends StatelessWidget {
communityName: community.community.name,
),
),
child: const Text('Modlog'),
child: Text(L10n.of(context).modlog),
),
),
const _Divider(),
@ -525,7 +528,9 @@ class _FollowButton extends HookWidget {
icon: isSubbed.value
? const Icon(Icons.remove, size: 18)
: const Icon(Icons.add, size: 18),
label: Text('${isSubbed.value ? 'un' : ''}subscribe'),
label: Text(isSubbed.value
? L10n.of(context).unsubscribe
: L10n.of(context).subscribe),
),
),
),

View File

@ -10,6 +10,7 @@ import '../hooks/image_picker.dart';
import '../hooks/logged_in_action.dart';
import '../hooks/memo_future.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/extensions/api.dart';
import '../util/extensions/spaced.dart';
import '../util/goto.dart';
@ -165,7 +166,7 @@ class CreatePostPage extends HookWidget {
child: DropdownButtonHideUnderline(
child: DropdownButton<int>(
value: selectedCommunity.value?.community?.id,
hint: const Text('Community'),
hint: Text(L10n.of(context).community),
onChanged: (communityId) => selectedCommunity.value =
allCommunitiesSnap.data
?.firstWhere((e) => e.community.id == communityId),
@ -179,9 +180,9 @@ class CreatePostPage extends HookWidget {
child: TextField(
enabled: pictrsDeleteToken.value == null,
controller: urlController,
decoration: const InputDecoration(
labelText: 'URL',
suffixIcon: Icon(Icons.link),
decoration: InputDecoration(
labelText: L10n.of(context).url,
suffixIcon: const Icon(Icons.link),
),
),
),
@ -203,7 +204,7 @@ class CreatePostPage extends HookWidget {
controller: titleController,
minLines: 1,
maxLines: 2,
decoration: const InputDecoration(labelText: 'Title'),
decoration: InputDecoration(labelText: L10n.of(context).title),
);
final body = IndexedStack(
@ -214,7 +215,7 @@ class CreatePostPage extends HookWidget {
keyboardType: TextInputType.multiline,
maxLines: null,
minLines: 5,
decoration: const InputDecoration(labelText: 'Body'),
decoration: InputDecoration(labelText: L10n.of(context).body),
),
Padding(
padding: const EdgeInsets.all(16),
@ -289,7 +290,7 @@ class CreatePostPage extends HookWidget {
value: nsfw.value,
onChanged: (val) => nsfw.value = val,
),
const Text('NSFW')
Text(L10n.of(context).nsfw)
],
),
),
@ -297,7 +298,7 @@ class CreatePostPage extends HookWidget {
onPressed: delayed.pending ? () {} : handleSubmit,
child: delayed.loading
? const CircularProgressIndicator()
: const Text('post'),
: Text(L10n.of(context).post),
)
],
),

View File

@ -9,6 +9,7 @@ import 'package:lemmy_api_client/v2.dart';
import '../hooks/infinite_scroll.dart';
import '../hooks/memo_future.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/goto.dart';
import '../widgets/bottom_modal.dart';
import '../widgets/infinite_scroll.dart';
@ -83,7 +84,7 @@ class HomeTab extends HookWidget {
),
ListTile(
title: Text(
'Subscribed',
L10n.of(context).subscribed,
style: TextStyle(
color: accStore.hasNoAccount
? theme.textTheme.bodyText1.color.withOpacity(0.4)
@ -143,7 +144,7 @@ class HomeTab extends HookWidget {
),
ListTile(
title: Text(
'Subscribed',
L10n.of(context).subscribed,
style: TextStyle(
color: accStore.isAnonymousFor(instance)
? theme.textTheme.bodyText1.color.withOpacity(0.4)
@ -161,7 +162,7 @@ class HomeTab extends HookWidget {
leading: const SizedBox(width: 20),
),
ListTile(
title: const Text('Local'),
title: Text(L10n.of(context).local),
onTap: () => pop(_SelectedList(
listingType: PostListingType.local,
instanceHost: instance,
@ -169,7 +170,7 @@ class HomeTab extends HookWidget {
leading: const SizedBox(width: 20),
),
ListTile(
title: const Text('All'),
title: Text(L10n.of(context).all),
onTap: () => pop(_SelectedList(
listingType: PostListingType.all,
instanceHost: instance,
@ -188,7 +189,7 @@ class HomeTab extends HookWidget {
}
final title = () {
final first = selectedList.value.listingType.value;
final first = selectedList.value.listingType.tr(context);
final last = selectedList.value.instanceHost == null
? ''

View File

@ -10,6 +10,7 @@ import 'package:matrix4_transform/matrix4_transform.dart';
import '../hooks/delayed_loading.dart';
import '../hooks/infinite_scroll.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/delayed_action.dart';
import '../util/extensions/api.dart';
import '../util/extensions/datetime.dart';
@ -90,11 +91,11 @@ class InboxPage extends HookWidget {
tooltip: unreadOnly.value ? 'show all' : 'show only unread',
)
],
bottom: const TabBar(
bottom: TabBar(
tabs: [
Tab(text: 'Replies'),
Tab(text: 'Mentions'),
Tab(text: 'Messages'),
Tab(text: L10n.of(context).replies),
Tab(text: L10n.of(context).mentions),
Tab(text: L10n.of(context).messages),
],
),
),
@ -279,7 +280,7 @@ class PrivateMessageTile extends HookWidget {
Row(
children: [
Text(
toMe ? 'from ' : 'to ',
'${toMe ? L10n.of(context).from : L10n.of(context).to} ',
style: TextStyle(color: theme.textTheme.caption.color),
),
InkWell(
@ -334,8 +335,10 @@ class PrivateMessageTile extends HookWidget {
),
const SizedBox(height: 5),
if (pmv.value.privateMessage.deleted)
const Text('deleted by creator',
style: TextStyle(fontStyle: FontStyle.italic))
Text(
L10n.of(context).deleted_by_creator,
style: const TextStyle(fontStyle: FontStyle.italic),
)
else
body,
Row(children: [
@ -343,19 +346,19 @@ class PrivateMessageTile extends HookWidget {
TileAction(
icon: moreIcon,
onPressed: showMoreMenu,
tooltip: 'more',
tooltip: L10n.of(context).more,
),
if (toMe) ...[
TileAction(
iconColor: read.value ? theme.accentColor : null,
icon: Icons.check,
tooltip: 'mark as read',
tooltip: L10n.of(context).mark_as_read,
onPressed: handleRead,
delayedLoading: readDelayed,
),
TileAction(
icon: Icons.reply,
tooltip: 'reply',
tooltip: L10n.of(context).reply,
onPressed: () {
showCupertinoModalPopup(
context: context,
@ -368,7 +371,7 @@ class PrivateMessageTile extends HookWidget {
] else ...[
TileAction(
icon: Icons.edit,
tooltip: 'edit',
tooltip: L10n.of(context).edit,
onPressed: () async {
final val = await showCupertinoModalPopup<PrivateMessageView>(
context: context,
@ -379,7 +382,9 @@ class PrivateMessageTile extends HookWidget {
TileAction(
delayedLoading: deleteDelayed,
icon: deleted.value ? Icons.restore : Icons.delete,
tooltip: deleted.value ? 'restore' : 'delete',
tooltip: deleted.value
? L10n.of(context).restore
: L10n.of(context).delete,
onPressed: handleDelete,
),
]

View File

@ -7,6 +7,7 @@ import 'package:lemmy_api_client/v2.dart';
import 'package:url_launcher/url_launcher.dart' as ul;
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/extensions/api.dart';
import '../util/extensions/spaced.dart';
import '../util/goto.dart';
@ -162,11 +163,11 @@ class InstancePage extends HookWidget {
preferredSize: const TabBar(tabs: []).preferredSize,
child: Material(
color: theme.cardColor,
child: const TabBar(
child: TabBar(
tabs: [
Tab(text: 'Posts'),
Tab(text: 'Comments'),
Tab(text: 'About'),
Tab(text: L10n.of(context).posts),
Tab(text: L10n.of(context).comments),
const Tab(text: 'About'),
],
),
),
@ -215,11 +216,13 @@ class _AboutTab extends HookWidget {
: assert(communitiesFuture != null),
assert(instanceHost != null);
void goToBannedUsers(BuildContext c) {
void goToBannedUsers(BuildContext context) {
goTo(
c,
context,
(_) => UsersListPage(
users: site.banned.reversed.toList(), title: 'Banned users'),
users: site.banned.reversed.toList(),
title: L10n.of(context).banned_users,
),
);
}
@ -266,8 +269,12 @@ class _AboutTab extends HookWidget {
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.symmetric(horizontal: 15),
children: [
Chip(label: Text('${site.online} users online')),
Chip(label: Text('${site.siteView.counts.users} users')),
Chip(
label: Text(L10n.of(context)
.number_of_users_online(site.online))),
Chip(
label: Text(L10n.of(context)
.number_of_users(site.siteView.counts.users))),
Chip(
label: Text(
'${site.siteView.counts.communities} communities')),
@ -328,11 +335,11 @@ class _AboutTab extends HookWidget {
),
const _Divider(),
ListTile(
title: const Center(child: Text('Banned users')),
title: Center(child: Text(L10n.of(context).banned_users)),
onTap: () => goToBannedUsers(context),
),
ListTile(
title: const Center(child: Text('Modlog')),
title: Center(child: Text(L10n.of(context).modlog)),
onTap: () => goTo(
context,
(context) => ModlogPage.forInstance(instanceHost: instanceHost),

View File

@ -9,6 +9,7 @@ import '../hooks/delayed_loading.dart';
import '../hooks/image_picker.dart';
import '../hooks/ref.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/pictrs.dart';
import '../widgets/bottom_safe.dart';
import '../widgets/radio_picker.dart';
@ -148,29 +149,29 @@ class _ManageAccount extends HookWidget {
final confirmDelete = await showDialog<bool>(
context: context,
builder: (context) => AlertDialog(
title: const Text('Remove account?'),
title: Text(
'${L10n.of(context).delete_account} @${user.instanceHost}@${user.name}'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'Are you sure you want to remove @${user.instanceHost}@${user.name}? '
'WARNING: this removes your account COMPLETELY, not from lemmur only',
),
Text(L10n.of(context).delete_account_confirm),
const SizedBox(height: 10),
TextField(
controller: deleteAccountPasswordController,
obscureText: true,
decoration: const InputDecoration(hintText: 'Password'),
decoration:
InputDecoration(hintText: L10n.of(context).password),
)
],
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text('no'),
child: Text(L10n.of(context).no),
),
TextButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text('yes'),
child: Text(L10n.of(context).yes),
),
],
),
@ -205,7 +206,7 @@ class _ManageAccount extends HookWidget {
children: [
_ImagePicker(
user: user,
name: 'Avatar',
name: L10n.of(context).avatar,
initialUrl: avatar.current,
onChange: (value) => avatar.current = value,
informAcceptedRef: informAcceptedAvatarRef,
@ -213,41 +214,42 @@ class _ManageAccount extends HookWidget {
const SizedBox(height: 8),
_ImagePicker(
user: user,
name: 'Banner',
name: L10n.of(context).banner,
initialUrl: banner.current,
onChange: (value) => banner.current = value,
informAcceptedRef: informAcceptedBannerRef,
),
const SizedBox(height: 8),
Text('Display Name', style: theme.textTheme.headline6),
Text(L10n.of(context).display_name, style: theme.textTheme.headline6),
TextField(controller: displayNameController),
const SizedBox(height: 8),
Text('Bio', style: theme.textTheme.headline6),
Text(L10n.of(context).bio, style: theme.textTheme.headline6),
TextField(
controller: bioController,
minLines: 4,
maxLines: 10,
),
const SizedBox(height: 8),
Text('Email', style: theme.textTheme.headline6),
Text(L10n.of(context).email, style: theme.textTheme.headline6),
TextField(controller: emailController),
const SizedBox(height: 8),
Text('Matrix User', style: theme.textTheme.headline6),
Text(L10n.of(context).matrix_user, style: theme.textTheme.headline6),
TextField(controller: matrixUserController),
const SizedBox(height: 8),
Text('New password', style: theme.textTheme.headline6),
Text(L10n.of(context).new_password, style: theme.textTheme.headline6),
TextField(
controller: newPasswordController,
obscureText: true,
),
const SizedBox(height: 8),
Text('Verify password', style: theme.textTheme.headline6),
Text(L10n.of(context).verify_password,
style: theme.textTheme.headline6),
TextField(
controller: newPasswordVerifyController,
obscureText: true,
),
const SizedBox(height: 8),
Text('Old password', style: theme.textTheme.headline6),
Text(L10n.of(context).old_password, style: theme.textTheme.headline6),
TextField(
controller: oldPasswordController,
obscureText: true,
@ -258,9 +260,9 @@ class _ManageAccount extends HookWidget {
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text('Sort type'),
Text(
children: [
Text(L10n.of(context).type),
const Text(
'This has currently no effect on lemmur',
style: TextStyle(fontSize: 10),
)
@ -284,9 +286,9 @@ class _ManageAccount extends HookWidget {
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text('Type'),
Text(
children: [
Text(L10n.of(context).sort_type),
const Text(
'This has currently no effect on lemmur',
style: TextStyle(fontSize: 10),
)
@ -304,7 +306,7 @@ class _ManageAccount extends HookWidget {
CheckboxListTile(
value: showAvatars.value,
onChanged: (checked) => showAvatars.value = checked,
title: const Text('Show avatars'),
title: Text(L10n.of(context).show_avatars),
subtitle: const Text('This has currently no effect on lemmur'),
dense: true,
),
@ -312,7 +314,7 @@ class _ManageAccount extends HookWidget {
CheckboxListTile(
value: showNsfw.value,
onChanged: (checked) => showNsfw.value = checked,
title: const Text('Show NSFW content'),
title: Text(L10n.of(context).show_nsfw),
subtitle: const Text('This has currently no effect on lemmur'),
dense: true,
),
@ -320,7 +322,7 @@ class _ManageAccount extends HookWidget {
CheckboxListTile(
value: sendNotificationsToEmail.value,
onChanged: (checked) => sendNotificationsToEmail.value = checked,
title: const Text('Send notifications to Email'),
title: Text(L10n.of(context).send_notifications_to_email),
dense: true,
),
const SizedBox(height: 8),
@ -332,7 +334,7 @@ class _ManageAccount extends HookWidget {
height: 20,
child: CircularProgressIndicator(),
)
: const Text('save'),
: Text(L10n.of(context).save),
),
const SizedBox(height: 8),
ElevatedButton(
@ -340,7 +342,7 @@ class _ManageAccount extends HookWidget {
style: ElevatedButton.styleFrom(
primary: Colors.red,
),
child: const Text('DELETE ACCOUNT'),
child: Text(L10n.of(context).delete_account.toUpperCase()),
),
const BottomSafe(),
],

View File

@ -3,6 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:lemmy_api_client/v2.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../widgets/sortable_infinite_list.dart';
/// Page with saved posts/comments. Fetches such saved data from the default user
@ -16,11 +17,11 @@ class SavedPage extends HookWidget {
length: 2,
child: Scaffold(
appBar: AppBar(
title: const Text('Saved'),
bottom: const TabBar(
title: Text(L10n.of(context).saved),
bottom: TabBar(
tabs: [
Tab(text: 'Posts'),
Tab(text: 'Comments'),
Tab(text: L10n.of(context).posts),
Tab(text: L10n.of(context).comments),
],
),
),

View File

@ -3,6 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:lemmy_api_client/v2.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../widgets/comment.dart';
import '../widgets/post.dart';
import '../widgets/sortable_infinite_list.dart';
@ -27,13 +28,13 @@ class SearchResultsPage extends HookWidget {
child: Scaffold(
appBar: AppBar(
title: Text('Looking for "$query"'),
bottom: const TabBar(
bottom: TabBar(
isScrollable: true,
tabs: [
Tab(text: 'Posts'),
Tab(text: 'Comments'),
Tab(text: 'Users'),
Tab(text: 'Communities'),
Tab(text: L10n.of(context).posts),
Tab(text: L10n.of(context).comments),
Tab(text: L10n.of(context).users),
Tab(text: L10n.of(context).communities),
],
),
),

View File

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/goto.dart';
import '../widgets/radio_picker.dart';
import 'search_results.dart';
@ -38,7 +39,7 @@ class SearchTab extends HookWidget {
TextField(
controller: searchInputController,
textAlign: TextAlign.center,
decoration: const InputDecoration(hintText: 'search'),
decoration: InputDecoration(hintText: L10n.of(context).search),
),
const SizedBox(height: 5),
Row(
@ -65,7 +66,7 @@ class SearchTab extends HookWidget {
instanceHost: instanceHost.value,
query: searchInputController.text,
)),
child: const Text('search'),
child: Text(L10n.of(context).search),
)
],
),

View File

@ -6,8 +6,10 @@ import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/goto.dart';
import '../widgets/about_tile.dart';
import '../widgets/radio_picker.dart';
import 'add_account.dart';
import 'add_instance.dart';
import 'manage_account.dart';
@ -19,7 +21,7 @@ class SettingsPage extends StatelessWidget {
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: const Text('Settings'),
title: Text(L10n.of(context).settings),
),
body: ListView(
children: [
@ -68,11 +70,29 @@ class AppearanceConfigPage extends HookWidget {
},
),
SwitchListTile(
title: const Text('AMOLED dark mode'),
value: configStore.amoledDarkMode,
onChanged: (checked) {
configStore.amoledDarkMode = checked;
})
title: const Text('AMOLED dark mode'),
value: configStore.amoledDarkMode,
onChanged: (checked) {
configStore.amoledDarkMode = checked;
},
),
const SizedBox(height: 12),
const _SectionHeading('General'),
ListTile(
title: Text(L10n.of(context).language),
trailing: SizedBox(
width: 120,
child: RadioPicker<Locale>(
title: 'Choose language',
groupValue: configStore.locale,
values: L10n.supportedLocales,
mapValueToString: (locale) => locale.languageName,
onChanged: (selected) {
configStore.locale = selected;
},
),
),
),
],
),
);
@ -97,11 +117,11 @@ class AccountsConfigPage extends HookWidget {
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text('no'),
child: Text(L10n.of(context).no),
),
TextButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text('yes'),
child: Text(L10n.of(context).yes),
),
],
),
@ -121,11 +141,11 @@ class AccountsConfigPage extends HookWidget {
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text('no'),
child: Text(L10n.of(context).no),
),
TextButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text('yes'),
child: Text(L10n.of(context).yes),
),
],
),

View File

@ -3,6 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:lemmy_api_client/v2.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/extensions/api.dart';
import '../widgets/markdown_mode_icon.dart';
import '../widgets/markdown_text.dart';
@ -41,8 +42,8 @@ class WriteMessagePage extends HookWidget {
useTextEditingController(text: privateMessage?.content);
final loading = useState(false);
final submit = _isEdit ? 'save' : 'send';
final title = _isEdit ? 'Edit message' : 'Send message';
final submit = _isEdit ? L10n.of(context).save : 'send';
final title = _isEdit ? 'Edit message' : L10n.of(context).send_message;
handleSubmit() async {
if (_isEdit) {

View File

@ -5,6 +5,8 @@ import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../l10n/l10n.dart';
part 'config_store.g.dart';
/// Store managing user-level configuration such as theme or language
@ -31,12 +33,23 @@ class ConfigStore extends ChangeNotifier {
save();
}
Locale _locale;
// default value is set in the `load` method because json_serializable does
// not accept non-literals as constant values
@JsonKey(fromJson: LocaleSerde.fromJson, toJson: LocaleSerde.toJson)
Locale get locale => _locale;
set locale(Locale locale) {
_locale = locale;
notifyListeners();
save();
}
static Future<ConfigStore> load() async {
final prefs = await _prefs;
return _$ConfigStoreFromJson(
jsonDecode(prefs.getString(prefsKey) ?? '{}') as Map<String, dynamic>,
);
).._locale ??= const Locale('en');
}
Future<void> save() async {

View File

@ -10,13 +10,15 @@ ConfigStore _$ConfigStoreFromJson(Map<String, dynamic> json) {
return ConfigStore()
..theme = _$enumDecodeNullable(_$ThemeModeEnumMap, json['theme']) ??
ThemeMode.system
..amoledDarkMode = json['amoledDarkMode'] as bool ?? false;
..amoledDarkMode = json['amoledDarkMode'] as bool ?? false
..locale = LocaleSerde.fromJson(json['locale'] as String);
}
Map<String, dynamic> _$ConfigStoreToJson(ConfigStore instance) =>
<String, dynamic>{
'theme': _$ThemeModeEnumMap[instance.theme],
'amoledDarkMode': instance.amoledDarkMode,
'locale': LocaleSerde.toJson(instance.locale),
};
T _$enumDecode<T>(

View File

@ -10,6 +10,7 @@ import '../comment_tree.dart';
import '../hooks/delayed_loading.dart';
import '../hooks/logged_in_action.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../util/delayed_action.dart';
import '../util/extensions/api.dart';
import '../util/extensions/datetime.dart';
@ -217,10 +218,10 @@ class CommentWidget extends HookWidget {
final body = () {
if (isDeleted.value) {
return const Flexible(
return Flexible(
child: Text(
'comment deleted by creator',
style: TextStyle(fontStyle: FontStyle.italic),
L10n.of(context).deleted_by_creator,
style: const TextStyle(fontStyle: FontStyle.italic),
),
);
} else if (comment.comment.removed) {
@ -292,14 +293,14 @@ class CommentWidget extends HookWidget {
icon: Icons.more_horiz,
onPressed: () => _openMoreMenu(context),
delayedLoading: delayedDeletion,
tooltip: 'more',
tooltip: L10n.of(context).more,
),
_SaveComment(commentTree.comment),
if (!isDeleted.value && !comment.comment.removed)
TileAction(
icon: Icons.reply,
onPressed: loggedInAction((_) => reply()),
tooltip: 'reply',
tooltip: L10n.of(context).reply,
),
TileAction(
icon: Icons.arrow_upward,
@ -364,7 +365,10 @@ class CommentWidget extends HookWidget {
),
if (isOP) _CommentTag('OP', theme.accentColor),
if (comment.creator.admin)
_CommentTag('ADMIN', theme.accentColor),
_CommentTag(
L10n.of(context).admin.toUpperCase(),
theme.accentColor,
),
if (comment.creator.banned)
const _CommentTag('BANNED', Colors.red),
if (comment.creatorBannedFromCommunity)
@ -465,7 +469,9 @@ class _MarkAsRead extends HookWidget {
onPressed:
userMentionId != null ? handleMarkMentionAsSeen : handleMarkAsSeen,
iconColor: isRead.value ? Theme.of(context).accentColor : null,
tooltip: 'mark as ${isRead.value ? 'un' : ''}read',
tooltip: isRead.value
? L10n.of(context).mark_as_unread
: L10n.of(context).mark_as_read,
);
}
}

View File

@ -4,6 +4,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:lemmy_api_client/v2.dart';
import '../comment_tree.dart';
import '../l10n/l10n.dart';
import 'bottom_modal.dart';
import 'bottom_safe.dart';
import 'comment.dart';
@ -16,11 +17,11 @@ class CommentSection extends HookWidget {
final CommentSortType sortType;
static const sortPairs = {
CommentSortType.hot: [Icons.whatshot, 'Hot'],
CommentSortType.new_: [Icons.new_releases, 'New'],
CommentSortType.old: [Icons.calendar_today, 'Old'],
CommentSortType.top: [Icons.trending_up, 'Top'],
CommentSortType.chat: [Icons.chat, 'Chat'],
CommentSortType.hot: [Icons.whatshot, L10nStrings.hot],
CommentSortType.new_: [Icons.new_releases, L10nStrings.new_],
CommentSortType.old: [Icons.calendar_today, L10nStrings.old],
CommentSortType.top: [Icons.trending_up, L10nStrings.top],
CommentSortType.chat: [Icons.chat, L10nStrings.chat],
};
CommentSection(
@ -60,7 +61,7 @@ class CommentSection extends HookWidget {
for (final e in sortPairs.entries)
ListTile(
leading: Icon(e.value[0] as IconData),
title: Text(e.value[1] as String),
title: Text((e.value[1] as String).tr(context)),
trailing: sorting.value == e.key
? const Icon(Icons.check)
: null,
@ -75,7 +76,7 @@ class CommentSection extends HookWidget {
},
child: Row(
children: [
Text(sortPairs[sorting.value][1] as String),
Text((sortPairs[sorting.value][1] as String).tr(context)),
const Icon(Icons.arrow_drop_down),
],
),

View File

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
/// used mostly for pages where markdown editor is used
///
/// brush icon is rotated to look similarly to build icon
Widget markdownModeIcon({bool fancy}) => fancy
Widget markdownModeIcon({@required bool fancy}) => fancy
? const Icon(Icons.build)
: const RotatedBox(
quarterTurns: 1,

View File

@ -10,6 +10,7 @@ import 'package:url_launcher/url_launcher.dart' as ul;
import '../hooks/delayed_loading.dart';
import '../hooks/logged_in_action.dart';
import '../l10n/l10n.dart';
import '../pages/full_post.dart';
import '../url_launcher.dart';
import '../util/cleanup_url.dart';
@ -180,10 +181,11 @@ class PostWidget extends HookWidget {
fontSize: 13,
color: theme.textTheme.bodyText1.color),
children: [
const TextSpan(
text: 'by',
style:
TextStyle(fontWeight: FontWeight.w300)),
TextSpan(
text: L10n.of(context).by,
style: const TextStyle(
fontWeight: FontWeight.w300),
),
TextSpan(
text: ' ${post.creator.originDisplayName}',
style: const TextStyle(
@ -203,9 +205,10 @@ class PostWidget extends HookWidget {
const TextSpan(text: ' · 📌'),
if (post.post.nsfw) const TextSpan(text: ' · '),
if (post.post.nsfw)
const TextSpan(
text: 'NSFW',
style: TextStyle(color: Colors.red)),
TextSpan(
text: L10n.of(context).nsfw,
style:
const TextStyle(color: Colors.red)),
if (urlDomain != null)
TextSpan(text: ' · $urlDomain'),
if (post.post.removed)
@ -368,11 +371,11 @@ class PostWidget extends HookWidget {
child: Row(
children: [
const Icon(Icons.comment),
const SizedBox(width: 6),
Expanded(
flex: 999,
child: Text(
' ${NumberFormat.compact().format(post.counts.comments)}'
' comment${post.counts.comments == 1 ? '' : 's'}',
L10n.of(context).number_of_comments(post.counts.comments),
overflow: TextOverflow.fade,
softWrap: false,
),

View File

@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:lemmy_api_client/v2.dart';
import '../l10n/l10n.dart';
import 'radio_picker.dart';
/// Dropdown filters where you can change sorting or viewing type
@ -26,7 +27,7 @@ class PostListOptions extends StatelessWidget {
values: SortType.values,
groupValue: sortValue,
onChanged: onSortChanged,
mapValueToString: (value) => value.value,
mapValueToString: (value) => value.tr(context),
),
const Spacer(),
if (styleButton)

View File

@ -6,11 +6,11 @@ import 'package:lemmy_api_client/v2.dart';
import '../hooks/memo_future.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import '../pages/manage_account.dart';
import '../util/extensions/api.dart';
import '../util/extensions/datetime.dart';
import '../util/goto.dart';
import '../util/intl.dart';
import '../util/text_color.dart';
import 'avatar.dart';
import 'fullscreenable_image.dart';
@ -81,11 +81,11 @@ class UserProfile extends HookWidget {
preferredSize: const TabBar(tabs: []).preferredSize,
child: Material(
color: theme.cardColor,
child: const TabBar(
child: TabBar(
tabs: [
Tab(text: 'Posts'),
Tab(text: 'Comments'),
Tab(text: 'About'),
Tab(text: L10n.of(context).posts),
Tab(text: L10n.of(context).comments),
const Tab(text: 'About'),
],
),
),
@ -255,8 +255,8 @@ class _UserOverview extends HookWidget {
),
const SizedBox(width: 4),
Text(
'${compactNumber(userView.counts.postCount)}'
' Post${pluralS(userView.counts.postCount)}',
L10n.of(context)
.number_of_posts(userView.counts.postCount),
style: TextStyle(color: colorOnTopOfAccentColor),
),
],
@ -273,7 +273,8 @@ class _UserOverview extends HookWidget {
),
const SizedBox(width: 4),
Text(
'${compactNumber(userView.counts.commentCount)} Comment${pluralS(userView.counts.commentCount)}',
L10n.of(context)
.number_of_comments(userView.counts.commentCount),
style: TextStyle(color: colorOnTopOfAccentColor),
),
],

View File

@ -4,6 +4,7 @@ import 'package:lemmy_api_client/v2.dart';
import '../hooks/delayed_loading.dart';
import '../hooks/stores.dart';
import '../l10n/l10n.dart';
import 'markdown_mode_icon.dart';
import 'markdown_text.dart';
@ -119,7 +120,7 @@ class WriteComment extends HookWidget {
onPressed: delayed.pending ? () {} : handleSubmit,
child: delayed.loading
? const CircularProgressIndicator()
: const Text('post'),
: Text(L10n.of(context).post),
)
],
),

View File

@ -258,6 +258,11 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.1"
flutter_localizations:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_markdown:
dependency: "direct main"
description:
@ -367,7 +372,7 @@ packages:
source: hosted
version: "1.1.6"
intl:
dependency: transitive
dependency: "direct main"
description:
name: intl
url: "https://pub.dartlang.org"

View File

@ -45,11 +45,14 @@ dependencies:
timeago: ^2.0.27
fuzzy: <1.0.0
lemmy_api_client: ^0.12.0
intl: ^0.16.1
matrix4_transform: ^1.1.7
json_annotation: ^3.1.1
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
@ -74,6 +77,7 @@ flutter_icons:
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter.
flutter:
generate: true
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.

20
scripts/common.dart Normal file
View File

@ -0,0 +1,20 @@
import 'dart:io';
void confirm(String message) {
stdout.write('$message [y/n] ');
switch (stdin.readLineSync()) {
case 'y':
case 'yes':
break;
default:
print('Exiting');
exit(1);
}
}
void printError(String message, {bool shouldExit = true}) {
stderr.writeln('\x1B[31m$message\x1B[0m');
if (shouldExit) exit(1);
}

View File

@ -0,0 +1,43 @@
/// creates a file with l10n translations from string
import 'dart:convert';
import 'dart:io';
const baseFile = 'intl_en.arb';
const autoGenHeader = '// FILE GENERATED AUTOMATICALLY, TO NOT EDIT BY HAND';
Future<void> main(List<String> args) async {
final strings = jsonDecode(await File('lib/l10n/$baseFile').readAsString())
as Map<String, dynamic>;
final keys = strings.keys.where((key) => !key.startsWith('@')).toSet();
final keysWithoutVariables = keys.where((key) {
final metadata = strings['@$key'] as Map<String, dynamic>;
final placeholders = metadata['placeholders'] as Map<String, dynamic>;
return placeholders?.isEmpty ?? true;
}).toSet();
await File('lib/l10n/l10n_from_string.dart').writeAsString('''$autoGenHeader
// ignore_for_file: constant_identifier_names
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
abstract class L10nStrings {
${keys.map((key) => " static const $key = '$key';").join('\n')}
}
extension L10nFromString on String {
String tr(BuildContext context) {
switch (this) {
${keysWithoutVariables.map((key) => " case L10nStrings.$key:\n return L10n.of(context).$key;").join('\n')}
default:
return this;
}
}
}
''');
await Process.run('flutter', ['format', '.']);
}

View File

@ -0,0 +1,365 @@
/// migrates chosen strings from lemmy-translations into flutter's i18n solution
/// uses prettier to format the files
import 'dart:convert';
import 'dart:io';
import 'common.dart';
import 'gen_l10n_from_string.dart' as gen;
// config for migration of a single key
// ignore: camel_case_types
class _ {
final String key;
final String rename;
/// make all letters except the first one lower case
final bool decapitalize;
final bool toLowerCase;
/// arb format for the placeholder
final String format;
/// arb type for the placeholder
final String type;
const _(
this.key, {
this.rename,
this.decapitalize = false,
this.toLowerCase = false,
this.format,
this.type,
});
String get renamedKey => rename ?? key;
// will transform a value of a translation of the base language
String transform(String input) {
if (toLowerCase) return input.toLowerCase();
if (decapitalize) return '${input[0]}${input.substring(1).toLowerCase()}';
return input;
}
}
const toMigrate = <_>[
_('settings'),
_('password'),
_('email_or_username'),
_('posts'),
_('comments'),
_('modlog'),
_('community'),
_('url'),
_('title'),
_('body'),
_('nsfw'),
_('post'),
_('save'),
_('subscribed'),
_('local'),
_('all'),
_('replies'),
_('mentions'),
_('from'),
_('to'),
_('deleted', rename: 'deleted_by_creator'),
_('more'),
_('mark_as_read'),
_('mark_as_unread'),
_('reply'),
_('edit'),
_('delete'),
_('restore'),
_('yes'),
_('no'),
_('avatar'),
_('banner'),
_('display_name'),
_('bio'),
_('email'),
_('matrix_user_id', rename: 'matrix_user'),
_('sort_type'),
_('type'),
_('show_nsfw'),
_('send_notifications_to_email'),
_('delete_account', decapitalize: true),
_('saved'),
_('communities'),
_('users'),
_('theme'),
_('language'),
_('hot'),
_('new', rename: 'new_'),
_('old'),
_('top'),
_('chat'),
_('admin'),
_('by'),
_('not_a_mod_or_admin'),
_('not_an_admin'),
_('couldnt_find_post'),
_('not_logged_in'),
_('site_ban'),
_('community_ban'),
_('downvotes_disabled'),
_('invalid_url'),
_('locked'),
_('couldnt_create_comment'),
_('couldnt_like_comment'),
_('couldnt_update_comment'),
_('no_comment_edit_allowed'),
_('couldnt_save_comment'),
_('couldnt_get_comments'),
_('report_reason_required'),
_('report_too_long'),
_('couldnt_create_report'),
_('couldnt_resolve_report'),
_('invalid_post_title'),
_('couldnt_create_post'),
_('couldnt_like_post'),
_('couldnt_find_community'),
_('couldnt_get_posts'),
_('no_post_edit_allowed'),
_('couldnt_save_post'),
_('site_already_exists'),
_('couldnt_update_site'),
_('invalid_community_name'),
_('community_already_exists'),
_('community_moderator_already_exists'),
_('community_follower_already_exists'),
_('not_a_moderator'),
_('couldnt_update_community'),
_('no_community_edit_allowed'),
_('system_err_login'),
_('community_user_already_banned'),
_('couldnt_find_that_username_or_email'),
_('password_incorrect'),
_('registration_closed'),
_('invalid_password'),
_('passwords_dont_match'),
_('captcha_incorrect'),
_('invalid_username'),
_('bio_length_overflow'),
_('couldnt_update_user'),
_('couldnt_update_private_message'),
_('couldnt_update_post'),
_('couldnt_create_private_message'),
_('no_private_message_edit_allowed'),
_('post_title_too_long'),
_('email_already_exists'),
_('user_already_exists'),
_('number_online', rename: 'number_of_users_online'),
_('number_of_comments', type: 'int', format: 'compact', toLowerCase: true),
_('number_of_posts', type: 'int', format: 'compact', toLowerCase: true),
_('number_of_subscribers'),
_('number_of_users'),
_('unsubscribe', toLowerCase: true),
_('subscribe', toLowerCase: true),
_('messages'),
_('banned_users', decapitalize: true),
_('delete_account_confirm'),
_('new_password', decapitalize: true),
_('verify_password', decapitalize: true),
_('old_password', decapitalize: true),
_('show_avatars', decapitalize: true),
_('search', toLowerCase: true),
_('send_message', decapitalize: true),
_('top_day'),
_('top_week'),
_('top_month'),
_('top_year'),
_('top_all'),
_('most_comments'),
_('new_comments'),
_('active'),
];
const repoName = 'lemmy-translations';
const baseLanguage = 'en';
const flutterIntlPrefix = 'intl_';
Future<void> main(List<String> args) async {
final force = args.contains('-f') || args.contains('--force');
checkDuplicateKeys();
final repoCleanup = await cloneLemmyTranslations();
final lemmyTranslations = await loadLemmyStrings();
final lemmurTranslations = await loadLemmurStrings();
portStrings(lemmyTranslations, lemmurTranslations, force: force);
await save(lemmurTranslations);
await repoCleanup();
await Process.run('npx', [
'prettier',
'lib/l10n/*.arb',
'--parser',
'json',
'--write',
'--print-width',
'1',
]);
await gen.main(args);
}
/// check if `toMigrate` has duplicate keys
void checkDuplicateKeys() {
final seen = <String>{};
for (final renamedKey in toMigrate.map((e) => e.renamedKey)) {
if (seen.contains(renamedKey)) {
printError(
'The renamedKey "$renamedKey" appears more than once in "toMigrate"');
}
seen.add(renamedKey);
}
}
/// returns a cleanup function
Future<Future<void> Function()> cloneLemmyTranslations() async {
await Process.run('git', ['clone', 'https://github.com/LemmyNet/$repoName']);
return () => Directory(repoName).delete(recursive: true);
}
/// Map<languageTag, Map<stringKey, stringValue>>
Future<Map<String, Map<String, String>>> loadLemmyStrings() async {
final translationsDir = Directory('$repoName/translations');
final translations = <String, Map<String, String>>{};
await for (final file in translationsDir.list()) {
final transFile = File.fromUri(file.uri);
final trans = Map<String, String>.from(
jsonDecode(await transFile.readAsString()) as Map<String, dynamic>,
);
final localeName = file.uri.pathSegments.last.split('.json').first;
translations[localeName] = trans;
}
return translations;
}
/// Map<languageTag, Map<stringKey, stringValue>> + some metadata
Future<Map<String, Map<String, dynamic>>> loadLemmurStrings() async {
final translationsDir = Directory('lib/l10n');
final translations = <String, Map<String, dynamic>>{};
await for (final file in translationsDir.list()) {
if (!file.path.endsWith('.arb')) continue;
final transFile = File.fromUri(file.uri);
final trans =
jsonDecode(await transFile.readAsString()) as Map<String, dynamic>;
final localeName = file.uri.pathSegments.last
.split('.arb')
.first
.split(flutterIntlPrefix)
.last;
translations[localeName] = trans;
}
return translations;
}
/// will port them into `lemmurTranslations`
void portStrings(
Map<String, Map<String, String>> lemmyTranslations,
Map<String, Map<String, dynamic>> lemmurTranslations, {
bool force = false,
}) {
// port all languages
for (final language in lemmyTranslations.keys) {
if (!lemmurTranslations.containsKey(language)) {
lemmurTranslations[language] = {'@@locale': language};
}
}
for (final migrate in toMigrate) {
if (!lemmyTranslations[baseLanguage].containsKey(migrate.key)) {
printError('"${migrate.key}" does not exist in $repoName');
}
if (lemmurTranslations[baseLanguage].containsKey(migrate.renamedKey) &&
!force) {
confirm('"${migrate.key}" already exists in lemmur, overwrite?');
}
final variableName = RegExp(r'{{([\w_]+)}|')
.firstMatch(lemmyTranslations[baseLanguage][migrate.key])
?.group(1);
final metadata = <String, dynamic>{
if (variableName != null)
'placeholders': {
variableName: {
if (migrate.type != null) 'type': migrate.type,
if (migrate.format != null) 'format': migrate.format,
},
},
};
// ignore: omit_local_variable_types
String Function(Map<String, String> translations) transformer =
(translations) => translations[migrate.key];
// check if it has a plural form
if (lemmyTranslations[baseLanguage].containsKey('${migrate.key}_plural')) {
transformer = (translations) {
if (translations[migrate.key] == null) return null;
final fixedVariables = translations[migrate.key]
.replaceAll('{{$variableName}}', '{$variableName}');
final pluralForm = () {
if (translations.containsKey('${migrate.key}_plural')) {
return translations['${migrate.key}_plural']
.replaceAll('{{$variableName}}', '{$variableName}');
}
return null;
}();
return '{$variableName,plural, =1{$fixedVariables}${pluralForm != null ? ' other{$pluralForm}' : ''}}';
};
}
for (final trans in lemmyTranslations.entries) {
final language = trans.key;
final strings = trans.value;
lemmurTranslations[language][migrate.renamedKey] = transformer(strings);
}
lemmurTranslations[baseLanguage][migrate.renamedKey] =
migrate.transform(transformer(lemmyTranslations[baseLanguage]));
lemmurTranslations[baseLanguage]['@${migrate.renamedKey}'] = metadata;
}
}
Future<void> save(Map<String, Map<String, dynamic>> lemmurTranslations) async {
// remove null fields
// Vec<(language, key)>
final toRemove = <List<String>>[];
for (final translations in lemmurTranslations.entries) {
final language = translations.key;
for (final strings in translations.value.entries) {
if (strings.value == null) {
toRemove.add([language, strings.key]);
}
}
}
for (final rem in toRemove) {
lemmurTranslations[rem[0]].remove(rem[1]);
}
for (final language in lemmurTranslations.keys) {
await File('lib/l10n/$flutterIntlPrefix$language.arb')
.writeAsString(jsonEncode(lemmurTranslations[language]));
}
}

View File

@ -1,11 +1,13 @@
/// Used to create a new lemmur release. Bumps semver, build number, updates changelog, fastlane, pubspec, and finishes by adding a git tag
import 'dart:io';
import 'common.dart';
Future<void> main(List<String> args) async {
await assertNoStagedGit();
if (args.isEmpty || !{'patch', 'minor', 'major'}.contains(args[0])) {
print('Unknown version bump type');
exit(1);
printError('Unknown version bump type');
}
final version = await bumpedVersion(args[0]);
@ -25,8 +27,7 @@ Future<void> assertNoStagedGit() async {
await Process.run('git', ['diff-index', '--cached', '--quiet', 'HEAD']);
if (res.exitCode != 0) {
print('You have staged files, commit or unstage them.');
exit(1);
printError('You have staged files, commit or unstage them.');
}
}
@ -126,16 +127,3 @@ Future<void> runGitCommands(Version version) async {
await Process.run('git', ['tag', 'v${version.toStringNoCode()}']);
print('done');
}
void confirm(String message) {
stdout.write('$message [y/n] ');
switch (stdin.readLineSync()) {
case 'y':
case 'yes':
break;
default:
print('Exiting');
exit(1);
}
}