From a19259f08e3b9c9194945daac7d9612993d290ef Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 25 Aug 2020 15:19:23 +0000 Subject: [PATCH 01/22] Translated using Weblate (Turkish) Currently translated at 70.0% (7 of 10 strings) Translation: Tusky/Tusky description Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/tr/ Translated using Weblate (Slovenian) Currently translated at 20.0% (2 of 10 strings) Translation: Tusky/Tusky description Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/sl/ Translated using Weblate (Italian) Currently translated at 30.0% (3 of 10 strings) Translation: Tusky/Tusky description Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/it/ Translated using Weblate (Dutch) Currently translated at 50.0% (5 of 10 strings) Translation: Tusky/Tusky description Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/nl/ Translated using Weblate (French) Currently translated at 90.0% (9 of 10 strings) Translation: Tusky/Tusky description Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/fr/ --- fastlane/metadata/android/fr/changelogs/70.txt | 2 +- fastlane/metadata/android/it/changelogs/58.txt | 2 +- fastlane/metadata/android/nl/changelogs/68.txt | 2 +- fastlane/metadata/android/sl/short_description.txt | 2 +- fastlane/metadata/android/tr/full_description.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fastlane/metadata/android/fr/changelogs/70.txt b/fastlane/metadata/android/fr/changelogs/70.txt index 083eb5679..832aec90b 100644 --- a/fastlane/metadata/android/fr/changelogs/70.txt +++ b/fastlane/metadata/android/fr/changelogs/70.txt @@ -5,4 +5,4 @@ Tusky v10.0 - Vous pouvez maintenant ajouter des listes à l'écran principal. - Vous pouvez désormais publier des pièces jointes audio avec Tusky. -Et beaucoup d'autres petites améliorations et corrections de bugs! +Et beaucoup d'autres petites améliorations et corrections de bugs ! diff --git a/fastlane/metadata/android/it/changelogs/58.txt b/fastlane/metadata/android/it/changelogs/58.txt index 1f8cef3c1..08c03baac 100644 --- a/fastlane/metadata/android/it/changelogs/58.txt +++ b/fastlane/metadata/android/it/changelogs/58.txt @@ -5,4 +5,4 @@ Tusky v6.0 - Le liste possono ora essere modificate - Sicurezza: rimosso il supporto per TLS 1.0 e TLS 1.1.1, e aggiunto il supporto per TLS 1.3 su Android 6+. - La vista della composizione suggerirà ora le emojis personalizzate quando si inizia a digitare -- Nuova impostazione del tema "Segui il tema de +- Nuova impostazione del tema "Segui il tema del diff --git a/fastlane/metadata/android/nl/changelogs/68.txt b/fastlane/metadata/android/nl/changelogs/68.txt index 61b9e7522..2c6e91e66 100644 --- a/fastlane/metadata/android/nl/changelogs/68.txt +++ b/fastlane/metadata/android/nl/changelogs/68.txt @@ -1,3 +1,3 @@ Tusky v9.1 -This release ensures compatibility with Mastodon 3 and improves performance and stability. +Deze versie garandeert compatibiliteit met Mastodon 3 en verbetert prestaties en stabiliteit. diff --git a/fastlane/metadata/android/sl/short_description.txt b/fastlane/metadata/android/sl/short_description.txt index c1b4b901f..01bd82c7b 100644 --- a/fastlane/metadata/android/sl/short_description.txt +++ b/fastlane/metadata/android/sl/short_description.txt @@ -1 +1 @@ -Odjemalec z več računi za socialno omrežje Mastodon +Odjemalec z več računi za socialno omrežje Mastodon. diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr/full_description.txt index d741acbd6..f3cb6237f 100644 --- a/fastlane/metadata/android/tr/full_description.txt +++ b/fastlane/metadata/android/tr/full_description.txt @@ -9,4 +9,4 @@ Tusky, ücretsiz ve açık kaynaklı bir sosyal ağ sunucusu olan Mastodon için • Tüm ekran boyutları için optimize edilmiş arayüz • Tamamen açık kaynak - Google hizmet servisi gibi özgür olmayan bağımlılıklar yok -Mastodon hakkında daha fazla bilgi edinmek için https://joinmastodon.org/ adresini ziyaret edin +Mastodon hakkında daha fazla bilgi edinmek için https://joinmastodon.org/ adresini ziyaret edin. From 67d50efd7a41e94f218e609c6b87cfebc9ce67a6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 27 Aug 2020 02:00:07 +0000 Subject: [PATCH 02/22] Translated using Weblate (Occitan) Currently translated at 94.2% (407 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/oc/ Translated using Weblate (Dutch) Currently translated at 94.9% (410 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nl/ Translated using Weblate (Persian) Currently translated at 99.3% (429 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Basque) Currently translated at 96.0% (415 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/eu/ Translated using Weblate (German) Currently translated at 98.3% (425 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/de/ Translated using Weblate (Czech) Currently translated at 99.0% (428 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/cs/ Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans/ Translated using Weblate (Berber) Currently translated at 7.1% (31 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ber/ Translated using Weblate (Chinese (Simplified, Singapore)) Currently translated at 80.3% (347 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans_SG/ Translated using Weblate (Hindi) Currently translated at 88.1% (381 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/hi/ Translated using Weblate (Malayalam) Currently translated at 24.5% (106 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ml/ Translated using Weblate (Chinese (Simplified)) Currently translated at 99.7% (431 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans/ Translated using Weblate (Polish) Currently translated at 98.6% (426 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ Translated using Weblate (Dutch) Currently translated at 94.6% (409 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nl/ Translated using Weblate (French) Currently translated at 99.5% (430 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fr/ Translated using Weblate (Persian) Currently translated at 99.3% (429 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Basque) Currently translated at 95.8% (414 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/eu/ Translated using Weblate (Spanish) Currently translated at 99.5% (430 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/es/ Translated using Weblate (German) Currently translated at 97.6% (422 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/de/ Translated using Weblate (Czech) Currently translated at 99.0% (428 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/cs/ Translated using Weblate (Catalan) Currently translated at 98.6% (426 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ca/ Translated using Weblate (Gaelic) Currently translated at 11.5% (50 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/gd/ --- app/src/main/res/values-ber/strings.xml | 5 +-- app/src/main/res/values-ca/strings.xml | 8 ++--- app/src/main/res/values-cs/strings.xml | 30 ++++++++-------- app/src/main/res/values-de/strings.xml | 42 ++++++++++++---------- app/src/main/res/values-es/strings.xml | 6 ++-- app/src/main/res/values-eu/strings.xml | 12 +++---- app/src/main/res/values-fa/strings.xml | 4 +++ app/src/main/res/values-fr/strings.xml | 4 +++ app/src/main/res/values-gd/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 8 +++++ app/src/main/res/values-ml/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 8 ++--- app/src/main/res/values-oc/strings.xml | 8 ++--- app/src/main/res/values-pl/strings.xml | 18 +++++----- app/src/main/res/values-zh-rCN/strings.xml | 10 ++++-- app/src/main/res/values-zh-rSG/strings.xml | 2 +- 16 files changed, 97 insertions(+), 71 deletions(-) diff --git a/app/src/main/res/values-ber/strings.xml b/app/src/main/res/values-ber/strings.xml index b2992ab3f..35106996b 100644 --- a/app/src/main/res/values-ber/strings.xml +++ b/app/src/main/res/values-ber/strings.xml @@ -8,9 +8,9 @@ ⵉⵙⵎⴻⵏⵢⵉⴼⴻⵏ ⴰⵎⴻⵖⵏⵓ ⵎⴷⴻⵍ - ⵝⴻⵍⵍⴰ ⴷ ⵝⵓⵛⴹⴰ. + ⵝⴻⵍⵍⴰ ⴷ ⵝⵓⵛⴹⴰ ⵝⴰⴲⴸⴰⵔⵉⵏ - ⵝⴰⴲⴸⴰⵔⵉⵏ + ⵝⵉⴲⴸⴰⵔⵉⵏ ⵖⴻⴼ ⵡⴻⵏⵏⴻⵣ ⵝⵉⴽⴻⵍⵜ ⵏⵏⵉⴸⴻⵏ ⵏⴰⴸⵉ @@ -30,4 +30,5 @@ ⴽⴽⴻⵙ ⵉⵔⴻⵡⵡⴰⵢⴻⵏ ⵉⵎⵙⴻⵇⴷⴰⵛⴻⵏ ⵜⵙⵡⴰⵃⵍⴻⵎ + ⵉⵛⵛⴰⵔⴻⵏ \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index e95715c18..11d7f5d4e 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -330,12 +330,12 @@ Utilitzar el temps absolut La informació de sota pot mostrar el perfil incomplert de l\'usuari. Clica per obrir el perfil complert al navegador. - - + %1$s Favorit + %1$s Favorits - - + + Impulsat per Marcat favorit per diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 8a2a2e817..a539c505a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -332,7 +332,7 @@ %1$s oblíbení %1$s oblíbení - %1$s oblíbení + %s boost @@ -388,24 +388,24 @@ Anketa, ve které jste hlasoval/a, skončila Anketa, kterou jste vytvořil/a, skončila - - - + %d den + %d dny + %d dní - - - + %d hodina + %d hodiny + %d hodin %d minuta - %d minut - + %d minuty + %d minut - - - + %d sekunda + %d sekundy + %d sekund Animovat avatary GIF Anketa s volbami: %1$s, %2$s, %3$s, %4$s; %5$s @@ -482,9 +482,9 @@ Odkrýt %s Ztišit @%s\? - %s osoba - %s osoby - %s osob + + + %s požádal/a aby vás mohl/a sledovat Zobrazit dialogové okno s potvrzením při boostování diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 666396ea4..3b21ed174 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -10,7 +10,7 @@ Autorisierung fehlgeschlagen. Es konnte kein Login-Token abgerufen werden. Der Beitrag ist zu lang! - Die Datei muss kleiner als 8MB sein. + Die Datei muss kleiner als 8 MB sein. Videodateien müssen kleiner als 40 MB sein. Dieser Dateityp darf nicht hochgeladen werden. Die Datei konnte nicht geöffnet werden. @@ -18,7 +18,7 @@ Eine Berechtigung wird zum Speichern des Mediums benötigt. Bilder und Videos können nicht beide gleichzeitig an einen Beitrag angehängt werden. Die Mediendatei konnte nicht hochgeladen werden. - Fehler beim Senden des Status + Fehler beim Senden des Beitrags. Start Benachrichtigungen Lokal @@ -59,7 +59,7 @@ Teilen Boost entfernen Favorisieren - Favoriten entfernen + Favorisierung entfernen Mehr Beitrag erstellen Anmelden mit Mastodon @@ -92,7 +92,7 @@ Stummschalten Lautschalten Erwähnen - Verstecke Medien + Medien verstecken Drawer öffnen Speichern Profil bearbeiten @@ -123,7 +123,7 @@ Beitragsinhalt teilen… Mediendatei teilen… Gesendet! - entblockt + Entblockt Stummschaltung aufgehoben Gesendet! Antwort erfolgreich gesendet. @@ -149,7 +149,7 @@ \n\nWeitere Informationen gibt es auf joinmastodon.org. Stelle Medienupload fertig - Lade hoch… + Lade hoch … Herunterladen Folgeanfrage zurückziehen? Willst du diesem Profil wirklich nicht mehr folgen? @@ -158,8 +158,8 @@ Ungelistet: Nicht in der öffentlichen Timeline sichtbar Nur Folgende: Nur für Folgende sichtbar Direkt: Nur für Erwähnte sichtbar - Benachrichtigungen - Benachrichtigungseinstellungen + Benachrichtigungseinstellungen + Benachrichtigungen Benachrichtigungen Benachrichtige mit Sound Benachrichtige mit Vibration @@ -197,7 +197,7 @@ Beiträge Fehler beim Synchronisieren Öffentlich - Ungelistet + Nicht gelistet Nur Folgende Schriftgröße Kleiner @@ -208,10 +208,10 @@ Neue Erwähnungen Benachrichtigungen über neue Erwähnungen Neue Folgende - Benachrichtigungen über neue Folgende + Benachrichtigunen über neue Folgende Geteilte Beiträge Benachrichtigungen wenn deine Beiträge geteilt werden - Favoriten + Favorisierte Beiträge Benachrichtigungen wenn deine Beiträge favorisiert werden %s hat dich erwähnt %1$s, %2$s, %3$s und %4$d andere @@ -227,7 +227,7 @@ to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html * the url can be changed to link to the localized version of the license. --> - Webseite des Projekts: + Website des Projekts: \n https://tusky.app Fehlermeldungen & Verbesserungsvorschläge:\n https://github.com/tuskyapp/Tusky/issues @@ -286,10 +286,10 @@ Später Neustarten Die Standard-Emojis deines Geräts - Die Blob-Emojis aus Android 4.4-7.1 + Die Blob–Emojis aus Android 4.4–7.1 Die Standard-Emojis von Mastodon Die aktuellen Emojis von Google - Download fehlgeschlagen + Download fehlgeschlagen. Bot %1$s ist umgezogen auf: An ursprüngliches Publikum teilen @@ -381,7 +381,7 @@ %s verstecken %s nicht mehr versteckt Bist du dir sicher, dass du die Domain %s blockieren willst\? Nach der Blockierung wirst du nichts mehr von dieser Domain in öffentlichen Zeitleisten oder Benachrichtigungen sehen. Deine Follower von dieser Domain werden entfernt. - ganze Domain verbergen + Ganze Domain verbergen GIF-Avatare animieren Ganzes Wort Wenn das Schlagwort nur aus Buchstaben und Zahlen besteht, wird es nur angewendet, wenn es dem ganzen Wort entspricht @@ -404,7 +404,7 @@ 3 Tage 7 Tage Editieren - Tusky %s + test %s Umfrage hinzufügen Beiträge mit Inhaltswarnungen immer ausklappen Umfrage mit den Möglichkeiten: %1$s, %2$s, %3$s, %4$s; %5$s @@ -420,7 +420,7 @@ Geplante Beiträge Plane Beitrag Zurücksetzen - Audiodateien müssen kleiner als 40MB sein. + Audiodateien müssen kleiner als 40 MB sein. Lesezeichen Lesezeichen Lesezeichen @@ -452,7 +452,7 @@ Farbverlauf für versteckte Medien anzeigen Unten Oben - Ton einschalten %s + %s nicht mehr verstecken %s Boost %s Boosts @@ -461,5 +461,9 @@ Benachrichtigungen ausblenden Benachrichtigungen stummschalten von %s Benachrichtigungs-Ton einschalten von %s - Ton einschalten %s + %s nicht mehr verstecken + %dS + %d St. + in %d T. + %d J. \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1f9aefdaf..2ba22bd38 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -330,8 +330,8 @@ Mostrar indicador de bots Votar - - + %d día + %d días @@ -439,7 +439,7 @@ Reiniciar Error al buscar el post %s Potenciado por Tusky - Marcadores + Favoritos Marcador Marcadores Marcado como favorito diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index e59da2513..68c749757 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -383,8 +383,8 @@ %s irudiarentzako ekintzak %1$s • %2$s - - + Boto %s + %s Boto %s amaitzen da Itxita @@ -400,8 +400,8 @@ %d ordu - Minutu %d - %d minutu + + Segundu %d @@ -456,7 +456,7 @@ Ez erakutsi jakinarazpenak Desmututu %s - Pertsona %s - %s pertsona + + \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 80707e705..461058924 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -464,4 +464,8 @@ خموشی آگاهی‌ها از %s ناخموشی آگاهی‌ها از %s ناخموشی %s + + %s رای + + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 09f96374b..1fee6ea69 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -476,4 +476,8 @@ Silencier les notifications de %s Ne plus silencier les notifications de %s Ne plus masquer %s + + %s personne + %s personnes + \ No newline at end of file diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml index be0a5b0a5..5ec758f1a 100644 --- a/app/src/main/res/values-gd/strings.xml +++ b/app/src/main/res/values-gd/strings.xml @@ -29,7 +29,7 @@ TÚT! Meur-chlàr emoji Sguir a leantainn - Lean + Leantainn Tuilleadh Ath-ghairm Dùin diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index ec584ff74..028f62245 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -396,4 +396,12 @@ %s ने आपको फ़ॉलो किया बूस्ट दिखाएं बूस्ट दिखाएं + + %1$s ने पसंद किया + %1$s ने पसंद किया + + + %d मिनट + %d मिनट + \ No newline at end of file diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 4e5f45aad..0f8199673 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -108,4 +108,5 @@ മുന്‍നിശ്ചയിച്ച ടൂറ്റ്‌സ് കരടുകൾ തിരുത്ത് + അറിയിപ്പുകൾ \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 3b0898f26..40ba99875 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -368,8 +368,8 @@ Weet je zeker dat je alle meldingen permanent wilt verwijderen\? %1$s • %2$s - - + %s stem + %s stemmen %s over eindigt op %s @@ -403,8 +403,8 @@ %d minuten - - + %d seconde + %d seconden Doorgaan Terug diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index c52203f3f..a01e3d14c 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -381,16 +381,16 @@ %d jorns - %d ora - %d oras + + %d minuta %d minutas - - + %d segonda + %d segondas Accions per l’imatge %s Activar l’animacion dels avatars diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 8303a4869..4ffb8f372 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -395,22 +395,22 @@ Ankieta, którą stworzyłeś(aś), zakończyła się %d dzień - - - + + + %d godzina - %d godziny - %d godzin - %d godzin - - - %d minuta + + %d minuta + + + + %d sekunda %d sekund diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 7698d7d93..452d77f1d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -81,7 +81,7 @@ 个人资料 设置 帐户设置 - 我的收藏 + 收藏 被隐藏的用户 被屏蔽的用户 关注请求 @@ -215,7 +215,7 @@ 当有用户关注我时 转嘟 当有用户转嘟了我的嘟文时 - 我的收藏 + 收藏 当有用户收藏了我的嘟文时 投票 当我参与的投票结束时 @@ -413,7 +413,7 @@ 编辑 书签 隐藏域名 - 新增意见调查 + 新增投票 定时嘟文 预订嘟文 %s 已解除静音 @@ -483,4 +483,8 @@ %s 请求关注你 主导航位置 隐藏顶部工具栏的标题 + + %s 人 + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rSG/strings.xml b/app/src/main/res/values-zh-rSG/strings.xml index 31ff31a88..f65688d26 100644 --- a/app/src/main/res/values-zh-rSG/strings.xml +++ b/app/src/main/res/values-zh-rSG/strings.xml @@ -129,7 +129,7 @@ 报告已发送! 已解除屏蔽 已取消隐藏 - 已发送! + 报告已发送! 成功发布回复 域名 有什么新鲜事? From 234a41e921441e664c3a9f20ce380af3129b31b9 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Thu, 27 Aug 2020 02:00:07 +0000 Subject: [PATCH 03/22] Translated using Weblate (Italian) Currently translated at 96.5% (417 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/it/ Translated using Weblate (French) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fr/ Translated using Weblate (Spanish) Currently translated at 99.5% (430 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/es/ Translated using Weblate (Icelandic) Currently translated at 94.9% (410 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/is/ Translated using Weblate (Polish) Currently translated at 98.1% (424 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ --- app/src/main/res/values-es/strings.xml | 4 ++-- app/src/main/res/values-fr/strings.xml | 7 ++++++- app/src/main/res/values-is/strings.xml | 18 +++++++++++++++++- app/src/main/res/values-it/strings.xml | 12 ++++++------ app/src/main/res/values-pl/strings.xml | 18 +++++++++--------- 5 files changed, 40 insertions(+), 19 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2ba22bd38..7213546ba 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -16,7 +16,7 @@ No pudo abrirse el fichero. Se requiere permiso para acceder al almacenamiento. Se requiere permiso para descargar al almacenamiento. - No se pueden adjuntar imágenes y vídeos en el mismo estado + No se pueden adjuntar imágenes y vídeos en el mismo estado. La subida falló. Error al publicar. Inicio @@ -439,7 +439,7 @@ Reiniciar Error al buscar el post %s Potenciado por Tusky - Favoritos + Marcadores Marcador Marcadores Marcado como favorito diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 1fee6ea69..a236f74b8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -415,7 +415,7 @@ Échec du signalement Échec de récupération des statuts Le rapport sera envoyé aux modérateur·rice·s de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous : - Êtes-vous sûr⋅e de vouloir bloquer %s en entier? Vous ne verrez plus de contenu provenant de ce domaine, ni dans fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s. + Êtes-vous sûr⋅e de vouloir bloquer %s en entier \? Vous ne verrez plus de contenu provenant de ce domaine, ni dans les fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s. Terminé Le compte provient d’un autre serveur. Envoyez également une copie anonyme du rapport \? Montrer le filtre des notifications @@ -480,4 +480,9 @@ %s personne %s personnes + Cacher le titre de la barre d’outils supérieure + + %s voix + %s voix + \ No newline at end of file diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 7d1088b95..242d64884 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -153,7 +153,7 @@ Aðvörun vegna efnis Birtingarnafn Æviágrip - Leita... + Leita… Engar niðurstöður Svara… Auðkennismynd @@ -423,4 +423,20 @@ %s Endurbirting %s Endurbirtingar + + %d sekúnda + %d sekúndur + + + %d mínúta + %d mínútur + + + %d klukkustund + %d klukkustundir + + + %d dagur + %d dagar + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6a881e0b1..ce9986aa8 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -141,12 +141,12 @@ Cos\'è un\'istanza? Connessione… L\'indirizzo o il dominio di qualsiasi istanza può essere inserito qui, come mastodon.social, icosahedron.website, social.tchncs.de, e altro! -\n -\nSe non hai ancora un account, puoi inserire il nome di un\'istanza alla quale vuoi iscriverti e creare un account. -\n +\n +\nSe non hai ancora un account, puoi inserire il nome di un\'istanza alla quale vuoi iscriverti e creare un account. +\n \nUn\'istanza è il luogo dove l\'account è custodito, ma puoi facilmente comunicare e seguire gente su altre istanze come se fossero sullo stesso sito. -\n -\nPiù info possono essere trovate su joinmastodon.org. +\n +\nPiù info possono essere trovate su joinmastodon.org. Terminando il caricamento dei media Caricamento… Scarica @@ -379,7 +379,7 @@ Domini nascosti Silenzia %s %s mostrati - Sei sicuro di voler bloccare tutto %s\? Non vedrai nessun contenuto da quel dominio in nessuna timeline pubblica o nelle tue notifiche. I tuoi seguaci che stanno in quel dominio saranno rimossi + Sei sicuro di voler bloccare tutto %s\? Non vedrai nessun contenuto da quel dominio in nessuna timeline pubblica o nelle tue notifiche. I tuoi seguaci che stanno in quel dominio saranno rimossi. Nascondi l\'intero dominio Le votazioni sono finite Mostra le animazioni delle GIF negli avatar diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4ffb8f372..470b3b095 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -395,21 +395,21 @@ Ankieta, którą stworzyłeś(aś), zakończyła się %d dzień - - - + %d dni + %d dni + %d dni %d godzina - - - + %d godziny + %d godzin + %d godzin %d minuta - - - + %d minuty + %d minut + %d minut %d sekunda From f218d8e25d855a098073e6879031ffc2234a7d71 Mon Sep 17 00:00:00 2001 From: test8421 Date: Thu, 27 Aug 2020 02:00:08 +0000 Subject: [PATCH 04/22] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans/ Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 71 +++++++++++----------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 452d77f1d..82e97c361 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -87,7 +87,7 @@ 关注请求 媒体 在浏览器中打开 - 从相册中选择 + 添加媒体 拍照 分享 隐藏 @@ -164,7 +164,7 @@ 通知 通知 提醒 - 通知铃声 + 铃声 振动 呼吸灯 事件 @@ -177,9 +177,9 @@ 应用主题 时间轴 过滤器 - 黑夜 - 白天 - 暗色 + 暗色 + 亮色 + 黑色 自动切换 跟随系统设定 浏览器 @@ -220,8 +220,8 @@ 投票 当我参与的投票结束时 %s 提及了你 - %1$s, %2$s, %3$s 和 %4$d 人 - %1$s, %2$s, 和 %3$s + %1$s,%2$s,%3$s 和 %4$d 等人 + %1$s,%2$s 和 %3$s %1$s 和 %2$s %d 个新互动 锁嘟用户 @@ -245,7 +245,7 @@ Tusky 官方帐号 分享嘟文内容 分享嘟文链接 - 照片 + 图片 视频 已发送关注请求 @@ -288,7 +288,8 @@ 从列表中移除用户 以 %1$s 发布嘟文 设置图片标题失败 - 为视觉障碍用户提供的描述\n(限制 %d 字) + 为视觉障碍用户提供的描述 +\n(限制 %d 字) 设置图片标题 移除 保护你的帐户(锁嘟) @@ -297,9 +298,9 @@ 正在发送… 发送失败 嘟文发送中 - 发送已被取消 + 已取消发送 嘟文已保存为草稿 - 发表新嘟文 + 发表嘟文 当前实例 %s 没有自定义表情符号 已复制到剪贴板 表情符号风格 @@ -343,14 +344,10 @@ 收藏 %1$s %1$s 和 %2$s - %1$s, %2$s 和 %3$d 等人 + %1$s,%2$s 和 %3$d 等人 标签页不能超过 %1$d 个 - - 媒体: %s - - - 内容提醒: %s - + 媒体:%s + 内容提醒:%s 没有媒体描述信息 @@ -366,7 +363,7 @@ 不公开 - 关注者 + 仅关注者 私信 @@ -375,8 +372,8 @@ 清空 分类 应用 - 发表新嘟文 - 发表新嘟文 + 发表嘟文 + 发表嘟文 显示机器人标志 你确定要永久清空通知列表吗? @@ -407,27 +404,27 @@ 重置 音频文件大小必须小于40M。 书签 - 隐藏域名 + 隐藏的域名 定时嘟文 书签 编辑 书签 - 隐藏域名 + 隐藏的域名 新增投票 定时嘟文 预订嘟文 - %s 已解除静音 - 隐藏整个域 + %s 已取消隐藏 + 隐藏来自该域名的所有嘟文 动画GIF头像 由Tusky提供支持 始终扩展标有内容警告的嘟文 整个单词 如果关键字或缩写只有字母或数字,则只有在匹配整个单词时才会应用 - Google正在使用的Emoji符号集 - 已收藏 - 使用以下选项创建投票:%1$s, %2$s, %3$s, %4$s; %5$s - 选择清单 - 清单 + Google正在使用的表情符号 + 被加入书签 + 使用以下选项创建投票:%1$s,%2$s,%3$s,%4$s;%5$s + 选择列表 + 列表 继续 返回 完成 @@ -439,7 +436,7 @@ 该报告将发送给给您的服务器管理员。您可以在下面提供有关回报此帐户的原因的说明: 该帐户来自其他服务器。向那里发送一份匿名的报告副本? 账户 - 搜寻失败 + 搜索失败 显示通知过滤器 投票 5 分钟 @@ -450,10 +447,10 @@ 3 天 7 天 添加选择 - 多个选择 + 多项选择 选择 %d 编辑 - 查找帖子时出错 %s + 查找嘟文时出错 %s 您没有草稿。 您没有任何定时嘟文。 Mastodon的最小预订时间为5分钟。 @@ -473,16 +470,16 @@ 确定隐藏 @%s? 确定屏蔽 @%s? 确定要完全屏蔽 %s 吗?您将不能在公共时间轴和通知内看见来自此域名的内容,且您在此域名上的关注者将会被移除。 - 取消隐藏本会话的通知 - 隐藏本会话的通知 + 取消隐藏会话 + 隐藏会话 取消隐藏 %s 隐藏 %s 隐藏来自 %s 的通知 取消隐藏来自 %s 的通知 取消隐藏 %s %s 请求关注你 - 主导航位置 - 隐藏顶部工具栏的标题 + 导航栏位置 + 隐藏顶部工具栏标题 %s 人 From bda5965f1409ea40ee58847c8ff62bcc34be6174 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 27 Aug 2020 02:00:08 +0000 Subject: [PATCH 05/22] Translated using Weblate (Chinese (Simplified, Singapore)) Currently translated at 80.5% (348 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans_SG/ Translated using Weblate (German) Currently translated at 98.3% (425 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/de/ Translated using Weblate (Chinese (Simplified, Singapore)) Currently translated at 80.5% (348 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans_SG/ Translated using Weblate (Slovenian) Currently translated at 92.5% (400 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sl/ Translated using Weblate (Chinese (Traditional)) Currently translated at 84.4% (365 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hant/ Translated using Weblate (Chinese) Currently translated at 78.9% (341 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_MO/ Translated using Weblate (Chinese (Hong Kong)) Currently translated at 78.9% (341 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hant_HK/ Translated using Weblate (Malayalam) Currently translated at 25.0% (108 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ml/ Translated using Weblate (German) Currently translated at 98.3% (425 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/de/ Translated using Weblate (Ukrainian) Currently translated at 27.3% (118 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/uk/ Translated using Weblate (Czech) Currently translated at 98.8% (427 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/cs/ Translated using Weblate (Gaelic) Currently translated at 12.0% (52 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/gd/ Translated using Weblate (Bengali (Bangladesh)) Currently translated at 94.6% (409 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/bn_BD/ Translated using Weblate (Gaelic) Currently translated at 12.0% (52 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/gd/ Translated using Weblate (Ukrainian) Currently translated at 27.3% (118 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/uk/ Translated using Weblate (Chinese (Simplified, Singapore)) Currently translated at 80.5% (348 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans_SG/ Translated using Weblate (Hindi) Currently translated at 88.1% (381 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/hi/ Translated using Weblate (Malayalam) Currently translated at 25.0% (108 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ml/ Translated using Weblate (Chinese (Traditional)) Currently translated at 84.4% (365 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hant/ Translated using Weblate (Chinese) Currently translated at 78.9% (341 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_MO/ Translated using Weblate (Chinese (Hong Kong)) Currently translated at 78.9% (341 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hant_HK/ Translated using Weblate (Tamil) Currently translated at 61.3% (265 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ta/ Translated using Weblate (Polish) Currently translated at 98.1% (424 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ --- app/src/main/res/values-bn-rBD/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 14 +++++++------- app/src/main/res/values-de/strings.xml | 12 ++++++------ app/src/main/res/values-gd/strings.xml | 6 ++++-- app/src/main/res/values-hi/strings.xml | 8 ++++++-- app/src/main/res/values-ml/strings.xml | 16 +++++++++------- app/src/main/res/values-pl/strings.xml | 10 +++++----- app/src/main/res/values-sl/strings.xml | 6 ++++++ app/src/main/res/values-ta/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 5 ++++- app/src/main/res/values-zh-rHK/strings.xml | 15 ++++++++------- app/src/main/res/values-zh-rMO/strings.xml | 11 ++++++----- app/src/main/res/values-zh-rSG/strings.xml | 7 ++++--- app/src/main/res/values-zh-rTW/strings.xml | 11 ++++++----- 14 files changed, 73 insertions(+), 51 deletions(-) diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 42b80c1e3..e14d254ec 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -1,7 +1,7 @@ %1$s - %ds + %dসে পছন্দগুলি সহ নর্বাচন: %1$s, %2$s, %3$s, %4$s; %5$s সরাসরি অনুগামিবৃন্দ diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index a539c505a..3dc6cbcb9 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -332,7 +332,7 @@ %1$s oblíbení %1$s oblíbení - + %s boost @@ -393,9 +393,9 @@ %d dní - %d hodina - %d hodiny - %d hodin + + + %d minuta @@ -482,9 +482,9 @@ Odkrýt %s Ztišit @%s\? - - - + + + %s požádal/a aby vás mohl/a sledovat Zobrazit dialogové okno s potvrzením při boostování diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3b21ed174..eeac52262 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ Ein Fehler ist aufgetreten. - Ein Netzwerkfehler ist aufgetreten! Bitte überprüfen deine Internetverbindung und versuche es erneut! + Ein Netzwerkfehler ist aufgetreten! Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut! Dies darf nicht leer sein. Ungültige Domain angegeben Authentifizieren mit dieser Instanz fehlgeschlagen. @@ -36,7 +36,7 @@ Blockierte Profile Folgeanfragen Dein Profil bearbeiten - Gespeicherte Beiträge + Entwürfe Lizenzen \@%s %s teilte @@ -123,7 +123,7 @@ Beitragsinhalt teilen… Mediendatei teilen… Gesendet! - Entblockt + entblockt Stummschaltung aufgehoben Gesendet! Antwort erfolgreich gesendet. @@ -158,7 +158,7 @@ Ungelistet: Nicht in der öffentlichen Timeline sichtbar Nur Folgende: Nur für Folgende sichtbar Direkt: Nur für Erwähnte sichtbar - Benachrichtigungseinstellungen + Benachrichtigungen Benachrichtigungen Benachrichtigungen Benachrichtige mit Sound @@ -359,7 +359,7 @@ Geschlossen Abstimmen Eine Umfrage in der du abgestimmt hast ist vorbei - Eine Umfrage, die du erstellt hast, ist vorbei + Eine Umfrage die du erstellt hast ist vorbei %d Tag %d Tage @@ -462,7 +462,7 @@ Benachrichtigungen stummschalten von %s Benachrichtigungs-Ton einschalten von %s %s nicht mehr verstecken - %dS + %d Sek. %d St. in %d T. %d J. diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml index 5ec758f1a..ed594dc7e 100644 --- a/app/src/main/res/values-gd/strings.xml +++ b/app/src/main/res/values-gd/strings.xml @@ -29,12 +29,12 @@ TÚT! Meur-chlàr emoji Sguir a leantainn - Leantainn + Lean Tuilleadh Ath-ghairm Dùin TÙT - Sguab às + Cuir às Cuir às agus ath-sgrìobhadh Thoir cunntas air Dì-bhac @@ -50,4 +50,6 @@ Dreachdan Prìomhaich Fiosan + Fiosan + Prìomhaich \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 028f62245..e832afb55 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -401,7 +401,11 @@ %1$s ने पसंद किया - %d मिनट - %d मिनट + + + + + %d सेकेंड + %d सेकेंड \ No newline at end of file diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 0f8199673..72119eef6 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -22,7 +22,7 @@ ആധികാരികത ഉറപ്പുവരുത്താനായില്ല. ഒരു പ്രവേശന ടോക്കൺ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു. ഈ സ്റ്റാറ്റസ് വളരെ നീളമേറിയതാണ്! - ഫയൽ 8എംബിയിലും ചെറുതായിരിക്കണം. + ഫയൽ 8 എംബിയേക്കാളും ചെറുതായിരിക്കണം. ചലച്ചിത്ര ഫയലുകൾ 40എംബിയിലും ചെറുതായിരിക്കണം. ഇത്തരം ഫയൽ അപ്‌ലോഡ് ചെയ്യാൻ സാധിക്കില്ല. ഈ ഫയൽ തുറക്കാനായില്ല. @@ -44,8 +44,8 @@ പിന്തുടരലുകൾ പിന്തുടരുന്നവർ നിശ്ശബ്ദരാക്കിയ ഉപയോക്താക്കൾ - തടയപ്പെട്ട ഉപയോക്താക്കൾ - പിന്തുടാരാനുള്ള അപേക്ഷകൾ + നിരോധിച്ച ഉപയോഗതാക്കൾ + പിന്തുടാനുള്ള അപേക്ഷകൾ പ്രൊഫൈൽ തിരുത്തുക മറുപടി ബൂസ്റ്റ് @@ -56,7 +56,7 @@ പിന്തുടരുക പിന്‍തുടരുന്നത് അവസാനിപ്പിക്കുക വീണ്ടും ശ്രമിക്കുക - പിന്തുടാനുള്ള അപേക്ഷകൾ + പിന്‍തുടരുവാനുള്ള അഭ്യര്‍ത്ഥനകള്‍ മറച്ചുവെച്ച ഡൊമൈനുകൾ പിന്തുടരുന്നവർ പുതിയത് ലഭിക്കാൻ താഴേക്ക് വലിക്കുക @@ -74,9 +74,9 @@ പുനഃക്രമീകരിക്കുക ബ്രൗസറിൽ തുറക്കുക മാധ്യമം - മറച്ചുവെച്ച ഡൊമൈനുകൾ - തടയപ്പെട്ട ഉപയോക്താക്കൾ - നിശ്ശബ്ദരാക്കിയ ഉപയോക്താക്കൾ + മറയ്ക്കപ്പെട്ട ഡൊമൈനുകൾ + നിരോധിച്ച ഉപയോഗതാക്കൾ + നിശ്ശബ്ദമാക്കിയ ഉപയോഗതാക്കൾ ബൂക്കമാർക്ക് ഇഷ്ടപ്പെട്ടത് പ്രൊഫൈൽ @@ -109,4 +109,6 @@ കരടുകൾ തിരുത്ത് അറിയിപ്പുകൾ + ടാബുകൾ + അറിയിപ്പുകൾ \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 470b3b095..c30e5d722 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -396,14 +396,14 @@ %d dzień %d dni - %d dni - %d dni + + %d godzina - %d godziny - %d godzin - %d godzin + %d godzin + + %d minuta diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 9a60f25dd..dc5659f37 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -437,4 +437,10 @@ %s spodbudil Ključniki Zahteve za Sledenje + + %1$s Priljubljena + %1$s Priljubljeni + %1$s Priljubljene + %1$s Priljubljenih + \ No newline at end of file diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index f53ba26eb..2a5a035ea 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -278,4 +278,5 @@ பின்பற்றுபவர்கள் பட்டியலிடப்படாதவர்களுக்கு அனைவருக்கும் + எழுது \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index d819665fc..04f0f5deb 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -45,7 +45,7 @@ Пошук… Про себе Що відбувається\? - Надіслано! + Надіслати! Надіслано! Поділитися як … Відкрити як %s @@ -116,4 +116,7 @@ Медіа Сповіщення Сповіщення + Заблоковані користувачі + Вподобане + Запити на підписку \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index ad226a114..8affa3ce4 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -20,7 +20,7 @@ 媒體檔案上傳失敗 嘟文發送時出錯 主頁 - 通知 + 通知設定 本站時間軸 跨站公開時間軸 私信 @@ -30,7 +30,7 @@ 嘟文和回覆 已置頂 正在關注 - 僅關注者 + 關注者 我的收藏 被靜音的使用者 被封鎖的使用者 @@ -61,7 +61,7 @@ 收藏 取消收藏 更多 - 新嘟文 + 撰寫嘟文 登入 Mastodon 帳號 登出 確定要登出 %1$s 嗎? @@ -133,7 +133,7 @@ 成功送出回覆 域名 有什麼新鮮事? - 設定敏感內容警告 + 敏感內容警告 暱稱 簡介 搜尋… @@ -143,7 +143,7 @@ 標題 什麼是站點? 正在連線… - "請輸入你帳號所在的 Mastodon 站點的域名或地址 " + 請輸入你帳號所在的 Mastodon 站點的域名或地址 正在完成上傳… 正在上傳… 下載 @@ -155,7 +155,7 @@ 不公開:所有人可見,但不會出現在公開時間軸上 僅關注者:只有經過你確認後關注你的使用者可見 私信:只有被提及的使用者可見 - 通知設定 + 通知 通知 提醒 通知鈴聲 @@ -292,7 +292,7 @@ 嘟文發送中 發送已被取消 嘟文已儲存為草稿 - 撰寫嘟文 + 新嘟文 當前站點 %s 沒有自訂表情符號 已複製到剪貼簿 表情符號風格 @@ -402,4 +402,5 @@ 編輯 話題 關注請求 + 編輯 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml index 4fb27d248..151d3edca 100644 --- a/app/src/main/res/values-zh-rMO/strings.xml +++ b/app/src/main/res/values-zh-rMO/strings.xml @@ -30,7 +30,7 @@ 嘟文和回覆 已置頂 正在關注 - 僅關注者 + 關注者 我的收藏 被靜音的使用者 被封鎖的使用者 @@ -61,7 +61,7 @@ 收藏 取消收藏 更多 - 發表新嘟文 + 新嘟文 登入 Mastodon 帳號 登出 確定要登出 %1$s 嗎? @@ -129,7 +129,7 @@ 已發送! 已解除封鎖 已解除靜音 - 已發送! + 已檢舉! 成功送出回覆 域名 有什麼新鮮事? @@ -359,7 +359,7 @@ 不公開 - 僅關注者 + 關注者 私信 @@ -369,7 +369,7 @@ 分類 應用 發表新嘟文 - 新嘟文 + 發表新嘟文 顯示機器人標誌 你確定要永久清空通知列表嗎? @@ -400,4 +400,5 @@ 關注請求 話題 編輯 + 編輯 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rSG/strings.xml b/app/src/main/res/values-zh-rSG/strings.xml index f65688d26..14ffd697f 100644 --- a/app/src/main/res/values-zh-rSG/strings.xml +++ b/app/src/main/res/values-zh-rSG/strings.xml @@ -20,7 +20,7 @@ 媒体文件上传失败 嘟文发送时出错 主页 - 通知设置 + 通知 本站时间轴 跨站公共时间轴 私信 @@ -129,7 +129,7 @@ 报告已发送! 已解除屏蔽 已取消隐藏 - 报告已发送! + 已发送! 成功发布回复 域名 有什么新鲜事? @@ -159,7 +159,7 @@ 仅关注者:只有经过你确认后关注你的用户可见 私信:只有被提及的用户可见 通知设置 - 通知设置 + 通知 提醒 通知铃声 振动 @@ -404,4 +404,5 @@ 话题 编辑 编辑 + 关注请求 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a6b68854e..d0224a949 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -30,7 +30,7 @@ 嘟文和回覆 已置頂 正在關注 - 僅關注者 + 關注者 我的收藏 被靜音的使用者 被封鎖的使用者 @@ -143,7 +143,7 @@ 標題 什麼是站點? 正在連線… - "請輸入你帳號所在的 Mastodon 站點的域名或地址 " + 請輸入你帳號所在的 Mastodon 站點的域名或地址 正在完成上傳… 正在上傳… 下載 @@ -156,7 +156,7 @@ 僅關注者:只有經過你確認後關注你的使用者可見 私信:只有被提及的使用者可見 通知設定 - 通知設定 + 通知 提醒 通知鈴聲 振動 @@ -292,7 +292,7 @@ 嘟文發送中 發送已被取消 嘟文已儲存為草稿 - 撰寫嘟文 + 發表新嘟文 當前站點 %s 沒有自訂表情符號 已複製到剪貼簿 表情符號風格 @@ -407,7 +407,7 @@ 隱藏整個域名 GIF 動畫大頭貼 Tusky %s - 整個文字 + 整個單詞 如果關鍵字或短語僅為字母或數字,則只有在匹配整個單詞時才會應用 Google 正在使用的 Emoji 符號集 使用以下選項創建投票:%1$s, %2$s, %3$s, %4$s; %5$s @@ -426,4 +426,5 @@ 話題 關注請求 編輯 + 編輯 \ No newline at end of file From 7987b3703e933d5c96905541b64c9ad2f3bf2783 Mon Sep 17 00:00:00 2001 From: Ho Nhat Duy Date: Thu, 27 Aug 2020 02:00:08 +0000 Subject: [PATCH 06/22] Translated using Weblate (Vietnamese) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/vi/ --- app/src/main/res/values-vi/strings.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 1f99b5ac3..68676812a 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -82,7 +82,7 @@ Tiểu sử Tên hiển thị Nội dung nhạy cảm - Chuyện gì đang xảy ra\? + Bạn đang nghĩ về điều gì\? Bạn ở máy chủ nào\? Trả lời đã được gửi đi. Đã đăng! @@ -178,7 +178,7 @@ %s chia sẻ \@%s Giấy phép - Tút đã lên lịch + Lịch đăng Chỉnh sửa trang cá nhân Yêu cầu theo dõi Máy chủ đã ẩn @@ -191,7 +191,7 @@ Tương tác Tút Tút - Xếp Tab + Xếp tab Tin nhắn Thế giới Cộng đồng @@ -212,7 +212,7 @@ Ẩn nút viết tút khi xem bảng tin Sử dụng tab Chrome Trình duyệt - Sử dụng mặc định của thiết bị + Mặc định của thiết bị Tự động khi trời tối Đen Sáng @@ -306,8 +306,8 @@ Yêu cầu theo dõi Video Hình ảnh - Chia sẻ URL tút - Chia sẻ nội dung tút + URL tút + Nội dung của tút Trang cá nhân Tusky Hiện xác nhận trước khi chia sẻ Hiện xem trước của link @@ -455,4 +455,5 @@ Bỏ ẩn thông báo từ %s Bỏ ẩn %s Bỏ ẩn %s + Ẩn tên tab \ No newline at end of file From 2a7a7b981fb3ec18f8246a215feee62d102729b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Gera?= Date: Thu, 27 Aug 2020 02:00:08 +0000 Subject: [PATCH 07/22] Translated using Weblate (Hungarian) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/hu/ Translated using Weblate (Hungarian) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/hu/ --- app/src/main/res/values-hu/strings.xml | 107 +++++++++++++------------ 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 65c7dea55..834cd0708 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,7 +1,7 @@ Hiba történt. - Hálózati hiba történt! Kérjük, ellenőrizze a kapcsolatot, és próbálja meg újra! + Hálózati hiba történt! Kérjük, ellenőrizd a kapcsolatot, és próbálja meg újra! Ez nem lehet üres. Helytelen domén Sikertelen bejelentkezés ezen a szerveren. @@ -18,18 +18,18 @@ Média tárolási engedély szükséges. Képek és videók egyszerre nem csatolhatók ugyanazon tülköléshez. Feltöltés sikertelen. - A tülk elküldése nem sikerult. + Nem sikerült elküldeni a tülköt.. Kezdőlap Értesítések Helyi - Egyesített + Föderáció Közvetlen üzenetek Fülek Tülk Posztok Válaszokkal Rögzített - Követ + Követett Követő Kedvencek Némított felhasználók @@ -37,7 +37,7 @@ Követési kérelmek Profilod szerkesztése Piszkozatok - Licencek + Licenszek \@%s %s megtolta Kényes tartalom @@ -49,23 +49,23 @@ Összecsukás Nincs itt semmi. Üres tartalom. Húzd le a frissítéshez! - %s megolta a tülkölésed + %s megtolta a tülködet %s kedvencnek jelölte tülködet - %s követett + %s bekövetett \@%s jelentése Egyéb megjegyzés? Gyors válasz Válasz - Rebloggol - Kedvenc + Megtolás + Kedvencnek jelölés Több Szerkesztés - Bejelentkezés Mastodon-al + Bejelentkezés Mastodon-nal Kijelentkezés Biztosan ki szeretnél jelentkezni a következőből: %1$s? Követés Követés vége - Blokkol + Letiltás Letiltás feloldása Megtolások elrejtése Megtolások mutatása @@ -73,31 +73,31 @@ Törlés TÜLK TÜLK! - Próbálja újra - Bezár + Próbáld újra + Bezárás Profil Beállítások Fiókbeállítások Kedvencek Némított felhasználók - Blokkolt felhasználók + Letiltott felhasználók Követési kérelmek Média Megnyitás böngészőben Média csatolása Kép készítése - Megoszt - Némít + Megosztás + Némítás Némítás feloldása Megemlítés Média elrejtése - Drawer megnyitása + Menü megnyitása Mentés Profil szerkesztése Szerkesztés Visszavonás - Elfogad - Elutasít + Elfogadás + Elutasítás Keresés Piszkozatok Tülkök láthatósága @@ -108,7 +108,7 @@ Említések Hashtagek Kedvencek megjelenítése - Címkék + Hashtagek Említések Linkek %1$s letöltése @@ -122,15 +122,15 @@ Felhasználó némítása feloldva Elküldve! Válasz sikeresen elküldve. - Mely szerver\? - Mire gondolsz\? - Tartalom Figyelmeztető + Melyik szerver\? + Mi jár a fejedben\? + Tartalom figyelmeztetés Megjelenítési név Bemutatkozás Keresés… Nincs találat Válasz… - Avatár + Profilkép Fejléc Mi az a szerver\? Csatlakozás… @@ -151,18 +151,18 @@ Listázatlan: Nem jelenik meg a nyilvános idővonalon Csak követőknek: Tülkölés csak követőknek Közvetlen: Tülkölés csak a megemlített felhasználóknak - Értesítések szerkesztése + Értesítések Értesítések Figyelmeztetések Értesítés hanggal Értesítés rezgéssel Értesítés fénnyel Értesítsen, ha - említett + megemlítettek bekövettek tülkömet megtolták tülkömet kedvenccé tették - Kinézet + Megjelenés Idővonalak Sötét Világos @@ -170,10 +170,10 @@ Automatikus naplementekor Böngésző Linkek megnyitása applikáción belül - Szerkesztési gomb elérejtése görgetés közben + Szerkesztés gomb elrejtése görgetés közben Idővonal szűrése Fülek - Rebloggolások mutatása + Megtolások mutatása Válaszok mutatása Média előnézet mutatása Proxy @@ -181,13 +181,13 @@ HTTP proxy engedélyezése HTTP proxy szerver HTTP Proxy port - Alapértelmezett poszt láthatóság - Minden médiát jelölj meg érzékenynek + Tülkök alapértelmezett láthatósága + Minden média szenzitívnek jelölése A beállítások szinkronizálása nem sikerült Nyilvános Listázatlan Csak követőknek - Státusz szöveg mérete + Tülkölés szöveg mérete Legkisebb Kicsi Közepes @@ -196,12 +196,12 @@ Új említések Értesítések új említések esetén Új követők - Értesítések az új követők esetén - Rebloggok - Értesítések posztjaid rebloggolása esetén + Értesítések új követőkről + Megtolások + Értesítések posztjaid megtolása esetén Kedvencek Értesítések mikor tülkjeidet kedvencnek jelölik - %s megemített téged + %s megemlített téged %1$s, %2$s, %3$s és még %4$d %1$s, %2$s meg %3$s %1$s és %2$s @@ -220,7 +220,7 @@ Hibajelentés & új funkciók igénylése: \n https://github.com/tuskyapp/Tusky/issues - Tusky Profilja + Tusky profilja Tülk tartalmának megosztása Tülk linkjének megosztása Képek @@ -247,7 +247,7 @@ A %s szervernek nincsenek egyedi emoji-jai Vágólapra másolva Emoji stílus - Rendszer alapértelmezett + Rendszer alapértelmezés Először le kell töltened ezeket az emoji készleteket Keresés… Tülk megnyitása @@ -255,9 +255,9 @@ A beállítások érvényesítéséhez újra kell indítani a Tusky-t Később Újraindítás - Az eszközöd alap emoji készlete + Az eszközöd alapértelmezett emoji készlete Az Android 4.4-7.1 Blob emoji-jai - Mastodon alap emoji készlet + Mastodon alapértelmezett emoji készlet Letöltés sikertelen Bot %1$s elköltözött: @@ -269,7 +269,7 @@ Címke Tartalom Abszolút idő használata - Az alábbi felhasználói profil adatok lehet, hogy hiányosak. Kattints ide a teljes profil böngészőben való megnyitásához. + Az alábbi felhasználói profil adatok hiányosak lehetnek. Kattints ide a teljes profil böngészőben való megnyitásához. Megtolta Kedvencnek jelölte %1$s és %2$s @@ -285,14 +285,14 @@ Média letöltése Média megosztása következővel… Törlöd és újraírod ezt a tülköt\? - befejeződött a szavazás + befejeződött egy szavazás Szűrők Rendszer téma használata Nyelv Közzététel (szerverrel szinkronizált) Szavazások - Értesítés a befejezett szavazásokról - Tusky ingyenes és nyílt forráskódú szoftver. A GNU General Public License Version 3 érvényes rá, amit itt tekinthets meg: https://www.gnu.org/licenses/gpl-3.0.en.html + Értesítés befejezett szavazásokról + Tusky ingyenes és nyílt forráskódú szoftver. A GNU General Public License Version 3 érvényes rá, amit itt tekinthetsz meg: https://www.gnu.org/licenses/gpl-3.0.en.html %dé múlva %dn múlva %dó múlva @@ -301,7 +301,7 @@ %dn %dó %dp - %dm + %dmp Válasz @%s részére Nyilvános idővonalak Beszélgetések @@ -309,7 +309,7 @@ Szűrő szerkesztése Eltávolítás Frissítés - Szűrőkifejezés + Szűrendő kifejezés Nem sikerült a lista létrehozása Nem sikerült a lista átnevezése Nem sikerült a lista törlése @@ -345,7 +345,7 @@ Minden tülk kibontása/összecsukása Google jelenlegi emoji készlete Megtolás az eredeti közönségnek - Megtolás törlése + Megtolás visszavonása Apache licensz alatt Kitűzés eltávolítása Kitűzés @@ -372,7 +372,7 @@ Szűrés Alkalmaz Tülk Szerkesztése - Szerkeszt + Szerkesztés Biztos, hogy minden értesítésedet véglegesen törlöd\? Műveletek a %s képpel %1$s • %2$s @@ -436,9 +436,9 @@ Visszaállítás Nem találjuk ezt a posztot %s Könyvjelzők - Könyvjelző + Könyvjelzőzés Könyvjelzők - Tusky által hatjva + Tusky által hajtva Könyvjelzőzve Lista kiválasztása Lista @@ -461,15 +461,16 @@ Fent Fő navigálási pozíció Színes homály mutatása rejtett médiánál - követési kérelem + követni szeretnének Értesítések elrejtése Letiltsuk @%s -t\? Elnémítsuk @%s fiókot\? Beszélgetés némításának feloldása Beszélgetés némítása - Némítás vége %s + %s némításának feloldása Értesítések némítása tőle %s - Némítás vége %s + %s némításának feloldása Értesítések némításának feloldása tőle %s %s kéri, hogy követhessen + Felső eszköztár címének elrejtése \ No newline at end of file From 8881778c85a6d1d380d6b316479d57a847a35417 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Thu, 27 Aug 2020 02:00:09 +0000 Subject: [PATCH 08/22] Translated using Weblate (Persian) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Persian) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Persian) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ --- app/src/main/res/values-fa/strings.xml | 375 +++++++++++++------------ 1 file changed, 189 insertions(+), 186 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 461058924..95efc84b3 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1,57 +1,57 @@ - خطایی رخ داد + خطایی رخ داد. این نمی‌تواند خالی باشد. - دامنه وارد شده نامعتبر است - اهراز هویت با نمونه شکست خورد. - مرورگری برای استفاده یافت نشد - خطای احراز هویت ناشناس رخ داده است. - هویت احراز نشد - دریافت توکن ورود ناموفق بود + دامنهٔ نامعتبر وارد شده + احراز هویت با این نمونه شکست خورد. + مرورگری برای استفاده پیدا نشد. + خطای احراز هویت ناشناخته‌ای رخ داد. + احراز هویت رد شد. + دریافت ژتون ورود شکست خورد. وضعیت خیلی طولانی است! - پرونده باید کمتر از ۸ مگابایت باشد + پرونده باید کمتر از ۸ مگابایت باشد. پرونده ویدئویی باید کمتر از ۴۰ مگابایت باشد. - این نوع از پرونده نمی‌تواند بارگذاری شود - پرونده باز نشد - مجوز برای خواندن رسانه نیاز است + این گونهٔ پرونده نمی‌تواند بارگذاری شود. + این پرونده نتوانست گشوده شود. + نیاز به اجازهٔ خواندن رسانه است. نیاز به اجازهٔ ذخیرهٔ رسانه است. تصاویر و فیلم‌ها هر دو نمی‌توانند به یک وضعیت ضمیمه شوند. - بارگذاری ناموفق بود - خطا در ارسال بوق + بارگذاری شکست خورد. + خطای فرستادن بوق. خانه - اعلان‌ها - محلی + آگاهی‌ها + محلّی همگانی بوق - فرسته‌ها - با پاسخ‌‌ها - دنبال شونده‌ها - پیرو - پسندها - کاربرهای بی‌صدا - کاربرهای مسدود شده + فرسته + با پاسخ‌ + دنبال شونده + پی‌گیر + برگزیده‌ها + کاربران خموش + کاربران مسدود درخواست‌های پی‌گیری ویرایش نمایه‌تان - پیش‌نویس - مجوزها - %s تقویت شد + پیش‌نویس‌ها + پروانه‌ها + %s تقویت کرد محتوای حسّاس - پنهان کردن رسانه + رسانهٔ نهفته کلیک برای نمایش - نمایش بیشتر - نمایش کمتر - بازکردن + نمایش بیش‌تر + نمایش کم‌تر + گسترش بستن - چیزی اینجا نیست.برای تازه سازی، به پایین بکشید - %s بوق شما را تقویت کرد - %s بوق شما را پسندید - %s شما را دنبال می‌کند + این‌جا هیچ‌چیز نیست. برای تازه‌سازی، به پایین بکشید! + %s بوقتان را تقویت کرد + %s بوقتان را برگزید + %s پی‌گیرتان شد گزارش @%s - پیام‌های اضافی + نظرهای اضافی؟ پاسخ سریع پاسخ تقویت - مورد علاقه + برگزیدن بیش‌تر ایجاد ورود با ماستودون @@ -72,17 +72,17 @@ نمایه ترجیحات ترجیحات حساب - علاقه‌مندی‌ها + برگزیده‌ها کاربران خموش - کاربران مسدود شده + کاربران مسدود درخواست‌های پی‌گیری رسانه گشودن در مرورگر افزودن رسانه گرفتن عکس - اشتراک - بی‌صدا - لغو بی‌صدا + هم‌رسانی + خموشی + ناخموشی اشاره نهفتن رسانه گشودن کشو @@ -92,33 +92,33 @@ بازگشت پذیرش رد - جستجو + جست‌وجو پیش‌نویس نمایانی بوق - هشدار محتوی - صفحه کلیک شکلک - درحال دریافت %1$s - کپی لینک + هشدار محتوا + صفحه‌کلید اموجی + درحال بارگیری %1$s + رونوشت از پیوند هم‌رسانی نشانی بوق با… هم‌رسانی بوق با… هم‌رسانی رسانه با… فرستاده شد! - کاربر رفع انسداد شد - کاربر رفع بی‌صدا شد + کاربرنامسدود شد + کاربر ناخموش شد فرستاده شد! - پاسخ با موفق فرستاده شد‌. + پاسخ با موفّقیت فرستاده شد‌. کدام نمونه؟ چه خبر؟ - هشدار محتوی + هشدار محتوا نام نمایشی شرح حال - جستجو - نتیجه‌ای نیست - پاسخ … + جست‌وجو… + بدون هیچ نتیجه‌ای + پاسخ… آواتار - سرتیتر - یک نمونه چیست؟ - در حال اتصال … + سرایند + نمونه چیست؟ + در حال وصل شدن… نشانی یا دامنهٔ هر نمونه‌ای می‌تواند وارد شود، مثل mastodon.social, icosahedron.website, social.tchncs.de, و بیش‌تر!. \n \n اگر هنوز حسابی ندارید، می‌توانید نام نمونه مورد نظر را وارد کرده و در آن حسابی بسازید. @@ -130,23 +130,23 @@ در حال بارگذاری… بارگیری درخواست دنبال کردن را لغو می‌کنید؟ - لغو دنبال کردن این حساب - حذف این بوق + ناپیگیری این حساب؟ + حذف این بوق؟ عمومی: فرستادن به خط زمانی‌های عمومی خارج از لیست: در خط زمانی عمومی نشان نده تنها دنبال‌کنندگان:پست فقط به دنبال‌کنندگان - مستقیم:پست فقط برای کاربران صدا زده شده - ویرایش اعلان‌ها - اعلان‌ها + مستقیم: فرستادن فقط برای کاربران اشاره‌شده + آگاهی‌ها + آگاهی‌ها هشدارها - اعلان با صدا + آگاهی با صدا آگاهی با لرزش - اعلان با نور + آگاهی با چراغ به من اطلاع بده زمانی که اشاره شدن دنبال‌شده - پست‌های تقویت شده من - پسند بوق‌هایم + فرسته‌هایم تقویت شدند + فرسته‌هایم برگزیده شدند ظاهر تم برنامه خط‌ زمانی‌ها @@ -159,7 +159,7 @@ پنهان کردن دکمه ایجاد هنگام پیمایش فیلتر کردن خط زمانی زبانه‌ها - نمایش بازبوق‌ها + نمایش تقویت‌ها نمایش پاسخ‌ها بارگیری پیش‌نمایش رسانه پراکسی @@ -180,20 +180,20 @@ متوسط بزرگ بزرگ‌ترین - صدا زدن جدید - هشدار در مورد صدازدن جدید - پیروان جدید - هشدارها درمورد دنبال‌کنندگان جدید - تقویت - وقتی بوق‌های شما تقویت شد اعلان بده - مورد علاقه‌ها - زمانی که بوق‌های شما پسندیده شوند، اعلان دریافت کنید - %s شما را صدا زد - %1$s, %2$s, %3$s و %4$d دیگر - %1$s, %2$s, و %3$s + اشاره‌های جدید + آگاهی‌ها دربارهٔ اشاره‌های جدید + پی‌گیران جدید + آگاهی‌ها دربارهٔ پی‌گیران جدید + تقویت‌ها + آگاهی‌ها هنگام تقویت شدن بوق‌هایتان + برگزیدن‌ها + آگاهی‌ها هنگام برگزیده شدن بوق‌هایتان + %s به شما اشاره کرد + %1$s، %2$s، %3$s و %4$d دیگر + %1$s، %2$s و %3$s %1$s و %2$s %d برهم‌کنش جدید - حساب قفل شد + حساب قفل‌شده درباره تاسکی نرم‌افزاری آزاد است که تحت نگارش ۳ از پروانهٔ جامع همگانی گنو منتشر شده است. پروانه را می‌توانید از این‌جا ببینید: https://www.gnu.org/licenses/gpl-3.0.en.html - سایت پروژه + پایگاه وب پروژه : \n https://tusky.app - گزارش خطا و درخواست ویژگی: + گزارش مشکلات و درخواست ویژگی‌ها: \n https://github.com/tuskyapp/Tusky/issues - نمایه Tusky - هم‌رسانی محتوی بوق - هم‌رسانی لینک بوق + نمایهٔ تاسکی + هم‌رسانی محتوای بوق + هم‌رسانی پیوند بوق تصویرها - فیلم + ویدیو تقاضای پیگیری شد - در %dy - در %dd - در % dh - در %dm - در %ds - شما را دنبال می‌کند - همیشه مطالب حساس را نشان بده + در %d سال + در %d روز + در %d ساعت + در %d دقیقه + در %d ثانیه + پیگیرتان است + نمایش همیشگی محتوای حساس رسانه - پاسخ دادن به @%s - بارگیری بیشتر + در حال پاسخ به @%s + بار کردن بیش‌تر افزودن حساب - افزودن حساب جدید ماستودون + افزودن حساب ماستودون جدید فهرست‌ها لیست‌ها - لیست خط زمانی - پست با حساب %1$s - ناتوان در تنظیم عنوان - توصیف برای کم‌بینایان\n(محدودیت نویسه %d) + خط زمانی فهرست + در حال فرستادن با حساب %1$s + شکست در تنظیم عنوان + توصیف برای کم‌بینایان +\n(کران %d نویسه) تنظیم عنوان - حذف + برداشتن قفل حساب - به شما امکان می‌دهد بصورت دستی دنبال‌کنندگان را تایید کنید - ذخیره به عنوان پیش‌نویس؟ + لازم است پی‌گیران را دستی تأیید کنید + ذخیرهٔ پیش‌نویس؟ در حال فرستادن بوق… خطای فرستادن بوق در حال فرستادن بوق‌ها فرستادن لغو شد - رونوشتیی از بوق در پیش‌نویس‌هایتان ذخیره شد + رونوشتی از بوق در پیش‌نویس‌هایتان ذخیره شد ایجاد - سرور شما %s هیچ شکلک سفارشی ندارد - به کلیپ بورد کپی شد - قالب شکلک - پیشفرض سیستم - شما ابتدا باید این شکلک‌ها را دریافت کنید - اجرای جستجو - باز/بستن همه وضعیت‌ها - بوق را باز کن - برنامه به شروع مجدد نیاز دارد - شما برای اعمال این تغییرات به شروع مجدد برنامه نیاز دارید + نمونه‌تان %s هیچ اموجی سفارشی‌ای ندارد + در تخته‌گیره رونوشت شد + سبک اموجی + پیش‌گزیدهٔ سامانه + نخست باید این مجموعه‌های اموجی را بارگیری کنید + در حال جست‌وجو… + گسترده/جمع کردن تمام وضعیت‌ها + گشودن بوق + نیاز به آغاز دوبارهٔ کاره + برای اعمال این تغییرات، نیاز به شروع دوبارهٔ تاسکی دارید بعداً - شروع مجدد - شکلک‌های پیش‌فرض دستگاه شما تنظیم شدند - شکلک‌های اندروید ۴.۴ تا ۷.۱ - شکلک‌های استاندارد ماستدون تنظیم شدند + آغاز دوباره + مجموعه اموجی پیش‌گزیدهٔ افزاره‌تان + اموجی‌های اندروید ۴.۴ تا ۷.۱ + مجموعه اموجی استاندارد ماستودون شکست در بارگیری بات %1$s منتقل شد به: تقویت برای مخاطب اصلی - لغو تقویت - Tusky شامل کد و دارایی‌های پروژه‌های منبع‌باز زیر است: - تحت مجوز آپاچی (رونوشت در ادامه) - متاداده نمایه + ناتقویت + تاسکی کد و دارایی‌هایی از پروژه‌های نرم‌افزار آزاد زیر دارد: + ذیل پروانهٔ آپاچی (رونوشت در ادامه) + فرادادهٔ نمایه افزودن داده برچسب محتوا استفاده از زمان مطلق - اطلاعات زیر ممکن است به طور ناقص نمایه کاربر را نشان دهد. برای دیدن نمایه کامل در مرورگر، لمس کنید. + ممکن است اطلاعات زیر نمایهٔ کاربر را ناقص نشان دهد. برای گشودن نمایهٔ کامل در مرورگر، لمس کنید. برداشتن سنجاق سنجاق کردن یک خطای شبکه رخ داد! لطفا اتصال خود را بررسی و دوباره تلاش کنید! پیام‌های مستقیم زبانه‌ها سنجاق‌شده - دامنه‌های پنهان + دامنه‌های نهفته \@%s - چیزی اینجا نیست. - حذف بازبوق - برداشتن پسند - پاک کردن و بازنویسی - دامنه‌های پنهان + این‌حا هیچ‌چیزی نیست. + برداشتن تقویت + برداشتن برگزیدگی + حذف و بازنویسی + دامنه‌های نهفته افزودن نظرسنجی - بی‌صدا کردن %s - افزوده زبانه + خموشی %s + افزودن زبانه پیوندها اشاره‌ها هشتگ‌ها - بازکردن حساب بازبوق کننده - نمایش بازبوق‌ها - نمایش پسندیده‌ها + گشودن تقویت‌کنندهٔ بوق + نمایش تقویت‌ها + نمایش برگزیده‌ها هشتگ‌ها اشاره‌ها پیوندها - بازکردن رسانه #%d + گشودن رسانه #%d گشودن به عنوان %s هم‌رسانی به عنوان … بارگیری رسانه در حال بارگیری رسانه - %s ناپنهان + %s نانهفته می‌خواهید این بوق را پاک و بازنویسی کنید؟ نهفتن تمام دامنه پایان نظرسنجی‌ها صافی‌ها استفاده از طرح سیستم زبان - نمایش نشان برای بات‌ها + نمایش نشانگر برای بات‌ها پویانمایی آواتار gif نظرسنجی‌ها - اعلان‌ها درباره نظرسنجی‌هایی که پایان یافته‌اند - Tusky (تاسکی) %s - %dy - %dd - %dh - %dm - %dث - همواره بوق‌هایی که دارای محتوای حساس هستند را گسترش بده - خط زمانی عمومی - گفتگوها - افزودن صافی - ویرایش صافی + آگاهی‌ها دربارهٔ نظرسنجی‌های پایان‌یافته + تاسکی %s + %d سال + %d روز + %d ساعت + %d دقیقه + %d ثانیه + گسترش همیشگی بوق‌های علامت‌خورده با هشدار محتوا + خط زمانی‌های عمومی + گفت‌وگوها + افزودن پالایه + ویرایش پالایه برداشتن - به‌روزرسانی - تمام کلمه - ناتوانی در ایجاد سیاهه - ناتوانی در تغییر نام سیاهه + به‌روز رسانی + تمام واژه + ناتوانی در ایجاد فهرست + ناتوانی در تغییر نام فهرست ناتوانی در حذف فهرست ایجاد یک فهرست تغییر نام فهرست حذف فهرست - ویرایش سیاهه - جستجو بین افرادی که دنبال می‌کنید + ویرایش فهرست + جست‌وجوی افرادی که پی می‌گیرید افزودن حساب به فهرست - حذف حساب از سیاهه - مجموعه شکلک‌های جاری گوگل - CC-BY 4.0 - CC-BY-SA 4.0 + برداشتن حساب از فهرست + مجموعه اموجی کنونی گوگل + نگارش ۴٫۰ CC-BY + نگارش ۴٫۰ CC-BY-SA - %1$s پسند - %1$s پسند + %1$s برگزیدن + %1$s برگزیدن - %s بازبوق - %s بازبوق + %s تقویت + %s تقویت - بازبوق توسط - پسننده‌شده توسط + تقویت‌شده به دست + برگزیده به دست %1$s %1$s و %2$s - %1$s، %2$s و %3$d بیشتر + %1$s، %2$s و %3$d بیش‌تر رسیده به بیشینهٔ %1$d زبانه رسانه: %s هشدار محتوا: %s - بدون توضیحات + بدون هیچ توضیحی بازبوقیده - پسندیده + برگزیده عمومی فهرست‌نشده پی‌گیران مستقیم - نظرسنجی با انتخاب‌ها: %1$s، %2$s، %3$s، %4$s؛ %5$s - نام سیاهه + نظرسنجی با گزینه‌ها: %1$s، %2$s، %3$s، %4$s؛ %5$s + نام فهرست هشتگ بدون # - پاک کردن - صافی + پاک‌سازی + پالایش اعمال ایجاد بوق ایجاد مطمئنید می‌خواهید تمام آگاهی‌هایتان را برای همیشه پاک کنید؟ %s باقی مانده - پایان یافته در %s - بسته شده - رای + پایان در %s + بسته + رأی یک نظرسنجی که در آن رأی دادید، تمام شد یک نظرسنجی که ساختید، تمام شد @@ -389,16 +390,16 @@ %d دقیقه ادامه - قبل - اتمام - با موفقیت گزارش شد @%s - نظرات بیشتر + بازگشت + تمام + ‫@%s با موفّقیت گزارش شد + نظرهای اضافی هدایت به %s - ناتوانی در گزارش + شکست در گزارش شکست در واکشی وضعیت‌ها حساب‌ها - ناتوانی در جستجو - نمایش فیلتر اعلانات + شکست در جست‌وجو + نمایش پالایهٔ آگاهی‌ها نظرسنجی ۵ دقیقه ۳۰ دقیقه @@ -413,14 +414,14 @@ ویرایش بوق‌های زمان‌بسته ویرایش - بوق‌های زمان‌بندی‌شده + بوق‌های زمان‌بسته بوق زمان‌بسته بازنشانی مطمئنید می‌خواهید تمام %s را مسدود کنید؟ محتوای آن دامنه را در هیچ‌یک از خط زمانی‌ها یا در آگاهی‌هایتان نخواهید دید. پیروانتان از آن دامنه، برداشته خواهند شد. هنگامی که کلیدواژه یا عبارت، فقط حروف‌عددی باشد، فقط اگر با تمام واژه مطابق باشد، اعمال خواهد شد عبارت پالایش - " %1$s • %2$s" - گزارش به ناظم‌های کارسازتان ارسال خواهد شد. می‌توانید توضیحی در باب چرایی گزارش این حساب در زیر بنویسید: + . %1$s • %2$s + گزارش به ناظرهای کارسازتان ارسال خواهد شد. در زیر می‌توانید توضیحی در باب چرایی گزارش این حساب بنویسید: این حساب از کارسازی دیگر است. رونوشتی ناشناس از گزارش، به آن‌جا نیز ارسال شود؟ خطا در یافتن فرستهٔ %s قدرت‌گرفته از تاسکی @@ -443,14 +444,14 @@ هشتگ‌ها افزودن هشتگ - آگاهی‌ها در مورد درخواست‌های پی‌گیری + آگاهی‌ها دربارهٔ درخواست‌های پی‌گیری درخواست‌های پی‌گیری درخواست پی‌گیری خموشی @%s؟ انسداد @%s؟ ناخموشی گفت‌وگو خموشی گفت‌وگو - %s می‌خواهد دنبالتان کند + %s می‌خواهد پی‌گیرتان شود %d ثانیه %d ثانیه @@ -465,7 +466,9 @@ ناخموشی آگاهی‌ها از %s ناخموشی %s - %s رای - + %s رأی + %s رأی + نهفتن عنوان نوارابزار بالایی + کنش‌ها برای تصویر %s \ No newline at end of file From fb3fff8ed7af86cda1150b32ae9661a70a447731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Thu, 27 Aug 2020 02:00:09 +0000 Subject: [PATCH 09/22] Translated using Weblate (Occitan) Currently translated at 95.1% (411 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/oc/ --- app/src/main/res/values-oc/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index a01e3d14c..f5b7a9fba 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -381,8 +381,8 @@ %d jorns - - + + %d minuta @@ -450,4 +450,8 @@ L’interval minimum de planificacion sus Mastodon e de 5 minutas. Demandas d’abonament Etiquetas + Desactivar las notificacions per %s + Activar las notificacions per %s + Amagar pas mai a %s + %s a demandat a vos seguir \ No newline at end of file From dbe49d806bd2eb3507e13731b02cd07edc1e41c8 Mon Sep 17 00:00:00 2001 From: Daniele Lira Mereb Date: Thu, 27 Aug 2020 02:00:09 +0000 Subject: [PATCH 10/22] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index d7969861d..3dfbece6f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -67,7 +67,7 @@ Mostrar boosts Denunciar Excluir - TOOT + TOOT! TOOT! Tentar novamente Fechar From 6b76c3ebb66f20ba4ae00a4c6cbb6de9fced2851 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Thu, 27 Aug 2020 02:00:10 +0000 Subject: [PATCH 11/22] Translated using Weblate (Kabyle) Currently translated at 58.5% (253 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/kab/ Translated using Weblate (Occitan) Currently translated at 95.8% (414 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/oc/ --- app/src/main/res/values-kab/strings.xml | 2 +- app/src/main/res/values-oc/strings.xml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index d4bac917e..fb22b86d2 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -34,7 +34,7 @@ Jewweq JEWWEQ! Ɛreḍ tikkelt-nniḍen - Derreɛ + Mdel Amaɣnu Ismenyifen Ldi deg uminig diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index f5b7a9fba..b8b24f551 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -332,8 +332,8 @@ 3%1$s4 Favorits - - + %s partatge + %s partatges Partejat per Aimat per @@ -363,8 +363,8 @@ Mostrar coma indicator pels robòts Netejar totas las notificacions d’un biais permanent \? - - + %s vòte + %s votes %s restant S’acaba a %s @@ -381,8 +381,8 @@ %d jorns - - + %d ora + %d oras %d minuta From fc7b02d9870260ae344c01e28b71b5ca40444e45 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Tue, 1 Sep 2020 16:49:30 +0200 Subject: [PATCH 12/22] use current user's avatar as drawer toggle (#1919) * use current user's avatar as drawer toggle * avoid hardcoded 36dp * remove unused import --- .../com/keylesspalace/tusky/MainActivity.kt | 46 +++++++++++-------- app/src/main/res/values/dimens.xml | 2 + 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt index 32222251d..9ba9119d4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt @@ -19,7 +19,6 @@ import android.content.Context import android.content.DialogInterface import android.content.Intent import android.content.res.ColorStateList -import android.content.res.Configuration import android.graphics.Color import android.graphics.drawable.Drawable import android.net.Uri @@ -29,7 +28,6 @@ import android.view.KeyEvent import android.view.MenuItem import android.view.View import android.widget.ImageView -import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.AlertDialog import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat @@ -40,6 +38,10 @@ import androidx.lifecycle.Lifecycle import androidx.preference.PreferenceManager import androidx.viewpager2.widget.MarginPageTransformer import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.target.FixedSizeDrawable +import com.bumptech.glide.request.transition.Transition import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout.OnTabSelectedListener @@ -91,7 +93,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje lateinit var conversationRepository: ConversationsRepository private lateinit var header: AccountHeaderView - private lateinit var drawerToggle: ActionBarDrawerToggle private var notificationTabPosition = 0 private var onTabSelectedListener: OnTabSelectedListener? = null @@ -169,6 +170,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje val hideTopToolbar = preferences.getBoolean(PrefKeys.HIDE_TOP_TOOLBAR, false) mainToolbar.visible(!hideTopToolbar) + val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size) + mainToolbar.navigationIcon = FixedSizeDrawable(getDrawable(R.drawable.avatar_default), navIconSize, navIconSize) + mainToolbar.menu.add(R.string.action_search).apply { setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) icon = IconicsDrawable(this@MainActivity, GoogleMaterial.Icon.gmd_search).apply { @@ -261,8 +265,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje public override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) - drawerToggle.syncState() - if (intent != null) { val statusUrl = intent.getStringExtra(STATUS_URL) if (statusUrl != null) { @@ -288,7 +290,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje private fun setupDrawer(savedInstanceState: Bundle?, addSearchButton: Boolean) { - drawerToggle = ActionBarDrawerToggle(this, mainDrawerLayout, mainToolbar, com.mikepenz.materialdrawer.R.string.material_drawer_open, com.mikepenz.materialdrawer.R.string.material_drawer_close) + mainToolbar.setNavigationOnClickListener { + mainDrawerLayout.open() + } header = AccountHeaderView(this).apply { headerBackgroundScaleType = ImageView.ScaleType.CENTER_CROP @@ -446,18 +450,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje EmojiCompat.get().registerInitCallback(emojiInitCallback) } - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - drawerToggle.onConfigurationChanged(newConfig) - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (drawerToggle.onOptionsItemSelected(item)) { - return true - } - return super.onOptionsItemSelected(item) - } - override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(mainDrawer.saveInstanceState(outState)) } @@ -619,6 +611,24 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje .load(me.header) .into(header.accountHeaderBackground) + val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size) + + Glide.with(this) + .asDrawable() + .override(navIconSize) + .load(me.avatar) + .transform( + RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp)) + ) + .into(object : CustomTarget(){ + override fun onResourceReady(resource: Drawable, transition: Transition?) { + mainToolbar.navigationIcon = resource + } + override fun onLoadCleared(placeholder: Drawable?) { + mainToolbar.navigationIcon = placeholder + } + }) + accountManager.updateActiveAccount(me) NotificationHelper.createNotificationChannelsForAccount(accountManager.activeAccount!!, this) diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 243b10bc0..dd4f599ca 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -50,4 +50,6 @@ 108dp 16dp + + 36dp From 1d309850b07a17875e9e44cc17809b908a7865fc Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Wed, 2 Sep 2020 12:27:51 +0200 Subject: [PATCH 13/22] convert EmojiPreference and EmojiCompatFont to Kotlin (#1922) * convert EmojiPreference and EmojiCompatFont to Kotlin * move preference related to to dedicated preference package * update proguard-rules.pro * reformat & add comment * maintain disposable information in EmojiPreference instead of EmojiCompatFont --- app/proguard-rules.pro | 8 +- app/src/main/AndroidManifest.xml | 2 +- .../keylesspalace/tusky/EmojiPreference.java | 291 --------- .../com/keylesspalace/tusky/MainActivity.kt | 1 + .../keylesspalace/tusky/TuskyApplication.kt | 3 +- .../preference/AccountPreferencesFragment.kt | 2 +- .../components/preference/EmojiPreference.kt | 258 ++++++++ .../NotificationPreferencesFragment.kt | 2 +- .../preference}/PreferencesActivity.kt | 6 +- .../preference/PreferencesFragment.kt | 13 +- .../preference/ProxyPreferencesFragment.kt | 2 +- .../TabFilterPreferencesFragment.kt | 2 +- .../tusky/di/ActivitiesModule.kt | 1 + .../tusky/di/FragmentBuildersModule.kt | 8 +- .../tusky/settings/SettingsConstants.kt | 2 +- .../tusky/settings/SettingsDSL.kt | 7 +- .../tusky/util/EmojiCompatFont.java | 564 ------------------ .../tusky/util/EmojiCompatFont.kt | 351 +++++++++++ .../main/res/layout/activity_preferences.xml | 2 +- .../main/res/layout/dialog_emojicompat.xml | 43 +- .../tusky/util/EmojiCompatFontTest.kt | 47 ++ 21 files changed, 709 insertions(+), 906 deletions(-) delete mode 100644 app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java rename app/src/main/java/com/keylesspalace/tusky/{fragment => components}/preference/AccountPreferencesFragment.kt (99%) create mode 100644 app/src/main/java/com/keylesspalace/tusky/components/preference/EmojiPreference.kt rename app/src/main/java/com/keylesspalace/tusky/{fragment => components}/preference/NotificationPreferencesFragment.kt (99%) rename app/src/main/java/com/keylesspalace/tusky/{ => components/preference}/PreferencesActivity.kt (97%) rename app/src/main/java/com/keylesspalace/tusky/{fragment => components}/preference/PreferencesFragment.kt (96%) rename app/src/main/java/com/keylesspalace/tusky/{fragment => components}/preference/ProxyPreferencesFragment.kt (97%) rename app/src/main/java/com/keylesspalace/tusky/{fragment => components}/preference/TabFilterPreferencesFragment.kt (97%) delete mode 100644 app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.java create mode 100644 app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.kt create mode 100644 app/src/test/java/com/keylesspalace/tusky/util/EmojiCompatFontTest.kt diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index e25a4564e..78b4be883 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -55,6 +55,9 @@ public static *** v(...); public static *** i(...); } +-assumenosideeffects class java.lang.String { + public static java.lang.String format(...); +} # remove some kotlin overhead -assumenosideeffects class kotlin.jvm.internal.Intrinsics { @@ -62,8 +65,3 @@ static void checkExpressionValueIsNotNull(java.lang.Object, java.lang.String); static void throwUninitializedPropertyAccessException(java.lang.String); } - -# without this emoji font downloading fails with AbstractMethodError --keep class * extends android.os.AsyncTask { - public *; -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 53564ace8..72aa387ab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -117,7 +117,7 @@ android:name=".AccountActivity" android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize" /> - + diff --git a/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java b/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java deleted file mode 100644 index 8837c7d8d..000000000 --- a/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.keylesspalace.tusky; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.Build; -import android.util.AttributeSet; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.RadioButton; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.appcompat.app.AlertDialog; -import androidx.preference.Preference; -import androidx.preference.PreferenceManager; - -import com.keylesspalace.tusky.util.EmojiCompatFont; - -import java.util.ArrayList; - -/** - * This Preference lets the user select their preferred emoji font - */ -public class EmojiPreference extends Preference { - private static final String TAG = "EmojiPreference"; - private EmojiCompatFont selected, original; - static final String FONT_PREFERENCE = "selected_emoji_font"; - private static final EmojiCompatFont[] FONTS = EmojiCompatFont.FONTS; - // Please note that this array should be sorted in the same way as their fonts. - private static final int[] viewIds = { - R.id.item_nomoji, - R.id.item_blobmoji, - R.id.item_twemoji, - R.id.item_notoemoji}; - - private ArrayList radioButtons = new ArrayList<>(); - - private boolean updated, currentNeedsUpdate; - - public EmojiPreference(Context context) { - super(context); - - // Find out which font is currently active - this.selected = EmojiCompatFont.byId(PreferenceManager - .getDefaultSharedPreferences(context) - .getInt(FONT_PREFERENCE, 0)); - // We'll use this later to determine if anything has changed - this.original = this.selected; - - setSummary(selected.getDisplay(context)); - } - - public EmojiPreference(Context context, AttributeSet attrs) { - super(context, attrs); - - // Find out which font is currently active - this.selected = EmojiCompatFont.byId(PreferenceManager - .getDefaultSharedPreferences(context) - .getInt(FONT_PREFERENCE, 0)); - // We'll use this later to determine if anything has changed - this.original = this.selected; - - setSummary(selected.getDisplay(context)); - } - - @Override - protected void onClick() { - - View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_emojicompat, null); - - for (int i = 0; i < viewIds.length; i++) { - setupItem(view.findViewById(viewIds[i]), FONTS[i]); - } - - new AlertDialog.Builder(getContext()) - .setView(view) - .setPositiveButton(android.R.string.ok, (dialog, which) -> onDialogOk()) - .setNegativeButton(android.R.string.cancel, null) - .show(); - } - - private void setupItem(View container, EmojiCompatFont font) { - Context context = container.getContext(); - - TextView title = container.findViewById(R.id.emojicompat_name); - TextView caption = container.findViewById(R.id.emojicompat_caption); - ImageView thumb = container.findViewById(R.id.emojicompat_thumb); - ImageButton download = container.findViewById(R.id.emojicompat_download); - ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel); - RadioButton radio = container.findViewById(R.id.emojicompat_radio); - - // Initialize all the views - title.setText(font.getDisplay(context)); - caption.setText(font.getCaption(context)); - thumb.setImageDrawable(font.getThumb(context)); - - // There needs to be a list of all the radio buttons in order to uncheck them when one is selected - radioButtons.add(radio); - - updateItem(font, container); - - // Set actions - download.setOnClickListener((downloadButton) -> - startDownload(font, container)); - - cancel.setOnClickListener((cancelButton) -> - cancelDownload(font, container)); - - radio.setOnClickListener((radioButton) -> - select(font, (RadioButton) radioButton)); - - container.setOnClickListener((containterView) -> - select(font, - containterView.findViewById(R.id.emojicompat_radio - ))); - } - - private void startDownload(EmojiCompatFont font, View container) { - ImageButton download = container.findViewById(R.id.emojicompat_download); - TextView caption = container.findViewById(R.id.emojicompat_caption); - - ProgressBar progressBar = container.findViewById(R.id.emojicompat_progress); - ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel); - - // Switch to downloading style - download.setVisibility(View.GONE); - caption.setVisibility(View.INVISIBLE); - progressBar.setVisibility(View.VISIBLE); - cancel.setVisibility(View.VISIBLE); - - - font.downloadFont(getContext(), new EmojiCompatFont.Downloader.EmojiDownloadListener() { - @Override - public void onDownloaded(EmojiCompatFont font) { - finishDownload(font, container); - } - - @Override - public void onProgress(float progress) { - // The progress is returned as a float between 0 and 1 - progress *= progressBar.getMax(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - progressBar.setProgress((int) progress, true); - } else { - progressBar.setProgress((int) progress); - } - } - - @Override - public void onFailed() { - Toast.makeText(getContext(), R.string.download_failed, Toast.LENGTH_SHORT).show(); - updateItem(font, container); - } - }); - } - - private void cancelDownload(EmojiCompatFont font, View container) { - font.cancelDownload(); - updateItem(font, container); - } - - private void finishDownload(EmojiCompatFont font, View container) { - select(font, container.findViewById(R.id.emojicompat_radio)); - updateItem(font, container); - // Set the flag to restart the app (because an update has been downloaded) - if (selected == original && currentNeedsUpdate) { - updated = true; - currentNeedsUpdate = false; - } - } - - /** - * Select a font both visually and logically - * - * @param font The font to be selected - * @param radio The radio button associated with it's visual item - */ - private void select(EmojiCompatFont font, RadioButton radio) { - selected = font; - // Uncheck all the other buttons - for (RadioButton other : radioButtons) { - if (other != radio) { - other.setChecked(false); - } - } - radio.setChecked(true); - } - - /** - * Called when a "consistent" state is reached, i.e. it's not downloading the font - * - * @param font The font to be displayed - * @param container The ConstraintLayout containing the item - */ - private void updateItem(EmojiCompatFont font, View container) { - // Assignments - ImageButton download = container.findViewById(R.id.emojicompat_download); - TextView caption = container.findViewById(R.id.emojicompat_caption); - - ProgressBar progress = container.findViewById(R.id.emojicompat_progress); - ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel); - - RadioButton radio = container.findViewById(R.id.emojicompat_radio); - - // There's no download going on - progress.setVisibility(View.GONE); - cancel.setVisibility(View.GONE); - caption.setVisibility(View.VISIBLE); - - if (font.isDownloaded(getContext())) { - // Make it selectable - download.setVisibility(View.GONE); - radio.setVisibility(View.VISIBLE); - container.setClickable(true); - } else { - // Make it downloadable - download.setVisibility(View.VISIBLE); - radio.setVisibility(View.GONE); - container.setClickable(false); - } - - // Select it if necessary - if (font == selected) { - radio.setChecked(true); - // Update available - if (!font.isDownloaded(getContext())) { - currentNeedsUpdate = true; - } - } else { - radio.setChecked(false); - } - } - - - /** - * In order to be able to use this font later on, it needs to be saved first. - */ - private void saveSelectedFont() { - int index = selected.getId(); - Log.i(TAG, "saveSelectedFont: Font ID: " + index); - // It's saved using the key FONT_PREFERENCE - PreferenceManager - .getDefaultSharedPreferences(getContext()) - .edit() - .putInt(FONT_PREFERENCE, index) - .apply(); - setSummary(selected.getDisplay(getContext())); - } - - /** - * That's it. The user doesn't want to switch between these amazing radio buttons anymore! - * That means, the selected font can be saved (if the user hit OK) - */ - private void onDialogOk() { - saveSelectedFont(); - if (selected != original || updated) { - new AlertDialog.Builder(getContext()) - .setTitle(R.string.restart_required) - .setMessage(R.string.restart_emoji) - .setNegativeButton(R.string.later, null) - .setPositiveButton(R.string.restart, ((dialog, which) -> { - // Restart the app - // From https://stackoverflow.com/a/17166729/5070653 - Intent launchIntent = new Intent(getContext(), SplashActivity.class); - PendingIntent mPendingIntent = PendingIntent.getActivity( - getContext(), - // This is the codepoint of the party face emoji :D - 0x1f973, - launchIntent, - PendingIntent.FLAG_CANCEL_CURRENT); - AlarmManager mgr = - (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); - if (mgr != null) { - mgr.set( - AlarmManager.RTC, - System.currentTimeMillis() + 100, - mPendingIntent); - } - System.exit(0); - })).show(); - } - - } - -} diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt index 9ba9119d4..59b4e9376 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt @@ -52,6 +52,7 @@ import com.keylesspalace.tusky.components.compose.ComposeActivity import com.keylesspalace.tusky.components.compose.ComposeActivity.Companion.canHandleMimeType import com.keylesspalace.tusky.components.conversation.ConversationsRepository import com.keylesspalace.tusky.components.notifications.NotificationHelper +import com.keylesspalace.tusky.components.preference.PreferencesActivity import com.keylesspalace.tusky.components.scheduled.ScheduledTootActivity import com.keylesspalace.tusky.components.search.SearchActivity import com.keylesspalace.tusky.db.AccountEntity diff --git a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt index f41395bde..7fb762d23 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt +++ b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt @@ -24,6 +24,7 @@ import androidx.preference.PreferenceManager import androidx.work.WorkManager import com.keylesspalace.tusky.components.notifications.NotificationWorkerFactory import com.keylesspalace.tusky.di.AppInjector +import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.* import com.uber.autodispose.AutoDisposePlugins import dagger.android.DispatchingAndroidInjector @@ -53,7 +54,7 @@ class TuskyApplication : Application(), HasAndroidInjector { val preferences = PreferenceManager.getDefaultSharedPreferences(this) // init the custom emoji fonts - val emojiSelection = preferences.getInt(EmojiPreference.FONT_PREFERENCE, 0) + val emojiSelection = preferences.getInt(PrefKeys.EMOJI, 0) val emojiConfig = EmojiCompatFont.byId(emojiSelection) .getConfig(this) .setReplaceAll(true) diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt similarity index 99% rename from app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt rename to app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt index 24049aa9a..af882977e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License along with Tusky; if not, * see . */ -package com.keylesspalace.tusky.fragment.preference +package com.keylesspalace.tusky.components.preference import android.content.Intent import android.graphics.drawable.Drawable diff --git a/app/src/main/java/com/keylesspalace/tusky/components/preference/EmojiPreference.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/EmojiPreference.kt new file mode 100644 index 000000000..c0e538a9c --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/EmojiPreference.kt @@ -0,0 +1,258 @@ +package com.keylesspalace.tusky.components.preference + +import android.app.AlarmManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.os.Build +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.* +import androidx.appcompat.app.AlertDialog +import androidx.preference.Preference +import androidx.preference.PreferenceManager +import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.SplashActivity +import com.keylesspalace.tusky.util.EmojiCompatFont +import com.keylesspalace.tusky.util.EmojiCompatFont.Companion.FONTS +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import okhttp3.OkHttpClient +import kotlin.system.exitProcess + +/** + * This Preference lets the user select their preferred emoji font + */ +class EmojiPreference( + context: Context, + private val okHttpClient: OkHttpClient +) : Preference(context) { + + private lateinit var selected: EmojiCompatFont + private lateinit var original: EmojiCompatFont + private val radioButtons = mutableListOf() + private var updated = false + private var currentNeedsUpdate = false + + private val downloadDisposables = MutableList(FONTS.size) { null } + + override fun onAttachedToHierarchy(preferenceManager: PreferenceManager) { + super.onAttachedToHierarchy(preferenceManager) + + // Find out which font is currently active + selected = EmojiCompatFont.byId( + PreferenceManager.getDefaultSharedPreferences(context).getInt(key, 0) + ) + // We'll use this later to determine if anything has changed + original = selected + summary = selected.getDisplay(context) + } + + override fun onClick() { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_emojicompat, null) + viewIds.forEachIndexed { index, viewId -> + setupItem(view.findViewById(viewId), FONTS[index]) + } + AlertDialog.Builder(context) + .setView(view) + .setPositiveButton(android.R.string.ok) { _, _ -> onDialogOk() } + .setNegativeButton(android.R.string.cancel, null) + .show() + } + + private fun setupItem(container: View, font: EmojiCompatFont) { + val title: TextView = container.findViewById(R.id.emojicompat_name) + val caption: TextView = container.findViewById(R.id.emojicompat_caption) + val thumb: ImageView = container.findViewById(R.id.emojicompat_thumb) + val download: ImageButton = container.findViewById(R.id.emojicompat_download) + val cancel: ImageButton = container.findViewById(R.id.emojicompat_download_cancel) + val radio: RadioButton = container.findViewById(R.id.emojicompat_radio) + + // Initialize all the views + title.text = font.getDisplay(container.context) + caption.setText(font.caption) + thumb.setImageResource(font.img) + + // There needs to be a list of all the radio buttons in order to uncheck them when one is selected + radioButtons.add(radio) + updateItem(font, container) + + // Set actions + download.setOnClickListener { startDownload(font, container) } + cancel.setOnClickListener { cancelDownload(font, container) } + radio.setOnClickListener { radioButton: View -> select(font, radioButton as RadioButton) } + container.setOnClickListener { containerView: View -> + select(font, containerView.findViewById(R.id.emojicompat_radio)) + } + } + + private fun startDownload(font: EmojiCompatFont, container: View) { + val download: ImageButton = container.findViewById(R.id.emojicompat_download) + val caption: TextView = container.findViewById(R.id.emojicompat_caption) + val progressBar: ProgressBar = container.findViewById(R.id.emojicompat_progress) + val cancel: ImageButton = container.findViewById(R.id.emojicompat_download_cancel) + + // Switch to downloading style + download.visibility = View.GONE + caption.visibility = View.INVISIBLE + progressBar.visibility = View.VISIBLE + progressBar.progress = 0 + cancel.visibility = View.VISIBLE + font.downloadFontFile(context, okHttpClient) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { progress -> + // The progress is returned as a float between 0 and 1, or -1 if it could not determined + if (progress >= 0) { + progressBar.isIndeterminate = false + val max = progressBar.max.toFloat() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + progressBar.setProgress((max * progress).toInt(), true) + } else { + progressBar.progress = (max * progress).toInt() + } + } else { + progressBar.isIndeterminate = true + } + }, + { + Toast.makeText(context, R.string.download_failed, Toast.LENGTH_SHORT).show() + updateItem(font, container) + }, + { + finishDownload(font, container) + } + ).also { downloadDisposables[font.id] = it } + + + } + + private fun cancelDownload(font: EmojiCompatFont, container: View) { + font.deleteDownloadedFile(container.context) + downloadDisposables[font.id]?.dispose() + downloadDisposables[font.id] = null + updateItem(font, container) + } + + private fun finishDownload(font: EmojiCompatFont, container: View) { + select(font, container.findViewById(R.id.emojicompat_radio)) + updateItem(font, container) + // Set the flag to restart the app (because an update has been downloaded) + if (selected === original && currentNeedsUpdate) { + updated = true + currentNeedsUpdate = false + } + } + + /** + * Select a font both visually and logically + * + * @param font The font to be selected + * @param radio The radio button associated with it's visual item + */ + private fun select(font: EmojiCompatFont, radio: RadioButton) { + selected = font + // Uncheck all the other buttons + for (other in radioButtons) { + if (other !== radio) { + other.isChecked = false + } + } + radio.isChecked = true + } + + /** + * Called when a "consistent" state is reached, i.e. it's not downloading the font + * + * @param font The font to be displayed + * @param container The ConstraintLayout containing the item + */ + private fun updateItem(font: EmojiCompatFont, container: View) { + // Assignments + val download: ImageButton = container.findViewById(R.id.emojicompat_download) + val caption: TextView = container.findViewById(R.id.emojicompat_caption) + val progress: ProgressBar = container.findViewById(R.id.emojicompat_progress) + val cancel: ImageButton = container.findViewById(R.id.emojicompat_download_cancel) + val radio: RadioButton = container.findViewById(R.id.emojicompat_radio) + + // There's no download going on + progress.visibility = View.GONE + cancel.visibility = View.GONE + caption.visibility = View.VISIBLE + if (font.isDownloaded(context)) { + // Make it selectable + download.visibility = View.GONE + radio.visibility = View.VISIBLE + container.isClickable = true + } else { + // Make it downloadable + download.visibility = View.VISIBLE + radio.visibility = View.GONE + container.isClickable = false + } + + // Select it if necessary + if (font === selected) { + radio.isChecked = true + // Update available + if (!font.isDownloaded(context)) { + currentNeedsUpdate = true + } + } else { + radio.isChecked = false + } + } + + private fun saveSelectedFont() { + val index = selected.id + Log.i(TAG, "saveSelectedFont: Font ID: $index") + PreferenceManager + .getDefaultSharedPreferences(context) + .edit() + .putInt(key, index) + .apply() + summary = selected.getDisplay(context) + } + + /** + * User clicked ok -> save the selected font and offer to restart the app if something changed + */ + private fun onDialogOk() { + saveSelectedFont() + if (selected !== original || updated) { + AlertDialog.Builder(context) + .setTitle(R.string.restart_required) + .setMessage(R.string.restart_emoji) + .setNegativeButton(R.string.later, null) + .setPositiveButton(R.string.restart) { _, _ -> + // Restart the app + // From https://stackoverflow.com/a/17166729/5070653 + val launchIntent = Intent(context, SplashActivity::class.java) + val mPendingIntent = PendingIntent.getActivity( + context, + 0x1f973, // This is the codepoint of the party face emoji :D + launchIntent, + PendingIntent.FLAG_CANCEL_CURRENT) + val mgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager + mgr.set( + AlarmManager.RTC, + System.currentTimeMillis() + 100, + mPendingIntent) + exitProcess(0) + }.show() + } + } + + companion object { + private const val TAG = "EmojiPreference" + + // Please note that this array must sorted in the same way as the fonts. + private val viewIds = intArrayOf( + R.id.item_nomoji, + R.id.item_blobmoji, + R.id.item_twemoji, + R.id.item_notoemoji + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/NotificationPreferencesFragment.kt similarity index 99% rename from app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt rename to app/src/main/java/com/keylesspalace/tusky/components/preference/NotificationPreferencesFragment.kt index 800ea7c1d..f917d2bb7 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/NotificationPreferencesFragment.kt @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License along with Tusky; if not, * see . */ -package com.keylesspalace.tusky.fragment.preference +package com.keylesspalace.tusky.components.preference import android.os.Bundle import androidx.preference.PreferenceFragmentCompat diff --git a/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesActivity.kt similarity index 97% rename from app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt rename to app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesActivity.kt index 383a07ae3..4fe0abd8a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesActivity.kt @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License along with Tusky; if not, * see . */ -package com.keylesspalace.tusky +package com.keylesspalace.tusky.components.preference import android.content.Context import android.content.Intent @@ -23,9 +23,11 @@ import android.util.Log import android.view.MenuItem import androidx.fragment.app.Fragment import androidx.preference.PreferenceManager +import com.keylesspalace.tusky.BaseActivity +import com.keylesspalace.tusky.MainActivity +import com.keylesspalace.tusky.R import com.keylesspalace.tusky.appstore.EventHub import com.keylesspalace.tusky.appstore.PreferenceChangedEvent -import com.keylesspalace.tusky.fragment.preference.* import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.ThemeUtils import com.keylesspalace.tusky.util.getNonNullString diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt similarity index 96% rename from app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt rename to app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt index 6dec7273b..edddffca4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt @@ -13,13 +13,13 @@ * You should have received a copy of the GNU General Public License along with Tusky; if not, * see . */ -package com.keylesspalace.tusky.fragment.preference +package com.keylesspalace.tusky.components.preference import android.os.Bundle import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import com.keylesspalace.tusky.PreferencesActivity import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.settings.* import com.keylesspalace.tusky.util.ThemeUtils import com.keylesspalace.tusky.util.getNonNullString @@ -27,8 +27,13 @@ import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import com.mikepenz.iconics.utils.colorInt import com.mikepenz.iconics.utils.sizePx +import okhttp3.OkHttpClient +import javax.inject.Inject -class PreferencesFragment : PreferenceFragmentCompat() { +class PreferencesFragment : PreferenceFragmentCompat(), Injectable { + + @Inject + lateinit var okhttpclient: OkHttpClient private val iconSize by lazy { resources.getDimensionPixelSize(R.dimen.preference_icon_size) } private var httpProxyPref: Preference? = null @@ -47,7 +52,7 @@ class PreferencesFragment : PreferenceFragmentCompat() { icon = makeIcon(GoogleMaterial.Icon.gmd_palette) } - emojiPreference { + emojiPreference(okhttpclient) { setDefaultValue("system_default") setIcon(R.drawable.ic_emoji_24dp) key = PrefKeys.EMOJI diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/ProxyPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/ProxyPreferencesFragment.kt similarity index 97% rename from app/src/main/java/com/keylesspalace/tusky/fragment/preference/ProxyPreferencesFragment.kt rename to app/src/main/java/com/keylesspalace/tusky/components/preference/ProxyPreferencesFragment.kt index e7ee7ade0..922d5a7a1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/ProxyPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/ProxyPreferencesFragment.kt @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License along with Tusky; if not, * see . */ -package com.keylesspalace.tusky.fragment.preference +package com.keylesspalace.tusky.components.preference import android.os.Bundle import androidx.preference.PreferenceFragmentCompat diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/TabFilterPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/TabFilterPreferencesFragment.kt similarity index 97% rename from app/src/main/java/com/keylesspalace/tusky/fragment/preference/TabFilterPreferencesFragment.kt rename to app/src/main/java/com/keylesspalace/tusky/components/preference/TabFilterPreferencesFragment.kt index cd76300da..71c5e10ec 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/TabFilterPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/TabFilterPreferencesFragment.kt @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License along with Tusky; if not, * see . */ -package com.keylesspalace.tusky.fragment.preference +package com.keylesspalace.tusky.components.preference import android.os.Bundle import androidx.preference.PreferenceFragmentCompat diff --git a/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt b/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt index 1f958e5a4..ea2741ca5 100644 --- a/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt +++ b/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt @@ -18,6 +18,7 @@ package com.keylesspalace.tusky.di import com.keylesspalace.tusky.* import com.keylesspalace.tusky.components.compose.ComposeActivity import com.keylesspalace.tusky.components.instancemute.InstanceListActivity +import com.keylesspalace.tusky.components.preference.PreferencesActivity import com.keylesspalace.tusky.components.report.ReportActivity import com.keylesspalace.tusky.components.scheduled.ScheduledTootActivity import com.keylesspalace.tusky.components.search.SearchActivity diff --git a/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt b/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt index 48e8b6250..a1a8c8fee 100644 --- a/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt +++ b/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt @@ -20,14 +20,15 @@ import com.keylesspalace.tusky.AccountsInListFragment import com.keylesspalace.tusky.components.conversation.ConversationsFragment import com.keylesspalace.tusky.components.instancemute.fragment.InstanceListFragment import com.keylesspalace.tusky.fragment.* -import com.keylesspalace.tusky.fragment.preference.AccountPreferencesFragment -import com.keylesspalace.tusky.fragment.preference.NotificationPreferencesFragment +import com.keylesspalace.tusky.components.preference.AccountPreferencesFragment +import com.keylesspalace.tusky.components.preference.NotificationPreferencesFragment import com.keylesspalace.tusky.components.report.fragments.ReportDoneFragment import com.keylesspalace.tusky.components.report.fragments.ReportNoteFragment import com.keylesspalace.tusky.components.report.fragments.ReportStatusesFragment import com.keylesspalace.tusky.components.search.fragments.SearchAccountsFragment import com.keylesspalace.tusky.components.search.fragments.SearchHashtagsFragment import com.keylesspalace.tusky.components.search.fragments.SearchStatusesFragment +import com.keylesspalace.tusky.components.preference.PreferencesFragment import dagger.Module import dagger.android.ContributesAndroidInjector @@ -85,4 +86,7 @@ abstract class FragmentBuildersModule { @ContributesAndroidInjector abstract fun searchHashtagsFragment(): SearchHashtagsFragment + @ContributesAndroidInjector + abstract fun preferencesFragment(): PreferencesFragment + } diff --git a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt index 0a5d34944..df9627d80 100644 --- a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt @@ -17,7 +17,7 @@ object PrefKeys { // each preference a key for it to work. const val APP_THEME = "appTheme" - const val EMOJI = "emojiCompat" + const val EMOJI = "selected_emoji_font" const val FAB_HIDE = "fabHide" const val LANGUAGE = "language" const val STATUS_TEXT_SIZE = "statusTextSize" diff --git a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt index 438580eed..82dfa14e2 100644 --- a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt @@ -3,7 +3,8 @@ package com.keylesspalace.tusky.settings import android.content.Context import androidx.annotation.StringRes import androidx.preference.* -import com.keylesspalace.tusky.EmojiPreference +import com.keylesspalace.tusky.components.preference.EmojiPreference +import okhttp3.OkHttpClient class PreferenceParent( val context: Context, @@ -24,8 +25,8 @@ inline fun PreferenceParent.listPreference(builder: ListPreference.() -> Unit): return pref } -inline fun PreferenceParent.emojiPreference(builder: EmojiPreference.() -> Unit): EmojiPreference { - val pref = EmojiPreference(context) +inline fun PreferenceParent.emojiPreference(okHttpClient: OkHttpClient, builder: EmojiPreference.() -> Unit): EmojiPreference { + val pref = EmojiPreference(context, okHttpClient) builder(pref) addPref(pref) return pref diff --git a/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.java b/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.java deleted file mode 100644 index ca7899e7a..000000000 --- a/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.java +++ /dev/null @@ -1,564 +0,0 @@ -package com.keylesspalace.tusky.util; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.os.AsyncTask; -import android.util.Log; -import android.util.Pair; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; - -import com.keylesspalace.tusky.R; - -import java.io.EOFException; -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import de.c1710.filemojicompat.FileEmojiCompatConfig; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import okhttp3.ResponseBody; -import okio.BufferedSink; -import okio.Okio; -import okio.Source; - - -/** - * This class bundles information about an emoji font as well as many convenient actions. - */ -public class EmojiCompatFont { - private static final String TAG = "EmojiCompatFont"; - /** - * This String represents the sub-directory the fonts are stored in. - */ - private static final String DIRECTORY = "emoji"; - - // These are the items which are also present in the JSON files - private final String name, display, url; - // The thumbnail image and the caption are provided as resource ids - private final int img, caption; - // The version is stored as a String in the x.xx.xx format (to be able to compare versions) - private final String version; - private final int[] versionCode; - private AsyncTask fontDownloader; - // The system font gets some special behavior... - private static final EmojiCompatFont SYSTEM_DEFAULT = - new EmojiCompatFont("system-default", - "System Default", - R.string.caption_systememoji, - R.drawable.ic_emoji_34dp, - "", - "0"); - private static final EmojiCompatFont BLOBMOJI = - new EmojiCompatFont("Blobmoji", - "Blobmoji", - R.string.caption_blobmoji, - R.drawable.ic_blobmoji, - "https://tusky.app/hosted/emoji/BlobmojiCompat.ttf", - "12.0.0" - ); - private static final EmojiCompatFont TWEMOJI = - new EmojiCompatFont("Twemoji", - "Twemoji", - R.string.caption_twemoji, - R.drawable.ic_twemoji, - "https://tusky.app/hosted/emoji/TwemojiCompat.ttf", - "12.0.0" - ); - private static final EmojiCompatFont NOTOEMOJI = - new EmojiCompatFont("NotoEmoji", - "Noto Emoji", - R.string.caption_notoemoji, - R.drawable.ic_notoemoji, - "https://tusky.app/hosted/emoji/NotoEmojiCompat.ttf", - "11.0.0" - ); - - /** - * This array stores all available EmojiCompat fonts. - * References to them can simply be saved by saving their indices - */ - public static final EmojiCompatFont[] FONTS = {SYSTEM_DEFAULT, BLOBMOJI, TWEMOJI, NOTOEMOJI}; - // A list of all available font files and whether they are older than the current version or not - // They are ordered by there version codes in ascending order - private ArrayList> existingFontFiles; - - private EmojiCompatFont(String name, - String display, - int caption, - int img, - String url, - String version) { - this.name = name; - this.display = display; - this.caption = caption; - this.img = img; - this.url = url; - this.version = version; - this.versionCode = getVersionCode(version); - } - - /** - * Returns the Emoji font associated with this ID - * - * @param id the ID of this font - * @return the corresponding font. Will default to SYSTEM_DEFAULT if not in range. - */ - public static EmojiCompatFont byId(int id) { - if (id >= 0 && id < FONTS.length) { - return FONTS[id]; - } else { - return SYSTEM_DEFAULT; - } - } - - public int getId() { - return Arrays.asList(FONTS).indexOf(this); - } - - public String getName() { - return name; - } - - - public String getDisplay(Context context) { - return this != SYSTEM_DEFAULT ? display : context.getString(R.string.system_default); - } - - public String getCaption(Context context) { - return context.getResources().getString(caption); - } - - public String getUrl() { - return url; - } - - public Drawable getThumb(Context context) { - return ContextCompat.getDrawable(context, img); - } - - public String getVersion() { - return version; - } - - public int[] getVersionCode() { - return versionCode; - } - - /** - * This method will return the actual font file (regardless of its existence) for - * the current version (not necessarily the latest!). - * - * @return The font (TTF) file or null if called on SYSTEM_FONT - */ - @Nullable - private File getFont(Context context) { - if (this != SYSTEM_DEFAULT) { - File directory = new File(context.getExternalFilesDir(null), DIRECTORY); - return new File(directory, this.getName() + this.getVersion() + ".ttf"); - } else { - return null; - } - } - - - public FileEmojiCompatConfig getConfig(Context context) { - return new FileEmojiCompatConfig(context, getLatestFontFile(context)); - } - - public boolean isDownloaded(Context context) { - // The existence of the current version is actually checked twice, although the first method should - // be much faster and more common. - return this == SYSTEM_DEFAULT || getFont(context) != null - && (getFont(context).exists() || newerFileExists(context)); - } - - /** - * Checks whether there is already a font version that satisfies the current version, i.e. it - * has a higher or equal version code. - * - * @param context The Context - * @return Whether there is a font file with a higher or equal version code to the current - */ - private boolean newerFileExists(Context context) { - loadExistingFontFiles(context); - if (!existingFontFiles.isEmpty()) - // The last file is already the newest one... - return compareVersions(existingFontFiles.get(existingFontFiles.size() - 1).second, - getVersionCode()) >= 0; - return false; - } - - /** - * Downloads the TTF file for this font - * - * @param listeners The listeners which will be notified when the download has been finished - */ - public void downloadFont(Context context, Downloader.EmojiDownloadListener... listeners) { - if (this != SYSTEM_DEFAULT) { - // Additionally run a cleanup process after the download has been successful. - Downloader.EmojiDownloadListener cleanup = font -> deleteOldVersions(context); - - List allListeners - = new ArrayList<>(Arrays.asList(listeners)); - allListeners.add(cleanup); - Downloader.EmojiDownloadListener[] allListenersA = - new Downloader.EmojiDownloadListener[allListeners.size()]; - - fontDownloader = new Downloader( - this, - allListeners.toArray(allListenersA)) - .execute(getFont(context)); - } else { - for (Downloader.EmojiDownloadListener listener : listeners) { - // The system emoji font is always downloaded... - listener.onDownloaded(this); - } - } - } - - /** - * Deletes any older version of a font - * - * @param context The current Context - */ - private void deleteOldVersions(Context context) { - loadExistingFontFiles(context); - Log.d(TAG, "deleting old versions..."); - - Log.d(TAG, String.format("deleteOldVersions: Found %d other font files", existingFontFiles.size())); - for (Pair fileExists : existingFontFiles) { - if (compareVersions(fileExists.second, getVersionCode()) < 0) { - File file = fileExists.first; - // Uses side effects! - Log.d(TAG, String.format("Deleted %s successfully: %s", file.getAbsolutePath(), - file.delete())); - } - } - } - - private static final Comparator> pairComparator = (o1, o2) -> compareVersions(o1.second, o2.second); - - - /** - * Loads all font files that are inside the files directory into an ArrayList with the information - * on whether they are older than the currently available version or not. - * - * @param context The Context - */ - private void loadExistingFontFiles(Context context) { - // Only load it once - if (this.existingFontFiles == null) { - // If we call this on the system default font, just return nothing... - if (this == SYSTEM_DEFAULT) { - existingFontFiles = new ArrayList<>(0); - } - - File directory = new File(context.getExternalFilesDir(null), DIRECTORY); - // It will search for old versions using a regex that matches the font's name plus - // (if present) a version code. No version code will be regarded as version 0. - Pattern fontRegex = Pattern.compile(getName() + "(\\d+(\\.\\d+)*)?" + "\\.ttf"); - - - FilenameFilter ttfFilter = (dir, name) -> name.endsWith(".ttf"); - File[] existingFontFiles = directory.isDirectory() ? directory.listFiles(ttfFilter) : new File[0]; - Log.d(TAG, String.format("loadExistingFontFiles: %d other font files found", - existingFontFiles.length)); - // This is actually the upper bound - this.existingFontFiles = new ArrayList<>(existingFontFiles.length); - - - for (File file : existingFontFiles) { - Matcher matcher = fontRegex.matcher(file.getName()); - if (matcher.matches()) { - String version = matcher.group(1); - int[] versionCode = getVersionCode(version); - Pair entry = new Pair<>(file, versionCode); - // https://stackoverflow.com/a/51893026 - // Insert it in a sorted way - int index = Collections.binarySearch(this.existingFontFiles, entry, pairComparator); - if (index < 0) { - index = -index - 1; - } - this.existingFontFiles.add(index, entry); - } - } - } - } - - /** - * Returns the current or latest version of this font file (if there is any) - * - * @param context The Context - * @return The file for this font with the current or (if not existent) highest version code or null if there is no file for this font. - */ - private File getLatestFontFile(@NonNull Context context) { - File current = getFont(context); - if (current != null && current.exists()) - return current; - loadExistingFontFiles(context); - try { - return existingFontFiles.get(existingFontFiles.size() - 1).first; - } catch (IndexOutOfBoundsException e) { - return getFont(context); - } - } - - private @Nullable - int[] getVersionCode(@Nullable String version) { - if (version == null) - return null; - String[] versions = version.split("\\."); - int[] versionCodes = new int[versions.length]; - for (int i = 0; i < versions.length; i++) - versionCodes[i] = parseInt(versions[i], 0); - return versionCodes; - } - - /** - * A small helper method to convert a String to an int with a default value - * - * @param value The String to be parsed - * @param def The default value - * @return Either the String parsed to an int or - if this is not possible - the default value - */ - private int parseInt(@Nullable String value, int def) { - try { - return Integer.parseInt(value); - } catch (NumberFormatException | NullPointerException e) { - e.printStackTrace(); - return def; - } - } - - /** - * Compares two version codes to each other - * - * @param versionA The first version - * @param versionB The second version - * @return -1 if versionA < versionB, 1 if versionA > versionB and 0 otherwise - */ - private static int compareVersions(int[] versionA, int[] versionB) { - // This saves us much headache about handling a null version - if (versionA == null) - versionA = new int[]{0}; - - int len = Math.max(versionB.length, versionA.length); - - int vA, vB; - // Compare the versions - for (int i = 0; i < len; i++) { - // Just to make sure there is something specified here - if (versionA.length > i) { - vA = versionA[i]; - } else { - vA = 0; - } - if (versionB.length > i) { - vB = versionB[i]; - } else { - vB = 0; - } - - // It needs to be decided on the next level - if (vB == vA) - continue; - // Okay, is version B newer or version A? - return Integer.compare(vA, vB); - } - - // The versions are equal - return 0; - } - - /** - * Stops downloading the font. If no one started a font download, nothing happens. - */ - public void cancelDownload() { - if (fontDownloader != null) { - fontDownloader.cancel(false); - fontDownloader = null; - } - } - - /** - * This class is used to easily manage the download of a font - */ - public static class Downloader extends AsyncTask { - // All interested objects/methods - private final EmojiDownloadListener[] listeners; - // The MIME-Type which might be unnecessary - private static final String MIME = "application/woff"; - // The font belonging to this download - private final EmojiCompatFont font; - private static final String TAG = "Emoji-Font Downloader"; - private static long CHUNK_SIZE = 4096; - private boolean failed = false; - - Downloader(EmojiCompatFont font, EmojiDownloadListener... listeners) { - super(); - this.listeners = listeners; - this.font = font; - } - - @Override - protected File doInBackground(File... files) { - // Only download to one file... - File downloadFile = files[0]; - try { - // It is possible (and very likely) that the file does not exist yet - if (!downloadFile.exists()) { - downloadFile.getParentFile().mkdirs(); - downloadFile.createNewFile(); - } - OkHttpClient client = new OkHttpClient(); - Request request = new Request.Builder().url(font.getUrl()) - .addHeader("Content-Type", MIME) - .build(); - Response response = client.newCall(request).execute(); - BufferedSink sink = Okio.buffer(Okio.sink(downloadFile)); - Source source = null; - try { - long size; - // Download! - if (response.body() != null - && response.isSuccessful() - && (size = networkResponseLength(response)) > 0) { - float progress = 0; - source = response.body().source(); - try { - while (!isCancelled()) { - sink.write(response.body().source(), CHUNK_SIZE); - progress += CHUNK_SIZE; - publishProgress(progress / size); - } - } catch (EOFException ex) { - /* - This means we've finished downloading the file since sink.write - will throw an EOFException when the file to be read is empty. - */ - } - } else { - Log.e(TAG, "downloading " + font.getUrl() + " failed. No content to download."); - Log.e(TAG, "Status code: " + response.code()); - failed = true; - } - } finally { - if (source != null) { - source.close(); - } - sink.close(); - // This 'if' uses side effects to delete the File. - if (isCancelled() && !downloadFile.delete()) { - Log.e(TAG, "Could not delete file " + downloadFile); - } - } - } catch (IOException ex) { - ex.printStackTrace(); - failed = true; - } - return downloadFile; - } - - @Override - public void onProgressUpdate(Float... progress) { - for (EmojiDownloadListener listener : listeners) { - listener.onProgress(progress[0]); - } - } - - @Override - public void onPostExecute(File downloadedFile) { - if (!failed && downloadedFile.exists()) { - for (EmojiDownloadListener listener : listeners) { - listener.onDownloaded(font); - } - } else { - fail(downloadedFile); - } - } - - private void fail(File failedFile) { - if (failedFile.exists() && !failedFile.delete()) { - Log.e(TAG, "Could not delete file " + failedFile); - } - for (EmojiDownloadListener listener : listeners) { - listener.onFailed(); - } - } - - /** - * This interfaced is used to get notified when a download has been finished - */ - public interface EmojiDownloadListener { - /** - * Called after successfully finishing a download. - * - * @param font The font related to this download. This will help identifying the download - */ - void onDownloaded(EmojiCompatFont font); - - // TODO: Add functionality - - /** - * Called when something went wrong with the download. - * This one won't be called when the download has been cancelled though. - */ - default void onFailed() { - // Oh no! D: - } - - /** - * Called whenever the progress changed - * - * @param Progress A value between 0 and 1 representing the current progress - */ - default void onProgress(float Progress) { - // ARE WE THERE YET? - } - } - - - /** - * This method is needed because when transparent compression is used OkHttp reports - * {@link ResponseBody#contentLength()} as -1. We try to get the header which server sent - * us manually here. - * - * @see OkHttp issue 259 - */ - private long networkResponseLength(Response response) { - Response networkResponse = response.networkResponse(); - if (networkResponse == null) { - // In case it's a fully cached response - ResponseBody body = response.body(); - return body == null ? -1 : body.contentLength(); - } - String header = networkResponse.header("Content-Length"); - if (header == null) { - return -1; - } - try { - return Integer.parseInt(header); - } catch (NumberFormatException e) { - return -1; - } - } - } - - @Override - @NonNull - public String toString() { - return display; - } -} diff --git a/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.kt b/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.kt new file mode 100644 index 000000000..e18e24add --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.kt @@ -0,0 +1,351 @@ +package com.keylesspalace.tusky.util + +import android.content.Context +import android.util.Log +import android.util.Pair +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.annotation.VisibleForTesting +import com.keylesspalace.tusky.R +import de.c1710.filemojicompat.FileEmojiCompatConfig +import io.reactivex.Observable +import io.reactivex.ObservableEmitter +import io.reactivex.schedulers.Schedulers +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import okhttp3.ResponseBody +import okhttp3.internal.toLongOrDefault +import okio.Source +import okio.buffer +import okio.sink +import java.io.EOFException +import java.io.File +import java.io.FilenameFilter +import java.io.IOException +import kotlin.math.max + +/** + * This class bundles information about an emoji font as well as many convenient actions. + */ +class EmojiCompatFont( + val name: String, + private val display: String, + @StringRes val caption: Int, + @DrawableRes val img: Int, + val url: String, + // The version is stored as a String in the x.xx.xx format (to be able to compare versions) + val version: String) { + + private val versionCode = getVersionCode(version) + + // A list of all available font files and whether they are older than the current version or not + // They are ordered by their version codes in ascending order + private var existingFontFileCache: List>>? = null + + val id: Int + get() = FONTS.indexOf(this) + + fun getDisplay(context: Context): String { + return if (this !== SYSTEM_DEFAULT) display else context.getString(R.string.system_default) + } + + /** + * This method will return the actual font file (regardless of its existence) for + * the current version (not necessarily the latest!). + * + * @return The font (TTF) file or null if called on SYSTEM_FONT + */ + private fun getFontFile(context: Context): File? { + return if (this !== SYSTEM_DEFAULT) { + val directory = File(context.getExternalFilesDir(null), DIRECTORY) + File(directory, "$name$version.ttf") + } else { + null + } + } + + fun getConfig(context: Context): FileEmojiCompatConfig { + return FileEmojiCompatConfig(context, getLatestFontFile(context)) + } + + fun isDownloaded(context: Context): Boolean { + return this === SYSTEM_DEFAULT || getFontFile(context)?.exists() == true || fontFileExists(context) + } + + /** + * Checks whether there is already a font version that satisfies the current version, i.e. it + * has a higher or equal version code. + * + * @param context The Context + * @return Whether there is a font file with a higher or equal version code to the current + */ + private fun fontFileExists(context: Context): Boolean { + val existingFontFiles = getExistingFontFiles(context) + return if (existingFontFiles.isNotEmpty()) { + compareVersions(existingFontFiles.last().second, versionCode) >= 0 + } else { + false + } + } + + /** + * Deletes any older version of a font + * + * @param context The current Context + */ + private fun deleteOldVersions(context: Context) { + val existingFontFiles = getExistingFontFiles(context) + Log.d(TAG, "deleting old versions...") + Log.d(TAG, String.format("deleteOldVersions: Found %d other font files", existingFontFiles.size)) + for (fileExists in existingFontFiles) { + if (compareVersions(fileExists.second, versionCode) < 0) { + val file = fileExists.first + // Uses side effects! + Log.d(TAG, String.format("Deleted %s successfully: %s", file.absolutePath, + file.delete())) + } + } + } + + /** + * Loads all font files that are inside the files directory into an ArrayList with the information + * on whether they are older than the currently available version or not. + * + * @param context The Context + */ + private fun getExistingFontFiles(context: Context): List>> { + // Only load it once + existingFontFileCache?.let { + return it + } + // If we call this on the system default font, just return nothing... + if (this === SYSTEM_DEFAULT) { + existingFontFileCache = emptyList() + return emptyList() + } + + val directory = File(context.getExternalFilesDir(null), DIRECTORY) + // It will search for old versions using a regex that matches the font's name plus + // (if present) a version code. No version code will be regarded as version 0. + val fontRegex = "$name(\\d+(\\.\\d+)*)?\\.ttf".toPattern() + val ttfFilter = FilenameFilter { _, name: String -> name.endsWith(".ttf") } + val foundFontFiles = directory.listFiles(ttfFilter).orEmpty() + Log.d(TAG, String.format("loadExistingFontFiles: %d other font files found", + foundFontFiles.size)) + + return foundFontFiles.map { file -> + val matcher = fontRegex.matcher(file.name) + val versionCode = if (matcher.matches()) { + val version = matcher.group(1) + getVersionCode(version) + } else { + listOf(0) + } + Pair(file, versionCode) + }.sortedWith( + Comparator>> { a, b -> compareVersions(a.second, b.second) } + ).also { + existingFontFileCache = it + } + } + + /** + * Returns the current or latest version of this font file (if there is any) + * + * @param context The Context + * @return The file for this font with the current or (if not existent) highest version code or null if there is no file for this font. + */ + private fun getLatestFontFile(context: Context): File? { + val current = getFontFile(context) + if (current != null && current.exists()) return current + val existingFontFiles = getExistingFontFiles(context) + return existingFontFiles.firstOrNull()?.first + } + + private fun getVersionCode(version: String?): List { + if (version == null) return listOf(0) + return version.split(".").map { + it.toIntOrNull() ?: 0 + } + } + + fun downloadFontFile(context: Context, + okHttpClient: OkHttpClient): Observable { + return Observable.create { emitter: ObservableEmitter -> + // It is possible (and very likely) that the file does not exist yet + val downloadFile = getFontFile(context)!! + if (!downloadFile.exists()) { + downloadFile.parentFile?.mkdirs() + downloadFile.createNewFile() + } + val request = Request.Builder().url(url) + .build() + + val sink = downloadFile.sink().buffer() + var source: Source? = null + try { + // Download! + val response = okHttpClient.newCall(request).execute() + + val responseBody = response.body + if (response.isSuccessful && responseBody != null) { + val size = response.length() + var progress = 0f + source = responseBody.source() + try { + while (!emitter.isDisposed) { + sink.write(source, CHUNK_SIZE) + progress += CHUNK_SIZE.toFloat() + if(size > 0) { + emitter.onNext(progress / size) + } else { + emitter.onNext(-1f) + } + } + } catch (ex: EOFException) { + /* + This means we've finished downloading the file since sink.write + will throw an EOFException when the file to be read is empty. + */ + } + } else { + Log.e(TAG, "Downloading $url failed. Status code: ${response.code}") + emitter.tryOnError(Exception()) + } + + } catch (ex: IOException) { + Log.e(TAG, "Downloading $url failed.", ex) + downloadFile.deleteIfExists() + emitter.tryOnError(ex) + } finally { + source?.close() + sink.close() + if (emitter.isDisposed) { + downloadFile.deleteIfExists() + } else { + deleteOldVersions(context) + emitter.onComplete() + } + } + + } + .subscribeOn(Schedulers.io()) + + } + + /** + * Deletes the downloaded file, if it exists. Should be called when a download gets cancelled. + */ + fun deleteDownloadedFile(context: Context) { + getFontFile(context)?.deleteIfExists() + } + + override fun toString(): String { + return display + } + + companion object { + private const val TAG = "EmojiCompatFont" + + /** + * This String represents the sub-directory the fonts are stored in. + */ + private const val DIRECTORY = "emoji" + + private const val CHUNK_SIZE = 4096L + + // The system font gets some special behavior... + private val SYSTEM_DEFAULT = EmojiCompatFont("system-default", + "System Default", + R.string.caption_systememoji, + R.drawable.ic_emoji_34dp, + "", + "0") + private val BLOBMOJI = EmojiCompatFont("Blobmoji", + "Blobmoji", + R.string.caption_blobmoji, + R.drawable.ic_blobmoji, + "https://tusky.app/hosted/emoji/BlobmojiCompat.ttf", + "12.0.0" + ) + private val TWEMOJI = EmojiCompatFont("Twemoji", + "Twemoji", + R.string.caption_twemoji, + R.drawable.ic_twemoji, + "https://tusky.app/hosted/emoji/TwemojiCompat.ttf", + "12.0.0" + ) + private val NOTOEMOJI = EmojiCompatFont("NotoEmoji", + "Noto Emoji", + R.string.caption_notoemoji, + R.drawable.ic_notoemoji, + "https://tusky.app/hosted/emoji/NotoEmojiCompat.ttf", + "11.0.0" + ) + + /** + * This array stores all available EmojiCompat fonts. + * References to them can simply be saved by saving their indices + */ + val FONTS = listOf(SYSTEM_DEFAULT, BLOBMOJI, TWEMOJI, NOTOEMOJI) + + /** + * Returns the Emoji font associated with this ID + * + * @param id the ID of this font + * @return the corresponding font. Will default to SYSTEM_DEFAULT if not in range. + */ + fun byId(id: Int): EmojiCompatFont = FONTS.getOrElse(id) { SYSTEM_DEFAULT } + + /** + * Compares two version codes to each other + * + * @param versionA The first version + * @param versionB The second version + * @return -1 if versionA < versionB, 1 if versionA > versionB and 0 otherwise + */ + @VisibleForTesting + fun compareVersions(versionA: List, versionB: List): Int { + val len = max(versionB.size, versionA.size) + for (i in 0 until len) { + + val vA = versionA.getOrElse(i) { 0 } + val vB = versionB.getOrElse(i) { 0 } + + // It needs to be decided on the next level + if (vA == vB) continue + // Okay, is version B newer or version A? + return vA.compareTo(vB) + } + + // The versions are equal + return 0 + } + + /** + * This method is needed because when transparent compression is used OkHttp reports + * [ResponseBody.contentLength] as -1. We try to get the header which server sent + * us manually here. + * + * @see [OkHttp issue 259](https://github.com/square/okhttp/issues/259) + */ + private fun Response.length(): Long { + networkResponse?.let { + val header = it.header("Content-Length") ?: return -1 + return header.toLongOrDefault(-1) + } + + // In case it's a fully cached response + return body?.contentLength() ?: -1 + } + + private fun File.deleteIfExists() { + if(exists() && !delete()) { + Log.e(TAG, "Could not delete file $this") + } + } + + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_preferences.xml b/app/src/main/res/layout/activity_preferences.xml index 3fa27457f..1931fe089 100644 --- a/app/src/main/res/layout/activity_preferences.xml +++ b/app/src/main/res/layout/activity_preferences.xml @@ -5,7 +5,7 @@ android:id="@+id/activity_view_thread" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.keylesspalace.tusky.PreferencesActivity"> + tools:context="com.keylesspalace.tusky.components.preference.PreferencesActivity"> diff --git a/app/src/main/res/layout/dialog_emojicompat.xml b/app/src/main/res/layout/dialog_emojicompat.xml index 923b69ead..6850e045a 100644 --- a/app/src/main/res/layout/dialog_emojicompat.xml +++ b/app/src/main/res/layout/dialog_emojicompat.xml @@ -1,33 +1,25 @@ - - + - + - + - - - - + + android:textColor="?android:attr/textColorSecondary" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/test/java/com/keylesspalace/tusky/util/EmojiCompatFontTest.kt b/app/src/test/java/com/keylesspalace/tusky/util/EmojiCompatFontTest.kt new file mode 100644 index 000000000..badaa709a --- /dev/null +++ b/app/src/test/java/com/keylesspalace/tusky/util/EmojiCompatFontTest.kt @@ -0,0 +1,47 @@ +package com.keylesspalace.tusky.util + +import org.junit.Assert.* +import org.junit.Test + +class EmojiCompatFontTest { + + @Test + fun testCompareVersions() { + + assertEquals( + -1, + EmojiCompatFont.compareVersions( + listOf(0), + listOf(1, 2, 3) + ) + ) + assertEquals( + 1, + EmojiCompatFont.compareVersions( + listOf(1, 2, 3), + listOf(0, 0, 0) + ) + ) + assertEquals( + -1, + EmojiCompatFont.compareVersions( + listOf(1, 0, 1), + listOf(1, 1, 0) + ) + ) + assertEquals( + 0, + EmojiCompatFont.compareVersions( + listOf(4, 5, 6), + listOf(4, 5, 6) + ) + ) + assertEquals( + 0, + EmojiCompatFont.compareVersions( + listOf(0, 0), + listOf(0) + ) + ) + } +} \ No newline at end of file From 67225dd4c0dc65081c2c670fadabc1c8eb5fb16d Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Wed, 2 Sep 2020 12:28:13 +0200 Subject: [PATCH 14/22] fix various bugs when creating tab with multiple hashtags (#1925) --- .../tusky/TabPreferenceActivity.kt | 21 ++++++------ .../keylesspalace/tusky/adapter/TabAdapter.kt | 34 +++++++++---------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt index ad622ea79..66c053617 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt @@ -78,7 +78,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene setDisplayShowHomeEnabled(true) } - currentTabs = (accountManager.activeAccount?.tabPreferences ?: emptyList()).toMutableList() + currentTabs = accountManager.activeAccount?.tabPreferences.orEmpty().toMutableList() currentTabsAdapter = TabAdapter(currentTabs, false, this, currentTabs.size <= MIN_TAB_COUNT) currentTabsRecyclerView.adapter = currentTabsAdapter currentTabsRecyclerView.layoutManager = LinearLayoutManager(this) @@ -175,20 +175,20 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene saveTabs() } - override fun onActionChipClicked(tab: TabData) { - showAddHashtagDialog(tab) + override fun onActionChipClicked(tab: TabData, tabPosition: Int) { + showAddHashtagDialog(tab, tabPosition) } - override fun onChipClicked(tab: TabData, chipPosition: Int) { + override fun onChipClicked(tab: TabData, tabPosition: Int, chipPosition: Int) { val newArguments = tab.arguments.filterIndexed { i, _ -> i != chipPosition } val newTab = tab.copy(arguments = newArguments) - val position = currentTabs.indexOf(tab) - currentTabs[position] = newTab + currentTabs[tabPosition] = newTab + saveTabs() - currentTabsAdapter.notifyItemChanged(position) + currentTabsAdapter.notifyItemChanged(tabPosition) } - private fun showAddHashtagDialog(tab: TabData? = null) { + private fun showAddHashtagDialog(tab: TabData? = null, tabPosition: Int = 0) { val frameLayout = FrameLayout(this) val padding = Utils.dpToPx(this, 8) @@ -211,10 +211,9 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene currentTabsAdapter.notifyItemInserted(currentTabs.size - 1) } else { val newTab = tab.copy(arguments = tab.arguments + input) - val position = currentTabs.indexOf(tab) - currentTabs[position] = newTab + currentTabs[tabPosition] = newTab - currentTabsAdapter.notifyItemChanged(position) + currentTabsAdapter.notifyItemChanged(tabPosition) } updateAvailableTabs() diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt index 007ba5465..cd877a15e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt @@ -36,8 +36,8 @@ interface ItemInteractionListener { fun onTabRemoved(position: Int) fun onStartDelete(viewHolder: RecyclerView.ViewHolder) fun onStartDrag(viewHolder: RecyclerView.ViewHolder) - fun onActionChipClicked(tab: TabData) - fun onChipClicked(tab: TabData, chipPosition: Int) + fun onActionChipClicked(tab: TabData, tabPosition: Int) + fun onChipClicked(tab: TabData, tabPosition: Int, chipPosition: Int) } class TabAdapter(private var data: List, @@ -62,16 +62,17 @@ class TabAdapter(private var data: List, override fun onBindViewHolder(holder: ViewHolder, position: Int) { val context = holder.itemView.context - if (!small && data[position].id == LIST) { - holder.itemView.textView.text = data[position].arguments.getOrNull(1).orEmpty() + val tab = data[position] + if (!small && tab.id == LIST) { + holder.itemView.textView.text = tab.arguments.getOrNull(1).orEmpty() } else { - holder.itemView.textView.setText(data[position].text) + holder.itemView.textView.setText(tab.text) } - val iconDrawable = ThemeUtils.getTintedDrawable(context, data[position].icon, android.R.attr.textColorSecondary) + val iconDrawable = ThemeUtils.getTintedDrawable(context, tab.icon, android.R.attr.textColorSecondary) holder.itemView.textView.setCompoundDrawablesRelativeWithIntrinsicBounds(iconDrawable, null, null, null) if (small) { holder.itemView.textView.setOnClickListener { - listener.onTabAdded(data[position]) + listener.onTabAdded(tab) } } holder.itemView.imageView?.setOnTouchListener { _, event -> @@ -96,7 +97,7 @@ class TabAdapter(private var data: List, if (!small) { - if (data[position].id == HASHTAG) { + if (tab.id == HASHTAG) { holder.itemView.chipGroup.show() /* @@ -104,34 +105,33 @@ class TabAdapter(private var data: List, * The other dynamic chips are inserted in front of the actionChip. * This code tries to reuse already added chips to reduce the number of Views created. */ - data[position].arguments.forEachIndexed { i, arg -> + tab.arguments.forEachIndexed { i, arg -> val chip = holder.itemView.chipGroup.getChildAt(i).takeUnless { it.id == R.id.actionChip } as Chip? ?: Chip(context).apply { - text = arg holder.itemView.chipGroup.addView(this, holder.itemView.chipGroup.size - 1) } chip.text = arg - if(data[position].arguments.size <= 1) { + if(tab.arguments.size <= 1) { chip.chipIcon = null chip.setOnClickListener(null) } else { val cancelIcon = ThemeUtils.getTintedDrawable(context, R.drawable.ic_cancel_24dp, android.R.attr.textColorPrimary) chip.chipIcon = cancelIcon chip.setOnClickListener { - listener.onChipClicked(data[position], i) + listener.onChipClicked(tab, holder.adapterPosition, i) } } } - while(holder.itemView.chipGroup.size - 1 > data[position].arguments.size) { - holder.itemView.chipGroup.removeViewAt(data[position].arguments.size - 1) + while(holder.itemView.chipGroup.size - 1 > tab.arguments.size) { + holder.itemView.chipGroup.removeViewAt(tab.arguments.size) } holder.itemView.actionChip.setOnClickListener { - listener.onActionChipClicked(data[position]) + listener.onActionChipClicked(tab, holder.adapterPosition) } } else { @@ -140,9 +140,7 @@ class TabAdapter(private var data: List, } } - override fun getItemCount(): Int { - return data.size - } + override fun getItemCount() = data.size fun setRemoveButtonVisible(enabled: Boolean) { if (removeButtonEnabled != enabled) { From 67df1a706537941cf165d9b0cfda6c894c675bcc Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 3 Sep 2020 20:17:11 +0200 Subject: [PATCH 15/22] fix another crash in ViewVideoFragment (#1926) --- .../java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt index 654dd40c7..33d8f192c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt @@ -189,7 +189,7 @@ class ViewVideoFragment : ViewMediaFragment() { mediaDescription.animate().alpha(alpha) .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { - mediaDescription.visible(isDescriptionVisible) + mediaDescription?.visible(isDescriptionVisible) animation.removeListener(this) } }) From 595c2fd174c6c1e29af64089638a0911183f92c6 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Fri, 4 Sep 2020 13:28:24 +0000 Subject: [PATCH 16/22] Translated using Weblate (Persian) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Persian) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ --- app/src/main/res/values-fa/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 95efc84b3..2263b0eee 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -133,7 +133,7 @@ ناپیگیری این حساب؟ حذف این بوق؟ عمومی: فرستادن به خط زمانی‌های عمومی - خارج از لیست: در خط زمانی عمومی نشان نده + فهرست‌نشده: نشان ندادن در خط زمانی‌های عمومی تنها دنبال‌کنندگان:پست فقط به دنبال‌کنندگان مستقیم: فرستادن فقط برای کاربران اشاره‌شده آگاهی‌ها @@ -172,7 +172,7 @@ در حال انتشار (همگام با کارساز) ناتوانی در هم‌گام‌سازی تنظیمات عمومی - لیست‌نشده + فهرست‌نشده فقط پی‌گیران اندازهٔ متن وضعیت کوچک‌ترین @@ -226,7 +226,7 @@ افزودن حساب افزودن حساب ماستودون جدید فهرست‌ها - لیست‌ها + فهرست‌ها خط زمانی فهرست در حال فرستادن با حساب %1$s شکست در تنظیم عنوان @@ -417,7 +417,7 @@ بوق‌های زمان‌بسته بوق زمان‌بسته بازنشانی - مطمئنید می‌خواهید تمام %s را مسدود کنید؟ محتوای آن دامنه را در هیچ‌یک از خط زمانی‌ها یا در آگاهی‌هایتان نخواهید دید. پیروانتان از آن دامنه، برداشته خواهند شد. + مطمئنید می‌خواهید تمام %s را مسدود کنید؟ محتوای آن دامنه را در هیچ‌یک از خط زمانی‌ها یا در آگاهی‌هایتان نخواهید دید. پی‌گیرانتان از آن دامنه، برداشته خواهند شد. هنگامی که کلیدواژه یا عبارت، فقط حروف‌عددی باشد، فقط اگر با تمام واژه مطابق باشد، اعمال خواهد شد عبارت پالایش . %1$s • %2$s From bf5acc53dfa24176aacc23b6fa039e87d7ae1ffa Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Fri, 4 Sep 2020 13:28:24 +0000 Subject: [PATCH 17/22] Translated using Weblate (Polish) Currently translated at 98.6% (426 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ --- app/src/main/res/values-pl/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index c30e5d722..5cb49db1a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -289,7 +289,7 @@ Ukryte domeny Dodaj głosowanie Wycisz %s - Dodaj zakłądkę + Dodaj zakładkę Otwórz konto osoby podbijającej Pokaż podbicia Otwórz media #%d @@ -396,14 +396,14 @@ %d dzień %d dni - - + %d dni + %d dni %d godzina - %d godzin - - + %d godziny + %d godzin + %d godzin %d minuta From 7e7df7ba2699e4d5a657db8ad9370a3422800a4a Mon Sep 17 00:00:00 2001 From: Akarshan Biswas Date: Fri, 4 Sep 2020 13:28:25 +0000 Subject: [PATCH 18/22] Translated using Weblate (Bengali (India)) Currently translated at 100.0% (432 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/bn_IN/ --- app/src/main/res/values-bn-rIN/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 118321b61..00cc0149d 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -470,4 +470,5 @@ তোমার কোনো সময়সূচীত স্ট্যাটাস নেই। তোমার কোনো খসড়া নেই। মাস্টোডনের সর্বনিম্ন ৫ মিনিটের সময়সূচীর বিরতি আছে। + শীর্ষস্থানীয় সরঞ্জামদণ্ডের শিরোনামটি লুকান \ No newline at end of file From fa4678994fd627716602a5af63941ad1f91cf1c7 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Fri, 4 Sep 2020 13:28:25 +0000 Subject: [PATCH 19/22] Translated using Weblate (Berber) Currently translated at 9.2% (40 of 432 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ber/ Added translation using Weblate (Sanskrit) --- app/src/main/res/values-ber/strings.xml | 15 ++++++++++++--- app/src/main/res/values-sa/strings.xml | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/values-sa/strings.xml diff --git a/app/src/main/res/values-ber/strings.xml b/app/src/main/res/values-ber/strings.xml index 35106996b..2e0412ca4 100644 --- a/app/src/main/res/values-ber/strings.xml +++ b/app/src/main/res/values-ber/strings.xml @@ -8,7 +8,7 @@ ⵉⵙⵎⴻⵏⵢⵉⴼⴻⵏ ⴰⵎⴻⵖⵏⵓ ⵎⴷⴻⵍ - ⵝⴻⵍⵍⴰ ⴷ ⵝⵓⵛⴹⴰ + ⵝⴻⵍⵍⴰ ⴷ ⵝⵓⵛⴹⴰ. ⵝⴰⴲⴸⴰⵔⵉⵏ ⵝⵉⴲⴸⴰⵔⵉⵏ ⵖⴻⴼ @@ -22,13 +22,22 @@ ⴽⴻⵎⵎⴻⵍ ⵍⵇⴻⵎ ⴽⴽⴻⵙ - ⵊⴻⵡⵡⴻⵇ + ⵊⴻⵡⵡⴻⵇ! ⵊⴻⵡⵡⴻⵇ ⵇⵇⴻⵏ ⵖⴻⵔ ⵎⴰⵚⵟⵓⴷⵓⵏ - ⴸ ⴰⵛⵓ ⵓ ⵜⵙⵓⵎⵎⴰⵏⵜ\? + ⴸ ⴰⵛⵓ ⵓⴸ ⵜⵜⵓⵎⵎⴰⵏⵜ\? ⵉⵙⵎⴻⵏⵢⵉⴼⴻⵏ ⴽⴽⴻⵙ ⵉⵔⴻⵡⵡⴰⵢⴻⵏ ⵉⵎⵙⴻⵇⴷⴰⵛⴻⵏ ⵜⵙⵡⴰⵃⵍⴻⵎ ⵉⵛⵛⴰⵔⴻⵏ + ⴰⵏⵜⴰ ⵝⵓⵎⵎⴰⵏⵜ\? + ⵔⵏⵓ ⵢⵉⵡⴻⵏ ⵏ ⵓⵎⵉⴹⴰⵏ ⴰⵎⴰⵢⵏⵓⵝ ⵏ ⵎⴰⵚⵟⵓⴷⵓⵏ + ⵔⵏⵓ ⴰⵎⵉⴹⴰⵏ + ⴸⴰⵛⵓ ⵉⴳⴻⵍⵍⴰⵏ ⴸ ⴰⵎⴰⵢⵏⵓⵝ\? + ⵙⵖⵉⵡⴻⵙ ⵝⵉⵊⴻⵡⵡⵉⵇⵝⴰ + ⵝⵉⵊⴻⵡⵡⵉⵇⵉⵏ ⵢⴻⵜⵜⵖⴰⵙⵖⴰⵡⵙⴻⵏ + ⵝⵉⵊⴻⵡⵡⵉⵇⵉⵏ ⵢⴻⵜⵜⵖⴰⵙⵖⴰⵡⵙⴻⵏ + ⵝⵉⵛⵔⴰⴹ + ⵝⵉⵛⵔⴰⴹ \ No newline at end of file diff --git a/app/src/main/res/values-sa/strings.xml b/app/src/main/res/values-sa/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-sa/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 5fe4c573d6195e20491bd8016cf03a47eb284268 Mon Sep 17 00:00:00 2001 From: dkdarshan760 Date: Fri, 4 Sep 2020 13:28:25 +0000 Subject: [PATCH 20/22] Translated using Weblate (Sanskrit) Currently translated at 70.5% (304 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ Translated using Weblate (Sanskrit) Currently translated at 38.0% (164 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ Translated using Weblate (Sanskrit) Currently translated at 33.8% (146 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ Translated using Weblate (Sanskrit) Currently translated at 24.3% (105 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ Translated using Weblate (Sanskrit) Currently translated at 22.5% (97 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ Translated using Weblate (Sanskrit) Currently translated at 19.2% (83 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ Translated using Weblate (Sanskrit) Currently translated at 12.9% (56 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ Translated using Weblate (Sanskrit) Currently translated at 12.2% (53 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ Translated using Weblate (Sanskrit) Currently translated at 5.3% (23 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ --- app/src/main/res/values-sa/strings.xml | 316 ++++++++++++++++++++++++- 1 file changed, 315 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-sa/strings.xml b/app/src/main/res/values-sa/strings.xml index a6b3daec9..0883f8ee7 100644 --- a/app/src/main/res/values-sa/strings.xml +++ b/app/src/main/res/values-sa/strings.xml @@ -1,2 +1,316 @@ - \ No newline at end of file + + स्थानीयाः + सूचनाः + गृहम् + दौत्यप्रेषणं विफलं जातम् । + उपारोपणं विफलं जातम् । + चलचित्राणि चित्राणि चोभे एव नैकस्मिन्नेव प्रकटने संस्थापिते भवितुमर्हतः । + श्रव्यदृश्यसामग्र्यः रक्षयितुमनुमतिर्दातव्या । + भृशं दीर्घतमा स्थितिरियम् ! + श्रव्यदृश्यसामग्र्यः द्रष्टुमनुमतिर्दातव्या । + सा सञ्चिका नोद्घाट्यते । + नैतादृशा सञ्चिका उपारोपणीया । + श्रव्यसञ्चिका ४०MBतोऽल्पा स्थाप्या । + चलचित्रसञ्चिका ४०MBतोऽल्पा स्थाप्या । + ८ MBतोऽल्पा परिमिता सञ्चिका स्थाप्या । + सम्प्रवेशस्तोकं न लब्धः । + प्रमाणीकरणं निषिद्धम् । + अज्ञातः प्रमाणीकरणदोषो जातः । + प्रयोजनार्थं जालसञ्चारकं न लब्धम् । + "तया व्यक्त्या प्रमाणीकरणं विफलं जातम् ।" + अवैधानिकप्रदेशः प्रविष्टः + नैतद्रिक्तं भवितुमर्हति । + दोषो जातः । कृपया भवतोऽन्तर्जालीयसम्पर्कं परीक्ष्य पुनश्च यतताम् । + दोषो जातः + न किमप्यत्र । नवीकरणार्थमाकृष्यताम् ! + न किमप्यत्र । + संनिपत्यताम् + विस्तार्यताम् + स्वल्पं दृश्यताम् + अधिकं दृश्यताम् + द्रष्टुमत्र नुद्यताम् + प्रच्छन्नसामग्र्यः + संवेदनशीलो विषयः + %s अप्रकाशयत् + \@%s + अनुज्ञापत्राणि + कालबद्धदौत्यानि + लेखविकर्षाः + स्वीयव्यक्तिविवरणं सम्पाद्यताम् + अनुसरणार्थमनुरोधः + प्रच्छन्नप्रदेशाः + निषिद्धोपभोक्तारः + मूकोपभोक्तारः + पुटचिह्नानि + प्रियाः + अनुसर्तारः + अनुसरति + कीलिताः + सप्रत्युत्तरम् + प्रकटनानि + दौत्यम् + सारण्यः + प्रत्यक्षसन्देशाः + सङ्घीयाः + %s त्वामन्वसरत् + %s भवदीयदौत्याय रुचिमददात् + %s भवदीयं दौत्यं प्राकाशयत् + प्रेष्यताम् ! + प्रेष्यताम् + विनश्य पुनश्च लिख्यताम् + नश्यताम् + सम्पाद्यताम् + आवेद्यताम् + प्रकाशनानि दृश्यन्ताम् + प्रकाशनानि छाद्यन्ताम् + अवरोधो नश्यताम् + अवरुध्यताम् + अनुसरणं नश्यताम् + अनुस्रियताम् + नूनमेव बहिर्गन्तुमीहते %1$s इति व्यक्तित्वलेखात् \? + बहिर्गम्यताम् + मास्टुडोनमाध्यमेन सम्प्रविश्यताम् + रच्यताम् + अधिकम् + प्रियता निष्क्रियताम् + पुटचिह्नं क्रियताम् + प्रियम् + प्रकाशनं निष्क्रियताम् + प्रकाश्यताम् + प्रत्युत्तरं दीयताम् + त्वरितप्रत्युत्तरं दीयताम् + अन्यटिप्पण्यः \? + आवेद्यताम् @%s + %s तवाऽनुसरणार्थंं न्यवेदयत् + सामग्र्यः युज्यन्ताम् + जालसञ्चारके उद्घाट्यताम् + सामग्र्यः + अनुसरणार्थमनुरोधाः + प्रच्छन्नप्रदेशाः + निषिद्धभोक्तारः + मूकभोक्तारः + पुटचिह्नानि + प्रियाः + लेखाविन्यासाः + विन्यासाः + व्यक्तिविवरणम् + पिधीयताम् + पुनः यत्यताम् + %s मित्रविषये मा सूच्यताम् + %s मित्रविषये सूच्यताम् + %s सशब्दं क्रियताम् + सशब्दम् + निःशब्दम् + विभाज्यताम् + चित्रं गृह्यताम् + मतदानं युज्यताम् + सामग्र्यस्मै विभाज्यताम् … + दौत्यमस्मै विभाज्यताम् … + दौत्यजालस्थलमस्मै विभाज्यताम् … + सामग्री अवारोप्यमाणा + सामग्री अवारोप्यताम् + एवं विभाज्यताम् … + %s एवमुद्घाट्यताम् + जालस्थलमनुक्रियताम् + अवारोप्यमाणम् %1$s + उद्घाट्यताम् #%d + जालस्थलानि + उल्लेखाः + प्रचलितवस्तूनि + प्रियाणि दृश्यन्ताम् + प्रकाशनानि दृश्यन्ताम् + प्रकाशनलेखकः उद्घट्यताम् + प्रचलितवस्तूनि + उल्लेखाः + जालस्थलानि + पीठिका युज्यताम् + पुनरारम्भः + कालबद्धदौत्यं क्रियताम् + भावचिह्नटङ्कणफलकम् + विषयप्रत्यादेशः + दौत्यसुदर्शता + कालबद्धदौत्यानि + पाण्डुलेखविकर्षाः + अन्वेष्यताम् + अस्वीक्रियताम् + स्वीक्रियताम् + अपाक्रियताम् + सम्पाद्यताम् + व्यक्तिविवरणं सम्पाद्यताम् + रक्ष्यताम् + पेटिकोद्घट्यताम् + सामग्र्यः वार्यन्ताम् + उल्लिख्यताम् + सशब्द आलापः क्रीयताम् + तूष्णीमालापः क्रीयताम् + %s सशब्दं क्रियताम् + %s निःशब्दं क्रियताम् + भोक्ता सशब्दः कृतः + निषिद्धभोक्तोपकृतः + प्रेषितम्! + सम्पर्कः क्रियते… + किं नाम विशिष्टवस्तु \? + शीर्षः + अवतारः + प्रत्युत्तरम् … + न परिणामाः + अन्वेष्यताम्… + विवरणम् + नाम + विषयप्रत्यादेशः + किं वर्तमानमस्ति \? + किं विशिष्टवस्तु \? + सफलं प्रत्युत्तरप्रेषणम् । + प्रेषितम्! + %s विवृतः + सूच्यता मे यदा + ज्योत्या सूच्यताम् + कम्पनेन सूच्यताम् + ध्वनिना सूच्यताम् + सतर्कताः + सूचनाः + सूचनाः + प्रत्यक्षम् - केवलमुल्लेखितयोक्तृृभ्यः प्रकट्यताम् + केवलमनुसर्तृृणाम् :- कृते प्रकट्यताम् + अनिर्दिष्टः- सार्वजनिकसमयतालिकायां मा प्रकट्यताम् + सार्वजनिकः प्रकट्यतां सार्वजनिकसमयतालिकासु + सूचनाः छाद्यन्ताम् + निःशब्दं क्रियताम् @%s\? + किल अवरुध्यताम् @%s\? + प्रदेशः छाद्यताम् + निश्चियेन सर्वमेव निषिद्धं भवेदेतस्य जनस्य %s \? कोऽपि विषयो न द्रष्टुं शक्यते तत्प्रदेशात् कस्यामपि समयतालिकायामुत वा ते सूचनापेटिकायाम् । भवदनुसर्तारः तस्मात्प्रदेशान्निष्क्रियनते । + विनश्य पुनः लिख्यताम् \? + दौत्यमेतन्नश्यताम्\? + अनुसरणं नश्यताम् \? + अवारोप्यताम् + उपारोप्यमाणम्… + सामग्रीणामुपारोपणसिद्धिः वर्तमाना + कस्याऽपि विशिष्टस्थलस्य सङ्केतसूत्रमत्र टङ्कयितुं शक्यते mastodon.social, icosahedron.website, social.tchncs.de, तथेैवअधिकम् +\n +\nयदि युष्माकं व्यक्तिगतलेखाऽत्र न वर्तते तर्हि तस्य विशिष्टस्थलस्य नाम टङ्कयित्वा तत्र निर्मातुं शक्नुथ । +\n +\nविशिष्टस्थलमित्युक्ते स्थलमेकं यत्र युष्माकं लेखाः आश्रिताः, किन्तु साफल्येनैवाऽन्यविशिष्टस्थलीयैः सह सम्पर्कयितुं शक्यते । +\n +\nअधिकमत्र प्राप्यते joinmastodon.org. + येषामुसरणं करोषि तेष्वन्वेष्यताम् + सूचिः सम्पाद्यताम् + सूचिर्नश्यताम् + पुनः सूचिनामकरणं क्रियताम् + सूचिः निर्मीयताम् + सूचिर्नष्टुमशक्या + पुनः सूचिनामकरणं कर्तुमशक्यम् + सूचिनिर्माणं कर्तुमशक्यम् + अनुसरणानुरोधो नश्यताम् \? + सूचेः समयतालिका + आवल्यः + आवल्यः + नवमास्टोडोनलेखा युज्यताम् + नवलेखा युज्यताम् + शोधनार्थं वाक्यांशः + यदा शब्दो वा वाक्यांशश्चिह्नरहितो भवति, तर्हि तत्स्थाप्यते केवलं यदा पूर्णत्वेन शब्दसमानता वर्तते + सर्वः शब्दः + नवीक्रियताम् + नश्यताम् + शोधकं सम्पाद्यताम् + शोधकं युज्यताम् + आलापाः + सार्वजनिकतालिकाः + अधिमारोप्यताम् + \@%s मित्रायोत्तरम् + सामग्र्यः + सर्वदा विषयसतर्कतयाऽङ्कितं दौत्यं विस्तार्यताम् + सर्वदा संवेदनशीलविषयो दृश्यताम् + त्वामनुसरति + %ds क्ष + %dm नि + %dh घ + %dy वर्ष + %dd दि + %ds क्षणेभ्यः + %dm निमेषेभ्यः + %dh घण्टाभ्यः + %dd दिनेभ्यः + %dy वर्षेभ्यः + अनुसरणं निवेदितम् + चलचित्राणि + चित्राणि + दौत्याय जालस्थानं विभाज्यताम् + दौत्यविषयो विभाज्यताम् + टस्कीवर्यस्य व्यक्तिगतविवरणम् + अशुद्धीनामावेदनं वैशिष्ट्यनिवेदनञ्च +\n https://github.com/tuskyapp/Tusky/issues + प्रकल्पस्य जालसूत्रम् : +\n https://tusky.app + "टस्कीत्यनावृतस्रोतो निःशुल्कतन्त्रांशः । GNU General Public License Version 3 इत्यनेनाऽनुज्ञापितः । अत्राऽनुज्ञापत्रं द्रष्टुं शक्यते :- +\nhttps://www.gnu.org/licenses/gpl-3.0.en.html" + टस्कीत्यनेनाऽऽश्रितः + टस्की %s + विज्ञप्तिः + कपाटितव्यक्तिगतलेखाः + %d नवपरस्परक्रियाः + %1$s च %2$s च + %1$s, %2$s, तथैव %3$s + %1$s, %2$s, %3$s तथा च %4$d अन्येऽपि + %s मित्रेण भवन्नामोल्लिखितम् + मतदाने समाप्ते सति सूचनाः + मतदानानि + प्रीतिः इत्यङ्किते सति सूचनाः + प्रियाः + दौत्यप्रकाशने सति सूचनाः + प्रकाशनानि + अनुसरणानुरोधान्नधिकृत्य सूचनाः + अनुसरणार्थमनुरोधाः + नवोल्लेखान्नधिकृत्य सूचनाः + नवानुसर्तृृन्नधिकृत्य सूचनाः + नवानुसर्तारः + नवोल्लेखाः + स्थूलतमः + स्थूलः + मध्यमः + सूक्ष्मः + सूक्ष्मतमः + दौत्यस्य / स्थितेरक्षराकारः + केवलमुसर्तृृभ्यः + अनिर्दिष्टम् + सार्वजनिकम् + नितलम् + शिखरम् + मुख्यमार्गणस्थितिः + विन्यासं समसामयिकं कर्तुं विफलता + प्रकाशनम् (जालवितरकेण सह सामयिकम्) + श्रव्यदृश्यसामग्रीः सदा संवेदनशीलाः इत्यङ्क्यताम् + पूर्वनिविष्टप्रकटनगुह्यता + HTTPS प्रतिनिधिद्वारिका + HTTPS प्रतिनिधिजालवितारकम् + HTTP प्रतिनिधिसंयुतनं क्रियताम् + HTTP प्रतिनिधिः + प्रतिनिधिः + सामग्रीणं पूर्वोद्घाटनमवारोप्यताम् + प्रत्युत्तराणि दृश्यन्ताम् + प्रकाशनानि दृश्यन्ताम् + पीठिकाः + समयतालिका-शोधनम् + छादितसामग्रीभ्यो बहुवर्णयुतचित्रं दृशयतु + सञ्जीवितावतारः क्रियताम् + स्वचालितयन्त्रेभ्यः सूचको दृश्यताम् + भाषा + सारणक्रमे संस्कारगण्डः छाद्यताम् + क्रोमस्वीयानुकूलपीठिका प्रयुज्यताम् + जालसञ्चारकम् + प्रणाल्याः परिकल्पना प्रयुज्यताम् + सूर्यास्ते स्वचालितम् + कृष्णः + ज्योतिपूर्णः + अन्धकारः + शोधकम् + समयतालिका + अनुप्रयोगप्रबन्धाः + रूपम् + मतदानं समाप्तम् + मम प्रकटनानि प्रियाणि + मम प्रकटनानि प्रकाशितानि + अनुसरणार्थं निवेदितम् + अनुसृतम् + उल्लिखिताः + \ No newline at end of file From dadf8aef8ae5283f304121a7e227159671ee3203 Mon Sep 17 00:00:00 2001 From: Akarshan Biswas Date: Fri, 4 Sep 2020 13:28:25 +0000 Subject: [PATCH 21/22] Translated using Weblate (Sanskrit) Currently translated at 24.3% (105 of 431 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sa/ --- app/src/main/res/values-sa/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-sa/strings.xml b/app/src/main/res/values-sa/strings.xml index 0883f8ee7..2ed165c1b 100644 --- a/app/src/main/res/values-sa/strings.xml +++ b/app/src/main/res/values-sa/strings.xml @@ -18,11 +18,11 @@ प्रमाणीकरणं निषिद्धम् । अज्ञातः प्रमाणीकरणदोषो जातः । प्रयोजनार्थं जालसञ्चारकं न लब्धम् । - "तया व्यक्त्या प्रमाणीकरणं विफलं जातम् ।" + तया व्यक्त्या प्रमाणीकरणं विफलं जातम् । अवैधानिकप्रदेशः प्रविष्टः नैतद्रिक्तं भवितुमर्हति । - दोषो जातः । कृपया भवतोऽन्तर्जालीयसम्पर्कं परीक्ष्य पुनश्च यतताम् । - दोषो जातः + दोषो जातः । कृपया भवतोऽन्तर्जालीयसम्पर्कं परीक्ष्य पुनश्च यतताम् ! + दोषो जातः । न किमप्यत्र । नवीकरणार्थमाकृष्यताम् ! न किमप्यत्र । संनिपत्यताम् From 92a0f23ce5dc6ec386b897f5f01bc5ae10bea7de Mon Sep 17 00:00:00 2001 From: dkdarshan760 Date: Fri, 4 Sep 2020 03:44:27 +0000 Subject: [PATCH 22/22] Translated using Weblate (Sanskrit) Currently translated at 40.0% (4 of 10 strings) Translation: Tusky/Tusky description Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/sa/ --- fastlane/metadata/android/sa/changelogs/74.txt | 8 ++++++++ fastlane/metadata/android/sa/full_description.txt | 12 ++++++++++++ fastlane/metadata/android/sa/short_description.txt | 1 + fastlane/metadata/android/sa/title.txt | 1 + 4 files changed, 22 insertions(+) create mode 100644 fastlane/metadata/android/sa/changelogs/74.txt create mode 100644 fastlane/metadata/android/sa/full_description.txt create mode 100644 fastlane/metadata/android/sa/short_description.txt create mode 100644 fastlane/metadata/android/sa/title.txt diff --git a/fastlane/metadata/android/sa/changelogs/74.txt b/fastlane/metadata/android/sa/changelogs/74.txt new file mode 100644 index 000000000..3c0cd4c03 --- /dev/null +++ b/fastlane/metadata/android/sa/changelogs/74.txt @@ -0,0 +1,8 @@ +टस्की v१२.० + +- संशोधितमुख्यमाध्यमः - पीठिकाः अधोऽपि स्थापयितुं शक्यते +- कस्मैचिन्मूकत्वप्रदानप्रक्रियायां, सूचनाश्च निःशब्दा भवेन्न वेति चेतुं शक्यते +- सम्प्रति नैकानि निश्रेणिचिह्नानि यथेच्छया एकस्यामेव पीठिकायां योक्तुं शक्यते +- सामग्रीविवरणविधिः संशोधितः येन दीर्घतरविवरणमपि योक्तुं शक्यते + +सर्वाणि परिवर्तनपत्राणि https://github.com/tuskyapp/Tusky/releases diff --git a/fastlane/metadata/android/sa/full_description.txt b/fastlane/metadata/android/sa/full_description.txt new file mode 100644 index 000000000..4f58dfd45 --- /dev/null +++ b/fastlane/metadata/android/sa/full_description.txt @@ -0,0 +1,12 @@ +टस्कीति लघुग्राहिका मास्टोडन् इत्यस्य कृते, यदनावृतस्रोतो निःशुल्कसामाजिकजालवितारकम् । + +* वस्तुपरिकल्पना +* अधिकांशमास्टोडोनीयाः अनुप्रयोगविधिलेखनमाध्यमाः युक्ताः +* बहुव्यक्तित्वलेखासाहाय्यम् +* अन्धकारप्रबन्धः प्रदीप्तिप्रबन्धोऽपि समयानुसारेण स्वचालितविपरिवर्तनञ्च +* विकर्षाः - दौत्यं लिखित्वा भविष्यते रक्ष्यताम् +* नैका भावचिह्नशैल्योऽवचीयन्ताम् +* सर्वाकारयुक्तेभ्यः पटलेभ्यः सरलीकृतम् +* पूर्णत्वेनाऽनावृत्तस्रोतस्तथा च न सशुल्काधीनत्वं गुगलसेवासदृशम् + +मास्टोडोन् इत्यस्य विषयेऽधिकं ज्ञातुमत्र गम्यताम् : https://joinmastodon.org/ diff --git a/fastlane/metadata/android/sa/short_description.txt b/fastlane/metadata/android/sa/short_description.txt new file mode 100644 index 000000000..397294083 --- /dev/null +++ b/fastlane/metadata/android/sa/short_description.txt @@ -0,0 +1 @@ +एका बहुग्राहिका मास्टोडोन् इति सामाजिकलसञ्जालेभ्यः diff --git a/fastlane/metadata/android/sa/title.txt b/fastlane/metadata/android/sa/title.txt new file mode 100644 index 000000000..a1a2e8d3b --- /dev/null +++ b/fastlane/metadata/android/sa/title.txt @@ -0,0 +1 @@ +टस्की