From 84ad1807c8275574e4b316c68652547dcce2e823 Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Tue, 26 May 2020 16:58:33 +0200 Subject: [PATCH 01/41] One more layout fix for length-collapsed posts with preview cards (#1805) --- app/src/main/res/layout/item_status.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_status.xml b/app/src/main/res/layout/item_status.xml index a1447d2b7..6501a535f 100644 --- a/app/src/main/res/layout/item_status.xml +++ b/app/src/main/res/layout/item_status.xml @@ -255,7 +255,7 @@ android:importantForAccessibility="noHideDescendants" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/status_display_name" - app:layout_constraintTop_toBottomOf="@id/button_toggle_content" + app:layout_constraintTop_toBottomOf="@id/status_card_view" tools:visibility="visible"> Date: Sat, 30 May 2020 11:10:47 +0300 Subject: [PATCH 02/41] NotificationsFragment: show appbar if there is no notifications (#1810) Thus, if user accidentally will filter everything, they will be able to return to initial state. --- .../com/keylesspalace/tusky/fragment/NotificationsFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java index 1d5f1b7be..b94249efb 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java @@ -288,7 +288,7 @@ public class NotificationsFragment extends SFragment implements private void updateFilterVisibility() { CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) swipeRefreshLayout.getLayoutParams(); - if (showNotificationsFilter && !showingError && !notifications.isEmpty()) { + if (showNotificationsFilter && !showingError) { appBarOptions.setExpanded(true, false); appBarOptions.setVisibility(View.VISIBLE); //Set content behaviour to hide filter on scroll From dc9d621b30c0516db3e208bb5f09c18cd5af7a9c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 2 Jun 2020 00:51:37 +0000 Subject: [PATCH 03/41] Translated using Weblate (Occitan) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.6% (408 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/oc/ Translated using Weblate (Persian) Currently translated at 96.4% (407 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Korean) Currently translated at 92.4% (390 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ko/ Translated using Weblate (Turkish) Currently translated at 92.8% (392 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/tr/ Translated using Weblate (Chinese (Simplified)) Currently translated at 96.9% (409 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans/ Translated using Weblate (Korean) Currently translated at 92.4% (390 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ko/ Translated using Weblate (Malayalam) Currently translated at 13.2% (56 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ml/ Translated using Weblate (Bengali (India)) Currently translated at 92.8% (392 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/bn_IN/ Translated using Weblate (Chinese (Traditional)) Currently translated at 85.3% (360 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hant/ Translated using Weblate (Czech) Currently translated at 93.8% (396 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/cs/ Translated using Weblate (Persian) Currently translated at 99.7% (409 of 410 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Welsh) Currently translated at 62.3% (263 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/cy/ Translated using Weblate (Chinese (Traditional)) Currently translated at 85.7% (362 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hant/ Translated using Weblate (French) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fr/ Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pt_BR/ Translated using Weblate (Persian) Currently translated at 99.7% (409 of 410 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Polish) Currently translated at 97.3% (411 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ Translated using Weblate (Chinese (Traditional)) Currently translated at 85.7% (362 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hant/ Translated using Weblate (Tamil) Currently translated at 59.2% (250 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ta/ Translated using Weblate (Dutch) Currently translated at 100.0% (410 of 410 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nl/ Translated using Weblate (French) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fr/ Translated using Weblate (Chinese (Simplified)) Currently translated at 97.3% (411 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hans/ Translated using Weblate (Slovenian) Currently translated at 94.3% (398 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sl/ Translated using Weblate (Polish) Currently translated at 97.3% (411 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ Translated using Weblate (Chinese (Traditional)) Currently translated at 85.7% (362 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/zh_Hant/ Translated using Weblate (Turkish) Currently translated at 93.3% (394 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/tr/ Translated using Weblate (Norwegian Bokmål) Currently translated at 99.5% (420 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nb_NO/ Translated using Weblate (Russian) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ru/ Translated using Weblate (Korean) Currently translated at 92.8% (392 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ko/ Translated using Weblate (Tamil) Currently translated at 59.2% (250 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ta/ Translated using Weblate (Basque) Currently translated at 97.3% (411 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/eu/ Translated using Weblate (Persian) Currently translated at 99.7% (409 of 410 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Dutch) Currently translated at 99.0% (406 of 410 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nl/ Translated using Weblate (Persian) Currently translated at 99.7% (409 of 410 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ Translated using Weblate (Persian) Currently translated at 99.7% (409 of 410 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ --- app/src/main/res/values-bn-rIN/strings.xml | 21 ++++++++-------- app/src/main/res/values-cs/strings.xml | 4 +--- app/src/main/res/values-cy/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 2 +- app/src/main/res/values-fa/strings.xml | 12 ++++------ app/src/main/res/values-fr/strings.xml | 4 ++-- app/src/main/res/values-ko/strings.xml | 6 ++--- app/src/main/res/values-ml/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 28 +++++++++++----------- app/src/main/res/values-no-rNB/strings.xml | 8 +++---- app/src/main/res/values-oc/strings.xml | 6 ++--- app/src/main/res/values-pl/strings.xml | 4 ++-- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 10 ++++---- app/src/main/res/values-ta/strings.xml | 4 ++-- app/src/main/res/values-tr/strings.xml | 4 ++-- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 6 ++--- 19 files changed, 62 insertions(+), 65 deletions(-) diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index e8304697b..e9dd016a5 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -357,7 +357,6 @@ সরাসরি পছন্দগুলি সহ নর্বাচন: %1$s, %2$s, %3$s, %4$s; %5$s নামের তালিকা - # ছাড়া হ্যাশট্যাগ পরিষ্কার ফিল্টার @@ -368,8 +367,8 @@ ছবি %s এর জন্য ক্রিয়া %1$s • %2$s - - + + %s বাকি %s এ শেষ হবে @@ -379,20 +378,20 @@ আপনি তৈরি একটি নির্বাচন শেষ হয়েছে - %d দিন - %d দিন + + - - + + - - + + - - + + চালিয়ে যান পিছনে যান diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 1a5511d27..fe13ed402 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -362,9 +362,7 @@ Název seznamu Hashtag bez # - Napsat toot - Napsat Vymazat Filtrovat @@ -426,7 +424,7 @@ Přeposlat na %s Nahlášení selhalo Stahování tootů neuspělo - Nahlášení bude zasláno moderátorům vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete: + Nahlášení bude zasláno moderátorovi vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete: Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii\? Zobrazit filtr oznámení Anketa diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 1295fd2e7..9655b3f88 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -290,4 +290,5 @@ Cysylltiadau Cysylltiadau Dangos hybiadau + Dilyn ceisiadau \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index aa2ed5ef2..492546b04 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -119,7 +119,7 @@ Goiburua Zer da instantzia? Konektatzen… - Sartu hemen helbidea edo mastodon.eus, mastodon.jalgi.eus, mastodon.social bezalako edozein instantzia, + Sartu hemen helbidea edo mastodon.eus, mastodon.jalgi.eus, mastodon.social bezalako edozein instantzia, \n \n Oraindik ez baduzu konturik, instantziaren izena sartu eta bertan kontua sortu dezakezu. \n diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 87f52b16d..16b2bd305 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -26,7 +26,7 @@ پست‌ها با پاسخ‌ دنبال شونده‌ها - پی‌گیر + پیروان علاقه‌مندی‌ها کاربرهای بی‌صدا کاربرهای مسدود شده @@ -195,9 +195,7 @@ %d برهم‌کنش جدید حساب قفل‌شده درباره - Tusky یک برنامه آزاد و متن‌باز است که تحت مجوز GNU General Public License Version 3. منتشر شده است. -\n شما می‌توانید مجوز را از اینجا ببینید: -\n https://www.gnu.org/licenses/gpl-3.0.en.html + تاسکی نرم‌افزاری آزاد است که تحت نگارش ۳ از پروانهٔ جامع همگانی گنو منتشر شده است. پروانه را می‌توانید از این‌جا ببینید: https://www.gnu.org/licenses/gpl-3.0.en.html %1$s • %2$s - گزارش به ناظم‌های کارسازتان ارسال خواهد شد. می‌توانید توضیحی در باب چرایی گزارش این حساب در زیر بنویسید: + گزارش به ناظر کارسازتان ارسال خواهد شد. می‌توانید توضیحی در باب چرایی گزارش این حساب در زیر بنویسید: این حساب از کارسازی دیگر است. رونوشتی ناشناس از گزارش، به آن‌جا نیز ارسال شود؟ خطا در یافتن فرستهٔ %s قدرت‌گرفته از تاسکی diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2f98398e8..ec2a1a5d9 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -69,7 +69,7 @@ Ne plus suivre Bloquer Débloquer - Cacher les boosts + Cacher les partages Montrer les boosts Signaler Supprimer @@ -449,7 +449,7 @@ Erreur lors de la récupération du message %s Propulsé par Tusky Signets - Marquer comme signet + Ajouter aux marque-pages Marque-pages Ajouté aux marque-pages Sélectionner la liste diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index ec37ff11a..bf939f3fa 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -114,7 +114,7 @@ 멘션 해시태그 부스트한 유저의 프로필로 이동 - 부스트 보이기 + 이 유저의 부스트 보이기 즐겨찾기한 유저 보이기 해시태그 멘션 @@ -240,7 +240,7 @@ %s님이 당신을 멘션했습니다 %1$s님, %2$s님, %3$s님 외 %4$d명 %1$s님, %2$s님, %3$s님 - %1$s, %2$s + %1$s님, %2$s님 %d개의 새로운 알림이 있습니다 계정 잠김 이 앱에 관하여 @@ -371,7 +371,7 @@ 타임라인에 비표시 비공개 다이렉트 - 투표: %1$s, %2$s, %3$s, %4$s; %5$s + 투표 선택지: %1$s, %2$s, %3$s, %4$s, %5$s 리스트 이름 #를 제외한 해시태그 알림 지우기 diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 1d5789c1c..d5678647b 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -58,4 +58,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 27da88f3f..3aadd3800 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -53,7 +53,7 @@ %s markeerde jouw toot als favoriet %s volgt jou Rapporteer @%s - Extra opmerkingen + Extra opmerkingen\? Snelle reactie Reageren Boosten @@ -120,8 +120,8 @@ Link kopiëren Als %s openen Delen als … - Link van de toot delen - Inhoud van de toot delen + Link van de toot delen met… + Inhoud van de toot delen met… Media delen met … Verzonden! Gebruiker is gedeblokkeerd @@ -133,7 +133,7 @@ Waarschuwingstekst Weergavenaam Bio - Zoeken + Zoeken… Geen resultaten Reageren… Avatar @@ -142,9 +142,9 @@ Aan het verbinden Het adres of domein van elke Mastodonserver kan hier worden ingevoerd, zoals mastodon.social, mastodon.nl, octodon.social en nog veel meer! \n -\n Wanneer je nog geen account hebt, kun je de naam van de Mastodonserver waar jij je graag wil registeren invoeren, waarna je daar een account kunt aanmaken. +\nWanneer je nog geen account hebt, kun je de naam van de Mastodonserver waar jij je graag wil registeren invoeren, waarna je daar een account kunt aanmaken. \n -\n Een Mastodonserver (Engels: instance) is een computerserver waar jouw account zich bevindt (vergelijk het met een e-mailserver). Je kan eenvoudig mensen van andere servers volgen en met ze communiceren, alsof jullie met elkaar op dezelfde website zitten. +\nEen Mastodonserver (Engels: instance) is een computerserver waar jouw account zich bevindt (vergelijk het met een e-mailserver). Je kan eenvoudig mensen van andere servers volgen en met ze communiceren, alsof jullie met elkaar op dezelfde website zitten. \n \n Meer informatie kun je vinden op joinmastodon.org. Uploaden media bijna voltooid @@ -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 @@ -391,16 +391,16 @@ Poll met keuzes: %1$s, %2$s, %3$s, %4$s; %5$s Acties voor afbeelding %s - - + %d dag + %d dagen - - + %d uur + %d uur - - + %d minuut + %d minuten "%d seconde" diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index 3b5edec60..439d3f9bb 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -340,8 +340,8 @@ Vil du slette dette tottet og skrive det på nytt\? %1$s • %2$s - - + + %s igjen avsluttes %s @@ -442,8 +442,8 @@ Vis bekreftelsesdialog før boosting Skru på sveiping for å bytte mellom faner - %s person - %s personer + + Varsler om følgeforespørsler Forespørsler om følging diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index f0481a0f1..bca476e9a 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -164,7 +164,7 @@ Pòrt del servidor proxy HTTP Privacitat predeterminada dels tuts Publicacion - Publica + Public Pas listada Seguidors solament Talha de text de l\'estatut @@ -332,8 +332,8 @@ %1$s Favorits - - + + Partejat per Aimat per diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 6528fe2b0..609e3c605 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -293,7 +293,7 @@ Wycisz %s Dodaj zakładkę Otwórz konto osoby podbijającej - Pokazuj podbicia + Pokaż podbicia Otwórz media #%d Pobierz media Pobieranie mediów @@ -368,7 +368,7 @@ Podbity Polubiony Publiczny - Niewidoczny + Niewidoczne Śledzący Bezpośrednio Głosowanie z opcjami: %1$s, %2$s, %3$s, %4$s; %5$s diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 85dbfcc66..46bb7664b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -101,7 +101,7 @@ Adicionar aba Links Menções - Mostrar boosts + Mostrar compartilhamentos Mostrar favoritos Menções Links diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 900516a93..4294705f2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -474,7 +474,7 @@ Показывать цветные градиенты для скрытых медиа Ошибка поиска поста %s У вас нет черновиков. - У вас нет запланированный постов. + У вас нет запланированных постов. Минимальный интервал планирования в Mastodon составляет 5 минут. Показвать диалог подтверждения перед продвижением Показывать предосмотр ссылок в лентах diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 38689ce6a..b9aa26b01 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -284,7 +284,7 @@ Če želite uveljaviti te spremembe, morate znova zagnati Tusky Kasneje Znova zaženi - Privzeti komplet emotikonov vaše naprave + "Privzeti komplet emotikonov vaše naprave " Blob emotikoni so znani od Android 4.4-7.1 Mastodonov privzeti komplet emotikonov Prenos ni uspel @@ -305,10 +305,10 @@ Odpni Pripni - - - - + + + + <b>%s</b> Spodbuda diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 2b9aa322a..6f2e94d2a 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -123,7 +123,7 @@ அனைவருக்கும் காட்டாதே பின்பற்றுபவர்களுக்கு மட்டும் காண்பி குறிபிடபட்டுள்ள பயனர்களுக்கு மட்டும் காண்பி - அறிவிப்புகளை திருத்த + அறிவிப்புகள் அறிவிப்புகள் எச்சரிக்கைகள் ஒலி மூலம் தெரிவிக்கவும் @@ -259,7 +259,7 @@ விடுவி பொருத்து கணக்கரின் முன்னுரிமைகள் - பிணைய பிழை ஏற்பட்டது! உங்கள் இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்! + "பிணைய பிழை ஏற்பட்டது! உங்கள் இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்!" காணொளி 40MB க்கும் குறைவாக இருக்க வேண்டும். டூத் அனுப்ப இயலவில்லை நேரடி தகவல் diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 367f341f5..e11e5bf7a 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -184,7 +184,7 @@ Liste dışı Sadece takipçiler Durum metin boyutu - En küçük + Çok küçük Küçük Orta Büyük @@ -392,7 +392,7 @@ Ek Yorumlar %s adresine ilet Durumlar getirilemedi - "Bildirim sunucu yöneticinize gönderilecektir. Bu hesabı neden bildirdiğinle ilgili açıklama yapabilirsin:" + "Bildirim sunucu yöneticinize gönderilecektir. Bu hesabı neden bildirdiğinizle ilgili açıklama yapabilirsiniz:" Hesap başka bir sunucudan. Raporun anonim bir kopyasını da oraya gönderilsin mi\? Bildirim filtresini göster Bahsedenler diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e1eb2312e..6f61369e3 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -434,7 +434,7 @@ 继续 返回 完成 - 成功回报 @%s + "成功回报 @%s" 附加留言 转发到 %s 回报失败 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 6a24a9031..21a1307c0 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -20,7 +20,7 @@ 媒體檔案上傳失敗 嘟文發送時出錯 主頁 - 通知 + 通知設定 本站時間軸 跨站公開時間軸 私信 @@ -30,7 +30,7 @@ 嘟文和回覆 已置頂 正在關注 - 僅關注者 + 關注者 我的收藏 被靜音的使用者 被封鎖的使用者 @@ -104,7 +104,7 @@ 搜尋 草稿 設定嘟文可見範圍 - 設定敏感內容警告 + 敏感內容警告 插入表情符號 新增標籤頁 連結 From 31e21c8d1364fc3542d5a7973461be63e74d58de Mon Sep 17 00:00:00 2001 From: Daniele Lira Mereb Date: Tue, 2 Jun 2020 00:51:38 +0000 Subject: [PATCH 04/41] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pt_BR/ Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pt_BR/ Translated using Weblate (Spanish) Currently translated at 98.5% (416 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/es/ --- app/src/main/res/values-es/strings.xml | 7 +++++- app/src/main/res/values-pt-rBR/strings.xml | 26 +++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b14d4d9fe..ff7b39832 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -402,7 +402,7 @@ Ocultar dominio completo Animar avatares GIF Toda palabra - Cuando la palabra o frase sea solo alfanumérica, solo se aplicará si coincide con toda la palabra. + Cuando la palabra o frase sea solo alfanumérica, solo se aplicará si coincide con toda la palabra Set de emojis actual de Google Encuesta con opciones: %1$s, %2$s, %3$s, %4$s; %5$s Continuar @@ -451,4 +451,9 @@ No tienes ningún estado programado. Mastodon tiene un intervalo de programación mínimo de 5 minutos. Solicitudes + Bloquear @%s\? + Silenciar @%s\? + Silenciar conversación + Dejar de silenciar conversación + Notificaciones de solicitudes \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 46bb7664b..a2ff8127f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -32,7 +32,7 @@ Favoritos Usuários silenciados Usuários bloqueados - Solicitações de seguidor + Seguidores pendentes Editar seu perfil Rascunhos Licenças @@ -50,7 +50,7 @@ Comentários adicionais? Resposta rápida Responder - Compartilhar + Dar boost Desfazer boost Favoritar Desfavoritar @@ -76,7 +76,7 @@ Favoritos Usuários silenciados Usuários bloqueados - Solicitações de seguidor + Seguidores pendentes Mídia Abrir no navegador Adicionar mídia @@ -447,6 +447,22 @@ Sem toots agendados. Áudios devem ser menores que 40MB. Sem rascunhos. - Mastodon possui um intervalo mínimo de agendamento de 5 minutos. - Solicitações de seguidor + Mastodon possui um intervalo mínimo de 5 minutos para agendar. + Seguidores pendentes + %s quer te seguir + Silenciar conversa + Desfazer silêncio + Bloquear @%s\? + Silenciar @%s\? + pedirem para me seguir + Notificações sobre seguidores pendentes + + %s pessoa + %s pessoas + + Ativar deslizar para alternar entre abas + Mostrar prévias de links nas linhas + Solicitar confirmação antes de dar boost + Hashtags + Adicionar hashtag \ No newline at end of file From 49c8fd2b61d0ad375840d40c486c94fcc5746978 Mon Sep 17 00:00:00 2001 From: Vegard Skjefstad Date: Tue, 2 Jun 2020 00:51:38 +0000 Subject: [PATCH 05/41] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nb_NO/ --- app/src/main/res/values-no-rNB/strings.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index 439d3f9bb..a8c48ae84 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -340,8 +340,8 @@ Vil du slette dette tottet og skrive det på nytt\? %1$s • %2$s - - + %s stemme + %s stemmer %s igjen avsluttes %s @@ -442,8 +442,8 @@ Vis bekreftelsesdialog før boosting Skru på sveiping for å bytte mellom faner - - + %s person + %s personer Varsler om følgeforespørsler Forespørsler om følging @@ -453,4 +453,6 @@ Fjern demping av samtale Demp samtale % ba om å få følge deg + Stikkord + Legg til stikkord \ No newline at end of file From ccc15342678d42248b9b0be3426ce2a0e2756e50 Mon Sep 17 00:00:00 2001 From: Deleted User Date: Tue, 2 Jun 2020 00:51:38 +0000 Subject: [PATCH 06/41] Translated using Weblate (French) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fr/ --- app/src/main/res/values-fr/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ec2a1a5d9..13f94a96a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -474,4 +474,6 @@ Enlever la sourdine à la conversation Silencer la conversation Activer les gestes de glissement pour passer d’un onglet à l’autre + Hashtags + Ajouter hashtag \ No newline at end of file From 785a4042650da94b0d78a562373d05fcc69a7d09 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 2 Jun 2020 00:51:38 +0000 Subject: [PATCH 07/41] Translated using Weblate (Korean) Currently translated at 92.4% (390 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ko/ Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.5% (420 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pt_BR/ --- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 42 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index bf939f3fa..e17e12efe 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -132,7 +132,7 @@ 차단이 해제됨 뮤트가 해제됨 %s 숨김 해제됨 - 보냈습니다! + 신고를 보냈습니다! 답장을 보냈습니다. 인스턴스 주소 지금 무엇을 하고 있나요\? diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a2ff8127f..e051641dc 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -36,21 +36,21 @@ Editar seu perfil Rascunhos Licenças - %s compartilhou - Conteúdo sensível + %s deu boost + Mídia sensível Mídia oculta - Clique para exibir + Toque para ver Mostrar mais Mostrar menos Nada aqui. Arraste para atualizar! %s compartilhou o seu toot - %s curtiu o seu toot - %s seguiu você + %s favoritou seu toot + %s te seguiu Denunciar @%s Comentários adicionais? Resposta rápida Responder - Dar boost + Boost Desfazer boost Favoritar Desfavoritar @@ -101,7 +101,7 @@ Adicionar aba Links Menções - Mostrar compartilhamentos + Mostrar boosts Mostrar favoritos Menções Links @@ -170,7 +170,7 @@ Esconder compositor ao rolar a página Filtro da linha do tempo Abas - Mostrar compartilhamentos + Mostrar boosts Mostrar respostas Mostrar prévias de mídia Proxy @@ -178,7 +178,7 @@ Ativar proxy HTTP Servidor do proxy HTTP Porta do proxy HTTP - Privacidade padrão dos posts + Privacidade padrão dos toots Sempre marcar mídia como sensível Publicação Falha ao sincronizar configurações @@ -190,15 +190,15 @@ Médio Grande Maior - Novas Menções - Notificações sobre novas menções - Novos Seguidores - Notificações sobre novos seguidores + Menções + Notificar sobre novas menções + Seguidores + Notificar sobre novos seguidores Boosts Notificar quando derem boost nos seus toots Favoritos Notificar quando favoritarem seus toots - %s mencionou você + %s te mencionou %1$s, %2$s, %3$s e %4$d outros %1$s, %2$s, e %3$s %1$s e %2$s @@ -237,7 +237,7 @@ %dm %ds Segue você - Sempre mostrar conteúdo sensível + Sempre mostrar mídia sensível Mídia Respondendo a @%s carregar mais @@ -330,7 +330,7 @@ Adicionar conta à lista Remover conta da lista Descrever para deficientes visuais -\n(limite de %d caracteres) +\n(até %d caracteres) CC-BY 4.0 CC-BY-SA 4.0 As informações abaixo podem refletir incompletamente o perfil do usuário. Toque aqui para abrir o perfil completo no navegador. @@ -403,7 +403,7 @@ Encaminhar para %s Falha na denúncia Falha ao carregar toots - A denúncia será enviada para o seu administrador da instância. Você pode explicar por que você denunciou a conta: + A denúncia será enviada aos moderadores da instância. Você pode explicar por que você denunciou a conta: A conta está em outra instância. Enviar uma cópia anônima da denúncia para lá\? Instâncias bloqueadas Instâncias bloqueadas @@ -430,14 +430,14 @@ Múltiplas opções Opção %d Editar - Toots agendados + Agendados Editar - Toots agendados + Agendados Agendar toot Cancelar Erro ao pesquisar %s Salvos - Salvo + Salvar Salvos Desenvolvido por Tusky Salvo @@ -455,7 +455,7 @@ Bloquear @%s\? Silenciar @%s\? pedirem para me seguir - Notificações sobre seguidores pendentes + Notificar sobre seguidores pendentes %s pessoa %s pessoas From c65ad0d95d4aeb571066e682a38e1eda21994389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isak=20Holmstr=C3=B6m?= Date: Tue, 2 Jun 2020 00:51:39 +0000 Subject: [PATCH 08/41] Translated using Weblate (Swedish) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sv/ Translated using Weblate (Swedish) Currently translated at 99.7% (421 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sv/ --- app/src/main/res/values-sv/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index d5825561b..186470c2f 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -470,4 +470,6 @@ Blockera @%s\? Aktivera ljud på konversation %s vill följa dig + Lägg till hashtag + Hashtaggar \ No newline at end of file From 0871d79e366565e98d3672db7ba45206ad0a94e7 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Tue, 2 Jun 2020 00:51:39 +0000 Subject: [PATCH 09/41] Translated using Weblate (Persian) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fa/ --- app/src/main/res/values-fa/strings.xml | 31 ++++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 16b2bd305..b83e70382 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -119,13 +119,13 @@ سرایند یک نمونه چیست؟ در حال اتصال … - آدرس یا دامنه هر نمونه را می‌توانید وارد کنید، مثلا mastodon.social, icosahedron.website, social.tchncs.de, و <a href=\"https://instances.social\" >بیشتر! -\n -\n اگر شما هنوز حساب کاربری ندارید، می‌توانید نام نمونه مورد نظر را وارد کنید از اینجا بپیوندید و حساب کاربری ایجاد کنید. -\n -\n نمونه جایی است که حساب کاربری شما میزبان آن است اما شما به راحتی می‌توانید با افراد دیگر در نمونه‌های دیگر ارتباط برقرار کنید و آنها را دنبال کنید شما درست مثل اینکه در یکجا باشید. -\n -\n برای اطلاعات بیشتر به اینجا مراجعه کنید joinmastodon.org. + نشانی یا دامنهٔ هر نمونه‌ای می‌تواند وارد شود، مثل mastodon.social, icosahedron.website, social.tchncs.de, و بیش‌تر!. +\n +\n اگر هنوز حسابی ندارید، می‌توانید نام نمونه مورد نظر را وارد کرده و در آن حسابی بسازید. +\n +\n نمونه، جاییست که حسابتان رویش میزبانی می‌شود، ولی به راحتی می‌توانید با دیگر افراد روی نمونه‌های دیگر ارتباط داشته و دنبالشان کنید؛ انگار که روی یک پایگاه باشید. +\n +\nاطّلاعات بیش‌تر می‌تواند در joinmastodon.org پیدا شود. پایان بارگذاری رسانه در حال بارگذاری… بارگیری @@ -444,4 +444,21 @@ هیچ پیش‌نویسی ندارید. هیچ وضعیت زمان‌بسته‌ای ندارید. ماستودون، بازهٔ زمان‌بندی‌ای با کمینهٔ ۵ دقیقه دارد. + نمایش گفت‌وگوی تأیید پیش از تقویت + پیش‌نمایش پیوندها در خط‌زمانی‌ها + به کار انداختن اشارهٔ کشیدنی برای تعویض بین زبانه‌ها + + %s نفر + %s نفر + + هشتگ‌ها + افزودن هشتگ + آگاهی‌ها در مورد درخواست‌های پی‌گیری + درخواست‌های پی‌گیری + درخواست پی‌گیری + خموشی @%s؟ + انسداد @%s؟ + ناخموشی گفت‌وگو + خموشی گفت‌وگو + %s می‌خواهد دنبالتان کند \ No newline at end of file From 1b9029a9d6747cf254a9402e9ad3f5a37873c157 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Tue, 2 Jun 2020 00:51:39 +0000 Subject: [PATCH 10/41] Translated using Weblate (Kabyle) Currently translated at 58.0% (245 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/kab/ Translated using Weblate (Kabyle) Currently translated at 57.8% (244 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/kab/ Translated using Weblate (French) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fr/ Translated using Weblate (Arabic) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ar/ Translated using Weblate (Arabic) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ar/ --- app/src/main/res/values-ar/strings.xml | 4 +++- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-kab/strings.xml | 26 ++++++++++++++----------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 14b0c90f9..2878766d7 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -211,7 +211,7 @@ المفضلة الإشعار عندما يقوم أحدهم بإضافة تبويقاتك إلى مفضلاته %s أشار إليك - %1$s, %2$s, %3$s و %4$d أخرى + %1$s, %2$s, %3$s و %4$d آخرون %1$s, %2$s, و %3$s %1$s و %2$s %d تفاعلات جديدة @@ -492,4 +492,6 @@ ألغِ كتم المحادثة اكتم المحادثة %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 13f94a96a..475c37d42 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -369,7 +369,7 @@ Rédiger un pouet Écrire Afficher l\'indicateur de robots - "Nettoyer toutes les notifications de façon permanente\? " + Désirez-vous nettoyer toutes vos notifications de façon permanente \? Effacer et ré-écrire Effacer et ré-écrire ce pouet \? diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index caa3e7ebd..ee3d1ca03 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -9,8 +9,8 @@ Ẓreg amaɣnu Nadi Ɣef - Umuɣen - Umuɣen + Tabdart + Tabdarin Tijewwiqt-ik aṭas i ɣuzzifet! Agejdan Iccaren @@ -123,16 +123,16 @@ Bḍu aseɣwen ɣer tijewwiqt Rnu amsizdeg Ẓreg amsizdeg - Snulfu-d umuɣ - Snifel isem n wumuɣ - Kkes umuɣ-a - Ẓreg umuɣ-a - Rnu yiwen umiḍan ɣer wummuɣ - Kkes amiḍan seg wumuɣ + Snulfu-d tabdart + Snifel isem n tabdart + Kkes tabdart-a + Ẓreg tabdart-a + Rnu yiwen umiḍan ɣer tabdart + Kkes amiḍan seg tabdart Rnu isefka - Isem n wumuɣ + Isem n tebdart Fren tabdart - Umuɣ + Tabdart Sizdeg Imiḍanen Rnu yiwen wefran @@ -207,7 +207,7 @@ Tafrant %d Ig ṭafaṛ Imeḍfaṛen - Nadi ɣef medden i teṭafareḍ + Nadi ɣef medden ar at ḍfereḍ Imeḍfaṛen Iseɣwan Tibdarin @@ -263,4 +263,8 @@ Cekkel Kkes tacekkalt Tettwakkes tacekkalt ɣef umiḍan-nni + + %s n wemdan + %s n yemdanen + \ No newline at end of file From 8e14d155d8f31b43454f48eb4c9e99b9e911c308 Mon Sep 17 00:00:00 2001 From: retiolus Date: Tue, 2 Jun 2020 00:51:39 +0000 Subject: [PATCH 11/41] Translated using Weblate (Catalan) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ca/ --- app/src/main/res/values-ca/strings.xml | 33 +++++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index aa58dd911..203073ad8 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -4,16 +4,16 @@ Això no pot estar buit. El domini introduït no és vàlid L\'autenticació en aquesta instància ha fallat. - No s\'ha trobat cap navegador web per a usar. + No s\'ha trobat cap navegador web per a utilitzar. S\'ha produït un error d\'autorització no identificat. S\'ha denegat l\'autorització. - L\'obtenció del testimoni d\'inici de sessió ha fallat. + L\'obtenció del token d\'inici de sessió ha fallat. L\'estat és massa llarg! El fitxer ha de ser inferior a 8MB. Aquest tipus de fitxer no es pot pujar. Aquest tipus de fitxer no es pot obrir. Cal permís d\'accés al emmagatzematge. - Cal permís d\'escriptura en el mitjà. + Cal permís d\'escriptura en el dispositiu. No es poden adjuntar imatges i vídeos en el mateix estat. La pujada ha fallat. Inici @@ -202,15 +202,15 @@ Missatges directes No hi ha res aquí. Elimina l\'impuls - S\'ha produït un error de connexió! Comprova la connexió! - Els fitxers de vídeo han de tenir menys de 40 MB. + S\'ha produït un error de connexió! Comprova la connexió i torna-ho a provar! + Els fitxers de vídeo han de pesar menys de 40 MB. Multimèdia amagada Amaga Estàs segur de tancar la sessió de %1$s\? Amaga els impulsos Mostra els impulsos Elimina i reecririu - Open drawer + Calaix obert Visibilitat del toot Contingut sensible Afegeix una pestanya @@ -226,7 +226,7 @@ Compartir la imatge a … Enviat! Petició de seguiment enviada - Amb resposta + Amb respostes Teclat d\'emojis Obrir el media #%d Obrir com %s @@ -351,7 +351,6 @@ Seguidors Directe Nom de la llista - Hashtag sense # Netejar Filtrar @@ -445,8 +444,24 @@ S\'ha produït un error en cercar la publicació %s Mostra degradats de colors per a contingut multimèdia ocult No tens cap estat planificat. - Els fitxers d\'àudio han de ser més petits de 40MB. + Els fitxers d\'àudio han de ser més petits que 40MB. No tens cap esborrany. L\'interval mínim de planificació a Mastodon és de 5 minuts. Peticions de seguiment + Mostra el diàleg de confirmació abans de promoure + Mostra les previsualitzacions dels enllaços en els fils + Habilita el gest de desplaçament per despleçar-te entre pestanyes + + %s persona + %s persones + + Hashtags + Afegir hashtag + Notificacions sobre sol·licituds de seguiment + sol·licitació de seguiment + Silenciar @%s\? + Bloquejar @%s\? + No silenciar la conversació + Conversació muda + %s ha sol·licitat seguir-te \ No newline at end of file From a2c9ec4d3c32ef893eceb7b2a809af0b9afacdae Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Tue, 2 Jun 2020 00:51:39 +0000 Subject: [PATCH 12/41] Translated using Weblate (Ukrainian) Currently translated at 25.8% (109 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/uk/ --- app/src/main/res/values-uk/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8e47e2087..eb1b9ed1f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -108,4 +108,6 @@ Попередження про контент Змінити Написати + Скасувати приглушення бесіди + Приглушити бесіду \ No newline at end of file From 5e28e73859691cce72bd1262e1106e59a26bd758 Mon Sep 17 00:00:00 2001 From: wobl42 Date: Tue, 2 Jun 2020 00:51:40 +0000 Subject: [PATCH 13/41] Translated using Weblate (German) Currently translated at 96.4% (407 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/de/ --- app/src/main/res/values-de/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8d8ea3214..b25ca35cf 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -330,9 +330,7 @@ Suche nach Leuten denen du folgst Von der Liste entfernen Hashtag ohne # - Öffne Autor des geteilten Beitrages - Öffentliche Zeitleisten <b>%1$s</b> Favorit @@ -433,8 +431,8 @@ Bunten Farbverlauf für versteckte Medien anzeigen Powered by Tusky - - + + Als Lesezeichen gespeichert Liste auswählen @@ -451,4 +449,6 @@ Stummschaltung der Konversation aufheben Konversation stummschalten "%s möchte dir folgen" + Hashtags + Hashtag hinzufügen \ No newline at end of file From e63ec2fcfa8120e3267cf5fb8b121d5c28240d3c Mon Sep 17 00:00:00 2001 From: nailyk Date: Tue, 2 Jun 2020 00:51:40 +0000 Subject: [PATCH 14/41] Added translation using Weblate (Thai) --- app/src/main/res/values-th/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-th/strings.xml diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-th/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 263b747620817e82b79a30b2569c62731f8e100f Mon Sep 17 00:00:00 2001 From: PananP Date: Tue, 2 Jun 2020 00:51:40 +0000 Subject: [PATCH 15/41] Translated using Weblate (Thai) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/th/ Translated using Weblate (Thai) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/th/ Translated using Weblate (Thai) Currently translated at 98.1% (414 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/th/ Translated using Weblate (Thai) Currently translated at 98.1% (414 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/th/ --- app/src/main/res/values-th/strings.xml | 457 ++++++++++++++++++++++++- 1 file changed, 456 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index a6b3daec9..9fdd7f355 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -1,2 +1,457 @@ - \ No newline at end of file + + เพิ่มตัวเลือก + 7 วัน + 3 วัน + 1 วัน + 6 ชั่วโมง + 1 ชั่วโมง + 30 นาที + 5 นาที + โพล + เปิดใช้งานการเลื่อนนิ้วเพื่อสลับระหว่างแท็บ + แสดงตัวกรองการแจ้งเตือน + ค้นหาล้มเหลว + บัญชี + บัญชีนี้มาจากเซิร์ฟเวอร์อื่น ส่งสำเนารายงานที่ไม่ระบุชื่อไปที่นั่นด้วยหรือไม่\? + รายงานจะถูกส่งไปยังผู้ดูแลเซิร์ฟเวอร์ของคุณ สามารถให้คำอธิบายว่าทำไมจึงรายงานบัญชีนี้ด้านล่าง: + ดึงข้อมูลสถานะล้มเหลว + รายงานล้มเหลว + ส่งต่อไปยัง %s + ความคิดเห็นเพิ่มเติม + รายงาน @%s เรียบร้อยแล้ว + ทำ + ย้อนกลับ + ต่อไป + + %d วินาที + + + %d นาที + + + %d ชั่วโมง + + + %d วัน + + โพลที่คุณสร้างสิ้นสุดลงแล้ว + โพลที่คุณโหวตสิ้นสุดลงแล้ว + โหวต + สิ้นสุดแล้ว + จบที่ %s + เหลืออีก %s + + %s คน + + + %s โหวต + + " <!-- 15 votes • 1 hour left --> %1$s • %2$s" + %1$s • %2$s + การกระทำสำหรับภาพ %s + ต้องการลบการแจ้งเตือนทั้งหมดอย่างสมบูรณ์\? + เขียน + เขียน Toot + ใช้งาน + คัดกรอง + ล้างการแจ้งเตือน + รายการ + เลือกรายการ + แฮชแท็ก + แฮชแท็กโดยไม่มี # + เพิ่มแฮชแท็ก + ชื่อรายการ + โพลกับตัวเลือก: %1$s, %2$s, %3$s, %4$s; %5$s + ไดเร็กต์ + ผู้ติดตาม + ไม่อยู่ในรายการ + สาธารณะ + คั่นหน้า + ชื่นชอบ + ได้ถูกเขียนใหม่ + ไม่มีคำอธิบาย + เตือนเนื้อหา : %s + สื่อ: %s + ถึงจำนวนแท็บสูงสุดคือ %1$d แล้ว + %1$s, %2$s และอีก %3$d + %1$s และ %2$s + %1$s + ชื่นชอบโดย + บูสต์โดย + + <b>%1$s</b> บูสต์ + + + <b>%1$s</b> ชื่นชอบ + + ปักหมุด + เลิกปักหมุด + ข้อมูลต่อไปนี้อาจไม่ถูกต้อง แตะเพื่อเปิดโปรไฟล์ในเบราว์เซอร์ + แสดงเวลาแบบเที่ยงตรง + เนื้อหา + ป้าย + เพิ่มข้อมูล + ข้อมูลอภิพันธุ์ + CC-BY-SA 4.0 + CC-BY 4.0 + ภายใต้สัญญาอนุญาต Apache License (คัดลอกด้านล่าง) + Tusky มีโค้ดและสินทรัพย์จากโครงการโอเพนซอร์สต่อไปนี้: + ยกเลิกบูสต์ + บูสต์โพสต์ต้นฉบับ + %1$s ได้ย้ายไปที่ : + บอต + ดาวน์โหลดล้มเหลว + ชุดเอโมจิปัจจุบันจากกูเกิล + ชุดเอโมจิจาก Mastodon + ที่รู้จักจาก Android 4.4 ถึง 7.1 ชุดเอโมจิ Blob + ชุดเริ่มต้นในอุปกรณ์คุณ + เริ่มใหม่ + ภายหลัง + จำเป็นต้องเริ่ม Tusky ใหม่ เพื่อใช้การเปลี่ยนแปลงเหล่านี้ + จำเป็นต้องเริ่มแอปใหม่ + เปิด Toot + ขยาย/ย่อทั้งหมด + กำลังค้นหา… + ต้องดาวน์โหลดชุดเอโมจิเหล่านี้ก่อน + ค่าปริยายของระบบ + รูปแบบเอโมจิ + คัดลอกไปยังคลิบบอร์ดแล้ว + Instance %s ไม่มีเอโมจิแบบกำหนดเอง + เขียน + สำเนา Toot บันทึกเป็นฉบับร่างแล้ว + การส่งถูกยกเลิก + ส่ง Toot + การส่ง Toot เกิดข้อผิดผลาด + กำลังส่ง Toot… + บันทึกฉบับร่าง\? + ต้องอนุมัติผู้ติดตามด้วยตัวเอง + ล็อกบัญชี + ลบ + ตั้งคำอธิบายล้มเหลว + ตั้งคำอธิบาย + อธิบายเพื่อผู้บกพร่องทางสายตา +\n(จำกัด %d ตัวอักขระ) + โพสต์ด้วยบัญชี %1$s + ลบบัญชีออกจากรายการ + เพิ่มบัญชีไปใส่รายการ + ค้นหาผู้ติดตาม + แก้ไขรายการ + ลบรายการ + เปลี่ยนชื่อรายการ + สร้างรายการ + ไม่สามารถลบรายการได้ + ไม่สามารถเปลี่ยนชื่อรายการได้ + ไม่สามารถสร้างรายการได้ + ไทม์ไลน์ในรายการ + เพิ่มบัญชี Mastodon ใหม่ + เพิ่มบัญชี + วลีที่ต้องการกรอง + ถ้าคำหลักหรือวลีเป็นอักษรผสมตัวเลข จะใช้ได้ผลเมื่อตรงทั้งคำเท่านั้น + ทั้งคำ + อัปเดต + ลบ + แก้ไขตัวคัดกรอง + เพิ่มตัวคัดกรอง + การสนทนา + ไทม์ไลน์สาธารณะ + โหลดเพิ่ม + ตอบกลับไป @%s + สื่อ + ขยาย Toot ที่มีเครื่องหมายเนื้อหาอ่อนไหวเสมอ + แสดงเนื้อหาอ่อนไหวเสมอ + กำลังติดตามคุณ + %d วินาทีที่แล้ว + %d นาทีที่แล้ว + %d ชั่วโมงที่แล้ว + %d วันที่แล้ว + %d ปีที่แล้ว + ใน %d วินาที + ใน %d นาที + ใน %d ชั่วโมง + ใน %d วัน + ใน %d ปี + กำลังขอติดตาม + วิดีทัศน์ + ภาพ + แบ่งปันลิงก์ Toot + แบ่งปันเนื้อหา Toot + บัญชีทางการของ Tusky + รายงานช่องโหว่ และ ขอฟีเจอร์ (ภาษาอังกฤษ): +\nhttps://github.com/tuskyapp/Tusky/issues + เว็บไซต์โปรเจกต์: +\nhttps://tusky.app + Tusky คือซอฟต์แวร์เสรีและโอเพนซอร์ส <!-- --> ภายใต้สัญญาอนุญาต GNU General Public License Version 3 <!-- -->ดูสัญญาที่ : https://www.gnu.org/licenses/gpl-3.0.ja.html + ขับเคลื่อนด้วย Tusky + Tusky %s + บัญชีไม่สาธารณะ + การโต้ตอบใหม่จำนวน %d + %1$s และ %2$s + %1$s, %2$s, และ %3$s + %1$s, %2$s, %3$s และอีก %4$d คน + %s ตอบกลับคุณ + การแจ้งเตือนเมื่อโพลได้สิ้นสุดลงแล้ว + โพล + การแจ้งเตือนเมื่อ Toot คุณถูกชื่นชอบ + ชื่นชอบ + การแจ้งเตือนเมื่อ Toot คุณถูกบูสต์ + บูสต์ + การแจ้งเตือนคำขอติดตามใหม่ + คำขอติดตาม + การแจ้งเตือนเกี่ยวกับผู้ติดตามใหม่ + ผู้ติดตามใหม่ + การกล่าวถึงใหม่ + การแจ้งเตือนเกี่ยวกับการกล่าวถึงใหม่ + ใหญ่มาก + ใหญ่ + กลาง + เล็ก + เล็กสุด + ขนาดอักษร Toot + เฉพาะผู้ติดตาม + ไม่อยู่ในรายการ + สาธารณะ + ซิงค์การตั้งค่าล้มเหลว + กำลังเผยแพร่ (synced with server) + ใส่เครื่องหมายว่าเป็นสื่ออ่อนไหวเสมอ + ความเป็นส่วนตัวโพสต์ปริยาย + พอร์ตพร็อกซี่ HTTP + เซิร์ฟเวอร์พร็อกซี่ HTTP + เปิดใช้งานพร็อกซี่ HTTP + พร็อกซี่ HTTP + พร็อกซี่ + ดาวน์โหลดตัวอย่างสื่อ + แสดงการตอบกลับ + แสดงบูสต์ + แท็บ + คัดกรองไทม์ไลน์ + แสดงสื่อที่ซ่อนไว้แบบไล่หลากสี + อวตาร GIF เคลื่อนไหวได้ + แสดงสัญลักษณ์ว่าเป็นบอต + ภาษา + ซ่อนปุ่มเขียนเมื่อกำลังเลื่อนจอ + ใช้ Chrome Custom Tabs + เบราว์เซอร์ + ใช้ตามแบบระบบ + ปรับตามเวลา + ดำ + สว่าง + มืด + คัดกรอง + ไทม์ไลน์ + ธีมแอป + ลักษณะ + โพลสิ้นสุดแล้ว + โพสต์ถูกชื่นชอบ + โพสต์ถูกบูสต์ + คำขอติดตาม + ติดตาม + กล่าวถึง + แจ้งฉันเมื่อ + แจ้งด้วยเสียง + แจ้งด้วยการสั่น + แจ้งด้วยแสง + เตือน + การแจ้งเตือนแบบ Push + ตั้งค่าการแจ้งเตือน + ไดเร็กต์:โพสต์ให้เฉพาะผู้ที่ถูกกล่าวถึงเห็น + เฉพาะผู้ติดตาม:โพสต์ให้เฉพาะผู้ติดตามเห็น + ไม่อยู่ในรายการ:ไม่แสดงในไทม์ไลน์สาธารณะ + สาธารณะ:โพสต์ในไทม์ไลน์สาธารณะ + ปิดเสียง @%s\? + บล็อก @%s\? + ซ่อนทั้งโดเมน + ต้องการบล็อกทุกอย่างจาก %s \? คุณจะไม่เห็นเนื้อหาจากโดเมนนั้นในไทม์ไลน์สาธารณะหรือในการแจ้งเตือน ผู้ติดตามของคุณจากโดเมนนั้นจะถูกลบออก + ลบ แล้ว ร่าง Toot นี้ใหม่\? + ลบ Toot นี้\? + เลิกติดตามผู้ใช้นี้\? + ยกเลิกคำขอติดตาม\? + ดาวน์โหลด + กำลังอัปโหลด… + กำลังอัปโหลดสื่อใกล้เสร็จ + "ใส่ที่อยู่หรือโดเมนของ Instance ได้ที่นี่ เช่น mastodon.social icosahedron.website social.tchncs.de และ <a href=\"https://instances.social\">อีกมากมาย!</a> +\n +\nถ้ายังไม่มีบัญชี สามารถใส่ชื่อ Instance ที่ต้องการจะร่วมแล้วสร้างบัญชีที่นั่น +\n +\nInstance คือที่ที่หนึ่งไว้โฮสต์บัญชีคุณ แต่คุณยังสามารถสื่อสาร ติดตามบุคคลบน Instance อื่นได้เหมือนอยู่บนไซต์เดียวกัน +\n +\nพบข้อมูลเพิ่มเติมได้ที่ <a href=\"https://joinmastodon.org\">joinmastodon.org</a> "more! + \n\nIf you don\'t yet have an account, you can enter the name of the instance you\'d like to + join and create an account there.\n\nAn instance is a single place where your account is + hosted, but you can easily communicate with and follow folks on other instances as though + you were on the same site. + \n\nMore info can be found at joinmastodon.org. + + ภาพหัวบน + กำลังเชื่อมต่อ… + อวตาร + ตอบกลับ… + ไม่มีผลลัพธ์ + ค้นหา… + ข้อมูลส่วนตัว + ชื่อที่ใช้แสดง + คำเตือนเนื้อหา + เกิดอะไรขึ้นเอย\? + Instance ไหน\? + ตอบกลับสำเร็จ + ส่งแล้ว! + เลิกซ่อน %s แล้ว + เลิกบล็อกผู้ใช้แล้ว + เลิกปิดเสียงผู้ใช้นี้แล้ว + ส่งแล้ว! + แบ่งปันสื่อไป… + แบ่งปัน Toot ไป… + แชร์ URL Toot ไป… + กำลังดาวน์โหลดสื่อ + ดาวน์โหลดสื่อ + แบ่งปันโดย… + เปิดเป็น %s + คัดลอกลิงก์ + กำลังดาวน์โหลด %1$s + เปิดสื่อ #%d + ลิงก์ + โต้ตอบ + แฮชแท็ก + ดูชื่นชอบ + ดูบสต์ + ดูต้นตอบูสต์ + แฮชแท็ก + โต้ตอบ + ลิงก์ + เพิ่มแท็บ + Toot แบบตั้งเวลา + คีย์บอร์ดเอโมจิ + เตือนเนื้อหา + การมองเห็น Toot + Toot แบบตั้งเวลา + ฉบับร่าง + ปฏิเสธ + ยอมรับ + ย้อนการกระทำ + แก้ไข + บันทึก + เปิดเมนู + ซ่อนสื่อ + กล่าวถึง + เลิกปิดเสียงการสนทนา + ปิดเสียงการสนทนานี้ + ปิดเสียง %s + เลิกปิดเสียง + ปิดเสียง + แบ่งปัน + ถ่ายภาพ + เพิ่มโพล + เพิ่มสื่อ + เปิดในเบราว์เซอร์ + สื่อ + คำขอติดตาม + โดเมนที่ซ่อนไว้ + ผู้ใช้ที่ถูกบล็อกไว้ + ผู้ใช้ที่ปิดเสียงไว้ + คั่นหน้า + ชื่นชอบ + โปรไฟล์ + ปิด + ลองอีกครั้ง + TOOT! + TOOT + ลบ แล้ว ร่างใหม่ + ลบ + แก้ไข + รายงาน + แสดงบูสต์ + ซ่อนบูสต์ + เลิกบล็อก + บล็อก + เลิกติดตาม + ติดตาม + ต้องการออกจากระบบของบัญชี %1$s \? + เขียนโพสต์ใหม่ + อื่น ๆ + เลิกชื่นชอบ + คั่นหน้า + ชื่นชอบ + ลบบูสต์ + บูสต์ + ตอบกลับ + ตอบกลับด่วน + ความคิดเห็นเพิ่มเติม\? + รายงาน @%s + %s ต้องการติดตามคุณ + %s ได้ติดตามคุณ + %s ได้ชื่นชอบ Toot คุณ + %s ได้บูสต์ Toot คุณ + ไม่อะไรเลย ลากลงเพื่อรีเฟรช! + ไม่มีอะไร + ย่อ + ขยาย + แสดงน้อยลง + แสดงเพิ่มเติม + แตะเพื่อดู + สื่อที่ซ่อนไว้ + เนื้อหาอ่อนไหว + %s ได้บูสต์ + \@%s + สัญญาอนุญาต + Toot แบบกำหนดเวลา + แก้ไขโปรไฟล์ + คำขอติดตาม + โดเมนที่ซ่อนไว้ + ผู้ใช้ที่ถูกบล็อก + ผู้ใช้ที่ทำให้เป็นใบ้ + คั่นหน้า + ผู้ติดตาม + ติดตาม + ปักหมุด + โพสต์และตอบกลับ + โพสต์ + เธรด + แท็บ + ข้อความแบบไดเร็กต์ + สหพันธ์ + ท้องถิ่น + แจ้งเตือน + หน้าหลัก + การส่ง Toot เกิดความผิดพลาด + อัปโหลดล้มเหลว + ไม่สามารถแนบรูปภาพและวิดีทัศน์ในโพสต์เดียวกันได้ + ต้องมีสิทธิ์เขียนบนสื่อ + ต้องมีสิทธิ์อ่านสื่อ + ไม่สามารถเปิดไฟล์ได้ + ไม่สามารถอัปโหลดไฟล์ประเภทนี้ได้ + ไฟล์เสียงต้องมีขนาดน้อยกว่า 40MB + ไฟล์วีดิทัศน์ต้องมีขนาดน้อยกว่า 40MB + ไฟล์ต้องมีขนาดน้อยกว่า 8MB + ข้อความสถานะยาวเกินไป! + ไม่สามารถรับโทเค็นการเข้าสู่ระบบ + การขออนุญาตสิทธิถูกปฏิเสธ + เกิดข้อผิดพลาดในการขออนุญาตสิทธิโดยไม่ทราบสาเหตุ + ไม่พบเว็บเบราว์เซอร์ + โดเมนที่ป้อนไม่ถูกต้อง + ไม่สามารถโพสต์โดยไร้ข้อความได้ + เครือข่ายมีข้อผิดพลาดเกิดขึ้น! กรุณาตรวจสอบการเชื่อมต่อและลองอีกครั้ง! + เกิดข้อผิดพลาด + รายการ + รายการ + เกี่ยวกับแอปนี้ + ล้างค่า + ค้นหา + แก้ไขโปรไฟล์ + ตั้งค่าบัญชี + ตั้งค่า + ออกจากระบบ + ฉบับร่าง + ชื่นชอบ + การยืนยันตัวตนทางอิเล็กทรอนิกส์กับ Instance นั้นล้มเหลว + Instance คือ\? + เข้าสู่ระบบด้วย Mastodon + เลือกได้หลายตัวเลือก + แสดงข้อความยืนยันก่อนที่จะบูสต์ + แสดงตัวอย่างลิงก์ในไทม์ไลน์ + Mastodon กำหนดเวลาขั้นต่ำ 5 นาที + ไม่มีสถานะแบบตั้งเวลาใด ๆ + ไม่มีฉบับร่างใด ๆ + การค้นหาโพสต์ %s เกิดข้อผิดผลาด + แก้ไข + ตัวเลือกที่ %d + \ No newline at end of file From 3fe17b92335124ab76f0d5ab37a6eba0ddfef776 Mon Sep 17 00:00:00 2001 From: unweek Date: Tue, 2 Jun 2020 00:51:40 +0000 Subject: [PATCH 16/41] Translated using Weblate (Polish) Currently translated at 98.3% (415 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ --- app/src/main/res/values-pl/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 609e3c605..105a70748 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,7 +1,7 @@ Wystąpił błąd. - To nie może pozostać puste. + To pole nie może być puste. Wprowadzono nieprawidłową domenę Nie udało się uwierzytelnić z tą instancją. Nie znaleziono przeglądarki internetowej. @@ -457,4 +457,10 @@ Nie masz żadnych zaplanowanych wpisów. Mastodon umożliwia wysłanie minimalnie 5 minut od zaplanowania Prośby o możliwość śledzenia + Pytaj o potwierdzenie przed podbiciem + Dodaj hashtag + Wyciszyć @%s\? + Zablokować @%s\? + Cofnij wyciszenie rozmowy + Wycisz rozmowę \ No newline at end of file From 51f066b642d529c57042652fe0b3a09ca12add83 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Sun, 17 May 2020 18:08:12 +0000 Subject: [PATCH 17/41] Translated using Weblate (Slovenian) Currently translated at 22.2% (2 of 9 strings) Translation: Tusky/Tusky-app Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/sl/ --- fastlane/metadata/android/sl/short_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. From d208d2c3d87d69ba726d05054bb2d89891a85c16 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Mon, 18 May 2020 23:01:57 +0000 Subject: [PATCH 18/41] Translated using Weblate (Persian) Currently translated at 100.0% (9 of 9 strings) Translation: Tusky/Tusky-app Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/fa/ --- fastlane/metadata/android/fa/changelogs/58.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/fastlane/metadata/android/fa/changelogs/58.txt b/fastlane/metadata/android/fa/changelogs/58.txt index 60e3f3a2d..74993285c 100644 --- a/fastlane/metadata/android/fa/changelogs/58.txt +++ b/fastlane/metadata/android/fa/changelogs/58.txt @@ -8,4 +8,3 @@ - سبک جدید «پیروی از سبک سیستم» در تنظیمات - بهبود دسترس‌پذییری خط‌زمانی - تاسکی اکنون اعلان‌های ناشناس را نادیده می‌گید و دیگر فرونمی‌پاشد -- From aa69089dc875dadacf135684450686b5e57cf081 Mon Sep 17 00:00:00 2001 From: retiolus Date: Tue, 19 May 2020 21:16:06 +0000 Subject: [PATCH 19/41] Translated using Weblate (Catalan) Currently translated at 100.0% (9 of 9 strings) Translation: Tusky/Tusky-app Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/ca/ --- fastlane/metadata/android/ca/changelogs/72.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 fastlane/metadata/android/ca/changelogs/72.txt diff --git a/fastlane/metadata/android/ca/changelogs/72.txt b/fastlane/metadata/android/ca/changelogs/72.txt new file mode 100644 index 000000000..694f8b70d --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/72.txt @@ -0,0 +1,10 @@ +Tusky v11.0 + +- Notificacions sobre les noves sol·licituds de seguiment quan el compte està bloquejat +- Noves funcions que es poden commutar a la pantalla de preferències: + - desactivar el desplaçament entre pestanyes + - mostrar un diàleg de confirmació abans d'incorporar un toot + - mostrar les previsualitzacions d'enllaços en els terminis +- Ara es poden silenciar les converses +- Els resultats de les enquestes ara es calcularan en funció del nombre de votants i no del nombre de vots +- .. From 0d337e890847cd9882be402b1061feb7ca0b1a4c Mon Sep 17 00:00:00 2001 From: PananP Date: Mon, 25 May 2020 17:56:51 +0000 Subject: [PATCH 20/41] Translated using Weblate (Thai) Currently translated at 44.4% (4 of 9 strings) Translation: Tusky/Tusky-app Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/th/ --- fastlane/metadata/android/th/changelogs/72.txt | 11 +++++++++++ fastlane/metadata/android/th/full_description.txt | 12 ++++++++++++ fastlane/metadata/android/th/short_description.txt | 1 + fastlane/metadata/android/th/title.txt | 1 + 4 files changed, 25 insertions(+) create mode 100644 fastlane/metadata/android/th/changelogs/72.txt create mode 100644 fastlane/metadata/android/th/full_description.txt create mode 100644 fastlane/metadata/android/th/short_description.txt create mode 100644 fastlane/metadata/android/th/title.txt diff --git a/fastlane/metadata/android/th/changelogs/72.txt b/fastlane/metadata/android/th/changelogs/72.txt new file mode 100644 index 000000000..f9cbe07e4 --- /dev/null +++ b/fastlane/metadata/android/th/changelogs/72.txt @@ -0,0 +1,11 @@ +Tusky v11.0 + +- การแจ้งเตือนเกี่ยวกับคำขอติดตามใหม่หากบัญชีของคุณไม่เป็นสาธารณะ(ล็อก) +- คุณสมบัติใหม่ที่สามารถ toggled ได้ในหน้าจอการตั้งค่า: + - ปิดการใช้งานการปัดระหว่างแท็บ + - แสดงข้อความยืนยันก่อนที่จะบูสต์ Toot + - แสดงตัวอย่างลิงก์ในไทม์ไลน์ +- สามารถปิดเสียงการสนทนาได้ในขณะนี้ (ไม่สนใจการส) +- ผลลัพธ์โพลจะคำนวณตามจำนวนผู้โหวตและไม่ได้อยู่ในคะแนนรวม ทำให้โพลหลายตัวเลือกง่ายต่อการเข้าใจ +- แก้ไขบั๊กจำนวนมาก ส่วนใหญ่เกี่ยวข้องกับการเขียน Toot +- ปรับปรุงการแปล diff --git a/fastlane/metadata/android/th/full_description.txt b/fastlane/metadata/android/th/full_description.txt new file mode 100644 index 000000000..f4d1e2fca --- /dev/null +++ b/fastlane/metadata/android/th/full_description.txt @@ -0,0 +1,12 @@ +Tusky เป็นไคลเอ็นต์ที่มีน้ำหนักเบาสำหรับ Mastodon ซึ่งเป็นเซิร์ฟเวอร์เครือข่ายโซเชียลที่ฟรีและโอเพนซอร์ส + +• Material Design +• Most Mastodon APIs implemented +• รองรับการใช้งานแบบหลายบัญชี +• ชุดรูปแบบมืดและสว่าง สามารถสลับอัตโนมัติตามเวลาของวัน +• แบบร่าง - เขียน Toot และบันทึกไว้เพื่อใช้ในภายหลัง +• เลือกรูปแบบเอโมจิที่แตกต่างกันได้ +• ปรับให้เหมาะสมสำหรับทุกขนาดหน้าจอ +• โอเพ่นซอร์สสมบูรณ์ - ไม่มีการขึ้นต่อกันอย่างไม่อิสระ เช่น บริการ Google ฯลฯ + +หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Mastodon โปรดเยี่ยมชมที่ https://joinmastodon.org/ diff --git a/fastlane/metadata/android/th/short_description.txt b/fastlane/metadata/android/th/short_description.txt new file mode 100644 index 000000000..8d8a359a9 --- /dev/null +++ b/fastlane/metadata/android/th/short_description.txt @@ -0,0 +1 @@ +ไคลเอ็นต์แบบหลายบัญชีสำหรับเครือข่ายสังคม Mastodon diff --git a/fastlane/metadata/android/th/title.txt b/fastlane/metadata/android/th/title.txt new file mode 100644 index 000000000..0238ffc0a --- /dev/null +++ b/fastlane/metadata/android/th/title.txt @@ -0,0 +1 @@ +Tusky From cf77f87f1ef070d5b3808bbf311a1bb38d0083d5 Mon Sep 17 00:00:00 2001 From: unweek Date: Sun, 31 May 2020 07:53:05 +0000 Subject: [PATCH 21/41] Translated using Weblate (Polish) Currently translated at 100.0% (9 of 9 strings) Translation: Tusky/Tusky-app Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/pl/ --- fastlane/metadata/android/pl/changelogs/72.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 fastlane/metadata/android/pl/changelogs/72.txt diff --git a/fastlane/metadata/android/pl/changelogs/72.txt b/fastlane/metadata/android/pl/changelogs/72.txt new file mode 100644 index 000000000..9faee2f38 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/72.txt @@ -0,0 +1,11 @@ +Tusky v11.0 + +- Powiadomienia o nowych prośbach o obserwowanie kiedy Twoje konto jest zablokowane +- Nowe funkcje, które mogą być zmienione w ekranie Ustawień: + - wyłącz przesuwanie pomiędzy kartami + - pokaż potwierdzenie przed podbiciem + - pokaż podgląd linku na osi czasu +- Rozmowy mogą być teraz wyciszone +- Wyniki ankiet są teraz przeliczane na podstawie liczby głosujących, a nie łącznej liczbie wszystkich głosów +- Dużo poprawek błędów, większość z nich dotyczy wpisów +- Poprawiono tłumaczenia From a74c16aed13c86904127329ac0bca68ccb904314 Mon Sep 17 00:00:00 2001 From: zital Date: Thu, 4 Jun 2020 06:38:09 +0000 Subject: [PATCH 22/41] Translated using Weblate (Basque) Currently translated at 98.1% (414 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/eu/ --- app/src/main/res/values-eu/strings.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 492546b04..96cd2a73a 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -388,7 +388,7 @@ %s amaitzen da itxita - Botatu + Bozkatu Botoa eman duzun galdeketa amaitu da Sortu duzun galdeketa amaitu da @@ -448,4 +448,9 @@ Ez duzu tut programaturik. Mastodonek gutxienez 5 minutuko programazio-tartea du. Eskariak + Jarraitzeko eskaereri buruzko jakinarazpenak + \@%s isildu\? + \@%s blokeatu\? + Elkarrizketa isildu + %s -k zu jarraitzeko eskatu dizu \ No newline at end of file From 61279d2f5b797ca28b215b7e5feed4a933d9de1c Mon Sep 17 00:00:00 2001 From: Juanjo Salvador Date: Thu, 4 Jun 2020 06:38:09 +0000 Subject: [PATCH 23/41] Translated using Weblate (Spanish) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/es/ --- app/src/main/res/values-es/strings.xml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ff7b39832..18c62c47d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -158,7 +158,7 @@ me siguen mis posts son impulsados me dan favorito - Interfaz + Apariencia Tema Cronologia Oscuro @@ -456,4 +456,15 @@ Silenciar conversación Dejar de silenciar conversación Notificaciones de solicitudes + solicitud de seguimiento + Mostrar diálogo de confirmación antes de impulsar + Mostrar previsualización de enlaces en la cronología + Habilitar gesto de deslizar para alternar entre pestañas + + %s persona + %s personas + + Etiquetas + Añadir etiqueta + %s solicita seguirte \ No newline at end of file From 408f916cb12f18bfcfd85c7e82c7c09dcd84330c Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 4 Jun 2020 20:13:06 +0200 Subject: [PATCH 24/41] cleanup bad string translations (#1820) * cleanup bad string translations * remove empty plural in German translation --- app/src/main/res/values-bn-rIN/strings.xml | 23 ++-------------------- app/src/main/res/values-de/strings.xml | 5 +---- app/src/main/res/values-is/strings.xml | 9 +-------- app/src/main/res/values-no-rNB/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 8 +------- app/src/main/res/values-zh-rCN/strings.xml | 3 --- 6 files changed, 5 insertions(+), 44 deletions(-) diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index e9dd016a5..da32e0d88 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -366,33 +366,14 @@ আপনি কি আপনার সমস্ত বিজ্ঞপ্তি স্থায়ীভাবে মুছে ফেলতে চান\? ছবি %s এর জন্য ক্রিয়া %1$s • %2$s - - - - + %s বাকি %s এ শেষ হবে বন্ধ ভোট আপনি ভোট দিয়েছেন যে নির্বাচন এ সেটি শেষ হয়েছে আপনি তৈরি একটি নির্বাচন শেষ হয়েছে - - - - - - - - - - - - - - - - - + চালিয়ে যান পিছনে যান সম্পন্ন diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b25ca35cf..14dbf31fa 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -430,10 +430,7 @@ Lesezeichen Bunten Farbverlauf für versteckte Medien anzeigen Powered by Tusky - - - - + Als Lesezeichen gespeichert Liste auswählen Liste diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index adfa36311..3b6028509 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -345,14 +345,7 @@ Ekki er víst að upplýsingarnar hér að neðan endurspegli notandasniðið að fullu. Opnaðu fullt notandasnið í vafra. Losa Festa - - - - - - - - + Endurbirt af Sett í eftirlæti af %1$s diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index a8c48ae84..86fa89451 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -452,7 +452,6 @@ Blokkere @%s\? Fjern demping av samtale Demp samtale - % ba om å få følge deg Stikkord Legg til stikkord \ No newline at end of file diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index b9aa26b01..1ce89d8d1 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -37,7 +37,6 @@ Osnutki Licence \@%s - % spodbudil Občutljiva vsebina Medij je skrit Kliknite za ogled @@ -304,12 +303,7 @@ Spodnje informacije lahko nepopolno odražajo profil uporabnika. Pritisnite, da odprete polni profil v brskalniku. Odpni Pripni - - - - - - + <b>%s</b> Spodbuda <b>%s</b> Spodbudi diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6f61369e3..269225385 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -413,11 +413,9 @@ 书签 隐藏域名 新增意见调查 - 隐藏 定时嘟文 定时嘟文 %s 已解除静音 - 您确定要封锁 %s 域名吗?您将不会在任何联邦时间轴或通知中看到该域名中的内容,并且来自该域名的关注者将被删除。 隐藏整个域 动画GIF头像 显示隐藏媒体的彩色渐变 @@ -430,7 +428,6 @@ 使用以下选项创建投票:%1$s, %2$s, %3$s, %4$s; %5$s 选择清单 清单 - 图片 %s 的动作 继续 返回 完成 From df5490b5b97c12fcf4d96a79d488fe0495e0d393 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 4 Jun 2020 20:16:48 +0200 Subject: [PATCH 25/41] upgrade gradle, AGP and dependencies (#1818) * upgrade gradle, AGP and dependencies * fix new layout related warnings --- app/build.gradle | 16 ++++++++-------- app/src/main/res/layout/activity_account.xml | 2 +- app/src/main/res/layout/item_account.xml | 2 +- app/src/main/res/layout/item_conversation.xml | 6 +++--- .../main/res/layout/item_report_status.xml | 4 ++-- app/src/main/res/layout/item_status.xml | 6 +++--- .../main/res/layout/item_status_detailed.xml | 6 +++--- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index febb289f0..0689a88cf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,18 +97,18 @@ project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { ext.lifecycleVersion = "2.2.0" ext.roomVersion = '2.2.5' -ext.retrofitVersion = '2.8.1' -ext.okhttpVersion = '4.5.0' +ext.retrofitVersion = '2.9.0' +ext.okhttpVersion = '4.7.2' ext.glideVersion = '4.11.0' -ext.daggerVersion = '2.27' -ext.materialdrawerVersion = '8.0.1' +ext.daggerVersion = '2.28' +ext.materialdrawerVersion = '8.0.3' // if libraries are changed here, they should also be changed in LicenseActivity dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation "androidx.core:core-ktx:1.2.0" - implementation "androidx.appcompat:appcompat:1.2.0-beta01" + implementation "androidx.core:core-ktx:1.3.0" + implementation "androidx.appcompat:appcompat:1.2.0-rc01" implementation "androidx.fragment:fragment-ktx:1.2.4" implementation "androidx.browser:browser:1.2.0" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" @@ -116,7 +116,7 @@ dependencies { implementation "androidx.exifinterface:exifinterface:1.2.0" implementation "androidx.cardview:cardview:1.0.0" implementation "androidx.preference:preference:1.1.1" - implementation "androidx.sharetarget:sharetarget:1.0.0-rc01" + implementation "androidx.sharetarget:sharetarget:1.0.0" implementation "androidx.emoji:emoji:1.0.0" implementation "androidx.emoji:emoji-appcompat:1.0.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" @@ -144,7 +144,7 @@ dependencies { implementation "com.github.bumptech.glide:glide:$glideVersion" implementation "com.github.bumptech.glide:okhttp3-integration:$glideVersion" - implementation "io.reactivex.rxjava2:rxjava:2.2.17" + implementation "io.reactivex.rxjava2:rxjava:2.2.19" implementation "io.reactivex.rxjava2:rxandroid:2.1.1" implementation "io.reactivex.rxjava2:rxkotlin:2.4.0" diff --git a/app/src/main/res/layout/activity_account.xml b/app/src/main/res/layout/activity_account.xml index b9cfabef3..9a36d1a74 100644 --- a/app/src/main/res/layout/activity_account.xml +++ b/app/src/main/res/layout/activity_account.xml @@ -125,12 +125,12 @@ android:layout_height="16sp" android:layout_marginStart="4dp" android:contentDescription="@string/description_account_locked" - android:tint="?android:textColorSecondary" android:visibility="gone" app:layout_constraintBottom_toBottomOf="@+id/accountUsernameTextView" app:layout_constraintStart_toEndOf="@+id/accountUsernameTextView" app:layout_constraintTop_toTopOf="@+id/accountUsernameTextView" app:srcCompat="@drawable/ic_reblog_private_24dp" + app:tint="?android:textColorSecondary" tools:visibility="visible" /> + app:srcCompat="@drawable/ic_eye_24dp" + app:tint="@color/white" /> + tools:visibility="visible" + app:tint="@color/white" /> + app:srcCompat="@drawable/ic_eye_24dp" + app:tint="@color/white" /> + app:srcCompat="@drawable/ic_eye_24dp" + app:tint="@color/white" /> )kxq%Bq>+@Al)yql!t+#+E>53IV^;nKUp^h z4s3gkgN%3})P~|EIG7tA>p3fA-P09~3?!BA;4bImM)6XMVtxPCsNO*R8`BM+7JTT( z%DMK_X0u;^`W#m#Ec6g#cs0%#ER_VbZbDE;Xfo6SxH#Jk{G(@Ad9*Ni==)yN&+Rs+ z!c5TRmq9CHM7*0Q{Uj9E>5GhmX#~DLb;+ll z-!FDVFymGnKRbAxQ0Rzpxzf2^IIJZ1>a*fh3^K^l2iUjT$-gD*2u?zG!9_ig1Ulvk zVy#gFy&uq-r`L2o`taG$t$-ROOh@WB(V7|PSzLEhBel)=tr_h5q~-=lfBiIaG-@wk zBq3>qaP`ZEdoQnNbun7EP_R74YiH^8;&y3c`JXY2C}9eWD~SoPu(5u~BT-ou705&# z(j53;{6KX%ts|QD8 zmei!%J?bD0pGB6rrzF3Ql4*rgVKrN33Y||4vWuVRKs>deCPbA_CvjUl;RXEOrT4(m zxINRPIa9#uO~1D1Q#bsM9eukHf}6O{pGw;+ppWNgFcO`3yrOJ5y(f`P;lLa*;FbRM zB@6#w0+(7p)M&JU*^0=M55Aoo4{;;*yUD~nK0+Oa6Wk=2f3o#?BO2E}-q{g_3H_wg z0;-~+W22xve~yBJB8{@|3ve$aMM2@_LP2>6s|At4rllw#)_$CkVXs~Am0ogKD*|j_ zgiI6wW=_0?pQ`6cF%!hwoxE7)ja4t2s;W$!XAP>%4?b0uF*&iXt(lmnIlq5b)v-z5 z@o_CEs960G(Va2M1b+Ve&u{3Tt&W=wujzA1L{0!A;<4?7f{1J9D<+5sp{o0Gl5$Qh zvBaG^vwV&eGKy$?nc}Imhos%j6{jeAIh|0KF*kvI?($YQ(>(!ky77|cTSHMssfR~G z$!TD|WuAv}uxh9`c^b%!wg_oPRMgR?<4-nbn$pQN=jV~oM~!_>Yym71wP48|FE*y1 z96R%lnZ`e5kFBux^GVnme^+#ojZ%|>Xp;`YTt;t&7%2RdyYrDTqAOysp!;^Q-zL2m z{<3O67MM#{q;G@|kDYT#DpCIJl3H#GxYt0ge(`7+S_gDW^oSMNIwm;Zn$I<&Bf(q6 zXRfi^Ts7qA$iN`Y1fg>%(2}%hvhO1!6{>4Wyb#F1d4sm-*u{B+XkX)35({w=e9p@w z!Pg7I))TN#nc`rdU`tKl&M>kWI4ayM{EB@QRb%u*hp0?(Z|kK`q<%-Mn|Rk$Kry&x z=mbY6CaVbil`u$ZZ(N{TTq$+NqK_^ai;mb{lDg>40G|0=XRo2tJyC3p-5k}f^7?0m z!}f`0iJ$zgCO+DX83Hi1e4nescg=5HJKW77vKP%&cungqf-bJ@?y8f`cxo82Am4tdK5irHk!Zy(hjoC+G|8`B*GSSqK!XpB3>XX;C&&ThUp z(T{Z|%<&VjZseczWppu0qfOIq$Lpwg#xP`3*axm&594YRNEg^VdLLbql&Crh zxk@ZEo?micfn~+C=G#?x?rA~#u&fZ4B$0|oO=>5vz&Kr7CNNmEd3)%nX`0iU3>HC! zT?bwEC1;a$T-+#3;`a*P5!UkiVw=dO4u;bWwdE8VOW8ZCEPG&c8+TG;hC!Qi?L4?I zpC)lC*?uKaF3_iZ?^3Bi#f72TX`BY)$Sz@TFjGb|Zko819O%|kphiM-?J-}y*4>24 z1Z`uQG#^U(&XK9hTXJ7k*3IpxwO28-Dcqg~T2-zRcbnj>tQ;LXWH2x&vxfUL{jOGO z3G7epiCpEHPXb!vwOG}1y?}zf&~r@rl2pr0FJBLQe`Zx7xHwB+JF#v)zK?|P1iX%qe47=-$dP5eQmJLn)-7P*Q!|X_fg;{OP$8M}6aFDyBn9pp zAG@AQAIDED;?BF7i8eLnRcFHyi)s-y#2l}t%q{o~>R{|~BTF`M^WV@5Cp9RwF;YB6 z<;I-(^`&Co1awRat-Ba9hLnXWmjQi;b*q2AmBvwGJ*HLuGRtUGBr-<{d2^Hu9VCZ` zEmOQhVN;&3KEb$l;r&K7A0?lp9EmdU&B;|uK(khuYyBj6%w^jdc&x#vzIGg$3?Hm8 z@&DKtMcG{Syi=P=@)YSR&oIsVgN%b7)F$*IQZ&0Za*om#%Wi<02tTVqyF>I4B3MWt z$6TfNCMHLfuNPIvoPmrVvin(*Mh=UE#s_GL15-#6WAt#bomte?X~%J9PErp?aWm_n z6lC5s;l4)APgN^F#?aa2m|4Q`;UwvKYujR)bBgi{_!r2nF?gepca~A@k$Q-lOW9J@ zT}hH0!rO#xTxp@eRMm^NN=@IJWL+;(YROkv8}+tG!s*uW>Q8j@ z8yI`^Q1vgVB+2|UR@B92xet~aB{n8TyP3Tk_Fj3<8o;FK;@Z5{Gg>9^7N=Q;5{>05 z?gpL*2unrhmi!!Ns>5h4>9`#B4c;3@=pp;6=&OFGw$~@ z9Y6gX{2KFq*mUYB(M5GKeOJH@BzLxEN4wMMkP& zbZd=x`^V5OBR^aQz-jX^ef%>lW|0AxwHk&qir#mGAB{?bfHO#7H$G0T!6G}XdKt;y zZc@qt${l)haQ|wn=A!ggAy$%+4%53k(rxLsA&}pBq(uty$Hw|v1n#zDnlDow{`uwy zo?r@Fpm%qyWPIK<%_NqMdvJB27(^PubDrk?z-L){A^m{u86QAdaAxT90ECz$WCJ6n zw!gWlc$H2?+$z9N3dl3KMKwpMrnp}8;Y7i3`i`;qDdSj=Ub7ple;(*p=p?WsYhDg3 zYJl$CU0Oh>nn`x>?apggqu-0Hky~UJADVt4^=tRgQoMReTK!sFe)PN4;2&SS8W zGIaS8t1|V~wXlXvDc)Mdp3H+2z795??E|9^aaGeDdpnrjbPKoZ zuU~yQPN-*{EAb2vp4|}=+_3IxJNAm&8$2TmUQdCrI9x(IVpJ#HD?mg2%|wT(3@N?2Ch8K}NQP5-Veg)fb^46sXoW4y10LgLp>&pXJ6ZL0<68iSn68NFv#Q3fB)8gl>sZdbrt485)IyFEm9l=S*!Je&xWea7c*N9-;LD*Kr#-&UeRz zad>a;uZ=i4>lcMsZqbIIAu%E&t==)^#MxS(qUoWse#ukF6Z2v}ZSol;W&?|Jr131@ zMtl}@2kRk*DR%yZp#*&iupcJ%T`0^|^K< z3I^_?k9s2xUww#5&!)YD!Xecc4M}3rLqF0RvBrK9mpgStQ75;3?p1?R{i5ae?x(@3 z5aql@kOL)4FD`Z|xDw4M6bDPsa74e3@PO{?r)o|sL?4qN&>h;+w+pw+_f&AmIOMCW z@=p^Y>P7fDdt;J3Mv-(w{BI4b$NXWSAyevLFOMWsjUVo7OZLqE z*?ZdqiHo?-m%L}ZecB>T-1DR@5FI@@O3@KF$SI*Tt9QdyUJLLc^IGYcH7z-=n=C^p ziVaaw>_ zz6kp8%4Iy$Moa{Inys8lHMdLni*TK<>prSjVxnv`)1mFAkVe%5eiLIEY@WiQW7uRx z|K4S?+sOIa%WP2e>H_`-Lb-}_=>Kh$mu&oQmFwso2^JN-mA9J={gMk+Di>`!(|3!) z#Hd2HS|Q*;#&Hk_KQ*)Q$JCjusbivMi)FM^U3`4J*@J>(5cp4s;WO4 zaZ~J1_IHyYdhi4^y=X)|W4%8+6R#sv1(#$llI=pm)70JHa2&2*qNP*1qKmySp>KK+ zwoK}Im2^ODta_af$&3@pa8qp$cFcsRs8&z8d-^)98trqt2Y6j8mSu-5vS$gh_$Msk zjY2X6Jway6GlU@yCqLpytlFhFWmsr%+bqVRDxO_}=Q1ujX^9)jwG($`l%b}CID2~z zHSh=O<6IZOtQ9u`dzNl}&&)F-JW=q+c?G-SGSPAX>!(^s4d!~ZvX>K23UOk*%q41j zOgi_lA??Qm?ENX!6AVw({2ar%w^yA})k7D!GZwOR@_%>(&GGRq#1ScYGp+T~*v+Id z)1`{flq6+H#>V0k3=BNN?(I_)op!C8`i5sUSS8om(kV+`d6U_tD>jrttEYbUzCvT~*T815Plap2EGI3m6BGFADJWSzH2gNbXK zAMevc_gV`Hwqv_d6t2nD#8mRtLj}5u1A`p|zy^L7tn)2^#cmn5ttx>AzWu|}4319d zmTCBd3DG$iJAc12RQBtaqtaDO<(lhp)saUjc}ckOF-?*CILc)CHQ3-c&R_bIx^RC(Uh>H=?Hc!Jfq*uf^5pvZ1qUEjUGFLA48xlJ@Id&^o~ zAxnaPkQJ{5`miM|3u`!5Yl>vOG3{InE)J-^?GFBYhs^S3{f%XmmMDbY929%)tXDK^ z4&0msZpvP=Oj^{;CiXzs=(d5-Tj9y&vR~?%ulrK|3M7R8AoRPFd*Jh%S=Iyda9Ke_ zrF5}XI&XAA(WM2qY$-Iw=VH7%AroF4;p~b8;9td1F#2cg%y^x}8|g+T(nMU&Zr#zB z-RYWpGePM7mRPYj^xvwV5!U1{Qb-VxZQ=%)g%P$JAS;+A)+%LtlNZ;uSA+=6xC;W1 zZ&!}Qje-aZE$+yMeC&-WJLqg}I+P*%A{y4Qaq5y97gk+F4qy~fVTW7#R8qx7{kLj@ z_Ak&Hi`GnE(YIf+nBX>YuN&8z>0+n8Y4Mw_D`*=uT-^XHMD;CpOPj0`pX1G}5>QX= zPS1iRQ#%re7!OK%X6W0M^BrF0IHK`4^^7#J+x`8GKi86ZU=OWN9Rd zbc#BaTYr?doP4Q$Tbac6h=c1Tcuy;l?Gu<2wG$iKh^=kN1p-~6nuHE#vN&}$>STjm zpd>NS?sZTc`Yti+^Jx(&e|e>jw51=3B!N5zF}}Z+dmjmLgD^?|K2t{vCP(Y5cxl45 z^#&!362V;(_~IFmEp7G&NyG+08Lf|URTC2r&e;9YS?LAO`7_Iiod$D!uB3}mMv5NZLM!7V8_tEyUwc&kFa1isI?26Eogw$4lsNRB(#c3Ssm(>CFP`< zuem=>#4!%PU48QZO*F)iwJsf#~c=|+1W5feb` z44pz7si?Qj-K8bF6sL7&%FICc1M1vBmTxRa~P2hdeYJpZ#955J&b zqeVyms=gR(%w^R?^1A&w#Ap@G%}hbE=bp6}sf~VMdpZjHb}bxykA59XXKm?+-Sd~% z;Xw}ENaem6xp{yUqkQ@z^x;+Il6-@d59N}XiYXGL6;QWzd#QUz8R&)Ql$)Ph=q4%t z2Unt^=Ru1Mji9_%K^h15uS`f6VVOTS&b2=_dU&nt%RSrsMUY+vWcC91ej!2YKzLFi z7o|5#RqpAxW)fo!>%GSC=QWq}-chx2_7Cw$HaRJ14sv$m%L#iajDtdxcqEnql!qgs1EZuI-bz*5EO zAWxzL1X}g$g^3JgM8S%;%wjN|95AK3o{Z`BBlLV(B_zdIva)EKP4Y8FOYwp;$Raw@wT4E<{pj3{hDai8KZje zcEuA-{d?JgLv!WnmKq5MyMEX52loR(6fdEA-RV<{G8H5Igxq1>w}%2S)_ju;wF_ZM z$7!A^lLCtCZdv033jL{f&eI>9ISF2x$~~6;tnOzYI*(I*?>+6ozHgn+iutW-50rn% ztIAoG0!guTBfvFW3Thg_WtLf?4+*6q61dY`qXbfO*(>@w!l|u3&BIZu84UE^j!yro z^oi)PjvWObd1M?(HjP?Hjc1s_HH?DvC)%cciIXHNQnqKY1Mg3}aOh6*=l4mzd4Txc zLVTFGo>@6$+loh+i-?qdkxJD?$#HzVN62jNChy z4YB@j$_b-hu>?T$VRfJvu%s0s0Ef{(lrq7C9j(X!@J;?lNnl2+?0`t?f7)S9^Q45Z zG6zDOr=jV;rzj)?wzFyiNCrKXu>VVcSOWr1JYl$A%&@I}YQk6lTl(}a3eog}xp;BF z2-ewA(_y0P;(%cL?=XaO+#VrrP#hBP1}@E>Nc z)4|rBGPfW9Y4aX6jC&IZkPLfLMi?Xv6E-?e2or%4;{NZwMIr3ae@SO35VpC=4w(A< zPw^v(VQ;tC0lm@xG)9oQ zxqJfxZgT&HB=QJh)Z2tGvcms=GiKqxqjKmdC2Q%Df@d50Zk!pNuo|L1uQJKl2yY)r#$r^WuYHGdz7S_A9cR|BBV!D#1L$+T24p8a>Pgr3$< MViXjGx&OBR0?kH%b^rhX delta 6547 zcmYkAbx_pNyT)OqL%K`4yFnJ0Ub0fbkcY00Ec`v8pw# zP1%=K=fTZQx1pfej+Ro3pZ{H+B$tvoY7*_j#twUpZpfOnC9Xc>mcgedjEy*!&BAw+ z!Pb8qzSx)i-geP%Y&mo93hXitf4u*5hTDllPosG z#)a_-^*6(UY8N`S7#Hmosbzg7Pl<;TElEZd0hEZc|TV zsfGsW_Cs|WF=Fk4&PWdE3~w?1)ajZRB`0|;a45l@mC9V@1@RVN@ykVBK8wj$z=wr@aDeA*lqRvbqEYcJ++2G(*rVbDu7M7;lVb@s zUpiabP+>}OT-jh)W+<}$*eWiZ!a{(GunZh*`?>0O^2Pop%YFQ-&u%m(0r8~z!-&?N zYn(_=J{6xvr3iEFhzT?{vM~CW%j8)1I6t@AfImYf>vJhH!Xrw5h_lkT}!v{y-23=jSt)Sxt`>B z(!Au<2-0p1MQWh`&bz(aR;aC0Ywui+>UmdxbpB&%mezJJ*n&xThv`}u!B~E(N6-K3 z3_8U>zN>1nxd(h1iZ4Rq7~R3ap1mtva6>is57nm3v~T=d4VC6NTP-$W3|T+EOHnOs z6tTAIq*mP>cz`uFr^&$b^x`)MujcOSgT=Yceij*Y2cU~z8-M<+1mERc*)H-}DR&(h zw?8L`cL$at6C$(3&N&zm$_4RI;qh@^|D<^Q1j)=%Hg<)&3a~S>T?6fn(Y2$jXta6S zO*-lYV;1+QIO#)S7L)%6kv;6q8ytk%rpw(R;ZohTbgfkyhu`}w@D}dQrJTkg$+${qm4m?HteM^(ho{20(c64>NjM2%I9G12_vO{<(vZQd zeYr)er=*_dY|4^hg-E$#nyQ03GpQ4-Q>6Mi+kNh?FK_xpfIl`MPV4Yy3cqmDKrpYQ zesF@i+ZSGz(@?*!1V@TSA=|@^9YkoSsgwI8i46HP#)kQLQx{t)nUusL!hR_fp_d86 zt6zUwGi1>GCU1(kw9Tn*Z*I4U?>Bm*Gn!a26D8kkO%asgWz9h?L?M`Aamwl&@P$p8 z-0z1ko0m^H#GcxW?8A@Qr~$iG<1%aA=Y(bR-G`#gEI$V!O^dX_dwmioj(5~kcZc}q z!j}a(&4VKAIw7#H5%M(h8rbr}@-_RxC5_YaHM%uX&ADKNdnWvcPF=7P{=yoTljgvk z6!VD4fE~l^=#+;87bGzasykginl9YLMr2J*O+NeCPMyo2Gra8fsqiQ`7s-BU8kRw} z=mQ^6!JW;kd*js3IK%X_n$F2?gnyPdmMz;<}hhX8vL8# zDwb%YeX5HF4~B8Zit^3_wRA8m_7pTF3j1!)mdP4XLSH2=$J-dPiqH6Dh@j@?CD;r` zR$IQ+WWpb>Xw^^DmRHcmN+#F^#-;d8?l%bvl|*4MN7OhV)mNH&72YV%wl(zBp+! zp{cou)D(g0n+xXCANKg!ER|_wPC>bx7-khT3EI#3PL)x9?_em_p`|iUe;3QW2p4Uc zv$CIRUL;gYhF`->`J<_bMn!l*UX&>W{xC7-XnRWc1|lH6m4ygrIo&mVs`>#Pb1v8>{GX-P4kK_KxSuyies;QBq1e->cP5+I;eAg9LbM^wtQ6eSW_zWF8 zI^>q<)j(@pva4?EE_PMo%gu%y`?E7d?e(WTWB>9&u`(yaalT)+pV9kcLPsL0KfV%u zc`H~JJ^Mh-J-BS0P}*69ouWEE<<9j7`A|5;d{M00Q6yV@At949h5jx_bv?(4%R{?J z_4E1c!gX?~p~<^gRf=g=E+_Vx$91C{%zJsH*EwHU74kDfi9elX)j7Vu%$osz1mq6S z+B0uR{A^U4QBOY9fAqYUmBU~EL2x~|c|3g-%f>aR(w}?1@Z7oGd`J3P^A-Ibj>6_w z{k0xhog3$NkbWcm+%+P{D8VWVW?dkh{@(R^1TWWEv_V^> zSaBI*x8WKK6-py7SIMl02$MS^6zBz{1@ z;bPeEOV*SwCmd}1zQ9Bt<1dP>ANcVrX`sqZ#Lctm56lic7SnjvsdF;>)i~)4)}6<8 zw>3kuJ6R?7lqCYM4+5leLIB{FKq@^Srr;_e9vKqp49!1e$Mo?uyV%V<^c}k0JY$e141jJkVTsm>WF? zzUm(myxyEf#<`GTnpaS5;b$-*bddR+=ipA45;OVx0Ci>}3ay2L1rZ&dWRo=voeU)U zukSaL`h57RPMmtbU6(#zA_lo?M$T~-&?rm`EIP1}2tL8<<{_<907tgqeEL3SsAI!k z2jgOUsW&{QL9N^1M$%VrXYb}SSI09g{%-q=@X+@NcaGE;Sk$ED=7Ox*;0*3Wi3^HW zfICY#b-$>~7%kFL&inoFFjq%+hvAJu*EQCjZXD-^tNyY(*JC&W!5tIGKI+i+N%gZY zSI5{_ZHY*1*6KBtgiF3f{Xo5ez5t)u!c$YO$IQpv|5==g7wqgwAyp*JJEs<+<#2Rb{s&@eV z;2pLXV}CIoejpWOF`HSeP>^@;wg--*snbwmz`h7Km33$+4sZ4=Hmpex-O zqJ1uQVCQliL8^Z2hc8r1pwrjeeG2L?3*AUK8hh7QV|M3XApI#FY-5`B0)FYsr+=TV zW?AHTHxy>#QbyO{Hb$0bq!##z*Ym!$b|RRW%<5ZHstN4rCK^^7pXU)ZD$diO;3SMm z-`5g7n|)S@A4GiKE1ec08xG$SOOPM=Ca1DfbRDca!_%7>sjyFiOWb;e>%9W&D$+?cLXYCh4ba##?-1<&69 zaH<~z9paWS)W!bcJ>&>%5zAt1xWSIIq5I>NE=@0mFzu$HKeDf>M`UydKzZyyx3FPV zeRI)5yX39+UAoH#@F)&0l$T-Q32(vjWcJ8eIYr*4HhHYu%Gzp;u^`rY^W9 z9F01NSn zDq+@Ud?UjbN4hEecEWu;zy1v)2|B(eJ@>Y7Tx@Gh>-?RsXZ|m`h$HcGdoCYKwmdKt z!(gspq5CDyr$8fzL?5HV6GmaPn2^yS@h89yg7P zv>kt>NjC;EWQ^Fk5ru=wy$FaZ-QCgW9%v=u{A~W?Tclu3=TMA6jUg>Q%z z0DZE&sp8FZymao0;o)X{%Kqin7mz{+-}O9v=eaHJm*EyfbIhlxL9)+En^Fen+s9N8 z?9Ax9wJ!8+3B12oy|Xcu{_u^c3VR%TaC=L%`u^wPqiI^v5FuzD97y?^zu;%?ANsX1Oib}xXjsN4^999+mULA4 zgAz^MtI5vp+<<&i@}JBu)`MW``uU|zgiw9nK(r^5AqHH64wH&)Qevoo`c(_9aG01@ zOK>GiZKeWSW2QnW&mnZ%&H5dtc^FZGo$L)1(otL-f>EU)oZoVaN*x-JV|xu-6Vyj&P0i{$#{T=~MwSw&I{A?F84i1gv( z)hRc=+_D2|mF=9Hi-23y=4-gvA3{SnYbVCzd5b9L(c9g?RP7|X zfs^d06B_u77gR!RA#r8+96}-`o@w!3Ua}0@QXG~eTeTy#G2yvRp$i%!$*HKZgl67s zu|>QhVci1yp>ajz$vxQsho-|ozQ!k%SwpGlrDD35d#FL5P0j9;aVK~M5V~R&*^=+L zSCzmzQciQYuf=0RCpt@)51vxm3rMU&y&##ir%NGZ&Zk(@TKmq)9z>pPm|7MW(fbxl zxZwmY; zN}{MPKvPp3B+<7pUV#b^t*{b12zyQPbh;WkjXCz}Ru>nJ#lDvm^~g+2m2&Ci#rf=W zlJ_Ne%V*;Dx(!}T2D|P6(VS$XM*iB2tVXeM6k^E?d+?5QXHqc1K{0n$%%*tB^=D>C z{Rv@&Y!C1X_)ss(h1eJ5{yqpOSSDRwxO1!itaD>RV1%dmf;F}BSF>z$+!ZNCm9>%3 zB$H}@JlE71f7KotsYWn%*}UuP-u5Lk4KCN2ahPFJs6v=g4a{r>xdoBi>Ku#l+Z>K= zwezjvKQ#3mdA(SahO=mcpI~JXIP!P>a*IrMJHz{yqYw^43@u);$e^P?Gl5N#L7VQX zb<;DDo;5P(0!j*-Ol}^`?3^Xd62%kK*S5*8(>qs@nJ8z%hMxE6519pfM|vn27qDE} zaJ>x&>A|+9=<^>R+%%8!d%3@~L?_MoFch9k8I9>)gNs0!m?%lJ@1~%hFpIc)ymh0K zd|UJS+{$Q#W+iY{stH?!&L(ymcFmPp%e!D^=o;<%1)qad$Ec-kK<%kdOG^}6NJy$G z)-+x^HXfcue(T86JkI|61%F15!*t1QUQa~Zk?9V@%;2+9n1|TEn<#9XV56}1AgZXl zEh`qo?!^}YIboKsV&BnqLav{2(1Y+83WbvGuyYYPD9q+)<7S|B zv-f*t`|zOOR4wEft=PL?k(rp6xJk;UDDyB{zVT`P3c`{8>*$4wl)kAd6io(Cm^}aF z@C!An4E3sss?9XD7k6BLFka4g)>Tcp@K(zv^>w~9bj{;Xq`%KV|84fFZ+^RDD5 z&D||R7u@IaMNW;>*F1*|X9|Zd_bnyKvu5EamB_jG`JPsUj_cXtfG9+Gjipd&=k*=@ zSAhOH1m8eW(icWXDUj9~ZfM}7GM$VC!a9aC-m z$9&}vXeQ@XN!yio)>wnSzdn=;q=i?)3mhg93pVMVBsjb;$m27x6+9D7HHXZ%-ySdS z%3-ymPnpOtY1D7si5fq6BpxnqYV$BGQ`pqmw2tS?7BLGj=p*uFAyE(xmF>T8^XMzz zw6z-2|HajrqxK4b-%h7+T@usb1> z->hmpIo^MR&k=ug(hd`I0w7tJq^B~q6snow@@qlwFrL0U_=9red9nQV!BLB*n%au_ z7SnFMfboKV`|!#-oxrN~aRU2-@%*wMv2nra9iSwbJ^W%l?!oMq_Pzy9gWK=ig7*ih zB4=|XT0P7ng?xD0PG3&1^@!%hf88|Yw;)fv9#>!EWu<)Ax(s=2e1TwHbCi+=oj+08 zYBbA9IG4oN*_Z#e$jD{DF%?^1`f9_>PM~~3ITW_pk)`WtDBgMk1&kTF^j1$1=|$tJ zjtNrAbC8($17KUyjjj)^@<#sc>1}DWs&?n>sE4Im$OpCZ^NIkktFI`#ivyY!GJ81& z3AJgh3$7e@uki@7pOuM3VcMnN-@w(jd&ay>k_L(%yKLOfHOtmDSNr6C3u$I%N$SQHW%=$FPV6i$Fz%`f zvTF|4kS7dRnJ>42(TDsLqaLY5@&Ey0u$q}4o#Y||v|WUqL1NK1mLOKneC`^BVDKV^ z+z6G7-OEnW<=4(hE4U}46Ng}{OS8|)el0=}!}g3YXD{bM1NRr-cDVaKP2}q4tH-0Q zC<%qSM}j(pfkZIce@5`Y*LfrC|DAIJGz*rXAcKFC&T0cZAY*|G#AE!=%EIu0!v#4I z0qlP)2{5=q2-q)DgFaaQLoL>H|4@+~A@1Mt>A#i#J{8zlgn^K7U~`cc7=b?pFy{#Y z&n0TqQy^hU8>HsmB*F;s{;wwP zuzw*uj2c*3KQ=Lj=5I&{G_6sCC_nz&@Ow=QG?@5LzFAj7 zy#Q*~;h Date: Thu, 4 Jun 2020 20:17:07 +0200 Subject: [PATCH 26/41] cleanup proguard rules (#1819) --- app/proguard-rules.pro | 46 ++++++------------------------------------ 1 file changed, 6 insertions(+), 40 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 2d554c992..e25a4564e 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -17,12 +17,12 @@ # keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View { - void set*(***); - *** get*(); + void set*(***); + *** get*(); } # We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { - public void *(android.view.View); + public void *(android.view.View); } # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers enum * { @@ -30,43 +30,19 @@ public static ** valueOf(java.lang.String); } -keepclassmembers class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator CREATOR; -} --keepclassmembers class **.R$* { - public static ; + public static final ** CREATOR; } # TUSKY SPECIFIC OPTIONS -## for okhttp --dontwarn javax.annotation.** --keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase --dontwarn org.codehaus.mojo.animal_sniffer.* --dontwarn okhttp3.internal.platform.ConscryptPlatform - -##for keep --dontwarn android.arch.util.paging.CountedDataSource --dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource - -## for retrofit --dontwarn retrofit2.** --keep class retrofit2.** { *; } --keepattributes Signature --keepattributes Exceptions --keepattributes *Annotation* - --keepclasseswithmembers class * { - @retrofit2.http.* ; -} - --keep class com.keylesspalace.tusky.entity.** { *; } +# keep members of our model classes, they are used in json de/serialization +-keepclassmembers class com.keylesspalace.tusky.entity.* { *; } -keep public enum com.keylesspalace.tusky.entity.*$** { **[] $VALUES; public *; } - # preserve line numbers for crash reporting -keepattributes SourceFile,LineNumberTable -renamesourcefileattribute SourceFile @@ -87,17 +63,7 @@ static void throwUninitializedPropertyAccessException(java.lang.String); } --dontwarn com.google.errorprone.annotations.* - # without this emoji font downloading fails with AbstractMethodError -keep class * extends android.os.AsyncTask { public *; } - -# Glide --keep public class * implements com.bumptech.glide.module.GlideModule --keep public class * extends com.bumptech.glide.module.AppGlideModule --keep public enum com.bumptech.glide.load.ImageHeaderParser$** { - **[] $VALUES; - public *; -} From 8f2514dbe045896172b985c0e984e2fb2e95115a Mon Sep 17 00:00:00 2001 From: Conny Duck Date: Thu, 4 Jun 2020 23:07:06 +0200 Subject: [PATCH 27/41] downgrade dagger to get rid of READ_PHONE_STATE permission https://github.com/google/dagger/issues/1864 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0689a88cf..146ca55ff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -100,7 +100,7 @@ ext.roomVersion = '2.2.5' ext.retrofitVersion = '2.9.0' ext.okhttpVersion = '4.7.2' ext.glideVersion = '4.11.0' -ext.daggerVersion = '2.28' +ext.daggerVersion = '2.27' ext.materialdrawerVersion = '8.0.3' // if libraries are changed here, they should also be changed in LicenseActivity From 4188b6ea0919f599d771529203872f273cf02d91 Mon Sep 17 00:00:00 2001 From: Ivan Kupalov Date: Sun, 7 Jun 2020 19:37:34 +0200 Subject: [PATCH 28/41] Fix loading more than one page of favs/bookmarks, fix #1824 (#1825) --- .../tusky/fragment/TimelineFragment.java | 52 ++++++++++++++++--- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java index 47ce86578..ef1f5ee14 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java @@ -18,6 +18,7 @@ package com.keylesspalace.tusky.fragment; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -75,6 +76,7 @@ import com.keylesspalace.tusky.repository.TimelineRepository; import com.keylesspalace.tusky.repository.TimelineRequestMode; import com.keylesspalace.tusky.util.CardViewMode; import com.keylesspalace.tusky.util.Either; +import com.keylesspalace.tusky.util.HttpHeaderLink; import com.keylesspalace.tusky.util.LinkHelper; import com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate; import com.keylesspalace.tusky.util.ListUtils; @@ -163,6 +165,10 @@ public class TimelineFragment extends SFragment implements private Kind kind; private String id; private List tags; + /** + * For some timeline kinds we must use LINK headers and not just status ids. + */ + private String nextId; private LinearLayoutManager layoutManager; private EndlessOnScrollListener scrollListener; private boolean filterRemoveReplies; @@ -232,7 +238,7 @@ public class TimelineFragment extends SFragment implements || kind == Kind.LIST) { id = arguments.getString(ID_ARG); } - if(kind == Kind.TAG) { + if (kind == Kind.TAG) { tags = arguments.getStringArrayList(HASHTAGS_ARG); } @@ -963,13 +969,17 @@ public class TimelineFragment extends SFragment implements updateAdapter(); String bottomId = null; - final ListIterator> iterator = - this.statuses.listIterator(this.statuses.size()); - while (iterator.hasPrevious()) { - Either previous = iterator.previous(); - if (previous.isRight()) { - bottomId = previous.asRight().getId(); - break; + if (kind == Kind.FAVOURITES || kind == Kind.BOOKMARKS) { + bottomId = this.nextId; + } else { + final ListIterator> iterator = + this.statuses.listIterator(this.statuses.size()); + while (iterator.hasPrevious()) { + Either previous = iterator.previous(); + if (previous.isRight()) { + bottomId = previous.asRight().getId(); + break; + } } } sendFetchTimelineRequest(bottomId, null, null, FetchEnd.BOTTOM, -1); @@ -1050,6 +1060,14 @@ public class TimelineFragment extends SFragment implements @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { if (response.isSuccessful()) { + @Nullable + String newNextId = extractNextId(response); + if (newNextId != null) { + // when we reach the bottom of the list, we won't have a new link. If + // we blindly write `null` here we will start loading from the top + // again. + nextId = newNextId; + } onFetchTimelineSuccess(liftStatusList(response.body()), fetchEnd, pos); } else { onFetchTimelineFailure(new Exception(response.message()), fetchEnd, pos); @@ -1068,6 +1086,24 @@ public class TimelineFragment extends SFragment implements } } + @Nullable + private String extractNextId(Response response) { + String linkHeader = response.headers().get("Link"); + if (linkHeader == null) { + return null; + } + List links = HttpHeaderLink.parse(linkHeader); + HttpHeaderLink nextHeader = HttpHeaderLink.findByRelationType(links, "next"); + if (nextHeader == null) { + return null; + } + Uri nextLink = nextHeader.uri; + if (nextLink == null) { + return null; + } + return nextLink.getQueryParameter("max_id"); + } + private void onFetchTimelineSuccess(List> statuses, FetchEnd fetchEnd, int pos) { From c64df0fd1df99e0882032eceac099f9632bed539 Mon Sep 17 00:00:00 2001 From: Ivan Kupalov Date: Mon, 8 Jun 2020 09:21:12 +0200 Subject: [PATCH 29/41] Settings refactor (#1615) * Refactor main preferences to use DSL * Refactor account preferences to use DSL * Use DSL in rest of the preference screens * Preferences cleanup * Fix preference dependencies --- .../keylesspalace/tusky/EmojiPreference.java | 12 + .../preference/AccountPreferencesFragment.kt | 373 ++++++++++-------- .../NotificationPreferencesFragment.kt | 180 ++++++--- .../preference/PreferencesFragment.kt | 207 +++++++--- .../preference/ProxyPreferencesFragment.kt | 58 ++- .../TabFilterPreferencesFragment.kt | 30 +- .../tusky/settings/SettingsConstants.kt | 56 +++ .../tusky/settings/SettingsDSL.kt | 83 ++++ app/src/main/res/values/strings.xml | 2 +- app/src/main/res/xml/account_preferences.xml | 81 ---- .../main/res/xml/http_proxy_preferences.xml | 23 -- .../main/res/xml/notification_preferences.xml | 78 ---- app/src/main/res/xml/preferences.xml | 118 ------ .../res/xml/timeline_filter_preferences.xml | 22 -- 14 files changed, 686 insertions(+), 637 deletions(-) create mode 100644 app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt create mode 100644 app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt delete mode 100644 app/src/main/res/xml/account_preferences.xml delete mode 100644 app/src/main/res/xml/http_proxy_preferences.xml delete mode 100644 app/src/main/res/xml/notification_preferences.xml delete mode 100644 app/src/main/res/xml/preferences.xml delete mode 100644 app/src/main/res/xml/timeline_filter_preferences.xml diff --git a/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java b/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java index cdf09002a..8837c7d8d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java +++ b/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java @@ -43,6 +43,18 @@ public class EmojiPreference extends Preference { 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); diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt index 3e54f7ce5..9fa6a6e54 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt @@ -19,21 +19,21 @@ import android.content.Intent import android.graphics.drawable.Drawable import android.os.Build import android.os.Bundle -import com.google.android.material.snackbar.Snackbar import android.util.Log -import android.view.View -import androidx.preference.* +import androidx.preference.PreferenceFragmentCompat +import com.google.android.material.snackbar.Snackbar import com.keylesspalace.tusky.* -import com.keylesspalace.tusky.R import com.keylesspalace.tusky.appstore.EventHub import com.keylesspalace.tusky.appstore.PreferenceChangedEvent import com.keylesspalace.tusky.components.instancemute.InstanceListActivity +import com.keylesspalace.tusky.db.AccountEntity import com.keylesspalace.tusky.db.AccountManager import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.entity.Account import com.keylesspalace.tusky.entity.Filter import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.network.MastodonApi +import com.keylesspalace.tusky.settings.* import com.keylesspalace.tusky.util.ThemeUtils import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial @@ -44,11 +44,7 @@ import retrofit2.Callback import retrofit2.Response import javax.inject.Inject - -class AccountPreferencesFragment : PreferenceFragmentCompat(), - Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener, - Injectable { - +class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable { @Inject lateinit var accountManager: AccountManager @@ -58,182 +54,217 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), @Inject lateinit var eventHub: EventHub - private lateinit var notificationPreference: Preference - private lateinit var tabPreference: Preference - private lateinit var mutedUsersPreference: Preference - private lateinit var blockedUsersPreference: Preference - private lateinit var mutedDomainsPreference: Preference - - private lateinit var defaultPostPrivacyPreference: ListPreference - private lateinit var defaultMediaSensitivityPreference: SwitchPreferenceCompat - private lateinit var alwaysShowSensitiveMediaPreference: SwitchPreferenceCompat - private lateinit var alwaysOpenSpoilerPreference: SwitchPreferenceCompat - private lateinit var mediaPreviewEnabledPreference: SwitchPreferenceCompat - private lateinit var homeFiltersPreference: Preference - private lateinit var notificationFiltersPreference: Preference - private lateinit var publicFiltersPreference: Preference - private lateinit var threadFiltersPreference: Preference - private lateinit var accountFiltersPreference: Preference - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.account_preferences) - - notificationPreference = requirePreference("notificationPreference") - tabPreference = requirePreference("tabPreference") - mutedUsersPreference = requirePreference("mutedUsersPreference") - blockedUsersPreference = requirePreference("blockedUsersPreference") - mutedDomainsPreference = requirePreference("mutedDomainsPreference") - defaultPostPrivacyPreference = requirePreference("defaultPostPrivacy") as ListPreference - defaultMediaSensitivityPreference = requirePreference("defaultMediaSensitivity") as SwitchPreferenceCompat - mediaPreviewEnabledPreference = requirePreference("mediaPreviewEnabled") as SwitchPreferenceCompat - alwaysShowSensitiveMediaPreference = requirePreference("alwaysShowSensitiveMedia") as SwitchPreferenceCompat - alwaysOpenSpoilerPreference = requirePreference("alwaysOpenSpoiler") as SwitchPreferenceCompat - homeFiltersPreference = requirePreference("homeFilters") - notificationFiltersPreference = requirePreference("notificationFilters") - publicFiltersPreference = requirePreference("publicFilters") - threadFiltersPreference = requirePreference("threadFilters") - accountFiltersPreference = requirePreference("accountFilters") - - notificationPreference.icon = IconicsDrawable(notificationPreference.context, GoogleMaterial.Icon.gmd_notifications).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(notificationPreference.context, R.attr.iconColor) } - mutedUsersPreference.icon = getTintedIcon(R.drawable.ic_mute_24dp) - blockedUsersPreference.icon = IconicsDrawable(blockedUsersPreference.context, GoogleMaterial.Icon.gmd_block).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(blockedUsersPreference.context, R.attr.iconColor) } - mutedDomainsPreference.icon = getTintedIcon(R.drawable.ic_mute_24dp) - - notificationPreference.onPreferenceClickListener = this - tabPreference.onPreferenceClickListener = this - mutedUsersPreference.onPreferenceClickListener = this - blockedUsersPreference.onPreferenceClickListener = this - mutedDomainsPreference.onPreferenceClickListener = this - homeFiltersPreference.onPreferenceClickListener = this - notificationFiltersPreference.onPreferenceClickListener = this - publicFiltersPreference.onPreferenceClickListener = this - threadFiltersPreference.onPreferenceClickListener = this - accountFiltersPreference.onPreferenceClickListener = this - - defaultPostPrivacyPreference.onPreferenceChangeListener = this - defaultMediaSensitivityPreference.onPreferenceChangeListener = this - mediaPreviewEnabledPreference.onPreferenceChangeListener = this - alwaysShowSensitiveMediaPreference.onPreferenceChangeListener = this - alwaysOpenSpoilerPreference.onPreferenceChangeListener = this - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - accountManager.activeAccount?.let { - - defaultPostPrivacyPreference.value = it.defaultPostPrivacy.serverString() - defaultPostPrivacyPreference.icon = getIconForVisibility(it.defaultPostPrivacy) - - defaultMediaSensitivityPreference.isChecked = it.defaultMediaSensitivity - defaultMediaSensitivityPreference.icon = getIconForSensitivity(it.defaultMediaSensitivity) - - mediaPreviewEnabledPreference.isChecked = it.mediaPreviewEnabled - alwaysShowSensitiveMediaPreference.isChecked = it.alwaysShowSensitiveMedia - alwaysOpenSpoilerPreference.isChecked = it.alwaysOpenSpoiler - - } - } - - override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { - when (preference) { - defaultPostPrivacyPreference -> { - preference.icon = getIconForVisibility(Status.Visibility.byString(newValue as String)) - syncWithServer(visibility = newValue) - } - defaultMediaSensitivityPreference -> { - preference.icon = getIconForSensitivity(newValue as Boolean) - syncWithServer(sensitive = newValue) - } - mediaPreviewEnabledPreference -> { - accountManager.activeAccount?.let { - it.mediaPreviewEnabled = newValue as Boolean - accountManager.saveAccount(it) + val context = requireContext() + makePreferenceScreen { + preference { + setTitle(R.string.pref_title_edit_notification_settings) + icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_notifications).apply { + sizeRes = R.dimen.preference_icon_size + colorInt = ThemeUtils.getColor(context, R.attr.iconColor) + } + setOnPreferenceClickListener { + openNotificationPrefs() + true } } - alwaysShowSensitiveMediaPreference -> { - accountManager.activeAccount?.let { - it.alwaysShowSensitiveMedia = newValue as Boolean - accountManager.saveAccount(it) + + preference { + setTitle(R.string.title_tab_preferences) + setOnPreferenceClickListener { + val intent = Intent(context, TabPreferenceActivity::class.java) + activity?.startActivity(intent) + activity?.overridePendingTransition(R.anim.slide_from_right, + R.anim.slide_to_left) + true } } - alwaysOpenSpoilerPreference -> { - accountManager.activeAccount?.let { - it.alwaysOpenSpoiler = newValue as Boolean - accountManager.saveAccount(it) + + preference { + setTitle(R.string.action_view_mutes) + icon = getTintedIcon(R.drawable.ic_mute_24dp) + setOnPreferenceClickListener { + val intent = Intent(context, AccountListActivity::class.java) + intent.putExtra("type", AccountListActivity.Type.MUTES) + activity?.startActivity(intent) + activity?.overridePendingTransition(R.anim.slide_from_right, + R.anim.slide_to_left) + true } } - } - eventHub.dispatch(PreferenceChangedEvent(preference.key)) + preference { + setTitle(R.string.action_view_blocks) + icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_block).apply { + sizeRes = R.dimen.preference_icon_size + colorInt = ThemeUtils.getColor(context, R.attr.iconColor) + } + setOnPreferenceClickListener { + val intent = Intent(context, AccountListActivity::class.java) + intent.putExtra("type", AccountListActivity.Type.BLOCKS) + activity?.startActivity(intent) + activity?.overridePendingTransition(R.anim.slide_from_right, + R.anim.slide_to_left) + true + } + } - return true - } + preference { + setTitle(R.string.title_domain_mutes) + icon = getTintedIcon(R.drawable.ic_mute_24dp) + setOnPreferenceClickListener { + val intent = Intent(context, InstanceListActivity::class.java) + activity?.startActivity(intent) + activity?.overridePendingTransition(R.anim.slide_from_right, + R.anim.slide_to_left) + true + } + } - override fun onPreferenceClick(preference: Preference): Boolean { - - return when (preference) { - notificationPreference -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val intent = Intent() - intent.action = "android.settings.APP_NOTIFICATION_SETTINGS" - intent.putExtra("android.provider.extra.APP_PACKAGE", BuildConfig.APPLICATION_ID) - startActivity(intent) - } else { - activity?.let { - val intent = PreferencesActivity.newIntent(it, PreferencesActivity.NOTIFICATION_PREFERENCES) - it.startActivity(intent) - it.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) + preferenceCategory(R.string.pref_publishing) { + listPreference { + setTitle(R.string.pref_default_post_privacy) + setEntries(R.array.post_privacy_names) + setEntryValues(R.array.post_privacy_values) + key = PrefKeys.DEFAULT_POST_PRIVACY + setSummaryProvider { entry } + val visibility = accountManager.activeAccount?.defaultPostPrivacy + ?: Status.Visibility.PUBLIC + value = visibility.serverString() + icon = getIconForVisibility(visibility) + setOnPreferenceChangeListener { _, newValue -> + icon = getIconForVisibility( + Status.Visibility.byString(newValue as String) + ) + syncWithServer(visibility = newValue) + eventHub.dispatch(PreferenceChangedEvent(key)) + true + } + } + + switchPreference { + setTitle(R.string.pref_default_media_sensitivity) + setIcon(R.drawable.ic_eye_24dp) + key = PrefKeys.DEFAULT_MEDIA_SENSITIVITY + isSingleLineTitle = false + val sensitivity = accountManager.activeAccount?.defaultMediaSensitivity + ?: false + setDefaultValue(sensitivity) + icon = getIconForSensitivity(sensitivity) + setOnPreferenceChangeListener { _, newValue -> + icon = getIconForSensitivity(newValue as Boolean) + syncWithServer(sensitive = newValue) + eventHub.dispatch(PreferenceChangedEvent(key)) + true } - } - true - } - tabPreference -> { - val intent = Intent(context, TabPreferenceActivity::class.java) - activity?.startActivity(intent) - activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) - true - } - mutedUsersPreference -> { - val intent = Intent(context, AccountListActivity::class.java) - intent.putExtra("type", AccountListActivity.Type.MUTES) - activity?.startActivity(intent) - activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) - true - } - blockedUsersPreference -> { - val intent = Intent(context, AccountListActivity::class.java) - intent.putExtra("type", AccountListActivity.Type.BLOCKS) - activity?.startActivity(intent) - activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) - true - } - mutedDomainsPreference -> { - val intent = Intent(context, InstanceListActivity::class.java) - activity?.startActivity(intent) - activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) - true - } - homeFiltersPreference -> { - launchFilterActivity(Filter.HOME, R.string.title_home) - } - notificationFiltersPreference -> { - launchFilterActivity(Filter.NOTIFICATIONS, R.string.title_notifications) - } - publicFiltersPreference -> { - launchFilterActivity(Filter.PUBLIC, R.string.pref_title_public_filter_keywords) - } - threadFiltersPreference -> { - launchFilterActivity(Filter.THREAD, R.string.pref_title_thread_filter_keywords) - } - accountFiltersPreference -> { - launchFilterActivity(Filter.ACCOUNT, R.string.title_accounts) } - else -> false + preferenceCategory(R.string.pref_title_timelines) { + switchPreference { + key = PrefKeys.MEDIA_PREVIEW_ENABLED + setTitle(R.string.pref_title_show_media_preview) + isSingleLineTitle = false + isChecked = accountManager.activeAccount?.mediaPreviewEnabled ?: true + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.mediaPreviewEnabled = newValue as Boolean } + eventHub.dispatch(PreferenceChangedEvent(key)) + true + } + } + + switchPreference { + key = PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA + setTitle(R.string.pref_title_alway_show_sensitive_media) + isSingleLineTitle = false + isChecked = accountManager.activeAccount?.alwaysShowSensitiveMedia ?: false + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.alwaysShowSensitiveMedia = newValue as Boolean } + eventHub.dispatch(PreferenceChangedEvent(key)) + true + } + } + + switchPreference { + key = PrefKeys.ALWAYS_OPEN_SPOILER + setTitle(R.string.pref_title_alway_open_spoiler) + isSingleLineTitle = false + isChecked = accountManager.activeAccount?.alwaysOpenSpoiler ?: false + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.alwaysOpenSpoiler = newValue as Boolean } + eventHub.dispatch(PreferenceChangedEvent(key)) + true + } + } + } + + preferenceCategory(R.string.pref_title_timeline_filters) { + preference { + setTitle(R.string.pref_title_public_filter_keywords) + setOnPreferenceClickListener { + launchFilterActivity(Filter.THREAD, + R.string.pref_title_thread_filter_keywords) + true + } + } + + preference { + setTitle(R.string.title_notifications) + setOnPreferenceClickListener { + launchFilterActivity(Filter.NOTIFICATIONS, R.string.title_notifications) + true + } + } + + preference { + setTitle(R.string.title_home) + setOnPreferenceClickListener { + launchFilterActivity(Filter.HOME, R.string.title_home) + true + } + } + + preference { + setTitle(R.string.pref_title_thread_filter_keywords) + setOnPreferenceClickListener { + launchFilterActivity(Filter.THREAD, + R.string.pref_title_thread_filter_keywords) + true + } + } + + preference { + setTitle(R.string.title_accounts) + setOnPreferenceClickListener { + launchFilterActivity(Filter.ACCOUNT, R.string.title_accounts) + true + } + } + } } + } + private fun openNotificationPrefs() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val intent = Intent() + intent.action = "android.settings.APP_NOTIFICATION_SETTINGS" + intent.putExtra("android.provider.extra.APP_PACKAGE", BuildConfig.APPLICATION_ID) + startActivity(intent) + } else { + activity?.let { + val intent = PreferencesActivity.newIntent(it, PreferencesActivity.NOTIFICATION_PREFERENCES) + it.startActivity(intent) + it.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) + } + + } + } + + private inline fun updateAccount(changer: (AccountEntity) -> Unit) { + accountManager.activeAccount?.let { account -> + changer(account) + accountManager.saveAccount(account) + } } private fun syncWithServer(visibility: String? = null, sensitive: Boolean? = null) { @@ -297,17 +328,15 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), return ThemeUtils.getTintedDrawable(requireContext(), iconId, R.attr.iconColor) } - private fun launchFilterActivity(filterContext: String, titleResource: Int): Boolean { + private fun launchFilterActivity(filterContext: String, titleResource: Int) { val intent = Intent(context, FiltersActivity::class.java) intent.putExtra(FiltersActivity.FILTERS_CONTEXT, filterContext) intent.putExtra(FiltersActivity.FILTERS_TITLE, getString(titleResource)) activity?.startActivity(intent) activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) - return true } companion object { fun newInstance() = AccountPreferencesFragment() } - } diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt index db01b0271..800ea7c1d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt @@ -16,80 +16,148 @@ package com.keylesspalace.tusky.fragment.preference import android.os.Bundle -import android.view.View -import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import androidx.preference.SwitchPreferenceCompat import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.components.notifications.NotificationHelper +import com.keylesspalace.tusky.db.AccountEntity import com.keylesspalace.tusky.db.AccountManager import com.keylesspalace.tusky.di.Injectable -import com.keylesspalace.tusky.components.notifications.NotificationHelper +import com.keylesspalace.tusky.settings.PrefKeys +import com.keylesspalace.tusky.settings.makePreferenceScreen +import com.keylesspalace.tusky.settings.preferenceCategory +import com.keylesspalace.tusky.settings.switchPreference import javax.inject.Inject -class NotificationPreferencesFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener, Injectable { +class NotificationPreferencesFragment : PreferenceFragmentCompat(), Injectable { @Inject lateinit var accountManager: AccountManager override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.notification_preferences) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val activeAccount = accountManager.activeAccount - - if (activeAccount != null) { - for (pair in mapOf( - "notificationsEnabled" to activeAccount.notificationsEnabled, - "notificationFilterMentions" to activeAccount.notificationsMentioned, - "notificationFilterFollows" to activeAccount.notificationsFollowed, - "notificationFilterFollowRequests" to activeAccount.notificationsFollowRequested, - "notificationFilterReblogs" to activeAccount.notificationsReblogged, - "notificationFilterFavourites" to activeAccount.notificationsFavorited, - "notificationFilterPolls" to activeAccount.notificationsPolls, - "notificationAlertSound" to activeAccount.notificationSound, - "notificationAlertVibrate" to activeAccount.notificationVibration, - "notificationAlertLight" to activeAccount.notificationLight - )) { - (requirePreference(pair.key) as SwitchPreferenceCompat).apply { - isChecked = pair.value - onPreferenceChangeListener = this@NotificationPreferencesFragment + val activeAccount = accountManager.activeAccount ?: return + val context = requireContext() + makePreferenceScreen { + switchPreference { + setTitle(R.string.pref_title_notifications_enabled) + key = PrefKeys.NOTIFICATIONS_ENABLED + isIconSpaceReserved = false + isChecked = activeAccount.notificationsEnabled + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationsEnabled = newValue as Boolean } + if (NotificationHelper.areNotificationsEnabled(context, accountManager)) { + NotificationHelper.enablePullNotifications(context) + } else { + NotificationHelper.disablePullNotifications(context) + } + true } } - } - } - override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { + preferenceCategory(R.string.pref_title_notification_filters) { category -> + category.dependency = PrefKeys.NOTIFICATIONS_ENABLED + category.isIconSpaceReserved = false - val activeAccount = accountManager.activeAccount - - if (activeAccount != null) { - when (preference.key) { - "notificationsEnabled" -> { - activeAccount.notificationsEnabled = newValue as Boolean - if (NotificationHelper.areNotificationsEnabled(preference.context, accountManager)) { - NotificationHelper.enablePullNotifications(preference.context) - } else { - NotificationHelper.disablePullNotifications(preference.context) + switchPreference { + setTitle(R.string.pref_title_notification_filter_follows) + key = PrefKeys.NOTIFICATIONS_FILTER_FOLLOWS + isIconSpaceReserved = false + isChecked = activeAccount.notificationsFollowed + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationsFollowed = newValue as Boolean } + true } } - "notificationFilterMentions" -> activeAccount.notificationsMentioned = newValue as Boolean - "notificationFilterFollows" -> activeAccount.notificationsFollowed = newValue as Boolean - "notificationFilterFollowRequests" -> activeAccount.notificationsFollowRequested = newValue as Boolean - "notificationFilterReblogs" -> activeAccount.notificationsReblogged = newValue as Boolean - "notificationFilterFavourites" -> activeAccount.notificationsFavorited = newValue as Boolean - "notificationFilterPolls" -> activeAccount.notificationsPolls = newValue as Boolean - "notificationAlertSound" -> activeAccount.notificationSound = newValue as Boolean - "notificationAlertVibrate" -> activeAccount.notificationVibration = newValue as Boolean - "notificationAlertLight" -> activeAccount.notificationLight = newValue as Boolean - } - accountManager.saveAccount(activeAccount) - return true - } - return false + switchPreference { + setTitle(R.string.pref_title_notification_filter_follow_requests) + key = PrefKeys.NOTIFICATION_FILTER_FOLLOW_REQUESTS + isIconSpaceReserved = false + isChecked = activeAccount.notificationsFollowRequested + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationsFollowRequested = newValue as Boolean } + true + } + } + + switchPreference { + setTitle(R.string.pref_title_notification_filter_reblogs) + key = PrefKeys.NOTIFICATION_FILTER_REBLOGS + isIconSpaceReserved = false + isChecked = activeAccount.notificationsReblogged + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationsReblogged = newValue as Boolean } + true + } + } + + switchPreference { + setTitle(R.string.pref_title_notification_filter_favourites) + key = PrefKeys.NOTIFICATION_FILTER_FAVS + isIconSpaceReserved = false + isChecked = activeAccount.notificationsFavorited + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationsFavorited = newValue as Boolean } + true + } + } + + switchPreference { + setTitle(R.string.pref_title_notification_filter_poll) + key = PrefKeys.NOTIFICATION_FILTER_POLLS + isIconSpaceReserved = false + isChecked = activeAccount.notificationsPolls + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationsPolls = newValue as Boolean } + true + } + } + } + + preferenceCategory(R.string.pref_title_notification_alerts) { category -> + category.dependency = PrefKeys.NOTIFICATIONS_ENABLED + category.isIconSpaceReserved = false + + switchPreference { + setTitle(R.string.pref_title_notification_alert_sound) + key = PrefKeys.NOTIFICATION_ALERT_SOUND + isIconSpaceReserved = false + isChecked = activeAccount.notificationSound + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationSound = newValue as Boolean } + true + } + } + + switchPreference { + setTitle(R.string.pref_title_notification_alert_vibrate) + key = PrefKeys.NOTIFICATION_ALERT_VIBRATE + isIconSpaceReserved = false + isChecked = activeAccount.notificationVibration + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationVibration = newValue as Boolean } + true + } + } + + switchPreference { + setTitle(R.string.pref_title_notification_alert_light) + key = PrefKeys.NOTIFICATION_ALERT_LIGHT + isIconSpaceReserved = false + isChecked = activeAccount.notificationLight + setOnPreferenceChangeListener { _, newValue -> + updateAccount { it.notificationLight = newValue as Boolean } + true + } + } + } + } + } + + private inline fun updateAccount(changer: (AccountEntity) -> Unit) { + accountManager.activeAccount?.let { account -> + changer(account) + accountManager.saveAccount(account) + } } companion object { diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt index 825275a1a..60e978111 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt @@ -20,58 +20,178 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.keylesspalace.tusky.PreferencesActivity import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.settings.* import com.keylesspalace.tusky.util.ThemeUtils import com.keylesspalace.tusky.util.getNonNullString import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import com.mikepenz.iconics.utils.colorInt -import com.mikepenz.iconics.utils.sizeRes - -fun PreferenceFragmentCompat.requirePreference(key: String): Preference { - return findPreference(key)!! -} +import com.mikepenz.iconics.utils.sizePx class PreferencesFragment : PreferenceFragmentCompat() { + private val iconSize by lazy { resources.getDimensionPixelSize(R.dimen.preference_icon_size) } + private var httpProxyPref: Preference? = null + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + val context = requireContext() + makePreferenceScreen { + preferenceCategory(R.string.pref_title_appearance_settings) { + listPreference { + setDefaultValue(AppTheme.NIGHT.value) + setEntries(R.array.app_theme_names) + entryValues = AppTheme.stringValues() + key = PrefKeys.APP_THEME + setSummaryProvider { entry } + setTitle(R.string.pref_title_app_theme) + icon = makeIcon(GoogleMaterial.Icon.gmd_palette) + } - addPreferencesFromResource(R.xml.preferences) + emojiPreference { + setDefaultValue("system_default") + setIcon(R.drawable.ic_emoji_24dp) + key = PrefKeys.EMOJI + setSummary(R.string.system_default) + setTitle(R.string.emoji_style) + icon = makeIcon(GoogleMaterial.Icon.gmd_sentiment_satisfied) + } - val themePreference: Preference = requirePreference("appTheme") - themePreference.icon = IconicsDrawable(themePreference.context, GoogleMaterial.Icon.gmd_palette).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(themePreference.context, R.attr.iconColor) } + listPreference { + setDefaultValue("default") + setEntries(R.array.language_entries) + setEntryValues(R.array.language_values) + key = PrefKeys.LANGUAGE + setSummaryProvider { entry } + setTitle(R.string.pref_title_language) + icon = makeIcon(GoogleMaterial.Icon.gmd_translate) + } - val emojiPreference: Preference = requirePreference("emojiCompat") - emojiPreference.icon = IconicsDrawable(emojiPreference.context, GoogleMaterial.Icon.gmd_sentiment_satisfied).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(themePreference.context, R.attr.iconColor) } + listPreference { + setDefaultValue("medium") + setEntries(R.array.status_text_size_names) + setEntryValues(R.array.status_text_size_values) + key = PrefKeys.STATUS_TEXT_SIZE + setSummaryProvider { entry } + setTitle(R.string.pref_status_text_size) + icon = makeIcon(GoogleMaterial.Icon.gmd_format_size) + } - val textSizePreference: Preference = requirePreference("statusTextSize") - textSizePreference.icon = IconicsDrawable(textSizePreference.context, GoogleMaterial.Icon.gmd_format_size).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(themePreference.context, R.attr.iconColor) } + switchPreference { + setDefaultValue(false) + key = PrefKeys.FAB_HIDE + setTitle(R.string.pref_title_hide_follow_button) + isSingleLineTitle = false + } - val timelineFilterPreferences: Preference = requirePreference("timelineFilterPreferences") - timelineFilterPreferences.setOnPreferenceClickListener { - activity?.let { activity -> - val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.TAB_FILTER_PREFERENCES) - activity.startActivity(intent) - activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) + switchPreference { + setDefaultValue(false) + key = PrefKeys.ABSOLUTE_TIME_VIEW + setTitle(R.string.pref_title_absolute_time) + isSingleLineTitle = false + } + + switchPreference { + setDefaultValue(true) + key = PrefKeys.SHOW_BOT_OVERLAY + setTitle(R.string.pref_title_bot_overlay) + isSingleLineTitle = false + icon = ThemeUtils.getTintedDrawable( + context, + R.drawable.ic_bot_24dp, + R.attr.iconColor + ) + } + + switchPreference { + setDefaultValue(false) + key = PrefKeys.ANIMATE_GIF_AVATARS + setTitle(R.string.pref_title_animate_gif_avatars) + isSingleLineTitle = false + } + + switchPreference { + setDefaultValue(true) + key = PrefKeys.USE_BLURHASH + setTitle(R.string.pref_title_gradient_for_media) + isSingleLineTitle = false + } + + switchPreference { + setDefaultValue(true) + key = PrefKeys.SHOW_NOTIFICATIONS_FILTER + setTitle(R.string.pref_title_show_notifications_filter) + isSingleLineTitle = false + setOnPreferenceClickListener { + activity?.let { activity -> + val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.TAB_FILTER_PREFERENCES) + activity.startActivity(intent) + activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) + } + true + } + } + + switchPreference { + setDefaultValue(false) + key = PrefKeys.SHOW_CARDS_IN_TIMELINES + setTitle(R.string.pref_title_confirm_reblogs) + isSingleLineTitle = false + } + + switchPreference { + setDefaultValue(true) + key = PrefKeys.ENABLE_SWIPE_FOR_TABS + setTitle(R.string.pref_title_enable_swipe_for_tabs) + isSingleLineTitle = false + } } - true + + preferenceCategory(R.string.pref_title_browser_settings) { + switchPreference { + setDefaultValue(false) + key = PrefKeys.CUSTOM_TABS + setTitle(R.string.pref_title_custom_tabs) + isSingleLineTitle = false + } + } + + preferenceCategory(R.string.pref_title_timeline_filters) { + preference { + setTitle(R.string.pref_title_status_tabs) + setOnPreferenceClickListener { + activity?.let { activity -> + val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.TAB_FILTER_PREFERENCES) + activity.startActivity(intent) + activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) + } + true + } + } + } + + preferenceCategory(R.string.pref_title_proxy_settings) { + httpProxyPref = preference { + setTitle(R.string.pref_title_http_proxy_settings) + setOnPreferenceClickListener { + activity?.let { activity -> + val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.PROXY_PREFERENCES) + activity.startActivity(intent) + activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) + } + true + } + } + } + } + } + + private fun makeIcon(icon: GoogleMaterial.Icon): IconicsDrawable { + val context = requireContext() + return IconicsDrawable(context, icon).apply { + sizePx = iconSize + colorInt = ThemeUtils.getColor(context, R.attr.iconColor) } - val httpProxyPreferences: Preference = requirePreference("httpProxyPreferences") - httpProxyPreferences.setOnPreferenceClickListener { - activity?.let { activity -> - val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.PROXY_PREFERENCES) - activity.startActivity(intent) - activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left) - } - true - } - - val languagePreference: Preference = requirePreference("language") - languagePreference.icon = IconicsDrawable(languagePreference.context, GoogleMaterial.Icon.gmd_translate).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(themePreference.context, R.attr.iconColor) } - - val botIndicatorPreference = requirePreference("showBotOverlay") - - botIndicatorPreference.icon = ThemeUtils.getTintedDrawable(requireContext(), R.drawable.ic_bot_24dp, R.attr.iconColor) } override fun onResume() { @@ -80,28 +200,23 @@ class PreferencesFragment : PreferenceFragmentCompat() { } private fun updateHttpProxySummary() { - - val httpProxyPref: Preference = requirePreference("httpProxyPreferences") - val sharedPreferences = preferenceManager.sharedPreferences - - val httpProxyEnabled = sharedPreferences.getBoolean("httpProxyEnabled", false) - - val httpServer = sharedPreferences.getNonNullString("httpProxyServer", "") + val httpProxyEnabled = sharedPreferences.getBoolean(PrefKeys.HTTP_PROXY_ENABLED, false) + val httpServer = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_SERVER, "") try { - val httpPort = sharedPreferences.getNonNullString("httpProxyPort", "-1").toInt() + val httpPort = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_PORT, "-1") + .toInt() if (httpProxyEnabled && httpServer.isNotBlank() && httpPort > 0 && httpPort < 65535) { - httpProxyPref.summary = "$httpServer:$httpPort" + httpProxyPref?.summary = "$httpServer:$httpPort" return } } catch (e: NumberFormatException) { // user has entered wrong port, fall back to empty summary } - httpProxyPref.summary = "" - + httpProxyPref?.summary = "" } companion object { diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/ProxyPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/ProxyPreferencesFragment.kt index a4efff2d7..e7ee7ade0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/ProxyPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/ProxyPreferencesFragment.kt @@ -15,61 +15,53 @@ package com.keylesspalace.tusky.fragment.preference -import android.content.SharedPreferences import android.os.Bundle -import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.settings.PrefKeys +import com.keylesspalace.tusky.settings.editTextPreference +import com.keylesspalace.tusky.settings.makePreferenceScreen +import com.keylesspalace.tusky.settings.switchPreference import kotlin.system.exitProcess -class ProxyPreferencesFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener { - +class ProxyPreferencesFragment : PreferenceFragmentCompat() { private var pendingRestart = false - private lateinit var sharedPreferences: SharedPreferences - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.http_proxy_preferences) + makePreferenceScreen { + switchPreference { + setTitle(R.string.pref_title_http_proxy_enable) + isIconSpaceReserved = false + key = PrefKeys.HTTP_PROXY_ENABLED + setDefaultValue(false) + } - sharedPreferences = preferenceManager.sharedPreferences + editTextPreference { + setTitle(R.string.pref_title_http_proxy_server) + key = PrefKeys.HTTP_PROXY_SERVER + isIconSpaceReserved = false + setSummaryProvider { text } + } - } + editTextPreference { + setTitle(R.string.pref_title_http_proxy_port) + key = PrefKeys.HTTP_PROXY_PORT + isIconSpaceReserved = false + setSummaryProvider { text } + } + } - override fun onResume() { - super.onResume() - - sharedPreferences.registerOnSharedPreferenceChangeListener(this) - - updateSummary("httpProxyServer") - updateSummary("httpProxyPort") } override fun onPause() { super.onPause() - - sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) - if (pendingRestart) { pendingRestart = false exitProcess(0) } } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { - updateSummary (key) - } - - private fun updateSummary(key: String) { - when (key) { - "httpProxyServer", "httpProxyPort" -> { - val editTextPreference = requirePreference(key) as EditTextPreference - editTextPreference.summary = editTextPreference.text - } - } - } - companion object { - fun newInstance(): ProxyPreferencesFragment { return ProxyPreferencesFragment() } diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/TabFilterPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/TabFilterPreferencesFragment.kt index 8d92d54bd..cd76300da 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/TabFilterPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/TabFilterPreferencesFragment.kt @@ -15,22 +15,38 @@ package com.keylesspalace.tusky.fragment.preference -import android.content.SharedPreferences import android.os.Bundle import androidx.preference.PreferenceFragmentCompat import com.keylesspalace.tusky.R +import com.keylesspalace.tusky.settings.PrefKeys +import com.keylesspalace.tusky.settings.checkBoxPreference +import com.keylesspalace.tusky.settings.makePreferenceScreen +import com.keylesspalace.tusky.settings.preferenceCategory class TabFilterPreferencesFragment : PreferenceFragmentCompat() { - - private lateinit var sharedPreferences: SharedPreferences - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.timeline_filter_preferences) - sharedPreferences = preferenceManager.sharedPreferences + makePreferenceScreen { + preferenceCategory(R.string.title_home) { category -> + category.isIconSpaceReserved = false + + checkBoxPreference { + setTitle(R.string.pref_title_show_boosts) + key = PrefKeys.TAB_FILTER_HOME_BOOSTS + setDefaultValue(true) + isIconSpaceReserved = false + } + + checkBoxPreference { + setTitle(R.string.pref_title_show_replies) + key = PrefKeys.TAB_FILTER_HOME_REPLIES + setDefaultValue(false) + isIconSpaceReserved = false + } + } + } } companion object { - fun newInstance(): TabFilterPreferencesFragment { return TabFilterPreferencesFragment() } diff --git a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt new file mode 100644 index 000000000..ab60206fe --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt @@ -0,0 +1,56 @@ +package com.keylesspalace.tusky.settings + +enum class AppTheme(val value: String) { + NIGHT("night"), + DAY("day"), + BLACK("black"), + AUTO("auto"), + AUTO_SYSTEM("auto_system"); + + companion object { + fun stringValues() = values().map { it.value }.toTypedArray() + } +} + +object PrefKeys { + // Note: not all of these keys are actually used as SharedPreferences keys but we must give + // each preference a key for it to work. + + const val APP_THEME = "appTheme" + const val EMOJI = "emojiCompat" + const val FAB_HIDE = "fabHide" + const val LANGUAGE = "language" + const val STATUS_TEXT_SIZE = "statusTextSize" + const val ABSOLUTE_TIME_VIEW = "absoluteTimeView" + const val SHOW_BOT_OVERLAY = "showBotOverlay" + const val ANIMATE_GIF_AVATARS = "animateGifAvatars" + const val USE_BLURHASH = "useBlurhash" + const val SHOW_NOTIFICATIONS_FILTER = "showNotificationsFilter" + const val SHOW_CARDS_IN_TIMELINES = "showCardsInTimelines" + const val ENABLE_SWIPE_FOR_TABS = "enableSwipeForTabs" + + const val CUSTOM_TABS = "customTabs" + + const val HTTP_PROXY_ENABLED = "httpProxyEnabled" + const val HTTP_PROXY_SERVER = "httpProxyServer" + const val HTTP_PROXY_PORT = "httpProxyPort" + + const val DEFAULT_POST_PRIVACY = "defaultPostPrivacy" + const val DEFAULT_MEDIA_SENSITIVITY = "defaultMediaSensitivity" + const val MEDIA_PREVIEW_ENABLED = "mediaPreviewEnabled" + const val ALWAYS_SHOW_SENSITIVE_MEDIA = "alwaysShowSensitiveMedia" + const val ALWAYS_OPEN_SPOILER = "alwaysOpenSpoiler" + + const val NOTIFICATIONS_ENABLED = "notificationsEnabled" + const val NOTIFICATION_ALERT_LIGHT = "notificationAlertLight" + const val NOTIFICATION_ALERT_VIBRATE = "notificationAlertVibrate" + const val NOTIFICATION_ALERT_SOUND = "notificationAlertSound" + const val NOTIFICATION_FILTER_POLLS = "notificationFilterPolls" + const val NOTIFICATION_FILTER_FAVS = "notificationFilterFavourites" + const val NOTIFICATION_FILTER_REBLOGS = "notificationFilterReblogs" + const val NOTIFICATION_FILTER_FOLLOW_REQUESTS = "notificationFilterFollowRequests" + const val NOTIFICATIONS_FILTER_FOLLOWS = "notificationFilterFollows" + + const val TAB_FILTER_HOME_REPLIES = "tabFilterHomeBoosts" + const val TAB_FILTER_HOME_BOOSTS = "tabFilterHomeReplies" +} diff --git a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt new file mode 100644 index 000000000..effad5370 --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt @@ -0,0 +1,83 @@ +package com.keylesspalace.tusky.settings + +import android.content.Context +import androidx.annotation.StringRes +import androidx.preference.* +import com.keylesspalace.tusky.EmojiPreference + +class PreferenceParent( + val context: Context, + val addPref: (pref: Preference) -> Unit +) + +inline fun PreferenceParent.preference(builder: Preference.() -> Unit): Preference { + val pref = Preference(context) + addPref(pref) + builder(pref) + return pref +} + +inline fun PreferenceParent.listPreference(builder: ListPreference.() -> Unit): ListPreference { + val pref = ListPreference(context) + addPref(pref) + builder(pref) + return pref +} + +inline fun PreferenceParent.emojiPreference(builder: EmojiPreference.() -> Unit): EmojiPreference { + val pref = EmojiPreference(context) + addPref(pref) + builder(pref) + return pref +} + +inline fun PreferenceParent.switchPreference( + builder: SwitchPreference.() -> Unit +): SwitchPreference { + val pref = SwitchPreference(context) + addPref(pref) + builder(pref) + return pref +} + +inline fun PreferenceParent.editTextPreference( + builder: EditTextPreference.() -> Unit +): EditTextPreference { + val pref = EditTextPreference(context) + addPref(pref) + builder(pref) + return pref +} + +inline fun PreferenceParent.checkBoxPreference( + builder: CheckBoxPreference.() -> Unit +): CheckBoxPreference { + val pref = CheckBoxPreference(context) + addPref(pref) + builder(pref) + return pref +} + +inline fun PreferenceParent.preferenceCategory( + @StringRes title: Int, + builder: PreferenceParent.(PreferenceCategory) -> Unit +) { + val category = PreferenceCategory(context) + addPref(category) + category.setTitle(title) + val newParent = PreferenceParent(context) { category.addPreference(it) } + builder(newParent, category) +} + +inline fun PreferenceFragmentCompat.makePreferenceScreen( + builder: PreferenceParent.() -> Unit +): PreferenceScreen { + val context = requireContext() + val screen = preferenceManager.createPreferenceScreen(context) + val parent = PreferenceParent(context) { screen.addPreference(it) } + // For some functions (like dependencies) it's much easier for us if we attach screen first + // and change it later + preferenceScreen = screen + builder(parent) + return screen +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91fa69c80..c48d7cb23 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -234,7 +234,7 @@ Language Show indicator for bots Animate GIF avatars - Show colorful gradients for hidden media + Show colorful gradients for hidden media Timeline filtering Tabs diff --git a/app/src/main/res/xml/account_preferences.xml b/app/src/main/res/xml/account_preferences.xml deleted file mode 100644 index ec4d2c2ae..000000000 --- a/app/src/main/res/xml/account_preferences.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/xml/http_proxy_preferences.xml b/app/src/main/res/xml/http_proxy_preferences.xml deleted file mode 100644 index fef294266..000000000 --- a/app/src/main/res/xml/http_proxy_preferences.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/notification_preferences.xml b/app/src/main/res/xml/notification_preferences.xml deleted file mode 100644 index fa03f8d1b..000000000 --- a/app/src/main/res/xml/notification_preferences.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml deleted file mode 100644 index dcb37b73c..000000000 --- a/app/src/main/res/xml/preferences.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/xml/timeline_filter_preferences.xml b/app/src/main/res/xml/timeline_filter_preferences.xml deleted file mode 100644 index bbe749d02..000000000 --- a/app/src/main/res/xml/timeline_filter_preferences.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file From 4219871095f6cdeb1d2ae54ab60c492242064442 Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Tue, 9 Jun 2020 19:00:23 +0200 Subject: [PATCH 30/41] Fix preview cards for uncollapsible statuses (#1826) --- .../com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index eba803aec..0519bf564 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -977,7 +977,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { status.getAttachments().size() == 0 && status.getCard() != null && !TextUtils.isEmpty(status.getCard().getUrl()) && - !status.isCollapsed()) { + (!status.isCollapsible() || !status.isCollapsed())) { final Card card = status.getCard(); cardView.setVisibility(View.VISIBLE); cardTitle.setText(card.getTitle()); From ecb94beb3cf656b62f4eccaa1f87d1342db82af6 Mon Sep 17 00:00:00 2001 From: Ivan Kupalov Date: Sun, 14 Jun 2020 19:58:05 +0200 Subject: [PATCH 31/41] Fix settings default values for preferences (#1828) At some point settings DSL was refactored to first add a preference and then run the builder. We shouldn't add a preference to the hierarchy without setting a key for the preference first because preference gets it's default value in `onAttachedToHierarchy()` and if the key is not set then no default value will be set either. This commit changes the order to execute builder (and set the key) first and and preference to the point later. --- .../com/keylesspalace/tusky/settings/SettingsDSL.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 effad5370..438580eed 100644 --- a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt @@ -12,22 +12,22 @@ class PreferenceParent( inline fun PreferenceParent.preference(builder: Preference.() -> Unit): Preference { val pref = Preference(context) - addPref(pref) builder(pref) + addPref(pref) return pref } inline fun PreferenceParent.listPreference(builder: ListPreference.() -> Unit): ListPreference { val pref = ListPreference(context) - addPref(pref) builder(pref) + addPref(pref) return pref } inline fun PreferenceParent.emojiPreference(builder: EmojiPreference.() -> Unit): EmojiPreference { val pref = EmojiPreference(context) - addPref(pref) builder(pref) + addPref(pref) return pref } @@ -35,8 +35,8 @@ inline fun PreferenceParent.switchPreference( builder: SwitchPreference.() -> Unit ): SwitchPreference { val pref = SwitchPreference(context) - addPref(pref) builder(pref) + addPref(pref) return pref } @@ -44,8 +44,8 @@ inline fun PreferenceParent.editTextPreference( builder: EditTextPreference.() -> Unit ): EditTextPreference { val pref = EditTextPreference(context) - addPref(pref) builder(pref) + addPref(pref) return pref } @@ -53,8 +53,8 @@ inline fun PreferenceParent.checkBoxPreference( builder: CheckBoxPreference.() -> Unit ): CheckBoxPreference { val pref = CheckBoxPreference(context) - addPref(pref) builder(pref) + addPref(pref) return pref } From ad4180af2e67ef3ed16682c847c3c60978cc25ae Mon Sep 17 00:00:00 2001 From: Daniele Lira Mereb Date: Mon, 15 Jun 2020 07:22:04 +0000 Subject: [PATCH 32/41] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e051641dc..6cfc2ce1c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -4,8 +4,8 @@ Não pode estar vazio. Instância inválida Falha ao autenticar com esta instância. - Navegador não foi encontrado. - Ocorreu um erro não-identificado de autorização. + Nenhum navegador foi encontrado. + Ocorreu um erro não identificado de autorização. Autorização negada. Falha ao adquirir token de entrada. O toot é muito longo! From a3c84c441a3514b32c0839ec77c4404bf5278354 Mon Sep 17 00:00:00 2001 From: Vegard Skjefstad Date: Mon, 15 Jun 2020 07:22:04 +0000 Subject: [PATCH 33/41] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nb_NO/ Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nb_NO/ --- app/src/main/res/values-no-rNB/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index 86fa89451..30375c778 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -454,4 +454,6 @@ Demp samtale Stikkord Legg til stikkord + %s ønsker å følge deg + Vis fargerike gradienter for skjult media \ No newline at end of file From 7a99c8a83c181c27482db1aa61dde5270d774919 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Mon, 15 Jun 2020 07:22:04 +0000 Subject: [PATCH 34/41] Translated using Weblate (French) Currently translated at 99.7% (421 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/fr/ Translated using Weblate (Kabyle) Currently translated at 58.2% (246 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/kab/ --- app/src/main/res/values-fr/strings.xml | 3 ++- app/src/main/res/values-kab/strings.xml | 17 +++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 475c37d42..b17fb17a0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -404,7 +404,7 @@ Actions pour l’image %s %1$s • %2$s Un sondage auquel vous avez participé vient de se terminer - Sondage avec des choix : %1$s, %2$s, %3$s, %4$s; %5$s + Sondage avec des choix : %1$s, %2$s, %3$s, %4$s ; %5$s Domaines cachés Domaines cachés Masquer %s @@ -476,4 +476,5 @@ Activer les gestes de glissement pour passer d’un onglet à l’autre Hashtags Ajouter hashtag + Afficher des dégradés en couleur pour les médias cachés \ No newline at end of file diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index ee3d1ca03..d8bb6fadf 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -22,12 +22,12 @@ Zeṛ ugar Zeṛ kra kan Ulac walu da. - %s yeṭafar-ik-id + %s yeṭṭafar-ik·ikem-id Err Ugar Azen Ḍfeṛ - Ur ṭafaṛ ara + Ur ṭṭafar ara Ẓreg Kkes Kkes tɛiwdeḍ tira @@ -87,7 +87,7 @@ Amaɣnu n Tusky Tugniwin Tibidyutin - Yeṭafaṛ-ik-id + Yeṭṭafar-ik·ikem-id Kkes Lqem Rnu amiḍan @@ -136,8 +136,8 @@ Sizdeg Imiḍanen Rnu yiwen wefran - Ccetki ɣef @%s - Ccetki fell-as + Cetki ɣef @%s + Cetki fell-as Ggami Yessidired %1$s Bḍu tugna s… @@ -194,7 +194,7 @@ Kemmel Uɣal - Tella-d tuccḍa deg ccetki + Tella-d tuccḍa deg cetki Tucḍa n unadi Assenqed 5 n tisdidin @@ -205,7 +205,7 @@ 3 n wussan 7 n wussan Tafrant %d - Ig ṭafaṛ + Ig ṭṭafar Imeḍfaṛen Nadi ɣef medden ar at ḍfereḍ Imeḍfaṛen @@ -213,7 +213,7 @@ Tibdarin Tibdarin Iseɣwan - Yettwaceyyaɛ! + Yettwaceyyeɛ! Yettwaceyyaɛ! Ula d yiwen n ugmuḍ I yimeḍfaṛen kan @@ -267,4 +267,5 @@ %s n wemdan %s n yemdanen + Bren-it ɣer %s \ No newline at end of file From 3427676a421277ce0ba32162b011babd243cd237 Mon Sep 17 00:00:00 2001 From: nailyk-weblate Date: Mon, 15 Jun 2020 07:22:05 +0000 Subject: [PATCH 35/41] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 2 -- app/src/main/res/values-eo/strings.xml | 2 -- app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 6 ++---- app/src/main/res/values-is/strings.xml | 3 --- app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-no-rNB/strings.xml | 1 - app/src/main/res/values-oc/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - 20 files changed, 2 insertions(+), 27 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 2878766d7..9c3b84dd0 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -468,7 +468,6 @@ أضيف إلى الفواصل المرجعية اختر قائمة القائمة - اظهر ألوانا متدرّجة للوسائط المخفية ليس لديك أية مسودات. ليس لديك أية منشورات مُبرمَجة للنشر. يجب أن يكون حجم الملفات الصوتية أقل مِن 40 ميغابايت. diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 203073ad8..d3577cc38 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -442,7 +442,6 @@ Seleccionar la llista Llista S\'ha produït un error en cercar la publicació %s - Mostra degradats de colors per a contingut multimèdia ocult No tens cap estat planificat. Els fitxers d\'àudio han de ser més petits que 40MB. No tens cap esborrany. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 14dbf31fa..ed0bb58dc 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -428,9 +428,7 @@ Lesezeichen Lesezeichen Lesezeichen - Bunten Farbverlauf für versteckte Medien anzeigen Powered by Tusky - Als Lesezeichen gespeichert Liste auswählen Liste diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index c784ab317..4bdd313af 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -363,7 +363,6 @@ Moviĝi GIF profilbildojn Enketoj Sciigoj pri enketoj kiuj finiĝis - Kradvortoj sen # Viŝi Filtri @@ -450,7 +449,6 @@ Listo Eraro dum elserĉo de la mesaĝo %s Aŭdia dosiero devas esti malpli ol 40MB. - Montri buntajn transirojn por kaŝitaj aŭdovidaĵoj Vi ne havas iun ajn malneton. Vi ne havas iun ajn planitan mesaĝon. Petoj de sekvado diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 18c62c47d..18f95a36f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -446,7 +446,6 @@ Seleccionar lista Lista Los ficheros de audio deben ser menores de 40MB. - Mostrar degradados coloridos para el contenido multimedia oculto No tienes ningún borrador. No tienes ningún estado programado. Mastodon tiene un intervalo de programación mínimo de 5 minutos. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 96cd2a73a..a656ce6bc 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -441,7 +441,6 @@ Laster-markatuta %s geratzen da Audioak 40MB baino gutxiago izan behar ditu. - Erakutsi degradatu koloretsuak ezkutuko multimedia-edukirako Aukeratu zerrenda Zerrenda Ez duzu zirriborrorik. diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index b83e70382..d107b2207 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -437,7 +437,6 @@ نشانک‌ها نشانک نشانک‌ها - نمایش گرادیان رنگی برای رسانهٔ نهفته نشان‌شده گزینش فهرست فهرست diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b17fb17a0..c5853e532 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -455,7 +455,6 @@ Sélectionner la liste Liste Les fichiers audio doivent être inférieurs à 40 Mo. - Afficher des dégradés en couleur pour les médias cachés Vous n’avez aucun brouillon. Vous n’avez aucun pouet planifié. L’intervalle minimum de planification sur Mastodon est de 5 minutes. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 655170dd5..9ca657823 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -367,7 +367,6 @@ Közvetlen Szavazás válaszokkal: %1$s, %2$s, %3$s, %4$s; %5$s Lista neve - Hashtag # nélkül Törlés Szűrés @@ -378,8 +377,8 @@ Műveletek a %s képpel %1$s • %2$s - - + + %s maradt vége %s @@ -444,7 +443,6 @@ Lista kiválasztása Lista A hangfájlok mérete 40MB-nál kisebb kell legyen. - Színes átmenet mutatása rejtett médiánál Nincs egy vázlatod sem. Nincs egy ütemezett tülköd sem. A Mastodonban a legrövidebb ütemezhető időintervallum 5 perc. diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 3b6028509..1b34e0e4b 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -206,7 +206,6 @@ Tungumál Birta merki á róbótum Sýna hreyfingar GIF-auðkennismynda - Sýna skæra litstigla í stað falins myndefnis Síun tímalínu Flipar Sýna endurbirtingar @@ -345,7 +344,6 @@ Ekki er víst að upplýsingarnar hér að neðan endurspegli notandasniðið að fullu. Opnaðu fullt notandasnið í vafra. Losa Festa - Endurbirt af Sett í eftirlæti af %1$s @@ -364,7 +362,6 @@ Beint Könnun með valkostunum: %1$s, %2$s, %3$s, %4$s; %5$s Heiti á lista - Myllumerki án # Veldu lista Listi diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 3aadd3800..268073bf8 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -440,7 +440,6 @@ Ingeplande toots Ingeplande toot Herstellen - Wazige kleurovergangen voor verborgen media tonen Powered by Tusky Altijd toots met tekstwaarschuwingen uitklappen Als bladwijzer toegevoegd diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index 30375c778..172890625 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -433,7 +433,6 @@ Bokmerke lagt til Velg liste Liste - Vis fargegradienter for skjult media Du har ingen planlagte statuser. Du har ikke lagret noen kladder. Lydfiler må være mindre enn 40MB. diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index bca476e9a..fbb7b2e5c 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -445,7 +445,6 @@ Seleccionar la list Lista Los fichièrs àudio devon èsser inferiors a 40 Mo. - Mostrar los degradats de colors pels contenguts resconduts Avètz pas cap de borrolhon. Avètz pas cap de tut planificat. L’interval minimum de planificacion sus Mastodon e de 5 minutas. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 105a70748..c85620e87 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -452,7 +452,6 @@ Wybierz listę Lista Pliki audio muszą być mniejsze niż 40MB. - Pokaż kolorowe gradienty dla ukrytych mediów Nie masz żadnych szkiców. Nie masz żadnych zaplanowanych wpisów. Mastodon umożliwia wysłanie minimalnie 5 minut od zaplanowania diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6cfc2ce1c..0cc775e3b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -443,7 +443,6 @@ Salvo Selecionar lista Lista - Mostrar blur em mídias ocultas Sem toots agendados. Áudios devem ser menores que 40MB. Sem rascunhos. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4294705f2..849486268 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -471,7 +471,6 @@ Выбрать список Список Аудиофайлы должны быть меньше 40МБ. - Показывать цветные градиенты для скрытых медиа Ошибка поиска поста %s У вас нет черновиков. У вас нет запланированных постов. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 186470c2f..db049f51f 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -450,7 +450,6 @@ Bokmärkt Välj lista Lista - Visa färgglada gradienter för gömd media Du har inga schemalagda statusar. Ljudfiler måste vara mindre än 40MB. Du har inga utkast. diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 9fdd7f355..223cba67b 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -225,7 +225,6 @@ แสดงบูสต์ แท็บ คัดกรองไทม์ไลน์ - แสดงสื่อที่ซ่อนไว้แบบไล่หลากสี อวตาร GIF เคลื่อนไหวได้ แสดงสัญลักษณ์ว่าเป็นบอต ภาษา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index e11e5bf7a..e8a7394b0 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -433,7 +433,6 @@ Alt Metin %s gizleme Alan adından herşeyi gizle - Gizli medya için renkli degradeleri göster Hassas içerikleri göster bitiş %s Bildirilemedi diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 269225385..e337ec975 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -418,7 +418,6 @@ %s 已解除静音 隐藏整个域 动画GIF头像 - 显示隐藏媒体的彩色渐变 由Tusky提供支持 始终扩展标有内容警告的嘟文 整个单词 From 54f4d6bc3421d49409a1f13685b418ef5cd287c8 Mon Sep 17 00:00:00 2001 From: mwkward Date: Mon, 15 Jun 2020 07:22:05 +0000 Subject: [PATCH 36/41] Translated using Weblate (Korean) Currently translated at 92.4% (390 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ko/ --- app/src/main/res/values-ko/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index e17e12efe..e8a86cbf7 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -80,7 +80,7 @@ 다시 시도 닫기 프로필 - 환경설정 + 설정 계정 설정 즐겨찾기 뮤트한 유저 From 01cefdfaf600910e1e1d6ca691df3f2ea1697ba1 Mon Sep 17 00:00:00 2001 From: Connyduck Date: Mon, 15 Jun 2020 07:22:05 +0000 Subject: [PATCH 37/41] Translated using Weblate (German) Currently translated at 97.3% (411 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/de/ --- app/src/main/res/values-de/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ed0bb58dc..b07da7e4a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -446,4 +446,12 @@ "%s möchte dir folgen" Hashtags Hashtag hinzufügen + Bestätigungsdialog vor dem Teilen eines Beitrags + Linkvorschauen in Timelines anzeigen + Wischgeste zum Wechseln zwischen Tabs + + %s Person + %s Personen + + Farbverlauf für versteckte Medien anzeigen \ No newline at end of file From 23b4597d4aa2e1949cb6285362a5c24dc30d13db Mon Sep 17 00:00:00 2001 From: tolstoevsky Date: Mon, 15 Jun 2020 07:22:06 +0000 Subject: [PATCH 38/41] Translated using Weblate (Russian) Currently translated at 100.0% (422 of 422 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ru/ --- app/src/main/res/values-ru/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 849486268..818c05001 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -492,4 +492,7 @@ Показать обсуждение Заглушить обсуждение запрос на подписку от %s + Тэги + Добавить тэг + Отображать цветные градиенты для скрытых изображений \ No newline at end of file From 2aac25be1b9d247d94835b337e0c989872fa6873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9lanie=20Chauvel?= Date: Fri, 12 Jun 2020 00:56:36 +0000 Subject: [PATCH 39/41] Translated using Weblate (French) Currently translated at 77.7% (7 of 9 strings) Translation: Tusky/Tusky-app Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/fr/ --- fastlane/metadata/android/fr/changelogs/61.txt | 6 +++--- fastlane/metadata/android/fr/changelogs/67.txt | 12 ++++++------ fastlane/metadata/android/fr/changelogs/68.txt | 2 +- fastlane/metadata/android/fr/full_description.txt | 12 ++++++------ fastlane/metadata/android/fr/short_description.txt | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/fastlane/metadata/android/fr/changelogs/61.txt b/fastlane/metadata/android/fr/changelogs/61.txt index 92985f62c..10fc025c2 100644 --- a/fastlane/metadata/android/fr/changelogs/61.txt +++ b/fastlane/metadata/android/fr/changelogs/61.txt @@ -1,7 +1,7 @@ Tusky v7.0 - Supporte l'affichage, le vote et les notifications des sondages -- Nouveaux boutons pour filtrer l'onglet des notifications et effacer toutes les notifications -- "Effacer & réécrire" vos propres pouets -- Nouvel indicateur pour les profils robots (peut-être désactivé dans les préférences) +- Nouveaux boutons pour filtrer l’onglet des notifications et effacer toutes les notifications +- « Effacer & réécrire » vos propres pouets +- Nouvel indicateur qui montre si un compte est un robot sur l’image de profil (peut être désactivé dans les préférences) - Nouvelles traductions : Norvégien Bokmål et Slovène. diff --git a/fastlane/metadata/android/fr/changelogs/67.txt b/fastlane/metadata/android/fr/changelogs/67.txt index 1c1f62188..bd4cd18f6 100644 --- a/fastlane/metadata/android/fr/changelogs/67.txt +++ b/fastlane/metadata/android/fr/changelogs/67.txt @@ -1,9 +1,9 @@ Tusky v9.0 -- Vous pouvez désormais créer des sondages depuis Tusky +- Vous pouvez désormais créer des sondages dans Tusky - Recherche améliorée -- Nouvelle option dans les préférences du compte pour toujours étendre les avertissements de contenu -- Les avatars dans le menu de navigation ont désormais une forme de -- Il est désormais possible de signaler des utilisateurs même si ils n'ont jamais posté de status -- Tusky refuse désormais de se connecté via les connections cleartext sur Android 6+ -- Plein de petite corrections de bugs et d'améliorations +- Nouvelle option dans les Préférences du compte pour toujours déplier les avertissements +- Les avatars dans le menu de navigation ont désormais une forme de rectangle arrondi +- Il est désormais possible de signaler des utilisateurs même si ils n'ont jamais posté de statut +- Tusky refuse désormais de se connecter via une connexion non-sécurisée sur Android 6+ +- Plein de petites améliorations et corrections diff --git a/fastlane/metadata/android/fr/changelogs/68.txt b/fastlane/metadata/android/fr/changelogs/68.txt index ae5347589..f3e1b3ffa 100644 --- a/fastlane/metadata/android/fr/changelogs/68.txt +++ b/fastlane/metadata/android/fr/changelogs/68.txt @@ -1,3 +1,3 @@ Tusky v9.1 -Cette mise à jour assure la compatibilité avec Mastodon 3 et améliore les perfomances et la stabilité. +Cette mise à jour assure la compatibilité avec Mastodon 3 et améliore les performances et la stabilité. diff --git a/fastlane/metadata/android/fr/full_description.txt b/fastlane/metadata/android/fr/full_description.txt index bcb624d8f..891faf371 100644 --- a/fastlane/metadata/android/fr/full_description.txt +++ b/fastlane/metadata/android/fr/full_description.txt @@ -2,11 +2,11 @@ Tusky est un client léger pour Mastodon, un serveur de réseau social libre et • Design Material • La plupart de l'API Mastodon est implémentée -• Support multi-comptes -• Thèmes sombre et clair disponibles avec possibilité de basculer automatiquement entre les thèmes en fonction de l'heure -• Brouillons - rédigez des pouets et enregistrez les sous forme de brouillons pour les publier plus tard -• Possibilité de choisir différents styles d'émojis +• Support du multi-compte +• Thèmes sombre et clair avec possibilité de basculer automatiquement en fonction de l'heure +• Brouillons — rédigez des pouets et enregistrez-les pour plus tard +• Choisissez parmi différents styles d'émojis • Optimisé pour toutes les tailles d'écrans -• Entièrement ouvert, aucune dépendance des services Google +• Entièrement ouvert — aucune dépendance non libre comme les services Google -Pour en savoir plus à propos de Mastodon : https://joinmastodon.org/ (Anglais) +Pour en apprendre plus à propos de Mastodon, visitez https://joinmastodon.org/ (anglais) diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt index 2c469b86e..bbc2f4e32 100644 --- a/fastlane/metadata/android/fr/short_description.txt +++ b/fastlane/metadata/android/fr/short_description.txt @@ -1 +1 @@ -Un client multi-comptes pour le réseau social Mastodon +Un client multi-compte pour le réseau social Mastodon From a2d1b333b0726f730fa3295517ef208cc4979b4a Mon Sep 17 00:00:00 2001 From: Yasmany Zapata Perez Date: Mon, 15 Jun 2020 14:16:27 +0000 Subject: [PATCH 40/41] Translated using Weblate (Spanish) Currently translated at 44.4% (4 of 9 strings) Translation: Tusky/Tusky-app Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/es/ --- fastlane/metadata/android/es/changelogs/72.txt | 9 +++++++++ fastlane/metadata/android/es/full_description.txt | 12 ++++++++++++ fastlane/metadata/android/es/short_description.txt | 1 + fastlane/metadata/android/es/title.txt | 1 + 4 files changed, 23 insertions(+) create mode 100644 fastlane/metadata/android/es/changelogs/72.txt create mode 100644 fastlane/metadata/android/es/full_description.txt create mode 100644 fastlane/metadata/android/es/short_description.txt create mode 100644 fastlane/metadata/android/es/title.txt diff --git a/fastlane/metadata/android/es/changelogs/72.txt b/fastlane/metadata/android/es/changelogs/72.txt new file mode 100644 index 000000000..f56782d94 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/72.txt @@ -0,0 +1,9 @@ +Tusky v11.0 + +- Notificaciones sobre nuevas solicitudes de seguimiento cuando su cuenta está bloqueada +- Nuevas funciones que se pueden alternar en la pantalla de Preferencias: + - deshabilitar deslizar entre pestañas + - muestra un diálogo de confirmación antes de dar un toque + - Mostrar vistas previas de enlaces en líneas de tiempo +- Las conversaciones ahora se pueden silenciar +- Los resultados de la encuesta ahora se calcularán en función de la cantidad de votantes y no de la cantidad t diff --git a/fastlane/metadata/android/es/full_description.txt b/fastlane/metadata/android/es/full_description.txt new file mode 100644 index 000000000..ab3edf81f --- /dev/null +++ b/fastlane/metadata/android/es/full_description.txt @@ -0,0 +1,12 @@ +Tusky es un cliente ligero para Mastodon, un servidor de red social gratuito y de código abierto. + +• Material Design +• La mayoría de las API de Mastodon están implementadas +• Soporte de múltiples cuentas +• Tema oscuro y claro con la posibilidad de cambiar automáticamente según la hora del día +• Borradores - crear los toots y guárdalos para más adelante. +• Elige entre diferentes estilos de emojis +• Optimizado para todos los tamaños de pantalla. +• Completamente de código abierto: sin dependencias no libres como los servicios de Google + +Para obtener más información sobre Mastodon, visite https://joinmastodon.org/ diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es/short_description.txt new file mode 100644 index 000000000..88fb95824 --- /dev/null +++ b/fastlane/metadata/android/es/short_description.txt @@ -0,0 +1 @@ +Un cliente multicuentas para la red social Mastodon diff --git a/fastlane/metadata/android/es/title.txt b/fastlane/metadata/android/es/title.txt new file mode 100644 index 000000000..d3f12e307 --- /dev/null +++ b/fastlane/metadata/android/es/title.txt @@ -0,0 +1 @@ +Turky From 74bd49387849a648c84570bef5d7c89f5f37f5e0 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 18 Jun 2020 11:04:53 +0200 Subject: [PATCH 41/41] add possibility to move the main navigation to the bottom (#1808) * add possibility to move the main navigation to the bottom * add top toolbar with drawer toggle, title and search button --- .../com/keylesspalace/tusky/MainActivity.kt | 112 ++++++++++++------ .../tusky/PreferencesActivity.kt | 2 +- .../java/com/keylesspalace/tusky/TabData.kt | 58 +++++++-- .../preference/PreferencesFragment.kt | 9 ++ .../tusky/settings/SettingsConstants.kt | 1 + .../keylesspalace/tusky/util/ThemeUtils.java | 8 ++ app/src/main/res/layout/activity_main.xml | 43 ++++--- app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/donottranslate.xml | 9 ++ app/src/main/res/values/strings.xml | 5 + 10 files changed, 188 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt index d0d2bf5bc..da818b2cf 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt @@ -31,6 +31,7 @@ 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 import androidx.core.content.pm.ShortcutManagerCompat import androidx.emoji.text.EmojiCompat @@ -59,7 +60,10 @@ import com.keylesspalace.tusky.interfaces.ActionButtonActivity import com.keylesspalace.tusky.interfaces.ReselectableFragment import com.keylesspalace.tusky.pager.MainPagerAdapter import com.keylesspalace.tusky.util.* +import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial +import com.mikepenz.iconics.utils.colorInt +import com.mikepenz.iconics.utils.sizeDp import com.mikepenz.materialdrawer.iconics.iconicsIcon import com.mikepenz.materialdrawer.model.* import com.mikepenz.materialdrawer.model.interfaces.* @@ -89,8 +93,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje private lateinit var drawerToggle: ActionBarDrawerToggle private var notificationTabPosition = 0 - - private var adapter: MainPagerAdapter? = null + private var onTabSelectedListener: OnTabSelectedListener? = null private val emojiInitCallback = object : InitCallback() { override fun onInitialized() { @@ -159,6 +162,19 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje val composeIntent = Intent(applicationContext, ComposeActivity::class.java) startActivity(composeIntent) } + + mainToolbar.menu.add(R.string.action_search).apply { + setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) + icon = IconicsDrawable(this@MainActivity, GoogleMaterial.Icon.gmd_search).apply { + sizeDp = 20 + colorInt = ThemeUtils.getColor(this@MainActivity, android.R.attr.textColorPrimary) + } + setOnMenuItemClickListener { + startActivity(SearchActivity.getIntent(this@MainActivity)) + true + } + } + setupDrawer(savedInstanceState) /* Fetch user info while we're doing other things. This has to be done after setting up the @@ -167,30 +183,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje setupTabs(showNotificationTab) - val pageMargin = resources.getDimensionPixelSize(R.dimen.tab_page_margin) - viewPager.setPageTransformer(MarginPageTransformer(pageMargin)) - - val uswSwipeForTabs = PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean("enableSwipeForTabs", true) - viewPager.isUserInputEnabled = uswSwipeForTabs - - tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener { - override fun onTabSelected(tab: TabLayout.Tab) { - if (tab.position == notificationTabPosition) { - NotificationHelper.clearNotificationsForActiveAccount(this@MainActivity, accountManager) - } - } - - override fun onTabUnselected(tab: TabLayout.Tab) {} - - override fun onTabReselected(tab: TabLayout.Tab) { - val fragment = adapter?.getFragment(tab.position) - if (fragment is ReselectableFragment) { - (fragment as ReselectableFragment).onReselect() - } - } - }) - // Setup push notifications if (NotificationHelper.areNotificationsEnabled(this, accountManager)) { NotificationHelper.enablePullNotifications(this) @@ -376,13 +368,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje startActivityWithSlideInAnimation(ListsActivity.newIntent(context)) } }, - primaryDrawerItem { - nameRes = R.string.action_search - iconicsIcon = GoogleMaterial.Icon.gmd_search - onClick = { - startActivityWithSlideInAnimation(SearchActivity.getIntent(context)) - } - }, primaryDrawerItem { nameRes = R.string.action_access_saved_toot iconRes = R.drawable.ic_notebook @@ -461,20 +446,37 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje } private fun setupTabs(selectNotificationTab: Boolean) { + val preferences = PreferenceManager.getDefaultSharedPreferences(this) + + val activeTabLayout = if(preferences.getString("mainNavPosition", "top") == "bottom") { + val actionBarSize = ThemeUtils.getDimension(this, R.attr.actionBarSize) + val fabMargin = resources.getDimensionPixelSize(R.dimen.fabMargin) + (composeButton.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = actionBarSize + fabMargin + tabLayout.hide() + bottomTabLayout + } else { + bottomNav.hide() + (viewPager.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = 0 + (composeButton.layoutParams as CoordinatorLayout.LayoutParams).anchorId = R.id.viewPager + tabLayout + } + val tabs = accountManager.activeAccount!!.tabPreferences - adapter = MainPagerAdapter(tabs, this) + + val adapter = MainPagerAdapter(tabs, this) viewPager.adapter = adapter - TabLayoutMediator(tabLayout, viewPager, TabConfigurationStrategy { _: TabLayout.Tab?, _: Int -> }).attach() - tabLayout.removeAllTabs() + TabLayoutMediator(activeTabLayout, viewPager, TabConfigurationStrategy { _: TabLayout.Tab?, _: Int -> }).attach() + activeTabLayout.removeAllTabs() for (i in tabs.indices) { - val tab = tabLayout.newTab() + val tab = activeTabLayout.newTab() .setIcon(tabs[i].icon) if (tabs[i].id == LIST) { tab.contentDescription = tabs[i].arguments[1] } else { tab.setContentDescription(tabs[i].text) } - tabLayout.addTab(tab) + activeTabLayout.addTab(tab) + if (tabs[i].id == NOTIFICATIONS) { notificationTabPosition = i if (selectNotificationTab) { @@ -482,6 +484,40 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje } } } + + val pageMargin = resources.getDimensionPixelSize(R.dimen.tab_page_margin) + viewPager.setPageTransformer(MarginPageTransformer(pageMargin)) + + val uswSwipeForTabs = preferences.getBoolean("enableSwipeForTabs", true) + viewPager.isUserInputEnabled = uswSwipeForTabs + + onTabSelectedListener?.let { + activeTabLayout.removeOnTabSelectedListener(it) + } + + onTabSelectedListener = object : OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + if (tab.position == notificationTabPosition) { + NotificationHelper.clearNotificationsForActiveAccount(this@MainActivity, accountManager) + } + + mainToolbar.title = tabs[tab.position].title(this@MainActivity) + } + + override fun onTabUnselected(tab: TabLayout.Tab) {} + + override fun onTabReselected(tab: TabLayout.Tab) { + val fragment = adapter.getFragment(tab.position) + if (fragment is ReselectableFragment) { + (fragment as ReselectableFragment).onReselect() + } + } + }.also { + activeTabLayout.addOnTabSelectedListener(it) + } + + mainToolbar.title = tabs[0].title(this@MainActivity) + } private fun handleProfileClick(profile: IProfile, current: Boolean): Boolean { diff --git a/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt b/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt index 290485bf9..6ba86e2c2 100644 --- a/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt @@ -129,7 +129,7 @@ class PreferencesActivity : BaseActivity(), SharedPreferences.OnSharedPreference } "statusTextSize", "absoluteTimeView", "showBotOverlay", "animateGifAvatars", - "useBlurhash", "showCardsInTimelines", "confirmReblogs", "enableSwipeForTabs" -> { + "useBlurhash", "showCardsInTimelines", "confirmReblogs", "enableSwipeForTabs", "mainNavPosition" -> { restartActivitiesOnExit = true } "language" -> { diff --git a/app/src/main/java/com/keylesspalace/tusky/TabData.kt b/app/src/main/java/com/keylesspalace/tusky/TabData.kt index 0e239c5a5..4bf123b89 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TabData.kt +++ b/app/src/main/java/com/keylesspalace/tusky/TabData.kt @@ -15,6 +15,7 @@ package com.keylesspalace.tusky +import android.content.Context import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.fragment.app.Fragment @@ -36,17 +37,58 @@ data class TabData(val id: String, @StringRes val text: Int, @DrawableRes val icon: Int, val fragment: (List) -> Fragment, - val arguments: List = emptyList()) + val arguments: List = emptyList(), + val title: (Context) -> String = { context -> context.getString(text)} + ) fun createTabDataFromId(id: String, arguments: List = emptyList()): TabData { return when (id) { - HOME -> TabData(HOME, R.string.title_home, R.drawable.ic_home_24dp, { TimelineFragment.newInstance(TimelineFragment.Kind.HOME) }) - NOTIFICATIONS -> TabData(NOTIFICATIONS, R.string.title_notifications, R.drawable.ic_notifications_24dp, { NotificationsFragment.newInstance() }) - LOCAL -> TabData(LOCAL, R.string.title_public_local, R.drawable.ic_local_24dp, { TimelineFragment.newInstance(TimelineFragment.Kind.PUBLIC_LOCAL) }) - FEDERATED -> TabData(FEDERATED, R.string.title_public_federated, R.drawable.ic_public_24dp, { TimelineFragment.newInstance(TimelineFragment.Kind.PUBLIC_FEDERATED) }) - DIRECT -> TabData(DIRECT, R.string.title_direct_messages, R.drawable.ic_reblog_direct_24dp, { ConversationsFragment.newInstance() }) - HASHTAG -> TabData(HASHTAG, R.string.hashtags, R.drawable.ic_hashtag, { args -> TimelineFragment.newHashtagInstance(args) }, arguments) - LIST -> TabData(LIST, R.string.list, R.drawable.ic_list, { args -> TimelineFragment.newInstance(TimelineFragment.Kind.LIST, args.getOrNull(0).orEmpty()) }, arguments) + HOME -> TabData( + HOME, + R.string.title_home, + R.drawable.ic_home_24dp, + { TimelineFragment.newInstance(TimelineFragment.Kind.HOME) } + ) + NOTIFICATIONS -> TabData( + NOTIFICATIONS, + R.string.title_notifications, + R.drawable.ic_notifications_24dp, + { NotificationsFragment.newInstance() } + ) + LOCAL -> TabData( + LOCAL, + R.string.title_public_local, + R.drawable.ic_local_24dp, + { TimelineFragment.newInstance(TimelineFragment.Kind.PUBLIC_LOCAL) } + ) + FEDERATED -> TabData( + FEDERATED, + R.string.title_public_federated, + R.drawable.ic_public_24dp, + { TimelineFragment.newInstance(TimelineFragment.Kind.PUBLIC_FEDERATED) } + ) + DIRECT -> TabData( + DIRECT, + R.string.title_direct_messages, + R.drawable.ic_reblog_direct_24dp, + { ConversationsFragment.newInstance() } + ) + HASHTAG -> TabData( + HASHTAG, + R.string.hashtags, + R.drawable.ic_hashtag, + { args -> TimelineFragment.newHashtagInstance(args) }, + arguments, + { context -> arguments.joinToString(separator = " ") { context.getString(R.string.title_tag, it) }} + ) + LIST -> TabData( + LIST, + R.string.list, + R.drawable.ic_list, + { args -> TimelineFragment.newInstance(TimelineFragment.Kind.LIST, args.getOrNull(0).orEmpty()) }, + arguments, + { arguments.getOrNull(1).orEmpty() } + ) else -> throw IllegalArgumentException("unknown tab type") } } diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt index 60e978111..da459649f 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt @@ -76,6 +76,15 @@ class PreferencesFragment : PreferenceFragmentCompat() { icon = makeIcon(GoogleMaterial.Icon.gmd_format_size) } + listPreference { + setDefaultValue("top") + setEntries(R.array.pref_main_nav_position_options) + setEntryValues(R.array.pref_main_nav_position_values) + key = PrefKeys.MAIN_NAV_POSITION + setSummaryProvider { entry } + setTitle(R.string.pref_main_nav_position) + } + switchPreference { setDefaultValue(false) key = PrefKeys.FAB_HIDE 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 ab60206fe..f3f54ea8b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt @@ -21,6 +21,7 @@ object PrefKeys { const val FAB_HIDE = "fabHide" const val LANGUAGE = "language" const val STATUS_TEXT_SIZE = "statusTextSize" + const val MAIN_NAV_POSITION = "mainNavPosition" const val ABSOLUTE_TIME_VIEW = "absoluteTimeView" const val SHOW_BOT_OVERLAY = "showBotOverlay" const val ANIMATE_GIF_AVATARS = "animateGifAvatars" diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java b/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java index d98259d77..9f7be6214 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java +++ b/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java @@ -16,6 +16,7 @@ package com.keylesspalace.tusky.util; import android.content.Context; +import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; @@ -51,6 +52,13 @@ public class ThemeUtils { } } + public static int getDimension(@NonNull Context context, @AttrRes int attribute) { + TypedArray array = context.obtainStyledAttributes(new int[] { attribute }); + int dimen = array.getDimensionPixelSize(0, -1); + array.recycle(); + return dimen; + } + /** this can be replaced with drawableTint in xml once minSdkVersion >= 23 */ @Nullable public static Drawable getTintedDrawable(@NonNull Context context, @DrawableRes int drawableId, @AttrRes int colorAttr) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 168e41b71..2890dd5c3 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -22,19 +22,17 @@ android:id="@+id/mainToolbar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:contentInsetStartWithNavigation="0dp"> + app:contentInsetStartWithNavigation="0dp" + app:layout_scrollFlags="scroll|enterAlways" /> - - - + @@ -42,15 +40,32 @@ android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_below="@id/tabLayout" + android:layout_marginBottom="?attr/actionBarSize" android:background="?attr/windowBackgroundColor" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> + + + + + + 72dp 108dp + + 16dp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index a561d0e4a..d6412569d 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -110,6 +110,15 @@ ja + + @string/pref_main_nav_position_option_top + @string/pref_main_nav_position_option_bottom + + + + top + bottom + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c48d7cb23..fb4032f43 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -252,6 +252,11 @@ Publishing (synced with server) Failed to sync settings + Main navigation position + Top + Bottom + + Public Unlisted Followers-only