From bdee29f7328a6e25711281ffd2a68d3ac795c373 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 25 Mar 2024 13:26:45 +0100 Subject: [PATCH 001/626] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ca/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 11 +++++- app/src/main/res/values-fi/strings.xml | 2 + app/src/main/res/values-hu/strings.xml | 18 +++++++++ app/src/main/res/values-it/strings.xml | 5 +++ app/src/main/res/values-iw/strings.xml | 44 +++++++++++++++------- app/src/main/res/values-ko/strings.xml | 14 +++++++ app/src/main/res/values-ks/strings.xml | 28 ++++++++++++++ app/src/main/res/values-ky/strings.xml | 4 +- app/src/main/res/values-lb/strings.xml | 3 ++ app/src/main/res/values-mk/strings.xml | 23 +++++++---- app/src/main/res/values-my/strings.xml | 25 ++++++++++++ app/src/main/res/values-nl/strings.xml | 6 +-- app/src/main/res/values-qq/strings.xml | 37 +++++++++--------- app/src/main/res/values-ru/strings.xml | 8 ++++ app/src/main/res/values-se/strings.xml | 6 +-- app/src/main/res/values-sr/strings.xml | 7 ++++ app/src/main/res/values-th/strings.xml | 6 +-- app/src/main/res/values-zh-rTW/strings.xml | 11 +++++- app/src/main/res/values-zh/strings.xml | 3 ++ 20 files changed, 212 insertions(+), 51 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 250597a0d64..ff1fc8f35c1 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -24,6 +24,7 @@ * Ssola * Toniher * Unapersona +* V27t * Vfc * Xavier Dengra --> @@ -1225,6 +1226,7 @@ Alçària px Insereix + Insereix Ajuda Inicia una sessió / uniu-vos a la Viquipèdia Hola %s, sabíeu que tothom pot editar la Viquipèdia? diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index bf39ccf7570..6be20b28d41 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1226,6 +1226,15 @@ Altura px Inserte + Buscar plantillas + Insertar + por ejemplo, %s + %s (opcional) + %s (sugerido) + Aprende más + Las plantillas las generan el usuario y pueden carecer de descripciones completas. + La plantilla \" %s \" aún no tiene descripción. + Esta plantilla carece de <a href=\"%1$s\">TemplateData</a>, y sus parámetros han sido <a href=\"%2$s\">generados automáticamente</a>. En consecuencia, la plantilla y sus parámetros carecen de descripciones. Ayuda Iniciar sesión / unirse a Wikipedia Hola, %s, ¿sabías que todos pueden editar Wikipedia? @@ -1242,6 +1251,7 @@ Tema nuevo Tema posted. Mensajes guardados + Más información sobre los marcadores de posición de mensajes Esta página de discusión está vacía. Responder (Sin asunto) @@ -1388,5 +1398,4 @@ He tenido un problema con la función de recomendación de imagen:\n- [Describe el problema en concreto]\n\nEl resultado que me gustaría ver es:\n- [Describe la solución propuesta] ¿Qué quieres que cambiemos o mejoremos? Esta área está vacía. Alejar <a href=\"#\">el mapa</a> . - Más información sobre los marcadores de posición de mensajes diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 02a8251181c..85f57fa2448 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1233,6 +1233,8 @@ Korkeus kuvapistettä Lisää + esim. %s + Lisätietoja Ohje Kirjaudu sisään / liity Wikipediaan Hei %s, tiesitkö että kuka tahansa voi muokata Wikipediaa? diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index a952207cd3f..f48c618737a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1232,6 +1232,15 @@ Magasság pixel Beszúrás + Sablon keresése + Beszúrás + pl. %s + %s (opcionális) + %s (javasolt) + További információk + A sablonok felhasználók által generált tartalmak, és lehet, hogy nincs teljes leírásuk. + A(z) „%s” sablonnak még nincs leírása. + Ennek a sablonnak nincs <a href=\"%1$s\">TemplateData-leírása</a>, és a paraméterlistája <a href=\"%2$s\">automatikusan generált</a>. Ezért a sablonnak és paramétereinek nincs leírása. Segítség Bejelentkezés/regisztrálás a Wikipédiába Helló %s, tudtad, hogy a Wikipédiát bárki szerkesztheti? @@ -1259,6 +1268,7 @@ Az üzenet elmentve és közzétéve a szerkesztő vitalapján Válassz ki egy meglévő figyelmeztető üzenetet, vagy írj új üzenetet. Mentett üzenetek + Mentett üzenetek Ez a vitalap üres. A beszélgetés itt kezdődik A vitalapok annak megbeszélésére szolgálnak, hogy hogyan lehet a Wikipédia tartalmát a lehető legjobbá tenni. Indíts egy új témát a wikipédisták közösségével való kapcsolódáshoz és együttműködéshez. @@ -1578,6 +1588,14 @@ Elküldés Visszajelzés elküldve. Érintse meg a túlcsordulás menüt, hogy bármikor visszajelzést küldhessél a „Probléma a funkcióval” alatt. + Vandalizmus figyelmeztetés + Tesztszerkesztések + Semleges nézőpont + Automatikus fordítás + Utolsó figyelmeztetés + Szerzői jog megsértésére vonatkozó figyelmeztetés + Szócikk javítási javaslat + Szerkesztés Elfogad Elutasít A lap problémái diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c72046101df..227b5a50054 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1220,6 +1220,11 @@ Altezza px Inserisci + Inserisci + ad esempio %s + %s (facoltativo) + %s (suggerito) + Ulteriori informazioni Aiuto Entra / unisciti a Wikipedia Ciao %s, sapevi che tutti possono modificare Wikipedia? diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 63364af53bf..3f3bac065ff 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -67,7 +67,7 @@ כן לא שיתוף באמצעות - שיתוף דרך + שיתוף באמצעות הופנה מהדף %s היסטוריית גרסאות: %s <b>מ</b> %s @@ -94,17 +94,17 @@ נא לנסות לשנות את <a href=\"#\">המסננים</a> כדי לראות יותר עריכות הצגת לשוניות שינוי שפה - חיפוש בערך + למצוא בערך הוספה לרשימת המעקב לעקוב - הפסקת מעקב + להפסיק לעקוב הצגת דף השיחה דף שיחה הצגת היסטוריית עריכות היסטוריית עריכות הסרה מרשימת המעקב במעקב - איתור בעמוד + למצוא בדף גופן וערכת נושא הוספה לרשימת הקריאה שמירה @@ -179,7 +179,7 @@ שמירה וכניסה לחשבון יציאה מהחשבון יצאת מהחשבון - פעולה זו תוציא אותך מהחשבון בכל המכשירים בהם נכנסת לחשבון. להמשיך? + הפעולה הזאת תוציא אותך מהחשבון בכל המכשירים שנכנסת בהם לחשבון. להמשיך? ביטול יצאת יצאת מוויקיפדיה. להיכנס בחזרה? @@ -307,8 +307,8 @@ נא לקרוא לפני עריכה להציג אוטומטית את ההודעות לעורכים יש ללחוץ על הכפתור הזה כדי לצפות בהודעות לעורכים עבור הערך הזה. - חיפוש הבא - חיפוש הקודם + למצוא את הבא + למצוא את הקודם זה המופע הראשון זה המופע האחרון הערך הזה נפתח בלשונית רקע. @@ -401,7 +401,7 @@ זאת גרסה לקריאה ללא חיבור לרשת של הערך הזה, שנשמרה ב־%s. הופנה מהדף \"%s\" לקבל כיוונים - לא מצאתי אף יישום שנותן הכוונה. + לא מצאתי שום יישום ניווט. הזנת \"לחקור\" תצוגה מקדימה של קישורים התאמה אישית של ההזנה \"לחקור\" @@ -1031,7 +1031,7 @@ תיוג תמונות עוזר לאחרים למצוא אותן. אימות התגים יעזור לאחרים למצוא אותן בוויקישיתוף, מאגר התמונות החופשיות שוויקיפדיה משתמשת בו לתמונות בערכים שלה. רק תגים שאישרת יוּספו לתמונות. - הוסיפו תגים מותאמים אישית לתמונה כדי שיהיה קל יותר למצוא אותה. + יש להוסיף תגים מותאמים אישית לתמונה כדי שיהיה קל יותר למצוא אותה. נא לבחור או להוסיף תגים תואמים תגים שפורסמו חיפוש תגים @@ -1053,7 +1053,7 @@ נראה שכתובת ה־IP שלך (או טווח כתובות ה־IP) חסומה כרגע מעריכת ויקיפדיה. סליחה, %s, יש לעשות לפחות שלוש עריכות ישירות בערכים שבמיזם כדי להשתמש בתכונה הזאת. עצות ותכסיסים לעריכה - עמוד עזרה לעריכות מומלצות + דף עזרה לעריכות מוצעות רצף עריכה צפיות איכות עריכה @@ -1313,13 +1313,22 @@ גובה פיקסל הוספה + חיפוש תבניות + הוספה + למשל %s + %s (לא חובה) + %s (מוצע) + מידע נוסף + התבניות נוצרות על־ידי משתמשים ועשויות להיות חסרות תיאורים מלאים. + לתבנית \"%s עדיין אין תיאור. + בתבנית הזאת אין <a href=\"%1$s\">נתוני תבנית</a>, והפרמטרים שלה <a href=\"%2$s\">נוצרו באופן אוטומטי</a>. בגלל זה לתבנית ולפרמטרים שלה אין תיאורים. עזרה כניסה / הצטרפות לוויקיפדיה - היי %s, הידעת שכולם יכולים לערוך את ויקיפדיה? + שלום %s, הידעת שכולם יכולים לערוך את ויקיפדיה? הידעת שכולם יכולים לערוך את ויקיפדיה? להתחיל רשימת המעקב - מצא ערכים ודפים שהוספת לרשימת המעקב שלך בתפריד \"עוד\" תחת <b>רשימת המעקב</b>. + אפשר למצוא את הערכים ואת הדפים שהוספת לרשימת המעקב שלך בתפריט \"עוד\" תחת <b>רשימת המעקב</b>. אישור אישור ביטול @@ -1341,6 +1350,7 @@ בחירת הודעת אזהרה קיימת או כתיבת הודעה חדשה. הודעות שמורות הודעות שמורות + מידע נוסף על מילוי הודעות דף השיחה הזה ריק. השיחה מתחילה כאן דפי שיחה הם המקום שבו אנשים דנים איך להפוך את התוכן בוויקיפדיה לטוב ביותר שהוא יכול להיות. יש להתחיל בהוספת נושא דיון חדש כדי להתחבר ולשתף פעולה עם קהילה של ויקיפדים. @@ -1689,6 +1699,15 @@ אסור לצנזר הצעה לשיפור הערך שלום {{{username}}}, אני רוצה להודיע לך ששחזרתי אחת או יותר מ[{{{diffLink}}}|התרומות שלך] כי הן לא נראות בונות. אם נראה לך שטעיתי או שיש לך שאלות, באפשרותך להשאיר הודעה ב[[User talk:{{{senderUserName}}}|דף השיחה שלי]]. נא לשים לב לכך שהמשך ההשחתה עלול להוביל להגבלות. + שלום {{{username}}}, משמח אותי שוויקיפדיה משכה את תשומת לבך ושמעניין אותך ללמוד איך לערוך בה. בדיקת העריכה שעשית עבדה; עם זאת, כדאי לזכור שהמטרה של המיזם הזה היא לפתח אנציקלופדיה אמינה ושלמה שכולם יכולים לקבל ממנה מידע. העריכה שלך השפיעה על התוכן, ולכן הוא הוסר.\nאם ברצונך ללמוד איך לערוך את ויקיפדיה, לרשותך עומד [[ויקיפדיה:ארגז חול|ארגז]]. אם היו לך הערות מסוימיות על ערך, המקום הנכון הוא דף השיחה של אותו הערך. + שלום {{{username}}}, חלק מהתרומות שעשית אינן עומדות בניטרליות הנדרשת כדי לציית ל[[Wikipedia:NPOV|מדיניות נקודת המבט הניטרלית]] של הוויקיפדיה הזאת. מהסיבה הזאת, חלק מהתוכן שוּנה או הוסר. נא לשנות את הפסקאות או הסעיפים המציגים נקודת מבט מוטה, ולהחליף אותם בטקסט ניטרלי ואובייקטיבי יותר בהתאם למצופה באנציקלופדיה. + שלום {{{username}}}, חלק מהתרומות שעשית יכולות להיות תרגומי מכונה, וזאת הסיבה שהן שונו או סומנו בתבנית. אם לא ייעשו שיפורים בערך, הוא עלול להימחק.\n\nאם, למרות כל המידע הזה, עדיין יש לך שאלות, נא לא להסס להשאיר הודעה בכתובת [[User talk:{{{senderUserName}}}|דף השיחה שלי]]. לא תריך להתייאש מהאירוע הקטן הזה. התרומות שלך חשובות מאוד לוויקיפדיה. + שלום {{{username}}}, אני מודה לך על עבודתך בוויקיפדיה; עם זאת, שמתי לב שיש לך ב[[ויקיפדיה:אוטוביוגרפיה|ניגוד עניינים]]. ניגוד עניינים הוא חוסר ההתאמה בין יעדי הניטרליות והאמינות של ויקיפדיה לבין מטרות מסוימות של עורכים, אנשים, ישויות או חברות מכל סוג.\n\nכל התרומות במרחב הראשי כפופות למדיניות התוכן של הוויקיפדיה הזאת ([[ויקיפדיה:מה ויקיפדיה איננה|מה ויקיפדיה איננה]]), איכות אנציקלופדית (תוכן בר־אימות ואיסור על מחקר מקורי), שיטת עריכה ([[ויקיפדיה:נקודת מבט נייטרלית|נקודת מבט נייטרלית]]), ומעמד חוקי של תוכן ([[ויקיפדיה:זכויות יוצרים|זכויות יוצרים]]). מצופה מכל מי שמפרסם תוכן לציית למדיניות הזאת בעת יצירה והערכה של תוכן ולכבד ולהניח כוונה טובה בפעולותיהם של מפרסמים אחרים כדי להבטיח שכל כללי המדיניות הזאת מיושמים.\n\nאם נעשות מחשבון עריכות בעת ניגוד עניינים, יש ליישם את המדיניות המתאימה בזהירות יתרה; אחרת, חשבון המשתמש שלך יכול להיחשב לבעל מטרה פרטית ולהיחסם. נא לא להסס לפנות אליי בדף השיחה שלי אם יש לך שאלות. + מכיוון שעשית עריכות הרסניות רבות, זאת האזהרה האחרונה שלך. אם תשחית שוב את ויקיפדיה, ייאסר עליך לערוך. + נראה שהעריכה האחרונה שלך כוללת חומר המוגבל בזכויות יוצרים ללא רשות. נא לוודא שכל התוכן תואם למדיניות [[ויקיפדיה:זכויות יוצרים|זכויות היוצרים]] של הוויקיפדיה הזאת כדי להימנע מהסרה. + שלום {{{username}}}, נראה שהסרת תוכן מוויקיפדיה מבלי להשאיר תקציר עריכה. נא לכתוב תקציר עריכה בכל הוספה או הסרה של תוכן בוויקיפדיה. + שלום {{{username}}}, נראה שהסרת תוכן מבלי לדון בו בדף השיחה של הערך. יש לשים לב לכך שוויקיפדיה אינה מצונזרת, ואין להסיר תוכן רק מכיוון שהוא שנוי במחלוקת. אם נראה לך שהמידע אינו מדויק, נא להגיע להסכמה בדף השיחה של הערך. + שלום {{{username}}}. הערך שלך הוא התחלה מצוינת! כדי לשפר אותו עוד יותר, נא לשקול להוסיף הפניות נוספות למקורות אמינים. זה עוזר לאמת את המידע ומשפר את איכות הערך. נא לעיין בהנחיות של הוויקיפדיה הזאת בנושא [[ויקיפדיה:ביבליוגרפיה|מקורות מהימנים]] לפרטים נוספים. עריכה לקבל לדחות @@ -1717,5 +1736,4 @@ ביטול מה היית רוצה שנשנה או נשפר? האזור הזה ריק. נא להתרחק <a href=\"#\">על המפה</a> . - מידע נוסף על מילוי הודעות diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 1a8f1bb4850..36f622fa46e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1194,6 +1194,13 @@ 높이 px 넣기 + 넣기 + 예: %s + %s (선택 사항) + %s (제안됨) + 더 알아보기 + 틀은 사용자가 생성하였으므로 완전한 설명이 부족할 수 있습니다. + \"%s\" 틀에 설명이 아직 없습니다. 도움말 위키백과에 로그인 / 가입 %s님, 누구나 위키백과를 편집할 수 있다는 사실을 알고 계셨나요? @@ -1521,11 +1528,18 @@ 보통 불만족 기능을 어떻게 개선할 수 있나요? + 문서 편집 역사 피드백 제출 의견이 제출되었습니다. + 문서 훼손 경고 + 중립적 시각 자동 번역 + 이해관계의 충돌 알림 마지막 경고 + 저작권 위반 알림 + 편집 요약 남기기 + 문서 개선 제안 편집 수락 거부 diff --git a/app/src/main/res/values-ks/strings.xml b/app/src/main/res/values-ks/strings.xml index 80937104be4..26db16f410c 100644 --- a/app/src/main/res/values-ks/strings.xml +++ b/app/src/main/res/values-ks/strings.xml @@ -424,6 +424,8 @@ مَحفوٗظ مَنسوٗخ مَحفوٗظ + وُچھِو + ترجِیحات رُکٲوِو بییہٚ ترٲوِو یَلہٕ مَنسوٗخ @@ -431,6 +433,10 @@ اِطلاع اطلاعات (چُھپِتھ) اطلاع کٔرِو تلاش + یَلہٕ کرن + وُنہِ نہٕ + نِشٲنی تھٲوِو پَرنَے + نِشٲنی تھٲوِو پورمُت جَوآب نَظَرِ تَل فِہرِست سِسٹَم @@ -471,6 +477,7 @@ سأری \"وِکیٖ\" سأری \"قٕسم\" %s\'s بَحث صَفہٕ + کیازِ کِہ تُہؠ چھِو پَران کانٛہہ تہِ مَضموٗن کانٛہہ تہِ مَضموٗن مٔذیٖد مَضموٗن @@ -532,6 +539,7 @@ 1 contribution %d شَرکٲژٕ + تَجویٖز دِنہٕ آمٔتؠ اؠڈِٹ مَضموٗنٕچ وَضاحَت لیکھِو مَضموٗنٕچ وَضاحَت لیکھِو (%s) شروعات کٕریٚو @@ -552,8 +560,11 @@ بهترین واریاہ اَصٕل تھیٖک چھُ + تَجویٖز دِنہٕ آمٔتؠ اؠڈِٹ + تَجویٖز دِنہٕ آمٔتؠ اؠڈِٹ کیا چھِ؟ زانٛہہ نہٕ نٔو + تَجویٖز دِنہٕ آمٔتؠ اؠڈِٹ زَبان تٲریٖخ/وَقت شَرکٲژٕ قٕسم: @@ -564,6 +575,7 @@ راتھ تُہؠ چھا خَبَر ہَر کانٛہہ ہیٚکہِ وِکیٖپیٖڈیا اؠڈِٹ کٔرِتھ؟ وِکیٖپیٖڈیاہَس منٛز دٲخل گژھُن / شٲمِل گژھُن + مٔزیٖد تَجویٖز دِنہٕ آمٔتؠ اؠڈِٹ رَپوٹھ کٔرِو رَپوٹھ آے دِنہٕ برٛونٛہہ @@ -777,6 +789,22 @@ شَرکٔژ کُن شَرکٲژٕ: آو سمٕج! + شُکرِیا + رُکُن مولوٗماتھ + <b>اؠدِٹَن ہُنٛد تَعداد</b> %s + بَنٛد + فِلٹَر + رِسیٚٹ + وِکی + سٲری + دَرٕج کٔرِتھ + ہیٚچھَن وٲلؠ صٲرِف + تَجرُبہٕ کار صٲرِف + دَرٕج صٲرِف یِمو 500 کھوتہٕ زیادٕ اؠڑِٹہٕ تہٕ 30 دۄہ کٲم چھِ۔ + تازٕ گردان + تازٕ گردان تسلیٖم کرُن رد کرن + فِہرِست + مَنسوٗخ diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index 31750ded577..695d93c9354 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -107,7 +107,8 @@ Бул барак мындай деңгээлдерде корголгон: %s Бул баракты оңдоого сиздин укугуңуз жок. Бул барак корголгон - Ырастоолор + Параметрлер + Параметрлер «Уикипедия» тиркемеси жөнүндө Купуялык саясаты Колдонуу шарттары @@ -167,6 +168,7 @@ Жокко чыгаруу Кирүү Макул + Параметрлер Жокко чыгаруу Жокко чыгаруу Жокко чыгаруу diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 0dfbc98c89b..67d5ec0fc30 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -1039,6 +1039,9 @@ Héicht px Drasetzen + Drasetzen + z.&nbsp;B %s + %s (Fakultativ) Hëllef Aloggen / bei Wikipedia matmaachen Salut %s, wousst Dir, datt jiddwereen op Wikipedia Ännerunge maache kann? diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index f482fa344e7..1ef7e791400 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -246,7 +246,7 @@ Преведувачи Прилогов го преведоа доброволни преведувачи на <a href=\"https://translatewiki.net\">translatewiki.net</a>. Лиценца - Изворниот код ќе го најдете на <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> и <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> под лиценцата <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Ако не е поинаку наведено, сета содржина се нуди под лиценцата <a href=\"https://creativecommons.org/licenses/by-sa/4.0/deed.mk\">Криејтив комонс Наведи извор-Сподели под исти услови</a>. + Изворниот код ќе го најдете на <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> под лиценцата <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Ако не е поинаку наведено, сета содржина се нуди под лиценцата <a href=\"https://creativecommons.org/licenses/by-sa/4.0/deed.mk\">Криејтив комонс Наведи извор-Сподели под исти услови</a>. Производ на <a href=\"https://wikimediafoundation.org/\">Фондацијата Викимедија</a> За прилогот Страницава е изменета. Дали сигурно сакате да излезете без да ги зачувате направените промени? @@ -1217,6 +1217,15 @@ Висина п Вметни + Пребарај предлошки + Вметни + на пр. %s + %s (незадолжително) + %s (предложено) + Дознајте повеќе + Предлошките се создадени од корисници и може да немаат потполни описи. + Предлошката „%s“ сè уште нема опис. + На оваа предлошка ѝ недостасуваат <a href=\"%1$s\">Предложни податоци</a>, и нејзините параметри се <a href=\"%2$s\">автосоздадени</a>. Поради тоа, предлошката и нејзините параметри немаат описи. Помош Најава / придружување на Википедија Здраво, %s. Дали знаевте дека Википедија може да ја уредува секој? @@ -1245,6 +1254,7 @@ Изберете постоечка предупредувачка порака или напишете нова. Зачувани пораки Зачувани пораки + Дознајте за пополнувачите на пораки Оваа разговорна страница е празна. Разговорот започнува тука Разговорните страници се места кајшто луѓето дискутираат како да ја направат содржината на Википедија што подобра. Почнете нова тема на разговор за да се поврзете и да соработувате со заедница на википедијанци. @@ -1582,14 +1592,14 @@ Предлог за подобрување на статија Здраво {{{username}}}. Сакам да ви соопштам дека вратив еден или повеќе ваши [{{{diffLink}}}|скорешни придонеси] бидејќи не ми делуваат на конструктивни. Ако мислите дека направив грешка или имате прашања, пишете ми на [[User talk:{{{senderUserName}}}|мојата разговорна страница]]. Имајте на ум дека постојаниот вандализам може да доведе до ограничувања. Здраво {{{username}}}. Задоволство ми е што сте заинтересирани за Википедија и сакате да дознаете како да уредувате. Пробното уредување што го направивте работеше; Меѓутоа, треба да имате на ум дека целта на овој проект е да изработи доверлива и сеопфатна енциклопедија која би му служела секому. Вашето уредување ја засегна содржината, па затоа е отстрането.\nАко сакате да дознаете како да ја уредувате Википедија, на располагање ви стои [[Википедија:Песок|уредувачкиот песок]]. Ако вашите коментари се однесуваа на конкретна статија, правилното место за ова е разговорната страница на статијата. - Здраво {{{username}}}. Некои ваши придонеси не ги задоволуваат неутралноста потребна за исполнување на Википедиините правила за [[Википедија:Неутрална гледна точка|неутрална гледна точка]]. Поради оваа причина, некои содржини се изменети или отстранети.\n\nИзменете ги пасусите или одделите кои покажуваат пристрасност, заменувајќи ги со понеутралнен и пообјективен текст во склад со она што се очекува од една енциклопедија. - Здраво {{{username}}}. Некои ваши придонеси веројатно се машински преведени, поради што се изменети или означени со предлошката. Ако некој (вие или друг) не ја подобри статијата, истата може да биде избришана.\n\nДоколку, покрај информациите што ви ги дадов, имате некакви прашања, слободно пишете ми на мојата разговорна страница. Нека не ве обесхрабрува оваа мала случка. Вашите придонеси се многу важни за Википедија. - Здраво {{{username}}}. Ја ценам вашата соработка на Википедија; Меѓутоа, забележав дека имате [[Wikipedia:Conflict_of_interest|судир на интереси]]. Судирот на интереси е нескладност помеѓу целите на Википедија за неутралност и читливост и дадените цели на поединечни уредници, поединци, ентитети или претпријатија од секаков вид.\nСите придонеси во главниот простор се подлежат на критериумите за содржини ([[Википедија:Што не е Википедија|што не е Википедија]]), енциклопедиски квалитет ([[Википедија:Проверливост|проверливост]] и [[Википедија:Без свои истражувања|без свои истражувања]]), уредувачки метод ([[Википедија:Неутрална гледна точка|неутрална гледна точка]]) и законитоста на содржините ([[Википедија:Авторски права|авторски права]]). Сите објавувачи мора да се придржуваат кон овие правила кога создаваат и оценуваат содржини, да покажат уважување и да претпоставуваат добронамерност за дејствата на другите објавувачи за да обезбедиме придржување кон правилата.\n\nАко уредувате во судир на интереси, ќе мора да го примените соодветното правило со особено внимание; Во спротивно, може да сметаме дека вашата сметка е „сметка за лични цели“ и да биде блокирана. Слободно пишете ми на мојата разговорна страница ако имате некакви прашања. + Здраво {{{username}}}. Некои ваши придонеси не ги задоволуваат неутралноста потребна за исполнување на правилата за [[Википедија:Неутрална гледна точка|неутрална гледна точка]] на оваа Википедија. Поради оваа причина, некои содржини се изменети или отстранети. Изменете ги пасусите или одделите кои покажуваат пристрасност, заменувајќи ги со понеутралнен и пообјективен текст во склад со она што се очекува од една енциклопедија. + Здраво {{{username}}}. Некои ваши придонеси веројатно се машински преведени, поради што се изменети или означени со предлошката. Ако некој (вие или друг) не ја подобри статијата, истата може да биде избришана.\n\nДоколку, покрај информациите што ви ги дадов, имате некакви прашања, слободно пишете ми на [[User talk:{{{senderUserName}}}|мојата разговорна страница]]. Нека не ве обесхрабрува оваа мала случка. Вашите придонеси се многу важни за Википедија. + Здраво {{{username}}}. Ја ценам вашата соработка на Википедија; Меѓутоа, забележав дека имате [[Wikipedia:Conflict_of_interest|судир на интереси]]. Судирот на интереси е нескладност помеѓу целите на Википедија за неутралност и читливост и дадените цели на поединечни уредници, поединци, ентитети или претпријатија од секаков вид.\nСите придонеси во главниот простор се подлежат на критериумите за содржини на оваа Википедија ([[Википедија:Што не е Википедија|што не е Википедија]]), енциклопедиски квалитет ([[Википедија:Проверливост|проверливост]] и [[Википедија:Без свои истражувања|без свои истражувања]]), уредувачки метод ([[Википедија:Неутрална гледна точка|неутрална гледна точка]]) и законитоста на содржините ([[Википедија:Авторски права|авторски права]]). Сите објавувачи мора да се придржуваат кон овие правила кога создаваат и оценуваат содржини, да покажат уважување и да претпоставуваат добронамерност за дејствата на другите објавувачи за да обезбедиме придржување кон правилата.\n\nАко уредувате во судир на интереси, ќе мора да го примените соодветното правило со особено внимание; Во спротивно, може да сметаме дека вашата сметка е „сметка за лични цели“ и да биде блокирана. Слободно пишете ми на мојата разговорна страница ако имате некакви прашања. Бидејќи направивте повеќе деструктивни уредувања, ова ќе ви биде последна опомена. Ако повторно ја вандализирате Википедија, уредувањето ќе ви биде забрането. - Се чини дека вашето скорешно уредување вклучува материјал заштитен со авторски права кој сте го искористиле без дозвола. Сета содржина мора да се придржува кон авторскоправните правила на Википедија за да не биде избришана. + Се чини дека вашето скорешно уредување вклучува материјал заштитен со авторски права кој сте го искористиле без дозвола. Сета содржина мора да се придржува кон [[Википедија:Авторски права|авторскоправните]] правила на оваа Википедија за да не биде избришана. Здраво {{{username}}}. Се чини дека отстранивте содржина од Википедија без да внесете опис на уредувањето. Ставајте опис кога додавате или отстранувате содржини. Здраво {{{username}}}. Се чини дека отстранивте содржина без да ја продискутирате на разговорната страница на статијата. Имајте на ум дека Википедија не се цензурира, и дека содржините не се отстрануваат ако се спорни или контроверзни. Ако сметате дека информациите се неточни, постигнете консензус на разговорната страница на статијата. - Your article is a great start! За да ја направите уште подобра, додајте повеќе наводи кон доверливи извори. Ова ќе ни помогне да ги провериме информациите и го подобрува квалитетот на статијата. Погледајте ги насоките за [[Wikipedia:Reliable_sources|доверливи извори]]. + Здраво {{{username}}}. Вашата статија е добар почеток! За да ја направите уште подобра, додајте повеќе наводи кон доверливи извори. Ова ќе ни помогне да ги провериме информациите и го подобрува квалитетот на статијата. Погледајте ги насоките за [[Wikipedia:Reliable_sources|доверливи извори]] на оваа Википедија. Уреди Прифати Одбиј @@ -1618,5 +1628,4 @@ Откажи Што би сакале да промениме или подобриме? Ова подрачје е празно. Оддалечете <a href=\"#\">на картата</a>. - Дознајте за пополнувачите на пораки diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 3844fa61788..7d6c9c2a56a 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -364,6 +364,10 @@ %d ရွေးချယ်ခဲ့။ အမှားတစ်ခု ဖြစ်ခဲ့သည် ဖြုတ်ရန် + ဖတ်ရန် + သိမ်းရန် + သိမ်းဆည်းပြီး + မျှဝေ ဤစာမျက်နှာ မရှိပါ အင်တာနက်သို့ ချိတ်ဆက်နိုင်ခြင်း မရှိပါ။ ဝီကီပီးဒီးယားသို့ ချိတ်ဆက်မရနိုင်ပါ။ သင်၏ နက်ဝတ်ကွန်နက်ရှင်ကိုစစ်ဆေးပါ သို့မဟုတ် ကြုံမှထပ်မံကြိုးစားကြည့်ပါ။ @@ -715,6 +719,7 @@ မီးနူး ဆောင်းပါးများ ဖော်ပြရန် ရုပ်ပုံများကို ပုံစံသတ်မှတ်ရန် + ပြန်လည်ဆန်းစစ် ဆောင်းပါးဖော်ပြချက် ပြန်လည်ဆန်းစစ်ရန် ဖော်ပြချက်ထည့်သွင်းပါ ဖော်ပြချက် တည်းဖြတ်ရန် @@ -829,7 +834,10 @@ ပိုမို၍ အကြံပြုထားသော တည်းဖြတ်မှုများ အကြံပြုထားသော ဖော်ပြချက်များ လုံလောက်မှုမရှိသော သတင်းအချက်အလက် + အစီရင်ခံရန် {{ဗဟုဝုစ်ကိန်း|တစ်=%1$s သွင်ပြင်လက္ခဏာ|%1$s သွင်ပြင်လက္ခဏာများ}} + အခြား + ရှေ့ ဖိုင်စာမျက်နှာ ရုပ်ပုံ ပုံစာ ပေါင်းထည့်ရန် တည်းဖြတ်မှု %s @@ -925,6 +933,7 @@ အကျယ် အမြင့် ထည့်သွင်းရန် + ပိုမို လေ့လာရန် အကူအညီ ဝီကီပီးဒီးယားသို့ လော့ဂ်အင် / ပါဝင်ရန် ဟိုင်း %s၊ ဝီကီပီးဒီးယားကို လူတိုင်းတည်းဖြတ်နိုင်တယ်ဆိုတာ သင်သိပါသလား @@ -997,6 +1006,8 @@ ရွေ့ပြောင်းခဲ့ ကာကွယ်ခဲ့သည် ဖျက်ပြီးပြီ + မှတ်ပုံမတင်ထားသူ + မှတ်ပုံတင်ထားသူ လူသစ်များ လေ့လာသူများ အတွေ့အကြုံရှိ အသုံးပြုသူများ @@ -1029,6 +1040,20 @@ ဆောင်ရွက်ချက်များ သဘောပေါက်ပြီ မျှဝေ... + အသုံးပြုသူ သတင်းအချက်အလက် + အသုံးပြုသူ သတင်းအချက်အလက် + ပိတ်ရန် + မှတ်ပုံမတင်ထားသူ + မှတ်ပုံတင်ထားသူ + အတွေ့အကြုံရှိ အသုံးပြုသူများ + အရေးမကြီးသည့် တည်းဖြတ်မှုများ + ဆောင်းပါး တည်းဖြတ်မှုမှတ်တမ်း + ပိုမို လေ့လာရန် + အကြံပေးရန် + ထည့်သွင်းရန် + အကြံပြုချက် တင်သွင်းခဲ့သည်။ လက်ခံ ပယ်ချရန် + နောက်သို့ ပြန်သွားရန် + မလုပ်တော့ပါ diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e47953ea1d8..e704658a9d0 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -280,7 +280,7 @@ Vertalers Deze app is vertaald door vrijwillige vertalers van <a href=\"https://translatewiki.net\">translatewiki.net</a>. Licentie - Broncode beschikbaar op <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> en <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> onder de <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0 Licetie</a>. Tenzij anders vermeld, is de inhoud beschikbaar onder de licentie <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Naamsvermelding-GelijkDelen</a>. + Broncode beschikbaar op <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> onder de <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0 Licentie</a>. Tenzij anders vermeld, is de inhoud beschikbaar onder de licentie <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Naamsvermelding-GelijkDelen</a>. Een product van de <a href=\"https://wikimediafoundation.org/\">Wikimedia Foundation</a> Over Deze pagina is bewerkt. Weet u zeker dat u wilt afsluiten zonder de wijzigingen op te slaan? @@ -781,8 +781,8 @@ Alle items deselecteren Wikifilter Filter naar type - Alle \"wiki\'s\" - Alle \"types\" + Alle wiki\'s + Alle typen %s\'s overlegpagina Deze functie is offline niet beschikbaar Omdat u hebt gelezen diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index c25e427c796..06a3ea2ba50 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -105,8 +105,8 @@ Menu item for showing list of languages in which this article is available.\n{{Identical|Change language}} Menu item for invoking Find in page on current page plus the hint text for the Find in page control Menu item for adding the current page to the Watchlist. - Menu item for adding the current page to the Watchlist. - Menu item for unwatching the current page (removing it from the Watchlist). + Menu item for adding the current page to the Watchlist. The opposite of {{msg-wm|Wikipedia-android-strings-menu page unwatch}} + Menu item for unwatching the current page (removing it from the Watchlist). The opposite of {{msg-wm|Wikipedia-android-strings-menu page watch}} Menu item text for accessing the article talk page. Menu item text for accessing the article talk page. Menu item text for accessing the article edit history. @@ -1244,13 +1244,22 @@ Label of the custom image height.\n{{identical|Height}} Label of the custom image size suffix. Button of inserting the image to the editor. + Hint text for the search bar in the search templates screen. + Button label for the templates data screen to insert the template. + Hint text for the input field. %s will be replaced by the suggested value. + Hint text for the input field that indicates the parameter for the template is optional. %s will be replaced by the parameter label. + Hint text for the input field that indicates the parameter for the template is suggested. %s will be replaced by the parameter label. Should be consistent with {{msg-mw|Templatedata-doc-param-status-suggested}} + Button label for the learn more button that opens the template page. + Text for the message that indicates the description of the template may be incomplete. + Text for the message that induces the description of the template is empty. %s will be replaced by the name of the template. + Text for the message that indicates the template is missing its template data. %1$s will be replaced by the URL of Template parameters section, and %2$s will be replaced by the URL of Autogenerated parameters section in the Media Wiki User guide page. \"TemplateData\" should be translated similarly to {{msg-mw|Templatedata-helplink}} Main navigation drawer menu label for accessing the app FAQ. Main navigation drawer menu label for logging in or creating an account. Message for the tool tip that shown on the main screen. The %s symbol is replaced with the username. Message for the tool tip that shown on the main screen. Button label for the action on tool tip that shown on the main screen. Title for the Watchlist tooltip that shown on the main screen. - Message for the Watchlist tooltip that shown on the main screen. + Message for the Watchlist tooltip that shown on the main screen. \"More\" is {{msg-wm|Wikipedia-android-strings-nav item more}}. \"Watchlist\" is {{msg-wm|Wikipedia-android-strings-watchlist title}}. Positive action button text in date picker pop-up dialog.\n{{Identical|OK}} Positive action button text in pop-up dialog for text input.\n{{Identical|OK}} Negative action button text in pop-up dialog for text input.\n{{Identical|Cancel}} @@ -1272,6 +1281,7 @@ Message for the dropdown menu that inform the user to select a template from the tempaltes list. Label for the dropdown menu in the compose screen that allows user to select a saved message. Label text for menu option to enter the \'saved messages\' screen. + Label text for external link to message placeholders. Label stating that this talk page is currently empty. Title text for stating that this talk page is currently empty. Content test for stating that this talk page is currently empty. @@ -1608,15 +1618,15 @@ Title text for the ready-to-use user talk message offered to experienced editors to warn another editor about censorship: {{msg-wm|Wikipedia-android-strings-patroller saved message body do not censor}} Title text for the ready-to-use user talk message offered to experienced editors to warn another editor about article improvement suggestion: {{msg-wm|Wikipedia-android-strings-patroller saved message body art imp}} {{doc-important|Please do not translate the keywords formatted in triple braces <nowiki>{{{...}}}</nowiki> and \"User talk\".}}\nReady-to-use user talk message offered to experienced editors to warn another editor about vandalism. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title vandalism}} - Ready-to-use user talk message offered to experienced editors to warn another editor about editing tests. Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link(s). If no link is found, please do not include a link. Editors may add a link(s) to another language wiki\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title editing tests}} - Ready-to-use user talk message offered to experienced editors to warn another editor about a possible violation of wikipedia\'s neutral point of view. Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link(s). If no link is found, please do not include a link. Editors may add a link(s) to another language wiki\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title npov}} + Ready-to-use user talk message offered to experienced editors to warn another editor about editing tests. Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link; you may find a link to your language in the interlanguage links list at [[:w:en:Wikipedia:Sandbox|Wikipedia:Sandbox in the English Wikipedia]]. If no link is found, please do not include a link. Editors may add a link(s) to another language wiki\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title editing tests}} + Ready-to-use user talk message offered to experienced editors to warn another editor about a possible violation of Wikipedia\'s neutral point of view. \"Partial\" means \"biased in favor of a person, side, or point of view\". Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link; you may find a link to your language in the interlanguage links list at [[:w:en:Wikipedia:NPOV|Wikipedia:NPOV in the English Wikipedia]]. If no link is found, please do not include a link or add a link to another language Wikipedia\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title npov}} Ready-to-use user talk message offered to experienced editors to warn another editor about a possible poor quality machine translation. Please do not translate the keywords formatted in triple braces {{{...}}}. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title auto trans}} - Ready-to-use user talk message offered to experienced editors to warn another editor about conflict of interest. Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link(s). If no link is found, please do not include a link. Editors may add a link(s) to another language wiki\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title coi rem}} + Ready-to-use user talk message offered to experienced editors to warn another editor about conflict of interest. Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link; you may find links to your language in the interlanguage links list at these pages in the English Wikipedia:\n* [[:w:en:Wikipedia:Conflict of interest|Wikipedia:Conflict of interest]]\n* [[:w:en:Wikipedia:What Wikipedia is not|Wikipedia:What Wikipedia is not]]\n* [[:w:en:Wikipedia:Verifiability|Wikipedia:Verifiability]]\n* [[:w:en:Wikipedia:No original research|Wikipedia:No original research]]\n* [[:w:en:Wikipedia:Neutral point of view|Wikipedia:Neutral point of view]]\n* [[:w:en:Wikipedia:Copyrights|Wikipedia:Copyrights]]\n\nIf no link is found, please do not include a link. Editors may add a link(s) to another language wiki\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title coi rem}} Ready-to-use user talk message offered to experienced editors to offer a final warning to another editor. This will be used in case where a user has made multiple destructive edits despite multiple warnings. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title final warning}} - Ready-to-use user talk message offered to experienced editors to warn another editor about copyright violation. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title copy vio}} + Ready-to-use user talk message offered to experienced editors to warn another editor about copyright violation. Please include the relevant language version of the link; you may find a link to your language in the interlanguage links list at [[:w:en:Wikipedia:Copyrights|Wikipedia:Copyrights in the English Wikipedia]].\n\nAppears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title copy vio}} Ready-to-use user talk message offered to experienced editors to warn another editor to remind them to leave an edit summary to explain their edit. Please do not translate the keywords formatted in triple braces {{{...}}}. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title edit summary reminder}} Ready-to-use user talk message offered to experienced editors to warn another editor about censorship. Please do not translate the keywords formatted in triple braces {{{...}}}. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title do not censor}} - Ready-to-use user talk message offered to experienced editors to warn another editor about article improvement suggestion. Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link(s). If no link is found, please do not include a link. Editors may add a link(s) to another language wiki\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title art imp}} + Ready-to-use user talk message offered to experienced editors to warn another editor about article improvement suggestion. Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link; you may find a link to your language in the interlanguage links list at [[:w:en:Wikipedia:Reliable sources|Wikipedia:Reliable sources in the English Wikipedia]]. If no link is found, please do not include a link. Editors may add a link(s) to another language wiki\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title art imp}} Label text for editing saved messages. Button label for accepting anonymous data collection. Button label for rejecting anonymous data collection. @@ -1645,15 +1655,4 @@ Negative action button text for places survey dialog Title text for the secondary dialog which is shown as a result of an action on the main dialog for places feature - shown only to users who are very unsatisfied with the feature Empty message for the list in the current map area. Please keep the anchor link around the \"on the map\". - Label text for external link to message placeholders. - Hint text for the search bar in the search templates screen. - Button label for the templates data screen to insert the template. - Hint text for the input field that indicates the parameter for the template is optional. %s will be replaced by the parameter label. - Hint text for the input field that indicates the parameter for the template is suggested. %s will be replaced by the parameter label. - Button label for the learn more button that opens the template page. - Hint text for the input field. %s will be replaced by the suggested value. - Text for the message that indicates the description of the template may be incomplete. - Text for the message that induces the description of the template is empty. %s will be replaced by the name of the template. - Text for the message that indicates the template is missing its template data. %1$s will be replaced by the URL of Template parameters section, and %2$s will be replaced by the URL of Autogenerated parameters section in the mediawiki User guide page. - diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7f91a3eac2b..4e704ccb559 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -10,6 +10,7 @@ * Cat1987 * Dbrant * Diman Russkov +* Dirruw'o * Dyaydyasasha2015 * Edible Melon * Envlh @@ -1309,6 +1310,12 @@ Высота пкс Вставить + Поиск шаблонов + Вставить + %s (необязательно) + %s (рекомендуется) + Шаблоны создаются пользователями и могут не содержать полных описаний. + В этом шаблоне отсутствует <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">TemplateData</a> , а его параметры были <a href=\"<span class=\"notranslate\" translate=\"no\">%2$s \">autogenerated</a> . В результате у шаблона и его параметров отсутствуют описания. Справка Войти в Википедию %s, знаете ли вы, что каждый может редактировать Википедию? @@ -1614,6 +1621,7 @@ Обратная связь Отправить Обратная связь отправлена. + Судя по всему, ваша недавняя правка без разрешения содержит материалы, защищенные авторским правом. Пожалуйста, убедитесь, что весь контент соответствует политике [[Wikipedia:Авторские права|авторское право]] этой Википедии, чтобы избежать удаления. Принять Отклонить Проблемы страницы diff --git a/app/src/main/res/values-se/strings.xml b/app/src/main/res/values-se/strings.xml index 0d655fbcd19..6218a1b3167 100644 --- a/app/src/main/res/values-se/strings.xml +++ b/app/src/main/res/values-se/strings.xml @@ -223,9 +223,9 @@ Ovdačájáhus Gáđa Ráhkat ođđasit - Divui čállinmeattáhusa - Divui giellaoahpa - Lasihii liŋkkaid + Čállinmeattáhus divvojuvvon + Giellaoahppa divvojuvvon + Liŋkkat lasihuvvon Eará Ovttaáigásaš rievdadeapmi Oza čuovvovaš bohtosa diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index dadfc4ea13c..136fbc8dda4 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1200,6 +1200,13 @@ Висина п Уметни + Претрага шаблона + Уметни + нпр. %s + %s (необавезно) + %s (пожељно) + Сазнајте више + Шаблон „%s” још увек нема опис. Помоћ Пријави ме / придружи ме Википедији Здраво, %s! Јесте ли знали да свако може да уређује Википедију? diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 6b987bb9efd..f5c2609ac3f 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -643,8 +643,8 @@ ทำเครื่องหมายว่ายังไม่ได้อ่าน อ่านแล้ว ตัวกรองวิกิ - ทุก \"วิกิ\" - ทุก \"ชนิด\" + วิกิทั้งหมด + ทุกประเภท หน้าคุยของ %s เนื่องจากคุณอ่าน ตัวสุ่ม @@ -856,7 +856,7 @@ เลขที่อยู่ไอพีถูกระงับ แก้ไขล่าสุดเมื่อ ไม่เคย - ใหม่ + ใหม่ การแก้ไขที่แนะนำ เรื่องที่มีส่วนร่วมของ %s ภาษา diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e3a37cd54ff..eff0523a101 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1244,6 +1244,15 @@ 高度 像素 插入 + 搜尋模板 + 插入 + 例如:%s + %s(可選) + %s(建議) + 了解更多 + 模板是由使用者產生,可能缺乏完整的描述。 + 模板「%s」還沒有描述。 + 此模板缺少<a href=\"%1$s\">模板資料</a>,且參數已<a href=\"%2$s\">自動產生</a>。因此模板及參數都缺乏描述。 說明 登入/加入維基百科 嗨 %s,您知道維基百科是每個人都可編輯的嗎? @@ -1272,6 +1281,7 @@ 選擇現有警告訊息或撰寫新的訊息。 已儲存訊息 已儲存訊息 + 了解訊息佔位符 此討論頁面為空。 對話從這裡開始 討論頁是讓人們討論如何將維基百科內容做到最好的地方。請先發起一個新的討論主題,以便和維基人社群聯繫與協作。 @@ -1645,5 +1655,4 @@ 取消 您希望我們改變或改善什麼? 該區域是空的。請在<a href=\"#\">在地圖上</a>縮小。 - 了解訊息佔位符 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 6e6e39bcf02..0feabb8833f 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -62,6 +62,7 @@ * Zhang8569 * Zjzengdongyang * 予弦 +* 人间百态 * 佛壁灯 * 列维劳德 * 水獭很懒 @@ -172,6 +173,7 @@ 在地图上查看 阅读其他语言 有其他%d种语言版本 + CC BY-SA 4.0 一旦发布,即表示您认同<a href=\"%1$s\">使用条款</a>,并采用<a href=\"%2$s\">CC BY-SA 4.0</a>许可协议不可撤销地发表您的贡献。 一旦发布,即表示您认同<a href=\"%1$s\">使用条款</a>,并采用<a href=\"%2$s/\">CC BY-SA 4.0</a>许可协议不可撤销地发表您的贡献。编辑历史会显示您设备的IP地址。如果您<a href=\"https://#login\">登录</a>后编辑,可以更好地保护您的隐私。 编辑将以您设备的 IP 地址发布。如果您<a href=\"https://#login\">登录</a>,您将拥有更多隐私。 @@ -299,6 +301,7 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/zh https://meta.m.wikimedia.org/w/index.php?title=Terms_of_use/zh&variant=zh-cn https://zh.wikipedia.org/wiki/Wikipedia:账号请求 + https://creativecommons.org/licenses/by-sa/4.0/ https://creativecommons.org/publicdomain/zero/1.0/deed.zh https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/zh https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/zh#图片标签 From 3122bc6b7f9d311de79bafa47ecd2362d2021414 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 25 Mar 2024 06:44:14 -0700 Subject: [PATCH 002/626] Use list.partition to make sure the top-matched items show on the to of (#4548) list Co-authored-by: Dmitry Brant --- .../wikipedia/edit/templates/TemplatesSearchViewModel.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchViewModel.kt b/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchViewModel.kt index e7985d31280..a99f6aecce7 100644 --- a/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchViewModel.kt +++ b/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchViewModel.kt @@ -49,12 +49,15 @@ class TemplatesSearchViewModel(bundle: Bundle) : ViewModel() { val recentUsedTemplates = Prefs.recentUsedTemplates.filter { it.wikiSite == wikiSite } return LoadResult.Page(recentUsedTemplates, null, null) } - val query = Namespace.TEMPLATE.name + ":" + searchQuery + "*" + val query = Namespace.TEMPLATE.name + ":" + searchQuery val response = ServiceFactory.get(wikiSite) - .fullTextSearchTemplates(query, params.loadSize, params.key) + .fullTextSearchTemplates("$query*", params.loadSize, params.key) return response.query?.pages?.let { list -> - val results = list.sortedBy { it.index }.map { + val partition = list.partition { it.title.equals(query, true) }.apply { + second.sortedBy { it.index } + } + val results = partition.toList().flatten().map { val pageTitle = PageTitle(wikiSite = wikiSite, _text = it.title, description = it.description) pageTitle.displayText = it.displayTitle(wikiSite.languageCode) pageTitle From c1e831200236aae86f36713c6370f515ff8a97f7 Mon Sep 17 00:00:00 2001 From: Sharvani Haran Date: Mon, 25 Mar 2024 07:20:59 -0700 Subject: [PATCH 003/626] `Edit` call to action in preview sheet for stub articles (#4465) * Strings for the stub feature * Update extract text * UI updates * Chip colors updated * Addresses code review, design review comments * Updated button text * Updated success message for stub article edit * Design review - do not dismiss dialog on return from edit * Show snackbar above overlay * Clean-up and touch-ups. * Duplicate string. --------- Co-authored-by: Sharvani Haran Co-authored-by: Dmitry Brant Co-authored-by: Dmitry Brant --- .../page/linkpreview/LinkPreviewDialog.kt | 50 +++++++++++++------ .../java/org/wikipedia/util/FeedbackUtil.kt | 7 ++- .../main/res/layout/dialog_link_preview.xml | 11 ++++ app/src/main/res/values-qq/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 5 files changed, 54 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt index 0fd12ec2f11..f342dc95430 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt @@ -28,6 +28,8 @@ import org.wikipedia.analytics.metricsplatform.ArticleLinkPreviewInteraction import org.wikipedia.bridge.JavaScriptActionHandler import org.wikipedia.databinding.DialogLinkPreviewBinding import org.wikipedia.dataclient.page.PageSummary +import org.wikipedia.edit.EditHandler +import org.wikipedia.edit.EditSectionActivity import org.wikipedia.gallery.GalleryActivity import org.wikipedia.gallery.GalleryThumbnailScrollView.GalleryViewListener import org.wikipedia.history.HistoryEntry @@ -145,12 +147,26 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV } } + private val requestStubArticleEditLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == EditHandler.RESULT_REFRESH_PAGE) { + overlayView?.let { overlay -> + FeedbackUtil.makeSnackbar(overlay.rootView, getString(R.string.stub_article_edit_saved_successfully)) + .setAnchorView(overlay.secondaryButtonView).show() + } + } + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = DialogLinkPreviewBinding.inflate(inflater, container, false) binding.linkPreviewToolbar.setOnClickListener { goToLinkedPage(false) } binding.linkPreviewOverflowButton.setOnClickListener { setupOverflowMenu() } + binding.linkPreviewEditButton.setOnClickListener { + viewModel.pageTitle.run { + requestStubArticleEditLauncher.launch(EditSectionActivity.newIntent(requireContext(), -1, null, this, Constants.InvokeSource.LINK_PREVIEW_MENU, null)) + } + } L10nUtil.setConditionalLayoutDirection(binding.root, viewModel.pageTitle.wikiSite.languageCode) lifecycleScope.launch { @@ -374,23 +390,25 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV } private fun setPreviewContents(contents: LinkPreviewContents) { - if (!contents.extract.isNullOrEmpty()) { - binding.linkPreviewExtractWebview.setBackgroundColor(Color.TRANSPARENT) - val colorHex = ResourceUtil.colorToCssString( - ResourceUtil.getThemedColor( - requireContext(), - android.R.attr.textColorPrimary - ) - ) - val dir = if (L10nUtil.isLangRTL(viewModel.pageTitle.wikiSite.languageCode)) "rtl" else "ltr" - binding.linkPreviewExtractWebview.loadDataWithBaseURL( - null, - "${JavaScriptActionHandler.getCssStyles(viewModel.pageTitle.wikiSite)}
${contents.extract}
", - "text/html", - "UTF-8", - null + binding.linkPreviewExtractWebview.setBackgroundColor(Color.TRANSPARENT) + val colorHex = ResourceUtil.colorToCssString( + ResourceUtil.getThemedColor( + requireContext(), + android.R.attr.textColorPrimary ) - } + ) + val dir = if (L10nUtil.isLangRTL(viewModel.pageTitle.wikiSite.languageCode)) "rtl" else "ltr" + val editVisibility = contents.extract.isNullOrBlank() && viewModel.pageTitle.namespace() == Namespace.MAIN + binding.linkPreviewEditButton.isVisible = editVisibility + binding.linkPreviewThumbnailGallery.isVisible = !editVisibility + val extract = if (editVisibility) "" + getString(R.string.link_preview_stub_placeholder_text) + "" else contents.extract + binding.linkPreviewExtractWebview.loadDataWithBaseURL( + null, + "${JavaScriptActionHandler.getCssStyles(viewModel.pageTitle.wikiSite)}
$extract
", + "text/html", + "UTF-8", + null + ) contents.title.thumbUrl?.let { binding.linkPreviewThumbnail.visibility = View.VISIBLE ViewUtil.loadImage(binding.linkPreviewThumbnail, it) diff --git a/app/src/main/java/org/wikipedia/util/FeedbackUtil.kt b/app/src/main/java/org/wikipedia/util/FeedbackUtil.kt index 840a1e44a9a..3bb43b4fa9d 100644 --- a/app/src/main/java/org/wikipedia/util/FeedbackUtil.kt +++ b/app/src/main/java/org/wikipedia/util/FeedbackUtil.kt @@ -129,8 +129,7 @@ object FeedbackUtil { views.forEach { it.setOnClickListener(TOOLBAR_ON_CLICK_LISTENER) } } - fun makeSnackbar(activity: Activity, text: CharSequence, duration: Int = LENGTH_DEFAULT, wikiSite: WikiSite = WikipediaApp.instance.wikiSite): Snackbar { - val view = findBestView(activity) + fun makeSnackbar(view: View, text: CharSequence, duration: Int = LENGTH_DEFAULT, wikiSite: WikiSite = WikipediaApp.instance.wikiSite): Snackbar { val snackbar = Snackbar.make(view, StringUtil.fromHtml(text.toString()), duration) val textView = snackbar.view.findViewById(com.google.android.material.R.id.snackbar_text) textView.setLinkTextColor(ResourceUtil.getThemedColor(view.context, R.attr.progressive_color)) @@ -138,6 +137,10 @@ object FeedbackUtil { return snackbar } + fun makeSnackbar(activity: Activity, text: CharSequence, duration: Int = LENGTH_DEFAULT, wikiSite: WikiSite = WikipediaApp.instance.wikiSite): Snackbar { + return makeSnackbar(findBestView(activity), text, duration, wikiSite) + } + fun showToastOverView(view: View, text: CharSequence?, duration: Int): Toast { val toast = Toast.makeText(view.context, text, duration) val v = LayoutInflater.from(view.context).inflate(androidx.appcompat.R.layout.abc_tooltip, null) diff --git a/app/src/main/res/layout/dialog_link_preview.xml b/app/src/main/res/layout/dialog_link_preview.xml index 1e0f4973ce2..1f437dbd908 100755 --- a/app/src/main/res/layout/dialog_link_preview.xml +++ b/app/src/main/res/layout/dialog_link_preview.xml @@ -117,6 +117,17 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="4dp" /> + Negative action button text for places survey dialog Title text for the secondary dialog which is shown as a result of an action on the main dialog for places feature - shown only to users who are very unsatisfied with the feature Empty message for the list in the current map area. Please keep the anchor link around the \"on the map\". + Placeholder text shown to users in the preview dialog of an article, when there isn\'t enough content in the article to show in the preview. + Message text shown to users after a successful edit to a stub article. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 94ad203fd83..365e3b5b8a2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -126,6 +126,7 @@ Your Wikipedia languages Publish changes Edit published! + Edit published! Changes may take time to appear. Edit failed! Retry Cancel @@ -406,6 +407,7 @@ Save Saved Share + This article is a stub, which means there isn\'t enough content in the article to generate a preview. However, you can change that. This page does not exist user page with this exact name. In general, this page should be created and edited by %2$s. If in doubt, please verify that \"%3$s\" exists.]]> Cannot connect to internet From 4b9c173095a01d52ca735a19c6b6a7c90da6e751 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 25 Mar 2024 13:47:00 -0400 Subject: [PATCH 004/626] Follow-up to template flow. (#4546) * Follow-up to template flow. * Whoops. * Put back. * Fix deprecated. * Use correct label when available, instead of key. * Remove unnecessary ellipsize. --------- Co-authored-by: Cooltey Feng --- .../dataclient/mwapi/TemplateDataResponse.kt | 16 ++++++++++------ .../edit/templates/InsertTemplateFragment.kt | 8 +++++--- .../main/res/layout/fragment_insert_template.xml | 3 +-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/wikipedia/dataclient/mwapi/TemplateDataResponse.kt b/app/src/main/java/org/wikipedia/dataclient/mwapi/TemplateDataResponse.kt index 1004b47b7d0..f196c872058 100644 --- a/app/src/main/java/org/wikipedia/dataclient/mwapi/TemplateDataResponse.kt +++ b/app/src/main/java/org/wikipedia/dataclient/mwapi/TemplateDataResponse.kt @@ -24,12 +24,18 @@ class TemplateDataResponse : MwResponse() { val description: String? = null private val params: JsonElement? = null val format: String? = null - @SerialName("notemplatedata") val noTemplateData: Boolean? = null + @SerialName("notemplatedata") val noTemplateData: Boolean = false val getParams: Map? get() { try { - if (noTemplateData != true && params != null && params !is JsonArray) { - return JsonUtil.json.decodeFromJsonElement>(params) + if (params != null && params !is JsonArray) { + return if (noTemplateData) { + JsonUtil.json.decodeFromJsonElement>(params).mapValues { + TemplateDataParam() + } + } else { + JsonUtil.json.decodeFromJsonElement>(params) + } } } catch (e: Exception) { L.d("Error on parsing params $e") @@ -54,8 +60,6 @@ class TemplateDataResponse : MwResponse() { val aliases: List = emptyList() private val deprecated: JsonElement? = null - private val deprecatedAsString get() = deprecated?.jsonPrimitive?.contentOrNull - - val isDeprecated get() = !deprecatedAsString.equals("false", true) + val isDeprecated get() = deprecated != null && !deprecated.jsonPrimitive.contentOrNull.equals("false", true) } } diff --git a/app/src/main/java/org/wikipedia/edit/templates/InsertTemplateFragment.kt b/app/src/main/java/org/wikipedia/edit/templates/InsertTemplateFragment.kt index 7f6c35e61e8..666f17fcd32 100644 --- a/app/src/main/java/org/wikipedia/edit/templates/InsertTemplateFragment.kt +++ b/app/src/main/java/org/wikipedia/edit/templates/InsertTemplateFragment.kt @@ -37,9 +37,11 @@ class InsertTemplateFragment : Fragment() { private fun buildParamsInputFields(templateData: TemplateDataResponse.TemplateData) { activity.updateInsertButton(true) binding.templateDataParamsContainer.removeAllViews() - templateData.getParams?.filter { !it.value.isDeprecated }?.forEach { + templateData.getParams?.filter { + !it.value.isDeprecated + }?.forEach { val itemBinding = ItemInsertTemplateBinding.inflate(layoutInflater) - val labelText = StringUtil.capitalize(it.key) + val labelText = it.value.label.orEmpty().ifEmpty { StringUtil.capitalize(it.key) } itemBinding.root.tag = false if (it.value.required) { itemBinding.textInputLayout.hint = labelText @@ -77,7 +79,7 @@ class InsertTemplateFragment : Fragment() { binding.templateDataTitle.text = StringUtil.removeNamespace(pageTitle.displayText) binding.templateDataDescription.text = StringUtil.fromHtml(getTemplateDescription(templateData)) binding.templateDataDescription.isVisible = !binding.templateDataDescription.text.isNullOrEmpty() - binding.templateDataMissing.isVisible = templateData.noTemplateData == true + binding.templateDataMissing.isVisible = templateData.noTemplateData binding.templateDataMissingText.text = StringUtil.fromHtml(getString(R.string.templates_description_missing_data, getString(R.string.template_parameters_url), getString(R.string.autogenerated_parameters_url))) binding.templateDataMissingText.movementMethod = LinkMovementMethodExt.getExternalLinkMovementMethod() diff --git a/app/src/main/res/layout/fragment_insert_template.xml b/app/src/main/res/layout/fragment_insert_template.xml index 173de05a8ab..63b58f118f3 100644 --- a/app/src/main/res/layout/fragment_insert_template.xml +++ b/app/src/main/res/layout/fragment_insert_template.xml @@ -53,8 +53,7 @@ android:layout_height="wrap_content" android:textColor="?attr/primary_color" android:textSize="14sp" - android:lineSpacingExtra="6sp" - android:ellipsize="end" /> + android:lineSpacingExtra="6sp" /> From fb6a43582d72b15141facfd6948d8bae9b5f2a62 Mon Sep 17 00:00:00 2001 From: Sharvani Haran Date: Tue, 26 Mar 2024 06:37:06 -0700 Subject: [PATCH 005/626] Saved messages flow for edit patrol (#4483) * Added warn click and saved messages changed nav * Build fix * Build fix * Updated the saved messages -> talkReply flow * Change patrol edits screen title * Added new entry points to saved messages * Update translation directives * Updated qq string * Build fix * Removed the use of AddTemplateActivity * qq updated * Preview screen initial commit * Edit preview update * Updated strings * placeholder tags updated * Update preview logic * Created tab layout for templates * underpinnings for localized strings * Updated split lists * Logic update for saved messages * Update edit mode and empty state * Updated strings * Update swipe-to-delete * Build fix * Build fix * Added back missing qq strings * Minor updates * Learn link fix for talk response mode * update the swipe behavior * build fix * Update `undo` snackbar action * Update dialog design * Apply same style to the input field * Addressed design review comments * Update error text * Design review comment addressed * Merge branch 'main' into saved_msgs_design # Conflicts: # app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt # app/src/main/res/layout/activity_talk_reply.xml * Addressed CR comments * Cleaned up menu remains * Code review comments addressed * Code review comments addressed * lint fix * Fix error * Lint fix * Fix styles * Update fab icon * Apply new icon * Post updated body text with correct wikitext * Avoid FAB overlaps the list item * Add isAdded to avoid possible crashes * Adjust variables order and fix post logic * fix lint --------- Co-authored-by: Sharvani Haran Co-authored-by: Cooltey Feng Co-authored-by: cooltey --- app/src/main/AndroidManifest.xml | 5 - .../diff/ArticleEditDetailsFragment.kt | 32 +- .../edit/preview/EditPreviewFragment.kt | 6 +- .../SuggestedEditsCardsFragment.kt | 2 +- .../SuggestedEditsRecentEditsFragment.kt | 8 +- .../org/wikipedia/talk/TalkReplyActivity.kt | 276 ++++++++--------- .../org/wikipedia/talk/TalkReplyViewModel.kt | 35 ++- .../org/wikipedia/talk/db/TalkTemplate.kt | 5 +- .../talk/template/AddTemplateActivity.kt | 284 ------------------ .../talk/template/AddTemplateViewModel.kt | 71 ----- .../talk/template/TalkTemplatesActivity.kt | 16 +- .../talk/template/TalkTemplatesFragment.kt | 270 +++++++++++++---- .../talk/template/TalkTemplatesItemView.kt | 16 +- .../talk/template/TalkTemplatesRepository.kt | 3 + .../template/TalkTemplatesTextInputDialog.kt | 142 ++------- .../talk/template/TalkTemplatesViewModel.kt | 69 ++++- app/src/main/res/drawable/checked.xml | 9 + app/src/main/res/drawable/custom_checkbox.xml | 7 + app/src/main/res/drawable/drag_icon.xml | 9 + .../res/drawable/outline_edit_square_24.xml | 5 + app/src/main/res/drawable/unchecked.xml | 10 + .../main/res/layout/activity_add_template.xml | 121 -------- .../main/res/layout/activity_talk_reply.xml | 91 ++---- .../dialog_talk_templates_text_input.xml | 69 ++--- .../res/layout/fragment_talk_templates.xml | 94 +++++- .../main/res/layout/item_talk_templates.xml | 67 +++-- .../res/layout/view_user_mention_input.xml | 5 +- .../menu/menu_action_mode_talk_templates.xml | 20 +- app/src/main/res/menu/menu_edit_details.xml | 7 +- app/src/main/res/menu/menu_recent_edits.xml | 5 + app/src/main/res/menu/menu_talk_templates.xml | 24 -- app/src/main/res/values-qq/strings.xml | 10 +- app/src/main/res/values/strings.xml | 16 +- .../main/res/values/strings_no_translate.xml | 6 + 34 files changed, 778 insertions(+), 1037 deletions(-) delete mode 100644 app/src/main/java/org/wikipedia/talk/template/AddTemplateActivity.kt delete mode 100644 app/src/main/java/org/wikipedia/talk/template/AddTemplateViewModel.kt create mode 100644 app/src/main/res/drawable/checked.xml create mode 100644 app/src/main/res/drawable/custom_checkbox.xml create mode 100644 app/src/main/res/drawable/drag_icon.xml create mode 100644 app/src/main/res/drawable/outline_edit_square_24.xml create mode 100644 app/src/main/res/drawable/unchecked.xml delete mode 100644 app/src/main/res/layout/activity_add_template.xml delete mode 100644 app/src/main/res/menu/menu_talk_templates.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 70830ab2a2d..53851d512dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -361,11 +361,6 @@ android:name=".talk.template.TalkTemplatesActivity" android:theme="@style/AppTheme" /> - - bounds.top } - private val requestWarn = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || it.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { - viewModel.revisionTo?.let { revision -> - val pageTitle = PageTitle(UserAliasData.valueFor(viewModel.pageTitle.wikiSite.languageCode), revision.user, viewModel.pageTitle.wikiSite) - val message = if (it.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS) { - sendPatrollerExperienceEvent("publish_message_toast", "pt_warning_messages") - R.string.talk_warn_submitted - } else { - sendPatrollerExperienceEvent("publish_message_saved_toast", "pt_warning_messages") - R.string.talk_warn_submitted_and_saved - } - val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(message)) - snackbar.setAction(R.string.patroller_tasks_patrol_edit_snackbar_view) { - sendPatrollerExperienceEvent("publish_message_view_click", "pt_warning_messages") - startActivity(TalkTopicsActivity.newIntent(requireContext(), pageTitle, InvokeSource.DIFF_ACTIVITY)) - } - snackbar.show() - } - } - } - private fun sendPatrollerExperienceEvent(action: String, activeInterface: String, actionData: String = "") { if (viewModel.fromRecentEdits) { PatrollerExperienceEvent.logAction(action, activeInterface, actionData) @@ -350,7 +328,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M sendPatrollerExperienceEvent("warn_init", "pt_toolbar") viewModel.revisionTo?.let { revision -> val pageTitle = PageTitle(UserTalkAliasData.valueFor(viewModel.pageTitle.wikiSite.languageCode), revision.user, viewModel.pageTitle.wikiSite) - requestWarn.launch(TalkReplyActivity.newIntent(requireContext(), pageTitle, null, null, invokeSource = InvokeSource.DIFF_ACTIVITY, fromDiff = true)) + requireActivity().startActivity(TalkTemplatesActivity.newIntent(requireContext(), pageTitle, fromRevisionId = viewModel.revisionFromId, toRevisionId = viewModel.revisionToId)) } } @@ -366,6 +344,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M menu.findItem(R.id.menu_view_edit_history).isVisible = viewModel.fromRecentEdits menu.findItem(R.id.menu_report_feature).isVisible = viewModel.fromRecentEdits menu.findItem(R.id.menu_learn_more).isVisible = viewModel.fromRecentEdits + menu.findItem(R.id.menu_saved_messages).isVisible = viewModel.fromRecentEdits } override fun onMenuItemSelected(item: MenuItem): Boolean { @@ -396,6 +375,11 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M showFeedbackOptionsDialog(true) true } + R.id.menu_saved_messages -> { + val pageTitle = PageTitle(UserTalkAliasData.valueFor(viewModel.pageTitle.wikiSite.languageCode), viewModel.pageTitle.text, viewModel.pageTitle.wikiSite) + requireActivity().startActivity(TalkTemplatesActivity.newIntent(requireContext(), pageTitle, true)) + true + } else -> false } } diff --git a/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.kt b/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.kt index 69a1709fb6e..926a50016dc 100644 --- a/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.kt +++ b/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.kt @@ -22,7 +22,11 @@ import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.okhttp.OkHttpWebViewClient import org.wikipedia.history.HistoryEntry import org.wikipedia.json.JsonUtil -import org.wikipedia.page.* +import org.wikipedia.page.ExclusiveBottomSheetPresenter +import org.wikipedia.page.LinkHandler +import org.wikipedia.page.PageActivity +import org.wikipedia.page.PageTitle +import org.wikipedia.page.PageViewModel import org.wikipedia.page.references.PageReferences import org.wikipedia.page.references.ReferenceDialog import org.wikipedia.util.DeviceUtil diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt index 2d6011db82b..1db7903b199 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt @@ -175,7 +175,7 @@ class SuggestedEditsCardsFragment : Fragment(), MenuProvider, SuggestedEditsItem ADD_IMAGE_TAGS -> getString(R.string.suggested_edits_tag_images) ADD_CAPTION, TRANSLATE_CAPTION -> getString(R.string.suggested_edits_caption_images) IMAGE_RECOMMENDATIONS -> "" - VANDALISM_PATROL -> getString(R.string.patroller_tasks_patrol_edit_title) + VANDALISM_PATROL -> getString(R.string.suggested_edits_edit_patrol) else -> getString(R.string.suggested_edits_describe_articles) } } diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt index b5da9dc1964..09ccfb3a1a5 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt @@ -50,6 +50,7 @@ import org.wikipedia.page.PageTitle import org.wikipedia.settings.Prefs import org.wikipedia.staticdata.UserAliasData import org.wikipedia.talk.UserTalkPopupHelper +import org.wikipedia.talk.template.TalkTemplatesActivity import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.ResourceUtil import org.wikipedia.util.StringUtil @@ -86,7 +87,7 @@ class SuggestedEditsRecentEditsFragment : Fragment(), MenuProvider { _binding = FragmentSuggestedEditsRecentEditsBinding.inflate(inflater, container, false) (requireActivity() as AppCompatActivity).setSupportActionBar(binding.toolbar) - (requireActivity() as AppCompatActivity).supportActionBar!!.title = getString(R.string.patroller_tasks_edits_list_title) + (requireActivity() as AppCompatActivity).supportActionBar!!.title = getString(R.string.suggested_edits_edit_patrol) return binding.root } @@ -173,6 +174,11 @@ class SuggestedEditsRecentEditsFragment : Fragment(), MenuProvider { FeedbackUtil.showAndroidAppEditingFAQ(requireContext()) true } + R.id.menu_saved_messages -> { + val pageTitle = PageTitle(UserAliasData.valueFor(viewModel.wikiSite.languageCode), AccountUtil.userName.orEmpty(), viewModel.wikiSite) + requireActivity().startActivity(TalkTemplatesActivity.newIntent(requireContext(), pageTitle, true)) + true + } R.id.menu_report_feature -> { sendPatrollerExperienceEvent("top_menu_feedback_click", "pt_recent_changes") FeedbackUtil.composeFeedbackEmail(requireContext(), diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index 2ad222d5f0c..b267749de27 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -6,7 +6,6 @@ import android.net.Uri import android.os.Bundle import android.text.TextWatcher import android.view.View -import android.widget.ArrayAdapter import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels @@ -37,7 +36,7 @@ import org.wikipedia.page.LinkMovementMethodExt import org.wikipedia.page.PageActivity import org.wikipedia.page.PageTitle import org.wikipedia.staticdata.TalkAliasData -import org.wikipedia.talk.template.TalkTemplatesActivity +import org.wikipedia.talk.db.TalkTemplate import org.wikipedia.talk.template.TalkTemplatesTextInputDialog import org.wikipedia.util.DeviceUtil import org.wikipedia.util.FeedbackUtil @@ -55,7 +54,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre private lateinit var textWatcher: TextWatcher private lateinit var messagePreviewFragment: EditPreviewFragment - private val viewModel: TalkReplyViewModel by viewModels { TalkReplyViewModel.Factory(intent.extras!!) } + val viewModel: TalkReplyViewModel by viewModels { TalkReplyViewModel.Factory(intent.extras!!) } private var userMentionScrolled = false private var subjectOrBodyModified = false private var savedSuccess = false @@ -80,10 +79,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } } - private val requestManageTalkTemplate = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - viewModel.loadTemplates() - } - private val requestInsertMedia = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == InsertMediaActivity.RESULT_INSERT_MEDIA_SUCCESS) { it.data?.let { data -> @@ -115,32 +110,36 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre supportActionBar?.setDisplayHomeAsUpEnabled(true) title = "" - if (viewModel.isFromDiff) { - binding.talkTemplateContainer.isVisible = true - binding.talkTemplateButton.setOnClickListener { - sendPatrollerExperienceEvent("saved_message_edit_click", "pt_warning_messages") - requestManageTalkTemplate.launch(TalkTemplatesActivity.newIntent(this)) - } - FeedbackUtil.setButtonTooltip(binding.talkTemplateButton) - } else { - binding.talkTemplateContainer.isVisible = false - } - linkHandler = TalkLinkHandler(this) linkHandler.wikiSite = viewModel.pageTitle.wikiSite - textWatcher = binding.replySubjectText.doOnTextChanged { _, _, _, _ -> + textWatcher = binding.replySubjectText.doOnTextChanged { text, _, _, _ -> subjectOrBodyModified = true binding.replySubjectLayout.error = null binding.replyInputView.textInputLayout.error = null setSaveButtonEnabled(binding.replyInputView.editText.text.isNotBlank()) + viewModel.talkTemplatesList.filter { it.subject == text.toString() }.let { + if (viewModel.selectedTemplate == null && it.isNotEmpty()) { + binding.replySubjectLayout.error = getString(R.string.talk_subject_duplicate) + setSaveButtonEnabled(false) + } + } } + binding.replyInputView.editText.addTextChangedListener(textWatcher) binding.replyNextButton.setOnClickListener { onGoNext() } + binding.learnMoreButton.setOnClickListener { + UriUtil.visitInExternalBrowser(this, Uri.parse(getString(R.string.talk_warn_learn_more_url))) + } + + if (viewModel.isFromDiff) { + binding.replyNextButton.text = getString(if (viewModel.templateManagementMode) R.string.talk_templates_new_message_save else R.string.edit_next) + } + binding.replyInputView.wikiSite = viewModel.pageTitle.wikiSite binding.replyInputView.listener = this @@ -160,24 +159,28 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } } - viewModel.loadTemplateData.observe(this) { - if (it is Resource.Success) { - setTalkTemplateSpinnerAdapter() - } else if (it is Resource.Error) { - FeedbackUtil.showError(this, it.throwable) - } - } - viewModel.saveTemplateData.observe(this) { if (it is Resource.Success) { viewModel.talkTemplateSaved = true binding.progressBar.isVisible = true - showPreview() + if (!viewModel.templateManagementMode) { + showEditPreview() + } else { + setResult(RESULT_OK) + finish() + } } else if (it is Resource.Error) { FeedbackUtil.showError(this, it.throwable) } } + viewModel.selectedTemplate?.let { + binding.root.post { + binding.replySubjectText.setText(it.subject) + binding.replyInputView.editText.setText(it.message) + } + } + SyntaxHighlightViewAdapter(this, viewModel.pageTitle, binding.root, binding.replyInputView.editText, binding.editKeyboardOverlay, binding.editKeyboardOverlayFormatting, binding.editKeyboardOverlayHeadings, Constants.InvokeSource.TALK_REPLY_ACTIVITY, requestInsertMedia, true) @@ -205,7 +208,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre private fun onInitialLoad() { setSaveButtonEnabled(false) L10nUtil.setConditionalLayoutDirection(binding.talkScrollContainer, viewModel.pageTitle.wikiSite.languageCode) - + binding.learnMoreButton.isVisible = viewModel.isFromDiff if (viewModel.topic != null) { binding.replyInputView.userNameHints = setOf(viewModel.topic!!.author) } @@ -224,8 +227,10 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } EditAttemptStepEvent.logInit(viewModel.pageTitle) - if (viewModel.isNewTopic) { - title = getString(R.string.talk_new_topic) + if (viewModel.isNewTopic || viewModel.isFromDiff) { + if (viewModel.isNewTopic) { + title = getString(R.string.talk_new_topic) + } binding.replyInputView.textInputLayout.hint = getString(R.string.talk_message_hint) binding.replySubjectLayout.isVisible = true binding.replySubjectLayout.requestFocus() @@ -244,23 +249,14 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } } } + if (viewModel.templateManagementMode) { + supportActionBar?.title = if (viewModel.selectedTemplate == null) getString(R.string.talk_templates_new_message_title) else getString(R.string.talk_templates_edit_message_dialog_title) + } } private fun setToolbarTitle(pageTitle: PageTitle) { - if (messagePreviewFragment.isActive) { - supportActionBar?.title = getString(R.string.edit_preview) - binding.replyNextButton.text = getString(R.string.description_edit_save) - binding.replyNextButton.contentDescription = binding.replyNextButton.text - return - } - binding.replyNextButton.text = getString(R.string.edit_next) - binding.replyNextButton.contentDescription = binding.replyNextButton.text - if (viewModel.isFromDiff) { - supportActionBar?.title = getString(R.string.talk_warn) - return - } val title = StringUtil.fromHtml( - if (viewModel.isNewTopic) pageTitle.namespace.ifEmpty { TalkAliasData.valueFor(pageTitle.wikiSite.languageCode) } + ": " + "${StringUtil.removeNamespace(pageTitle.displayText)}" + if (viewModel.isNewTopic || viewModel.isFromDiff) pageTitle.namespace.ifEmpty { TalkAliasData.valueFor(pageTitle.wikiSite.languageCode) } + ": " + "${StringUtil.removeNamespace(pageTitle.displayText)}" else intent.getStringExtra(EXTRA_PARENT_SUBJECT).orEmpty() ).trim().ifEmpty { getString(R.string.talk_no_subject) } ViewUtil.getTitleViewFromToolbar(binding.replyToolbar)?.let { @@ -273,35 +269,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre supportActionBar?.title = title } - private fun setTalkTemplateSpinnerAdapter() { - val talkTemplateMsgStringId: Int - if (viewModel.talkTemplatesList.isEmpty()) { - talkTemplateMsgStringId = R.string.talk_templates_new_message_description - sendPatrollerExperienceEvent("first_message_init", "pt_warning_messages") - } else { - talkTemplateMsgStringId = R.string.talk_warn_saved_message - sendPatrollerExperienceEvent("message_init", "pt_warning_messages") - } - binding.talkTemplateMessage.text = getString(talkTemplateMsgStringId) - binding.talkTemplateSpinnerLayout.isVisible = viewModel.talkTemplatesList.isNotEmpty() - L10nUtil.setConditionalTextDirection(binding.talkTemplateSpinner, viewModel.pageTitle.wikiSite.languageCode) - val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, viewModel.talkTemplatesList) - binding.talkTemplateSpinner.setAdapter(adapter) - binding.talkTemplateSpinner.setOnClickListener { - DeviceUtil.hideSoftKeyboard(this) - } - binding.talkTemplateSpinner.setOnItemClickListener { _, _, position, _ -> - sendPatrollerExperienceEvent("saved_message_select_click", "pt_warning_messages") - viewModel.selectedTemplate = viewModel.talkTemplatesList[position] - viewModel.selectedTemplate?.let { talkTemplate -> - sendPatrollerExperienceEvent("saved_message_impression", "pt_warning_messages") - binding.replySubjectText.setText(talkTemplate.subject) - binding.replyInputView.editText.setText(talkTemplate.message) - subjectOrBodyModified = false - } - } - } - internal inner class TalkLinkHandler internal constructor(context: Context) : LinkHandler(context) { private var lastX: Int = 0 private var lastY: Int = 0 @@ -339,33 +306,50 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } private fun showSaveDialog(subject: String, body: String) { - TalkTemplatesTextInputDialog(this@TalkReplyActivity, R.string.edit_preview, - R.string.talk_warn_save_dialog_cancel).let { textInputDialog -> + TalkTemplatesTextInputDialog(this@TalkReplyActivity, R.string.talk_templates_new_message_dialog_save, + R.string.talk_warn_save_dialog_dont_save).let { textInputDialog -> textInputDialog.callback = object : TalkTemplatesTextInputDialog.Callback { - override fun onShow(dialog: TalkTemplatesTextInputDialog) { - dialog.setTitleHint(R.string.talk_warn_save_dialog_hint) - dialog.setPositiveButtonEnabled(true) + + override fun onSuccess(subjectText: String) { + if (textInputDialog.isSaveAsNewChecked) { + viewModel.saveTemplate("", subjectText, body) + } else if (textInputDialog.isSaveExistingChecked) { + viewModel.selectedTemplate?.let { + viewModel.updateTemplate(it.title, subject, body, it) + } + } else { + showEditPreview() + } + val messageType = if (textInputDialog.isSaveAsNewChecked) "new" else if (textInputDialog.isSaveExistingChecked) "updated" else "" + sendPatrollerExperienceEvent("publish_message_click", "pt_warning_messages", PatrollerExperienceEvent.getActionDataString(messageType = messageType)) } - override fun onTextChanged(text: CharSequence, dialog: TalkTemplatesTextInputDialog) { - text.toString().trim().let { + override fun onCancel() { + sendPatrollerExperienceEvent("publish_cancel", "pt_warning_messages") + showEditPreview() + } + + override fun onTextChanged(text: String, dialog: TalkTemplatesTextInputDialog) { + if (textInputDialog.isSaveExistingChecked) { + dialog.setError(null) + dialog.setPositiveButtonEnabled(true) + return + } + text.trim().let { when { it.isEmpty() -> { - if (textInputDialog.isSaveExistingChecked) { - return - } dialog.setError(null) dialog.setPositiveButtonEnabled(false) } - viewModel.talkTemplatesList.any { item -> item.title == it } -> { - dialog.setError( - dialog.context.getString( - R.string.talk_templates_new_message_dialog_exists, - it - ) - ) - dialog.setPositiveButtonEnabled(false) + viewModel.talkTemplatesList.any { item -> item.subject == it } -> { + if (textInputDialog.isSaveExistingChecked) { + return + } + dialog.getView().postDelayed({ + dialog.setError(dialog.context.getString(R.string.talk_subject_duplicate)) + dialog.setPositiveButtonEnabled(false) + }, 250) } else -> { @@ -376,31 +360,14 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } } - override fun onSuccess(titleText: CharSequence, subjectText: CharSequence, bodyText: CharSequence) { - if (textInputDialog.isSaveAsNewChecked) { - viewModel.saveTemplate(titleText.toString(), subject, body) - } else if (textInputDialog.isSaveExistingChecked) { - viewModel.selectedTemplate?.let { - viewModel.updateTemplate(it.title, subject, body, it) - } - } else { - showPreview() - } - val messageType = if (textInputDialog.isSaveAsNewChecked) "new" else if (textInputDialog.isSaveExistingChecked) "updated" else "" - sendPatrollerExperienceEvent("publish_message_click", "pt_warning_messages", PatrollerExperienceEvent.getActionDataString(messageType = messageType)) - } - - override fun onCancel() { - sendPatrollerExperienceEvent("publish_cancel", "pt_warning_messages") + override fun onDismiss() { setSaveButtonEnabled(true) } - override fun onDismiss() { - setSaveButtonEnabled(true) + override fun getSubjectText(): String { + return subject } } - textInputDialog.showDialogMessage(false) - textInputDialog.showTemplateCheckboxes(viewModel.selectedTemplate != null) textInputDialog.setTitle(R.string.talk_warn_save_dialog_title) }.show() } @@ -418,7 +385,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre binding.progressBar.isVisible = true setSaveButtonEnabled(false) - viewModel.postReply(subject, body) + viewModel.postReply(subject, getWikitextBody()) return } @@ -437,26 +404,51 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre setSaveButtonEnabled(false) sendPatrollerExperienceEvent("publish_saved_message_click", "pt_warning_messages") DeviceUtil.hideSoftKeyboard(this) - showSaveDialog(subject, body) + if (viewModel.templateManagementMode) { + if (viewModel.selectedTemplate != null && !viewModel.isSavedTemplate) { + viewModel.selectedTemplate?.let { + viewModel.updateTemplate(it.title, subject, body, it) + } + } else { + viewModel.saveTemplate("", subject, body) + } + } else { + if (viewModel.selectedTemplate != null && viewModel.selectedTemplate?.subject == subject && + viewModel.selectedTemplate?.message == body) { + showEditPreview() + } else { + showSaveDialog(subject, body) + } + } } else { + showEditPreview() setSaveButtonEnabled(true) - showPreview() } } - private fun showPreview() { + private fun showEditPreview() { DeviceUtil.hideSoftKeyboard(this) - val subject = binding.replySubjectText.text.toString().trim() - val body = binding.replyInputView.editText.text.toString().trim() + binding.talkScrollContainer.isVisible = false + updateEditLicenseText() + setSaveButtonEnabled(true) + supportActionBar?.title = getString(R.string.edit_preview) + binding.replyNextButton.text = getString(R.string.description_edit_save) + messagePreviewFragment.showPreview(viewModel.pageTitle, getWikitextForPreview()) + EditAttemptStepEvent.logSaveIntent(viewModel.pageTitle) + } - var wikitext = body - if (!binding.replySubjectText.text.isNullOrEmpty()) { - wikitext = "==$subject==\n$wikitext" - } + private fun getWikitextForPreview(): String { + val subject = binding.replySubjectText.text.toString().trim() + val body = getWikitextBody() + return if (subject.isNotEmpty()) "==$subject==\n$body" else body + } - EditAttemptStepEvent.logSaveIntent(viewModel.pageTitle) - messagePreviewFragment.showPreview(viewModel.pageTitle, wikitext) - setToolbarTitle(viewModel.pageTitle) + private fun getWikitextBody(): String { + var body = binding.replyInputView.editText.text.toString().trim() + body = body.replace(getString(R.string.username_wikitext), getString(R.string.wikiText_replace_url, viewModel.pageTitle.prefixedText, "@" + StringUtil.removeNamespace(viewModel.pageTitle.prefixedText))) + body = body.replace(getString(R.string.sender_username_wikitext), AccountUtil.userName.orEmpty()) + body = body.replace(getString(R.string.diff_link_wikitext), viewModel.pageTitle.getWebApiUrl("diff=${viewModel.toRevisionId}&oldid=${viewModel.fromRevisionId}&variant=${viewModel.pageTitle.wikiSite.languageCode}")) + return body } private fun onSaveSuccess(newRevision: Long) { @@ -493,8 +485,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre val text = StringUtil.fromHtml(getString(if (AccountUtil.isLoggedIn) R.string.edit_save_action_license_logged_in else R.string.edit_save_action_license_anon, getString(R.string.terms_of_use_url), getString(R.string.cc_by_sa_4_url))) - binding.licenseText.text = text - binding.licenseText.movementMethod = licenseTextMovementMethod messagePreviewFragment.view?.findViewById(R.id.licenseText)?.apply { this.text = text this.movementMethod = licenseTextMovementMethod @@ -502,11 +492,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } override fun onBackPressed() { - if (messagePreviewFragment.isActive) { - messagePreviewFragment.hide() - setToolbarTitle(viewModel.pageTitle) - return - } setResult(RESULT_BACK_FROM_TOPIC) sendPatrollerExperienceEvent("publish_back", "pt_warning_messages") if (viewModel.isNewTopic && (!binding.replySubjectText.text.isNullOrEmpty() || @@ -523,13 +508,20 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre sendPatrollerExperienceEvent("publish_exit_cancel", "pt_warning_messages") } .show() + } else if (viewModel.isFromDiff && messagePreviewFragment.isActive) { + showProgressBar(true) + binding.talkScrollContainer.isVisible = true + messagePreviewFragment.hide() + setSaveButtonEnabled(true) + binding.replyNextButton.text = getString(R.string.edit_next) + setToolbarTitle(viewModel.pageTitle) + binding.root.postDelayed({ showProgressBar(false) }, 250) } else { super.onBackPressed() } } override fun onUserMentionListUpdate() { - binding.licenseText.isVisible = false binding.talkScrollContainer.post { if (!isDestroyed && !userMentionScrolled) { binding.talkScrollContainer.smoothScrollTo(0, binding.root.height * 4) @@ -540,7 +532,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre override fun onUserMentionComplete() { userMentionScrolled = false - binding.licenseText.isVisible = true } private fun sendPatrollerExperienceEvent(action: String, activeInterface: String, actionData: String = "") { @@ -569,6 +560,11 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre const val RESULT_BACK_FROM_TOPIC = 2 const val RESULT_SAVE_TEMPLATE = 3 const val RESULT_NEW_REVISION_ID = "newRevisionId" + const val TO_REVISION_ID = "toRevisionId" + const val FROM_REVISION_ID = "fromRevisionId" + const val EXTRA_SELECTED_TEMPLATE = "selectedTemplate" + const val EXTRA_TEMPLATE_MANAGEMENT = "templateManagement" + const val EXTRA_SAVED_TEMPLATE = "savedTemplate" // TODO: persist in db. But for now, it's fine to store these for the lifetime of the app. val draftReplies = lruCache(10) @@ -580,7 +576,13 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre invokeSource: Constants.InvokeSource, undoSubject: CharSequence? = null, undoBody: CharSequence? = null, - fromDiff: Boolean = false): Intent { + fromDiff: Boolean = false, + selectedTemplate: TalkTemplate? = null, + toRevisionId: Long = -1, + fromRevisionId: Long = -1, + templateManagementMode: Boolean = false, + isSavedTemplate: Boolean = false + ): Intent { return Intent(context, TalkReplyActivity::class.java) .putExtra(Constants.ARG_TITLE, pageTitle) .putExtra(EXTRA_PARENT_SUBJECT, parentSubject) @@ -588,6 +590,12 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre .putExtra(EXTRA_SUBJECT, undoSubject) .putExtra(EXTRA_BODY, undoBody) .putExtra(EXTRA_FROM_DIFF, fromDiff) + .putExtra(EXTRA_SELECTED_TEMPLATE, selectedTemplate) + .putExtra(EXTRA_TEMPLATE_MANAGEMENT, templateManagementMode) + .putExtra(EXTRA_SAVED_TEMPLATE, isSavedTemplate) + .putExtra(FROM_REVISION_ID, fromRevisionId) + .putExtra(TO_REVISION_ID, toRevisionId) + .putExtra(Constants.INTENT_EXTRA_INVOKE_SOURCE, invokeSource) .putExtra(Constants.INTENT_EXTRA_INVOKE_SOURCE, invokeSource) } } diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt index 6ae442f1499..cdcefb062c4 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt @@ -4,7 +4,10 @@ import android.os.Bundle import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.wikipedia.Constants import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.ServiceFactory @@ -15,21 +18,26 @@ import org.wikipedia.talk.db.TalkTemplate import org.wikipedia.talk.template.TalkTemplatesRepository import org.wikipedia.util.Resource import org.wikipedia.util.SingleLiveData +import org.wikipedia.util.log.L class TalkReplyViewModel(bundle: Bundle) : ViewModel() { private val talkTemplatesRepository = TalkTemplatesRepository(AppDatabase.instance.talkTemplateDao()) var talkTemplateSaved = false val talkTemplatesList = mutableListOf() - var selectedTemplate: TalkTemplate? = null val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! val topic = bundle.parcelable(TalkReplyActivity.EXTRA_TOPIC) val isFromDiff = bundle.getBoolean(TalkReplyActivity.EXTRA_FROM_DIFF, false) - val isNewTopic = topic == null + val selectedTemplate = bundle.parcelable(TalkReplyActivity.EXTRA_SELECTED_TEMPLATE) + val isSavedTemplate = bundle.getBoolean(TalkReplyActivity.EXTRA_SAVED_TEMPLATE, false) + val templateManagementMode = bundle.getBoolean(TalkReplyActivity.EXTRA_TEMPLATE_MANAGEMENT, false) + val fromRevisionId = bundle.getLong(TalkReplyActivity.FROM_REVISION_ID, -1) + val toRevisionId = bundle.getLong(TalkReplyActivity.TO_REVISION_ID, -1) + val isNewTopic = topic == null && !isFromDiff + val postReplyData = SingleLiveData>() val saveTemplateData = SingleLiveData>() - val loadTemplateData = SingleLiveData>() init { if (isFromDiff) { @@ -37,6 +45,15 @@ class TalkReplyViewModel(bundle: Bundle) : ViewModel() { } } + private fun loadTemplates() { + viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> + L.e(throwable) + }) { + talkTemplatesList.clear() + talkTemplatesList.addAll(talkTemplatesRepository.getAllTemplates()) + } + } + fun postReply(subject: String, body: String) { viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> postReplyData.postValue(Resource.Error(throwable)) @@ -83,16 +100,6 @@ class TalkReplyViewModel(bundle: Bundle) : ViewModel() { } } - fun loadTemplates() { - viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> - loadTemplateData.postValue(Resource.Error(throwable)) - }) { - talkTemplatesList.clear() - talkTemplatesList.addAll(talkTemplatesRepository.getAllTemplates()) - loadTemplateData.postValue(Resource.Success(talkTemplatesList.size)) - } - } - class Factory(val bundle: Bundle) : ViewModelProvider.Factory { @Suppress("unchecked_cast") override fun create(modelClass: Class): T { diff --git a/app/src/main/java/org/wikipedia/talk/db/TalkTemplate.kt b/app/src/main/java/org/wikipedia/talk/db/TalkTemplate.kt index 040a295bdc0..411b611e6e3 100644 --- a/app/src/main/java/org/wikipedia/talk/db/TalkTemplate.kt +++ b/app/src/main/java/org/wikipedia/talk/db/TalkTemplate.kt @@ -1,16 +1,19 @@ package org.wikipedia.talk.db +import android.os.Parcelable import androidx.room.Entity import androidx.room.PrimaryKey +import kotlinx.parcelize.Parcelize @Entity +@Parcelize class TalkTemplate constructor( @PrimaryKey(autoGenerate = true) val id: Int = 0, val type: Int, // Warn = 0 var order: Int, var title: String, var subject: String, - var message: String) { + var message: String) : Parcelable { override fun toString(): String { return title diff --git a/app/src/main/java/org/wikipedia/talk/template/AddTemplateActivity.kt b/app/src/main/java/org/wikipedia/talk/template/AddTemplateActivity.kt deleted file mode 100644 index 6e6c5a99eb8..00000000000 --- a/app/src/main/java/org/wikipedia/talk/template/AddTemplateActivity.kt +++ /dev/null @@ -1,284 +0,0 @@ -package org.wikipedia.talk.template - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.text.TextWatcher -import androidx.activity.result.contract.ActivityResultContracts -import androidx.activity.viewModels -import androidx.core.view.isVisible -import androidx.core.widget.doOnTextChanged -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import kotlinx.coroutines.launch -import org.wikipedia.Constants -import org.wikipedia.R -import org.wikipedia.WikipediaApp -import org.wikipedia.activity.BaseActivity -import org.wikipedia.analytics.eventplatform.PatrollerExperienceEvent -import org.wikipedia.databinding.ActivityAddTemplateBinding -import org.wikipedia.dataclient.WikiSite -import org.wikipedia.edit.SyntaxHighlightViewAdapter -import org.wikipedia.edit.insertmedia.InsertMediaActivity -import org.wikipedia.edit.insertmedia.InsertMediaViewModel -import org.wikipedia.extensions.parcelableExtra -import org.wikipedia.page.PageTitle -import org.wikipedia.util.DeviceUtil -import org.wikipedia.util.FeedbackUtil -import org.wikipedia.util.L10nUtil -import org.wikipedia.util.ResourceUtil -import org.wikipedia.views.UserMentionInputView - -class AddTemplateActivity : BaseActivity(), UserMentionInputView.Listener { - private lateinit var binding: ActivityAddTemplateBinding - private lateinit var textWatcher: TextWatcher - - private val viewModel: AddTemplateViewModel by viewModels { AddTemplateViewModel.Factory(intent.extras!!) } - private var userMentionScrolled = false - - private val wikiSite = WikiSite.forLanguageCode(WikipediaApp.instance.appOrSystemLanguageCode) - - private val requestInsertMedia = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == InsertMediaActivity.RESULT_INSERT_MEDIA_SUCCESS) { - it.data?.let { data -> - val imageTitle = data.parcelableExtra(InsertMediaActivity.EXTRA_IMAGE_TITLE) - val imageCaption = data.getStringExtra(InsertMediaActivity.RESULT_IMAGE_CAPTION) - val imageAlt = data.getStringExtra(InsertMediaActivity.RESULT_IMAGE_ALT) - val imageSize = data.getStringExtra(InsertMediaActivity.RESULT_IMAGE_SIZE) - val imageType = data.getStringExtra(InsertMediaActivity.RESULT_IMAGE_TYPE) - val imagePos = data.getStringExtra(InsertMediaActivity.RESULT_IMAGE_POS) - - val newWikiText = InsertMediaViewModel.insertImageIntoWikiText(wikiSite.languageCode, - binding.addTemplateInputView.editText.text.toString(), imageTitle?.text.orEmpty(), imageCaption.orEmpty(), - imageAlt.orEmpty(), imageSize.orEmpty(), imageType.orEmpty(), imagePos.orEmpty(), - binding.addTemplateInputView.editText.selectionStart, autoInsert = false, attemptInfobox = false - ) - - binding.addTemplateInputView.editText.setText(newWikiText.first) - - val insertPos = newWikiText.third - binding.addTemplateInputView.editText.setSelection(insertPos.first, insertPos.first + insertPos.second) - } - } - } - - public override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - binding = ActivityAddTemplateBinding.inflate(layoutInflater) - setContentView(binding.root) - setSupportActionBar(binding.addTemplateToolbar) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - if (viewModel.talkTemplateId != -1) { - title = getString(R.string.talk_templates_edit_message_dialog_title) - binding.addTemplateDescription.isVisible = false - } else { - title = getString(R.string.talk_templates_new_message_title) - binding.addTemplateDescription.isVisible = true - } - - addTextWatcher() - - binding.addTemplateSaveButton.setOnClickListener { - onSaveClicked() - } - - binding.addTemplateInputView.wikiSite = wikiSite - binding.addTemplateInputView.listener = this - - SyntaxHighlightViewAdapter(this, PageTitle("Main Page", wikiSite), binding.root, binding.addTemplateInputView.editText, - binding.editKeyboardOverlay, binding.editKeyboardOverlayFormatting, binding.editKeyboardOverlayHeadings, - Constants.InvokeSource.ADD_TEMPLATE_ACTIVITY, requestInsertMedia, true) - - lifecycleScope.launch { - repeatOnLifecycle(Lifecycle.State.CREATED) { - viewModel.uiState.collect { - when (it) { - is AddTemplateViewModel.UiState.Success -> onInitialLoad() - is AddTemplateViewModel.UiState.Saved -> onSaveSuccess() - is AddTemplateViewModel.UiState.Error -> onError(it.throwable) - } - } - } - } - } - - public override fun onDestroy() { - binding.addTemplateTitleText.removeTextChangedListener(textWatcher) - binding.addTemplateSubjectText.removeTextChangedListener(textWatcher) - binding.addTemplateInputView.editText.removeTextChangedListener(textWatcher) - super.onDestroy() - } - - private fun onInitialLoad() { - setSaveButtonEnabled(false) - binding.addTemplateScrollContainer.isSmoothScrollingEnabled = true - L10nUtil.setConditionalLayoutDirection(binding.addTemplateScrollContainer, wikiSite.languageCode) - binding.addTemplateInputView.textInputLayout.hint = getString(R.string.talk_message_hint) - - if (viewModel.talkTemplateId != -1) { - viewModel.talkTemplate?.let { - binding.addTemplateTitleText.setText(it.title) - binding.addTemplateSubjectText.setText(it.subject) - binding.addTemplateInputView.editText.setText(it.message) - } - } - - binding.addTemplateTitleLayout.postDelayed({ - if (!isDestroyed) { - binding.addTemplateTitleLayout.requestFocus() - val position = binding.addTemplateTitleText.text?.length ?: 0 - binding.addTemplateTitleText.setSelection(position) - DeviceUtil.showSoftKeyboard(binding.addTemplateTitleText) - } - }, 500) - } - - private fun setSaveButtonEnabled(enabled: Boolean) { - binding.addTemplateSaveButton.isEnabled = enabled - binding.addTemplateSaveButton.setTextColor(ResourceUtil - .getThemedColor(this, if (enabled) R.attr.progressive_color else R.attr.inactive_color)) - } - - private fun addTextWatcher() { - textWatcher = binding.addTemplateTitleText.doOnTextChanged { _, _, _, _ -> - binding.addTemplateTitleLayout.isErrorEnabled = false - binding.addTemplateSubjectLayout.isErrorEnabled = false - binding.addTemplateInputView.textInputLayout.isErrorEnabled = false - val title = binding.addTemplateTitleText.text.toString().trim() - val subject = binding.addTemplateSubjectText.text.toString().trim() - val body = binding.addTemplateInputView.editText.text.toString().trim() - if (title.isEmpty() && binding.addTemplateTitleText.isFocused) { - PatrollerExperienceEvent.logAction("publish_error_title", "pt_templates") - binding.addTemplateTitleLayout.isErrorEnabled = true - binding.addTemplateTitleLayout.error = getString(R.string.talk_templates_message_title_empty) - } - if (subject.isEmpty() && binding.addTemplateSubjectText.isFocused) { - PatrollerExperienceEvent.logAction("save_error_subject", "pt_templates") - binding.addTemplateSubjectLayout.isErrorEnabled = true - binding.addTemplateSubjectLayout.error = getString(R.string.talk_subject_empty) - } - if (body.isEmpty() && binding.addTemplateInputView.editText.isFocused) { - PatrollerExperienceEvent.logAction("save_error_compose", "pt_templates") - binding.addTemplateInputView.textInputLayout.isErrorEnabled = true - binding.addTemplateInputView.textInputLayout.error = getString(R.string.talk_message_empty) - } - var enableSaveButton = title.isNotBlank() && subject.isNotBlank() && body.isNotBlank() - if (viewModel.talkTemplatesList.any { item -> item.title == title && item.id != viewModel.talkTemplateId }) { - binding.addTemplateTitleLayout.isErrorEnabled = true - binding.addTemplateTitleLayout.error = getString(R.string.talk_templates_new_message_dialog_exists, title) - enableSaveButton = false - } - setSaveButtonEnabled(enableSaveButton) - } - binding.addTemplateSubjectText.addTextChangedListener(textWatcher) - binding.addTemplateInputView.editText.addTextChangedListener(textWatcher) - } - - private fun shouldShowExitDialog(): Boolean { - val title = binding.addTemplateTitleText.text.toString().trim() - val subject = binding.addTemplateSubjectText.text.toString().trim() - val body = binding.addTemplateInputView.editText.text.toString().trim() - var shouldShow = !binding.addTemplateTitleText.text.isNullOrEmpty() || - !binding.addTemplateSubjectText.text.isNullOrEmpty() || - binding.addTemplateInputView.editText.text.isNotEmpty() - - viewModel.talkTemplate?.let { - shouldShow = it.title != title || it.subject != subject || it.message != body - } - - return shouldShow - } - - private fun onSaveClicked() { - val title = binding.addTemplateTitleText.text.toString().trim() - val subject = binding.addTemplateSubjectText.text.toString().trim() - val body = binding.addTemplateInputView.editText.text.toString().trim() - - if (title.isEmpty()) { - PatrollerExperienceEvent.logAction("publish_error_title", "pt_templates") - binding.addTemplateTitleLayout.isErrorEnabled = true - binding.addTemplateTitleLayout.error = getString(R.string.talk_templates_message_title_empty) - binding.addTemplateTitleLayout.requestFocus() - return - } else if (subject.isEmpty()) { - PatrollerExperienceEvent.logAction("save_error_subject", "pt_templates") - binding.addTemplateSubjectLayout.isErrorEnabled = true - binding.addTemplateSubjectLayout.error = getString(R.string.talk_subject_empty) - binding.addTemplateSubjectLayout.requestFocus() - return - } else if (body.isEmpty()) { - PatrollerExperienceEvent.logAction("save_error_compose", "pt_templates") - binding.addTemplateInputView.textInputLayout.isErrorEnabled = true - binding.addTemplateInputView.textInputLayout.error = getString(R.string.talk_message_empty) - binding.addTemplateInputView.textInputLayout.requestFocus() - return - } - - setSaveButtonEnabled(false) - - if (viewModel.talkTemplateId != -1) { - viewModel.talkTemplate?.let { - PatrollerExperienceEvent.logAction("edit_message_save", "pt_templates") - viewModel.updateTalkTemplate(title, subject, body, it) - } - } else { - PatrollerExperienceEvent.logAction("save_message_click", "pt_templates") - viewModel.saveTemplate(title, subject, body) - } - } - - private fun onSaveSuccess() { - setSaveButtonEnabled(true) - setResult(RESULT_OK) - finish() - } - - private fun onError(t: Throwable) { - setSaveButtonEnabled(true) - FeedbackUtil.showError(this, t) - } - - override fun onBackPressed() { - PatrollerExperienceEvent.logAction("new_message_back", "pt_templates") - if (shouldShowExitDialog()) { - MaterialAlertDialogBuilder(this) - .setCancelable(false) - .setTitle(R.string.talk_new_topic_exit_dialog_title) - .setMessage(R.string.talk_new_topic_exit_dialog_message) - .setPositiveButton(R.string.edit_abandon_confirm_yes) { _, _ -> - PatrollerExperienceEvent.logAction("save_message_exit", "pt_templates") - super.onBackPressed() } - .setNegativeButton(R.string.edit_abandon_confirm_no) { _, _ -> - PatrollerExperienceEvent.logAction("save_message_exit_cancel", "pt_templates") - } - .show() - } else { - super.onBackPressed() - } - } - - override fun onUserMentionListUpdate() { - binding.addTemplateScrollContainer.post { - if (!isDestroyed && !userMentionScrolled) { - binding.addTemplateScrollContainer.smoothScrollTo(0, binding.root.height * 4) - userMentionScrolled = true - } - } - } - - override fun onUserMentionComplete() { - userMentionScrolled = false - } - - companion object { - const val EXTRA_TEMPLATE_ID = "templateId" - - fun newIntent(context: Context, - templateId: Int = -1): Intent { - return Intent(context, AddTemplateActivity::class.java) - .putExtra(EXTRA_TEMPLATE_ID, templateId) - } - } -} diff --git a/app/src/main/java/org/wikipedia/talk/template/AddTemplateViewModel.kt b/app/src/main/java/org/wikipedia/talk/template/AddTemplateViewModel.kt deleted file mode 100644 index adef41e64d1..00000000000 --- a/app/src/main/java/org/wikipedia/talk/template/AddTemplateViewModel.kt +++ /dev/null @@ -1,71 +0,0 @@ -package org.wikipedia.talk.template - -import android.os.Bundle -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch -import org.wikipedia.database.AppDatabase -import org.wikipedia.talk.db.TalkTemplate - -class AddTemplateViewModel(bundle: Bundle) : ViewModel() { - private val talkTemplatesRepository = TalkTemplatesRepository(AppDatabase.instance.talkTemplateDao()) - private val handler = CoroutineExceptionHandler { _, throwable -> - _uiState.value = UiState.Error(throwable) - } - - val talkTemplateId = bundle.getInt(AddTemplateActivity.EXTRA_TEMPLATE_ID) - val talkTemplatesList = mutableListOf() - val talkTemplate get() = talkTemplatesList.find { it.id == talkTemplateId } - - private val _uiState = MutableStateFlow(UiState()) - val uiState = _uiState.asStateFlow() - - init { - loadTemplates() - } - - fun saveTemplate(title: String, subject: String, body: String) { - viewModelScope.launch(handler) { - val orderNumber = talkTemplatesRepository.getLastOrderNumber() + 1 - val talkTemplate = TalkTemplate(type = 0, order = orderNumber, title = title, subject = subject, message = body) - talkTemplatesRepository.insertTemplate(talkTemplate) - _uiState.value = UiState.Saved() - } - } - - fun updateTalkTemplate(title: String, subject: String, body: String, talkTemplate: TalkTemplate) { - viewModelScope.launch(handler) { - talkTemplate.apply { - this.title = title - this.subject = subject - this.message = body - } - talkTemplatesRepository.updateTemplate(talkTemplate) - _uiState.value = UiState.Saved() - } - } - - private fun loadTemplates() { - viewModelScope.launch(handler) { - talkTemplatesList.addAll(talkTemplatesRepository.getAllTemplates()) - _uiState.value = UiState.Success() - } - } - - open class UiState { - class Success : UiState() - class Saved : UiState() - class Error(val throwable: Throwable) : UiState() - } - - class Factory(val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return AddTemplateViewModel(bundle) as T - } - } -} diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesActivity.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesActivity.kt index 8791d468dd3..a80b9952b89 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesActivity.kt @@ -2,16 +2,28 @@ package org.wikipedia.talk.template import android.content.Context import android.content.Intent +import org.wikipedia.Constants import org.wikipedia.activity.SingleFragmentActivity +import org.wikipedia.extensions.parcelableExtra +import org.wikipedia.page.PageTitle +import org.wikipedia.talk.TalkReplyActivity +import org.wikipedia.talk.TalkReplyActivity.Companion.EXTRA_TEMPLATE_MANAGEMENT class TalkTemplatesActivity : SingleFragmentActivity() { public override fun createFragment(): TalkTemplatesFragment { - return TalkTemplatesFragment.newInstance() + return TalkTemplatesFragment.newInstance(intent.parcelableExtra(Constants.ARG_TITLE), + intent.getBooleanExtra(EXTRA_TEMPLATE_MANAGEMENT, false), + intent.getLongExtra(TalkReplyActivity.FROM_REVISION_ID, -1), + intent.getLongExtra(TalkReplyActivity.TO_REVISION_ID, -1)) } companion object { - fun newIntent(context: Context): Intent { + fun newIntent(context: Context, pageTitle: PageTitle?, templateManagement: Boolean = false, fromRevisionId: Long = -1, toRevisionId: Long = -1): Intent { return Intent(context, TalkTemplatesActivity::class.java) + .putExtra(Constants.ARG_TITLE, pageTitle) + .putExtra(EXTRA_TEMPLATE_MANAGEMENT, templateManagement) + .putExtra(TalkReplyActivity.FROM_REVISION_ID, fromRevisionId) + .putExtra(TalkReplyActivity.TO_REVISION_ID, toRevisionId) } } } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index a4a11a4d191..002a99d8dfc 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -5,7 +5,6 @@ import android.app.Activity.RESULT_OK import android.os.Bundle import android.view.LayoutInflater import android.view.Menu -import android.view.MenuInflater import android.view.MenuItem import android.view.MotionEvent import android.view.View @@ -13,7 +12,7 @@ import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode -import androidx.core.view.MenuProvider +import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -24,24 +23,37 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.tabs.TabLayout import kotlinx.coroutines.launch +import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.analytics.eventplatform.PatrollerExperienceEvent import org.wikipedia.databinding.FragmentTalkTemplatesBinding +import org.wikipedia.page.LinkMovementMethodExt +import org.wikipedia.page.PageTitle +import org.wikipedia.talk.TalkReplyActivity +import org.wikipedia.talk.TalkReplyActivity.Companion.EXTRA_TEMPLATE_MANAGEMENT +import org.wikipedia.talk.TalkReplyActivity.Companion.RESULT_BACK_FROM_TOPIC +import org.wikipedia.talk.TalkTopicsActivity import org.wikipedia.talk.db.TalkTemplate import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.StringUtil import org.wikipedia.views.DrawableItemDecoration import org.wikipedia.views.MultiSelectActionModeCallback +import org.wikipedia.views.SwipeableItemTouchHelperCallback -class TalkTemplatesFragment : Fragment(), MenuProvider { +class TalkTemplatesFragment : Fragment() { private var _binding: FragmentTalkTemplatesBinding? = null - private val viewModel: TalkTemplatesViewModel by viewModels() + private val viewModel: TalkTemplatesViewModel by viewModels { TalkTemplatesViewModel.Factory(requireArguments()) } private val binding get() = _binding!! private lateinit var itemTouchHelper: ItemTouchHelper + private lateinit var itemSwipeTouchHelper: ItemTouchHelper + private lateinit var touchCallback: SwipeableItemTouchHelperCallback private lateinit var adapter: RecyclerAdapter private val selectedItems = mutableListOf() + private val deletedItems = mutableListOf() private var actionMode: ActionMode? = null private val multiSelectCallback = MultiSelectCallback() @@ -51,34 +63,79 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { (requireActivity() as AppCompatActivity).setSupportActionBar(binding.toolbar) (requireActivity() as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) - (requireActivity() as AppCompatActivity).supportActionBar?.title = getString(R.string.talk_templates_manage_title) + (requireActivity() as AppCompatActivity).supportActionBar?.title = + getString(if (viewModel.templateManagementMode) R.string.talk_warn_saved_messages else R.string.talk_warn) return binding.root } private val requestNewTemplate = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == RESULT_OK) { + binding.talkTemplatesTabLayout.getTabAt(0)?.select() + + if (result.resultCode == RESULT_OK || result.resultCode == RESULT_BACK_FROM_TOPIC) { viewModel.loadTalkTemplates() PatrollerExperienceEvent.logAction("save_message_toast", "pt_templates") - FeedbackUtil.showMessage(this, R.string.talk_templates_new_message_saved) + if (result.resultCode != RESULT_BACK_FROM_TOPIC) { + FeedbackUtil.showMessage(this, R.string.talk_templates_new_message_saved) + } + } + if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { + val pageTitle = viewModel.pageTitle + val message = if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS) { + PatrollerExperienceEvent.logAction("publish_message_toast", "pt_warning_messages") + R.string.talk_warn_submitted + } else { + PatrollerExperienceEvent.logAction("publish_message_saved_toast", "pt_warning_messages") + R.string.talk_warn_submitted_and_saved + } + updateAndNotifyAdapter() + val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(message)) + snackbar.setAction(R.string.patroller_tasks_patrol_edit_snackbar_view) { + if (isAdded) { + PatrollerExperienceEvent.logAction("publish_message_view_click", "pt_warning_messages") + startActivity(TalkTopicsActivity.newIntent(requireContext(), pageTitle, Constants.InvokeSource.DIFF_ACTIVITY)) + } + } + snackbar.show() } } private val requestEditTemplate = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == RESULT_OK) { + if (result.resultCode == RESULT_OK || result.resultCode == RESULT_BACK_FROM_TOPIC) { + binding.talkTemplatesTabLayout.getTabAt(0)?.select() viewModel.loadTalkTemplates() PatrollerExperienceEvent.logAction("update_message_toast", "pt_templates") - FeedbackUtil.showMessage(this, R.string.talk_templates_edit_message_updated) + if (result.resultCode != RESULT_BACK_FROM_TOPIC) { + FeedbackUtil.showMessage(this, R.string.talk_templates_edit_message_updated) + } + } + if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { + val pageTitle = viewModel.pageTitle + val message = if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS) { + PatrollerExperienceEvent.logAction("publish_message_toast", "pt_warning_messages") + R.string.talk_warn_submitted + } else { + PatrollerExperienceEvent.logAction("publish_message_saved_toast", "pt_warning_messages") + R.string.talk_warn_submitted_and_saved + } + updateAndNotifyAdapter() + val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(message)) + snackbar.setAction(R.string.patroller_tasks_patrol_edit_snackbar_view) { + if (isAdded) { + PatrollerExperienceEvent.logAction("publish_message_view_click", "pt_warning_messages") + startActivity(TalkTopicsActivity.newIntent(requireContext(), pageTitle, Constants.InvokeSource.DIFF_ACTIVITY)) + } + } + snackbar.show() } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) binding.talkTemplatesErrorView.retryClickListener = View.OnClickListener { viewModel.loadTalkTemplates() } - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { launch { viewModel.uiState.collect { @@ -95,45 +152,79 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { when (it) { is TalkTemplatesViewModel.ActionState.Deleted -> onDeleted(it.size) is TalkTemplatesViewModel.ActionState.Error -> onActionError(it.throwable) + is TalkTemplatesViewModel.ActionState.Added -> onAdded() } } } } } + + binding.addTemplateFab.setOnClickListener { + requestNewTemplate.launch(TalkReplyActivity.newIntent(requireContext(), viewModel.pageTitle, null, + null, invokeSource = Constants.InvokeSource.DIFF_ACTIVITY, fromDiff = true, templateManagementMode = viewModel.templateManagementMode, + fromRevisionId = viewModel.fromRevisionId, toRevisionId = viewModel.toRevisionId)) + } + + binding.toolBarEditView.setOnClickListener { + if (actionMode == null) { + beginRemoveItemsMode() + updateAndNotifyAdapter() + } + } + + binding.talkTemplatesTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + if (actionMode != null) { + actionMode?.finish() + } + touchCallback.swipeableEnabled = tab.position == 0 + updateAndNotifyAdapter() + showToolbarEditView(tab.position == 0) + } + + override fun onTabUnselected(tab: TabLayout.Tab) {} + + override fun onTabReselected(tab: TabLayout.Tab) {} + }) + setUpTouchListeners() + + binding.talkTemplatesEmptyStateTextView.text = StringUtil.fromHtml(getString(R.string.talk_templates_empty_message)) + + binding.talkTemplatesEmptyStateTextView.movementMethod = LinkMovementMethodExt { _ -> + binding.talkTemplatesTabLayout.getTabAt(1)?.select() + updateAndNotifyAdapter() + } } - override fun onDestroyView() { - super.onDestroyView() - _binding = null + private fun showToolbarEditView(visible: Boolean) { + binding.toolBarEditView.isVisible = visible } - override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.menu_talk_templates, menu) + private fun setUpTouchListeners() { + touchCallback = SwipeableItemTouchHelperCallback(requireContext()) + touchCallback.swipeableEnabled = true + itemTouchHelper = ItemTouchHelper(RearrangeableItemTouchHelperCallback(adapter)) + itemSwipeTouchHelper = ItemTouchHelper(touchCallback) + itemTouchHelper.attachToRecyclerView(binding.talkTemplatesRecyclerView) + itemSwipeTouchHelper.attachToRecyclerView(binding.talkTemplatesRecyclerView) } - override fun onPrepareMenu(menu: Menu) { - super.onPrepareMenu(menu) - menu.findItem(R.id.menu_overflow).isVisible = viewModel.talkTemplatesList.isNotEmpty() + private fun updateEmptyState() { + binding.talkTemplatesEmptyContainer.isVisible = adapter.templatesList.isEmpty() + binding.talkTemplatesRecyclerView.isVisible = adapter.templatesList.isNotEmpty() } - override fun onMenuItemSelected(menuItem: MenuItem): Boolean { - return when (menuItem.itemId) { - R.id.menu_overflow -> { - PatrollerExperienceEvent.logAction("more_menu_click", "pt_templates") - true - } - R.id.menu_new_message -> { - PatrollerExperienceEvent.logAction("new_message_click", "pt_templates") - requestNewTemplate.launch(AddTemplateActivity.newIntent(requireContext())) - true - } - R.id.menu_enter_remove_message_mode -> { - PatrollerExperienceEvent.logAction("more_menu_remove_click", "pt_templates") - beginRemoveItemsMode() - true - } - else -> false - } + fun updateAndNotifyAdapter() { + adapter.templatesList.clear() + adapter.templatesList.addAll(if (binding.talkTemplatesTabLayout.selectedTabPosition == 0) viewModel.talkTemplatesList else viewModel.savedTemplatesList) + updateEmptyState() + showToolbarEditView(binding.talkTemplatesTabLayout.selectedTabPosition == 0 && viewModel.talkTemplatesList.isNotEmpty()) + adapter.notifyDataSetChanged() + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null } private fun setRecyclerView() { @@ -142,8 +233,7 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { binding.talkTemplatesRecyclerView.adapter = adapter binding.talkTemplatesRecyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.talkTemplatesRecyclerView.addItemDecoration(DrawableItemDecoration(requireContext(), R.attr.list_divider, drawStart = true, drawEnd = false)) - itemTouchHelper = ItemTouchHelper(RearrangeableItemTouchHelperCallback(adapter)) - itemTouchHelper.attachToRecyclerView(binding.talkTemplatesRecyclerView) + updateAndNotifyAdapter() } private fun onLoading() { @@ -154,7 +244,7 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { private fun onSuccess() { setRecyclerView() - requireActivity().invalidateOptionsMenu() + showToolbarEditView(binding.talkTemplatesTabLayout.selectedTabPosition == 0 && viewModel.talkTemplatesList.isNotEmpty()) binding.talkTemplatesEmptyContainer.isVisible = viewModel.talkTemplatesList.isEmpty() binding.talkTemplatesErrorView.visibility = View.GONE binding.talkTemplatesProgressBar.visibility = View.GONE @@ -167,7 +257,11 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { private fun onDeleted(size: Int) { PatrollerExperienceEvent.logAction("message_deleted_toast", "pt_templates") val messageStr = resources.getQuantityString(R.plurals.talk_templates_message_deleted, size) - FeedbackUtil.showMessage(this, messageStr) + FeedbackUtil.makeSnackbar(requireActivity(), messageStr) + .setAction(R.string.reading_list_item_delete_undo) { + viewModel.saveTemplates(deletedItems) + } + .show() binding.talkTemplatesEmptyContainer.isVisible = viewModel.talkTemplatesList.isEmpty() binding.talkTemplatesRecyclerView.isVisible = viewModel.talkTemplatesList.isNotEmpty() if (binding.talkTemplatesEmptyContainer.isVisible) { @@ -177,6 +271,10 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { unselectAllTalkTemplates() } + private fun onAdded() { + updateAndNotifyAdapter() + } + private fun onActionError(t: Throwable) { FeedbackUtil.showMessage(this, t.toString()) } @@ -187,18 +285,31 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { binding.talkTemplatesErrorView.visibility = View.VISIBLE } - internal inner class TalkTemplatesItemViewHolder(val templatesItemView: TalkTemplatesItemView) : RecyclerView.ViewHolder(templatesItemView.rootView) { + internal inner class TalkTemplatesItemViewHolder(val templatesItemView: TalkTemplatesItemView) : RecyclerView.ViewHolder(templatesItemView.rootView), SwipeableItemTouchHelperCallback.Callback { + private lateinit var entry: TalkTemplate + fun bindItem(item: TalkTemplate, position: Int) { - templatesItemView.setContents(item, position) + this.entry = item + templatesItemView.setContents(item, position, binding.talkTemplatesTabLayout.selectedTabPosition == 1) + } + + override fun onSwipe() { + selectedItems.add(entry) + deleteSelectedTalkTemplates() + } + + override fun isSwipeable(): Boolean { + return true } } internal inner class RecyclerAdapter : RecyclerView.Adapter(), TalkTemplatesItemView.Callback { private var checkboxEnabled = false + var templatesList = mutableListOf() override fun getItemCount(): Int { - return viewModel.talkTemplatesList.size + return templatesList.size } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TalkTemplatesItemViewHolder { @@ -206,11 +317,11 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { } override fun onBindViewHolder(holder: TalkTemplatesItemViewHolder, position: Int) { - val talkTemplate = viewModel.talkTemplatesList[position] + val talkTemplate = templatesList[position] holder.bindItem(talkTemplate, position) holder.templatesItemView.setCheckBoxEnabled(checkboxEnabled) holder.templatesItemView.setCheckBoxChecked(selectedItems.contains(talkTemplate)) - holder.templatesItemView.setDragHandleEnabled(!checkboxEnabled) + holder.templatesItemView.setDragHandleEnabled(actionMode != null) } override fun onViewAttachedToWindow(holder: TalkTemplatesItemViewHolder) { @@ -233,24 +344,32 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { } override fun onClick(position: Int) { + if (position == 0 && binding.talkTemplatesTabLayout.selectedTabPosition == 1) { + return + } if (actionMode != null) { - toggleSelectedItem(viewModel.talkTemplatesList[position]) + toggleSelectedItem(templatesList[position]) adapter.notifyItemChanged(position) } else { PatrollerExperienceEvent.logAction("edit_message_click", "pt_templates") - requestEditTemplate.launch(AddTemplateActivity.newIntent(requireContext(), viewModel.talkTemplatesList[position].id)) + requestEditTemplate.launch(TalkReplyActivity.newIntent(requireContext(), viewModel.pageTitle, null, null, invokeSource = Constants.InvokeSource.DIFF_ACTIVITY, + fromDiff = true, selectedTemplate = templatesList[position], templateManagementMode = viewModel.templateManagementMode, fromRevisionId = viewModel.fromRevisionId, + toRevisionId = viewModel.toRevisionId, isSavedTemplate = binding.talkTemplatesTabLayout.selectedTabPosition == 1)) } } override fun onCheckedChanged(position: Int) { - toggleSelectedItem(viewModel.talkTemplatesList[position]) + toggleSelectedItem(templatesList[position]) } override fun onLongPress(position: Int) { + if (binding.talkTemplatesTabLayout.selectedTabPosition == 1) { + return + } if (actionMode == null) { beginRemoveItemsMode() } - toggleSelectedItem(viewModel.talkTemplatesList[position]) + toggleSelectedItem(templatesList[position]) adapter.notifyItemChanged(position) } @@ -282,14 +401,25 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { } else { selectedItems.add(talkTemplate) } + actionMode?.title = getString(R.string.multi_select_items_selected, selectedItems.size) } private fun unselectAllTalkTemplates() { selectedItems.clear() - adapter.notifyDataSetChanged() + actionMode?.title = getString(R.string.multi_select_items_selected, selectedItems.size) + updateAndNotifyAdapter() + } + + private fun selectAllTalkTemplates(mode: ActionMode) { + adapter.templatesList.filterNot { selectedItems.contains(it) } + .forEach { selectedItems.add(it) } + mode.title = getString(R.string.multi_select_items_selected, selectedItems.size) + updateAndNotifyAdapter() } private fun deleteSelectedTalkTemplates() { + deletedItems.clear() + deletedItems.addAll(selectedItems) viewModel.deleteTemplates(selectedItems) } @@ -303,6 +433,33 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { return super.onCreateActionMode(mode, menu) } + override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean { + mode.title = getString(R.string.multi_select_items_selected, selectedItems.size) + selectedItems.size.toString() + menu.findItem(R.id.menu_check_all).isVisible = true + menu.findItem(R.id.menu_uncheck_all).isVisible = false + return super.onPrepareActionMode(mode, menu) + } + + override fun onActionItemClicked(mode: ActionMode, menuItem: MenuItem): Boolean { + super.onActionItemClicked(mode, menuItem) + when (menuItem.itemId) { + R.id.menu_check_all -> { + selectAllTalkTemplates(mode) + menuItem.isVisible = false + mode.menu.findItem(R.id.menu_uncheck_all).isVisible = true + return true + } + R.id.menu_uncheck_all -> { + unselectAllTalkTemplates() + menuItem.isVisible = false + mode.menu.findItem(R.id.menu_check_all).isVisible = true + return true + } + } + return false + } + override fun onDeleteSelected() { if (selectedItems.size > 0) { PatrollerExperienceEvent.logAction("more_menu_remove_confirm", "pt_templates") @@ -358,15 +515,20 @@ class TalkTemplatesFragment : Fragment(), MenuProvider { super.clearView(recyclerView, viewHolder) recyclerView.post { if (isAdded) { - adapter.notifyDataSetChanged() + updateAndNotifyAdapter() } } } } companion object { - fun newInstance(): TalkTemplatesFragment { - return TalkTemplatesFragment() + fun newInstance(pageTitle: PageTitle?, templateManagement: Boolean = false, fromRevisionId: Long = -1, toRevisionId: Long = -1): TalkTemplatesFragment { + return TalkTemplatesFragment().apply { + arguments = bundleOf(Constants.ARG_TITLE to pageTitle, + EXTRA_TEMPLATE_MANAGEMENT to templateManagement, + TalkReplyActivity.FROM_REVISION_ID to fromRevisionId, + TalkReplyActivity.TO_REVISION_ID to toRevisionId) + } } } } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesItemView.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesItemView.kt index db7fa233b35..a0ab3a18917 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesItemView.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesItemView.kt @@ -2,12 +2,15 @@ package org.wikipedia.talk.template import android.annotation.SuppressLint import android.content.Context +import android.graphics.Typeface import android.os.Build +import android.text.TextUtils import android.util.AttributeSet import android.view.LayoutInflater import android.view.ViewGroup import android.widget.LinearLayout import androidx.appcompat.content.res.AppCompatResources +import androidx.core.view.isVisible import org.wikipedia.R import org.wikipedia.databinding.ItemTalkTemplatesBinding import org.wikipedia.talk.db.TalkTemplate @@ -41,8 +44,17 @@ class TalkTemplatesItemView constructor(context: Context, attrs: AttributeSet? = else ResourceUtil.getThemedColor(context, R.attr.paper_color)) } - fun setContents(talkTemplate: TalkTemplate, position: Int) { - binding.listItem.text = talkTemplate.title + fun setContents(talkTemplate: TalkTemplate, position: Int, isSaveMessagesTab: Boolean = false) { + binding.listItemTitle.isVisible = !(isSaveMessagesTab && position == 0) + binding.listItemTitle.text = talkTemplate.subject + binding.listItemDescription.text = talkTemplate.message + binding.listItemDescription.setTypeface(Typeface.SANS_SERIF, if (position == 0 && isSaveMessagesTab) Typeface.ITALIC else Typeface.NORMAL) + binding.listItemDescription.isSingleLine = !(position == 0 && isSaveMessagesTab) + binding.listItem.setBackgroundResource(ResourceUtil.getThemedAttributeId(context, + if (position == 0 && isSaveMessagesTab) R.attr.background_color else android.R.attr.selectableItemBackground)) + binding.listItemDescription.ellipsize = + if (position == 0 && isSaveMessagesTab) null else TextUtils.TruncateAt.END + binding.listItem.setOnClickListener { callback?.onClick(position) } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesRepository.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesRepository.kt index 6063cc5ee72..4a8c0d531bb 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesRepository.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesRepository.kt @@ -26,4 +26,7 @@ class TalkTemplatesRepository constructor(private val talkTemplateDao: TalkTempl suspend fun deleteTemplates(talkTemplates: List) { talkTemplateDao.deleteTemplates(talkTemplates.map { it.id }) } + suspend fun getTemplateById(id: Int): TalkTemplate? { + return talkTemplateDao.getTemplateById(id) + } } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt index ae22649bfea..b37d92523f9 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt @@ -2,10 +2,9 @@ package org.wikipedia.talk.template import android.app.Activity import android.view.LayoutInflater +import android.view.ViewGroup import android.view.WindowManager -import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog -import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.wikipedia.R @@ -17,25 +16,24 @@ class TalkTemplatesTextInputDialog constructor(private val activity: Activity, positiveButtonText: Int = R.string.text_input_dialog_ok_button_text, negativeButtonText: Int = R.string.text_input_dialog_cancel_button_text) : MaterialAlertDialogBuilder(activity, R.style.AlertDialogTheme_Input) { interface Callback { - fun onShow(dialog: TalkTemplatesTextInputDialog) - fun onTextChanged(text: CharSequence, dialog: TalkTemplatesTextInputDialog) - fun onSuccess(titleText: CharSequence, subjectText: CharSequence, bodyText: CharSequence) + fun onSuccess(subjectText: String) fun onCancel() + fun onTextChanged(text: String, dialog: TalkTemplatesTextInputDialog) fun onDismiss() + fun getSubjectText(): String } private var binding = DialogTalkTemplatesTextInputBinding.inflate(LayoutInflater.from(context)) private var dialog: AlertDialog? = null var callback: Callback? = null - val isSaveAsNewChecked get() = binding.dialogSaveAsNewCheckbox.isChecked - val isSaveExistingChecked get() = binding.dialogSaveExistingCheckbox.isChecked + val isSaveAsNewChecked get() = binding.dialogSaveAsNewRadio.isChecked + val isSaveExistingChecked get() = binding.dialogSaveExistingRadio.isChecked init { setView(binding.root) - binding.titleInputContainer.isErrorEnabled = true setPositiveButton(positiveButtonText) { _, _ -> - callback?.onSuccess(binding.titleInput.text.toString().trim(), binding.subjectTextInput.text.toString().trim(), binding.bodyTextInput.editText.text.toString().trim()) + callback?.onSuccess(binding.subjectInput.text.toString()) } setNegativeButton(negativeButtonText) { _, _ -> callback?.onCancel() @@ -43,32 +41,12 @@ class TalkTemplatesTextInputDialog constructor(private val activity: Activity, setOnDismissListener { callback?.onDismiss() } - binding.titleInput.doOnTextChanged { text, _, _, _ -> - if (binding.dialogSaveAsNewCheckbox.isVisible && !binding.dialogSaveAsNewCheckbox.isChecked) { - binding.dialogSaveAsNewCheckbox.isChecked = true - binding.dialogSaveExistingCheckbox.isChecked = false - } - callback?.onTextChanged(text ?: "", this) - } - binding.dialogSaveAsNewCheckbox.setOnClickListener { - if (binding.dialogSaveExistingCheckbox.isChecked) { - binding.dialogSaveAsNewCheckbox.isChecked = true - binding.dialogSaveExistingCheckbox.isChecked = false - } - setPositiveButtonEnabled(binding.titleInput.text?.isNotBlank() ?: false) + binding.subjectInput.doOnTextChanged { text, _, _, _ -> + callback?.onTextChanged(text.toString(), this) } - binding.dialogSaveExistingCheckbox.setOnClickListener { - if (binding.dialogSaveAsNewCheckbox.isChecked) { - binding.dialogSaveAsNewCheckbox.isChecked = false - binding.dialogSaveExistingCheckbox.isChecked = true - } - setError(null) - setPositiveButtonEnabled(true) - } - binding.dialogSaveAsNewCheckbox.setOnCheckedChangeListener { _, isChecked -> - if (!isChecked) { - setError(null) - binding.root.requestFocus() + binding.dialogSaveExistingRadio.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + callback?.onTextChanged(binding.subjectInput.text.toString(), this) } } } @@ -77,54 +55,18 @@ class TalkTemplatesTextInputDialog constructor(private val activity: Activity, dialog = super.create() dialog?.setOnShowListener { dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - callback?.onShow(this@TalkTemplatesTextInputDialog) - addTextWatcher() + binding.dialogSaveAsNewRadio.isChecked = true } + binding.subjectInput.setText(callback?.getSubjectText()) return dialog!! } - private fun addTextWatcher() { - val textWatcher = binding.titleInput.doOnTextChanged { _, _, _, _ -> - binding.titleInputContainer.error = null - binding.subjectTextInputContainer.error = null - binding.bodyTextInput.textInputLayout.error = null - val title = binding.titleInput.text.toString().trim() - val subject = binding.subjectTextInput.text.toString().trim() - val body = binding.bodyTextInput.editText.text.toString().trim() - if (title.isEmpty()) { - sendPatrollerExperienceEvent("publish_error_title") - binding.titleInputContainer.error = context.getString(R.string.talk_templates_message_title_empty) - } - if (subject.isEmpty()) { - sendPatrollerExperienceEvent("save_error_subject") - binding.subjectTextInputContainer.error = context.getString(R.string.talk_subject_empty) - } - if (body.isEmpty()) { - sendPatrollerExperienceEvent("save_error_message") - binding.bodyTextInput.textInputLayout.error = context.getString(R.string.talk_message_empty) - } - if (binding.subjectTextInputContainer.isVisible && binding.bodyTextInput.isVisible) { - setPositiveButtonEnabled(title.isNotBlank() && subject.isNotBlank() && body.isNotBlank()) - } else { - setPositiveButtonEnabled(title.isNotBlank()) - } - } - binding.subjectTextInput.addTextChangedListener(textWatcher) - binding.bodyTextInput.editText.addTextChangedListener(textWatcher) - } - - fun requestFocus() { - binding.titleInput.requestFocus() + fun setError(text: CharSequence?) { + binding.subjectInputContainer.error = text } - fun showTemplateCheckboxes(hasTemplate: Boolean) { - binding.dialogSaveAsNewCheckbox.isVisible = true - if (!hasTemplate) { - binding.dialogSaveAsNewCheckbox.text = context.getString(R.string.talk_warn_save_dialog_message) - } else { - binding.dialogSaveAsNewCheckbox.text = context.getString(R.string.talk_warn_save_dialog_existing_new_message) - binding.dialogSaveExistingCheckbox.isVisible = true - } + fun setPositiveButtonEnabled(enabled: Boolean) { + dialog?.getButton(AlertDialog.BUTTON_POSITIVE)?.isEnabled = enabled } private fun sendPatrollerExperienceEvent(action: String) { @@ -133,51 +75,7 @@ class TalkTemplatesTextInputDialog constructor(private val activity: Activity, ) } - fun setDialogMessage(text: String) { - binding.dialogMessage.text = text - } - - fun setTitleText(text: CharSequence?) { - binding.titleInput.setText(text) - } - - fun setSubjectText(text: CharSequence?) { - binding.subjectTextInput.setText(text) - } - - fun setBodyText(text: CharSequence?) { - binding.bodyTextInput.editText.setText(text) - } - - fun showDialogMessage(show: Boolean) { - binding.dialogMessage.isVisible = show - } - - fun showSubjectText(show: Boolean) { - binding.subjectTextInputContainer.isVisible = show - } - - fun showBodyText(show: Boolean) { - binding.bodyTextInput.isVisible = show - } - - fun setTitleHint(@StringRes id: Int) { - binding.titleInputContainer.hint = context.resources.getString(id) - } - - fun setSubjectHint(@StringRes id: Int) { - binding.subjectTextInputContainer.hint = context.resources.getString(id) - } - - fun setBodyHint(@StringRes id: Int) { - binding.bodyTextInput.textInputLayout.hint = context.resources.getString(id) - } - - fun setError(text: CharSequence?) { - binding.titleInputContainer.error = text - } - - fun setPositiveButtonEnabled(enabled: Boolean) { - dialog?.getButton(AlertDialog.BUTTON_POSITIVE)?.isEnabled = enabled + fun getView(): ViewGroup { + return binding.root } } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt index 8ed317642bd..26035cc6fc2 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt @@ -1,6 +1,10 @@ package org.wikipedia.talk.template +import android.content.Context +import android.content.res.Configuration +import android.os.Bundle import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.Dispatchers @@ -8,11 +12,18 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.wikipedia.Constants +import org.wikipedia.R +import org.wikipedia.WikipediaApp import org.wikipedia.database.AppDatabase +import org.wikipedia.extensions.parcelable +import org.wikipedia.page.PageTitle +import org.wikipedia.talk.TalkReplyActivity +import org.wikipedia.talk.TalkReplyActivity.Companion.EXTRA_TEMPLATE_MANAGEMENT import org.wikipedia.talk.db.TalkTemplate -import java.util.Collections +import java.util.* -class TalkTemplatesViewModel : ViewModel() { +class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { private val talkTemplatesRepository = TalkTemplatesRepository(AppDatabase.instance.talkTemplateDao()) private val handler = CoroutineExceptionHandler { _, throwable -> @@ -22,6 +33,7 @@ class TalkTemplatesViewModel : ViewModel() { _actionState.value = ActionState.Error(throwable) } val talkTemplatesList = mutableListOf() + val savedTemplatesList = mutableListOf() private val _uiState = MutableStateFlow(UiState()) val uiState = _uiState.asStateFlow() @@ -29,8 +41,14 @@ class TalkTemplatesViewModel : ViewModel() { private val _actionState = MutableStateFlow(ActionState()) val actionState = _actionState.asStateFlow() + val templateManagementMode = bundle.getBoolean(EXTRA_TEMPLATE_MANAGEMENT, false) + val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! + val fromRevisionId = bundle.getLong(TalkReplyActivity.FROM_REVISION_ID) + val toRevisionId = bundle.getLong(TalkReplyActivity.TO_REVISION_ID) + init { loadTalkTemplates() + loadSavedTemplates() } fun loadTalkTemplates() { @@ -44,6 +62,25 @@ class TalkTemplatesViewModel : ViewModel() { } } + private fun loadSavedTemplates() { + val langCode = pageTitle.wikiSite.languageCode + val context = WikipediaApp.instance.applicationContext + for (i in savedMessagesTitleList.indices) { + val talkTemplate = TalkTemplate(0, 0, -1, "", + if (i == 0) "" else getLocaleStringResource(Locale(langCode), savedMessagesTitleList[i], context), + getLocaleStringResource(Locale(langCode), savedMessagesBodyList[i], context)) + savedTemplatesList.add(talkTemplate) + } + } + + private fun getLocaleStringResource(requestedLocale: Locale, resourceId: Int, context: Context): String { + val result: String + val config = Configuration(context.resources.configuration) + config.setLocale(requestedLocale) + result = context.createConfigurationContext(config).getText(resourceId).toString() + return result + } + fun swapList(oldPosition: Int, newPosition: Int) { Collections.swap(talkTemplatesList, oldPosition, newPosition) resetOrder() @@ -63,6 +100,16 @@ class TalkTemplatesViewModel : ViewModel() { } } + fun saveTemplates(talkTemplates: List) { + viewModelScope.launch(actionHandler) { + withContext(Dispatchers.IO) { + talkTemplates.forEach { talkTemplatesRepository.insertTemplate(it) } + talkTemplatesList.addAll(talkTemplates) + _actionState.value = ActionState.Added() + } + } + } + fun deleteTemplates(talkTemplates: List) { viewModelScope.launch(actionHandler) { withContext(Dispatchers.IO) { @@ -82,7 +129,25 @@ class TalkTemplatesViewModel : ViewModel() { } open class ActionState { + class Added : ActionState() class Deleted(val size: Int) : ActionState() class Error(val throwable: Throwable) : ActionState() } + class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { + @Suppress("unchecked_cast") + override fun create(modelClass: Class): T { + return TalkTemplatesViewModel(bundle) as T + } + } + + companion object { + private val savedMessagesTitleList = listOf(-1, R.string.patroller_saved_message_title_vandalism, R.string.patroller_saved_message_title_editing_tests, R.string.patroller_saved_message_title_npov, + R.string.patroller_saved_message_title_auto_trans, R.string.patroller_saved_message_title_coi_rem, R.string.patroller_saved_message_title_final_warning, + R.string.patroller_saved_message_title_copy_vio, R.string.patroller_saved_message_title_edit_summary_reminder, R.string.patroller_saved_message_title_do_not_censor, R.string.patroller_saved_message_title_art_imp) + + private val savedMessagesBodyList = listOf( + R.string.talk_warn_saved_messages_usage_instruction, R.string.patroller_saved_message_body_vandalism, R.string.patroller_saved_message_body_editing_tests, R.string.patroller_saved_message_body_npov, + R.string.patroller_saved_message_body_auto_trans, R.string.patroller_saved_message_body_coi_rem, R.string.patroller_saved_message_body_final_warning, + R.string.patroller_saved_message_body_copy_vio, R.string.patroller_saved_message_body_edit_summary, R.string.patroller_saved_message_body_do_not_censor, R.string.patroller_saved_message_body_art_imp) + } } diff --git a/app/src/main/res/drawable/checked.xml b/app/src/main/res/drawable/checked.xml new file mode 100644 index 00000000000..531cf3287df --- /dev/null +++ b/app/src/main/res/drawable/checked.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/custom_checkbox.xml b/app/src/main/res/drawable/custom_checkbox.xml new file mode 100644 index 00000000000..79ec903a089 --- /dev/null +++ b/app/src/main/res/drawable/custom_checkbox.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drag_icon.xml b/app/src/main/res/drawable/drag_icon.xml new file mode 100644 index 00000000000..903d243e616 --- /dev/null +++ b/app/src/main/res/drawable/drag_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/outline_edit_square_24.xml b/app/src/main/res/drawable/outline_edit_square_24.xml new file mode 100644 index 00000000000..457ee9e71b4 --- /dev/null +++ b/app/src/main/res/drawable/outline_edit_square_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/unchecked.xml b/app/src/main/res/drawable/unchecked.xml new file mode 100644 index 00000000000..758646cd619 --- /dev/null +++ b/app/src/main/res/drawable/unchecked.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_add_template.xml b/app/src/main/res/layout/activity_add_template.xml deleted file mode 100644 index 4b42851defe..00000000000 --- a/app/src/main/res/layout/activity_add_template.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_talk_reply.xml b/app/src/main/res/layout/activity_talk_reply.xml index b4341a1c9ac..2b58ab0c650 100644 --- a/app/src/main/res/layout/activity_talk_reply.xml +++ b/app/src/main/res/layout/activity_talk_reply.xml @@ -21,56 +21,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> - - - - - - - - - - - - - - + android:inputType="textEmailSubject" /> - + android:layout_gravity="center_vertical" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + android:layout_marginBottom="48dp" + android:layout_marginHorizontal="12dp" + android:text="@string/talk_warn_learn_more_label" + android:textColor="?attr/primary_color" + android:drawablePadding="12dp" + android:paddingVertical="8dp" + app:drawableStartCompat="@drawable/ic_open_in_new_black_24px" + app:drawableTint="?attr/secondary_color" /> - @@ -129,7 +82,7 @@ android:layout_gravity="bottom" android:layout_marginBottom="48dp" android:background="?attr/paper_color" - android:elevation="12dp"/> + android:elevation="12dp" /> + app:headingsEnable="false" /> + app:contentInsetEnd="0dp" + app:contentInsetStart="0dp"> + android:text="@string/edit_next" /> diff --git a/app/src/main/res/layout/dialog_talk_templates_text_input.xml b/app/src/main/res/layout/dialog_talk_templates_text_input.xml index 08347d11464..30738f1da02 100644 --- a/app/src/main/res/layout/dialog_talk_templates_text_input.xml +++ b/app/src/main/res/layout/dialog_talk_templates_text_input.xml @@ -4,74 +4,45 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - + android:paddingHorizontal="24dp" + android:paddingVertical="8dp"> - - - + android:textColor="?primary_color"/> - - - - - - - - - - + android:textColor="?primary_color" /> + diff --git a/app/src/main/res/layout/fragment_talk_templates.xml b/app/src/main/res/layout/fragment_talk_templates.xml index 6f427923aea..ee3295a9f52 100644 --- a/app/src/main/res/layout/fragment_talk_templates.xml +++ b/app/src/main/res/layout/fragment_talk_templates.xml @@ -1,35 +1,91 @@ - - + android:layout_height="wrap_content" + android:background="?attr/paper_color" + app:elevation="0dp"> + + + + + + + + + + + + + + + + + + android:layout_height="0dp" + android:layout_weight="1"> + + android:layout_gravity="center" /> + android:scrollbars="vertical" + android:paddingBottom="64dp" + android:background="?paper_color" + android:clipToPadding="false" /> + app:srcCompat="@drawable/ic_empty_state_illustration" /> + + diff --git a/app/src/main/res/layout/item_talk_templates.xml b/app/src/main/res/layout/item_talk_templates.xml index acd1e606721..66b746131ae 100644 --- a/app/src/main/res/layout/item_talk_templates.xml +++ b/app/src/main/res/layout/item_talk_templates.xml @@ -6,36 +6,57 @@ tools:layout_width="match_parent" tools:parentTag="android.widget.LinearLayout"> - - - - + android:background="?android:attr/selectableItemBackground" + android:orientation="vertical" + android:paddingHorizontal="18dp" + android:paddingVertical="16dp"> + + + + + + diff --git a/app/src/main/res/layout/view_user_mention_input.xml b/app/src/main/res/layout/view_user_mention_input.xml index 18192275ecb..ddf5853299d 100644 --- a/app/src/main/res/layout/view_user_mention_input.xml +++ b/app/src/main/res/layout/view_user_mention_input.xml @@ -16,6 +16,7 @@ + android:textColorHighlight="?attr/addition_color" /> - - + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_edit_details.xml b/app/src/main/res/menu/menu_edit_details.xml index f88abb24b69..f17005aa446 100644 --- a/app/src/main/res/menu/menu_edit_details.xml +++ b/app/src/main/res/menu/menu_edit_details.xml @@ -23,7 +23,12 @@ android:id="@+id/menu_view_edit_history" android:icon="@drawable/ic_icon_revision_history_apps" app:iconTint="?attr/secondary_color" - android:title="@string/menu_page_edit_history" /> + android:title="@string/patroller_diff_menu_edit_history_title" /> + + - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 1b062aa3f3b..af5b831a3d5 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1487,10 +1487,8 @@ Message that is sent to a recipient when sharing a reading list. Title for dialog box that leads to a survey about sharing reading lists. Message body for dialog box that leads to a survey about sharing reading lists. - Title of the manage warn template screen. Empty message of the warn template. Title of the add a new message screen. - Description of adding a warning message. Label of the new message subject input field. Label of the new message content input field. Button label for saving the new message. @@ -1515,7 +1513,6 @@ Snackbar message that show the messages have been deleted. Error message shown when the template title is empty. - Title of the screen that shows a list of edits. Hint text of in the search bar of searching or filtering edits. Text of showing added tags in this edit. %s will be replaced by the added tags. Text that indicates no tag has been added in this edit. @@ -1575,7 +1572,6 @@ Text indicating a single filter. %d indicates the number of filters. Text indicating more than one filter. %d indicates the number of filters. - Title of the patrol edit screen. Menu text of the overflow menu that shows the article edit history. Snackbar text that indicates the undo process has succeeded. Title of the rollback dialog @@ -1655,6 +1651,12 @@ Negative action button text for places survey dialog Title text for the secondary dialog which is shown as a result of an action on the main dialog for places feature - shown only to users who are very unsatisfied with the feature Empty message for the list in the current map area. Please keep the anchor link around the \"on the map\". + URL that points to a page on mediawiki.org that contains guidelines for usage of saved messages for patrolling edits. + Tab title text for list of user\'s custom saved messages. + Tab title text for list of ready-to-use saved messages made available for user. + Instruction text to guide user on usage of saved messages. + Negative action label text for talk warm messages save dialog. + Error state text shown to user when they are trying to create a talk messgage with duplicate subject. Placeholder text shown to users in the preview dialog of an article, when there isn\'t enough content in the article to show in the preview. Message text shown to users after a successful edit to a stub article. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 365e3b5b8a2..9a9e39d548a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1335,12 +1335,10 @@ Message title Publish Cancel + Don\'t save Message published to editor\'s user talk page Message saved and published to editor\'s user talk page - Select an existing warning message or compose a new message. - Saved messages Saved messages - Learn about message placeholders This talk page is empty. The conversation starts here Talk pages are where people discuss how to make Wikipedia content the best it can be. Start by adding a new discussion topic to connect and collaborate with a community of Wikipedians. @@ -1351,6 +1349,7 @@ Compose message The message cannot be empty. The subject cannot be empty. + Subject name already exists. Try a different one. Reply posted. Undo Last edited %1$s by %2$s]]> @@ -1558,10 +1557,8 @@ - Manage templates - You do not have any warning messages saved. + example messages to get started.]]> New message - Compose warning message. Subject Compose message Save @@ -1586,7 +1583,8 @@ Messages have been deleted The title cannot be empty. - List of edits + Your messages + Example messages Search or filter edits Tags: %s None @@ -1646,7 +1644,6 @@ %d filter %d filters - Patrol edit Article edit history Revert complete Are you sure you want to rollback? @@ -1697,6 +1694,9 @@ Your recent edit appears to include copyrighted material without permission. Please ensure all content complies with this Wikipedia\'s [[Wikipedia:Copyrights|copyright]] policies to avoid removal. Hi {{{username}}}, it appears you removed content from Wikipedia without leaving an edit summary. Please leave an edit summary whenever you add or remove content to Wikipedia. Hi {{{username}}}, it appears you removed content without discussing it on the article talk page. Please note that Wikipedia is not censored, and content should not be removed because it is controversial. If you believe the information is inaccurate, please reach a consensus on the article talk page. + Learn about message placeholders + https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Message_placeholders + Use an example message below to customize, send and save to your messages. Hello {{{username}}}. Your article is a great start! To make it even better, consider adding more references to reliable sources. This helps verify the information and improves the article\'s quality. Check out this Wikipedia\'s guidelines on [[Wikipedia:Reliable_sources|reliable sources]] for more details. Edit diff --git a/app/src/main/res/values/strings_no_translate.xml b/app/src/main/res/values/strings_no_translate.xml index 74d663b942f..58e5c6c4e74 100644 --- a/app/src/main/res/values/strings_no_translate.xml +++ b/app/src/main/res/values/strings_no_translate.xml @@ -74,4 +74,10 @@ tagIconKey tagTextKey + + {{{username}}} + {{{senderUserName}}} + {{{diffLink}}} + [[%1$s|%2$s]] + From 1b258077915547bd581f48b4983e65b44ac1df6d Mon Sep 17 00:00:00 2001 From: Jvr <109031036+Jvr2022@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:48:17 +0100 Subject: [PATCH 006/626] update deps (#4550) * update deps * update deps * update deps --------- Co-authored-by: Dmitry Brant --- .github/workflows/android.yml | 2 +- app/build.gradle | 8 ++++---- build.gradle | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 2dd0d5130a4..b07b4ecf273 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -47,7 +47,7 @@ jobs: - name: Sleep for 30 seconds, to allow the tag to be deleted run: sleep 30s shell: bash - - uses: ncipollo/release-action@v1.13.0 + - uses: ncipollo/release-action@v1.14.0 name: Create new tag and release and upload artifacts with: name: latest diff --git a/app/build.gradle b/app/build.gradle index 09c43f7e58d..a4fdbffa08f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -173,11 +173,11 @@ dependencies { // Debug with ./gradlew -q app:dependencies --configuration compile String okHttpVersion = '4.12.0' - String retrofitVersion = '2.9.0' + String retrofitVersion = '2.10.0' String glideVersion = '4.16.0' String mockitoVersion = '5.2.0' String leakCanaryVersion = '2.13' - String kotlinCoroutinesVersion = '1.7.3' + String kotlinCoroutinesVersion = '1.8.0' String firebaseMessagingVersion = '23.4.1' String mlKitVersion = '17.0.5' String roomVersion = "2.6.1" @@ -195,7 +195,7 @@ dependencies { implementation "com.google.android.material:material:1.11.0" implementation 'androidx.appcompat:appcompat:1.6.1' implementation "androidx.core:core-ktx:1.12.0" - implementation "androidx.browser:browser:1.7.0" + implementation "androidx.browser:browser:1.8.0" implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.fragment:fragment-ktx:1.6.2" implementation "androidx.paging:paging-runtime-ktx:3.2.1" @@ -229,7 +229,7 @@ dependencies { implementation 'com.github.skydoves:balloon:1.6.4' implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0" - implementation 'org.maplibre.gl:android-sdk:10.2.0' + implementation 'org.maplibre.gl:android-sdk:10.3.0' implementation 'org.maplibre.gl:android-plugin-annotation-v9:2.0.2' implementation("androidx.room:room-runtime:$roomVersion") diff --git a/build.gradle b/build.gradle index 7ea6c873a5c..bf7a0227099 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:8.3.0' + classpath 'com.android.tools.build:gradle:8.3.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath 'com.google.gms:google-services:4.4.1' @@ -14,7 +14,7 @@ buildscript { } plugins { - id 'com.google.devtools.ksp' version '1.9.22-1.0.17' apply false + id 'com.google.devtools.ksp' version '1.9.23-1.0.19' apply false } allprojects { From 19f7a0555b04bd19c9103ce786d74dd095ac3468 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 26 Mar 2024 10:13:44 -0400 Subject: [PATCH 007/626] Update kotlin to 1.9.23. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bf7a0227099..ab82023b168 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.9.22' + ext.kotlin_version = '1.9.23' repositories { google() mavenCentral() From 8ee46f6ff76d579807f6a039563f436b7bff97bd Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 26 Mar 2024 11:57:37 -0400 Subject: [PATCH 008/626] Follow-up to saved messages. (#4551) --- .../edit/richtext/SyntaxHighlighter.kt | 1 + .../edit/richtext/SyntaxRuleStyle.kt | 5 +++ .../main/res/layout/activity_talk_reply.xml | 10 ++--- app/src/main/res/values-qq/strings.xml | 44 +++++++++---------- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/wikipedia/edit/richtext/SyntaxHighlighter.kt b/app/src/main/java/org/wikipedia/edit/richtext/SyntaxHighlighter.kt index 50c4083a0ed..af5583aedb7 100644 --- a/app/src/main/java/org/wikipedia/edit/richtext/SyntaxHighlighter.kt +++ b/app/src/main/java/org/wikipedia/edit/richtext/SyntaxHighlighter.kt @@ -23,6 +23,7 @@ class SyntaxHighlighter( private val highlightDelayMillis: Long = HIGHLIGHT_DELAY_MILLIS) { private val syntaxRules = listOf( + SyntaxRule("{{{", "}}}", SyntaxRuleStyle.PRE_TEMPLATE), SyntaxRule("{{", "}}", SyntaxRuleStyle.TEMPLATE), SyntaxRule("[[", "]]", SyntaxRuleStyle.INTERNAL_LINK), SyntaxRule("[", "]", SyntaxRuleStyle.EXTERNAL_LINK), diff --git a/app/src/main/java/org/wikipedia/edit/richtext/SyntaxRuleStyle.kt b/app/src/main/java/org/wikipedia/edit/richtext/SyntaxRuleStyle.kt index d8e1e3c6bb8..334b9ac166d 100644 --- a/app/src/main/java/org/wikipedia/edit/richtext/SyntaxRuleStyle.kt +++ b/app/src/main/java/org/wikipedia/edit/richtext/SyntaxRuleStyle.kt @@ -9,6 +9,11 @@ import org.wikipedia.R import org.wikipedia.util.ResourceUtil enum class SyntaxRuleStyle { + PRE_TEMPLATE { + override fun createSpan(ctx: Context, spanStart: Int, syntaxItem: SyntaxRule): SpanExtents { + return ColorSpanEx(ResourceUtil.getThemedColor(ctx, R.attr.success_color), Color.TRANSPARENT, spanStart, syntaxItem) + } + }, TEMPLATE { override fun createSpan(ctx: Context, spanStart: Int, syntaxItem: SyntaxRule): SpanExtents { return ColorSpanEx(ResourceUtil.getThemedColor(ctx, R.attr.placeholder_color), Color.TRANSPARENT, spanStart, syntaxItem) diff --git a/app/src/main/res/layout/activity_talk_reply.xml b/app/src/main/res/layout/activity_talk_reply.xml index 2b58ab0c650..9ba0de9029d 100644 --- a/app/src/main/res/layout/activity_talk_reply.xml +++ b/app/src/main/res/layout/activity_talk_reply.xml @@ -49,17 +49,17 @@ android:id="@+id/learnMoreButton" style="@style/P" android:background="?android:attr/selectableItemBackground" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginStart="16dp" + android:minHeight="48dp" + android:gravity="center_vertical" + android:layout_marginHorizontal="16dp" android:layout_marginTop="8dp" android:layout_marginBottom="48dp" - android:layout_marginHorizontal="12dp" + android:paddingVertical="8dp" android:text="@string/talk_warn_learn_more_label" android:textColor="?attr/primary_color" android:drawablePadding="12dp" - android:paddingVertical="8dp" app:drawableStartCompat="@drawable/ic_open_in_new_black_24px" app:drawableTint="?attr/secondary_color" /> diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index af5b831a3d5..9c12bfccdd7 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1487,23 +1487,23 @@ Message that is sent to a recipient when sharing a reading list. Title for dialog box that leads to a survey about sharing reading lists. Message body for dialog box that leads to a survey about sharing reading lists. - Empty message of the warn template. - Title of the add a new message screen. - Label of the new message subject input field. - Label of the new message content input field. + Text shown when the user has nothing in their list of saved messages. + Title of the screen for adding a new saved message. + Label of the Subject field for a new saved message. + Label of the Body field for a new saved message. Button label for saving the new message. Title of the dialog of saving changes. Description of the dialog of saving changes. Message of the input field in the dialog of saving changes. - Button label of the dialog of saving changes that save the changes. - Button label of the dialog of saving changes that cancel the changes. - Message of the input field that indicates the name of the template exists in the database. %s will be replaced by the title of the saved message. - Snackbar message that show the message has been saved. + Button label for saving changes to the new message. + Button label for canceling saving changes to the new message. + Message stating that the title of this message already exists. %s will be replaced by the title of the saved message. + Message that shows the message has been saved. Title of the dialog of editing the selected message. Button label of the dialog of editing the selected message that save the changes. - Button label of the dialog of editing the selected message that delete the message. + Button label for deleting the selected saved messages. Snackbar message that show the message has been updated. - Menu label that can start the remove message mode. + Label for menu item that allows selecting multiple messages for removal. Message of confirming the action of deleting the message. Message of confirming the action of deleting the messages. @@ -1512,7 +1512,7 @@ Snackbar message that show the message has been deleted. Snackbar message that show the messages have been deleted. - Error message shown when the template title is empty. + Error message shown when the title of the saved message is empty. Hint text of in the search bar of searching or filtering edits. Text of showing added tags in this edit. %s will be replaced by the added tags. Text that indicates no tag has been added in this edit. @@ -1573,12 +1573,12 @@ Text indicating more than one filter. %d indicates the number of filters. Menu text of the overflow menu that shows the article edit history. - Snackbar text that indicates the undo process has succeeded. + Snackbar text that indicates the edit was undone successfully. Title of the rollback dialog - Snackbar text that indicates the rollback process has succeeded. + Snackbar text that indicates the rollback has succeeded. Label text of the action in the snackbar to view the result of the action. Menu text in the overflow menu to submit feedback for the feature. - Menu text in the overflow menu to view the detail of the feature. + Menu text in the overflow menu to learn more about the feature. Title of the first patroller tasks onboarding screen. Content of the first patroller tasks onboarding screen. Title of the second patroller tasks onboarding screen. @@ -1590,14 +1590,14 @@ Content of the warn section of the second patroller tasks onboarding screen. Title of the undo/rollback section of the second patroller tasks onboarding screen. Content of the undo/rollback section of the second patroller tasks onboarding screen. - Text of the first tooltip for patrol edit diff screen. - Text of the second tooltip for patrol edit diff screen. - Dialog title for the feedback form in the patrol edit screen. - Dialog message for the feedback form in the patrol edit screen. - Option for the feedback form in the patrol edit screen that indicates satisfied. - Option for the feedback form in the patrol edit screen that indicates neutral. - Option for the feedback form in the patrol edit screen that indicates unsatisfied. - Dialog title for the feedback input in the patrol edit screen. + Text of the first tooltip for edit diff screen. + Text of the second tooltip for edit diff screen. + Dialog title for the feedback form in the Edit Patrol screen. + Dialog message for the feedback form in the Edit Patrol screen. + Option for the feedback form in the Edit Patrol screen that indicates satisfied. + Option for the feedback form in the Edit Patrol screen that indicates neutral. + Option for the feedback form in the Edit Patrol screen that indicates unsatisfied. + Dialog title for the feedback input in the Edit Patrol screen. Label text for menu option to view the article\'s edit history. Hint text for input field for the feedback form in the patrol edit screen. Button label for input field for the feedback form in the patrol edit screen. From ca92cfb17fd5c59b4cb470e5525743baa21420b7 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 26 Mar 2024 14:44:32 -0700 Subject: [PATCH 009/626] Fix: crash when tapping on the "Warn" button in the Patroller Tasks (#4554) --- .../java/org/wikipedia/talk/template/TalkTemplatesFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index 002a99d8dfc..a9edc03d823 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -186,7 +186,6 @@ class TalkTemplatesFragment : Fragment() { override fun onTabReselected(tab: TabLayout.Tab) {} }) - setUpTouchListeners() binding.talkTemplatesEmptyStateTextView.text = StringUtil.fromHtml(getString(R.string.talk_templates_empty_message)) @@ -234,6 +233,7 @@ class TalkTemplatesFragment : Fragment() { binding.talkTemplatesRecyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.talkTemplatesRecyclerView.addItemDecoration(DrawableItemDecoration(requireContext(), R.attr.list_divider, drawStart = true, drawEnd = false)) updateAndNotifyAdapter() + setUpTouchListeners() } private fun onLoading() { From 1c0f33c6a01ff6b08ce39325e8851a407f45a3ea Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 27 Mar 2024 05:59:43 -0700 Subject: [PATCH 010/626] Wire EditAttemptStepEvent for undo/rollback action (#4555) * Wire EditAttemptStepEvent for undo/rollback action * Use other for the editor interface for now --- .../wikipedia/diff/ArticleEditDetailsFragment.kt | 13 ++++++++++++- .../wikipedia/diff/ArticleEditDetailsViewModel.kt | 2 -- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt index 41974a864b9..2b24f9e918d 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt @@ -30,6 +30,7 @@ import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.R import org.wikipedia.activity.FragmentUtil +import org.wikipedia.analytics.eventplatform.EditAttemptStepEvent import org.wikipedia.analytics.eventplatform.EditHistoryInteractionEvent import org.wikipedia.analytics.eventplatform.PatrollerExperienceEvent import org.wikipedia.auth.AccountUtil @@ -112,6 +113,10 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M setLoadingState() requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + if (savedInstanceState == null) { + EditAttemptStepEvent.logInit(viewModel.pageTitle, EditAttemptStepEvent.INTERFACE_OTHER) + } + if (!viewModel.fromRecentEdits) { (requireActivity() as AppCompatActivity).supportActionBar?.title = getString(R.string.revision_diff_compare) binding.articleTitleView.text = StringUtil.fromHtml(viewModel.pageTitle.displayText) @@ -175,6 +180,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M viewModel.undoEditResponse.observe(viewLifecycleOwner) { binding.progressBar.isVisible = false if (it is Resource.Success) { + EditAttemptStepEvent.logSaveSuccess(viewModel.pageTitle, EditAttemptStepEvent.INTERFACE_OTHER) setLoadingState() viewModel.getRevisionDetails(it.data.edit!!.newRevId) sendPatrollerExperienceEvent("undo_success", "pt_edit", @@ -183,6 +189,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M editHistoryInteractionEvent?.logUndoSuccess() callback()?.onUndoSuccess() } else if (it is Resource.Error) { + EditAttemptStepEvent.logSaveFailure(viewModel.pageTitle, EditAttemptStepEvent.INTERFACE_OTHER) it.throwable.printStackTrace() FeedbackUtil.showError(requireActivity(), it.throwable) editHistoryInteractionEvent?.logUndoFail() @@ -202,6 +209,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M viewModel.rollbackResponse.observe(viewLifecycleOwner) { binding.progressBar.isVisible = false if (it is Resource.Success) { + EditAttemptStepEvent.logSaveSuccess(viewModel.pageTitle, EditAttemptStepEvent.INTERFACE_OTHER) setLoadingState() viewModel.getRevisionDetails(it.data.rollback?.revision ?: 0) sendPatrollerExperienceEvent("rollback_success", "pt_edit", @@ -209,6 +217,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M showRollbackSnackbar() callback()?.onRollbackSuccess() } else if (it is Resource.Error) { + EditAttemptStepEvent.logSaveFailure(viewModel.pageTitle, EditAttemptStepEvent.INTERFACE_OTHER) it.throwable.printStackTrace() FeedbackUtil.showError(requireActivity(), it.throwable) } @@ -287,7 +296,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M binding.undoButton.setOnClickListener { val canUndo = viewModel.revisionFrom != null && AccountUtil.isLoggedIn val canRollback = AccountUtil.isLoggedIn && viewModel.hasRollbackRights && !viewModel.canGoForward - + EditAttemptStepEvent.logSaveIntent(viewModel.pageTitle, EditAttemptStepEvent.INTERFACE_OTHER) if (canUndo && canRollback) { PopupMenu(requireContext(), binding.undoLabel, Gravity.END).apply { menuInflater.inflate(R.menu.menu_context_undo, menu) @@ -596,6 +605,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M if (viewModel.fromRecentEdits) InvokeSource.SUGGESTED_EDITS_RECENT_EDITS else null) { text -> viewModel.revisionTo?.let { binding.progressBar.isVisible = true + EditAttemptStepEvent.logSaveAttempt(viewModel.pageTitle, EditAttemptStepEvent.INTERFACE_OTHER) viewModel.undoEdit(viewModel.pageTitle, it.user, text.toString(), viewModel.revisionToId, 0) } } @@ -622,6 +632,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M sendPatrollerExperienceEvent("rollback_confirm", "pt_edit") binding.progressBar.isVisible = true viewModel.revisionTo?.let { + EditAttemptStepEvent.logSaveAttempt(viewModel.pageTitle, EditAttemptStepEvent.INTERFACE_OTHER) viewModel.postRollback(viewModel.pageTitle, it.user) } } diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt index 283a0909a4c..bc095b12162 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt @@ -58,8 +58,6 @@ class ArticleEditDetailsViewModel(bundle: Bundle) : ViewModel() { var hasRollbackRights = false var isWatched = false - var feedbackInput = "" - val diffSize get() = if (revisionFrom != null) revisionTo!!.size - revisionFrom!!.size else revisionTo!!.size init { From 6a32f12f4c3dd7312b3b527eb5c9ab8f034641e7 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 27 Mar 2024 13:26:36 -0400 Subject: [PATCH 011/626] Use neutral Talk verbiage in saved messages. (#4552) * Remove unused parameter and logic. * Update Talk icon and label. * Update empty verbiage. * Update correct title. * Remove unnecessary tooltip call. * Revert "Remove unused parameter and logic." This reverts commit eb32cdd4ed23273964c1e7cd8159b39bf264f3ea. * Also set title of TalkReplyActivity. --- .../org/wikipedia/talk/TalkReplyActivity.kt | 5 ++-- .../talk/template/TalkTemplatesFragment.kt | 30 +++++++++++++++++-- .../res/drawable/ic_warning_outline_24.xml | 7 ----- .../layout/fragment_article_edit_details.xml | 4 +-- app/src/main/res/values/strings.xml | 2 +- 5 files changed, 32 insertions(+), 16 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_warning_outline_24.xml diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index b267749de27..10e3dba4e73 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -255,8 +255,8 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } private fun setToolbarTitle(pageTitle: PageTitle) { - val title = StringUtil.fromHtml( - if (viewModel.isNewTopic || viewModel.isFromDiff) pageTitle.namespace.ifEmpty { TalkAliasData.valueFor(pageTitle.wikiSite.languageCode) } + ": " + "${StringUtil.removeNamespace(pageTitle.displayText)}" + val title = if (viewModel.templateManagementMode) getString(R.string.talk_warn_saved_messages) else + StringUtil.fromHtml(if (viewModel.isNewTopic || viewModel.isFromDiff) pageTitle.namespace.ifEmpty { TalkAliasData.valueFor(pageTitle.wikiSite.languageCode) } + ": " + "${StringUtil.removeNamespace(pageTitle.displayText)}" else intent.getStringExtra(EXTRA_PARENT_SUBJECT).orEmpty() ).trim().ifEmpty { getString(R.string.talk_no_subject) } ViewUtil.getTitleViewFromToolbar(binding.replyToolbar)?.let { @@ -264,7 +264,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre val entry = HistoryEntry(TalkTopicsActivity.getNonTalkPageTitle(pageTitle), HistoryEntry.SOURCE_TALK_TOPIC) startActivity(PageActivity.newIntentForNewTab(this, entry, entry.title)) } - FeedbackUtil.setButtonTooltip(it) } supportActionBar?.title = title } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index a9edc03d823..49abb434e33 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -29,8 +29,11 @@ import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.analytics.eventplatform.PatrollerExperienceEvent import org.wikipedia.databinding.FragmentTalkTemplatesBinding +import org.wikipedia.history.HistoryEntry import org.wikipedia.page.LinkMovementMethodExt +import org.wikipedia.page.PageActivity import org.wikipedia.page.PageTitle +import org.wikipedia.staticdata.TalkAliasData import org.wikipedia.talk.TalkReplyActivity import org.wikipedia.talk.TalkReplyActivity.Companion.EXTRA_TEMPLATE_MANAGEMENT import org.wikipedia.talk.TalkReplyActivity.Companion.RESULT_BACK_FROM_TOPIC @@ -41,6 +44,7 @@ import org.wikipedia.util.StringUtil import org.wikipedia.views.DrawableItemDecoration import org.wikipedia.views.MultiSelectActionModeCallback import org.wikipedia.views.SwipeableItemTouchHelperCallback +import org.wikipedia.views.ViewUtil class TalkTemplatesFragment : Fragment() { private var _binding: FragmentTalkTemplatesBinding? = null @@ -63,8 +67,14 @@ class TalkTemplatesFragment : Fragment() { (requireActivity() as AppCompatActivity).setSupportActionBar(binding.toolbar) (requireActivity() as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) - (requireActivity() as AppCompatActivity).supportActionBar?.title = - getString(if (viewModel.templateManagementMode) R.string.talk_warn_saved_messages else R.string.talk_warn) + + setToolbarTitle() + + binding.talkTemplatesRecyclerView.setHasFixedSize(true) + adapter = RecyclerAdapter() + binding.talkTemplatesRecyclerView.adapter = adapter + binding.talkTemplatesRecyclerView.layoutManager = LinearLayoutManager(requireContext()) + binding.talkTemplatesRecyclerView.addItemDecoration(DrawableItemDecoration(requireContext(), R.attr.list_divider, drawStart = true, drawEnd = false)) return binding.root } @@ -186,6 +196,7 @@ class TalkTemplatesFragment : Fragment() { override fun onTabReselected(tab: TabLayout.Tab) {} }) + setUpTouchListeners() binding.talkTemplatesEmptyStateTextView.text = StringUtil.fromHtml(getString(R.string.talk_templates_empty_message)) @@ -195,6 +206,20 @@ class TalkTemplatesFragment : Fragment() { } } + private fun setToolbarTitle() { + val title = if (viewModel.templateManagementMode) getString(R.string.talk_warn_saved_messages) else + StringUtil.fromHtml(viewModel.pageTitle.namespace.ifEmpty { TalkAliasData.valueFor(viewModel.pageTitle.wikiSite.languageCode) } + + ": " + "${StringUtil.removeNamespace(viewModel.pageTitle.displayText)}" + ).trim().ifEmpty { getString(R.string.talk_no_subject) } + ViewUtil.getTitleViewFromToolbar(binding.toolbar)?.let { + it.movementMethod = LinkMovementMethodExt { _ -> + val entry = HistoryEntry(TalkTopicsActivity.getNonTalkPageTitle(viewModel.pageTitle), HistoryEntry.SOURCE_TALK_TOPIC) + startActivity(PageActivity.newIntentForNewTab(requireActivity(), entry, entry.title)) + } + } + (requireActivity() as AppCompatActivity).supportActionBar?.title = title + } + private fun showToolbarEditView(visible: Boolean) { binding.toolBarEditView.isVisible = visible } @@ -233,7 +258,6 @@ class TalkTemplatesFragment : Fragment() { binding.talkTemplatesRecyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.talkTemplatesRecyclerView.addItemDecoration(DrawableItemDecoration(requireContext(), R.attr.list_divider, drawStart = true, drawEnd = false)) updateAndNotifyAdapter() - setUpTouchListeners() } private fun onLoading() { diff --git a/app/src/main/res/drawable/ic_warning_outline_24.xml b/app/src/main/res/drawable/ic_warning_outline_24.xml deleted file mode 100644 index 6981593014b..00000000000 --- a/app/src/main/res/drawable/ic_warning_outline_24.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/fragment_article_edit_details.xml b/app/src/main/res/layout/fragment_article_edit_details.xml index e211c2e323c..28449700863 100644 --- a/app/src/main/res/layout/fragment_article_edit_details.xml +++ b/app/src/main/res/layout/fragment_article_edit_details.xml @@ -557,7 +557,7 @@ android:layout_marginTop="12dp" android:layout_gravity="center_horizontal" app:tint="?attr/placeholder_color" - app:srcCompat="@drawable/ic_warning_outline_24" /> + app:srcCompat="@drawable/ic_notification_user_talk" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9a9e39d548a..ae68193ca3c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1557,7 +1557,7 @@ - example messages to get started.]]> + example messages to get started.]]> New message Subject Compose message From 617b669c501f4a653159a689880ae8eb8d156269 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 27 Mar 2024 13:40:21 -0400 Subject: [PATCH 012/626] Enable clicking Diff links in edit preview. (#4556) Co-authored-by: Cooltey Feng --- .../org/wikipedia/edit/preview/EditPreviewFragment.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.kt b/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.kt index 926a50016dc..e5a6c722b68 100644 --- a/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.kt +++ b/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.kt @@ -20,6 +20,7 @@ import org.wikipedia.dataclient.RestService import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.okhttp.OkHttpWebViewClient +import org.wikipedia.diff.ArticleEditDetailsActivity import org.wikipedia.history.HistoryEntry import org.wikipedia.json.JsonUtil import org.wikipedia.page.ExclusiveBottomSheetPresenter @@ -154,7 +155,7 @@ class EditPreviewFragment : Fragment(), CommunicationBridgeListener, ReferenceDi } override fun onInternalLinkClicked(title: PageTitle) { - showLeavingEditDialogue { + showLeavingEditDialog { startActivity( PageActivity.newIntentForCurrentTab( context, @@ -165,7 +166,7 @@ class EditPreviewFragment : Fragment(), CommunicationBridgeListener, ReferenceDi } override fun onExternalLinkClicked(uri: Uri) { - showLeavingEditDialogue { UriUtil.handleExternalLink(context, uri) } + showLeavingEditDialog { UriUtil.handleExternalLink(context, uri) } } override fun onMediaLinkClicked(title: PageTitle) { @@ -173,7 +174,9 @@ class EditPreviewFragment : Fragment(), CommunicationBridgeListener, ReferenceDi } override fun onDiffLinkClicked(title: PageTitle, revisionId: Long) { - // ignore + showLeavingEditDialog { + startActivity(ArticleEditDetailsActivity.newIntent(requireContext(), title, revisionId)) + } } /** @@ -182,7 +185,7 @@ class EditPreviewFragment : Fragment(), CommunicationBridgeListener, ReferenceDi * * @param runnable The runnable that is run if the user chooses to leave. */ - private fun showLeavingEditDialogue(runnable: Runnable) { + private fun showLeavingEditDialog(runnable: Runnable) { // Ask the user if they really meant to leave the edit workflow MaterialAlertDialogBuilder(requireActivity()) .setMessage(R.string.dialog_message_leaving_edit) From d46a13a1ff0804fdf6a43edd78c6ba695f8637b2 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 27 Mar 2024 10:53:58 -0700 Subject: [PATCH 013/626] Add onDiffLinkClicked support to TalkTopic (#4557) --- app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt index 3255353a88d..dda648deb2d 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt @@ -24,6 +24,7 @@ import org.wikipedia.commons.FilePageActivity import org.wikipedia.databinding.ActivityTalkTopicBinding import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.discussiontools.ThreadItem +import org.wikipedia.diff.ArticleEditDetailsActivity import org.wikipedia.edit.EditHandler import org.wikipedia.edit.EditSectionActivity import org.wikipedia.history.HistoryEntry @@ -407,7 +408,7 @@ class TalkTopicActivity : BaseActivity() { } override fun onDiffLinkClicked(title: PageTitle, revisionId: Long) { - // TODO + startActivity(ArticleEditDetailsActivity.newIntent(this@TalkTopicActivity, title, revisionId)) } override lateinit var wikiSite: WikiSite From ac972838b0c1464e605a9bddfa5c9e710611f272 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 27 Mar 2024 13:35:05 -0700 Subject: [PATCH 014/626] Data wiring for Saved messages (#4553) * Data wiring for Saved messages * Update parameters and build action data * Add a method in Callback to record action * Fix lint * Update wiring * Remove init event * Remove duplicated events * Update logic * Spelling. --------- Co-authored-by: Dmitry Brant Co-authored-by: Dmitry Brant --- .../eventplatform/PatrollerExperienceEvent.kt | 8 +++++ .../diff/ArticleEditDetailsFragment.kt | 1 + .../SuggestedEditsRecentEditsFragment.kt | 5 +-- .../org/wikipedia/talk/TalkReplyActivity.kt | 22 ++++++++----- .../org/wikipedia/talk/TalkReplyViewModel.kt | 2 +- .../talk/template/TalkTemplatesFragment.kt | 33 +++++++++++-------- .../talk/template/TalkTemplatesViewModel.kt | 14 +++++--- .../res/layout/fragment_talk_templates.xml | 8 ++--- 8 files changed, 60 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/wikipedia/analytics/eventplatform/PatrollerExperienceEvent.kt b/app/src/main/java/org/wikipedia/analytics/eventplatform/PatrollerExperienceEvent.kt index a3d5269d8bd..e890dde8580 100644 --- a/app/src/main/java/org/wikipedia/analytics/eventplatform/PatrollerExperienceEvent.kt +++ b/app/src/main/java/org/wikipedia/analytics/eventplatform/PatrollerExperienceEvent.kt @@ -41,6 +41,14 @@ class PatrollerExperienceEvent { filterSelectedStr + filterWikiStr + filtersListStr + appLanguageCodeAddedStr + appLanguageCodesStr } + fun getPublishMessageActionString(isModified: Boolean? = null, isSaved: Boolean? = null, isExample: Boolean? = null, exampleMessage: String? = null): String { + val isModifiedStr = isModified?.let { "is_modified: $it, " }.orEmpty() + val isSavedStr = isSaved?.let { "is_saved: $it, " }.orEmpty() + val isExampleStr = isExample?.let { "is_example: $it, " }.orEmpty() + val exampleMessageStr = exampleMessage?.let { "example_message: $it " }.orEmpty() + return isModifiedStr + isSavedStr + isExampleStr + exampleMessageStr + } + private fun submitPatrollerActivityEvent(action: String, activeInterface: String, actionData: String = "") { EventPlatformClient.submit( AppInteractionEvent( diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt index 2b24f9e918d..3d27b70d1ee 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt @@ -385,6 +385,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M true } R.id.menu_saved_messages -> { + sendPatrollerExperienceEvent("diff_saved_init", "pt_warning_messages") val pageTitle = PageTitle(UserTalkAliasData.valueFor(viewModel.pageTitle.wikiSite.languageCode), viewModel.pageTitle.text, viewModel.pageTitle.wikiSite) requireActivity().startActivity(TalkTemplatesActivity.newIntent(requireContext(), pageTitle, true)) true diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt index 09ccfb3a1a5..ca1c03bbf3f 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt @@ -175,8 +175,9 @@ class SuggestedEditsRecentEditsFragment : Fragment(), MenuProvider { true } R.id.menu_saved_messages -> { - val pageTitle = PageTitle(UserAliasData.valueFor(viewModel.wikiSite.languageCode), AccountUtil.userName.orEmpty(), viewModel.wikiSite) - requireActivity().startActivity(TalkTemplatesActivity.newIntent(requireContext(), pageTitle, true)) + sendPatrollerExperienceEvent("list_saved_init", "pt_warning_messages") + val pageTitle = PageTitle(UserAliasData.valueFor(viewModel.wikiSite.languageCode), AccountUtil.userName.orEmpty(), viewModel.wikiSite) + requireActivity().startActivity(TalkTemplatesActivity.newIntent(requireContext(), pageTitle, true)) true } R.id.menu_report_feature -> { diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index 10e3dba4e73..9f2badf232f 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -133,6 +133,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } binding.learnMoreButton.setOnClickListener { + sendPatrollerExperienceEvent("learn_click", "pt_warning_messages") UriUtil.visitInExternalBrowser(this, Uri.parse(getString(R.string.talk_warn_learn_more_url))) } @@ -319,8 +320,8 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } else { showEditPreview() } - val messageType = if (textInputDialog.isSaveAsNewChecked) "new" else if (textInputDialog.isSaveExistingChecked) "updated" else "" - sendPatrollerExperienceEvent("publish_message_click", "pt_warning_messages", PatrollerExperienceEvent.getActionDataString(messageType = messageType)) + val messageType = if (textInputDialog.isSaveAsNewChecked) "new" else "updated" + sendPatrollerExperienceEvent("save_message_success", "pt_warning_messages", PatrollerExperienceEvent.getActionDataString(messageType = messageType)) } override fun onCancel() { @@ -381,7 +382,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre if (messagePreviewFragment.isActive) { EditAttemptStepEvent.logSaveAttempt(viewModel.pageTitle) - + PatrollerExperienceEvent.logAction("publish_message_click", "pt_warning_messages") binding.progressBar.isVisible = true setSaveButtonEnabled(false) viewModel.postReply(subject, getWikitextBody()) @@ -401,10 +402,9 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre if (viewModel.isFromDiff && subjectOrBodyModified) { setSaveButtonEnabled(false) - sendPatrollerExperienceEvent("publish_saved_message_click", "pt_warning_messages") DeviceUtil.hideSoftKeyboard(this) if (viewModel.templateManagementMode) { - if (viewModel.selectedTemplate != null && !viewModel.isSavedTemplate) { + if (viewModel.selectedTemplate != null && !viewModel.isExampleTemplate) { viewModel.selectedTemplate?.let { viewModel.updateTemplate(it.title, subject, body, it) } @@ -414,12 +414,14 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } else { if (viewModel.selectedTemplate != null && viewModel.selectedTemplate?.subject == subject && viewModel.selectedTemplate?.message == body) { + sendPatrollerExperienceEvent("message_review_next_click", "pt_warning_messages") showEditPreview() } else { showSaveDialog(subject, body) } } } else { + sendPatrollerExperienceEvent("message_review_next_click", "pt_warning_messages") showEditPreview() setSaveButtonEnabled(true) } @@ -453,6 +455,10 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre private fun onSaveSuccess(newRevision: Long) { AnonymousNotificationHelper.onEditSubmitted() + PatrollerExperienceEvent.logAction("publish_message_success", "pt_warning_messages", + PatrollerExperienceEvent.getPublishMessageActionString(isModified = viewModel.selectedTemplate != null && subjectOrBodyModified, + isSaved = viewModel.talkTemplateSaved, isExample = viewModel.isExampleTemplate, exampleMessage = if (viewModel.isExampleTemplate) viewModel.selectedTemplate?.title else null)) + binding.progressBar.visibility = View.GONE setSaveButtonEnabled(true) EditAttemptStepEvent.logSaveSuccess(viewModel.pageTitle) @@ -563,7 +569,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre const val FROM_REVISION_ID = "fromRevisionId" const val EXTRA_SELECTED_TEMPLATE = "selectedTemplate" const val EXTRA_TEMPLATE_MANAGEMENT = "templateManagement" - const val EXTRA_SAVED_TEMPLATE = "savedTemplate" + const val EXTRA_EXAMPLE_TEMPLATE = "exampleTemplate" // TODO: persist in db. But for now, it's fine to store these for the lifetime of the app. val draftReplies = lruCache(10) @@ -580,7 +586,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre toRevisionId: Long = -1, fromRevisionId: Long = -1, templateManagementMode: Boolean = false, - isSavedTemplate: Boolean = false + isExampleTemplate: Boolean = false ): Intent { return Intent(context, TalkReplyActivity::class.java) .putExtra(Constants.ARG_TITLE, pageTitle) @@ -591,7 +597,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre .putExtra(EXTRA_FROM_DIFF, fromDiff) .putExtra(EXTRA_SELECTED_TEMPLATE, selectedTemplate) .putExtra(EXTRA_TEMPLATE_MANAGEMENT, templateManagementMode) - .putExtra(EXTRA_SAVED_TEMPLATE, isSavedTemplate) + .putExtra(EXTRA_EXAMPLE_TEMPLATE, isExampleTemplate) .putExtra(FROM_REVISION_ID, fromRevisionId) .putExtra(TO_REVISION_ID, toRevisionId) .putExtra(Constants.INTENT_EXTRA_INVOKE_SOURCE, invokeSource) diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt index cdcefb062c4..534aa939c54 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt @@ -30,7 +30,7 @@ class TalkReplyViewModel(bundle: Bundle) : ViewModel() { val topic = bundle.parcelable(TalkReplyActivity.EXTRA_TOPIC) val isFromDiff = bundle.getBoolean(TalkReplyActivity.EXTRA_FROM_DIFF, false) val selectedTemplate = bundle.parcelable(TalkReplyActivity.EXTRA_SELECTED_TEMPLATE) - val isSavedTemplate = bundle.getBoolean(TalkReplyActivity.EXTRA_SAVED_TEMPLATE, false) + val isExampleTemplate = bundle.getBoolean(TalkReplyActivity.EXTRA_EXAMPLE_TEMPLATE, false) val templateManagementMode = bundle.getBoolean(TalkReplyActivity.EXTRA_TEMPLATE_MANAGEMENT, false) val fromRevisionId = bundle.getLong(TalkReplyActivity.FROM_REVISION_ID, -1) val toRevisionId = bundle.getLong(TalkReplyActivity.TO_REVISION_ID, -1) diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index 49abb434e33..ced940f0dfa 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -169,14 +169,16 @@ class TalkTemplatesFragment : Fragment() { } } - binding.addTemplateFab.setOnClickListener { + binding.addSavedMessageFab.setOnClickListener { + PatrollerExperienceEvent.logAction("new_message_init", "pt_warning_messages") requestNewTemplate.launch(TalkReplyActivity.newIntent(requireContext(), viewModel.pageTitle, null, null, invokeSource = Constants.InvokeSource.DIFF_ACTIVITY, fromDiff = true, templateManagementMode = viewModel.templateManagementMode, fromRevisionId = viewModel.fromRevisionId, toRevisionId = viewModel.toRevisionId)) } - binding.toolBarEditView.setOnClickListener { + binding.toolBarEditButton.setOnClickListener { if (actionMode == null) { + PatrollerExperienceEvent.logAction("edit_message_click", "pt_templates") beginRemoveItemsMode() updateAndNotifyAdapter() } @@ -189,7 +191,7 @@ class TalkTemplatesFragment : Fragment() { } touchCallback.swipeableEnabled = tab.position == 0 updateAndNotifyAdapter() - showToolbarEditView(tab.position == 0) + showToolbarEditButton(tab.position == 0) } override fun onTabUnselected(tab: TabLayout.Tab) {} @@ -206,6 +208,10 @@ class TalkTemplatesFragment : Fragment() { } } + private fun showToolbarEditButton(visible: Boolean) { + binding.toolBarEditButton.isVisible = visible + } + private fun setToolbarTitle() { val title = if (viewModel.templateManagementMode) getString(R.string.talk_warn_saved_messages) else StringUtil.fromHtml(viewModel.pageTitle.namespace.ifEmpty { TalkAliasData.valueFor(viewModel.pageTitle.wikiSite.languageCode) } + @@ -220,10 +226,6 @@ class TalkTemplatesFragment : Fragment() { (requireActivity() as AppCompatActivity).supportActionBar?.title = title } - private fun showToolbarEditView(visible: Boolean) { - binding.toolBarEditView.isVisible = visible - } - private fun setUpTouchListeners() { touchCallback = SwipeableItemTouchHelperCallback(requireContext()) touchCallback.swipeableEnabled = true @@ -242,7 +244,7 @@ class TalkTemplatesFragment : Fragment() { adapter.templatesList.clear() adapter.templatesList.addAll(if (binding.talkTemplatesTabLayout.selectedTabPosition == 0) viewModel.talkTemplatesList else viewModel.savedTemplatesList) updateEmptyState() - showToolbarEditView(binding.talkTemplatesTabLayout.selectedTabPosition == 0 && viewModel.talkTemplatesList.isNotEmpty()) + showToolbarEditButton(binding.talkTemplatesTabLayout.selectedTabPosition == 0 && viewModel.talkTemplatesList.isNotEmpty()) adapter.notifyDataSetChanged() } @@ -268,7 +270,7 @@ class TalkTemplatesFragment : Fragment() { private fun onSuccess() { setRecyclerView() - showToolbarEditView(binding.talkTemplatesTabLayout.selectedTabPosition == 0 && viewModel.talkTemplatesList.isNotEmpty()) + showToolbarEditButton(binding.talkTemplatesTabLayout.selectedTabPosition == 0 && viewModel.talkTemplatesList.isNotEmpty()) binding.talkTemplatesEmptyContainer.isVisible = viewModel.talkTemplatesList.isEmpty() binding.talkTemplatesErrorView.visibility = View.GONE binding.talkTemplatesProgressBar.visibility = View.GONE @@ -280,6 +282,7 @@ class TalkTemplatesFragment : Fragment() { private fun onDeleted(size: Int) { PatrollerExperienceEvent.logAction("message_deleted_toast", "pt_templates") + PatrollerExperienceEvent.logAction("delete_message_success", "pt_warning_messages") val messageStr = resources.getQuantityString(R.plurals.talk_templates_message_deleted, size) FeedbackUtil.makeSnackbar(requireActivity(), messageStr) .setAction(R.string.reading_list_item_delete_undo) { @@ -319,6 +322,7 @@ class TalkTemplatesFragment : Fragment() { override fun onSwipe() { selectedItems.add(entry) + PatrollerExperienceEvent.logAction("delete_message_click", "pt_warning_messages") deleteSelectedTalkTemplates() } @@ -368,17 +372,19 @@ class TalkTemplatesFragment : Fragment() { } override fun onClick(position: Int) { - if (position == 0 && binding.talkTemplatesTabLayout.selectedTabPosition == 1) { + val inExampleMessagesTab = binding.talkTemplatesTabLayout.selectedTabPosition == 1 + if (position == 0 && inExampleMessagesTab) { return } if (actionMode != null) { toggleSelectedItem(templatesList[position]) adapter.notifyItemChanged(position) } else { - PatrollerExperienceEvent.logAction("edit_message_click", "pt_templates") + val logAction = if (inExampleMessagesTab) "example_message_select_click" else "saved_message_select_click" + PatrollerExperienceEvent.logAction(logAction, "pt_warning_messages") requestEditTemplate.launch(TalkReplyActivity.newIntent(requireContext(), viewModel.pageTitle, null, null, invokeSource = Constants.InvokeSource.DIFF_ACTIVITY, fromDiff = true, selectedTemplate = templatesList[position], templateManagementMode = viewModel.templateManagementMode, fromRevisionId = viewModel.fromRevisionId, - toRevisionId = viewModel.toRevisionId, isSavedTemplate = binding.talkTemplatesTabLayout.selectedTabPosition == 1)) + toRevisionId = viewModel.toRevisionId, isExampleTemplate = inExampleMessagesTab)) } } @@ -469,6 +475,7 @@ class TalkTemplatesFragment : Fragment() { super.onActionItemClicked(mode, menuItem) when (menuItem.itemId) { R.id.menu_check_all -> { + PatrollerExperienceEvent.logAction("delete_messages_init", "pt_warning_messages") selectAllTalkTemplates(mode) menuItem.isVisible = false mode.menu.findItem(R.id.menu_uncheck_all).isVisible = true @@ -486,7 +493,7 @@ class TalkTemplatesFragment : Fragment() { override fun onDeleteSelected() { if (selectedItems.size > 0) { - PatrollerExperienceEvent.logAction("more_menu_remove_confirm", "pt_templates") + PatrollerExperienceEvent.logAction("delete_messages_click", "pt_warning_messages") val messageStr = resources.getQuantityString( R.plurals.talk_templates_message_delete_description, selectedItems.size diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt index 26035cc6fc2..17f56df2e0b 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt @@ -21,7 +21,8 @@ import org.wikipedia.page.PageTitle import org.wikipedia.talk.TalkReplyActivity import org.wikipedia.talk.TalkReplyActivity.Companion.EXTRA_TEMPLATE_MANAGEMENT import org.wikipedia.talk.db.TalkTemplate -import java.util.* +import java.util.Collections +import java.util.Locale class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { @@ -65,9 +66,9 @@ class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { private fun loadSavedTemplates() { val langCode = pageTitle.wikiSite.languageCode val context = WikipediaApp.instance.applicationContext - for (i in savedMessagesTitleList.indices) { - val talkTemplate = TalkTemplate(0, 0, -1, "", - if (i == 0) "" else getLocaleStringResource(Locale(langCode), savedMessagesTitleList[i], context), + for (i in savedMessagesSubjectList.indices) { + val talkTemplate = TalkTemplate(0, 0, -1, savedMessagesTitleList[i], + if (i == 0) "" else getLocaleStringResource(Locale(langCode), savedMessagesSubjectList[i], context), getLocaleStringResource(Locale(langCode), savedMessagesBodyList[i], context)) savedTemplatesList.add(talkTemplate) } @@ -141,7 +142,10 @@ class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { } companion object { - private val savedMessagesTitleList = listOf(-1, R.string.patroller_saved_message_title_vandalism, R.string.patroller_saved_message_title_editing_tests, R.string.patroller_saved_message_title_npov, + // This is for data analytics only + private val savedMessagesTitleList = listOf("", "vandalism", "edit_tests", "neutral", "translation", "conflict_interest", "final", "copyright", "leave_summary", "no_censor", "improvement") + + private val savedMessagesSubjectList = listOf(-1, R.string.patroller_saved_message_title_vandalism, R.string.patroller_saved_message_title_editing_tests, R.string.patroller_saved_message_title_npov, R.string.patroller_saved_message_title_auto_trans, R.string.patroller_saved_message_title_coi_rem, R.string.patroller_saved_message_title_final_warning, R.string.patroller_saved_message_title_copy_vio, R.string.patroller_saved_message_title_edit_summary_reminder, R.string.patroller_saved_message_title_do_not_censor, R.string.patroller_saved_message_title_art_imp) diff --git a/app/src/main/res/layout/fragment_talk_templates.xml b/app/src/main/res/layout/fragment_talk_templates.xml index ee3295a9f52..7e00213e093 100644 --- a/app/src/main/res/layout/fragment_talk_templates.xml +++ b/app/src/main/res/layout/fragment_talk_templates.xml @@ -7,7 +7,7 @@ android:orientation="vertical"> Date: Wed, 27 Mar 2024 16:52:37 -0400 Subject: [PATCH 015/626] Bump versionCode. (#4558) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a4fdbffa08f..eb2911ea4cb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50479 + versionCode 50480 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From 9a119c22d049222cfcd11600168fa416e53e5a25 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 28 Mar 2024 18:51:07 +0530 Subject: [PATCH 016/626] Localisation updates from https://translatewiki.net. (#4562) --- app/src/main/res/values-az/strings.xml | 6 ++ .../main/res/values-b+be+x+old/strings.xml | 12 +++- app/src/main/res/values-b+sr+Latn/strings.xml | 8 +-- app/src/main/res/values-b+tt+Cyrl/strings.xml | 7 +- app/src/main/res/values-ba/strings.xml | 8 +-- app/src/main/res/values-be/strings.xml | 8 +-- app/src/main/res/values-bew/strings.xml | 8 +-- app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 2 + app/src/main/res/values-br/strings.xml | 2 - app/src/main/res/values-ca/strings.xml | 8 +-- app/src/main/res/values-da/strings.xml | 3 - app/src/main/res/values-dag/strings.xml | 8 +-- app/src/main/res/values-de/strings.xml | 2 - app/src/main/res/values-dga/strings.xml | 8 +-- app/src/main/res/values-es/strings.xml | 8 ++- app/src/main/res/values-fa/strings.xml | 65 +++++++++---------- app/src/main/res/values-fi/strings.xml | 7 +- app/src/main/res/values-fr/strings.xml | 18 ++--- app/src/main/res/values-ha/strings.xml | 8 +-- app/src/main/res/values-hu/strings.xml | 8 +-- app/src/main/res/values-ia/strings.xml | 20 ++++-- app/src/main/res/values-in/strings.xml | 8 +-- app/src/main/res/values-it/strings.xml | 6 +- app/src/main/res/values-iw/strings.xml | 17 ++--- app/src/main/res/values-ja/strings.xml | 8 +-- app/src/main/res/values-ko/strings.xml | 8 +-- app/src/main/res/values-kus/strings.xml | 1 - app/src/main/res/values-lb/strings.xml | 3 - app/src/main/res/values-mk/strings.xml | 17 ++--- app/src/main/res/values-my/strings.xml | 8 +++ app/src/main/res/values-nb/strings.xml | 8 +-- app/src/main/res/values-nl/strings.xml | 49 ++++++++++++-- app/src/main/res/values-pa/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 5 +- app/src/main/res/values-pt/strings.xml | 8 +-- app/src/main/res/values-qq/strings.xml | 20 +++--- app/src/main/res/values-ro/strings.xml | 2 - app/src/main/res/values-ru/strings.xml | 26 ++++++-- app/src/main/res/values-sdh/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 8 +-- app/src/main/res/values-smn/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 13 ++-- app/src/main/res/values-sv/strings.xml | 8 +-- app/src/main/res/values-tly/strings.xml | 2 - app/src/main/res/values-tr/strings.xml | 8 +-- app/src/main/res/values-uk/strings.xml | 9 +-- app/src/main/res/values-uz/strings.xml | 8 +-- app/src/main/res/values-zh-rTW/strings.xml | 43 ++++++------ app/src/main/res/values-zh/strings.xml | 8 +-- 50 files changed, 226 insertions(+), 304 deletions(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index b0ac7baffa1..af4aeef96c5 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -618,5 +618,11 @@ Qalın Şablon Kömək + Yadda saxlama + Mövzu adı artıq mövcuddur. Başqasını sınayın. İzləmədə saxlama müddətini seçin + Başlamaq üçün öz xəbərdarlıq mesajlarınızı yaradın və ya <a href=\"#\">nümunə mesajlarından</a> istifadə edin. + Mesajlarınız + Nümunə mesajlar + Mesajlarınızı fərdiləşdirmək, göndərmək və saxlamaq üçün aşağıdakı nümunə mesajından istifadə edin. diff --git a/app/src/main/res/values-b+be+x+old/strings.xml b/app/src/main/res/values-b+be+x+old/strings.xml index 60732f01917..f9728d90da8 100644 --- a/app/src/main/res/values-b+be+x+old/strings.xml +++ b/app/src/main/res/values-b+be+x+old/strings.xml @@ -49,6 +49,16 @@ Падзяліцца праз Падзяліцца праз Перанакіравана з %s + Гісторыя вэрсіяў: %s + <b>д</b> %s + Пустое апісаньне рэдагаваньня + Пошук або фільтар рэдагаваньняў + Фільтраваць паводле + Усе рэдагаваньні (%s) + Рэдагаваньні ўдзельніка (%s) + Ананімныя рэдагаваньні (%s) + Рэдагаваньні робатаў (%s) + Мэтрыкі ад %1$s да %2$s Паказаць укладкі Зьмяніць мову Знайсьці ў артыкуле @@ -184,7 +194,7 @@ Перакладчыкі Гэтае дастасаваньне было перакладзеная дабраахвотнікамі на <a href=\"https://translatewiki.net\">translatewiki.net</a>. Ліцэнзія - Крынічны код даступны на <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> і <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> пад <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">ліцэнзіяй Apache 2.0</a>. Калі не пазначана іншае, зьмест даступны пад <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">ліцэнзіяй Creative Commons Attribution-ShareAlike</a>. + Крынічны код даступны на <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> пад <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">ліцэнзіяй Apache 2.0</a>. Калі не пазначана іншае, зьмест даступны пад <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">ліцэнзіяй Creative Commons Attribution-ShareAlike</a>. Прадукт <a href=\"https://wikimediafoundation.org/\">фундацыі «Вікімэдыя»</a> Пра Старонка была зьмененая. Вы ўпэўнены, што жадаеце выйсьці без захаваньня Вашых зьменаў? diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index cdcb4941607..87bad398bbd 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -1200,8 +1200,6 @@ Otkaži Poruka je objavljena na urednikovoj stranici za razgovor Poruka je sačuvana i objavljena na urednikovoj stranici za razgovor - Odaberi postojeću poruku upozorenja ili započnite novu poruku. - Sačuvane poruke Ova stranica za razgovor je prazna. Razgovor počinje ovde Stranice za razgovor su mesta gde urednici diskutuju kako da učine sadržaj Vikipediji najboljim mogućim. Počnite dodavanjem nove teme za diskusiju da bi ste se povezali i sarađivali sa zajednicom Vikipedijanaca. @@ -1405,10 +1403,8 @@ Zdravo! Želim da podelim moju listu za čitanje na Vikipediji sa vama: Da li možete da nam pomognete u unapređivanju \"deljenja listi za čitanje\"? \"Deljenje listi za čitanje\" je testna mogućnost i potrebne su vam vaše povratne informacije da bi smo je unapredili ili uklonili. - Upravljanje šablonima - Nemate sačuvane poruke upozorenja. + Nemate sačuvane poruke upozorenja. Nova poruka - Sastavi poruku upozorenja. Tema Napiši poruku Sačuvaj @@ -1424,7 +1420,6 @@ Obriši Poruka je izmenjena Poruka je obrisana - Spisak izmena Pretraga ili filtriranje izmena Oznake: %s Nema @@ -1484,7 +1479,6 @@ %d filter %d filtera - Patroliraj izmenu Istorija Vraćanje je završeno Sigurno vrati izmene? diff --git a/app/src/main/res/values-b+tt+Cyrl/strings.xml b/app/src/main/res/values-b+tt+Cyrl/strings.xml index 2d6cda8728f..aaef754e3cb 100644 --- a/app/src/main/res/values-b+tt+Cyrl/strings.xml +++ b/app/src/main/res/values-b+tt+Cyrl/strings.xml @@ -1226,8 +1226,6 @@ Кире алу Хәбәр редактор кулланучыларының фикер алышу битендә басылган Хәбәр редактор кулланучының фикер алышу битендә сакланган һәм бастырылган. - Гамәлдәге кисәтә торган хәбәрне сайлагыз яисә яңа хәбәр төзегез. - Сакланган хәбәрләр Фикер алышуның бу бите буш. Фикер алышу монда башлана Фикер алышу битләре - кешеләр Википедиянең эчтәлеген мөмкин кадәр яхшы итү турында фикер алышкан урын. Википедистлар җәмгыяте белән хезмәттәшлек итү һәм элемтә урнаштыру өчен фикер алышуга яңа теманы өстәүдән башлагыз. @@ -1431,10 +1429,8 @@ Сәлам! Мин сезнең белән Википедиядәге үземнең уку исемлеге белән уртаклашырга телим. Сез безгә \"Уку исемлекләре белән уртаклашырга\" дигән функцияне яхшыртырга ярдәм итә аласызмы? \"Уку исемлекләре белән уртаклашырга\" — бу текст функциясе һәм безгә аны яхшырту яки бетерү өчен сезнең фикерләрегез кирәк. - Калыплар белән идарә итү - Сезнең бернинди кисәтү хәбәрләре сакланмаган. + Сезнең бернинди кисәтү хәбәрләре сакланмаган. Яңа хәбәр - Кисәтү хәбәре ясагыз. Тема Хәбәр язарга Сакларга @@ -1450,7 +1446,6 @@ Бетерергә Хәбәр яңартылды Хәбәр бетерелде - Төзәтмәләр исемлеге Үзгәрешләрне эзләү яки фильтрлау Теглар: %s Һичкем diff --git a/app/src/main/res/values-ba/strings.xml b/app/src/main/res/values-ba/strings.xml index a03250f2ae4..ad994f8b737 100644 --- a/app/src/main/res/values-ba/strings.xml +++ b/app/src/main/res/values-ba/strings.xml @@ -1231,8 +1231,6 @@ Кире алырға Хәбәр мөхәррирҙең фекер алышыу битенә яҙылды Хәбәр мөхәррирҙең фекер алышыу битендә яҙҙырылды һәм һаҡланды - Булған иҫкәртеү хәбәрен һайлағыҙ йәки яңы хәбәр яҙығыҙ. - Һаҡланған хәбәрҙәр Был фекер алышыу бите буш. Фекер алышыу ошонда башлана Фекер алышыу биттәрендә кешеләр Википедия йөкмәткеһен мөмкин тиклем сифатлы итеү тураһында фекер алыша. Википедиясылар берләшмәһе менән аралашыу һәм хеҙмәттәшлек итеү өсөн фекер алышыу битендә яңы тема өҫтәүҙән башлағыҙ. @@ -1436,10 +1434,8 @@ Сәләм! Мин һеҙҙең менән Википедиялағы үҙемдең уҡыу исемлеге менән уртаҡлашырға теләйем: \"Уҡыу исемлектәре менән уртаҡлашыу\" мөмкинлеген яҡшыртырға ярҙам итә алаһығыҙмы? \"Уҡыу исемлектәре менән уртаҡлашырға\" — был тест функцияһы һәм уны яҡшыртыу йәки юйҙырыу өсөн фекерҙәрегеҙ кәрәк. - Ҡалыптар менән идара итеү - Һеҙҙә бер ниндәй ҙә иҫкәртеү хәбәрҙәре һаҡланмаған. + Һеҙҙә бер ниндәй ҙә иҫкәртеү хәбәрҙәре һаҡланмаған. Яңы хәбәр - Иҫкәртеү яҙығыҙ. Тема Хәбәр яҙырға Һаҡларға @@ -1460,7 +1456,6 @@ Хәбәрҙәр юйылған Атама буш була алмай. - Үҙгәртеүҙәр исемлеге Төҙәтеүҙәрҙе табырға йәки фильтрларға Тамғалар: %s Бер кем дә @@ -1517,7 +1512,6 @@ Зыянлы төҙәтеүҙәрҙе аныҡ таба. Үҙгәртеүҙәрҙе күберәк күреү өсөн %s юйып ҡарағыҙ {{PLURAL\n|one=%d фильтр|%d фильтрҙар}} - Үҙгәртеүҙәрҙе тикшерергә Мәҡәләне мөхәррирләү тарихы Кире ҡайтарылды Һеҙ ысынлап та кире ҡайтарырға теләйһегеҙме? diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 688c067ee2c..0ae216ece8b 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1319,8 +1319,6 @@ Скасаваць Паведамленне апублікавана на старонцы абмеркавання карыстальніка Паведамленне захавана і апублікавана на старонцы абмеркавання карыстальніка - Выберыце існыя папярэджанне або напішыце новае. - Захаваныя паведамленні Гэтая старонка размовы пустая. Размова пачынаецца тут Старонкі размоў – месца, дзе людзі абмяркоўваюць як зрабіць змест Вікіпедыі як мага лепей. Пачніце з дадавання новай тэмы для размовы, каб устанавіць сувязь і супрацоўнічаць з супольнасцю вікіпедыстаў. @@ -1530,10 +1528,8 @@ Прывітанне! Я хацеў бы падзяліцца з вамі сваім спісам для чытання ў Вікіпедыі: Ці не маглі б вы дапамагчы нам палепшыць \"Падзяліцца спісам для чытання\"? \"Падзяліцца спісам для чытання\" – гэта тэставая функцыя, і нам патрабуюцца вашыя водгукі, каб палепшыць або выдаліць яе. - Кіраванне шаблонамі - У вас няма захаваных папярэджанняў. + У вас няма захаваных папярэджанняў. Новае паведамленне - Напісаць папярэджанне. Тэма Напісаць паведамленне Запісаць @@ -1550,7 +1546,6 @@ Паведамленне захавана Паведамленне выдалена Тэма не можа быць пустой. - Спіс правак Пошук або фільтр правак Тэгі: %s Няма @@ -1612,7 +1607,6 @@ %d фільтраў %d фільтраў - Патруляваць праўку Гісторыя рэдагавання артыкула Вяртанне завершана Вы ўпэўнены, што хочаце адкаціць? diff --git a/app/src/main/res/values-bew/strings.xml b/app/src/main/res/values-bew/strings.xml index 055e58a40b2..8f87616062d 100644 --- a/app/src/main/res/values-bew/strings.xml +++ b/app/src/main/res/values-bew/strings.xml @@ -1219,8 +1219,6 @@ Urungin Pesen diterebitin ke pemermak punya halaman kongko pemaké Pesen disimpen èn diterebitin ke pemermak punya halaman kongko pemaké - Pilih pesen wanti-wanti nyang udah ada atawa keja pesen baru. - Pesen kesimpen Ni halaman oborolan – kosong. Kongko mulain di mari Halaman kongko ièlah tempat di mana orang pada guntengan bakal ngeja isi Wikipédi sebagus-bagusnya. Mulain dengen nambahin topik perhadring baru bakal bungselan ama gawé bareng ama komunitèt tukang Wikipédi. @@ -1424,10 +1422,8 @@ Tabé! Gua pèngèn ngedumanin gua punya daptar bacaan Wikipédi ama lu: Apa lu bisa bantu kita nyempurnain \"Dumanin daptar bacaan\"? \"Dumanin daptar bacaan\" ièlah atu keboléan uji coba èn kita butuh lu punya empan balik bakal nyempurnain atawa ngebuang tu keboléan. - Kelola sablonan - Lu kaga\' gableg pesen wanti-wanti kesimpen acan. + Lu kaga\' gableg pesen wanti-wanti kesimpen acan. Pesen baru - Keja pesen wanti-wanti. Perihal Keja pesen Simpen @@ -1443,7 +1439,6 @@ Apus Pesen udah diperbaruin Pesen udah diapus - Daptar permakan Cari atawa saring permakan Tenger: %s Kaga\' ada @@ -1492,7 +1487,6 @@ %d saringan %d saringan - Rondain permakan Riwayat permakan makalah Pengombalian rampung Apa lu yakin pèngèn ngaterèt? diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index f959b59869c..df3caa3f4d7 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1282,7 +1282,6 @@ Списъкът за четене е внесен Споделяне... Споделяне на списъка за четене с други - Патрулиране на редакция Благодарност Наблюдение Предупреждение diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index ecf3d399c95..673dd5eb2f4 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -1023,6 +1023,8 @@ উচ্চতা px যোগ করুন + উদা. %s + আরও জানুন সাহায্য উইকিপিডিয়াতে প্রবেশ করুন/যোগ দিন সুধী %s, আপনি জানেন কি উইকিপিডিয়ায় যে কেউ সম্পাদনা করতে পারে? diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 7b4dab2039c..0b6038852cf 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -1123,7 +1123,6 @@ Titl ar gemennadenn Embann Nullañ - Kemmadennoù enrollet Goullo eo ar bejenn gaozeal-mañ. Respont (Danvez ebet) @@ -1255,7 +1254,6 @@ Dilemel Hizivaet eo bet ar gemennadenn Lemel ar gemennadenn - Roll ar c\'hemmoù Klask pe silañ ar c\'hemmoù Tikedennoù: %s Hini ebet diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ff1fc8f35c1..70a5ce913d0 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1252,8 +1252,6 @@ Cancel·la Missatge publicat a la pàgina de discussió d\'usuari de l\'editor Missatge desat i publicat a la pàgina de discussió d\'usuari de l\'editor - Seleccioneu un missatge d\'avís existent o redacteu-ne un de nou. - Missatges desats La pàgina de discussió és en blanc. La conversa comença aquí Les pàgines de discussió és on es discuteix on fer el contingut de la Viquipèdia el millor possible. Inicieu-vos-hi afegint-hi un nou tema de discussió per a connectar-vos i col·laborar amb una comunitat viquipedista. @@ -1457,10 +1455,8 @@ Hola! Voldria compartir-vos la meva llista de lectura de la Viquipèdia: Ens podeu ajudar a millorar la funcionalitat de «Comparteix llistes de lectura»? «Comparteix llistes de lectura» és una funcionalitat de prova i ens calen opinions per a millorar-la o bé treure-la. - Gestiona les plantilles - No teniu cap missatge d\'avís desat. + No teniu cap missatge d\'avís desat. Missatge nou - Redacta el missatge d\'avís. Assumpte Redacta el missatge Desa @@ -1477,7 +1473,6 @@ El missatge s\'ha actualitzat El missatge s\'ha suprimit El títol no pot ser en blanc. - Llista d\'edicions Cerca o filtra edicions Etiquetes: %s Cap @@ -1537,7 +1532,6 @@ %d filtre %d filtres - Patrulla l\'edició Historial d\'edició de l\'article S\'ha completat la reversió Esteu segur que voleu revertir enrere? diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index ed27d667ca2..726f86a81ac 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1253,7 +1253,6 @@ Annullér Besked offentliggjort på brugerens brugerdiskussionsside Beskeden er gemt og offentliggjort på brugerens brugerdiskussionsside - Gemte beskeder Gemte beskeder Diskussionssiden er tom. Samtalen begynder her @@ -1437,7 +1436,6 @@ Del din læseliste med andre Hej! Jeg vil gerne dele min Wikipedia-læseliste med dig: Ny besked - Skriv en advarselsmeddelelse. Emne Skriv besked Gem @@ -1457,7 +1455,6 @@ Beskeden er slettet Beskederne er slettet - Liste over redigeringer Tags: %s Ingen Vis brugerside diff --git a/app/src/main/res/values-dag/strings.xml b/app/src/main/res/values-dag/strings.xml index 51aaea09738..4b402123333 100644 --- a/app/src/main/res/values-dag/strings.xml +++ b/app/src/main/res/values-dag/strings.xml @@ -1219,8 +1219,6 @@ Nyahima Lahabali nyɛla din zaŋ wuhi maliniŋlana yɛltɔɣa paagi zuɣu Lahabali nyɛla din gu n-zali ka zaŋ wuhi maliniŋlana yɛltɔɣa paagi zuɣu - Piimi zuɣuni kpahibu lahabali din pun beni bee ka a nam lahabali palli - gum lahabaya zali Shɛli ka yɛltɔɣa paagi ŋɔ ni Fiila maa dibu piini la kpɛ Yɛltɔɣa paaginima nyɛla luɣisheli niriba ni gbaairi saawara zaŋchaŋ bɛ ni yɛn niŋ shɛm viɛligi din be wikipedia puuni. Piligima ni alizama din jɛndi yɛltɔɣikpani shɛli din ni chɛ ka a mini a mabihi Wikimedianima laɣim gbaai maligu saawara ka niŋ niŋgbuna ni taba. @@ -1424,10 +1422,8 @@ N-zo! n suhu di yuya ni n-ti a n yu-karinda A ku sɔŋ ti ka ti bo berisuŋ \"ni yu-karinda taribu ni taba\"? \"tarimi yu-karinda ni taba\" nyɛla binshɛli din na be zahimbu ni ka ti bori a ni nyali shɛm labisigu din ni sɔŋ ka ti kpaŋsili bee ka ti yihi li. - Maalimi tɛmpleti nima zali viɛnyela - A ka zuɣuni kpahibu lahabali shɛli ka di gu n-doya. + A ka zuɣuni kpahibu lahabali shɛli ka di gu n-doya. Satari palli - Namni zuɣuni kpahibu satarili Baŋsim yaɣili nammi lahabali Zaŋpkɛhi @@ -1450,7 +1446,6 @@ yini=lahabali nyahiya Di yuli maa shɛɛ ku tooi ka binshɛɣu. - Maliniŋ nima pɛ n-doli taba vihima bee jɛhimi mali niŋ nima Lobu lahabaya: %s Kadi shɛli @@ -1509,7 +1504,6 @@ yini=%d jɛhima - Maliniŋ go n-kaai Atikil maliniŋ din pun gari lahabali Di labisili din pun be shɛm naai A dihitabili ni a bori ni a labisi niŋ maliniŋ ŋɔ? diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3e7d5aeaa4a..7b8da85fabc 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1462,7 +1462,6 @@ Kannst du uns helfen, \"Leselisten teilen\" zu verbessern? \"Leselisten teilen\" ist eine Testfunktion und wir brauchen dein Feedback, um sie zu verbessern oder zu entfernen. Neue Nachricht - Warnmeldung verfassen. Betreff Nachricht schreiben Speichern @@ -1482,7 +1481,6 @@ Nachrichten wurden gelöscht Der Titel darf nicht leer sein. - Liste der Bearbeitungen Keine Benutzerseite ansehen Diskussionsseite anzeigen diff --git a/app/src/main/res/values-dga/strings.xml b/app/src/main/res/values-dga/strings.xml index 8a1c9af7365..a5dbe566a41 100644 --- a/app/src/main/res/values-dga/strings.xml +++ b/app/src/main/res/values-dga/strings.xml @@ -1184,8 +1184,6 @@ Ŋmaa o Masɛgye toɔle gaa la a maale enna tontoŋ yelyaga peegyi A masɛgye biŋ la kyɛ toɔle gaa a maale enna tontoŋ yelyaga peegyi - Kaa iri kpaambo masɛgye naŋ daŋ bebe bee kuri masɛgye paalaa. - Biŋ masɛgyere A yelyaga peegyi ŋa e la kpale. A dɛmɛ diibo piili la kyɛ Leɛ sagbo @@ -1379,10 +1377,8 @@ Hi! N da na nɔŋ la ka n tɔre n wikipiideɛ kannoo pɛll ne fo: Fo na baŋ soŋ te la baa \"kannoo pɛll tɔre\"? \"Kannoo pɛll tɔraa\" e la nanda nyooraa te boɔra la fo sagebo duoro na baa bee iri o bare. - Managye tɛmplete - Fo ba taa kpããbo masɛgye binnaa zaa. + Fo ba taa kpããbo masɛgye binnaa zaa. Masɛgye paalaa - Maale kpaannoo masɛgye. Bɔgere Kuri masɛgye Biŋ @@ -1407,7 +1403,6 @@ Mɛsɛgyere sãã yɛ la A yelzu koŋ baŋ e kpale. - Maale eŋ pɛllɛ Bɔ bee kyoɔre maale eŋ Magere: %s Kaŋa zaa naane @@ -1449,7 +1444,6 @@ %d filter %d boŋkyoɔre - Yɔɔbo maale eŋ Atekele maale yelkorɔ Leɛbo baare la Fo sage di la ka fo boɔrɔ la ka fo leɛ puori? diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6be20b28d41..c8e9f442de6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1250,8 +1250,8 @@ Discusión: %s Tema nuevo Tema posted. + No guardar Mensajes guardados - Más información sobre los marcadores de posición de mensajes Esta página de discusión está vacía. Responder (Sin asunto) @@ -1260,6 +1260,7 @@ Redactar mensaje El mensaje no puede estar vacío. El asunto no puede estar vacío. + El nombre del sujeto ya existe. Prueba con uno diferente. Respuesta posted. Deshacer <b>Último editado</b> %1$s por %2$s @@ -1366,8 +1367,11 @@ ¡Hola! Me gustaría compartir mi lista de lectura de Wikipedia contigo: ¿Podrías ayudarnos a mejorar \"Compartir listas de lectura\"? \"Compartir listas de lectura\" es una función de prueba y necesitamos tus comentarios para mejorarla o eliminarla. + Cree sus propios mensajes de advertencia o utilice <a href=\"#\">mensajes de ejemplo</a> para comenzar. Eliminar El mensaje se ha eliminado + Sus mensajes + Mensajes de ejemplo <b>Cuenta de: </b> %s <b>Editar recuento: </b> %s Historial de edición del artículo @@ -1390,6 +1394,8 @@ Su edición reciente parece incluir material protegido por derechos de autor sin permiso. Asegúrese de que todo el contenido cumpla con las políticas de [[Wikipedia:Copyrights|copyright]]para evitar su eliminación. Hola, {{{nombre de usuario}}}, parece que eliminaste contenido de Wikipedia sin dejar un resumen de edición. Deje un resumen de edición cada vez que agregue o elimine contenido en Wikipedia. Hola, {{{username}}}, parece que eliminaste contenido sin comentarlo en la página de discusión del artículo. Tenga en cuenta que Wikipedia no tiene censura y el contenido no se debe eliminar porque sea controvertido. Si cree que la información es inexacta, llegue a un consenso en la página de discusión del artículo. + Más información sobre los marcadores de posición de mensajes + Utilice un mensaje de ejemplo a continuación para personalizar, enviar y guardar sus mensajes. Hola {{{username}}}. ¡Tu artículo es un gran comienzo! Para hacerlo aún mejor, planteese agregar más referencias a fuentes confiables. Esto ayuda a verificar la información y mejora la calidad del artículo. Consulte las pautas de Wikipedia sobre [[Wikipedia:Reliable_sources|fuentes confiables]] para obtener más detalles. Editar Aceptar diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 4563420d50c..d7bf6a184fd 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -174,7 +174,7 @@ نتیجه‌ای در \"%s\" یافت نشد نتیجه‌ای در فهرست مطالعه یافت نشد نتیجه‌ای در تاریخچه یافت نشد - برای محافظت در برابر اسپم لطفا کلمات زیر را وارد کنید + برای محافظت در برابر اسپم لطفاً کلمات زیر را وارد کنید تصویر را نمی‌توانید ببینید؟ <a href=\"https://fa.wikipedia.org/wiki/ویکی‌پدیا:درخواست ایجاد حساب کاربری\">درخواست یک حساب</a> کلمات بالا را تکرار کنید کپچا را وارد کنید @@ -205,7 +205,7 @@ شما از حساب کاربری‌تان در ویکی‌پدیا خارج شده‌اید. آیا می‌خواهید دوباره وارد شوید؟ ورود انصراف - اخیراً هیچ مقاله‌ای دیده نشده‌است + اخیراً هیچ مقاله‌ای دیده نشده است پیگیری مواردی که قبلاً مطالعه کردید. برخی از مقالات در تاریخچه ممکن است در حالت آفلاین دیده نشوند. جستجو و مطالعهٔ دانشنامهٔ آزاد به زبان شما @@ -230,11 +230,11 @@ بعدی حساب بدون ایمیل ساخته شود؟ هرچند که آدرس ایمیل اختیاری است، <b>به شدت توصیه</b> می‌شود که آدرس ایمیل را وارد کنید. این آدرس برای بازیابی حساب در هنگام فراموشی رمز عبور لازم خواهد بود. - نظر به اینکه برای بازیابی حساب کاربری لازم است توصیه می شود. + نظر به اینکه برای بازیابی حساب کاربری لازم است توصیه می‌شود. بدون ایمیل ادامه دهید افزودن یک آدرس ایمیل ایجاد حساب - نام کاربری «%s» در دسترس نیست. لطفا نام دیگری را انتخاب کنید. + نام کاربری «%s» در دسترس نیست. لطفاً نام دیگری را انتخاب کنید. متاسفانه نشانی آی‌پی شما از ساخت حساب جدید محروم شده است. https://en.wikipedia.org/wiki/Help:I_have_been_blocked جزئیات @@ -284,7 +284,7 @@ مشارکت‌کنندگان <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">صفحه تیم</a> مترجم‌ها - این اپلیکیشن توسط مترجمان داوطلب در <a href=\"https://translatewiki.net\">translatewiki.net</a> ترجمه شده‌است. + این اپلیکیشن توسط مترجمان داوطلب در <a href=\"https://translatewiki.net\">translatewiki.net</a> ترجمه شده است. مجوز کد اصلی در <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> و <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> تحت مجوز <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0 License</a>. برای موارد خاص تحت مجوز <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Attribution-ShareAlike License</a> یافت می‌شود. محصولی از <a href=\"https://wikimediafoundation.org/\">بنیاد ویکی‌مدیا</a> @@ -294,7 +294,7 @@ خیر بسته شده حساب کاربری شما از ویرایش در این ویکی مسدود شده است. - نشانی آی‌پی شما در برابر ویرایش، مسدود شده‌است. + نشانی آی‌پی شما در برابر ویرایش، مسدود شده است. چگونه صفحه را بهبود دادید؟ بعدی انتشار @@ -324,11 +324,11 @@ یافتن قبلی این نخستین مورد است این آخرین مورد است - مقاله در یک زبانهٔ پس‌زمینه گشوده شده‌است. + مقاله در یک زبانهٔ پس‌زمینه گشوده شده است. این ویرایش ممکن است غیرسازنده باشد. آیا مطمئنید می‌خواهید منتشرش کنید؟ شما نمی‌توانید این ویرایش را منتشر کنید. لطفاً بازگردید و تغییرش دهید. - یک پالایهٔ خودکار این ویرایش را به طور بالقوه غیرسازنده شناسایی کرده‌است. این ویرایش ممکن است شامل یک یا چند مورد از موارد زیر باشد:<br /><br />· همه را با حروف بزرگ نوشتن<br />· خالی‌ کردن مقاله‌ها یا هرز نگاره<br />· پیوندهای بیرونی یا تصاویر نامرتبط<br />· تکرار نویسه‌ها - یک پالایهٔ خودکار این ویرایش را احتمالاً غیرسازنده یا خرابکاری محتمل شناسایی کرده‌است.<br /><br />ویکی‌پدیا یک دانشنامه است و فقط میزبان محتوای بی‌طرف و سرشناس است. + یک پالایهٔ خودکار این ویرایش را به طور بالقوه غیرسازنده شناسایی کرده است. این ویرایش ممکن است شامل یک یا چند مورد از موارد زیر باشد:<br /><br />· همه را با حروف بزرگ نوشتن<br />· خالی‌ کردن مقاله‌ها یا هرز نگاره<br />· پیوندهای بیرونی یا تصاویر نامرتبط<br />· تکرار نویسه‌ها + یک پالایهٔ خودکار این ویرایش را احتمالاً غیرسازنده یا خرابکاری محتمل شناسایی کرده است.<br /><br />ویکی‌پدیا یک دانشنامه است و فقط میزبان محتوای بی‌طرف و سرشناس است. صفحه‌های مشابه منظورتان «%s» بود؟ جستجوهای اخیر: @@ -392,7 +392,7 @@ دسترسی سریع به فهرست مطالب می‌توانید صفحه را به راست بکشید تا جعبه محتویات را ببینید. همچنین می‌توانید این اسکرولر را انتخاب کرده و بکشید تا سریعاً به بخش‌های مختلف یک مقاله بروید. اکنون می‌توانید در نرم‌افزار ویکی‌پدیا به زبان‌های مختلف، جستجو و مطالعه کنید.\n\nبرای افزودن زبان‌های بیشتر، روی شمایل بزنید. - پاسخ سرور به درستی تنظیم نشده‌است. + پاسخ سرور به درستی تنظیم نشده است. خطای ناشناخته رخ داده است. پیام: «%s» نشانی در حافظهٔ موقت ذخیره شد @@ -404,7 +404,7 @@ افزودن به فهرست مطالعه امکان بارگیری مقاله در حالت آفلاین وجود ندارد. توجه: مقاله را به یک فهرست مطالعه بیفزایید تا هر زمان که برخط شدید، بارگیری شود. - شما در حال خواندن نسخهٔ آفلاین مقاله هستید که در %s ذخیره شده‌است. + شما در حال خواندن نسخهٔ آفلاین مقاله هستید که در %s ذخیره شده است. تغییر مسیر از %s دریافت مسیر ناتوان در پیدا کردن نرم‌افزاری برای یافتن مسیرها. @@ -416,7 +416,7 @@ تمام جدول‌های مقاله‌ها، مثل جعبه‌های اطلاعات، پانویس و یادداشت‌ها را به‌طور خودکار ببند. کمک مالی با عرض پوزش، تشخیص صوتی میسر نیست - خدمات مکان‌یابی غیرفعال شده‌است. + خدمات مکان‌یابی غیرفعال شده است. فعال‌سازی فعال کردن اجازهٔ مشاهدهٔ موقعیت برای مشاهدهٔ مکان‌های اطرافتان. روشن کردن @@ -428,7 +428,7 @@ این صفحه وجود ندارد ویکی‌پدیا <a href=\"%1$s\">صفحهٔ کاربری‌ای</a> با این عنوان ندارد. به طور کلی، این صفحه باید توسط <b>%2$s</b> ایجاد و ویرایش شود. اگر شک دارید، لطفاً بررسی کنید که آیا «%3$s» وجود دارد یا خیر. امکان اتصال به اینترنت وجود ندارد - نمی توان به ویکی‌پدیا متصل شد. لطفاً اتصال اینترنت خود را بررسی کنید یا بعدا تلاش کنید. + نمی توان به ویکی‌پدیا متصل شد. لطفاً اتصال اینترنت خود را بررسی کنید یا بعداً تلاش کنید. منبع %s مرجع‌ها کم‌نور کردن تصویر (در حالت تیره) @@ -438,8 +438,8 @@ محتوا تحت $1 در دسترس است، مگر اینکه خلافش ذکر شده‌باشد. زبانۀ جدید ذخیرهٔ همهٔ برگه‌ها - دسترسی حساب کاربری یا نشانی آی‌پی شما قطع شده‌است. - این قطع دسترسی توسط <a href=\"%2$s\">%1$s</a> انجام شده‌است + دسترسی حساب کاربری یا نشانی آی‌پی شما قطع شده است. + این قطع دسترسی توسط <a href=\"%2$s\">%1$s</a> انجام شده است دلیل ارائه‌شده: %s آغاز قطع دسترسی: %s زمان منقضی‌شدن بستن دسترسی: %s @@ -486,7 +486,7 @@ ایجاد جدید فهرست مطالعهٔ «%s» از قبل موجود است. مقالهٔ %1$s به فهرست %2$s افزوده شد. - %s ذخیره شد. آیا می خواهید آن را به یک فهرست اضافه کنید؟ + %s ذخیره شد. آیا می‌خواهید آن را به یک فهرست اضافه کنید؟ %1$s به %2$s منتقل شد. %2$s در حال حاضر در %1$s وجود دارد. بسیار خب! %s در حال حاضر حاوی تمام مقاله‌ها است. @@ -588,7 +588,7 @@ سامان‌دادن مقاله‌ها در فهرست‌ها ایجاد فهرستی از مکان‌هایی برای سفر، موضوعات مورد علاقه و بیشتر %1$s (ساختهٔ کاربر) - محدودیت %d مقاله به‌ازای هر فهرست مطالعه وجود دارد. هر فهرست موجودی که بیش از این تعداد مقاله داشته‌است، به چند فهرست تقسیم شده‌است. + محدودیت %d مقاله به‌ازای هر فهرست مطالعه وجود دارد. هر فهرست موجودی که بیش از این تعداد مقاله داشته است، به چند فهرست تقسیم شده است. انتقال به این فهرست امکان‌پذیر نیست. شما در فهرست «%1$s» به محدودیت %2$d مقاله به‌ازای هر فهرست رسیده‌اید. افزودن به این فهرست امکان‌پذیر نیست. شما در فهرست «%1$s» به محدودیت %2$d مقاله به‌ازای هر فهرست رسیده‌اید. ایجاد فهرستی دیگر امکان‌پذیر نیست. شما به محدودیت ۱۰۰ فهرست مطالعه برای هر حساب رسیده‌اید. @@ -644,8 +644,8 @@ در حال بارگیری %1$d مقاله… - %1$d مقاله باقی مانده‌است - %1$d مقاله باقی مانده‌است + %1$d مقاله باقی مانده است + %1$d مقاله باقی مانده است در حال همگام‌سازی فهرست مطالعه @@ -656,8 +656,8 @@ در حال همگام‌سازی %1$d فهرست… - %1$d فهرست باقی مانده‌است - %1$d فهرست باقی مانده‌است + %1$d فهرست باقی مانده است + %1$d فهرست باقی مانده است اعلان‌های ویکی‌پدیا آگاه‌سازی‌ها @@ -700,11 +700,11 @@ سامانه پیام‌های سامانه نقطهٔ عطف - ویرایش‌های شما به تعداد مورد نظر رسیده‌است + ویرایش‌های شما به تعداد مورد نظر رسیده است تشکر وقتی شخصی برای یک ویرایش از شما تشکر می‌کند واگردانی - یکی از مشارکت‌های شما برگردانده شده‌است + یکی از مشارکت‌های شما برگردانده شده است ورود فعالیت‌های ورود شما اشاره کردن @@ -897,8 +897,8 @@ ترجمهٔ توضیحات تصویر به زبان‌های دیگر وظایف بیشتر برای ویرایشگران چندزبانه اگر می‌توانید بیش از یک زبان ویکی‌پدیا را بخوانید و بنویسید، امکان ترجمه وجود دارد. - تا زمانی که %d توضیح تصویر را ویرایش کنید، قفل‌شده‌است - تا زمانی که توضیحات %d مقاله را ویرایش کنید قفل شده‌است (تایید شده) + تا زمانی که %d توضیح تصویر را ویرایش کنید، قفل‌شده است + تا زمانی که توضیحات %d مقاله را ویرایش کنید قفل شده است (تایید شده) برای من نیست افزودن زبان‌ها تصویر @@ -963,7 +963,7 @@ بر پایه تعداد دفعاتی که یکی از مشارکت‌های شما برگردانده شده است (توسط ویرایشگر دیگری خنثی شده است).\nویرایش‌های برگردانده‌شده: %d. ویرایش‌های پیشنهادی تا %1$s متوقف شده است. متأسفیم %2$s، برخی از مشارکت‌های اخیر شما خنثی شده‌اند. ویرایش‌های پیشنهادی غیرفعال شده‌اند. متأسفیم %s، تعداد زیادی از مشارکت‌های اخیر شما خنثی شده‌اند. - به نظر می آید نشانی آی‌پی (یا بازهٔ نشانی‌های آی‌پی) شما از ویرایش کردن ویکی‌پدیا منع شده است. + به نظر می‌آید نشانی آی‌پی (یا بازهٔ نشانی‌های آی‌پی) شما از ویرایش کردن ویکی‌پدیا منع شده است. متأسفیم %s، برای استفاده از این ویژگی، باید سه ویرایش مستقیم در یک مقاله انجام دهید. فوت و فن‌های ویرایش صفحهٔ راهنمای ویرایش‌های پیشنهادی @@ -1082,7 +1082,7 @@ افزودن برچسب‌های تصویر ویرایش %s سپاس بابت ویرایش ویکی‌پدیا! - با وجودی که شما همهٔ تلاشتان را کردید، یکی از ویرایشگران با ویرایش شما مخالف است و آن را واگردانی کرده‌است که دلیل آن: + با وجودی که شما همهٔ تلاشتان را کردید، یکی از ویرایشگران با ویرایش شما مخالف است و آن را واگردانی کرده است که دلیل آن: ویرایش شما با یکی از <a href=\"%1$s\">رهنمودها</a> مطابقت ندارد. مشارکت شما شبیه یک ویرایش آزمایشی یا خرابکاری است. اگر مشتاق هستید، می‌توانید <a href=\"%1$s\">تاریخچهٔ ویرایش</a> را مشاهده کنید. @@ -1138,7 +1138,7 @@ بیشتر افزودن زبان‌های ویکی‌پدیا آیا می‌خواهید چینی از بخش زبان‌های نرم‌افزار حذف شود؟ - اکنون هر دو زبان ساده و سنتی چینی در نرم‌افزار شما فعال شده‌است. تنظیمات زبان نرم‌افزار روزآمد شود؟ + اکنون هر دو زبان ساده و سنتی چینی در نرم‌افزار شما فعال شده است. تنظیمات زبان نرم‌افزار روزآمد شود؟ ویرایش زبان‌ها نه ممنون لغو @@ -1222,8 +1222,6 @@ انتشار لغو پیام در صفحه بحث کاربری ویرایشگر منتشر شد - یک پیام هشدار موجود را انتخاب کنید یا یک پیام جدید بنویسید. - پیام‌های ذخیره شده پیام‌های ذخیره‌شده این صفحهٔ بحث خالی است. صفحه‌های بحث جایی هستند که افراد در آن‌ها پیرامون چگونگی رساندن محتوای ویکی‌پدیا به بالاترین سطح با یکدیگر گفتگو می‌کنند. برای برقراری ارتباط و همکاری با اجتماع ویکی‌پدیایی‌ها با افزودن یک مبحث تازه شروع کنید. @@ -1411,8 +1409,8 @@ درون‌ریزی فهرست مطالعه به اشتراک گذاشته شده تمایل دارید نام این فهرست که با شما به اشتراک گذاشته شده را چه بگذارید؟ *جدید* - یک فهرست مطالعه با شما به اشتراک گذاشته شده‌است - متوجه شدیم که یک فهرست مطالعه با شما به اشتراک گذاشته شده‌است. برای مشاهدهٔ این فهرست در نرم‌افزار، به پیام اولیه بازگردید و دوباره روی پیوند کلیک کنید. + یک فهرست مطالعه با شما به اشتراک گذاشته شده است + متوجه شدیم که یک فهرست مطالعه با شما به اشتراک گذاشته شده است. برای مشاهدهٔ این فهرست در نرم‌افزار، به پیام اولیه بازگردید و دوباره روی پیوند کلیک کنید. گرفتم فهرست مطالعه درون‌ریزی شد اشتراک‌گذاری... @@ -1420,7 +1418,6 @@ سلام! من می‌خواهم فهرست مطالعه ویکی‌پدیایم را با شما به اشتراک بگذارم: آیا می‌توانید به ما در بهبود \"اشتراک‌گذاری فهرست‌های مطالعه\" کمک کنید؟ اشتراک‌گذاری و برون‌بری فهرست‌های مطالعه یک ویژگی آزمایشی است و ما برای بهبود یا حذف آن به بازخوردهای شما نیاز داریم. - مدیریت الگوها پیام جدید عنوان نوشتن پیام @@ -1435,7 +1432,6 @@ ذخیره حذف پیام به روز شد - فهرست ویرایش‌ها برچسب‌ها: %s هیچ‌کدام مشاهدهٔ صفحهٔ کاربر @@ -1484,7 +1480,6 @@ احتمالاً حسن نیت ندارد به احتمال خیلی زیاد حسن نیت ندارد در پیداکردن تقریباً تمام ویرایش‌های فاقد حسن نیت، دقت بسیار بالایی دارد. - گشت‌زدن ویرایش تاریخچه ویرایش مقاله بازگردانی کامل شد آیا از واگردانی اطمینان دارید؟ diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 85f57fa2448..ae96b37a89d 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1260,8 +1260,6 @@ Peruuta Viesti julkaistu muokkaajan keskustelusivulla Viesti tallennettu ja julkaistu muokkaajan keskustelusivulla - Valitse olemassa oleva varoitusviesti tai kirjoita uusi viesti. - Tallennetut viestit Tallennetut viestit Tämä keskustelusivu on tyhjä. Keskustelu alkaa tästä @@ -1468,10 +1466,8 @@ Hei! Haluan jakaa Wikipedian lukulistani kanssasi: Voisitko auttaa meitä parantamaan lukulistojen jakamista? Lukulistojen jakaminen on testiominaisuus, jonka kehittämiseen tarvitsemme palautettasi. - Hallinnoi mallineita - Sinulla ei ole tallennettuja varoitusviestejä. + Sinulla ei ole tallennettuja varoitusviestejä. Uusi viesti - Kirjoita varoitusviesti. Aihe Kirjoita viesti Tallenna @@ -1496,7 +1492,6 @@ Viestit on poistettu Otsikko ei voi olla tyhjä. - Muokkausluettelo Etsi tai suodata muokkauksia Merkinnät: %s Ei mitään diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index eb4e0b1f97c..6a4b851a9b0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -393,7 +393,7 @@ Taper pour développer Licence Creative Commons Image Captcha - Utilisation légitime + Utilisation équitable Téléverseur inconnu Affichage de la galerie non disponible hors ligne. Fermer @@ -1295,8 +1295,6 @@ Annuler Message publié sur la page de discussion utilisateur de l’éditeur Message enregistré et publié sur la page de discussion utilisateur de l’éditeur - Sélectionner un message d’avertissement existant ou composer un nouveau message. - Messages enregistrés Cette page de discussion est vide. La conversation commence ici Les pages de discussion sont des endroits pour discuter de la façon de rendre le contenu de Wikipédia le meilleur possible. Commencez par ajouter un nouveau sujet de discussion pour vous connecter et collaborer avec une communauté de Wikipédiens. @@ -1502,10 +1500,8 @@ Bonjour ! J’aimerais partager ma liste de lecture Wikipédia avec vous : Pourriez-vous nous aider à améliorer la fonctionnalité « Partager des listes de lecture » ? Le « Partage de listes de lecture » est une fonctionnalité en test et nous avons besoin de vos commentaires pour l’améliorer ou la supprimer. - Gérer les modèles - Vous n’avez pas de message d’avertissement enregistré. + Vous n’avez pas de message d’avertissement enregistré. Nouveau message - Composer un message d’avertissement. Sujet Composer le message Enregistrer @@ -1530,7 +1526,6 @@ Les messages ont été supprimés Le titre ne peut pas être vide. - Liste des modifications Rechercher ou filtrer les modifications Balises : %s Aucune @@ -1590,7 +1585,6 @@ %d filtre %d filtres - Patrouiller la modification Historique des modifications de l’article Annulation terminée Êtes-vous sûr de vouloir revenir en arrière ? @@ -1634,13 +1628,13 @@ Bonjour {{{username}}}, je tiens à vous informer que j\'ai annulé une ou plusieurs de vos [{{{diffLink}}}|dernières modificatons] car elle ne semblent pas être constructives. Si vous pensez que c\'est une erreur, vous pouvez me laisser un message sur [[User talk:{{{senderUserName}}}|ma page de discussion]]. Veuillez noter que d\'autres actions de vandalisme peuvent mener à un blocage. Bonjour {{{username}}}, c\'est une bonne chose que Wikipédia ait attiré votre attention et que vous ayez essayé de la modifier. Le test d\'édition que vous avez effectué a fonctionné. Cependant, vous devez garder à l\'esprit que le but de ce projet est de développer une encyclopédie fiable et complète que tout le monde peut consulter. Votre révision a affecté le contenu d\'un article et a donc du être retirée.\nSi vous souhaitez vous familiariser avec la modification de Wikipédia, le [[Aide:Bac_à_sable|bac à sable]] est à votre disposition. Si vos commentaires sont spécifiques à un article, le bon endroit est la page de discussion de cet article. Bonjour {{{username}}}, certaines de vos contributions ne respectent pas la neutralité requise pour se conformer à la politique de [[Wikipédia:NPOV|point de vue neutre]] de Wikipédia. Pour cette raison, certains contenus ont été modifiés ou supprimés.\nVeuillez modifier les paragraphes ou sections qui présentent un point de vue partial, en les remplaçant par un texte plus neutre et objectif, conforme à ce qui est attendu dans une encyclopédie. - Bonjour {{{username}}}, certaines de vos contributions sont peut-être des traductions automatiques, c\'est pourquoi elles ont été modifiées ou marquées comme telles par un modèle. Si aucune amélioration n\'est apportée à l\'article, celui-ci peut être supprimé.\nSi, malgré toutes ces informations, vous avez encore des questions, n\'hésitez pas à laisser un message [[User talk:{{{senderUserName}}}|sur ma page de discussion]]. Ne vous laissez pas décourager par ce petit incident. Vos contributions sont très importantes pour Wikipédia. - Bonjour {{username}}, j\'apprécie votre collaboration à Wikipédia ; cependant, j\'ai remarqué que vous êtes en [[Wikipédia:Conflit d\'intérêts|conflit d\'intérêts]]. Un conflit d\'intérêt est l\'incompatibilité entre les objectifs de neutralité et de fiabilité de Wikipédia et les objectifs particuliers de certains éditeurs, individus, entités ou entreprises de tout type.\nToutes les contributions dans l\'espace principal sont soumises aux politiques de critères de contenu ([[WP:NOT|ce que Wikipédia n\'est pas]]), de qualité encyclopédique ([[WP:V|vérifiabilité]] et [[WP:TI|absence de recherche originale]]), de méthode éditoriale ([[WP:NPOV|point de vue neutre]]) et de légitimité du contenu ([[WP:droit d\'auteur|droits d\'auteur]]). Tous les éditeurs sont tenus de respecter ces politiques lors de la création et de l\'évaluation des contenus, ainsi que de respecter les actions des autres éditeurs et de faire preuve de bonne foi pour s\'assurer que ces politiques sont respectées.\nSi vous éditez dans le cadre d\'un conflit d\'intérêts, vous devez appliquer la politique correspondante avec une attention particulière ; dans le cas contraire, votre compte d\'utilisateur pourrait être considéré comme étant à des fins privées et bloqué. N\'hésitez pas à me contacter sur ma page de discussion si vous avez des questions. - Comme vous avez effectué plusieurs modifications destructrices, ceci est votre dernier avertissement. Si vous recommencez à vandaliser Wikipédia, votre compte sera bloqué en édition. + Bonjour {{{username}}}, certaines de vos contributions sont peut-être des traductions automatiques, c\'est pourquoi elles ont été modifiées ou marquées comme telles par le modèle. Si aucune amélioration n\'est apportée à l\'article, celui-ci peut être supprimé.\n\nSi, malgré toutes ces informations, vous avez encore des questions, n\'hésitez pas à laisser un message [[User talk:{{{senderUserName}}}|sur ma page de discussion]]. Ne vous laissez pas décourager par ce petit incident. Vos contributions sont très importantes pour Wikipédia. + Bonjour {{username}}, j\'apprécie votre collaboration à Wikipédia ; cependant, j\'ai remarqué que vous êtes en [[wikipedia:fr:Conflit d\'intérêts|conflit d\'intérêts]]. Un conflit d\'intérêt est l\'incompatibilité entre les objectifs de neutralité et de fiabilité de Wikipédia et les objectifs particuliers de certains éditeurs, individus, entités ou entreprises de tout type.\n\nToutes les contributions dans l\'espace principal sont soumises aux politiques de critères de contenu ([[wikipedia:fr:Wikipedia:Ce que Wikipédia n\'est pas|ce que Wikipédia n\'est pas]]), de qualité encyclopédique ([[wikipedia:fr:Vérification|vérifiabilité]] et [[wikipedia:fr:Wikipédia:Travaux inédits|absence de recherche originale]]), de méthode éditoriale ([[wikipedia:Neutral_point_of_view|point de vue neutre]]) et de légitimité du contenu ([[wikipedia:fr:Copyright|droits d\'auteur]]). Tous les éditeurs sont tenus de respecter ces politiques lors de la création et de l\'évaluation des contenus, ainsi que de respecter les actions des autres éditeurs et de faire preuve de bonne foi pour s\'assurer que ces politiques sont respectées.\n\nSi vous éditez dans le cadre d\'un conflit d\'intérêts, vous devez appliquer la politique correspondante avec une attention particulière ; dans le cas contraire, votre compte d\'utilisateur pourrait être considéré comme étant à des fins privées et bloqué. N\'hésitez pas à me contacter sur ma page de discussion si vous avez des questions. + Comme vous avez effectué plusieurs modifications destructrices, ceci est votre dernier avertissement. Si vous continuez à vandaliser Wikipédia, votre compte sera bloqué pour les modifications. Bonjour {{{username}}}. Votre récente modification semble inclure du matériel protégé par le droit d\'auteur sans autorisation. Veuillez vous assurer que tout le contenu est [[WP:VDA|conforme aux politiques de Wikipédia en matière de droits d\'auteur]] afin d\'éviter toute annulation. Bonjour {{{username}}}, il semble que vous ayez supprimé du contenu de Wikipédia sans l\'expliquer dans le résumé de modification. Veuillez laisser un résumé de modification chaque fois que vous ajoutez ou supprimez du contenu sur Wikipédia. Bonjour {{{username}}}, il semble que vous ayez supprimé un contenu sans en discuter au préalable sur la page de discussion de l\'article. Veuillez noter que Wikipédia n\'est pas censurée et qu\'un contenu ne doit pas être supprimé parce qu\'il est controversé. Si vous pensez que l\'information est inexacte, veuillez parvenir à un consensus sur la page de discussion de l\'article. - Bonjour {{{username}}} ! Votre article est un excellent début ! Pour l\'améliorer encore, pensez à ajouter davantage de références [[Aide:Identifier des sources fiables|à des sources fiables]]. Cela permet de vérifier les informations et d\'améliorer la qualité de l\'article. Pour plus de détails, consultez les pages [[Wikipédia:Sources fiables]] et [[Wikipédia:Qualité des sources]]. + Bonjour {{{username}}} ! Votre article est un excellent début ! Pour l\'améliorer encore, pensez à ajouter davantage de références à des sources fiables. Cela permet de vérifier les informations et d\'améliorer la qualité de l\'article. Pour plus de détails, consultez les pages de [[Wikipedia:Reliable_sources|sources fiables]]. Accepter Rejeter Problèmes de la page diff --git a/app/src/main/res/values-ha/strings.xml b/app/src/main/res/values-ha/strings.xml index 2c1eaecb08f..4b0a8f599f3 100644 --- a/app/src/main/res/values-ha/strings.xml +++ b/app/src/main/res/values-ha/strings.xml @@ -1232,8 +1232,6 @@ Yanke Sakon da aka buga ga shafin tattaunawa na mai amfani Saƙon da aka adana kuma aka buga zuwa shafin tattaunawa na mai amfani - Zaɓi saƙon gargadi na yanzu ko rubuta sabon saƙo. - Saƙonnin da aka adana Wannan shafin magana ba kome ba ne. Tattaunawar ta fara a nan Shafukan tattaunawa sune inda mutane ke tattauna yadda za a sanya abun cikin Wikipedia mafi kyau. Farawa ta hanyar ƙara sabon batun tattaunawa don haɗi da haɗin gwiwa tare da al\'ummar Wikipedians. @@ -1439,10 +1437,8 @@ Ya kasance! Ina so in raba jerin karatun Wikipedia tare da ku: Shin za ku iya taimaka mana mu inganta \"Listunan karatu na raba\"? \"Listing Reading Sharing\" fasalin gwaji ne kuma muna buƙatar ra\'ayoyinku don ingantawa ko cire shi. - Sarrafa samfura - Ba ku da saƙonnin gargadi da aka adana. + Ba ku da saƙonnin gargadi da aka adana. Sabon saƙo - Ƙirƙiri saƙon gargaɗi Batu Rubuta saƙo Ajiye @@ -1467,7 +1463,6 @@ An share saƙo Batun ba zai iya zama komai ba. - Jerin gyare-gyare Bincike ko gyaran tacewa Alamomi: %s Babu @@ -1527,7 +1522,6 @@ %d tace %d tacewa - Gyaran Patrol Tarihin gyaran labarin Komawa cikakke Shin kun tabbata kuna son rufe duk shafuka? diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index f48c618737a..fb273fea9bb 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1266,8 +1266,6 @@ Mégse Az üzenet közzétéve a szerkesztő vitalapján Az üzenet elmentve és közzétéve a szerkesztő vitalapján - Válassz ki egy meglévő figyelmeztető üzenetet, vagy írj új üzenetet. - Mentett üzenetek Mentett üzenetek Ez a vitalap üres. A beszélgetés itt kezdődik @@ -1474,10 +1472,8 @@ Szia! Szeretném megosztani veled a Wikipédia-olvasólistámat: Tudnál segíteni nekünk ennek a funkciónak a fejlesztésében? Az olvasólisták megosztása egy tesztelés alatt álló funkció, és szükségünk van a visszajelzésedre a fejlesztéséhez vagy eltávolításához. - Sablonok kezelése - Nincsenek mentett figyelmeztető üzeneteid. + Nincsenek mentett figyelmeztető üzeneteid. Új üzenetek - Figyelmeztető üzenet írása. Tárgy Üzenet megfogalmazása Mentés @@ -1502,7 +1498,6 @@ Az üzenetek törölve Az cím nem lehet üres. - Szerkesztések listája Szerkesztések keresése vagy szűrése Címkék: %s Semmi @@ -1562,7 +1557,6 @@ %d szűrő %d szűrő - Járőr szerkesztése Szócikk szerkesztési laptörténet Visszaállítás kész Biztosan vissza akarod állítani? diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index ec7f690c976..7c6d3f2df3f 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -120,6 +120,7 @@ Tu linguas de Wikipedia Publicar cambiamentos Modification publicate! + Modification publicate! Le cambiamentos pote prender un tempore pro apparer. Modification fallite! Reprobar Cancellar @@ -162,6 +163,9 @@ Tu session de Wikipedia ha essite claudite. Vole tu reaperir session? Aperir session Cancellar + Facer disparer le conto + Advertimento concernente le disparition del conto + Le disparition es un <b>ultime recurso</b> e debe <b>solmente esser usate quando tu vole cessar de modificar pro sempre</b> e celar le maximo possibile de tu associationes anterior.<br/><br/>Le deletion del conto sur Wikipedia se effectua cambiante tu nomine de conto de maniera que alteres non pote recognoscer tu contributiones. Iste processo se appella le disparition del conto. <b>Le disparition non garanti le anonymitate complete ni remove contributiones al projectos.</b> Il non ha paginas recentemente visitate Tracia hic le paginas que tu ha legite. Alcun articulos in le historia pote non esser accessibile sin connexion. @@ -305,6 +309,8 @@ Pagina de Wikipedia in prime plano Pagina in prime plano de hodie: Recerca sur Wikipedia + Le maniera le plus rapide de cercar in Wikipedia + Le melior articulos que Wikipedia pote offerer Necun definition trovate. Nove actualisation alpha disponibile Tocca pro discargar @@ -388,6 +394,11 @@ %d seligite Un error ha occurrite Clauder + Leger + Salveguardar + Salveguardate + Condivider + Iste articulo es un pecietta, lo que vole dicer que il non ha sufficiente contento in le articulo pro generar un previsualisation. Ma tu pote cambiar isto! Iste pagina non existe Wikipedia non ha un <a href=\"%1$s\">pagina de usator</a> con iste nomine exacte. In general, iste pagina debe esser create e modificate per <b>%2$s</b>. In caso de dubita, per favor verifica que \"%3$s\" existe. Non pote connecter a Internet @@ -1100,6 +1111,7 @@ Immerge te in le mundo de Wikipedia con un canal Explorar continuemente actualisate.<br/> <b>Personalisa</b> le canal secundo tu interesses: apprende eventos historic con <b>Sur iste die</b> o jecta le datos con <b>Aleatori</b>. Listas de lectura con synchronisation Tu pote facer listas de lectura de articulos que tu vole leger plus tarde, mesmo quando tu es disconnectite. <br/>Aperi session in tu conto de Wikipedia pro synchronisar tu listas de lectura. <a href=\"#login\">Crear un conto sur Wikipedia</a> + Datos e vita private Inviar datos de uso Comprendite Nos ha trovate lo sequente sur tu apparato: @@ -1226,8 +1238,6 @@ Cancellar Message publicate sur le pagina de discussion del contributor Message salveguardate e publicate sur le pagina de discussion de usator del contributor - Selige un message de advertimento existente o compone un nove message. - Messages salveguardate Iste pagina de discussion es vacue. Le conversation comencia hic Le paginas de discussion es ubi le gente discute como facer le contento de Wikipedia le melior que pote esser. Adde un nove topico de discussion pro connecter te e collaborar con un communitate de wikipedianos. @@ -1431,10 +1441,8 @@ Salute! Io vole condivider mi lista de lectura de Wikipedia con te: Poterea tu adjutar nos a meliorar \"Condivider listas de lectura\"? \"Condivider listas de lectura\" es un function in test e nos ha besonio de tu retroaction pro meliorar o remover lo. - Gerer patronos - Tu non ha messages de advertimento salveguardate. + Crea tu proprie messages de advertimento o usa le <a href=\"#\">messages de exemplo</a> pro comenciar. Nove message - Componer message de advertimento. Subjecto Componer message Salveguardar @@ -1459,7 +1467,6 @@ Le messages ha essite delite Le titulo non pote esser vacue. - Lista de modificationes Cercar o filtrar modificationes Etiquettas: %s Necun @@ -1519,7 +1526,6 @@ %d filtro %d filtros - Patruliar modification Historia de modificationes del articulo Reversion succedite Es tu secur de voler revocar? diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 24656655b9c..883413eab03 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -1227,8 +1227,6 @@ Batal Pesan diterbitkan ke halaman diskusi pengguna milik penyunting Pesan disimpan dan diterbitkan ke halaman diskusi pengguna milik penyunting. - Pilih pesan peringatan yang sudah ada atau tulis pesan yang baru. - Pesan yang disimpan Halaman pembicaraan ini kosong. Percakapan dimulai di sini Laman pembicaraan adalah tempat orang berdiskusi tentang cara membuat konten Wikipedia sebaik mungkin. Mulailah dengan menambahkan topik diskusi baru untuk terhubung dan berkolaborasi dengan komunitas Wikipediawan. @@ -1431,10 +1429,8 @@ Hai! Saya ingin berbagi daftar bacaan Wikipedia saya dengan Anda: Bisakah Anda membantu kami meningkatkan \"Bagikan daftar bacaan\"? \"Bagikan daftar bacaan\" adalah fitur pengujian dan kami membutuhkan umpan balik Anda untuk meningkatkan atau menghapusnya. - Kelola templat - Anda tidak memiliki pesan peringatan yang disimpan. + Anda tidak memiliki pesan peringatan yang disimpan. pesan baru - Tulis pesan peringatan. Subyek Tulis pesan Simpan @@ -1457,7 +1453,6 @@ Pesan telah dihapus Judul pesan tidak boleh kosong - Daftar suntingan Cari atau saring suntingan Tag: %s Tidak ada @@ -1516,7 +1511,6 @@ %d penyaring - Patroli suntingan Riwayat suntingan artikel Pembalikan selesai Anda yakin ingin mengembalikan? diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 227b5a50054..0531d6795aa 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1243,7 +1243,7 @@ Salva come nuovo messaggio Pubblica Annulla - Messaggi salvati + Non salvare Messaggi salvati Questa pagina di discussione è vuota. La conversazione inizia qui @@ -1466,7 +1466,8 @@ I messaggi sono stati cancellati Il titolo non può essere vuoto. - Elenco delle modifiche + I tuoi messaggi + Messaggi di esempio Cerca o filtra le modifiche Etichette: %s Nessuno @@ -1492,7 +1493,6 @@ %d filtro %d filtri - Verifica modifica Visualizza Ulteriori informazioni Ringrazia diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 3f3bac065ff..a6760e76fbf 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -143,6 +143,7 @@ שפות הוויקיפדיה שלך פרסום השינויים העריכה פורסמה! + העריכה פורסמה! ייתכן שייקח כמה זמן עד שהשינויים יופיעו. העריכה נכשלה! לנסות שוב ביטול @@ -428,6 +429,7 @@ שמירה נשמר שיתוף + הערך הזה הוא קצרמר, מה שאומר שאין מספיק תוכן בערך כדי ליצור תצוגה מקדימה. עם זאת, יש לך אפשרות לשנות את זה. הדף הזה אינו קיים בוויקיפדיה אין <a href=\"%1$s\">דף משתמש</a> בעל שם כזה בדיוק. באופן כללי, הדף הזה צריך להיווצר ולהיערך על־ידי <b>%2$s</b>. אם יש לך ספק, נא לוודא ששם המשתמש \"%3$s\" קיים. לא ניתן להתחבר לאינטרנט @@ -1345,12 +1347,10 @@ כותרת ההודעה פרסום ביטול + לא לשמור ההודעה פורסמה בדף שיחת המשתמש של העורך ההודעה נשמרה ופורסמה בדף השיחת המשתמש של העורך - בחירת הודעת אזהרה קיימת או כתיבת הודעה חדשה. - הודעות שמורות הודעות שמורות - מידע נוסף על מילוי הודעות דף השיחה הזה ריק. השיחה מתחילה כאן דפי שיחה הם המקום שבו אנשים דנים איך להפוך את התוכן בוויקיפדיה לטוב ביותר שהוא יכול להיות. יש להתחיל בהוספת נושא דיון חדש כדי להתחבר ולשתף פעולה עם קהילה של ויקיפדים. @@ -1361,6 +1361,7 @@ כתיבת הודעה ההודעה אינה יכולה להיות ריקה. הכותרת אינה יכולה להיות ריקה. + שם הנושא כבר קיים. נא לנסות לכתוב משהו אחר. התגובה פורסמה. ביטול <b>נערך לאחרונה ב־%1$s</b> על־ידי %2$s @@ -1562,10 +1563,8 @@ שלום! אני רוצה לשתף את רשימת הקריאה שלי בוויקיפדיה איתך: אפשר לבקש ממך לעזור לנו לשפר את התכונה \"שיתוף רשימות קריאה\"? \"שיתוף רשימות קריאה\" היא תכונה בבדיקה ואנחנו זקוקים למשוב שלך כדי לשפר או להסיר אותה. - ניהול תבניות - לא שמרת שום הודעת אזהרה. + באפשרותך ליצור הודעות אזהרה משלך או להשתמש ב<a href=\"#\">הודעות לדוגמה</a> כדי להתחיל. הודעה חדשה - כתיבת הודעת אזהרה. נושא כתיבת הודעה שמירה @@ -1594,7 +1593,8 @@ ההודעות נמחקו הכותרת לא יכולה להיות ריקה. - רשימת עריכות + ההודעות שלך + הודעות לדוגמה חיפוש או סינון של עריכות תגים: %s אין @@ -1656,7 +1656,6 @@ %d מסננים %d מסננים - סימון העריכה כבדוקה היסטוריית העריכה של הערך השחזור הושלם האם ברצונך באמת לשחזר? @@ -1707,6 +1706,8 @@ נראה שהעריכה האחרונה שלך כוללת חומר המוגבל בזכויות יוצרים ללא רשות. נא לוודא שכל התוכן תואם למדיניות [[ויקיפדיה:זכויות יוצרים|זכויות היוצרים]] של הוויקיפדיה הזאת כדי להימנע מהסרה. שלום {{{username}}}, נראה שהסרת תוכן מוויקיפדיה מבלי להשאיר תקציר עריכה. נא לכתוב תקציר עריכה בכל הוספה או הסרה של תוכן בוויקיפדיה. שלום {{{username}}}, נראה שהסרת תוכן מבלי לדון בו בדף השיחה של הערך. יש לשים לב לכך שוויקיפדיה אינה מצונזרת, ואין להסיר תוכן רק מכיוון שהוא שנוי במחלוקת. אם נראה לך שהמידע אינו מדויק, נא להגיע להסכמה בדף השיחה של הערך. + מידע נוסף על מילוי הודעות + נא להשתמש בהודעה לדוגמה למטה כדי להתאים אישית, לשלוח ולשמור בהודעות שלך. שלום {{{username}}}. הערך שלך הוא התחלה מצוינת! כדי לשפר אותו עוד יותר, נא לשקול להוסיף הפניות נוספות למקורות אמינים. זה עוזר לאמת את המידע ומשפר את איכות הערך. נא לעיין בהנחיות של הוויקיפדיה הזאת בנושא [[ויקיפדיה:ביבליוגרפיה|מקורות מהימנים]] לפרטים נוספים. עריכה לקבל diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a92ba3196e1..c065ffa2a87 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1275,8 +1275,6 @@ キャンセル メッセージが編集者の利用者トークページに公開されました メッセージが保存され編集者の利用者トークページに公開されました - 既存の警告メッセージを選択するか、新しいメッセージを作ります。 - 保存されたメッセージ トークページは空です。 議論を始める ノートページはウィキペディアのコンテンツを改善する方法について議論する場所です。新しい議論の話題を追加することから、ウィキペディア編集者のコミュニティと共同作業をはじめましょう。 @@ -1479,10 +1477,8 @@ こんにちは!私の閲覧リストを共有します。 「閲覧リストの共有」機能の改善にご協力いただけませんか? 「閲覧リストの共有」は実験的な機能であり、改善または棄却のためフィードバックを必要としています。 - テンプレートを管理 - 警告メッセージが何も保存されていません。 + 警告メッセージが何も保存されていません。 新しいメッセージ - 警告メッセージを作成します。 件名 メッセージを作成 保存 @@ -1505,7 +1501,6 @@ メッセージが削除されました タイトルを空にすることはできません。 - 編集の一覧 編集を検索または絞り込む タグ: %s なし @@ -1564,7 +1559,6 @@ %d件のフィルター - 編集を巡回 記事の編集履歴 差し戻し完了 本当に巻き戻しますか? diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 36f622fa46e..e0a83c5b83c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1226,8 +1226,6 @@ 취소 편집자의 사용자 토론 페이지에 게시된 메시지 편집자의 사용자 토론 페이지에 메시지가 저장 및 게시되었습니다. - 기존 경고 메시지를 선택하거나 새 메시지를 작성하세요. - 저장된 메시지 이 토론 문서는 비어있습니다. 여기에서 토론을 시작하세요 토론 문서는 위키백과 문서를 더욱 발전시키기 위해 사용자들과 의논하는 곳입니다. 새로운 토론 주제를 추가하여 위키백과 공동체와 협업을 시작하세요. @@ -1429,10 +1427,8 @@ 안녕하세요! 저의 위키백과 읽기 목록을 당신께 공유하고 싶습니다: \"읽기 목록 공유\" 개선에 도움을 주시겠습니까? \"읽기 목록 공유\"는 시험 기능이며, 이를 개선하거나 제거하려면 여러분의 의견이 필요합니다. - 틀 관리 - 저장된 경고 메시지가 없습니다. + 저장된 경고 메시지가 없습니다. 새 메시지 - 경고 메시지를 작성합니다. 주제 메시지 쓰기 저장 @@ -1452,7 +1448,6 @@ 메시지가 삭제되었음 제목은 비워둘 수 없습니다. - 편집 목록 편집 내용 검색 또는 필터링 태그: %s 없음 @@ -1506,7 +1501,6 @@ %d개 필터 - 편집 점검 문서 편집 역사 되돌리기 완료 일괄 되돌리기를 하시겠습니까? diff --git a/app/src/main/res/values-kus/strings.xml b/app/src/main/res/values-kus/strings.xml index 0ecd724c4ce..d803f1979af 100644 --- a/app/src/main/res/values-kus/strings.xml +++ b/app/src/main/res/values-kus/strings.xml @@ -946,7 +946,6 @@ Labaar pian\'azug Zaŋim niŋ Basim - Kpɛn\'ɛsim labaya Sɔnsʋg lakir kaŋa anɛ zaalim. Sɔnsʋg la pin\'inɛ kpɛla Lɛbisim diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 67d5ec0fc30..56c18bc6fad 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -1062,7 +1062,6 @@ Titel vum Message Verëffentlechen Ofbriechen - Gespäichert Messagen Dës Diskussiouns-Säit ass eidel. D\'Konversatioun fänkt hei un Äntweren @@ -1234,7 +1233,6 @@ Kéint Dir eis hëllefe fir d\'Funktioun \"Lieslëscht deelen\" besser ze maachen? \"Lieslëscht deelen\" ass eng Testfunktioun a mir sinn op Äre Feedback ugewise fir se ze verbesseren oder eventuell ewechzehuelen. Neie Message - Warnmessage schreiwen. Sujet Message schreiwen Späicheren @@ -1255,7 +1253,6 @@ Messagë goufe geläscht Den Titel däerf net eidel sinn. - Lëscht vun Ännerungen Ännerungen duerchsichen oder filteren Keen Benotzersäit weisen diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 1ef7e791400..f41f0279577 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -120,6 +120,7 @@ Ваши википедиски јазици Објави промени Уредувањето е објавено! + Уредувањето е објавено! Ќе треба некое време за промените да се појават. Уредувањето не успеа! Повтори Откажи @@ -399,6 +400,7 @@ Зачувај Зачувано Сподели + Оваа статија е никулец, што значи дека нема доволно содржина за да се создаде преглед. Но можете да го промените тоа. Оваа страница не постои. Википедија нема <a href=\"%1$s\">корисничка страница</a> со точно тоа име. Начелно, оваа страница треба да се создаде и уреди од <b>%2$s</b>. Ако не сте сигурни, проверете дали постои „%3$s“. Не можам да се поврзам со семрежјето @@ -1249,12 +1251,10 @@ Наслов на пораката Објави Откажи + Не зачувувај Пораката е објавена на разговорната страница на корисникот Пораката е зачувана и објавена на разговорната страница на уредникот - Изберете постоечка предупредувачка порака или напишете нова. - Зачувани пораки Зачувани пораки - Дознајте за пополнувачите на пораки Оваа разговорна страница е празна. Разговорот започнува тука Разговорните страници се места кајшто луѓето дискутираат како да ја направат содржината на Википедија што подобра. Почнете нова тема на разговор за да се поврзете и да соработувате со заедница на википедијанци. @@ -1265,6 +1265,7 @@ Напиши порака Пораката не може да стои празна. Насловот не може да стои празен. + Таков наслов веќе постои. Внесете друг. Одговорот е објавен. Врати <b>Последно изменето на %1$s</b> од %2$s @@ -1460,10 +1461,8 @@ Здраво! Сакам да споделам список за читање со вас: Можете ли да ни помогнете да го подобриме „Споделување на списоци за читање“? „Споделување на списоци за читање“ е пробна функција и ни требаат ваши мислења за да ја подобриме или отстраниме. - Раководење со предлошки - Немате зачувано ниедна предупредувачка порака. + Создавајте ваши предупредувачки пораки или користете <a href=\"#\">примерни пораки</a> за да почнете. Нова порака - Напиши предупредувачка порака. Наслов Напиши порака Зачувај @@ -1488,7 +1487,8 @@ Пораките се избришани Насловот не може да стои празен. - Список на уредувања + Ваши пораки + Примерни пораки Пребарај или филтрирај уредувања Ознаки: %s Нема @@ -1548,7 +1548,6 @@ %d филтер %d филтри - Патролирај уредување Историја на уредување на статијата Враќањето е завршено Дали сигурно сакате да отповикате? @@ -1599,6 +1598,8 @@ Се чини дека вашето скорешно уредување вклучува материјал заштитен со авторски права кој сте го искористиле без дозвола. Сета содржина мора да се придржува кон [[Википедија:Авторски права|авторскоправните]] правила на оваа Википедија за да не биде избришана. Здраво {{{username}}}. Се чини дека отстранивте содржина од Википедија без да внесете опис на уредувањето. Ставајте опис кога додавате или отстранувате содржини. Здраво {{{username}}}. Се чини дека отстранивте содржина без да ја продискутирате на разговорната страница на статијата. Имајте на ум дека Википедија не се цензурира, и дека содржините не се отстрануваат ако се спорни или контроверзни. Ако сметате дека информациите се неточни, постигнете консензус на разговорната страница на статијата. + Дознајте за пополнувачите на пораки + Послужете се со примерната порака подолу за да ги прилагодување, испраќате и зачувувате вашите пораки. Здраво {{{username}}}. Вашата статија е добар почеток! За да ја направите уште подобра, додајте повеќе наводи кон доверливи извори. Ова ќе ни помогне да ги провериме информациите и го подобрува квалитетот на статијата. Погледајте ги насоките за [[Wikipedia:Reliable_sources|доверливи извори]] на оваа Википедија. Уреди Прифати diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 7d6c9c2a56a..c0d543e6860 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -346,6 +346,7 @@ အင်တာနက်မရှိချိန်တွင် ဆောင်းပါးများကို ဖတ်ရှုရန် မဖြစ်နိုင်ပါ။ အရိပ်အမြွက်: ဆောင်းပါးကို စာဖတ်စာရင်းသို့ ပေါင်းထည့်ပါ၊ အွန်လိုင်းပြန်ဖြစ်လာချိန်တွင် ယင်းသည် ဒေါင်းလုတ်ဆွဲသွားပါလိမ့်မည်။ သင်သည် %s တွင်သိမ်းထားသော ဤဆောင်းပါး၏ အော့ဖ်လိုင်းဗားရှင်းကို ဖတ်ရှုနေခြင်းဖြစ်ပါသည်။ + \"%s\" မှ ပြန်ညွှန်းထားသည် လမ်းညွှန် ရယူရန် ဤလမ်းညွှန်ချက်အား ထောက်ပံ့ပေးနိုင်သည့် app များ ရှာမတွေ့ပါ။ Feed ကိုစူးစမ်းပါ @@ -717,6 +718,7 @@ စတင်ခြင်းဖြင့် ဤအင်္ဂရပ်ကို တလွဲအသုံးမပြုပါဟု ကတိပြုပါသည်။ စက်အကြံပြုချက်များ မီးနူး + နဂိုအတိုင်း ပြန်သွားရန် ဆောင်းပါးများ ဖော်ပြရန် ရုပ်ပုံများကို ပုံစံသတ်မှတ်ရန် ပြန်လည်ဆန်းစစ် @@ -837,6 +839,7 @@ အစီရင်ခံရန် {{ဗဟုဝုစ်ကိန်း|တစ်=%1$s သွင်ပြင်လက္ခဏာ|%1$s သွင်ပြင်လက္ခဏာများ}} အခြား + ထည့်သွင်းရန် ရှေ့ ဖိုင်စာမျက်နှာ ရုပ်ပုံ ပုံစာ ပေါင်းထည့်ရန် @@ -859,6 +862,7 @@ စဉ်ဆက်မပြတ် မွမ်းမံလျက်ရှိသော စူးစမ်းရေးအခင်းအကျင်းနှင့် ဝီကီပီးဒီးယား ယုန်တွင်းပေါက်သို့ ခုန်ဆင်းလိုက်ပါ။ <br/>သင် စိတ်ဝင်စားသော အခင်းအကျင်းကို <b>မွမ်းမံပြင်ဆင်ပါ</b> - သမိုင်းဝင်ဖြစ်ရပ်များကို <b>ယနေ့ဖြစ်ရပ်များ</b>၊ သို့မဟုတ် <b>ကျပန်း</b>ဖြင့် အန်စာတုံးကို လှည့်ကာ လေ့လာနိုင်ပါသည်။ Sync နှင့် စာဖတ်စာရင်းများ အော့ဖ်လိုင်းဖြစ်နေစဉ်တွင်တောင်မှ နောင်အခါ သင်ဖတ်ရှုလိုသော ဆောင်းပါးများကို စာဖတ်စာရင်းများအဖြစ် ပြုလုပ်နိုင်ပါသည်။ <br/>သင်၏ ဖတ်ရှုစာရင်းများကို ဝီကီပီးဒီးယားအကောင့်ထဲတွင် sync လုပ်ရန် လော့အင်ဝင်ရောက်ပါ။ <a href=\"#login\">ဝီကီပီးဒီးယားသို့ ချိတ်ဆက်ပါ</a> + ဒေတာနှင့် ကိုယ်ရေးကိုယ်တာ အသုံးပြုဒေတာကို ပို့ရန် ရပြီဟေ့ သင်၏စက်ပစ္စည်းပေါ်တွင် အောက်ပါများကို တွေ့ရှိပါသည်: @@ -946,6 +950,8 @@ မလုပ်တော့ပါ ဆွေးနွေး ဆွေးနွေးချက်: %s + လွှင့်တင်ရန် + မလုပ်တော့ပါ ဤဆွေးနွေးချက်စာမျက်နှာမှာ ဗလာဖြစ်နေသည်။ အကြောင်းပြန်ရန် (အကြောင်းအရာ မရှိ) @@ -986,6 +992,8 @@ အသုံးပြုသူများ၏ ပံ့ပိုးမှုများကို ကြည့်ရန် မှ - သို့ - + အနှစ်ချုပ် (ချန်လှပ်ထားနိုင်သည်) + ပြန်လည်ပြောင်းလဲခြင်း အကြောင်းရင်းကို မျှဝေပါ နှိုင်းယှဉ်ရန် ပြောင်းလဲရန် အပြီးအပိုင် diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index f419ad3f20d..e2726c92f22 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1254,8 +1254,6 @@ Avbryt Melding publisert på bidragsyterens brukerdiskusjonsside Melding lagret og publisert på bidragsyterens brukerdiskusjonsside - Velg en eksisterende advarselsmelding eller skriv en ny melding. - Lagrede meldinger Denne diskusjonssiden er tom. Samtalen begynner her Diskusjonssider er stedet for å diskutere hvordan Wikipedias innhold kan bli enda bedre. Du kan begynne ved å legge til et nytt emne for å få kontakt og samarbeide med fellesskapet av wikipedianere. @@ -1461,10 +1459,8 @@ Hei! Jeg ønsker å dele leselista mi på Wikipedia med deg: Kan du hjelpe oss å forbedre «Del leselister»? «Del leselister» er en testfunksjon, og vi trenger tilbakemelding fra brukerne for å forbedre eller fjerne den. - Administrer maler - Du har ingen lagrede advarselsmeldinger. + Du har ingen lagrede advarselsmeldinger. Ny melding - Skriv en advarselsmelding. Emne Skriv melding Lagre @@ -1489,7 +1485,6 @@ Beskjedene har blitt slettet Tittelen kan ikke være tom. - Liste over redigeringer Søk i eller filtrer redigeringer Tagger: %s Ingen @@ -1549,7 +1544,6 @@ %d filter %d filtre - Patruljeringsredigering Artikkelredigeringshistorikk Tilbakestilt Er du sikker på at du vil tilbakestille? diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e704658a9d0..8db1876fa29 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -25,6 +25,7 @@ * McDutchie * MedShot * Mirolith +* Mitsjol * Nickthijssen1994 * Nieuwsgierige Gebruiker * Optilete @@ -157,6 +158,7 @@ Uw Wikipedia-talen Wijzigingen publiceren Bewerking gepubliceerd! + Bewerking gepubliceerd! Het kan enige tijd duren voordat wijzigingen zichtbaar worden. Bewerking mislukt! Opnieuw proberen Annuleren @@ -199,6 +201,7 @@ U bent afgemeld bij Wikipedia. Wilt u zich opnieuw aanmelden? Aanmelden Annuleren + Account laten verdwijnen Geen recent bekeken artikelen Blijf hier op de hoogte van wat u hebt gelezen. Sommige artikelen in de geschiedenis zijn mogelijk niet offline zichtbaar. @@ -344,6 +347,8 @@ Uitgelichte pagina op Wikipedia Vandaag uitgelicht: Zoeken op Wikipedia + De snelste manier om op Wikipedia te zoeken + De beste artikelen die Wikipedia te bieden heeft Geen definities gevonden. Nieuwe alpha-update beschikbaar Tik om te downloaden @@ -427,6 +432,10 @@ %d geselecteerd Er is een fout opgetreden Afwijzen + Lezen + Opslaan + Opgeslagen + Delen Deze pagina bestaat niet Wikipedia heeft geen <a href=\"%1$s\">gebruikerspagina</a> met deze exacte naam. Over het algemeen moet deze pagina worden gemaakt en bewerkt door <b>%2$s</b>. Controleer bij twijfel of \"%3$s\" bestaat. Er kan geen verbinding gemaakt worden met het internet @@ -1140,6 +1149,7 @@ Stap in de wereld van Wikipedia met een steeds bijgewerkt overzicht op Verkennen. <br/> Pas het overzicht aan <b>uw interesses</b> aan – of u nu geïnteresseerd bent in historische gebeurtenissen <b>op deze dag</b> of het gooien met de dobbelsteen voor een <b>willekeurige pagina</b>. Leeslijsten met synchronisatie U kunt leeslijsten maken van artikelen die u later wilt lezen, ook als u offline bent. <br/>Meld u aan bij uw Wikipedia-account om uw leeslijsten te synchroniseren. <a href=\"#login\">Bij Wikipedia aanmelden</a> + Wij zijn van mening dat u geen persoonlijke informatie hoeft te verstrekken om deel te nemen aan de vrije kennisbeweging. De gebruiksgegevens die voor deze app worden verzameld, zijn anoniem. Lees meer over ons <a href=\"#privacy\">privacybeleid</a> en <a href=\"#termsOfUse\">onze gebruiksvoorwaarden</a> . Uw gebruiksgegevens verzenden Begrepen We hebben het volgende gevonden op uw apparaat: @@ -1241,6 +1251,14 @@ Hoogte px Invoegen + Zoeksjablonen + Invoegen + bijv. %s + %s (Optioneel) + %s (Voorgesteld) + Meer lezen + Sjablonen worden door de gebruiker gegenereerd en bevatten mogelijk geen volledige beschrijving. + De \"%s\"-sjabloon heeft nog geen beschrijving. Hulp Aanmelden/inschrijven bij Wikipedia Hallo %s, wist u dat iedereen Wikipedia kan bewerken? @@ -1264,10 +1282,10 @@ Titel van bericht Publiceren Annuleren + Niet opslaan Bericht gepubliceerd op de overlegpagina van de gebruiker Bericht opgeslagen en gepubliceerd op de overlegpagina van de gebruiker - Kies een bestaand waarschuwingsbericht of stel een nieuw bericht op. - Opgeslagen berichten + Opgeslagen berichten Deze overlegpagina is leeg. Het overleg begint hier Op overlegpagina\'s wordt besproken hoe de inhoud van Wikipedia zo goed mogelijk kan worden gemaakt. Voeg een een nieuw gespreksonderwerp toe om in contact te komen en samen te werken met een gemeenschap van Wikipedianen. @@ -1459,6 +1477,8 @@ Fout bij het afspelen van media. Bijdragen Bijdragen filteren + Bekijk op kaart + Geografische coördinaten zijn niet beschikbaar voor deze pagina Importeer gedeelde leeslijst Hoe zou u de lijst willen noemen die met u is gedeeld? *nieuw* @@ -1471,10 +1491,8 @@ Hoi! Ik wil graag mijn Wikipedia leeslijst met je delen: Kunt u ons helpen om \"Leeslijsten delen\" te verbeteren? \"Leeslijsten delen\" is een testfunctie en we hebben uw feedback nodig om deze te verbeteren of te verwijderen. - Sjablonen beheren - Er zijn geen waarschuwingsberichten opgeslagen. + Maak uw eigen waarschuwingsberichten of gebruik <a href=\"#\">voorbeeldberichten</a> om aan de slag te gaan. Nieuw bericht - Waarschuwingsbericht opstellen. Onderwerp Bericht opstellen Opslaan @@ -1499,7 +1517,8 @@ Berichten zijn verwijderd De titel mag niet leeg zijn. - Lijst met bewerkingen + Uw berichten + Voorbeeldberichten Bewerkingen zoeken of filteren Labels: %s Geen @@ -1559,7 +1578,6 @@ %d filter %d filters - Bewerking als gecontroleerd markeren Bewerkingsgeschiedenis artikel Ongedaan maken voltooid Weet u zeker dat u wilt terugdraaien? @@ -1586,10 +1604,19 @@ Neutraal Niet tevreden Hoe kunnen we de functie verbeteren? + Bewerkingsgeschiedenis artikel Terugkoppeling Opslaan Terugkoppeling ingediend. Tik op het overloopmenu om op elk gewenst moment terugkoppeling te geven onder ‘Probleem met functie’. + Automatische vertaling + Laatste waarschuwing + Waarschuwing voor schending van auteursrecht + Voeg een bewerkingssamenvatting toe + Niet censureren + Suggestie voor artikelverbetering + Hallo {{{username}}}, het lijkt erop dat je inhoud van Wikipedia hebt verwijderd zonder een bewerkingssamenvatting achter te laten. Laat een bewerkingssamenvatting achter wanneer u inhoud aan Wikipedia toevoegt of verwijdert. + Bewerken Aanvaarden Afwijzen Paginaproblemen @@ -1602,4 +1629,12 @@ Bedankt, beste donateur! Dankzij uw bijdrage kunnen Wikipedia en haar zustersites zich blijven ontwikkelen. Terug Openen in systeembrowser + Plaatsen + Plaatsen zoeken + Filteren op taal + Kaart + Lijst + Erg tevreden + Zeer ontevreden + Dit gebied is leeg. Zoom uit <a href=\"#\">op de kaart</a>. diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 4b7e3aa0cad..81a744bf292 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -232,7 +232,7 @@ ਅਨੁਵਾਦਕ ਇਸ ਐਪ ਦਾ ਅਨੁਵਾਦ ਸਵੈ-ਸੇਵੀ ਅਨੁਵਾਦਕਾਂ ਦੁਆਰਾ <a href=\"https://translatewiki.net\">translatewiki.net</a> ਉੱਤੇ ਕੀਤਾ ਗਿਆ ਸੀ। ਲਸੰਸ - ਸਰੋਤ ਕੋਡ <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> ਅਤੇ <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> ਉੱਪਰ <a href=\"https://phabricator.wikimedia.org/diffusion/APAW/browse/master/COPYING?view=raw\">Apache 2.0 License</a> ਹੇਠ ਉਪਲੱਬਧ ਹੈ। ਜੇ ਹੋਰ ਕੁਝ ਨਹੀੰ ਕਿਹਾ ਗਿਆ ਤਾੰ ਸਮੱਗਰੀ <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License\">Creative Commons Attribution-ShareAlike License</a> ਹੇਠ ਉਪਲੱਬਧ ਹੈ। + ਸਰੋਤ ਕੋਡ <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">ਅਪਾਚੇ 2.0 ਲਸੰਸ</a> ਹੇਠ <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">ਗਿਟਹਬ</a> ਉੱਤੇ ਉਪਲਬਧ ਹੈ। ਜਦੋਂ ਤੱਕ ਹੋਰ ਨਿਰਧਾਰਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ, ਇਹ ਸਮੱਗਰੀ <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Attribution-ShareAlike License</a> ਦੇ ਤਹਿਤ ਉਪਲਬਧ ਹੈ। <a href=\"https://wikimediafoundation.org/\">ਵਿਕੀਮੀਡੀਆ ਸੰਸਥਾ</a> ਦੀ ਇੱਕ ਉਪਜ ਬਾਬਤ ਇਹ ਸਫ਼ਾ ਬਦਲਿਆ ਗਿਆ ਹੈ? ਕੀ ਤੁਸੀਂ ਸੱਚੀਂ ਤਬਦੀਲੀਆਂ ਬਿਨਾਂ ਸਾਂਭੇ ਕੂਚ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e99b3522136..76a3096d65b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1281,10 +1281,8 @@ Nie znaleziono zarchiwizowanych stron. Wszystkie przestrzenie nazw Artykuł - Zarządzaj szablonami - Nie masz zapisanych żadnych komunikatów ostrzegawczych. + Nie masz zapisanych żadnych komunikatów ostrzegawczych. Nowa wiadomość - Utwórz wiadomość ostrzegawczą. Tytuł Utwórz wiadomość Zapisz @@ -1299,7 +1297,6 @@ Zapisz Usuń Wiadomość została zaktualizowana - Lista zmian Wyświetl stronę użytkownika Zobacz stronę dyskusji Informacje o użytkowniku diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 9bc1d0f64f4..a01de1160eb 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1253,8 +1253,6 @@ Cancelar Mensagem publicada na página de discussão do editor Mensagem gravada e publicada na página de discussão do editor - Selecionar uma mensagem de aviso existente ou redigir uma mensagem nova. - Mensagens gravadas Esta página de discussão está vazia. A conversa começa aqui É nas páginas de discussão que as pessoas debatem como tornar o conteúdo da Wikipédia o melhor possível. Comece por adicionar um tópico de discussão novo para estabelecer uma ligação e colaborar com uma comunidade de wikipedistas. @@ -1460,10 +1458,8 @@ Olá! Gostaria de partilhar a minha lista de leitura da Wikipédia consigo: Podia ajudar-nos a melhorar \"Partilhar listas de leitura\"? Partilhar listas de leitura é uma funcionalidade em testes e precisamos dos seus comentários para melhorá-la ou removê-la. - Gerir predefinições - Não tem nenhuma mensagem de aviso gravada. + Não tem nenhuma mensagem de aviso gravada. Mensagem nova - Compor uma mensagem de aviso. Assunto Compor mensagem Gravar @@ -1488,7 +1484,6 @@ As mensagens foram excluídas O título não pode ficar vazio. - Lista de edições Pesquisar ou filtrar edições Etiquetas: %s Nenhuma @@ -1548,7 +1543,6 @@ %d filtro %d filtros - Patrulhar edição Historial de revisões do artigo Reversão concluída Tem a certeza de que deseja desfazer as edições? diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 9c12bfccdd7..fb3c83f805d 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -153,6 +153,7 @@ Section header text that shows user list of languages the current article is available in. {{Identical|Publish changes}} Small toast (popup) message saying that the edit was successful + Message text shown to users after a successful edit to a stub article. Message for dialog box specifying that an edit save had failed Button text to retry a failed edit save.\n{{Identical|Retry}} Button text to cancel retrying a failed edit save.\n{{Identical|Cancel}} @@ -432,6 +433,7 @@ Button label for saving the article to a reading list in the link preview bottom sheet. Button label that indicates the article has been saved in a reading list in the link preview bottom sheet. Button label for sharing the article in the link preview bottom sheet. + Placeholder text shown to users in the preview dialog of an article, when there isn\'t enough content in the article to show in the preview. Error message informing the user that the requested page does not exist Error message text shown when the user page does not yet exist. %1$s represents the full URL that points to the user page, %2$s represents the username and %3$s represents username without namespace. {{Doc-mobileapp-internet}}\nError message shown when network cannot be reached when loading a page @@ -1276,12 +1278,10 @@ Hint for text fiel for the message title. Button label for publishing the warn message. Button label for canceling the warn message. + Negative action label text for talk warm messages save dialog. Snackbar text that indicates the warn message has been published. Snackbar text that indicates the warn message has been published and also saved to the templates list. - Message for the dropdown menu that inform the user to select a template from the tempaltes list. - Label for the dropdown menu in the compose screen that allows user to select a saved message. Label text for menu option to enter the \'saved messages\' screen. - Label text for external link to message placeholders. Label stating that this talk page is currently empty. Title text for stating that this talk page is currently empty. Content test for stating that this talk page is currently empty. @@ -1292,6 +1292,7 @@ Hint for text field for composing a new talk page topic. Error message shown when the talk page message is empty. Error message shown when the talk page subject is empty. + Error state text shown to user when they are trying to create a talk messgage with duplicate subject. Message shown when the response has been submitted. Button label to undo the operation of submitting the response.\n\n{{Identical|Undo}} Label for the last modified date of the talk page. Please preserve the %1$s and %2$s parameters, since these will be replaced with the actual date and user name.\n\nShould be similar to this MediaWiki messages such as this: {{msg-mw|Mobile-frontend-last-modified-with-user-hours}} @@ -1513,6 +1514,8 @@ Snackbar message that show the messages have been deleted. Error message shown when the title of the saved message is empty. + Tab title text for list of user\'s custom saved messages. + Tab title text for list of ready-to-use saved messages made available for user. Hint text of in the search bar of searching or filtering edits. Text of showing added tags in this edit. %s will be replaced by the added tags. Text that indicates no tag has been added in this edit. @@ -1622,6 +1625,9 @@ Ready-to-use user talk message offered to experienced editors to warn another editor about copyright violation. Please include the relevant language version of the link; you may find a link to your language in the interlanguage links list at [[:w:en:Wikipedia:Copyrights|Wikipedia:Copyrights in the English Wikipedia]].\n\nAppears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title copy vio}} Ready-to-use user talk message offered to experienced editors to warn another editor to remind them to leave an edit summary to explain their edit. Please do not translate the keywords formatted in triple braces {{{...}}}. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title edit summary reminder}} Ready-to-use user talk message offered to experienced editors to warn another editor about censorship. Please do not translate the keywords formatted in triple braces {{{...}}}. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title do not censor}} + Label text for external link to message placeholders. + {{optional}}\nURL that points to a page on mediawiki.org that contains guidelines for usage of saved messages for patrolling edits. + Instruction text to guide user on usage of saved messages. Ready-to-use user talk message offered to experienced editors to warn another editor about article improvement suggestion. Please do not translate the keywords formatted in triple braces {{{...}}}. Please include the relevant language version of the link; you may find a link to your language in the interlanguage links list at [[:w:en:Wikipedia:Reliable sources|Wikipedia:Reliable sources in the English Wikipedia]]. If no link is found, please do not include a link. Editors may add a link(s) to another language wiki\'s policy if desired. Appears under the title {{msg-wm|Wikipedia-android-strings-patroller saved message title art imp}} Label text for editing saved messages. Button label for accepting anonymous data collection. @@ -1651,12 +1657,4 @@ Negative action button text for places survey dialog Title text for the secondary dialog which is shown as a result of an action on the main dialog for places feature - shown only to users who are very unsatisfied with the feature Empty message for the list in the current map area. Please keep the anchor link around the \"on the map\". - URL that points to a page on mediawiki.org that contains guidelines for usage of saved messages for patrolling edits. - Tab title text for list of user\'s custom saved messages. - Tab title text for list of ready-to-use saved messages made available for user. - Instruction text to guide user on usage of saved messages. - Negative action label text for talk warm messages save dialog. - Error state text shown to user when they are trying to create a talk messgage with duplicate subject. - Placeholder text shown to users in the preview dialog of an article, when there isn\'t enough content in the article to show in the preview. - Message text shown to users after a successful edit to a stub article. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index b141d33e54b..d7b708bfdb0 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1336,7 +1336,6 @@ Salvează Anulare Editați mesajul - Lista modificărilor Vezi pagina de discuții <b>Cont de la:</b> %s <b>Număr de editări:</b> %s @@ -1354,7 +1353,6 @@ Găsește cele mai multe editări de rea-credință, dar cu o precizie mai mică. Foarte probabil cu rea-credință Foarte precis în găsirea celor mai evidente editări de rea-credință. - Patrulează editările Revenire finalizată Creați, trimiteți și stocați mesaje de avertizare pe pagina de discuții a unui editor. Sunteți mulțumit de această funcționalitate? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4e704ccb559..16dc5d5cf1d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -315,7 +315,7 @@ Переводчики Это приложение было переведено добровольцами на <a href=\"https://translatewiki.net\">translatewiki.net</a>. Лицензия - Исходный код доступен на <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> и <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">Github</a> под лицензией <a href=\"https://phabricator.wikimedia.org/diffusion/APAW/browse/master/COPYING?view=raw\">Apache 2.0</a>. Если не указано иное, содержимое доступно в соответствии с лицензией <a href=\"https://creativecommons.org/licenses/by-sa/4.0/deed.ru\">Creative Commons Attribution-ShareAlike</a>. + Исходный код доступен на <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">Github</a> под лицензией <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Если не указано иное, содержимое доступно в соответствии с лицензией <a href=\"https://creativecommons.org/licenses/by-sa/4.0/deed.ru\">Creative Commons Attribution-ShareAlike</a>. Продукт <a href=\"https://wikimediafoundation.org/\">Фонда Викимедиа</a> О приложении Страница была изменена. Вы уверены, что хотите выйти без сохранения изменений? @@ -383,6 +383,8 @@ Избранная страница Википедии Избранная страница дня: Поиск по Википедии + Самый быстрый способ поиска в Википедии + Лучшие статьи, которые может предложить Википедия Никаких определений не найдено. Доступно новое обновление альфа-версии Нажмите, чтобы скачать @@ -834,8 +836,8 @@ Снять отметки со всех объектов Вики фильтр Тип фильтра - Все \"вики\" - Все «типы» + Все вики + Все типы Страница обсуждения %s Эта функция недоступна офлайн. На основе прочитанного @@ -1205,6 +1207,7 @@ Путешествуйте по лабиринтам Википедии с помощью постоянно обновляемой ленты. <br/><b>Настройте</b> ленту так, чтобы она отвечала вашим интересам — будь то изучение исторических событий, случившихся <b>в этот день</b>, или положитесь <b>на удачу</b>. Списки для чтения с синхронизацией Вы можете создавать списки для чтения из статей, которые вы хотите прочитать позже, даже если вы находитесь в офлайне. <br/>Авторизуйтесь с помощью учётной записи Википедии для синхронизации ваших списков для чтения. <a href=\"#login\">Происоединяйтесь к Википедии</a> + Данные и конфиденциальность Отправлять отчёты об использовании Понятно Мы нашли следующие языки на вашем устройстве: @@ -1312,8 +1315,10 @@ Вставить Поиск шаблонов Вставить + например, %s %s (необязательно) %s (рекомендуется) + Узнать больше Шаблоны создаются пользователями и могут не содержать полных описаний. В этом шаблоне отсутствует <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">TemplateData</a> , а его параметры были <a href=\"<span class=\"notranslate\" translate=\"no\">%2$s \">autogenerated</a> . В результате у шаблона и его параметров отсутствуют описания. Справка @@ -1337,7 +1342,6 @@ Заголовок сообщения Опубликовать Отмена - Сохранённые сообщения Эта страница обсуждения пустая. Обсуждение начинается здесь Ответить @@ -1556,9 +1560,15 @@ Удалить Сообщение обновлено Удалить сообщение - Сообщение удалено + + Сообщение удалено + Сообщения удалены + Сообщения удалены + Сообщения удалены + Заголовок не может быть пустым. - Список правок + Ваши сообщения + Примеры сообщений Теги: %s Смотреть страницу участника Смотреть страницу обсуждения @@ -1608,7 +1618,6 @@ Со средней точностью находит промежуточную часть недобросовестных изменений. Скорее всего недобросовестные Максимально точен в поиске очевидно недобросовестных правок. - Отпатрулировать правку Откат завершён Посмотреть Узнать больше @@ -1621,6 +1630,7 @@ Обратная связь Отправить Обратная связь отправлена. + Предупреждение о нарушении авторских прав Судя по всему, ваша недавняя правка без разрешения содержит материалы, защищенные авторским правом. Пожалуйста, убедитесь, что весь контент соответствует политике [[Wikipedia:Авторские права|авторское право]] этой Википедии, чтобы избежать удаления. Принять Отклонить @@ -1636,4 +1646,6 @@ Список Очень доволен Очень неудовлетворен + Отмена + Что бы вы хотели, чтобы мы изменили или улучшили? diff --git a/app/src/main/res/values-sdh/strings.xml b/app/src/main/res/values-sdh/strings.xml index 088742d53db..a3ca2c08cf0 100644 --- a/app/src/main/res/values-sdh/strings.xml +++ b/app/src/main/res/values-sdh/strings.xml @@ -344,7 +344,6 @@ پاشەکەفت سڕینەوە پەێام وەڕووژکریاێە - پێرست دەسکاریەگان زانیاری وەکاربەر دیین بەشداریەیل وەکاربەر سپاس diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 1801fc85126..078559630e9 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -1316,8 +1316,6 @@ Prekliči Sporočilo je bilo objavljeno na urejevalčevi uporabniški pogovorni strani Sporočilo je shranjeno in objavljeno na urejevalčevi pogovorni strani - Izberite obstoječe opozorilo ali sestavite novega - Shranjena sporočila Ta pogovorna stran je prazna. Pogovor se začne tukaj Pogovorne strani so namenjene razpravam o tem, kako čim bolj izboljšati vsebino v Wikipediji. Začnite z dodajanjem nove pogovorne teme, da se povežete in sodelujete s skupnostjo Wikipedistov. @@ -1529,10 +1527,8 @@ Zdravo! S tabo želim deliti svoj bralni seznam Wikipedije: Nam lahko pomagate izboljšati možnost »Deli bralne sezname«? »Deli bralne sezname« je preizkusna možnost in potrebujemo vaše povratne informacije, da jo izboljšamo ali odstranimo. - Upravljanje predlog - Nimate nobenega shranjenega opozorila. + Nimate nobenega shranjenega opozorila. Novo sporočilo - Sestavite opozorilno sporočilo. Tema Sestavi sporočilo Shrani @@ -1561,7 +1557,6 @@ Sporočila so izbrisana Naslov ne sme biti prazen. - Seznam urejanj Iskanje ali filtriranje urejanj Oznake: %s Brez @@ -1623,7 +1618,6 @@ %d filtri %d filtrov - Pregled urejanja Zgodovina urejanja članka Vračanje opravljeno Ste prepričani, da želite vrniti? diff --git a/app/src/main/res/values-smn/strings.xml b/app/src/main/res/values-smn/strings.xml index 2568553e6b4..21b9d41dc34 100644 --- a/app/src/main/res/values-smn/strings.xml +++ b/app/src/main/res/values-smn/strings.xml @@ -335,7 +335,6 @@ Vuorkkii uđđâ viestân Vuorkkii uđđâ viestân liiston Almostit - Vyerkkejum viestah Vyerkkejum viestah Västid Uusâ viestâid diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 136fbc8dda4..cc8bee54ddd 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -133,6 +133,7 @@ Ваши језици Википедије Објави измену Измена је објављена. + Измена објављена! Треба ће неко време да измена постане видљива. Не могу сачувати измену. Покушај поново Откажи @@ -1230,10 +1231,9 @@ Наслов поруке Објави Откажи + Одбаци Порука је објављена на уредниковој страници за разговор Порука је сачувана и објављена на уредниковој страници за разговор - Одабери постојећу поруку упозорења или започните нову поруку. - Сачуване поруке Сачуване поруке Ова страница за разговор је празна. Разговор почиње овде @@ -1245,6 +1245,7 @@ Напишите поруку Порука не може бити без садржаја. Тема не може бити без садржаја. + Тема већ постоји. Покушајте другу. Одговор објављен. Опозови <b>Последња измена: %2$s</b>, %1$s @@ -1439,10 +1440,8 @@ Здраво! Желим да поделим моју листу за читање на Википедији са вама: Да ли можете да нам помогнете у унапређивању \"дељења листи за читање\"? \"Дељење листи за читање\" је тестна могућност и потребне су вам ваше повратне информације да би смо је унапредили или уклонили. - Управљање шаблонима - Немате сачуване поруке упозорења. + Немате сачуване поруке упозорења. Нова порука - Састави поруку упозорења. Тема Напиши поруку Сачувај @@ -1467,7 +1466,8 @@ Поруке су обрисане Морате навести назив. - Списак измена + Ваша порука + Примери порука Претрага или филтрирање измена Ознаке: %s Нема @@ -1527,7 +1527,6 @@ %d филтер %d филтера - Патролирај измену Историја Враћање је завршено Сигурно врати измене? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index aea595098de..576452309ef 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1253,8 +1253,6 @@ Avbryt Meddelandet publicerades på redigerarens användardiskussionssida Meddelandet sparades och publicerades på redigerarens användardiskussionssida - Välj ett befintligt varningsmeddelande eller skriv ett nytt. - Sparade meddelanden Den här diskussionssidan är tom. Konversationen börjar här Diskussionssidor är platsen där folk diskuterar hur man gör innehåll på Wikipedia så bra som möjligt. Börja med att lägga till ett nytt diskussionsämne för att få kontakt och samarbeta med en gemenskap av wikipedianer. @@ -1460,10 +1458,8 @@ Hej! Jag skulle vilja dela min Wikipedia-läslista med dig: Kan du hjälpa oss att förbättra \"Dela läslistor\"? \"Dela läslistor\" är en testfunktion och vi behöver din återkoppling för att förbättra eller ta bort den. - Hantera mallar - Du har inga varningsmeddelanden sparade. + Du har inga varningsmeddelanden sparade. Nytt meddelande - Skriv varningsmeddelande. Ämne Skriv meddelande Spara @@ -1488,7 +1484,6 @@ Meddelanden har raderats Titeln kan inte vara tom. - Lista över redigeringar Sök eller filtrera redigeringar Taggar: %s Inga @@ -1548,7 +1543,6 @@ %d filter %d filter - Patrullredigering Artikelns redigeringshistorik Återställdes Är du säker på att du vill rulla tillbaka? diff --git a/app/src/main/res/values-tly/strings.xml b/app/src/main/res/values-tly/strings.xml index 8f08170b382..dd4090f9ae6 100644 --- a/app/src/main/res/values-tly/strings.xml +++ b/app/src/main/res/values-tly/strings.xml @@ -848,7 +848,6 @@ Ovaxtətijon ogəte? Edaštej Ohaštej - Ogətə byə ǧədəǧon No-pegət ijo bino bejdə Čəvob doj (Be myžori) @@ -988,7 +987,6 @@ Ǧədəǧə sərost kardej Ogətej Mole - Ovaxtətijon sijohi Tegon: %s Ištirokəkə tohfə dijəkə Sepas diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c8c049d774f..63d771fdb93 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1279,8 +1279,6 @@ İptal İleti, düzenleyicinin kullanıcı tartışma sayfasında yayımlandı İleti, düzenleyicinin kullanıcı tartışma sayfasında saklandı ve yayımlandı - Var olan bir uyarı iletisini seçin ya da yeni bir ileti oluşturun. - Saklanan iletiler Saklanan iletiler Bu tartışma sayfası boş. Konuşma burada başlıyor @@ -1487,10 +1485,8 @@ Merhaba! Vikipedi okuma listemi seninle paylaşmak istiyorum: \"Okuma listelerini paylaş\" özelliğini iyileştirmemize yardımcı olabilir misiniz? \"Okuma listelerini paylaş\" bir deneme özelliğidir ve iyileştirmek ya da kaldırmak için geri bildiriminize ihtiyacımız var. - Şablonları yönet - Saklanan herhangi bir uyarı iletiniz yok. + Saklanan herhangi bir uyarı iletiniz yok. Yeni ileti - Uyarı iletisi oluşturun. Konu İleti oluştur Sakla @@ -1515,7 +1511,6 @@ İletiler silindi Başlık boş olamaz. - Değişiklik listesi Değişiklikleri ara ya da filtrele Etiketler: %s Hiçbiri @@ -1575,7 +1570,6 @@ %d süzgeci %d süzgeci - Kolluk değişikliği Madde düzenleme geçmişi Geri alma tamamlandı Geri dönmek istediğinizden emin misiniz? diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 419d981ffb9..c66cfd4ba68 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -131,7 +131,6 @@ Переглянути на мапі Читати іншою мовою Доступно %d іншими мовами - CC BY-SA 4.0 Зберігаючи, ви погоджуєтеся з <a href=\"%1$s\">Умовами користування</a>, та остаточно публікуєте свій внесок під ліцензією <a href=\"%2$s\">CC BY-SA 4.0</a>. Зберігаючи, ви погоджуєтеся з <a href=\"%1$s\">Умовами користування</a>, та невідклично публікуєте свій внесок під ліцензією <a href=\"%2$s\">CC BY-SA 4.0</a>. Редагування будуть пов\'язані з IP-адресою вашого пристрою. Якщо ви <a href=\"https://#login\">увійдете до системи</a>, то матимете більше приватності. Редагування будуть приписані ІР-адресі вашого пристрою. Якщо ви <a href=\"https://#login\">увійдете в систему</a>, ваші дії будуть більш конфіденційними. @@ -1328,8 +1327,6 @@ Скасувати Повідомлення опубліковано на сторінці обговорення користувача Повідомлення збережено та опубліковано на сторінці обговорення користувача - Виберіть наявне попередження або створіть нове повідомлення. - Збережені повідомлення Ця сторінка обговорення порожня. Розмова починається тут Сторінки обговорення — це місце, де люди обговорюють, як зробити вміст Вікіпедії якнайкращим. Почніть із додавання нової теми для обговорення, щоб зв\'язатися та співпрацювати зі спільнотою вікіпедистів. @@ -1539,10 +1536,8 @@ Привіт! Хочу поділитися з вами своїм списком для читання у Вікіпедії: Чи могли б ви допомогти нам покращити функцію спільних списків для читання? Спільні списки читання є тестовою функцією і нам потрібні ваші відгуки, щоб ми могли її покращити або прибрати. - Керування шаблонами - У вас немає збережених попереджень. + У вас немає збережених попереджень. Нове повідомлення - Створіть попереджувальне повідомлення. Тема Написати повідомлення Зберегти @@ -1558,7 +1553,6 @@ Вилучити Повідомлення оновлено Повідомлення вилучено - Список редагувань Шукати або фільтрувати редагування Мітки: %s Немає @@ -1620,7 +1614,6 @@ %d фільтрів %d фільтрів - Відпатрулювати редагування Історія редагування статті Скасування виконано Ви дійсно хочете відкинути? diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index b749d36f8d8..05d14ce5619 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -1240,8 +1240,6 @@ Bekor qilish Xabar muharrirning munozara sahifasida chop etildi Xabar saqlandi va muharrirning foydalanuvchi munozara sahifasida chop etildi - Mavjud ogohlantirish xabarini tanlang yoki yangi xabar yozing. - Saqlangan xabarlar Bu munozara sahifasi boʻsh. Suhbat shu yerda boshlanadi Muloqot sahifalarida odamlar Vikipediya kontentini qanday qilib yaxshilash borasida muhokama qilishadi. Vikipediyachilar hamjamiyati bilan bogʻlanish va hamkorlik qilish uchun yangi muhokama mavzusini qoʻshishdan boshlang. @@ -1447,10 +1445,8 @@ Salom! Men Siz bilan Vikipediya oʻqish roʻyxatini baham koʻrmoqchiman: “Oʻqish roʻyxatini baham koʻrish”ni yaxshilashga yordam bera olasizmi? “Oʻqish roʻyxatlarini ulashish” sinov koʻrinishida boʻlib, uni yaxshilash yoki olib tashlash uchun fikr-mulohazalaringiz kerak. - Shablonlar boshqaruvi - Sizda hech qanday ogohlantirish xabari saqlanmagan. + Sizda hech qanday ogohlantirish xabari saqlanmagan. Yangi xabar - Ogohlantirish xabarini tuzish. Mavzu Xabar qoldirish Saqlamoq @@ -1475,7 +1471,6 @@ Xabarlar oʻchirildi Sarlavha boʻsh qolmasligi kerak. - Tahrirlar roʻyxati Tahrirlarni qidirish yoki filtrlash Teglar: %s Hech qaysi @@ -1535,7 +1530,6 @@ %d ta filtr %d ta filtr - Tahrir kuzatuvchisi Maqolani tahrirlash tarixi Qayta tiklash bajarildi Qayta tiklamoqchimisiz? diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index eff0523a101..4f4451ecc15 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -148,6 +148,7 @@ 您的維基百科語言 發布變更 已發布編輯! + 已發布編輯!變動的內容會需要一些時間來呈現。 編輯失敗 ! 重試 取消 @@ -207,7 +208,7 @@ 已經擁有帳號了嗎? 建立帳號 驗證中 - 電子郵件(選填) + 電子信箱(非必填) 重複輸入密碼 密碼不可以和使用者名稱相同 密碼不符合 @@ -427,6 +428,7 @@ 儲存 已儲存 分享 + 這是一篇小條目,代表著沒有足夠的條目內容來產生預覽。您可以動手來改善條目內容。 此頁面不存在 維基百科上沒有此確切名稱的<a href=\"%1$s\">使用者頁面</a>。在一般情況下,此頁面應是由<b>%2$s</b>建立與編輯。如有疑問,請確認「%3$s」是否存在。 無法連接網路 @@ -460,7 +462,7 @@ 目次 編輯… 編輯條目描述 - 編輯簡介 + 編輯首節 佈景主題 明亮 陰暗 @@ -532,7 +534,7 @@ 移動至別的清單 我的閱讀清單 此清單的名稱 - 描述 (選填) + 描述(非必填) %s已從清單之中移除 已從%2$s移除%1$s @@ -1247,7 +1249,7 @@ 搜尋模板 插入 例如:%s - %s(可選) + %s(非必填) %s(建議) 了解更多 模板是由使用者產生,可能缺乏完整的描述。 @@ -1267,7 +1269,7 @@ 對話 對話:%s 新話題 - 主題已發布。 + 話題已發布。 警告 儲存變更? 另存成新訊息 @@ -1276,15 +1278,13 @@ 訊息標題 發布 取消 + 不儲存 訊息已發布到編輯者的使用者討論頁面 已儲存訊息,並發布到編輯者的使用者討論頁 - 選擇現有警告訊息或撰寫新的訊息。 - 已儲存訊息 已儲存訊息 - 了解訊息佔位符 此討論頁面為空。 對話從這裡開始 - 討論頁是讓人們討論如何將維基百科內容做到最好的地方。請先發起一個新的討論主題,以便和維基人社群聯繫與協作。 + 討論頁是讓人們討論如何將維基百科內容做到最好的地方。請先發起一個新的討論話題,以便和維基人社群聯繫與協作。 回覆 (無話題) 話題 @@ -1292,6 +1292,7 @@ 撰寫訊息 訊息不能為空。 話題不能為空。 + 主題名稱已存在。請嘗試別的名稱。 回覆已發布。 撤銷 由%2$s在<b> %1$s </b>所做的最後一次編輯 @@ -1301,12 +1302,12 @@ 維基百科 - 討論頁上的討論 這是一個討論頁。請遵守討論頁的指引,並記得在使用 wikitext 發布內容時藉由輸入四個波浪號:~~~~ ,來在您發布的內容裡產生您的簽名。<br><br><a href=\"https://zh.wikipedia.org/wiki/Wikipedia:討論頁指引\">維基百科:討論頁指引</a> 搜尋訊息 - 搜尋主題 - 在討論頁主題尋找 + 搜尋話題 + 在討論頁話題尋找 排序依 發佈日期 已更新日期 - 主題名稱 + 話題名稱 您確定您要離開嗎? 不會儲存主題和內容文字。 @@ -1329,8 +1330,8 @@ 使用者圖示 已讀 未讀 - 登入以訂閱主題 - 主題訂閱能允許您接收有關該主題裡新發言的通知。請建立一個帳號或是登入您的維基百科帳號以訂閱主題。 + 登入以訂閱話題 + 話題訂閱能允許您接收有關該主題裡新發言的通知。請建立一個帳號或是登入您的維基百科帳號以訂閱主題。 討論存檔:%s 分享討論 分享討論頁 @@ -1338,7 +1339,7 @@ %s的貢獻 編輯原始碼 %s的使用者頁面 - 在討論頁主題尋找 + 在討論頁話題尋找 複製連結至剪貼簿 複製文字 展開討論串 @@ -1370,7 +1371,7 @@ 此修訂所做出的更改不公開。 您確定您要撤銷這個編輯嗎? 撤銷代表著會回退一個或多個編輯內容。 - 摘要(可選) + 摘要(非必填) 分享回退的原因 已撤銷修訂。 確定要回退這些編輯嗎? @@ -1487,10 +1488,8 @@ 您好!我想與您分享我的維基百科閱讀清單: 您願意幫助我們改善「分享閱讀清單」嗎? 「分享閱讀清單」是一項測試功能,我們需要您的意見回饋來改善、或是移除這項功能。 - 管理模板 - 您沒有儲存任何警告訊息。 + 建立您自己的警告訊息,或使用<a href=\"#\">範例訊息</a>來開始。 新訊息 - 撰寫警告訊息。 主旨 撰寫訊息 儲存 @@ -1515,7 +1514,8 @@ 已刪除訊息 標題不能為空。 - 編輯清單 + 您的訊息 + 範例訊息 搜尋或篩選編輯 標籤:%s @@ -1575,7 +1575,6 @@ %d 個篩選 %d 個篩選 - 巡查編輯 條目編輯歷史 回退完成 您確定要回退嗎? @@ -1626,6 +1625,8 @@ 您最近的編輯內容似乎含有未經許可的受版權保護資料。為避免您的編輯遭到刪除,請確認所有內容均符合維基百科的[[Wikipedia:著作權資訊|版權]]方針。 {{{username}}}您好,您似乎沒有留下任何編輯摘要,就直接刪除了維基百科的內容。請留意,每當您在維基百科裡新增或刪除內容時,請記得留下編輯摘要。 {{{username}}}您好,您似乎沒在條目討論頁面上進行討論,就直接移除了內容。請注意,維基百科的內容不受審查,不應內容有爭議而移除。如果您認為資訊不準確,請在條目討論頁面達成共識。 + 了解訊息佔位符 + 使用下面的範例訊息來自訂、傳送,並儲存到您的訊息裡。 {{{username}}}您好,您的條目有很好的開始!為了讓內容變得更好,請考慮添加更多可靠來源引用。這有助於驗證內容的可信度,並提高條目的品質。請參閱維基百科[[Wikipedia:Reliable_sources|可靠來源]]上的指南來了解更多詳細資訊。 編輯 接受 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 0feabb8833f..4d021aeb9f7 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -173,7 +173,6 @@ 在地图上查看 阅读其他语言 有其他%d种语言版本 - CC BY-SA 4.0 一旦发布,即表示您认同<a href=\"%1$s\">使用条款</a>,并采用<a href=\"%2$s\">CC BY-SA 4.0</a>许可协议不可撤销地发表您的贡献。 一旦发布,即表示您认同<a href=\"%1$s\">使用条款</a>,并采用<a href=\"%2$s/\">CC BY-SA 4.0</a>许可协议不可撤销地发表您的贡献。编辑历史会显示您设备的IP地址。如果您<a href=\"https://#login\">登录</a>后编辑,可以更好地保护您的隐私。 编辑将以您设备的 IP 地址发布。如果您<a href=\"https://#login\">登录</a>,您将拥有更多隐私。 @@ -1298,8 +1297,6 @@ 取消 消息发布到编辑的用户的讨论页面 消息已保存并发布到编辑的用户的讨论页面 - 选择已有的警告消息或撰写新消息。 - 已保存的消息 已保存的消息 此讨论页为空。 对话从这里开始 @@ -1499,10 +1496,8 @@ 你好!我想给你分享我的维基百科阅读清单: 您能帮助我们改进“分享阅读清单”吗? “分享阅读清单”是一项测试功能,我们需要您的反馈来改进或删除它。 - 管理模板 - 您没有保存任何警告消息。 + 您没有保存任何警告消息。 新留言 - 撰写警告留言。 主题 撰写消息 保存 @@ -1520,7 +1515,6 @@ 消息已删除 - 编辑列表 搜索或过滤编辑 标签: %s From 84c5b4388c6f4a240105a19ffcbc3de8d1880865 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 28 Mar 2024 07:13:37 -0700 Subject: [PATCH 017/626] Remove unused invokeSource and const values (#4560) Co-authored-by: Dmitry Brant --- app/src/main/java/org/wikipedia/Constants.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/org/wikipedia/Constants.kt b/app/src/main/java/org/wikipedia/Constants.kt index bc9a329f6de..62254186308 100644 --- a/app/src/main/java/org/wikipedia/Constants.kt +++ b/app/src/main/java/org/wikipedia/Constants.kt @@ -11,7 +11,6 @@ object Constants { const val ACTIVITY_REQUEST_FEED_CONFIGURE = 58 const val ACTIVITY_REQUEST_GALLERY = 52 const val ACTIVITY_REQUEST_IMAGE_TAGS_ONBOARDING = 65 - const val ACTIVITY_REQUEST_LANGLINKS = 50 const val ACTIVITY_REQUEST_LOGIN = 53 const val ACTIVITY_REQUEST_OPEN_SEARCH_ACTIVITY = 62 const val ACTIVITY_REQUEST_SETTINGS = 41 @@ -98,7 +97,6 @@ object Constants { TALK_TOPICS_ACTIVITY("talkTopicsActivity"), TALK_TOPIC_ACTIVITY("talkTopicActivity"), TALK_REPLY_ACTIVITY("talkReplyActivity"), - ADD_TEMPLATE_ACTIVITY("addTemplateActivity"), EDIT_ACTIVITY("editActivity"), TOOLBAR("toolbar"), VOICE("voice"), From 6e0f808b09e933017e98eaa11a0a51d3fd031e88 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 28 Mar 2024 07:23:06 -0700 Subject: [PATCH 018/626] Remove unused methods and optimize code in TalkTemplates (#4561) Co-authored-by: Dmitry Brant --- .../talk/template/TalkTemplatesFragment.kt | 2 +- .../talk/template/TalkTemplatesItemView.kt | 13 ++++++------ .../talk/template/TalkTemplatesRepository.kt | 5 +---- .../template/TalkTemplatesTextInputDialog.kt | 14 +++---------- .../talk/template/TalkTemplatesViewModel.kt | 20 ++++--------------- 5 files changed, 16 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index ced940f0dfa..fd00a2b5425 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -521,7 +521,7 @@ class TalkTemplatesFragment : Fragment() { } } - private inner class RearrangeableItemTouchHelperCallback constructor(private val adapter: RecyclerAdapter) : ItemTouchHelper.Callback() { + private inner class RearrangeableItemTouchHelperCallback(private val adapter: RecyclerAdapter) : ItemTouchHelper.Callback() { override fun isLongPressDragEnabled(): Boolean { return false } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesItemView.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesItemView.kt index a0ab3a18917..fa8d4fa2169 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesItemView.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesItemView.kt @@ -17,7 +17,7 @@ import org.wikipedia.talk.db.TalkTemplate import org.wikipedia.util.DeviceUtil import org.wikipedia.util.ResourceUtil -class TalkTemplatesItemView constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(context, attrs) { +class TalkTemplatesItemView(context: Context, attrs: AttributeSet? = null) : LinearLayout(context, attrs) { interface Callback { fun onClick(position: Int) @@ -45,15 +45,16 @@ class TalkTemplatesItemView constructor(context: Context, attrs: AttributeSet? = } fun setContents(talkTemplate: TalkTemplate, position: Int, isSaveMessagesTab: Boolean = false) { - binding.listItemTitle.isVisible = !(isSaveMessagesTab && position == 0) + val nonTemplateMessage = isSaveMessagesTab && position == 0 + binding.listItemTitle.isVisible = !nonTemplateMessage binding.listItemTitle.text = talkTemplate.subject binding.listItemDescription.text = talkTemplate.message - binding.listItemDescription.setTypeface(Typeface.SANS_SERIF, if (position == 0 && isSaveMessagesTab) Typeface.ITALIC else Typeface.NORMAL) - binding.listItemDescription.isSingleLine = !(position == 0 && isSaveMessagesTab) + binding.listItemDescription.setTypeface(Typeface.SANS_SERIF, if (nonTemplateMessage) Typeface.ITALIC else Typeface.NORMAL) + binding.listItemDescription.isSingleLine = !(nonTemplateMessage) binding.listItem.setBackgroundResource(ResourceUtil.getThemedAttributeId(context, - if (position == 0 && isSaveMessagesTab) R.attr.background_color else android.R.attr.selectableItemBackground)) + if (nonTemplateMessage) R.attr.background_color else android.R.attr.selectableItemBackground)) binding.listItemDescription.ellipsize = - if (position == 0 && isSaveMessagesTab) null else TextUtils.TruncateAt.END + if (nonTemplateMessage) null else TextUtils.TruncateAt.END binding.listItem.setOnClickListener { callback?.onClick(position) diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesRepository.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesRepository.kt index 4a8c0d531bb..c669c789d08 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesRepository.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesRepository.kt @@ -3,7 +3,7 @@ package org.wikipedia.talk.template import org.wikipedia.talk.db.TalkTemplate import org.wikipedia.talk.db.TalkTemplateDao -class TalkTemplatesRepository constructor(private val talkTemplateDao: TalkTemplateDao) { +class TalkTemplatesRepository(private val talkTemplateDao: TalkTemplateDao) { suspend fun getAllTemplates() = talkTemplateDao.getAllTemplates() @@ -26,7 +26,4 @@ class TalkTemplatesRepository constructor(private val talkTemplateDao: TalkTempl suspend fun deleteTemplates(talkTemplates: List) { talkTemplateDao.deleteTemplates(talkTemplates.map { it.id }) } - suspend fun getTemplateById(id: Int): TalkTemplate? { - return talkTemplateDao.getTemplateById(id) - } } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt index b37d92523f9..a5d75c111b7 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt @@ -8,13 +8,11 @@ import androidx.appcompat.app.AlertDialog import androidx.core.widget.doOnTextChanged import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.wikipedia.R -import org.wikipedia.analytics.eventplatform.PatrollerExperienceEvent import org.wikipedia.databinding.DialogTalkTemplatesTextInputBinding -import org.wikipedia.talk.TalkReplyActivity -class TalkTemplatesTextInputDialog constructor(private val activity: Activity, - positiveButtonText: Int = R.string.text_input_dialog_ok_button_text, - negativeButtonText: Int = R.string.text_input_dialog_cancel_button_text) : MaterialAlertDialogBuilder(activity, R.style.AlertDialogTheme_Input) { +class TalkTemplatesTextInputDialog(private val activity: Activity, + positiveButtonText: Int = R.string.text_input_dialog_ok_button_text, + negativeButtonText: Int = R.string.text_input_dialog_cancel_button_text) : MaterialAlertDialogBuilder(activity, R.style.AlertDialogTheme_Input) { interface Callback { fun onSuccess(subjectText: String) fun onCancel() @@ -69,12 +67,6 @@ class TalkTemplatesTextInputDialog constructor(private val activity: Activity, dialog?.getButton(AlertDialog.BUTTON_POSITIVE)?.isEnabled = enabled } - private fun sendPatrollerExperienceEvent(action: String) { - PatrollerExperienceEvent.logAction( - action, if (activity is TalkReplyActivity) "pt_warning_messages" else "pt_templates" - ) - } - fun getView(): ViewGroup { return binding.root } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt index 17f56df2e0b..d419e4a441e 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt @@ -1,7 +1,5 @@ package org.wikipedia.talk.template -import android.content.Context -import android.content.res.Configuration import android.os.Bundle import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider @@ -14,15 +12,14 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.wikipedia.Constants import org.wikipedia.R -import org.wikipedia.WikipediaApp import org.wikipedia.database.AppDatabase import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.talk.TalkReplyActivity import org.wikipedia.talk.TalkReplyActivity.Companion.EXTRA_TEMPLATE_MANAGEMENT import org.wikipedia.talk.db.TalkTemplate +import org.wikipedia.util.L10nUtil import java.util.Collections -import java.util.Locale class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { @@ -65,23 +62,14 @@ class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { private fun loadSavedTemplates() { val langCode = pageTitle.wikiSite.languageCode - val context = WikipediaApp.instance.applicationContext for (i in savedMessagesSubjectList.indices) { - val talkTemplate = TalkTemplate(0, 0, -1, savedMessagesTitleList[i], - if (i == 0) "" else getLocaleStringResource(Locale(langCode), savedMessagesSubjectList[i], context), - getLocaleStringResource(Locale(langCode), savedMessagesBodyList[i], context)) + val subjectString = if (i == 0) "" else L10nUtil.getStringForArticleLanguage(langCode, savedMessagesSubjectList[i]) + val bodyString = L10nUtil.getStringForArticleLanguage(langCode, savedMessagesBodyList[i]) + val talkTemplate = TalkTemplate(0, 0, -1, savedMessagesTitleList[i], subjectString, bodyString) savedTemplatesList.add(talkTemplate) } } - private fun getLocaleStringResource(requestedLocale: Locale, resourceId: Int, context: Context): String { - val result: String - val config = Configuration(context.resources.configuration) - config.setLocale(requestedLocale) - result = context.createConfigurationContext(config).getText(resourceId).toString() - return result - } - fun swapList(oldPosition: Int, newPosition: Int) { Collections.swap(talkTemplatesList, oldPosition, newPosition) resetOrder() From 87d4f93afa1ad2eb08e7c94a10dfca6e302c1331 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 29 Mar 2024 12:54:38 -0400 Subject: [PATCH 019/626] When searching from Places, hide namespace selection. (#4568) --- .../search/RecentSearchesFragment.kt | 2 +- .../org/wikipedia/search/SearchFragment.kt | 2 ++ .../res/layout/fragment_search_recent.xml | 30 +++++++++++-------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.kt b/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.kt index 520ac58200f..099bcc73316 100644 --- a/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.kt +++ b/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.kt @@ -36,7 +36,7 @@ class RecentSearchesFragment : Fragment() { } private var _binding: FragmentSearchRecentBinding? = null - private val binding get() = _binding!! + val binding get() = _binding!! private val namespaceHints = listOf(Namespace.USER, Namespace.PORTAL, Namespace.HELP) private val namespaceMap = ConcurrentHashMap>() private val coroutineExceptionHandler = CoroutineExceptionHandler { _, throwable -> L.e(throwable) } diff --git a/app/src/main/java/org/wikipedia/search/SearchFragment.kt b/app/src/main/java/org/wikipedia/search/SearchFragment.kt index 9c385d286b0..0b18ee199a6 100644 --- a/app/src/main/java/org/wikipedia/search/SearchFragment.kt +++ b/app/src/main/java/org/wikipedia/search/SearchFragment.kt @@ -13,6 +13,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.core.os.bundleOf +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.CoroutineExceptionHandler @@ -128,6 +129,7 @@ class SearchFragment : Fragment(), SearchResultsFragment.Callback, RecentSearche setUpLanguageScroll(Prefs.selectedLanguagePositionInSearch) startSearch(query, langBtnClicked) binding.searchCabView.setCloseButtonVisibility(query) + recentSearchesFragment.binding.namespacesContainer.isVisible = invokeSource != InvokeSource.PLACES if (!query.isNullOrEmpty()) { showPanel(PANEL_SEARCH_RESULTS) } diff --git a/app/src/main/res/layout/fragment_search_recent.xml b/app/src/main/res/layout/fragment_search_recent.xml index 3af1294a108..440ac467382 100644 --- a/app/src/main/res/layout/fragment_search_recent.xml +++ b/app/src/main/res/layout/fragment_search_recent.xml @@ -1,6 +1,5 @@ - - @@ -97,10 +98,13 @@ - \ No newline at end of file + \ No newline at end of file From f80d1645deff73c2620ac1b0d0d4780c70c6b321 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 29 Mar 2024 13:06:41 -0400 Subject: [PATCH 020/626] Remove unnecessary UiState classes. (#4567) * Remove unnecessary UiState classes. * A touch more cleanup. --------- Co-authored-by: Cooltey Feng --- .../SuggestedEditsImageRecsFragment.kt | 13 +++++++------ ...SuggestedEditsImageRecsFragmentViewModel.kt | 18 +++++++----------- .../SuggestedEditsTasksFragment.kt | 9 +++++---- .../SuggestedEditsTasksFragmentViewModel.kt | 18 +++++++----------- .../talk/template/TalkTemplatesFragment.kt | 9 +++++---- .../talk/template/TalkTemplatesViewModel.kt | 18 +++++++----------- .../usercontrib/UserInformationDialog.kt | 7 ++++--- .../UserInformationDialogViewModel.kt | 17 ++++++----------- .../main/java/org/wikipedia/util/Resource.kt | 1 + .../wikipedia/watchlist/WatchlistFragment.kt | 7 ++++--- .../wikipedia/watchlist/WatchlistViewModel.kt | 15 +++++---------- 11 files changed, 58 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragment.kt index 8996f596530..5e6960ffa69 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragment.kt @@ -49,6 +49,7 @@ import org.wikipedia.settings.Prefs import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.ImageUrlUtil +import org.wikipedia.util.Resource import org.wikipedia.util.ResourceUtil import org.wikipedia.util.StringUtil import org.wikipedia.util.UriUtil @@ -180,10 +181,10 @@ class SuggestedEditsImageRecsFragment : SuggestedEditsItemFragment(), MenuProvid repeatOnLifecycle(Lifecycle.State.CREATED) { viewModel.uiState.collect { when (it) { - is SuggestedEditsImageRecsFragmentViewModel.UiState.Loading -> onLoading() - is SuggestedEditsImageRecsFragmentViewModel.UiState.Success -> onLoadSuccess() - is SuggestedEditsImageRecsFragmentViewModel.UiState.Depleted -> onDepletedState() - is SuggestedEditsImageRecsFragmentViewModel.UiState.Error -> onError(it.throwable) + is Resource.Loading -> onLoading() + is Resource.Success -> onLoadSuccess() + is SuggestedEditsImageRecsFragmentViewModel.Depleted -> onDepletedState() + is Resource.Error -> onError(it.throwable) } } } @@ -313,7 +314,7 @@ class SuggestedEditsImageRecsFragment : SuggestedEditsItemFragment(), MenuProvid override fun onPrepareMenu(menu: Menu) { super.onPrepareMenu(menu) - menu.findItem(R.id.menu_tutorial).isVisible = viewModel.uiState.value is SuggestedEditsImageRecsFragmentViewModel.UiState.Success + menu.findItem(R.id.menu_tutorial).isVisible = viewModel.uiState.value is Resource.Success } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { @@ -438,7 +439,7 @@ class SuggestedEditsImageRecsFragment : SuggestedEditsItemFragment(), MenuProvid private fun getActionStringForAnalytics(acceptanceState: String? = null, rejectionReasons: String? = null, revisionId: Long? = null, addTimeSpent: Boolean = false): String { - val recommendedImage = if (viewModel.uiState.value is SuggestedEditsImageRecsFragmentViewModel.UiState.Success) viewModel.recommendation.images[0] else null + val recommendedImage = if (viewModel.uiState.value is Resource.Success) viewModel.recommendation.images[0] else null return ImageRecommendationsEvent.getActionDataString(filename = recommendedImage?.image, recommendationSource = recommendedImage?.source, recommendationSourceProjects = recommendedImage?.projects.toString(), diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt index bbc28fb0d62..e85fc94e4f3 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt @@ -25,6 +25,7 @@ import org.wikipedia.page.PageTitle import org.wikipedia.staticdata.FileAliasData import org.wikipedia.suggestededits.provider.EditingSuggestionsProvider import org.wikipedia.util.ImageUrlUtil +import org.wikipedia.util.Resource import org.wikipedia.util.UriUtil import org.wikipedia.util.log.L import java.io.IOException @@ -33,7 +34,7 @@ import java.util.* class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> - _uiState.value = UiState.Error(throwable) + _uiState.value = Resource.Error(throwable) } lateinit var recommendation: GrowthImageSuggestion @@ -43,7 +44,7 @@ class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { var attemptInsertInfobox = false val langCode = bundle.getString(SuggestedEditsImageRecsFragment.ARG_LANG)!! - private val _uiState = MutableStateFlow(UiState()) + private val _uiState = MutableStateFlow(Resource()) val uiState = _uiState.asStateFlow() init { @@ -51,7 +52,7 @@ class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { } fun fetchRecommendation() { - _uiState.value = UiState.Loading() + _uiState.value = Resource.Loading() viewModelScope.launch(handler) { var page: MwQueryPage? var tries = 0 @@ -60,7 +61,7 @@ class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { } while (tries++ < 10 && page?.growthimagesuggestiondata.isNullOrEmpty()) if (page?.growthimagesuggestiondata.isNullOrEmpty()) { - _uiState.value = UiState.Depleted() + _uiState.value = Depleted() return@launch } @@ -111,7 +112,7 @@ class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { } } - _uiState.value = UiState.Success() + _uiState.value = Resource.Success(Unit) } } @@ -159,10 +160,5 @@ class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { } } - open class UiState { - class Loading : UiState() - class Success : UiState() - class Depleted : UiState() - class Error(val throwable: Throwable) : UiState() - } + class Depleted : Resource() } diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt index c4554bd0908..8d8a6c5bd12 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt @@ -44,6 +44,7 @@ import org.wikipedia.usercontrib.UserContribStats import org.wikipedia.util.DateUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.ReleaseUtil +import org.wikipedia.util.Resource import org.wikipedia.util.ResourceUtil import org.wikipedia.util.StringUtil import org.wikipedia.util.UriUtil @@ -115,10 +116,10 @@ class SuggestedEditsTasksFragment : Fragment() { repeatOnLifecycle(Lifecycle.State.CREATED) { viewModel.uiState.collect { when (it) { - is SuggestedEditsTasksFragmentViewModel.UiState.Loading -> onLoading() - is SuggestedEditsTasksFragmentViewModel.UiState.Success -> setFinalUIState() - is SuggestedEditsTasksFragmentViewModel.UiState.RequireLogin -> onRequireLogin() - is SuggestedEditsTasksFragmentViewModel.UiState.Error -> showError(it.throwable) + is Resource.Loading -> onLoading() + is Resource.Success -> setFinalUIState() + is SuggestedEditsTasksFragmentViewModel.RequireLogin -> onRequireLogin() + is Resource.Error -> showError(it.throwable) } } } diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragmentViewModel.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragmentViewModel.kt index 484917e2553..f1fa45ccc7f 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragmentViewModel.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragmentViewModel.kt @@ -13,6 +13,7 @@ import org.wikipedia.auth.AccountUtil import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.mwapi.UserContribution import org.wikipedia.usercontrib.UserContribStats +import org.wikipedia.util.Resource import org.wikipedia.util.ThrowableUtil import java.time.temporal.ChronoUnit import java.util.Date @@ -20,10 +21,10 @@ import java.util.Date class SuggestedEditsTasksFragmentViewModel : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> - _uiState.value = UiState.Error(throwable) + _uiState.value = Resource.Error(throwable) } - private val _uiState = MutableStateFlow(UiState()) + private val _uiState = MutableStateFlow(Resource()) val uiState = _uiState.asStateFlow() var blockMessageWikipedia: String? = null @@ -42,11 +43,11 @@ class SuggestedEditsTasksFragmentViewModel : ViewModel() { var allowToPatrolEdits = false fun fetchData() { - _uiState.value = UiState.Loading() + _uiState.value = Resource.Loading() wikiSupportsImageRecommendations = false if (!AccountUtil.isLoggedIn) { - _uiState.value = UiState.RequireLogin() + _uiState.value = RequireLogin() return } @@ -121,7 +122,7 @@ class SuggestedEditsTasksFragmentViewModel : ViewModel() { totalPageviews = UserContribStats.getPageViews(wikidataResponse) - _uiState.value = UiState.Success() + _uiState.value = Resource.Success(Unit) } } @@ -137,10 +138,5 @@ class SuggestedEditsTasksFragmentViewModel : ViewModel() { .count() } - open class UiState { - class Loading : UiState() - class RequireLogin : UiState() - class Success : UiState() - class Error(val throwable: Throwable) : UiState() - } + class RequireLogin : Resource() } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index fd00a2b5425..ef80d5e1e1c 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -40,6 +40,7 @@ import org.wikipedia.talk.TalkReplyActivity.Companion.RESULT_BACK_FROM_TOPIC import org.wikipedia.talk.TalkTopicsActivity import org.wikipedia.talk.db.TalkTemplate import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil import org.wikipedia.views.DrawableItemDecoration import org.wikipedia.views.MultiSelectActionModeCallback @@ -150,9 +151,9 @@ class TalkTemplatesFragment : Fragment() { launch { viewModel.uiState.collect { when (it) { - is TalkTemplatesViewModel.UiState.Loading -> onLoading() - is TalkTemplatesViewModel.UiState.Success -> onSuccess() - is TalkTemplatesViewModel.UiState.Error -> onError(it.throwable) + is Resource.Loading -> onLoading() + is Resource.Success -> onSuccess() + is Resource.Error -> onError(it.throwable) } } } @@ -299,7 +300,7 @@ class TalkTemplatesFragment : Fragment() { } private fun onAdded() { - updateAndNotifyAdapter() + updateAndNotifyAdapter() } private fun onActionError(t: Throwable) { diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt index d419e4a441e..e1a15f06f20 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt @@ -19,13 +19,14 @@ import org.wikipedia.talk.TalkReplyActivity import org.wikipedia.talk.TalkReplyActivity.Companion.EXTRA_TEMPLATE_MANAGEMENT import org.wikipedia.talk.db.TalkTemplate import org.wikipedia.util.L10nUtil +import org.wikipedia.util.Resource import java.util.Collections class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { private val talkTemplatesRepository = TalkTemplatesRepository(AppDatabase.instance.talkTemplateDao()) private val handler = CoroutineExceptionHandler { _, throwable -> - _uiState.value = UiState.Error(throwable) + _uiState.value = Resource.Error(throwable) } private val actionHandler = CoroutineExceptionHandler { _, throwable -> _actionState.value = ActionState.Error(throwable) @@ -33,7 +34,7 @@ class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { val talkTemplatesList = mutableListOf() val savedTemplatesList = mutableListOf() - private val _uiState = MutableStateFlow(UiState()) + private val _uiState = MutableStateFlow(Resource()) val uiState = _uiState.asStateFlow() private val _actionState = MutableStateFlow(ActionState()) @@ -53,9 +54,9 @@ class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { viewModelScope.launch(handler) { withContext(Dispatchers.IO) { talkTemplatesList.clear() - _uiState.value = UiState.Loading() + _uiState.value = Resource.Loading() talkTemplatesList.addAll(talkTemplatesRepository.getAllTemplates()) - _uiState.value = UiState.Success() + _uiState.value = Resource.Success(Unit) } } } @@ -111,18 +112,13 @@ class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { } } - open class UiState { - class Loading : UiState() - class Success : UiState() - class Error(val throwable: Throwable) : UiState() - } - open class ActionState { class Added : ActionState() class Deleted(val size: Int) : ActionState() class Error(val throwable: Throwable) : ActionState() } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { + + class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { @Suppress("unchecked_cast") override fun create(modelClass: Class): T { return TalkTemplatesViewModel(bundle) as T diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt index de800583181..0be41881d52 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt @@ -18,6 +18,7 @@ import org.wikipedia.databinding.DialogUserInformationBinding import org.wikipedia.suggestededits.SuggestedEditsRecentEditsActivity import org.wikipedia.suggestededits.SuggestionsActivity import org.wikipedia.util.DateUtil +import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil import java.time.LocalDateTime import java.time.ZoneId @@ -53,9 +54,9 @@ class UserInformationDialog : DialogFragment() { repeatOnLifecycle(Lifecycle.State.CREATED) { viewModel.uiState.collect { when (it) { - is UserInformationDialogViewModel.UiState.Loading -> onLoading() - is UserInformationDialogViewModel.UiState.Success -> onSuccess(it.editCount, it.registrationDate) - is UserInformationDialogViewModel.UiState.Error -> onError(it.throwable) + is Resource.Loading -> onLoading() + is Resource.Success -> onSuccess(it.data.first, it.data.second) + is Resource.Error -> onError(it.throwable) } } } diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt index da97897a009..9a10802bc6d 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt @@ -10,17 +10,18 @@ import kotlinx.coroutines.flow.asStateFlow import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite +import org.wikipedia.util.Resource import java.util.* class UserInformationDialogViewModel(bundle: Bundle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> - _uiState.value = UiState.Error(throwable) + _uiState.value = Resource.Error(throwable) } var userName: String = bundle.getString(UserInformationDialog.USERNAME_ARG)!! - private val _uiState = MutableStateFlow(UiState()) + private val _uiState = MutableStateFlow(Resource>()) val uiState = _uiState.asStateFlow() init { @@ -29,25 +30,19 @@ class UserInformationDialogViewModel(bundle: Bundle) : ViewModel() { private fun fetchUserInformation() { viewModelScope.launch(handler) { - _uiState.value = UiState.Loading() + _uiState.value = Resource.Loading() val userInfo = withContext(Dispatchers.IO) { ServiceFactory.get(WikiSite.forLanguageCode(WikipediaApp.instance.appOrSystemLanguageCode)).globalUserInfo(userName) } userInfo.query?.globalUserInfo?.let { val editCount = String.format("%,d", it.editCount) - _uiState.value = UiState.Success(editCount, it.registrationDate) + _uiState.value = Resource.Success(Pair(editCount, it.registrationDate)) } ?: run { - _uiState.value = UiState.Error(Throwable("Cannot fetch user information.")) + _uiState.value = Resource.Error(Throwable("Cannot fetch user information.")) } } } - open class UiState { - class Loading : UiState() - class Success(val editCount: String, val registrationDate: Date) : UiState() - class Error(val throwable: Throwable) : UiState() - } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { @Suppress("unchecked_cast") override fun create(modelClass: Class): T { diff --git a/app/src/main/java/org/wikipedia/util/Resource.kt b/app/src/main/java/org/wikipedia/util/Resource.kt index 76bb03827c9..9dc3c827856 100644 --- a/app/src/main/java/org/wikipedia/util/Resource.kt +++ b/app/src/main/java/org/wikipedia/util/Resource.kt @@ -1,6 +1,7 @@ package org.wikipedia.util open class Resource { + class Loading : Resource() class Success(val data: T) : Resource() class Error(val throwable: Throwable) : Resource() } diff --git a/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt b/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt index 20c9e73411e..1b96e9d0681 100644 --- a/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt +++ b/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt @@ -44,6 +44,7 @@ import org.wikipedia.talk.UserTalkPopupHelper import org.wikipedia.util.DateUtil import org.wikipedia.util.DeviceUtil import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.Resource import org.wikipedia.util.ResourceUtil import org.wikipedia.util.StringUtil import org.wikipedia.views.NotificationButtonView @@ -90,9 +91,9 @@ class WatchlistFragment : Fragment(), WatchlistItemView.Callback, MenuProvider { repeatOnLifecycle(Lifecycle.State.CREATED) { viewModel.uiState.collect { when (it) { - is WatchlistViewModel.UiState.Loading -> onLoading() - is WatchlistViewModel.UiState.Success -> onSuccess() - is WatchlistViewModel.UiState.Error -> onError(it.throwable) + is Resource.Loading -> onLoading() + is Resource.Success -> onSuccess() + is Resource.Error -> onError(it.throwable) } } } diff --git a/app/src/main/java/org/wikipedia/watchlist/WatchlistViewModel.kt b/app/src/main/java/org/wikipedia/watchlist/WatchlistViewModel.kt index c1e2653e6ce..ab1b89cfb95 100644 --- a/app/src/main/java/org/wikipedia/watchlist/WatchlistViewModel.kt +++ b/app/src/main/java/org/wikipedia/watchlist/WatchlistViewModel.kt @@ -13,12 +13,13 @@ import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.mwapi.MwQueryResult import org.wikipedia.settings.Prefs +import org.wikipedia.util.Resource import java.util.Calendar class WatchlistViewModel : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> - _uiState.value = UiState.Error(throwable) + _uiState.value = Resource.Error(throwable) } private var watchlistItems = mutableListOf() @@ -27,7 +28,7 @@ class WatchlistViewModel : ViewModel() { var finalList = mutableListOf() var displayLanguages = WikipediaApp.instance.languageState.appLanguageCodes.filterNot { Prefs.watchlistExcludedWikiCodes.contains(it) } - private val _uiState = MutableStateFlow(UiState()) + private val _uiState = MutableStateFlow(Resource()) val uiState = _uiState.asStateFlow() init { @@ -69,11 +70,11 @@ class WatchlistViewModel : ViewModel() { finalList.add(item) } - _uiState.value = UiState.Success() + _uiState.value = Resource.Success(Unit) } fun fetchWatchlist(searchBarPlaceholder: Boolean = true) { - _uiState.value = UiState.Loading() + _uiState.value = Resource.Loading() viewModelScope.launch(handler) { watchlistItems = mutableListOf() displayLanguages.map { language -> @@ -169,10 +170,4 @@ class WatchlistViewModel : ViewModel() { val types = WatchlistFilterTypes.TYPE_OF_CHANGES_GROUP.filter { includedTypesCodes.contains(it.id) }.map { it.value } return types.joinToString(separator = "|") } - - open class UiState { - class Loading : UiState() - class Success : UiState() - class Error(val throwable: Throwable) : UiState() - } } From 4a10ebe2cb9dfb65a981e7a56353aedfbf6a86da Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 29 Mar 2024 13:50:48 -0400 Subject: [PATCH 021/626] Fix expected behavior upon publishing Talk message from saved messages. (#4566) * Correct Back behavior. * Pass result through to calling activity upon success. --------- Co-authored-by: Cooltey Feng --- .../diff/ArticleEditDetailsFragment.kt | 31 +++++++++++-- .../org/wikipedia/talk/TalkReplyActivity.kt | 2 +- .../talk/template/TalkTemplatesFragment.kt | 46 +++---------------- 3 files changed, 35 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt index 3d27b70d1ee..2c619dd0c0a 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt @@ -12,6 +12,7 @@ import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageView +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.PopupMenu @@ -38,6 +39,7 @@ import org.wikipedia.commons.FilePageActivity import org.wikipedia.databinding.FragmentArticleEditDetailsBinding import org.wikipedia.dataclient.mwapi.MwQueryPage.Revision import org.wikipedia.dataclient.okhttp.HttpStatusException +import org.wikipedia.extensions.parcelableExtra import org.wikipedia.history.HistoryEntry import org.wikipedia.page.ExclusiveBottomSheetPresenter import org.wikipedia.page.Namespace @@ -48,6 +50,7 @@ import org.wikipedia.settings.Prefs import org.wikipedia.staticdata.UserAliasData import org.wikipedia.staticdata.UserTalkAliasData import org.wikipedia.suggestededits.SuggestedEditsCardsFragment +import org.wikipedia.talk.TalkReplyActivity import org.wikipedia.talk.TalkTopicsActivity import org.wikipedia.talk.UserTalkPopupHelper import org.wikipedia.talk.template.TalkTemplatesActivity @@ -83,9 +86,23 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M binding.overlayRevisionDetailsView.isVisible = -verticalOffset > bounds.top } - private fun sendPatrollerExperienceEvent(action: String, activeInterface: String, actionData: String = "") { - if (viewModel.fromRecentEdits) { - PatrollerExperienceEvent.logAction(action, activeInterface, actionData) + private val requestTalk = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { + val pageTitle = result.data?.parcelableExtra(Constants.ARG_TITLE) ?: viewModel.pageTitle + val message = if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS) { + PatrollerExperienceEvent.logAction("publish_message_toast", "pt_warning_messages") + R.string.talk_warn_submitted + } else { + PatrollerExperienceEvent.logAction("publish_message_saved_toast", "pt_warning_messages") + R.string.talk_warn_submitted_and_saved + } + FeedbackUtil.makeSnackbar(requireActivity(), getString(message)) + .setAction(R.string.patroller_tasks_patrol_edit_snackbar_view) { + if (isAdded) { + PatrollerExperienceEvent.logAction("publish_message_view_click", "pt_warning_messages") + startActivity(TalkTopicsActivity.newIntent(requireContext(), pageTitle, InvokeSource.DIFF_ACTIVITY)) + } + }.show() } } @@ -337,7 +354,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M sendPatrollerExperienceEvent("warn_init", "pt_toolbar") viewModel.revisionTo?.let { revision -> val pageTitle = PageTitle(UserTalkAliasData.valueFor(viewModel.pageTitle.wikiSite.languageCode), revision.user, viewModel.pageTitle.wikiSite) - requireActivity().startActivity(TalkTemplatesActivity.newIntent(requireContext(), pageTitle, fromRevisionId = viewModel.revisionFromId, toRevisionId = viewModel.revisionToId)) + requestTalk.launch(TalkTemplatesActivity.newIntent(requireContext(), pageTitle, fromRevisionId = viewModel.revisionFromId, toRevisionId = viewModel.revisionToId)) } } @@ -689,6 +706,12 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M FeedbackUtil.showMessage(this, R.string.address_copied) } + private fun sendPatrollerExperienceEvent(action: String, activeInterface: String, actionData: String = "") { + if (viewModel.fromRecentEdits) { + PatrollerExperienceEvent.logAction(action, activeInterface, actionData) + } + } + private fun callback(): Callback? { return FragmentUtil.getCallback(this, Callback::class.java) } diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index 9f2badf232f..d416ac31ad4 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -513,7 +513,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre sendPatrollerExperienceEvent("publish_exit_cancel", "pt_warning_messages") } .show() - } else if (viewModel.isFromDiff && messagePreviewFragment.isActive) { + } else if (messagePreviewFragment.isActive) { showProgressBar(true) binding.talkScrollContainer.isVisible = true messagePreviewFragment.hide() diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index ef80d5e1e1c..dda4f718b23 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -2,6 +2,7 @@ package org.wikipedia.talk.template import android.annotation.SuppressLint import android.app.Activity.RESULT_OK +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.Menu @@ -82,32 +83,15 @@ class TalkTemplatesFragment : Fragment() { private val requestNewTemplate = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> binding.talkTemplatesTabLayout.getTabAt(0)?.select() - if (result.resultCode == RESULT_OK || result.resultCode == RESULT_BACK_FROM_TOPIC) { viewModel.loadTalkTemplates() PatrollerExperienceEvent.logAction("save_message_toast", "pt_templates") if (result.resultCode != RESULT_BACK_FROM_TOPIC) { FeedbackUtil.showMessage(this, R.string.talk_templates_new_message_saved) } - } - if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { - val pageTitle = viewModel.pageTitle - val message = if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS) { - PatrollerExperienceEvent.logAction("publish_message_toast", "pt_warning_messages") - R.string.talk_warn_submitted - } else { - PatrollerExperienceEvent.logAction("publish_message_saved_toast", "pt_warning_messages") - R.string.talk_warn_submitted_and_saved - } - updateAndNotifyAdapter() - val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(message)) - snackbar.setAction(R.string.patroller_tasks_patrol_edit_snackbar_view) { - if (isAdded) { - PatrollerExperienceEvent.logAction("publish_message_view_click", "pt_warning_messages") - startActivity(TalkTopicsActivity.newIntent(requireContext(), pageTitle, Constants.InvokeSource.DIFF_ACTIVITY)) - } - } - snackbar.show() + } else if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { + requireActivity().setResult(result.resultCode, Intent().putExtra(Constants.ARG_TITLE, viewModel.pageTitle)) + requireActivity().finish() } } @@ -119,25 +103,9 @@ class TalkTemplatesFragment : Fragment() { if (result.resultCode != RESULT_BACK_FROM_TOPIC) { FeedbackUtil.showMessage(this, R.string.talk_templates_edit_message_updated) } - } - if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { - val pageTitle = viewModel.pageTitle - val message = if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS) { - PatrollerExperienceEvent.logAction("publish_message_toast", "pt_warning_messages") - R.string.talk_warn_submitted - } else { - PatrollerExperienceEvent.logAction("publish_message_saved_toast", "pt_warning_messages") - R.string.talk_warn_submitted_and_saved - } - updateAndNotifyAdapter() - val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(message)) - snackbar.setAction(R.string.patroller_tasks_patrol_edit_snackbar_view) { - if (isAdded) { - PatrollerExperienceEvent.logAction("publish_message_view_click", "pt_warning_messages") - startActivity(TalkTopicsActivity.newIntent(requireContext(), pageTitle, Constants.InvokeSource.DIFF_ACTIVITY)) - } - } - snackbar.show() + } else if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { + requireActivity().setResult(result.resultCode, Intent().putExtra(Constants.ARG_TITLE, viewModel.pageTitle)) + requireActivity().finish() } } From 29949be194d43f18487af7ba9e7eeb63f2d33e24 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 29 Mar 2024 14:02:55 -0400 Subject: [PATCH 022/626] Don't show option to "Update existing message" when not applicable. (#4564) * Don't show option to "Update existing message" when not applicable. * Remove unnecessary post. * More unnecessary post. --------- Co-authored-by: Cooltey Feng --- .../java/org/wikipedia/talk/TalkReplyActivity.kt | 14 +++++++------- .../talk/template/TalkTemplatesTextInputDialog.kt | 11 ++++++++--- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index d416ac31ad4..e9e9945189d 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -245,7 +245,9 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre binding.replyInputView.editText.requestFocus() DeviceUtil.showSoftKeyboard(binding.replyInputView.editText) binding.talkScrollContainer.postDelayed({ - binding.talkScrollContainer.smoothScrollTo(0, binding.talkScrollContainer.height * 4) + if (!isDestroyed) { + binding.talkScrollContainer.smoothScrollTo(0, binding.talkScrollContainer.height * 4) + } }, 500) } } @@ -307,7 +309,8 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre private fun showSaveDialog(subject: String, body: String) { TalkTemplatesTextInputDialog(this@TalkReplyActivity, R.string.talk_templates_new_message_dialog_save, - R.string.talk_warn_save_dialog_dont_save).let { textInputDialog -> + R.string.talk_warn_save_dialog_dont_save, + !viewModel.isExampleTemplate && viewModel.selectedTemplate != null).let { textInputDialog -> textInputDialog.callback = object : TalkTemplatesTextInputDialog.Callback { override fun onSuccess(subjectText: String) { @@ -346,10 +349,8 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre if (textInputDialog.isSaveExistingChecked) { return } - dialog.getView().postDelayed({ - dialog.setError(dialog.context.getString(R.string.talk_subject_duplicate)) - dialog.setPositiveButtonEnabled(false) - }, 250) + dialog.setError(dialog.context.getString(R.string.talk_subject_duplicate)) + dialog.setPositiveButtonEnabled(false) } else -> { @@ -520,7 +521,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre setSaveButtonEnabled(true) binding.replyNextButton.text = getString(R.string.edit_next) setToolbarTitle(viewModel.pageTitle) - binding.root.postDelayed({ showProgressBar(false) }, 250) } else { super.onBackPressed() } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt index a5d75c111b7..85109331971 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesTextInputDialog.kt @@ -5,14 +5,18 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.view.WindowManager import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.wikipedia.R import org.wikipedia.databinding.DialogTalkTemplatesTextInputBinding -class TalkTemplatesTextInputDialog(private val activity: Activity, - positiveButtonText: Int = R.string.text_input_dialog_ok_button_text, - negativeButtonText: Int = R.string.text_input_dialog_cancel_button_text) : MaterialAlertDialogBuilder(activity, R.style.AlertDialogTheme_Input) { +class TalkTemplatesTextInputDialog( + activity: Activity, + positiveButtonText: Int = R.string.text_input_dialog_ok_button_text, + negativeButtonText: Int = R.string.text_input_dialog_cancel_button_text, + isExisting: Boolean = false +) : MaterialAlertDialogBuilder(activity, R.style.AlertDialogTheme_Input) { interface Callback { fun onSuccess(subjectText: String) fun onCancel() @@ -42,6 +46,7 @@ class TalkTemplatesTextInputDialog(private val activity: Activity, binding.subjectInput.doOnTextChanged { text, _, _, _ -> callback?.onTextChanged(text.toString(), this) } + binding.dialogSaveExistingRadio.isVisible = isExisting binding.dialogSaveExistingRadio.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { callback?.onTextChanged(binding.subjectInput.text.toString(), this) From 5ddf3499a743327801fdaad26005894200cab256 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 29 Mar 2024 14:36:43 -0400 Subject: [PATCH 023/626] Add padding to bottom of TalkReply input fields. (#4563) Co-authored-by: Cooltey Feng --- .../main/java/org/wikipedia/talk/TalkReplyActivity.kt | 9 ++++----- app/src/main/res/layout/activity_talk_reply.xml | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index e9e9945189d..842a24d2722 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -446,11 +446,10 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } private fun getWikitextBody(): String { - var body = binding.replyInputView.editText.text.toString().trim() - body = body.replace(getString(R.string.username_wikitext), getString(R.string.wikiText_replace_url, viewModel.pageTitle.prefixedText, "@" + StringUtil.removeNamespace(viewModel.pageTitle.prefixedText))) - body = body.replace(getString(R.string.sender_username_wikitext), AccountUtil.userName.orEmpty()) - body = body.replace(getString(R.string.diff_link_wikitext), viewModel.pageTitle.getWebApiUrl("diff=${viewModel.toRevisionId}&oldid=${viewModel.fromRevisionId}&variant=${viewModel.pageTitle.wikiSite.languageCode}")) - return body + return binding.replyInputView.editText.text.toString().trim() + .replace(getString(R.string.username_wikitext), getString(R.string.wikiText_replace_url, viewModel.pageTitle.prefixedText, "@" + StringUtil.removeNamespace(viewModel.pageTitle.prefixedText))) + .replace(getString(R.string.sender_username_wikitext), AccountUtil.userName.orEmpty()) + .replace(getString(R.string.diff_link_wikitext), viewModel.pageTitle.getWebApiUrl("diff=${viewModel.toRevisionId}&oldid=${viewModel.fromRevisionId}&variant=${viewModel.pageTitle.wikiSite.languageCode}")) } private fun onSaveSuccess(newRevision: Long) { diff --git a/app/src/main/res/layout/activity_talk_reply.xml b/app/src/main/res/layout/activity_talk_reply.xml index 9ba0de9029d..a30cd2fff65 100644 --- a/app/src/main/res/layout/activity_talk_reply.xml +++ b/app/src/main/res/layout/activity_talk_reply.xml @@ -14,7 +14,8 @@ + android:orientation="vertical" + android:paddingBottom="64dp"> Date: Fri, 29 Mar 2024 16:36:33 -0400 Subject: [PATCH 024/626] Remove unnecessary extra spaces from messages (#4569) Co-authored-by: Cooltey Feng --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ae68193ca3c..d28c81034e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -148,7 +148,7 @@ Password Password Two-Factor Authentication Code - Two-factor authentication required! Please return to the main activity and log in with your 2FA token, then retry. + Two-factor authentication required! Please return to the main activity and log in with your 2FA token, then retry. Log in Log in Log in @@ -1557,7 +1557,7 @@ - example messages to get started.]]> + example messages to get started.]]> New message Subject Compose message From c5ad9da980f8c5df7827ace13d9b4b562063b918 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 29 Mar 2024 17:29:51 -0400 Subject: [PATCH 025/626] Underpinnings for payments API. (#4565) * Underpinnings for payments API. * Further underpinnings. * Remove last comma --------- Co-authored-by: cooltey Co-authored-by: Cooltey Feng --- .../java/org/wikipedia/dataclient/Service.kt | 30 ++++++++++++++ .../dataclient/donate/DonationConfig.kt | 14 +++++++ .../dataclient/donate/DonationConfigHelper.kt | 41 +++++++++++++++++++ .../donate/PaymentResponseContainer.kt | 41 +++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 app/src/main/java/org/wikipedia/dataclient/donate/DonationConfig.kt create mode 100644 app/src/main/java/org/wikipedia/dataclient/donate/DonationConfigHelper.kt create mode 100644 app/src/main/java/org/wikipedia/dataclient/donate/PaymentResponseContainer.kt diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index dc4fe26ffea..1ac6322ef19 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -6,6 +6,7 @@ import org.wikipedia.dataclient.discussiontools.DiscussionToolsEditResponse import org.wikipedia.dataclient.discussiontools.DiscussionToolsInfoResponse import org.wikipedia.dataclient.discussiontools.DiscussionToolsSubscribeResponse import org.wikipedia.dataclient.discussiontools.DiscussionToolsSubscriptionList +import org.wikipedia.dataclient.donate.PaymentResponseContainer import org.wikipedia.dataclient.mwapi.CreateAccountResponse import org.wikipedia.dataclient.mwapi.MwParseResponse import org.wikipedia.dataclient.mwapi.MwPostResponse @@ -237,6 +238,35 @@ interface Service { @Query("colimit") coLimit: Int, ): MwQueryResponse + @GET("api.php?format=json&action=getPaymentMethods") + suspend fun getPaymentMethods(@Query("country") country: String): PaymentResponseContainer + + @FormUrlEncoded + @POST("api.php?format=json&action=submitPayment") + suspend fun submitPayment( + @Field("amount") amount: String, + @Field("app_version") appVersion: String, + @Field("banner") banner: String, + @Field("city") city: String, + @Field("country") country: String, + @Field("currency") currency: String, + @Field("donor_country") donorCountry: String, + @Field("email") email: String, + @Field("first_name") firstName: String, + @Field("full_name") fullName: String, + @Field("language") language: String, + @Field("last_name") lastName: String, + @Field("recurring") recurring: String, + @Field("payment_token") paymentToken: String, + @Field("opt_in") optIn: String, + @Field("pay_the_fee") payTheFee: String, + @Field("payment_method") paymentMethod: String, + @Field("payment_network") paymentNetwork: String, + @Field("postal_code") postalCode: String, + @Field("state_province") stateProvince: String, + @Field("street_address") streetAddress: String + ): PaymentResponseContainer + // ------- CSRF, Login, and Create Account ------- @Headers("Cache-Control: no-cache") diff --git a/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfig.kt b/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfig.kt new file mode 100644 index 00000000000..4fe767442f9 --- /dev/null +++ b/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfig.kt @@ -0,0 +1,14 @@ +package org.wikipedia.dataclient.donate + +import kotlinx.serialization.Serializable + +@Suppress("unused") +@Serializable +class DonationConfig( + val version: Int, + val currencyMinimumDonation: Map = emptyMap(), + val currencyMaximumDonation: Map = emptyMap(), + val currencyAmountPresets: Map> = emptyMap(), + val currencyTransactionFees: Map = emptyMap(), + val countryCodeEmailOptInRequired: List = emptyList() +) diff --git a/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfigHelper.kt b/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfigHelper.kt new file mode 100644 index 00000000000..e73077283eb --- /dev/null +++ b/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfigHelper.kt @@ -0,0 +1,41 @@ +package org.wikipedia.dataclient.donate + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.decodeFromJsonElement +import okhttp3.Request +import org.wikipedia.dataclient.okhttp.OkHttpConnectionFactory +import org.wikipedia.json.JsonUtil + +object DonationConfigHelper { + + private const val CONFIG_VERSION = 1 + + private const val CONFIG_URL = "https://donate.wikimedia.org/wiki/MediaWiki:AppsDonationConfig.json?action=raw" + + suspend fun getConfig(): DonationConfig? { + val campaignList = mutableListOf() + + withContext(Dispatchers.IO) { + val url = CONFIG_URL + val request = Request.Builder().url(url).build() + val response = OkHttpConnectionFactory.client.newCall(request).execute() + val configs = JsonUtil.decodeFromString>(response.body?.string()).orEmpty() + + campaignList.addAll(configs.filter { + val proto = JsonUtil.json.decodeFromJsonElement(it) + proto.version == CONFIG_VERSION + }.map { + JsonUtil.json.decodeFromJsonElement(it) + }) + } + return campaignList.firstOrNull() + } + + @Serializable + class ConfigProto( + val version: Int = 0 + ) +} diff --git a/app/src/main/java/org/wikipedia/dataclient/donate/PaymentResponseContainer.kt b/app/src/main/java/org/wikipedia/dataclient/donate/PaymentResponseContainer.kt new file mode 100644 index 00000000000..1a12d9fbfa5 --- /dev/null +++ b/app/src/main/java/org/wikipedia/dataclient/donate/PaymentResponseContainer.kt @@ -0,0 +1,41 @@ +package org.wikipedia.dataclient.donate + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Suppress("unused") +@Serializable +class PaymentResponseContainer( + val response: PaymentResponse? +) + +@Suppress("unused") +@Serializable +class PaymentResponse( + val status: String = "", + @SerialName("error_message") val errorMessage: String = "", + @SerialName("order_id") val orderId: String = "", + @SerialName("gateway_transaction_id") val gatewayTransactionId: String = "", + + val paymentMethods: List = emptyList() +) + +@Suppress("unused") +@Serializable +class PaymentMethod( + val name: String = "", + val type: String = "", + val brands: List = emptyList(), + val configuration: PaymentMethodConfiguration? = null +) + +@Suppress("unused") +@Serializable +class PaymentMethodConfiguration( + val merchantId: String = "", + val merchantName: String = "", + val gatewayMerchantId: String = "", + val storeId: String = "", + val region: String = "", + val publicKeyId: String = "" +) From b400f1c847dc85868a1aba907d8177eea0303093 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 1 Apr 2024 05:22:05 -0700 Subject: [PATCH 026/626] Rename the APK file name for Samsung app store (#4570) --- scripts/make-release.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/make-release.py b/scripts/make-release.py index 526020c0f65..dc0cdb511a6 100755 --- a/scripts/make-release.py +++ b/scripts/make-release.py @@ -147,6 +147,7 @@ def copy_apk(flavor, version_name): output_file = '%s/wikipedia-%s.apk' % (folder_path, version_name) sh.cp(get_output_apk_file_name(flavor), output_file) print(' apk: %s' % output_file) + return output_file def copy_bundle(flavor, version_name): folder_path = 'releases' @@ -230,7 +231,7 @@ def main(): make_release(flavors, custom_channel) version_name = get_version_name_from_apk(get_output_apk_file_name(flavors[0])) print('Copying APK...') - copy_apk(flavors[0], version_name) + output_file = copy_apk(flavors[0], version_name) if args.bundle: print('Building bundle: ' + str(flavors)) @@ -238,6 +239,12 @@ def main(): print('Copying bundle...') copy_bundle(flavors[0], version_name) + """ + Remove the '.' to match the Samsung app store APK naming style. + """ + if custom_channel == 'samsung': + os.rename(output_file, output_file.replace('.apk', '').replace('.', '-') + '.apk') + print('Please test the APK. After that, run w/ --push flag, and release the tested APK.') print('A useful command for collecting the release notes:') print('git log --pretty=format:"%h | %cr | %s" --abbrev-commit --no-merges ' + From 264e7926eae94a0ace2c715f12fec18c10ba31a8 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 1 Apr 2024 12:23:26 -0400 Subject: [PATCH 027/626] Remove (for real) feature flag for account vanishing. (#4571) --- app/src/main/java/org/wikipedia/settings/LogoutPreference.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/org/wikipedia/settings/LogoutPreference.kt b/app/src/main/java/org/wikipedia/settings/LogoutPreference.kt index 0bb1e66c255..e87c0651a6f 100644 --- a/app/src/main/java/org/wikipedia/settings/LogoutPreference.kt +++ b/app/src/main/java/org/wikipedia/settings/LogoutPreference.kt @@ -6,7 +6,6 @@ import android.util.AttributeSet import android.view.View import android.widget.Button import android.widget.TextView -import androidx.core.view.isVisible import androidx.preference.Preference import androidx.preference.PreferenceViewHolder import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -14,7 +13,6 @@ import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.activity.SingleWebViewActivity import org.wikipedia.auth.AccountUtil -import org.wikipedia.util.ReleaseUtil import org.wikipedia.util.StringUtil @Suppress("unused") @@ -61,8 +59,5 @@ class LogoutPreference : Preference { }.show() } } - - // TODO: remove when ready - holder.itemView.findViewById(R.id.accountVanishButton).isVisible = ReleaseUtil.isPreProdRelease } } From 19fc6180c64f0c9e5a15e3b223b8a6cf92c7f9e4 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 1 Apr 2024 12:40:26 -0400 Subject: [PATCH 028/626] Bump versionCode. (#4572) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index eb2911ea4cb..8664a253030 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50480 + versionCode 50481 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From 0bdaa1e73a5d1d3f6fa0f96330766a389ebcabaa Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 2 Apr 2024 13:14:59 -0400 Subject: [PATCH 029/626] String resources for Temporary Accounts feature. (#4381) * String resources for Temporary Accounts feature. * More formatting. * Just a couple more. * Minor updates. --------- Co-authored-by: Sharvani Haran --- app/src/main/res/values-qq/strings.xml | 19 +++++++++++++++++++ app/src/main/res/values/strings.xml | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index fb3c83f805d..1b6769dbc5b 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -454,6 +454,25 @@ Label stating the expiry date of the block. The %s symbol is replaced by the date. Label stating the ID of the block. The %s symbol is replaced by the ID. Text that explains how to get in touch with the user or administrator that created the block. The %1$s symbol is replaced by the username of the blocker, and %2$s is replaced by a URL that leads to the user page of the blocker. + Title of dialog informing the user that a temporary account is being used. + Body text of dialog explaining that a temporary account is being used. Please preserve HTML formatting. The %1$s symbol is replaced with a URL. + Body text of dialog explaining that a temporary account is being used. Please preserve HTML formatting. The %1$s symbol is replaced with a URL. + Positive action button in Temporary Account info dialog. + Title of dialog informing the user that a temporary account is being used. + Action button for going directly to the Login screen. + + Message shown when a temporary account with a name of %1$s is created, and will expire in 1 day. + Message shown when a temporary account with a name of %1$s is created, and will expire in %2$d days. + + + Message shown when a temporary account will expire in 1 day. + Message shown when a temporary account will expire in %d days. + + Status message shown while editing anonymously, explaining that a temporary account will be created if an edit is made. Please preserve any HTML formatting. The %1$s symbol is replaced with a URL. + Status message shown while editing, explaining that a temporary account named %1$s is being used. Please preserve HTML formatting. The %2$s symbol is replaced with a URL. + Status message shown while editing, explaining that a temporary account named %1$s is being used. Please preserve HTML formatting. + Button label for discarding the current temporary account. + Confirmation message for logging out of a temporary account. Tooltip message text for customizing menu options on article screen Text that explains how to get in touch with an administrator that created the block. Title of the retry screen displayed when the app crashes. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d28c81034e9..9507b916767 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -432,6 +432,26 @@ Customize your toolbar administrator to discuss the block.]]> + You are not logged in + temporary account will be created for you to protect your privacy. Learn more.

Log in or Create an account to get credit for future edits and to access other features.]]>
+
If you log in or create an account, your edits will be attributed to a name you choose, among other benefits.]]>
+ Got it + You are using a temporary account + Discard changes and log in + + Temporary account %1$s was created after your edit was published. It will expire in %2$d day. + Temporary account %1$s was created after your edit was published. It will expire in %2$d days. + + + Account will expire in %d day. + Account will expire in %d days. + + You are not logged in. Once you make an edit, a temporary account will be created for you to protect your privacy. Learn more]]> + You are using a temporary account. Your edit will be attributed to %1$s. Learn more.]]> + You are currently using a temporary account. Edits made with the temporary account %1$s will not be carried over to your permanent account when you log in. Log in or create an account to get credit to your username, among other benefits.]]> + End session + This will log you out of your temporary account. Do you want to continue? + Application error We\'re sorry, the Wikipedia app has experienced an error and was terminated.\n\nWould you like to start over or quit? From 850d8a99dfb9e3ec99f9d877295bf7d0f4d4dbdf Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 2 Apr 2024 14:01:00 -0400 Subject: [PATCH 030/626] Fix potential crash when finding text in editor. (#4575) * Fix potential crash when finding text in editor. * Improve a bit further. --------- Co-authored-by: Cooltey Feng --- .../wikipedia/edit/FindInEditorActionProvider.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/wikipedia/edit/FindInEditorActionProvider.kt b/app/src/main/java/org/wikipedia/edit/FindInEditorActionProvider.kt index e3d81417de3..a3838cc4bc3 100644 --- a/app/src/main/java/org/wikipedia/edit/FindInEditorActionProvider.kt +++ b/app/src/main/java/org/wikipedia/edit/FindInEditorActionProvider.kt @@ -63,8 +63,8 @@ class FindInEditorActionProvider(private val scrollView: View, currentResultIndex = 0 resultPositions.clear() - searchQuery?.let { - resultPositions += it.toRegex(StringUtil.SEARCH_REGEX_OPTIONS).findAll(textView.text) + searchQuery?.let { query -> + resultPositions += query.toRegex(StringUtil.SEARCH_REGEX_OPTIONS).findAll(textView.text) .map { it.range.first } } scrollToCurrentResult() @@ -72,11 +72,15 @@ class FindInEditorActionProvider(private val scrollView: View, private fun scrollToCurrentResult() { setMatchesResults(currentResultIndex, resultPositions.size) - val textPosition = resultPositions.getOrElse(currentResultIndex) { 0 } - textView.setSelection(textPosition, textPosition + searchQuery.orEmpty().length) + var highlightLength = searchQuery.orEmpty().length + val textPosition = resultPositions.getOrElse(currentResultIndex) { + highlightLength = 0 + 0 + } + textView.setSelection(textPosition, textPosition + highlightLength) val r = Rect() textView.getFocusedRect(r) scrollView.scrollTo(0, r.top - DimenUtil.roundedDpToPx(32f)) - syntaxHighlighter.setSearchQueryInfo(resultPositions, searchQuery.orEmpty().length, currentResultIndex) + syntaxHighlighter.setSearchQueryInfo(resultPositions, highlightLength, currentResultIndex) } } From e05f14069e55719bd6cf16a8b5b1e8f7c823829d Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 2 Apr 2024 15:59:40 -0400 Subject: [PATCH 031/626] Remove redundant attribute from custom CardView. (#4573) Co-authored-by: Cooltey Feng --- app/src/main/java/org/wikipedia/views/WikiCardView.kt | 11 ++++------- app/src/main/res/layout/activity_insert_media.xml | 2 +- app/src/main/res/layout/dialog_campaign.xml | 2 +- app/src/main/res/layout/fragment_places.xml | 2 +- .../main/res/layout/view_edit_history_search_bar.xml | 2 +- .../main/res/layout/view_notification_search_bar.xml | 2 +- app/src/main/res/layout/view_search_bar.xml | 2 +- .../view_suggested_edits_recent_edits_search_bar.xml | 2 +- app/src/main/res/layout/view_talk_topics_header.xml | 2 +- app/src/main/res/layout/view_watchlist_search_bar.xml | 2 +- app/src/main/res/values/attrs.xml | 1 - 11 files changed, 13 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/wikipedia/views/WikiCardView.kt b/app/src/main/java/org/wikipedia/views/WikiCardView.kt index 7c335d1032c..02a1d754880 100644 --- a/app/src/main/java/org/wikipedia/views/WikiCardView.kt +++ b/app/src/main/java/org/wikipedia/views/WikiCardView.kt @@ -15,24 +15,21 @@ open class WikiCardView(context: Context, attrs: AttributeSet? = null) : Materia init { if (!isInEditMode) { - val (hasBorder, cardRadius, elevation) = context + val (hasBorder, elevation) = context .obtainStyledAttributes(attrs, R.styleable.WikiCardView) .use { - Triple( + Pair( it.getBoolean(R.styleable.WikiCardView_hasBorder, true), - it.getDimension(R.styleable.WikiCardView_radius, - context.resources.getDimension(R.dimen.wiki_card_radius)), it.getDimension(R.styleable.WikiCardView_elevation, DimenUtil.dpToPx(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) 8f else 2f)) ) } - setup(cardRadius, elevation, hasBorder) + setup(elevation, hasBorder) } } - private fun setup(cardRadius: Float, elevation: Float, hasBorder: Boolean) { - radius = cardRadius + private fun setup(elevation: Float, hasBorder: Boolean) { if (hasBorder) { setDefaultBorder() } diff --git a/app/src/main/res/layout/activity_insert_media.xml b/app/src/main/res/layout/activity_insert_media.xml index 79aa7d3f3b9..14446c0404c 100644 --- a/app/src/main/res/layout/activity_insert_media.xml +++ b/app/src/main/res/layout/activity_insert_media.xml @@ -99,7 +99,7 @@ android:focusable="true" android:transitionName="@string/transition_search_bar" app:elevation="0dp" - app:radius="22dp"> + app:cardCornerRadius="22dp"> + app:cardCornerRadius="22dp"> + app:cardCornerRadius="22dp"> + app:cardCornerRadius="22dp"> + app:cardCornerRadius="22dp"> + app:cardCornerRadius="22dp"> + app:cardCornerRadius="22dp"> + app:cardCornerRadius="22dp"> - From 7ea8bd5d17fb3ad5c682a4e5f2002f71cb58e61f Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 2 Apr 2024 16:07:55 -0400 Subject: [PATCH 032/626] Eliminate unnecessary and redundant SiteInfoClient. (#4576) Co-authored-by: Cooltey Feng --- .../main/java/org/wikipedia/WikipediaApp.kt | 6 +-- .../org/wikipedia/activity/BaseActivity.kt | 3 +- .../feed/featured/FeaturedArticleCardView.kt | 4 +- .../feed/mainpage/MainPageCardView.kt | 4 +- .../wikipedia/language/LangLinksViewModel.kt | 6 +-- .../java/org/wikipedia/main/MainFragment.kt | 5 +- .../java/org/wikipedia/page/PageActivity.kt | 4 +- .../main/java/org/wikipedia/page/PageTitle.kt | 6 +-- .../readinglist/AddToReadingListDialog.kt | 5 +- .../readinglist/ReadingListFragment.kt | 5 +- .../org/wikipedia/settings/SiteInfoClient.kt | 47 ------------------- 11 files changed, 21 insertions(+), 74 deletions(-) delete mode 100644 app/src/main/java/org/wikipedia/settings/SiteInfoClient.kt diff --git a/app/src/main/java/org/wikipedia/WikipediaApp.kt b/app/src/main/java/org/wikipedia/WikipediaApp.kt index e93648ef268..5e78a6cb1db 100644 --- a/app/src/main/java/org/wikipedia/WikipediaApp.kt +++ b/app/src/main/java/org/wikipedia/WikipediaApp.kt @@ -33,7 +33,6 @@ import org.wikipedia.notifications.NotificationPollBroadcastReceiver import org.wikipedia.page.tabs.Tab import org.wikipedia.push.WikipediaFirebaseMessagingService import org.wikipedia.settings.Prefs -import org.wikipedia.settings.SiteInfoClient import org.wikipedia.theme.Theme import org.wikipedia.util.DimenUtil import org.wikipedia.util.ReleaseUtil @@ -114,10 +113,7 @@ class WikipediaApp : Application() { // TODO: why don't we ensure that the app language hasn't changed here instead of the client? if (defaultWikiSite == null) { val lang = if (Prefs.mediaWikiBaseUriSupportsLangCode) appOrSystemLanguageCode else "" - val newWiki = WikiSite.forLanguageCode(lang) - // Kick off a task to retrieve the site info for the current wiki - SiteInfoClient.updateFor(newWiki) - defaultWikiSite = newWiki + defaultWikiSite = WikiSite.forLanguageCode(lang) } return defaultWikiSite!! } diff --git a/app/src/main/java/org/wikipedia/activity/BaseActivity.kt b/app/src/main/java/org/wikipedia/activity/BaseActivity.kt index 013dfe5c227..8ff190ff962 100644 --- a/app/src/main/java/org/wikipedia/activity/BaseActivity.kt +++ b/app/src/main/java/org/wikipedia/activity/BaseActivity.kt @@ -35,7 +35,6 @@ import org.wikipedia.readinglist.sync.ReadingListSyncEvent import org.wikipedia.recurring.RecurringTasksExecutor import org.wikipedia.richtext.CustomHtmlParser import org.wikipedia.settings.Prefs -import org.wikipedia.settings.SiteInfoClient import org.wikipedia.theme.Theme import org.wikipedia.util.DeviceUtil import org.wikipedia.util.FeedbackUtil @@ -232,7 +231,7 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba override fun accept(event: Any) { if (event is SplitLargeListsEvent) { MaterialAlertDialogBuilder(this@BaseActivity) - .setMessage(getString(R.string.split_reading_list_message, SiteInfoClient.maxPagesPerReadingList)) + .setMessage(getString(R.string.split_reading_list_message, Constants.MAX_READING_LIST_ARTICLE_LIMIT)) .setPositiveButton(R.string.reading_list_split_dialog_ok_button_text, null) .show() } else if (event is ReadingListsNoLongerSyncedEvent) { diff --git a/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.kt b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.kt index c4e1d9c1326..d4cf7d15b9c 100644 --- a/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.kt +++ b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.kt @@ -11,7 +11,7 @@ import org.wikipedia.history.HistoryEntry import org.wikipedia.page.PageTitle import org.wikipedia.readinglist.LongPressMenu import org.wikipedia.readinglist.database.ReadingListPage -import org.wikipedia.settings.SiteInfoClient +import org.wikipedia.staticdata.MainPageNameData import org.wikipedia.views.ImageZoomHelper @Suppress("LeakingThis") @@ -111,7 +111,7 @@ open class FeaturedArticleCardView(context: Context) : DefaultFeedCardView(context) { @@ -38,7 +38,7 @@ class MainPageCardView(context: Context) : DefaultFeedCardView(con private fun goToMainPage() { card?.let { - callback?.onSelectPage(it, HistoryEntry(PageTitle(getMainPageForLang(it.wikiSite().languageCode), it.wikiSite()), + callback?.onSelectPage(it, HistoryEntry(PageTitle(MainPageNameData.valueFor(it.wikiSite().languageCode), it.wikiSite()), HistoryEntry.SOURCE_FEED_MAIN_PAGE), false) } } diff --git a/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt b/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt index b44ac6fbf1a..fe55cc2b9af 100644 --- a/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt +++ b/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt @@ -13,7 +13,7 @@ import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.mwapi.SiteMatrix import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle -import org.wikipedia.settings.SiteInfoClient +import org.wikipedia.staticdata.MainPageNameData import org.wikipedia.util.Resource import org.wikipedia.util.SingleLiveData import org.wikipedia.util.StringUtil @@ -84,7 +84,7 @@ class LangLinksViewModel(bundle: Bundle) : ViewModel() { // remove the language code and replace it with its variants it.remove() for (variant in languageVariants) { - it.add(PageTitle(if (pageTitle.isMainPage) SiteInfoClient.getMainPageForLang(variant) else link.prefixedText, + it.add(PageTitle(if (pageTitle.isMainPage) MainPageNameData.valueFor(variant) else link.prefixedText, WikiSite.forLanguageCode(variant))) } } @@ -130,7 +130,7 @@ class LangLinksViewModel(bundle: Bundle) : ViewModel() { if (languageVariants != null) { for (languageCode in languageVariants) { if (!title.wikiSite.languageCode.contains(languageCode)) { - val pageTitle = PageTitle(if (title.isMainPage) SiteInfoClient.getMainPageForLang(languageCode) else title.displayText, WikiSite.forLanguageCode(languageCode)) + val pageTitle = PageTitle(if (title.isMainPage) MainPageNameData.valueFor(languageCode) else title.displayText, WikiSite.forLanguageCode(languageCode)) pageTitle.text = StringUtil.removeNamespace(title.prefixedText) languageEntries.add(pageTitle) } diff --git a/app/src/main/java/org/wikipedia/main/MainFragment.kt b/app/src/main/java/org/wikipedia/main/MainFragment.kt index dfb9273b729..390ee790b0b 100644 --- a/app/src/main/java/org/wikipedia/main/MainFragment.kt +++ b/app/src/main/java/org/wikipedia/main/MainFragment.kt @@ -70,7 +70,7 @@ import org.wikipedia.search.SearchActivity import org.wikipedia.search.SearchFragment import org.wikipedia.settings.Prefs import org.wikipedia.settings.SettingsActivity -import org.wikipedia.settings.SiteInfoClient.getMainPageForLang +import org.wikipedia.staticdata.MainPageNameData import org.wikipedia.staticdata.UserAliasData import org.wikipedia.staticdata.UserTalkAliasData import org.wikipedia.suggestededits.SuggestedEditsTasksFragment @@ -202,7 +202,8 @@ class MainFragment : Fragment(), BackPressedHandler, MenuProvider, FeedFragment. return } if (resultCode == TabActivity.RESULT_NEW_TAB) { - val entry = HistoryEntry(PageTitle(getMainPageForLang(WikipediaApp.instance.appOrSystemLanguageCode), + val entry = HistoryEntry(PageTitle( + MainPageNameData.valueFor(WikipediaApp.instance.appOrSystemLanguageCode), WikipediaApp.instance.wikiSite), HistoryEntry.SOURCE_MAIN_PAGE) startActivity(PageActivity.newIntentForNewTab(requireContext(), entry, entry.title)) } else if (resultCode == TabActivity.RESULT_LOAD_FROM_BACKSTACK) { diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.kt b/app/src/main/java/org/wikipedia/page/PageActivity.kt index 6d8fad987a2..4e5404c0659 100644 --- a/app/src/main/java/org/wikipedia/page/PageActivity.kt +++ b/app/src/main/java/org/wikipedia/page/PageActivity.kt @@ -58,7 +58,7 @@ import org.wikipedia.page.tabs.TabActivity import org.wikipedia.readinglist.ReadingListActivity import org.wikipedia.search.SearchActivity import org.wikipedia.settings.Prefs -import org.wikipedia.settings.SiteInfoClient +import org.wikipedia.staticdata.MainPageNameData import org.wikipedia.staticdata.UserTalkAliasData import org.wikipedia.suggestededits.PageSummaryForEdit import org.wikipedia.suggestededits.SuggestedEditsImageTagEditActivity @@ -589,7 +589,7 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo } private fun loadMainPage(position: TabPosition) { - val title = PageTitle(SiteInfoClient.getMainPageForLang(app.appOrSystemLanguageCode), app.wikiSite) + val title = PageTitle(MainPageNameData.valueFor(app.appOrSystemLanguageCode), app.wikiSite) val historyEntry = HistoryEntry(title, HistoryEntry.SOURCE_MAIN_PAGE) loadPage(title, historyEntry, position) } diff --git a/app/src/main/java/org/wikipedia/page/PageTitle.kt b/app/src/main/java/org/wikipedia/page/PageTitle.kt index a86f335f573..d97b891b584 100644 --- a/app/src/main/java/org/wikipedia/page/PageTitle.kt +++ b/app/src/main/java/org/wikipedia/page/PageTitle.kt @@ -7,8 +7,8 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.wikipedia.dataclient.WikiSite import org.wikipedia.language.LanguageUtil -import org.wikipedia.settings.SiteInfoClient import org.wikipedia.staticdata.ContributionsNameData +import org.wikipedia.staticdata.MainPageNameData import org.wikipedia.util.StringUtil import org.wikipedia.util.UriUtil import java.util.* @@ -72,7 +72,7 @@ data class PageTitle( val isMainPage: Boolean get() { - val mainPageTitle = SiteInfoClient.getMainPageForLang(wikiSite.languageCode) + val mainPageTitle = MainPageNameData.valueFor(wikiSite.languageCode) return mainPageTitle == displayText } @@ -131,7 +131,7 @@ data class PageTitle( constructor(title: String?, wiki: WikiSite, thumbUrl: String? = null) : this(null, wiki, title.orEmpty(), null, thumbUrl, null, null, null) { // FIXME: Does not handle mainspace articles with a colon in the title well at all - var text = title.orEmpty().ifEmpty { SiteInfoClient.getMainPageForLang(wiki.languageCode) } + var text = title.orEmpty().ifEmpty { MainPageNameData.valueFor(wiki.languageCode) } // Split off any fragment (#...) from the title var parts = text.split("#".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() diff --git a/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.kt b/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.kt index dc3d4e751fc..7d064fec246 100644 --- a/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.kt +++ b/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.kt @@ -27,7 +27,6 @@ import org.wikipedia.page.PageTitle import org.wikipedia.readinglist.ReadingListTitleDialog.readingListTitleDialog import org.wikipedia.readinglist.database.ReadingList import org.wikipedia.settings.Prefs -import org.wikipedia.settings.SiteInfoClient import org.wikipedia.util.DimenUtil.getDimension import org.wikipedia.util.DimenUtil.roundedDpToPx import org.wikipedia.util.FeedbackUtil.makeSnackbar @@ -123,8 +122,8 @@ open class AddToReadingListDialog : ExtendedBottomSheetDialogFragment() { } private fun addAndDismiss(readingList: ReadingList, titles: List?) { - if (readingList.pages.size + titles!!.size > SiteInfoClient.maxPagesPerReadingList) { - val message = getString(R.string.reading_list_article_limit_message, readingList.title, SiteInfoClient.maxPagesPerReadingList) + if (readingList.pages.size + titles!!.size > Constants.MAX_READING_LIST_ARTICLE_LIMIT) { + val message = getString(R.string.reading_list_article_limit_message, readingList.title, Constants.MAX_READING_LIST_ARTICLE_LIMIT) makeSnackbar(requireActivity(), message).show() dismiss() return diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt index eb53efd046d..818ae126578 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt @@ -51,7 +51,6 @@ import org.wikipedia.readinglist.database.ReadingListPage import org.wikipedia.readinglist.sync.ReadingListSyncEvent import org.wikipedia.settings.Prefs import org.wikipedia.settings.RemoteConfig -import org.wikipedia.settings.SiteInfoClient.maxPagesPerReadingList import org.wikipedia.util.* import org.wikipedia.util.log.L import org.wikipedia.views.* @@ -288,8 +287,8 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial if (!toolbarExpanded) { binding.readingListToolbarContainer.title = it.title } - if (!articleLimitMessageShown && it.pages.size >= maxPagesPerReadingList) { - val message = getString(R.string.reading_list_article_limit_message, readingList.title, maxPagesPerReadingList) + if (!articleLimitMessageShown && it.pages.size >= Constants.MAX_READING_LIST_ARTICLE_LIMIT) { + val message = getString(R.string.reading_list_article_limit_message, readingList.title, Constants.MAX_READING_LIST_ARTICLE_LIMIT) FeedbackUtil.makeSnackbar(requireActivity(), message).show() articleLimitMessageShown = true } diff --git a/app/src/main/java/org/wikipedia/settings/SiteInfoClient.kt b/app/src/main/java/org/wikipedia/settings/SiteInfoClient.kt deleted file mode 100644 index c99ba7225ef..00000000000 --- a/app/src/main/java/org/wikipedia/settings/SiteInfoClient.kt +++ /dev/null @@ -1,47 +0,0 @@ -package org.wikipedia.settings - -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.schedulers.Schedulers -import org.wikipedia.Constants -import org.wikipedia.WikipediaApp -import org.wikipedia.dataclient.ServiceFactory -import org.wikipedia.dataclient.WikiSite -import org.wikipedia.staticdata.MainPageNameData -import org.wikipedia.util.log.L - -object SiteInfoClient { - private val SITE_INFO_MAP = mutableMapOf() - - fun getMainPageForLang(lang: String): String { - getSiteInfoForLang(lang)?.let { - if (!it.mainpage.isNullOrEmpty()) { - return it.mainpage - } - } - return MainPageNameData.valueFor(lang) - } - - val maxPagesPerReadingList: Int - get() { - val info = getSiteInfoForLang(WikipediaApp.instance.wikiSite.languageCode) - return if (info?.readingListsConfig != null && info.readingListsConfig.maxEntriesPerList > 0) { - info.readingListsConfig.maxEntriesPerList - } else Constants.MAX_READING_LIST_ARTICLE_LIMIT - } - - private fun getSiteInfoForLang(lang: String): SiteInfo? { - return if (SITE_INFO_MAP.containsKey(lang)) { - SITE_INFO_MAP[lang] - } else null - } - - fun updateFor(wiki: WikiSite) { - if (SITE_INFO_MAP.containsKey(wiki.languageCode)) { - return - } - ServiceFactory.get(wiki).siteInfo - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ response -> SITE_INFO_MAP[wiki.languageCode] = response.query?.siteInfo }) { caught -> L.d(caught) } - } -} From 2416e25dccb967b5b99b98bdcfc173163a098186 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 2 Apr 2024 16:19:25 -0400 Subject: [PATCH 033/626] Greatly simplify retrieval and usage of UserIDs. (#4574) Co-authored-by: Cooltey Feng --- .../main/java/org/wikipedia/WikipediaApp.kt | 28 +------------------ .../eventplatform/EditAttemptStepEvent.kt | 9 ++++-- .../java/org/wikipedia/auth/AccountUtil.kt | 22 --------------- .../SharedPreferenceCookieManager.kt | 14 ++++++++-- app/src/main/res/values/preference_keys.xml | 1 - .../main/res/xml/developer_preferences.xml | 5 ---- 6 files changed, 20 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/org/wikipedia/WikipediaApp.kt b/app/src/main/java/org/wikipedia/WikipediaApp.kt index 5e78a6cb1db..2b9c455fca4 100644 --- a/app/src/main/java/org/wikipedia/WikipediaApp.kt +++ b/app/src/main/java/org/wikipedia/WikipediaApp.kt @@ -10,7 +10,6 @@ import android.speech.RecognizerIntent import android.view.Window import android.webkit.WebView import androidx.appcompat.app.AppCompatDelegate -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.internal.functions.Functions import io.reactivex.rxjava3.plugins.RxJavaPlugins import io.reactivex.rxjava3.schedulers.Schedulers @@ -78,13 +77,7 @@ class WikipediaApp : Application() { } val appOrSystemLanguageCode: String - get() { - val code = languageState.appLanguageCode - if (AccountUtil.getUserIdForLanguage(code) == 0) { - getUserIdForLanguage(code) - } - return code - } + get() = languageState.appLanguageCode val versionCode: Int get() { @@ -278,25 +271,6 @@ class WikipediaApp : Application() { return result } - @SuppressLint("CheckResult") - private fun getUserIdForLanguage(code: String) { - if (!AccountUtil.isLoggedIn || AccountUtil.userName.isNullOrEmpty()) { - return - } - val wikiSite = WikiSite.forLanguageCode(code) - ServiceFactory.get(wikiSite).userInfo - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - if (AccountUtil.isLoggedIn && it.query!!.userInfo != null) { - // noinspection ConstantConditions - val id = it.query!!.userInfo!!.id - AccountUtil.putUserIdForLanguage(code, id) - L.d("Found user ID $id for $code") - } - }) { L.e("Failed to get user ID for $code", it) } - } - private fun initTabs() { if (Prefs.hasTabs) { tabList.addAll(Prefs.tabs) diff --git a/app/src/main/java/org/wikipedia/analytics/eventplatform/EditAttemptStepEvent.kt b/app/src/main/java/org/wikipedia/analytics/eventplatform/EditAttemptStepEvent.kt index 5c9310dde05..eccfedbc0ee 100644 --- a/app/src/main/java/org/wikipedia/analytics/eventplatform/EditAttemptStepEvent.kt +++ b/app/src/main/java/org/wikipedia/analytics/eventplatform/EditAttemptStepEvent.kt @@ -5,6 +5,8 @@ import kotlinx.serialization.Serializable import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil +import org.wikipedia.dataclient.SharedPreferenceCookieManager +import org.wikipedia.dataclient.WikiSite import org.wikipedia.page.PageTitle @Suppress("unused") @@ -42,10 +44,13 @@ class EditAttemptStepEvent(private val event: EditAttemptStepInteractionEvent) : private fun submitEditAttemptEvent(action: String, editorInterface: String, pageTitle: PageTitle) { EventPlatformClient.submit(EditAttemptStepEvent(EditAttemptStepInteractionEvent(action, WikipediaApp.instance.appInstallID, "", editorInterface, - INTEGRATION_ID, "", WikipediaApp.instance.getString(R.string.device_type).lowercase(), 0, - if (AccountUtil.isLoggedIn) AccountUtil.getUserIdForLanguage(pageTitle.wikiSite.languageCode) else 0, + INTEGRATION_ID, "", WikipediaApp.instance.getString(R.string.device_type).lowercase(), 0, getUserIdForWikiSite(pageTitle.wikiSite), 1, pageTitle.prefixedText, pageTitle.namespace().code()))) } + + private fun getUserIdForWikiSite(wikiSite: WikiSite): Int { + return if (AccountUtil.isLoggedIn) SharedPreferenceCookieManager.instance.getCookieByName("UserID", wikiSite.authority(), false)?.toIntOrNull() ?: 0 else 0 + } } } diff --git a/app/src/main/java/org/wikipedia/auth/AccountUtil.kt b/app/src/main/java/org/wikipedia/auth/AccountUtil.kt index c6d23c7cd8d..ae5f5dce8ac 100644 --- a/app/src/main/java/org/wikipedia/auth/AccountUtil.kt +++ b/app/src/main/java/org/wikipedia/auth/AccountUtil.kt @@ -25,7 +25,6 @@ object AccountUtil { return } setPassword(result.password) - putUserIdForLanguage(result.site.languageCode, result.userId) groups = result.groups } @@ -44,14 +43,6 @@ object AccountUtil { return if (account == null) null else accountManager().getPassword(account) } - fun getUserIdForLanguage(code: String): Int { - return userIds.getOrElse(code) { 0 } - } - - fun putUserIdForLanguage(code: String, id: Int) { - userIds += code to id - } - var groups: Set get() { val account = account() ?: return emptySet() @@ -114,19 +105,6 @@ object AccountUtil { } } - private var userIds: Map - get() { - val account = account() ?: return emptyMap() - val mapStr = accountManager().getUserData(account, WikipediaApp.instance.getString(R.string.preference_key_login_user_id_map)) - return if (mapStr.isNullOrEmpty()) emptyMap() else (JsonUtil.decodeFromString(mapStr) ?: emptyMap()) - } - private set(ids) { - val account = account() ?: return - accountManager().setUserData(account, - WikipediaApp.instance.getString(R.string.preference_key_login_user_id_map), - JsonUtil.encodeToString(ids)) - } - private fun accountManager(): AccountManager { return AccountManager.get(WikipediaApp.instance) } diff --git a/app/src/main/java/org/wikipedia/dataclient/SharedPreferenceCookieManager.kt b/app/src/main/java/org/wikipedia/dataclient/SharedPreferenceCookieManager.kt index 3a4829da7cf..e75ea6c0ebf 100644 --- a/app/src/main/java/org/wikipedia/dataclient/SharedPreferenceCookieManager.kt +++ b/app/src/main/java/org/wikipedia/dataclient/SharedPreferenceCookieManager.kt @@ -25,8 +25,18 @@ class SharedPreferenceCookieManager( @Synchronized fun getCookieByName(name: String): String? { for (domainSpec in cookieJar.keys) { - for (cookie in cookieJar[domainSpec]!!) { - if (cookie.name == name) { + getCookieByName(name, domainSpec)?.let { + return it + } + } + return null + } + + @Synchronized + fun getCookieByName(name: String, domainSpec: String, matchExactName: Boolean = true): String? { + cookieJar[domainSpec]?.let { cookies -> + for (cookie in cookies) { + if (if (matchExactName) cookie.name == name else cookie.name.contains(name, ignoreCase = false)) { return cookie.value } } diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index a689a3c838f..ff2cceace5a 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -27,7 +27,6 @@ retrofitLog dailyEventTask talkOfflineCleanupTask - userIDMap groups showDeveloperSettings %s-lastrun diff --git a/app/src/main/res/xml/developer_preferences.xml b/app/src/main/res/xml/developer_preferences.xml index 2610e03d1dc..8fd47969af0 100644 --- a/app/src/main/res/xml/developer_preferences.xml +++ b/app/src/main/res/xml/developer_preferences.xml @@ -121,11 +121,6 @@ android:key="@string/preference_key_reading_app_install_id" android:title="@string/preference_key_reading_app_install_id" /> - - Date: Tue, 2 Apr 2024 19:10:45 -0400 Subject: [PATCH 034/626] Improve positioning of Snackbars in Diff screen. (#4577) * Improve positioning of Snackbars in Diff screen. * Use coordinatorlayout for pushing FAB up when showing snackbar. --- .../diff/ArticleEditDetailsFragment.kt | 106 +++++++++--------- .../talk/template/TalkTemplatesFragment.kt | 2 +- .../res/layout/fragment_talk_templates.xml | 9 +- 3 files changed, 63 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt index 2c619dd0c0a..d8715fe55f4 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt @@ -102,7 +102,9 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M PatrollerExperienceEvent.logAction("publish_message_view_click", "pt_warning_messages") startActivity(TalkTopicsActivity.newIntent(requireContext(), pageTitle, InvokeSource.DIFF_ACTIVITY)) } - }.show() + } + .setAnchorView(binding.navTabContainer) + .show() } } @@ -553,52 +555,54 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M updateWatchButton(false) if (!viewModel.isWatched) { sendPatrollerExperienceEvent("unwatch_success_toast", "pt_watchlist") - val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.watchlist_page_removed_from_watchlist_snackbar, viewModel.pageTitle.displayText)) - snackbar.addCallback(object : Snackbar.Callback() { - override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { - if (!isAdded) { - return + FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.watchlist_page_removed_from_watchlist_snackbar, viewModel.pageTitle.displayText)) + .addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded) { + return + } + showFeedbackOptionsDialog() } - showFeedbackOptionsDialog() - } - }) - snackbar.show() + }) + .setAnchorView(binding.navTabContainer) + .show() } else if (viewModel.isWatched) { sendPatrollerExperienceEvent("watch_success_toast", "pt_watchlist") - val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), + FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.watchlist_page_add_to_watchlist_snackbar, viewModel.pageTitle.displayText, getString(WatchlistExpiry.NEVER.stringId))) - snackbar.setAction(R.string.watchlist_page_add_to_watchlist_snackbar_action) { - ExclusiveBottomSheetPresenter.show(childFragmentManager, WatchlistExpiryDialog.newInstance(viewModel.pageTitle, WatchlistExpiry.NEVER)) - } - snackbar.addCallback(object : Snackbar.Callback() { - override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { - if (!isAdded) { - return - } - showFeedbackOptionsDialog() + .setAction(R.string.watchlist_page_add_to_watchlist_snackbar_action) { + ExclusiveBottomSheetPresenter.show(childFragmentManager, WatchlistExpiryDialog.newInstance(viewModel.pageTitle, WatchlistExpiry.NEVER)) } - }) - snackbar.show() + .addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded) { + return + } + showFeedbackOptionsDialog() + } + }) + .setAnchorView(binding.navTabContainer) + .show() } } private fun showThankSnackbar() { - val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.thank_success_message, - viewModel.revisionTo?.user)) binding.thankIcon.setImageResource(R.drawable.ic_heart_24) binding.thankButton.isEnabled = false - snackbar.addCallback(object : Snackbar.Callback() { - override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { - if (!isAdded) { - return + FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.thank_success_message, viewModel.revisionTo?.user)) + .addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded) { + return + } + showFeedbackOptionsDialog() } - showFeedbackOptionsDialog() - } - }) + }) + .setAnchorView(binding.navTabContainer) + .show() sendPatrollerExperienceEvent("thank_success", "pt_thank") - snackbar.show() } private fun showThankDialog() { @@ -631,16 +635,17 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M } private fun showUndoSnackbar() { - val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.patroller_tasks_patrol_edit_undo_success)) - snackbar.addCallback(object : Snackbar.Callback() { - override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { - if (!isAdded) { - return + FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.patroller_tasks_patrol_edit_undo_success)) + .addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded) { + return + } + showFeedbackOptionsDialog() } - showFeedbackOptionsDialog() - } - }) - snackbar.show() + }) + .setAnchorView(binding.navTabContainer) + .show() } private fun showRollbackDialog() { @@ -661,16 +666,17 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M } private fun showRollbackSnackbar() { - val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.patroller_tasks_patrol_edit_rollback_success)) - snackbar.addCallback(object : Snackbar.Callback() { - override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { - if (!isAdded) { - return + FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.patroller_tasks_patrol_edit_rollback_success)) + .addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded) { + return + } + showFeedbackOptionsDialog() } - showFeedbackOptionsDialog() - } - }) - snackbar.show() + }) + .setAnchorView(binding.navTabContainer) + .show() } private fun showFeedbackOptionsDialog(skipPreference: Boolean = false) { diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index dda4f718b23..b1866fd1d15 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -253,7 +253,7 @@ class TalkTemplatesFragment : Fragment() { PatrollerExperienceEvent.logAction("message_deleted_toast", "pt_templates") PatrollerExperienceEvent.logAction("delete_message_success", "pt_warning_messages") val messageStr = resources.getQuantityString(R.plurals.talk_templates_message_deleted, size) - FeedbackUtil.makeSnackbar(requireActivity(), messageStr) + FeedbackUtil.makeSnackbar(binding.coordinatorView, messageStr) .setAction(R.string.reading_list_item_delete_undo) { viewModel.saveTemplates(deletedItems) } diff --git a/app/src/main/res/layout/fragment_talk_templates.xml b/app/src/main/res/layout/fragment_talk_templates.xml index 7e00213e093..cb9c11ad096 100644 --- a/app/src/main/res/layout/fragment_talk_templates.xml +++ b/app/src/main/res/layout/fragment_talk_templates.xml @@ -1,6 +1,7 @@ - @@ -94,7 +96,8 @@ android:layout_gravity="center_vertical" android:gravity="center" android:orientation="vertical" - android:visibility="gone"> + android:visibility="gone" + tools:visibility="visible"> - + From d066a839eca7788e12f087c505f4007d8345221c Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 3 Apr 2024 13:40:39 -0400 Subject: [PATCH 035/626] Improve Back navigation when previewing New talk message. (#4578) * Improve Back navigation when previewing New talk message. * Correctly set text without tripping TextWatcher. --- .../org/wikipedia/talk/TalkReplyActivity.kt | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index 842a24d2722..d5b7abe4ce2 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -56,6 +56,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre val viewModel: TalkReplyViewModel by viewModels { TalkReplyViewModel.Factory(intent.extras!!) } private var userMentionScrolled = false + private var shouldWatchText = true private var subjectOrBodyModified = false private var savedSuccess = false @@ -114,6 +115,9 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre linkHandler.wikiSite = viewModel.pageTitle.wikiSite textWatcher = binding.replySubjectText.doOnTextChanged { text, _, _, _ -> + if (!shouldWatchText) { + return@doOnTextChanged + } subjectOrBodyModified = true binding.replySubjectLayout.error = null binding.replyInputView.textInputLayout.error = null @@ -177,8 +181,10 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre viewModel.selectedTemplate?.let { binding.root.post { + shouldWatchText = false binding.replySubjectText.setText(it.subject) binding.replyInputView.editText.setText(it.message) + shouldWatchText = true } } @@ -221,11 +227,13 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } binding.progressBar.isVisible = false + shouldWatchText = false binding.replySubjectText.setText(intent.getCharSequenceExtra(EXTRA_SUBJECT)) if (intent.hasExtra(EXTRA_BODY) && binding.replyInputView.editText.text.isEmpty()) { binding.replyInputView.editText.setText(intent.getCharSequenceExtra(EXTRA_BODY)) binding.replyInputView.editText.setSelection(binding.replyInputView.editText.text.toString().length) } + shouldWatchText = true EditAttemptStepEvent.logInit(viewModel.pageTitle) if (viewModel.isNewTopic || viewModel.isFromDiff) { @@ -499,8 +507,14 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre override fun onBackPressed() { setResult(RESULT_BACK_FROM_TOPIC) sendPatrollerExperienceEvent("publish_back", "pt_warning_messages") - if (viewModel.isNewTopic && (!binding.replySubjectText.text.isNullOrEmpty() || - binding.replyInputView.editText.text.isNotEmpty())) { + if (messagePreviewFragment.isActive) { + showProgressBar(false) + binding.talkScrollContainer.isVisible = true + messagePreviewFragment.hide() + setSaveButtonEnabled(true) + binding.replyNextButton.text = getString(R.string.edit_next) + setToolbarTitle(viewModel.pageTitle) + } else if (subjectOrBodyModified) { MaterialAlertDialogBuilder(this) .setCancelable(false) .setTitle(R.string.talk_new_topic_exit_dialog_title) @@ -513,13 +527,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre sendPatrollerExperienceEvent("publish_exit_cancel", "pt_warning_messages") } .show() - } else if (messagePreviewFragment.isActive) { - showProgressBar(true) - binding.talkScrollContainer.isVisible = true - messagePreviewFragment.hide() - setSaveButtonEnabled(true) - binding.replyNextButton.text = getString(R.string.edit_next) - setToolbarTitle(viewModel.pageTitle) } else { super.onBackPressed() } From e83f2d97617b5a1089b5de45542dbaa601d90551 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 3 Apr 2024 16:00:26 -0400 Subject: [PATCH 036/626] Fix language-updating scripts, and update languages. (#4581) * Fix language updating scripts, and update languages. * Further improve scripts. * Sort by language. --- .../staticdata/ContributionsNameData.kt | 11 +- .../org/wikipedia/staticdata/FileAliasData.kt | 7 +- .../wikipedia/staticdata/MainPageNameData.kt | 9 +- .../wikipedia/staticdata/SpecialAliasData.kt | 7 +- .../org/wikipedia/staticdata/TalkAliasData.kt | 7 +- .../org/wikipedia/staticdata/UserAliasData.kt | 7 +- .../wikipedia/staticdata/UserTalkAliasData.kt | 7 +- app/src/main/res/values/languages_list.xml | 1958 ++++++++--------- scripts/generate_wiki_languages.py | 7 +- scripts/make-templates.py | 18 +- 10 files changed, 1041 insertions(+), 997 deletions(-) diff --git a/app/src/main/java/org/wikipedia/staticdata/ContributionsNameData.kt b/app/src/main/java/org/wikipedia/staticdata/ContributionsNameData.kt index ceb42d483eb..f0304dbfebd 100644 --- a/app/src/main/java/org/wikipedia/staticdata/ContributionsNameData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/ContributionsNameData.kt @@ -34,15 +34,16 @@ object ContributionsNameData { "avk" to "Webekseem", "awa" to "योगदान", "ay" to "Contribuciones", - "az" to "Fəaliyyətlər", + "az" to "Töhfələr", "azb" to "مشارکت‌ها", "ba" to "Өлөштәр", "ban" to "Kontribusi_pengguna", "bar" to "Beiträge", "bat-smg" to "Indėlis", + "bbc" to "Contributions", "bcl" to "Contributions", "be" to "Contributions", - "be-x-old" to "Унёсак", + "be-tarask" to "Унёсак", "bg" to "Приноси", "bh" to "योगदान", "bi" to "Contributions", @@ -76,6 +77,7 @@ object ContributionsNameData { "da" to "Bidrag", "dag" to "Contributions", "de" to "Beiträge", + "dga" to "Contributions", "din" to "Contributions", "diq" to "İştıraki", "dsb" to "Pśinoski", @@ -98,6 +100,7 @@ object ContributionsNameData { "fiu-vro" to "Kaastöö", "fj" to "Contributions", "fo" to "Brúkaraíkast", + "fon" to "Contributions", "fr" to "Contributions", "frp" to "Contribucions", "frr" to "Beiträge", @@ -244,7 +247,7 @@ object ContributionsNameData { "pt" to "Contribuições", "pwn" to "使用者貢獻", "qu" to "Rurasqakuna", - "rm" to "Contributions", + "rm" to "Beiträge", "rmy" to "Contribuții", "rn" to "Contributions", "ro" to "Contribuții", @@ -295,6 +298,7 @@ object ContributionsNameData { "ti" to "Contributions", "tk" to "Contributions", "tl" to "Mga_ambag", + "tly" to "Contributions", "tn" to "Contributions", "to" to "Contributions", "tpi" to "Ol_senis_bilong_yusa", @@ -328,6 +332,7 @@ object ContributionsNameData { "yo" to "ÀwọnÀfikún", "za" to "用户贡献", "zea" to "Bijdragen", + "zgh" to "Contributions", "zh" to "用户贡献", "zh-hans" to "用户贡献", "zh-hant" to "用户贡献", diff --git a/app/src/main/java/org/wikipedia/staticdata/FileAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/FileAliasData.kt index 49f0b774506..497ed6c4dd5 100644 --- a/app/src/main/java/org/wikipedia/staticdata/FileAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/FileAliasData.kt @@ -40,9 +40,10 @@ object FileAliasData { "ban" to "Berkas", "bar" to "Datei", "bat-smg" to "Abruozdielis", + "bbc" to "Ugasan", "bcl" to "Ladawan", "be" to "Файл", - "be-x-old" to "Файл", + "be-tarask" to "Файл", "bg" to "Файл", "bh" to "चित्र", "bi" to "File", @@ -76,6 +77,7 @@ object FileAliasData { "da" to "Fil", "dag" to "Lahabali kɔligu", "de" to "Datei", + "dga" to "Duoro kɔre", "din" to "Apamduööt", "diq" to "Dosya", "dsb" to "Dataja", @@ -98,6 +100,7 @@ object FileAliasData { "fiu-vro" to "Pilt", "fj" to "File", "fo" to "Mynd", + "fon" to "Wékpo", "fr" to "Fichier", "frp" to "Fichiér", "frr" to "Datei", @@ -295,6 +298,7 @@ object FileAliasData { "ti" to "ፋይል", "tk" to "Faýl", "tl" to "Talaksan", + "tly" to "Fajl", "tn" to "Setshwantsho", "to" to "File", "tpi" to "Fail", @@ -328,6 +332,7 @@ object FileAliasData { "yo" to "Fáìlì", "za" to "文件", "zea" to "Plaetje", + "zgh" to "ⴰⴼⴰⵢⵍⵓ", "zh" to "File", "zh-hans" to "File", "zh-hant" to "File", diff --git a/app/src/main/java/org/wikipedia/staticdata/MainPageNameData.kt b/app/src/main/java/org/wikipedia/staticdata/MainPageNameData.kt index 8cb8225e647..11560615ec9 100644 --- a/app/src/main/java/org/wikipedia/staticdata/MainPageNameData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/MainPageNameData.kt @@ -40,9 +40,10 @@ object MainPageNameData { "ban" to "Kaca Utama", "bar" to "Wikipedia:Hoamseitn", "bat-smg" to "Pėrms poslapis", + "bbc" to "Pogu ni Alaman", "bcl" to "Panginot na Pahina", "be" to "Галоўная старонка", - "be-x-old" to "Галоўная старонка", + "be-tarask" to "Галоўная старонка", "bg" to "Начална страница", "bh" to "मुख्य पन्ना", "bi" to "Nambawan Pej", @@ -76,6 +77,7 @@ object MainPageNameData { "da" to "Forside", "dag" to "Solɔɣu", "de" to "Wikipedia:Hauptseite", + "dga" to "A Gampɛlɛ zu", "din" to "Apam këdït", "diq" to "Pela Seri", "dsb" to "Głowny bok", @@ -98,6 +100,7 @@ object MainPageNameData { "fiu-vro" to "Wikipedia:Pääleht", "fj" to "Tabana levu", "fo" to "Forsíða", + "fon" to "Wémá Nukɔntɔn", "fr" to "Wikipédia:Accueil principal", "frp" to "Vouiquipèdia:Reçua principâla", "frr" to "Wikipedia:Hoodsid", @@ -110,7 +113,7 @@ object MainPageNameData { "gd" to "Prìomh-Dhuilleag", "gl" to "Portada", "glk" to "گتˇ ولگ", - "gn" to "Ape", + "gn" to "Kuatia Ñepyrũha", "gom" to "मुखेल पान", "gor" to "Halaman Bungaliyo", "got" to "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃", @@ -295,6 +298,7 @@ object MainPageNameData { "ti" to "መበገሲ ገጽ", "tk" to "Baş Sahypa", "tl" to "Unang Pahina", + "tly" to "Sarloha", "tn" to "Main Page", "to" to "Peesi tali fiefia", "tpi" to "Fran pes", @@ -328,6 +332,7 @@ object MainPageNameData { "yo" to "Ojúewé Àkọ́kọ́", "za" to "Yiebdaeuz", "zea" to "Vòblad", + "zgh" to "ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵏⵓⴱⴳ", "zh" to "Wikipedia:首页", "zh-hans" to "Wikipedia:首页", "zh-hant" to "Wikipedia:首页", diff --git a/app/src/main/java/org/wikipedia/staticdata/SpecialAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/SpecialAliasData.kt index b3f84022b2b..faa88cd47f6 100644 --- a/app/src/main/java/org/wikipedia/staticdata/SpecialAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/SpecialAliasData.kt @@ -40,9 +40,10 @@ object SpecialAliasData { "ban" to "Kusus", "bar" to "Spezial", "bat-smg" to "Specēlos", + "bbc" to "Marhasurungan", "bcl" to "Espesyal", "be" to "Адмысловае", - "be-x-old" to "Спэцыяльныя", + "be-tarask" to "Спэцыяльныя", "bg" to "Специални", "bh" to "विशेष", "bi" to "Special", @@ -76,6 +77,7 @@ object SpecialAliasData { "da" to "Speciel", "dag" to "Diŋ'gahim", "de" to "Spezial", + "dga" to "Be o yoŋ", "din" to "Këcëweek", "diq" to "Bağse", "dsb" to "Specialne", @@ -98,6 +100,7 @@ object SpecialAliasData { "fiu-vro" to "Tallituslehekülg", "fj" to "Special", "fo" to "Serstakt", + "fon" to "Ɖéɖovo", "fr" to "Spécial", "frp" to "Spèciâl", "frr" to "Spezial", @@ -295,6 +298,7 @@ object SpecialAliasData { "ti" to "ፍሉይ", "tk" to "Ýörite", "tl" to "Natatangi", + "tly" to "Xususi", "tn" to "Faphegileng", "to" to "Special", "tpi" to "Sipesol", @@ -328,6 +332,7 @@ object SpecialAliasData { "yo" to "Pàtàkì", "za" to "特殊", "zea" to "Speciaol", + "zgh" to "ⴰⵎⵥⵍⵉ", "zh" to "Special", "zh-hans" to "Special", "zh-hant" to "Special", diff --git a/app/src/main/java/org/wikipedia/staticdata/TalkAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/TalkAliasData.kt index 1e9f2466a80..620bafde1a4 100644 --- a/app/src/main/java/org/wikipedia/staticdata/TalkAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/TalkAliasData.kt @@ -40,9 +40,10 @@ object TalkAliasData { "ban" to "Pabligbagan", "bar" to "Dischkrian", "bat-smg" to "Aptarėms", + "bbc" to "Panghataion", "bcl" to "Olay", "be" to "Размовы", - "be-x-old" to "Абмеркаваньне", + "be-tarask" to "Абмеркаваньне", "bg" to "Беседа", "bh" to "वार्तालाप", "bi" to "Talk", @@ -76,6 +77,7 @@ object TalkAliasData { "da" to "Diskussion", "dag" to "Yɛltɔɣa", "de" to "Diskussion", + "dga" to "Yeli", "din" to "Jam", "diq" to "Vaten", "dsb" to "Diskusija", @@ -98,6 +100,7 @@ object TalkAliasData { "fiu-vro" to "Arotus", "fj" to "Talk", "fo" to "Kjak", + "fon" to "Xoɖɔtɛn", "fr" to "Discussion", "frp" to "Discussion", "frr" to "Diskussion", @@ -295,6 +298,7 @@ object TalkAliasData { "ti" to "ምይይጥ", "tk" to "Çekişme", "tl" to "Usapan", + "tly" to "Nopegət", "tn" to "Puisano", "to" to "Talk", "tpi" to "Toktok", @@ -328,6 +332,7 @@ object TalkAliasData { "yo" to "Ọ̀rọ̀", "za" to "讨论", "zea" to "Overleg", + "zgh" to "ⴰⵎⵙⴳⴷⴰⵍ", "zh" to "Talk", "zh-hans" to "Talk", "zh-hant" to "Talk", diff --git a/app/src/main/java/org/wikipedia/staticdata/UserAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/UserAliasData.kt index 7242c97f217..a4dc084b2f2 100644 --- a/app/src/main/java/org/wikipedia/staticdata/UserAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/UserAliasData.kt @@ -40,9 +40,10 @@ object UserAliasData { "ban" to "Sang Anganggé", "bar" to "Nutza", "bat-smg" to "Nauduotuos", + "bbc" to "Sipanghasea", "bcl" to "Paragamit", "be" to "Удзельнік", - "be-x-old" to "Удзельнік", + "be-tarask" to "Удзельнік", "bg" to "Потребител", "bh" to "प्रयोगकर्ता", "bi" to "User", @@ -76,6 +77,7 @@ object UserAliasData { "da" to "Bruger", "dag" to "Ŋun su", "de" to "Benutzer", + "dga" to "Toma daana", "din" to "Dulooi", "diq" to "Karber", "dsb" to "Wužywaŕ", @@ -98,6 +100,7 @@ object UserAliasData { "fiu-vro" to "Pruukja", "fj" to "User", "fo" to "Brúkari", + "fon" to "Wikizantɔ", "fr" to "Utilisateur", "frp" to "Utilisator", "frr" to "Benutzer", @@ -295,6 +298,7 @@ object UserAliasData { "ti" to "ተጠቃሚ", "tk" to "Ulanyjy", "tl" to "Tagagamit", + "tly" to "Okoədə", "tn" to "Modirisi", "to" to "User", "tpi" to "Yusa", @@ -328,6 +332,7 @@ object UserAliasData { "yo" to "Oníṣe", "za" to "用户", "zea" to "Gebruker", + "zgh" to "ⴰⵏⵙⵙⵎⵔⵙ", "zh" to "User", "zh-hans" to "User", "zh-hant" to "User", diff --git a/app/src/main/java/org/wikipedia/staticdata/UserTalkAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/UserTalkAliasData.kt index 38d82d30393..652467ad8c4 100644 --- a/app/src/main/java/org/wikipedia/staticdata/UserTalkAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/UserTalkAliasData.kt @@ -40,9 +40,10 @@ object UserTalkAliasData { "ban" to "Pabligbagan Sang Anganggé", "bar" to "Nutza Dischkrian", "bat-smg" to "Nauduotuojė aptarėms", + "bbc" to "Panghataion ni Sipanghasea", "bcl" to "Olay kan paragamit", "be" to "Размовы з удзельнікам", - "be-x-old" to "Гутаркі ўдзельніка", + "be-tarask" to "Гутаркі ўдзельніка", "bg" to "Потребител беседа", "bh" to "प्रयोगकर्ता वार्ता", "bi" to "User talk", @@ -76,6 +77,7 @@ object UserTalkAliasData { "da" to "Brugerdiskussion", "dag" to "Ŋun su yɛltɔɣa", "de" to "Benutzer Diskussion", + "dga" to "Toma daana yeli", "din" to "Jam kekë dulooi", "diq" to "Karber vaten", "dsb" to "Diskusija wužywarja", @@ -98,6 +100,7 @@ object UserTalkAliasData { "fiu-vro" to "Pruukja arotus", "fj" to "User talk", "fo" to "Brúkarakjak", + "fon" to "Xoɖɔtɛn wikizantɔ lɛ tɔn", "fr" to "Discussion utilisateur", "frp" to "Discussion utilisator", "frr" to "Benutzer Diskussion", @@ -295,6 +298,7 @@ object UserTalkAliasData { "ti" to "ምይይጥ ተጠቃሚ", "tk" to "Ulanyjy çekişme", "tl" to "Usapang tagagamit", + "tly" to "Okoədəj nopegət", "tn" to "Puisano ya modirisi", "to" to "User talk", "tpi" to "Toktok bilong yusa", @@ -328,6 +332,7 @@ object UserTalkAliasData { "yo" to "Ọ̀rọ̀ oníṣe", "za" to "用户讨论", "zea" to "Overleg gebruker", + "zgh" to "ⴰⵎⵙⴳⴷⴰⵍ ⵏ ⵓⵏⵙⵙⵎⵔⵙ", "zh" to "User talk", "zh-hans" to "User talk", "zh-hant" to "User talk", diff --git a/app/src/main/res/values/languages_list.xml b/app/src/main/res/values/languages_list.xml index be82237aa87..34a4f9bc959 100644 --- a/app/src/main/res/values/languages_list.xml +++ b/app/src/main/res/values/languages_list.xml @@ -3,10 +3,9 @@ en es - ja - de - fr ru + de + ja zh-cn zh-hans zh-hant @@ -15,347 +14,348 @@ zh-my zh-sg zh-tw - it + fr pt + it ar - fa id - pl tr - nl + fa + pl ko - hi + nl vi + hi uk th - sv - cs simple + cs + sv + ro hu + el he - ro fi - el - nb - ms bn sr-ec sr-el sr - da + nb + ms hr + da bg ta ca - arz sk + kk mr sh-cyrl sh-latn sh + uz-cyrl + uz-latn + uz + arz az + tl te lt - zh-yue ml bs - sl - uz-cyrl - uz-latn - uz + zh-yue ka + sl + sq + hy ur et - hy - kk-arab - kk-cn - kk-cyrl - kk-kz - kk-latn - kk-tr - kk - sq - kn - eu lv - eo - tl - af - gl + kn mk - nn + af + ky sw - ceb - ast - be - my + km gu - la + mn + gl + my si - zh-min-nan + eu + nn + be + ast + wuu-hans + wuu-hant + wuu cy - be-x-old - war + ne is - azb - km bh - sco - oc + eo + as + tg-latn + tg ckb - mn - br - an + sco + ceb + pa + la + ha + jv + azb + bcl + mzn + be-tarask + am als + so tt - as - ky - wuu-hans - wuu-hant - wuu - pa - lmo - ne - fy + an + map-bms + tk + su pnb - vec - nds-nl lb - ga - bcl - ilo - io - jv - tg-latn - tg - ce - scn - diq - fiu-vro - mg - ha + br + zh-min-nan bar - nds + ce + fy ku-arab ku-latn ku - so - mzn - xmf + oc + ig + zh-classical + or ba - nso - cv - frr - ia + war + gor + lmo + ga + li + xmf + gan-hans + gan-hant + gan + nds-nl + mai + ps + bpy ary - am - qu - map-bms - su - hif - tk - lij + nds + io + mi + rue + ia + min + anp + vec + mg + cv + ts + scn yi - sah ht - gd - bat-smg - fo - eml - li - avk - hsb - min - ps - crh-cyrl - crh-latn - crh - yo - szl + sah + hif ban-bali ban-x-dharma ban-x-palmleaf ban-x-pku ban - pms - lld - or - nah - vls - rue - nap - vo - pam - cdo + frr + ilo gn - ig - hak + sa + fo + diq + rw + new + hyw sn - mai - zh-classical - smn - kw - ang - bpy - vep + pam + yo + mt + eml + qu sd - stq - nrm + om + bo + lij + szl + crh-cyrl + crh-latn + crh + vls + ang + dty os + se + lo sc + kw + hsb + zu + gd + cdo + lld wa - new - fur - frp - bo - gan-hans - gan-hant - gan - sa - gv - mhr - roa-tara - kab - zea - co - se - lfn - gor - ext - gag - ie - zu - csb - pap - olo + hak + nap ace + pms + awa + ie bjn - tpi - hyw - rw - pag - shn - dsb - mt - cbk-zam - lo - roa-rup + bat-smg + vo + fiu-vro + co + gag + kab + tcy + vep + smn kaa + pcd + mhr + glk + frp + roa-tara + ext ug - za + pap + chr + gv + gom + gpe + pdc + avk + udm + lfn + tet + ln + lez ksh - lad - kv - nov - mdf - pcd - mi + bi + nso + dsb + av + nv myv + csb + lad + shn + zea + fur + bxr + stq gcr - arc - jam krc + sat + xh + kv + bbc + mdf + olo + pfl + nrm mwl - bxr - nv - udm - ln - om - av + haw + dv + inh + ny ay - tum - tcy - lez - pdc - kbp + to + pag + nah rm - jbo - tet - sat - mrj - xal - srn - pih - bug - inh - fj - dty - dv - dag - gom - anp - haw - pfl - wo - xh - glk - ts - sm - bi + lg + tum + tyv + tly-cyrl + tly + cbk-zam + ike-cans + ike-latn + iu + za + ik + tpi tw + dag ks - kg - awa + jam + fj + mrj + roa-rup mni - chr + arc + ki + nov + jbo + koi + bug + skr + pih cu + wo + pnt + kbp + sm + chy + xal tn - rmy - szy - tyv - pi - lg - ami + zgh + ltg shi-latn shi-tfng shi - ty - koi - ny - ltg + mnw + alt bm + mad kbd - ki + kg + ss + ve + lbe ff - ee - to got - trv - mad - chy - lbe + srn + ady st - ss - ike-cans - ike-latn - iu + rmy + szy + ee blk - kcg - atj - mnw - ik - ady - skr - pnt - alt - ch - kl + pi + cr dz ti + ch rn + atj + ty nia - din - tay + ami + kl nqo + kcg sg - ve + trv + tay guc + din + pcm guw - cr pwn - pcm - gpe + fon gur + dga fat test ab @@ -363,10 +363,9 @@ en es - ja - de - fr ru + de + ja zh-Hans-CN zh-Hans zh-Hant @@ -375,347 +374,348 @@ zh-Hans-MY zh-Hans-SG zh-Hant-TW - it + fr pt + it ar - fa id - pl tr - nl + fa + pl ko - hi + nl vi + hi uk th - sv - cs en-simple + cs + sv + ro hu + el he - ro fi - el - nb - ms bn sr-Cyrl sr-Latn sr - da + nb + ms hr + da bg ta ca - arz sk + kk mr sh-Cyrl sh-Latn sh + uz-Cyrl + uz-Latn + uz + arz az + tl te lt - yue ml bs - sl - uz-Cyrl - uz-Latn - uz + yue ka + sl + sq + hy ur et - hy - kk-Arab - kk-Arab-CN - kk-Cyrl - kk-KZ - kk-Latn - kk-Latn-TR - kk - sq - kn - eu lv - eo - tl - af - gl + kn mk - nn + af + ky sw - ceb - ast - be - my + km gu - la + mn + gl + my si - nan + eu + nn + be + ast + wuu-Hans + wuu-Hant + wuu cy - be-tarask - war + ne is - azb - km bh - sco - oc + eo + as + tg-Latn + tg ckb - mn - br - an + sco + ceb + pa + la + ha + jv + azb + bcl + mzn + be-tarask + am gsw + so tt - as - ky - wuu-Hans - wuu-Hant - wuu - pa - lmo - ne - fy + an + jv-x-bms + tk + su pnb - vec - nds-NL lb - ga - bcl - ilo - io - jv - tg-Latn - tg - ce - scn - diq - vro - mg - ha + br + nan bar - nds + ce + fy ku-Arab ku-Latn ku - so - mzn - xmf + oc + ig + lzh + or ba - nso - cv - frr - ia + war + gor + lmo + ga + li + xmf + gan-Hans + gan-Hant + gan + nds-NL + mai + ps + bpy ary - am - qu - jv-x-bms - su - hif - tk - lij + nds + io + mi + rue + ia + min + anp + vec + mg + cv + ts + scn yi - sah ht - gd - sgs - fo - egl - li - avk - hsb - min - ps - crh-Cyrl - crh-Latn - crh - yo - szl + sah + hif ban-Bali ban-x-dharma ban-x-palmleaf ban-x-pku ban - pms - lld - or - nah - vls - rue - nap - vo - pam - cdo + frr + ilo gn - ig - hak + sa + fo + diq + rw + new + hyw sn - mai - lzh - smn - kw - ang - bpy - vep + pam + yo + mt + egl + qu sd - stq - nrf + om + bo + lij + szl + crh-Cyrl + crh-Latn + crh + vls + ang + dty os + se + lo sc + kw + hsb + zu + gd + cdo + lld wa - new - fur - frp - bo - gan-Hans - gan-Hant - gan - sa - gv + hak + nap + ace + pms + awa + ie + bjn + sgs + vo + vro + co + gag + kab + tcy + vep + smn + kaa + pcd mhr + glk + frp nap-x-tara - kab - zea - co - se - lfn - gor ext - gag - ie - zu - csb + ug pap - olo - ace - bjn - tpi - hyw - rw - pag - shn - dsb - mt - cbk - lo - rup - kaa - ug - za + chr + gv + gom + gpe + pdc + avk + udm + lfn + tet + ln + lez ksh - lad - kv - nov - mdf - pcd - mi + bi + nso + dsb + av + nv myv + csb + lad + shn + zea + fur + bxr + stq gcr - arc - jam krc + sat + xh + kv + bbc + mdf + olo + pfl + nrf mwl - bxr - nv - udm - ln - om - av + haw + dv + inh + ny ay - tum - tcy - lez - pdc - kbp + to + pag + nah rm - jbo - tet - sat - mrj - xal - srn - pih - bug - inh - fj - dty - dv - dag - gom - anp - haw - pfl - wo - xh - glk - ts - sm - bi + lg + tum + tyv + tly-Cyrl + tly + cbk + ike-Cans + ike-Latn + iu + za + ik + tpi tw + dag ks - kg - awa + jam + fj + mrj + rup mni - chr + arc + ki + nov + jbo + koi + bug + skr + pih cu + wo + pnt + kbp + sm + chy + xal tn - rmy - szy - tyv - pi - lg - ami + zgh + ltg shi-Latn shi-Tfng shi - ty - koi - ny - ltg + mnw + alt bm + mad kbd - ki + kg + ss + ve + lbe ff - ee - to got - trv - mad - chy - lbe + srn + ady st - ss - ike-Cans - ike-Latn - iu + rmy + szy + ee blk - kcg - atj - mnw - ik - ady - skr - pnt - alt - ch - kl + pi + cr dz ti + ch rn + atj + ty nia - din - tay + ami + kl nqo + kcg sg - ve + trv + tay guc + din + pcm guw - cr pwn - pcm - gpe + fon gur + dga fat test ab @@ -723,10 +723,9 @@ English español - 日本語 - Deutsch - français русский + Deutsch + 日本語 中文(中国大陆) 中文(简体) 中文(繁體) @@ -735,347 +734,348 @@ 中文(马来西亚) 中文(新加坡) 中文(臺灣) - italiano + français português + italiano العربية - فارسی Bahasa Indonesia - polski Türkçe - Nederlands + فارسی + polski 한국어 - हिन्दी + Nederlands Tiếng Việt + हिन्दी українська ไทย - svenska - čeština Simple English + čeština + svenska + română magyar + Ελληνικά עברית - română suomi - Ελληνικά - norsk bokmål - Bahasa Melayu বাংলা српски (ћирилица) srpski (latinica) српски / srpski - dansk + norsk bokmål + Bahasa Melayu hrvatski + dansk български தமிழ் català - مصرى slovenčina + қазақша मराठी српскохрватски (ћирилица) srpskohrvatski (latinica) srpskohrvatski / српскохрватски + ўзбекча + oʻzbekcha + oʻzbekcha / ўзбекча + مصرى azərbaycanca + Tagalog తెలుగు lietuvių - 粵語 മലയാളം bosanski - slovenščina - ўзбекча - oʻzbekcha - oʻzbekcha / ўзбекча + 粵語 ქართული + slovenščina + shqip + հայերեն اردو eesti - հայերեն - قازاقشا (تٴوتە) - قازاقشا (جۇنگو) - қазақша (кирил) - қазақша (Қазақстан) - qazaqşa (latın) - qazaqşa (Türkïya) - қазақша - shqip - ಕನ್ನಡ - euskara latviešu - Esperanto - Tagalog - Afrikaans - galego + ಕನ್ನಡ македонски - norsk nynorsk + Afrikaans + кыргызча Kiswahili - Cebuano - asturianu - беларуская - မြန်မာဘာသာ + ភាសាខ្មែរ ગુજરાતી - Latina + монгол + galego + မြန်မာဘာသာ සිංහල - Bân-lâm-gú - Cymraeg - беларуская (тарашкевіца) - Winaray - íslenska - تۆرکجه - ភាសាខ្មែរ - भोजपुरी - Scots - occitan - کوردی - монгол - brezhoneg - aragonés - Alemannisch - татарча / tatarça - অসমীয়া - кыргызча + euskara + norsk nynorsk + беларуская + asturianu 吴语(简体) 吳語(正體) 吴语 - ਪੰਜਾਬੀ - lombard + Cymraeg नेपाली - Frysk - پنجابی - vèneto - Nedersaksies - Lëtzebuergesch - Gaeilge - Bikol Central - Ilokano - Ido - Jawa + íslenska + भोजपुरी + Esperanto + অসমীয়া tojikī тоҷикӣ - нохчийн - sicilianu - Zazaki - võro - Malagasy + کوردی + Scots + Cebuano + ਪੰਜਾਬੀ + Latina Hausa + Jawa + تۆرکجه + Bikol Central + مازِرونی + беларуская (тарашкевіца) + አማርኛ + Alemannisch + Soomaaliga + татарча / tatarça + aragonés + Basa Banyumasan + Türkmençe + Sunda + پنجابی + Lëtzebuergesch + brezhoneg + Bân-lâm-gú Boarisch - Plattdüütsch + нохчийн + Frysk كوردي (عەرەبی) kurdî (latînî) kurdî - Soomaaliga - مازِرونی - მარგალური + occitan + Igbo + 文言 + ଓଡ଼ିଆ башҡортса - Sesotho sa Leboa - чӑвашла - Nordfriisk - interlingua + Winaray + Bahasa Hulontalo + lombard + Gaeilge + Limburgs + მარგალური + 赣语(简体) + 贛語(繁體) + 贛語 + Nedersaksies + मैथिली + پښتو + বিষ্ণুপ্রিয়া মণিপুরী الدارجة - አማርኛ - Runa Simi - Basa Banyumasan - Sunda - Fiji Hindi - Türkmençe - Ligure + Plattdüütsch + Ido + Māori + русиньскый + interlingua + Minangkabau + अंगिका + vèneto + Malagasy + чӑвашла + Xitsonga + sicilianu ייִדיש - саха тыла Kreyòl ayisyen - Gàidhlig - žemaitėška - føroyskt - emiliàn e rumagnòl - Limburgs - Kotava - hornjoserbsce - Minangkabau - پښتو - къырымтатарджа (Кирилл) - qırımtatarca (Latin) - qırımtatarca - Yorùbá - ślůnski + саха тыла + Fiji Hindi ᬩᬲᬩᬮᬶ Basa Bali - Piemontèis - Ladin - ଓଡ଼ିଆ - Nāhuatl - West-Vlams - русиньскый - Napulitano - Volapük - Kapampangan - 閩東語 / Mìng-dĕ̤ng-ngṳ̄ + Nordfriisk + Ilokano Avañe\'ẽ - Igbo - 客家語/Hak-kâ-ngî + संस्कृतम् + føroyskt + Zazaki + Ikinyarwanda + नेपाल भाषा + Արեւմտահայերէն chiShona - मैथिली - 文言 - anarâškielâ - kernowek - Ænglisc - বিষ্ণুপ্রিয়া মণিপুরী - vepsän kel’ + Kapampangan + Yorùbá + Malti + emiliàn e rumagnòl + Runa Simi سنڌي - Seeltersk - Nouormand - ирон - sardu - walon - नेपाल भाषा - furlan - arpetan + Oromoo བོད་ཡིག - 赣语(简体) - 贛語(繁體) - 贛語 - संस्कृतम् - Gaelg - олык марий - tarandíne - Taqbaylit - Zeêuws - corsu + Ligure + ślůnski + къырымтатарджа (Кирилл) + qırımtatarca (Latin) + qırımtatarca + West-Vlams + Ænglisc + डोटेली + ирон davvisámegiella - Lingua Franca Nova - Bahasa Hulontalo - estremeñu - Gagauz - Interlingue + ລາວ + sardu + kernowek + hornjoserbsce isiZulu - kaszëbsczi - Papiamentu - livvinkarjala + Gàidhlig + 閩東語 / Mìng-dĕ̤ng-ngṳ̄ + Ladin + walon + 客家語/Hak-kâ-ngî + Napulitano Acèh + Piemontèis + अवधी + Interlingue Banjar - Tok Pisin - Արեւմտահայերէն - Ikinyarwanda - Pangasinan - ၽႃႇသႃႇတႆး - dolnoserbski - Malti - Chavacano de Zamboanga - ລາວ - armãneashti + žemaitėška + Volapük + võro + corsu + Gagauz + Taqbaylit + ತುಳು + vepsän kel’ + anarâškielâ Qaraqalpaqsha + Picard + олык марий + گیلکی + arpetan + tarandíne + estremeñu ئۇيغۇرچە / Uyghurche - Vahcuengh + Papiamentu + ᏣᎳᎩ + Gaelg + गोंयची कोंकणी / Gõychi Konknni + Ghanaian Pidgin + Deitsch + Kotava + удмурт + Lingua Franca Nova + tetun + lingála + лезги Ripoarisch - Ladino - коми - Novial - мокшень - Picard - Māori + Bislama + Sesotho sa Leboa + dolnoserbski + авар + Diné bizaad эрзянь + kaszëbsczi + Ladino + ၽႃႇသႃႇတႆး + Zeêuws + furlan + буряад + Seeltersk kriyòl gwiyannen - ܐܪܡܝܐ - Patois къарачай-малкъар + ᱥᱟᱱᱛᱟᱲᱤ + isiXhosa + коми + Batak Toba + мокшень + livvinkarjala + Pälzisch + Nouormand Mirandés - буряад - Diné bizaad - удмурт - lingála - Oromoo - авар + Hawaiʻi + ދިވެހިބަސް + гӀалгӀай + Chi-Chewa Aymar aru - chiTumbuka - ತುಳು - лезги - Deitsch - Kabɩyɛ + lea faka-Tonga + Pangasinan + Nāhuatl rumantsch - la .lojban. - tetun - ᱥᱟᱱᱛᱟᱲᱤ - кырык мары - хальмг - Sranantongo - Norfuk / Pitkern - Basa Ugi - гӀалгӀай - Na Vosa Vakaviti - डोटेली - ދިވެހިބަސް - dagbanli - गोंयची कोंकणी / Gõychi Konknni - अंगिका - Hawaiʻi - Pälzisch - Wolof - isiXhosa - گیلکی - Xitsonga - Gagana Samoa - Bislama + Luganda + chiTumbuka + тыва дыл + толыши + tolışi + Chavacano de Zamboanga + ᐃᓄᒃᑎᑐᑦ + inuktitut + ᐃᓄᒃᑎᑐᑦ / inuktitut + Vahcuengh + Iñupiatun + Tok Pisin Twi + dagbanli कॉशुर / کٲشُر - Kongo - अवधी + Patois + Na Vosa Vakaviti + кырык мары + armãneashti ꯃꯤꯇꯩ ꯂꯣꯟ - ᏣᎳᎩ + ܐܪܡܝܐ + Gĩkũyũ + Novial + la .lojban. + перем коми + Basa Ugi + سرائیکی + Norfuk / Pitkern словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ + Wolof + Ποντιακά + Kabɩyɛ + Gagana Samoa + Tsetsêhestâhese + хальмг Setswana - romani čhib - Sakizaya - тыва дыл - पालि - Luganda - Pangcah + ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ + latgaļu Taclḥit ⵜⴰⵛⵍⵃⵉⵜ Taclḥit - reo tahiti - перем коми - Chi-Chewa - latgaļu + ဘာသာမန် + алтай тил bamanankan + Madhurâ адыгэбзэ - Gĩkũyũ + Kongo + SiSwati + Tshivenda + лакку Fulfulde - eʋegbe - lea faka-Tonga 𐌲𐌿𐍄𐌹𐍃𐌺 - Seediq - Madhurâ - Tsetsêhestâhese - лакку + Sranantongo + адыгабзэ Sesotho - SiSwati - ᐃᓄᒃᑎᑐᑦ - inuktitut - ᐃᓄᒃᑎᑐᑦ / inuktitut + romani čhib + Sakizaya + eʋegbe ပအိုဝ်ႏဘာႏသာႏ - Tyap - Atikamekw - ဘာသာ မန် - Iñupiatun - адыгабзэ - سرائیکی - Ποντιακά - алтай тил - Chamoru - kalaallisut + पालि + Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ ཇོང་ཁ ትግርኛ + Chamoru ikirundi + Atikamekw + reo tahiti Li Niha - Thuɔŋjäŋ - Tayal + Pangcah + kalaallisut ߒߞߏ + Tyap Sängö - Tshivenda + Seediq + Tayal wayuunaiki + Thuɔŋjäŋ + Naijá gungbe - Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ pinayuanan - Naijá - Ghanaian Pidgin + fɔ̀ngbè farefare + Dagaare mfantse Test аԥсшәа @@ -1083,10 +1083,9 @@ English Spanish - Japanese - German - French Russian + German + Japanese Chinese (China) Simplified Chinese Traditional Chinese @@ -1095,347 +1094,348 @@ Chinese (Malaysia) Chinese (Singapore) Chinese (Taiwan) - Italian + French Portuguese + Italian Arabic - Persian Indonesian - Polish Turkish - Dutch + Persian + Polish Korean - Hindi + Dutch Vietnamese + Hindi Ukrainian Thai - Swedish - Czech Simple English + Czech + Swedish + Romanian Hungarian + Greek Hebrew - Romanian Finnish - Greek - Norwegian - Malay Bangla Serbian (Cyrillic script) Serbian (Latin script) Serbian - Danish + Norwegian + Malay Croatian + Danish Bulgarian Tamil Catalan - Egyptian Arabic Slovak + Kazakh Marathi Serbo-Croatian (Cyrillic script) Serbo-Croatian (Latin script) Serbo-Croatian + Uzbek (Cyrillic script) + Uzbek (Latin script) + Uzbek + Egyptian Arabic Azerbaijani + Tagalog Telugu Lithuanian - Cantonese Malayalam Bosnian - Slovenian - Uzbek (Cyrillic script) - Uzbek (Latin script) - Uzbek + Cantonese Georgian + Slovenian + Albanian + Armenian Urdu Estonian - Armenian - Kazakh (Arabic script) - Kazakh (China) - Kazakh (Cyrillic script) - Kazakh (Kazakhstan) - Kazakh (Latin script) - Kazakh (Turkey) - Kazakh - Albanian - Kannada - Basque Latvian - Esperanto - Tagalog - Afrikaans - Galician + Kannada Macedonian - Norwegian Nynorsk + Afrikaans + Kyrgyz Swahili - Cebuano - Asturian - Belarusian - Burmese + Khmer Gujarati - Latin + Mongolian + Galician + Burmese Sinhala - Chinese (Min Nan) + Basque + Norwegian Nynorsk + Belarusian + Asturian + Wu (Simplified Han script) + Wu (Traditional Han script) + Wu Welsh - Belarusian (Taraškievica orthography) - Waray + Nepali Icelandic - South Azerbaijani - Khmer Bhojpuri - Scots - Occitan - Central Kurdish - Mongolian - Breton - Aragonese - Alemannisch - Tatar + Esperanto Assamese - Kyrgyz - Wu Chinese (Simplified) - Wu Chinese (Traditional) - Wu Chinese - Punjabi - Lombard - Nepali - Western Frisian - Western Punjabi - Venetian - Low Saxon - Luxembourgish - Irish - Central Bikol - Iloko - Ido - Javanese Tajik (Latin script) Tajik - Chechen - Sicilian - Zazaki - võro - Malagasy + Central Kurdish + Scots + Cebuano + Punjabi + Latin Hausa + Javanese + South Azerbaijani + Central Bikol + Mazanderani + Belarusian (Taraškievica orthography) + Amharic + Alemannic + Somali + Tatar + Aragonese + Basa Banyumasan + Turkmen + Sundanese + Western Punjabi + Luxembourgish + Breton + Minnan Bavarian - Low German + Chechen + Western Frisian Kurdish (Arabic script) Kurdish (Latin script) Kurdish - Somali - Mazanderani - Mingrelian + Occitan + Igbo + Literary Chinese + Odia Bashkir - Northern Sotho - Chuvash - Northern Frisian - Interlingua + Waray + Gorontalo + Lombard + Irish + Limburgish + Mingrelian + Gan (Simplified Han script) + Gan (Traditional Han script) + Gan + Low Saxon + Maithili + Pashto + Bishnupriya Moroccan Arabic - Amharic - Quechua - Basa Banyumasan - Sundanese - Fiji Hindi - Turkmen - Ligurian + Low German + Ido + Māori + Rusyn + Interlingua + Minangkabau + Angika + Venetian + Malagasy + Chuvash + Tsonga + Sicilian Yiddish - Yakut Haitian Creole - Scottish Gaelic - Samogitian - Faroese - Emiliano-Romagnolo - Limburgish - Kotava - Upper Sorbian - Minangkabau - Pashto - Crimean Tatar (Cyrillic script) - Crimean Tatar (Latin script) - Crimean Tatar - Yoruba - Silesian + Yakut + Fiji Hindi Balinese (Balinese script) Balinese - Piedmontese - Ladin - Odia - Nāhuatl - West Flemish - Rusyn - Neapolitan - Volapük - Pampanga - Min Dong Chinese + Northern Frisian + Iloko Guarani - Igbo - Hakka Chinese + Sanskrit + Faroese + Zazaki + Kinyarwanda + Newari + Western Armenian Shona - Maithili - Classical Chinese - Inari Sami - Cornish - Old English - Bishnupriya - Veps + Pampanga + Yoruba + Maltese + Emiliano-Romagnolo + Quechua Sindhi - Saterland Frisian - Norman - Ossetic - Sardinian - Walloon - Newari - Friulian - Arpitan + Oromo Tibetan - Gan (Simplified) - Gan (Traditional) - Gan Chinese - Sanskrit - Manx - Eastern Mari - Tarantino - Kabyle - Zeelandic - Corsican + Ligurian + Silesian + Crimean Tatar (Cyrillic script) + Crimean Tatar (Latin script) + Crimean Tatar + West Flemish + Old English + Doteli + Ossetic Northern Sami - Lingua Franca Nova - Gorontalo - Extremaduran - Gagauz - Interlingue + Lao + Sardinian + Cornish + Upper Sorbian Zulu - Kashubian - Papiamento - Livvi-Karelian + Scottish Gaelic + Mindong + Ladin + Walloon + Hakka Chinese + Neapolitan Achinese + Piedmontese + Awadhi + Interlingue Banjar - Tok Pisin - Western Armenian - Kinyarwanda - Pangasinan - Shan - Lower Sorbian - Maltese - Chavacano - Lao - Aromanian + Samogitian + Volapük + Võro + Corsican + Gagauz + Kabyle + Tulu + Veps + Inari Sami Kara-Kalpak + Picard + Eastern Mari + Gilaki + Arpitan + Tarantino + Extremaduran Uyghur - Zhuang + Papiamento + Cherokee + Manx + Goan Konkani + Ghanaian Pidgin + Pennsylvania German + Kotava + Udmurt + Lingua Franca Nova + Tetum + Lingala + Lezghian Colognian - Ladino - Komi - Novial - Moksha - Picard - Māori + Bislama + Northern Sotho + Lower Sorbian + Avaric + Navajo Erzya + Kashubian + Ladino + Shan + Zeelandic + Friulian + Russia Buriat + Saterland Frisian Guianan Creole - Aramaic - Jamaican Creole English Karachay-Balkar + Santali + Xhosa + Komi + Batak Toba + Moksha + Livvi-Karelian + Palatine German + Norman Mirandese - Russia Buriat - Navajo - Udmurt - Lingala - Oromo - Avaric + Hawaiian + Divehi + Ingush + Nyanja Aymara - Tumbuka - Tulu - Lezghian - Pennsylvania German - Kabiye + Tongan + Pangasinan + Nāhuatl Romansh - Lojban - Tetum - Santali - Western Mari - Kalmyk - Sranan Tongo - Norfuk / Pitkern - Buginese - Ingush - Fijian - Doteli - Divehi - Dagbani - Goan Konkani - Angika - Hawaiian - Palatine German - Wolof - Xhosa - Gilaki - Tsonga - Samoan - Bislama + Ganda + Tumbuka + Tuvinian + Talysh (Cyrillic script) + Talysh + Chavacano + Eastern Canadian (Aboriginal syllabics) + Eastern Canadian (Latin script) + Inuktitut + Zhuang + Inupiaq + Tok Pisin Twi + Dagbani Kashmiri - Kongo - Awadhi + Jamaican Creole English + Fijian + Western Mari + Aromanian Manipuri - Cherokee + Aramaic + Kikuyu + Novial + Lojban + Komi-Permyak + Buginese + Saraiki + Norfuk / Pitkern Church Slavic + Wolof + Pontic + Kabiye + Samoan + Cheyenne + Kalmyk Tswana - Vlax Romani - Sakizaya - Tuvinian - Pali - Ganda - Amis + Standard Moroccan Tamazight + Latgalian Tachelhit (Latin script) Tachelhit (Tifinagh script) Tachelhit - Tahitian - Komi-Permyak - Nyanja - Latgalian + Mon + Southern Altai Bambara + Madurese Kabardian - Kikuyu + Kongo + Swati + Venda + Lak Fula - Ewe - Tongan Gothic - Taroko - Madurese - Cheyenne - Lak + Sranan Tongo + Adyghe Southern Sotho - Swati - Eastern Canadian (Aboriginal syllabics) - Eastern Canadian (Latin script) - Inuktitut + Vlax Romani + Sakizaya + Ewe Pa\'O - Tyap - Atikamekw - Mon - Inupiaq - Adyghe - Saraiki - Pontic - Southern Altai - Chamorro - Kalaallisut + Pali + Cree Dzongkha Tigrinya + Chamorro Rundi + Atikamekw + Tahitian Nias - Dinka - Tayal + Amis + Kalaallisut N’Ko + Tyap Sango - Venda + Taroko + Tayal Wayuu + Dinka + Nigerian Pidgin Gun - Cree Paiwan - Nigerian Pidgin - Ghanaian Pidgin + Fon Frafra + Dagaare Fanti Test Abkhazian @@ -1445,12 +1445,12 @@ crh,crh-cyrl,crh-latn gan,gan-hans,gan-hant iu,ike-cans,ike-latn - kk,kk-arab,kk-cn,kk-cyrl,kk-kz,kk-latn,kk-tr ku,ku-arab,ku-latn sh,sh-cyrl,sh-latn shi,shi-latn,shi-tfng sr,sr-ec,sr-el tg,tg-latn + tly,tly-cyrl uz,uz-cyrl,uz-latn wuu,wuu-hans,wuu-hant zh,zh-cn,zh-hans,zh-hant,zh-hk,zh-mo,zh-my,zh-sg,zh-tw diff --git a/scripts/generate_wiki_languages.py b/scripts/generate_wiki_languages.py index 30e95e8973b..2a0724a42e1 100755 --- a/scripts/generate_wiki_languages.py +++ b/scripts/generate_wiki_languages.py @@ -52,7 +52,6 @@ def add_variant(lang_code_variants): for key, value in data[u"sitematrix"].items(): if type(value) is not dict: continue - language_code = value[u"code"] site_list = value[u"site"] if type(site_list) is not list: continue @@ -62,6 +61,12 @@ def add_variant(lang_code_variants): wikipedia_url = site[u"url"] if len(wikipedia_url) == 0: continue + + # At this stage, the language code should be the subdomain of the Wikipedia URL, + # instead of the "code" field in the sitematrix response. + # language_code = value[u"code"] + language_code = wikipedia_url.replace('https://', '').replace('.wikipedia.org', '') + # TODO: If we want to remove languages with too few active users: # allusers = json.loads(requests.get(wikipedia_url + QUERY_ALLUSERS).text) # if len(allusers[u"query"][u"allusers"]) < 10: diff --git a/scripts/make-templates.py b/scripts/make-templates.py index 49486e5e5f3..ba5dc103f38 100755 --- a/scripts/make-templates.py +++ b/scripts/make-templates.py @@ -13,10 +13,6 @@ SIMPLIFIED_CHINESE_LANG = "zh-hans" TRADITIONAL_CHINESE_LANG = "zh-hant" -# T114042 -NORWEGIAN_BOKMAL_WIKI_LANG = "no" -NORWEGIAN_BOKMAL_LANG = "nb" - # Wikis that cause problems and hence we pretend # do not exist. @@ -82,8 +78,15 @@ def list_from_sitematrix(): wikipedia_url = site[u"url"] if len(wikipedia_url) == 0: continue - wikis.append(build_wiki(value[u"code"], value[u"localname"], value[u"name"])) + # At this stage, the site code should be the subdomain of the Wikipedia URL, + # instead of the "code" field in the sitematrix response. + # site_code = value[u"code"] + site_code = wikipedia_url.replace('https://', '').replace('.wikipedia.org', '') + + wikis.append(build_wiki(site_code, value[u"localname"], value[u"name"])) + + wikis.sort(key=lambda x: x.lang) return wikis @@ -118,8 +121,9 @@ def postprocess_wikis(wiki_list): traditionalWiki.props["local_name"] = "繁體中文" wiki_list.wikis.insert(chineseWikiIndex + 2, traditionalWiki) - bokmalWiki = next((wiki for wiki in wiki_list.wikis if wiki.lang == NORWEGIAN_BOKMAL_WIKI_LANG), None) - bokmalWiki.lang = NORWEGIAN_BOKMAL_LANG + # T114042 + bokmalWiki = next((wiki for wiki in wiki_list.wikis if wiki.lang == "no"), None) + bokmalWiki.lang = "nb" return wiki_list From 91577bd3eb6d82aa4f4f4da90c52e4312a77611a Mon Sep 17 00:00:00 2001 From: cooltey Date: Wed, 3 Apr 2024 17:20:26 -0700 Subject: [PATCH 037/626] Update Featured article widget and show article title in the correct variant --- .../wikipedia/widgets/WidgetFeaturedPageWorker.kt | 7 ++++++- app/src/main/res/layout/widget_featured_page.xml | 12 ++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt b/app/src/main/java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt index 54234e438ed..080aa3ee784 100644 --- a/app/src/main/java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt +++ b/app/src/main/java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt @@ -29,7 +29,12 @@ class WidgetFeaturedPageWorker( // TODO: don't use PageSummary. val summary = if (result.tfa != null) { - result.tfa + val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(WikipediaApp.instance.wikiSite.languageCode).isNullOrEmpty() + if (hasParentLanguageCode) { + ServiceFactory.getRest(WikipediaApp.instance.wikiSite).getPageSummary(null, result.tfa.apiTitle) + } else { + result.tfa + } } else { val response = ServiceFactory.get(mainPageTitle.wikiSite).parseTextForMainPage(mainPageTitle.prefixedText) ServiceFactory.getRest(WikipediaApp.instance.wikiSite).getPageSummary(null, findFeaturedArticleTitle(response.text)) diff --git a/app/src/main/res/layout/widget_featured_page.xml b/app/src/main/res/layout/widget_featured_page.xml index f6d2221389e..18ccf9d3eb3 100644 --- a/app/src/main/res/layout/widget_featured_page.xml +++ b/app/src/main/res/layout/widget_featured_page.xml @@ -1,5 +1,5 @@ - @@ -63,4 +63,4 @@ android:layout_gravity="center_vertical|end" android:contentDescription="@null" /> - \ No newline at end of file + \ No newline at end of file From ecff5d8a27ba35fc4713b38b4c8dbfedf5fc34d6 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 4 Apr 2024 14:30:33 +0200 Subject: [PATCH 038/626] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-bew/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 4 + app/src/main/res/values-br/strings.xml | 6 + app/src/main/res/values-ce/strings.xml | 3 +- app/src/main/res/values-da/strings.xml | 14 +- app/src/main/res/values-de/strings.xml | 13 +- app/src/main/res/values-es/strings.xml | 14 +- app/src/main/res/values-fi/strings.xml | 19 +- app/src/main/res/values-fr/strings.xml | 3 +- app/src/main/res/values-hi/strings.xml | 1 + app/src/main/res/values-hu/strings.xml | 15 ++ app/src/main/res/values-ia/strings.xml | 2 +- app/src/main/res/values-iw/strings.xml | 14 +- app/src/main/res/values-ja/strings.xml | 8 +- app/src/main/res/values-lb/strings.xml | 3 + app/src/main/res/values-mk/strings.xml | 21 +- app/src/main/res/values-mnw/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 3 + app/src/main/res/values-pt-rBR/strings.xml | 7 + app/src/main/res/values-qq/strings.xml | 13 +- app/src/main/res/values-ru/strings.xml | 4 + app/src/main/res/values-sd/strings.xml | 249 ++++++++++++++++++++- app/src/main/res/values-sr/strings.xml | 15 ++ app/src/main/res/values-zh-rTW/strings.xml | 25 ++- app/src/main/res/values-zh/strings.xml | 2 +- 25 files changed, 425 insertions(+), 36 deletions(-) diff --git a/app/src/main/res/values-bew/strings.xml b/app/src/main/res/values-bew/strings.xml index 8f87616062d..086836a552a 100644 --- a/app/src/main/res/values-bew/strings.xml +++ b/app/src/main/res/values-bew/strings.xml @@ -1221,7 +1221,7 @@ Pesen disimpen èn diterebitin ke pemermak punya halaman kongko pemaké Ni halaman oborolan – kosong. Kongko mulain di mari - Halaman kongko ièlah tempat di mana orang pada guntengan bakal ngeja isi Wikipédi sebagus-bagusnya. Mulain dengen nambahin topik perhadring baru bakal bungselan ama gawé bareng ama komunitèt tukang Wikipédi. + Halaman kongko ièlah tempat di mana orang pada guntengan bakal ngeja isi Wikipédi sebagus-bagusnya. Mulain dengen nambahin topik perhadring baru bakal bungselan ama gawé bareng ama jema\'ah tukang Wikipédi. Bales (Kaga\' ada perihal) Perihal diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 673dd5eb2f4..a66fa62c231 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -432,6 +432,10 @@ বাধা শুরুর সময়: %s বাধার মেয়াদোত্তীর্ণের সময়: %s বাধা প্রদান আইডি: %s + আপনি প্রবেশ করেন নি + বুঝেছি + আপনি একটি অস্থায়ী অ্যাকাউন্ট ব্যবহার করছেন + সেশন শেষ করুন অ্যাপ্লিকেশন ত্রুটি আমরা দুঃখিত, উইকিপিডিয়া অ্যাপ্লিকেশন একটি ত্রুটির সম্মুখীন হয়েছে এবং বন্ধ হয়ে গেছে।\n\nআপনি কি পুনরারম্ভ বা প্রস্থান করতে চান? পুনরারম্ভ করুন diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 0b6038852cf..dbfa1a3bbef 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -1107,6 +1107,11 @@ Uhelder px Ensoc\'hañ + Klask ur patrom + da skouer: %s + %s (Diret) + %s (Erbedet) + Gouzout hiroc\'h Skoazell Kevreañ ouzh/ mont gant Wikipedia Stagañ ganti @@ -1254,6 +1259,7 @@ Dilemel Hizivaet eo bet ar gemennadenn Lemel ar gemennadenn + Ho kemennadennoù Klask pe silañ ar c\'hemmoù Tikedennoù: %s Hini ebet diff --git a/app/src/main/res/values-ce/strings.xml b/app/src/main/res/values-ce/strings.xml index 37624a6e19e..1ac5a9ca508 100644 --- a/app/src/main/res/values-ce/strings.xml +++ b/app/src/main/res/values-ce/strings.xml @@ -172,7 +172,7 @@ Чуйаккха ХӀара карточка къайлайаккха Карточка къайлайаьккхина. - Дукха таронаш + Кхин сов таронаш Викиларман дика суьрташ Талла Карточкан хьаьрк @@ -201,6 +201,7 @@ ТӀетоха меттанаш Википедехь ДӀабаккха цийн мотт могӀаман йукъара? Хийца меттанаш + Кепаш кхуллуш йу декъашхоша, цундела уьш хила мега чулацам кхачаме боцуш Тергаме могӀам Дийцар Дийцар: %s diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 726f86a81ac..00213c7e068 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -135,6 +135,7 @@ Dine Wikipedia-sprog Offentliggør ændringer Redigering offentliggjort! + Redigering udgivet! Det kan tage et øjeblik inden ændringerne vises. Redigering mislykkedes! Prøv igen Annuller @@ -260,7 +261,7 @@ Oversættere Denne app blev oversat af de frivillige oversættere på <a href=\"https://translatewiki.net\">translatewiki.net</a>. Licens - Kildekode er tilgængelig på <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> og <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> under <a href=\"https://phabricator.wikimedia.org/diffusion/APAW/browse/master/COPYING?view=raw\">Apache 2.0-licensen</a>. Med mindre andet er angivet er indhold tilgængeligt under <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Navngiv - Del på samme vilkår Licens</a>. + Kildekode tilgængelig på <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> under <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0-licensen</a> . Medmindre andet er angivet, er indhold tilgængeligt under en <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Navngivelse-Del på samme Vilkår-licens</a> . Et produkt fra <a href=\"https://wikimediafoundation.org/\">Wikimedia Foundation</a> Om Den side er blevet ændret. Er du sikker på at du vil afslutte uden at gemme dine ændringer? @@ -413,6 +414,7 @@ Gem Gemt Del + Denne artikel er en spire, hvilket betyder, at der ikke er nok indhold i artiklen til at generere en forhåndsvisning. Det kan du dog ændre på. Denne side findes ikke. Wikipedia har ikke en <a href=\"%1$s\">brugerside</a> med dette nøjagtige navn. Generelt bør denne side være oprettet og redigeret af <b>%2$s</b> . Hvis du er i tvivl, bedes du kontrollere, at \"%3$s\" eksisterer. Kan ikke oprette forbindelse til internet @@ -1221,6 +1223,7 @@ Uden ramme Ramme Simpel + Du kan indstille, hvordan medieelementet vises på siden. Dette bør være miniatureformatet for at være i overensstemmelse med andre sider i næsten alle tilfælde. Billedestørrelse Standard Tilpas @@ -1228,6 +1231,14 @@ Højde px Indsæt + Søg skabeloner + Indsæt + fx %s + %s (Valgfrit) + %s (Foreslået) + Lær mere + Skabeloner er brugergenererede og kan mangle fuldstændige beskrivelser. + Skabelonen \"%s\" har endnu ikke en beskrivelse. Hjælp Log på / registrer dig på Wikipedia Hej %s , vidste du, at alle kan redigere Wikipedia? @@ -1251,6 +1262,7 @@ Beskedens titel Udgiv Annullér + Gem ikke Besked offentliggjort på brugerens brugerdiskussionsside Beskeden er gemt og offentliggjort på brugerens brugerdiskussionsside Gemte beskeder diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7b8da85fabc..eacc72e9d87 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -149,6 +149,7 @@ Auf einer Karte ansehen In einer anderen Sprache lesen In %d weiteren Sprachen verfügbar + CC BY-SA 4.0 Mit dem Veröffentlichen stimmst du den <a href=\"%1$s\">Nutzungsbedingungen</a> und unwiderruflich der Veröffentlichung deiner Beiträge unter der <a href=\"%2$s\">CC BY-SA 4.0</a> Lizenz zu. Mit dem Veröffentlichen stimmst du den <a href=\"%1$s\">Nutzungsbedingungen</a> und unwiderruflich der Veröffentlichung deiner Beiträge unter der <a href=\"%2$s\">CC BY-SA 4.0-Lizenz</a> zu. Bearbeitungen werden der IP-Adresse deines Gerätes zugeordnet. Wenn du dich <a href=\"https://#login\">anmeldest</a>, verfügst du über mehr Datenschutz. Bearbeitungen werden der IP-Adresse deines Gerätes zugeordnet. Wenn du dich <a href=\"https://#login\">anmeldest</a>, wirst du über mehr Datenschutz verfügen. @@ -160,6 +161,7 @@ Deine Wikipedia-Sprachen Änderungen veröffentlichen Bearbeitung veröffentlicht! + Bearbeitung veröffentlicht! Es kann einige Zeit dauern, bis Änderungen angezeigt werden. Bearbeitung fehlgeschlagen! Erneut versuchen Abbrechen @@ -345,6 +347,7 @@ Lesenswerte Wikipedia-Seite Seite des Tages: Wikipedia-Suche + Die besten Artikel, die Wikipedia zu bieten hat Keine Definitionen gefunden. Neue Alpha-Aktualisierung verfügbar Zum Herunterladen tippen @@ -428,6 +431,10 @@ %d ausgewählt Es ist ein Fehler aufgetreten Ausblenden + Lesen + Speichern + Gespeichert + Teilen Diese Seite ist nicht vorhanden Wikipedia hat keine <a href=\"%1$s\">Benutzerseite</a> mit genau diesem Namen. Im Allgemeinen sollte diese Seite von <b>%2$s</b> erstellt und bearbeitet werden. Im Zweifelsfall überprüfe bitte, ob „%3$s“ existiert. Es konnte keine Verbindung mit dem Internet hergestellt werden @@ -1032,7 +1039,7 @@ IP gesperrt Zuletzt bearbeitet Nie - neu + Neu Durch die Veröffentlichung stimmen Sie den <a href=\"%1$s\"> Nutzungsbedingungen</a> zu und geben diesen Beitrag unwiderruflich unter der <a href=\"%2$s\"> CC0-Lizenz </a> frei. Vorgeschlagene Bearbeitungen Danke für die Bearbeitung von Wikipedia! Warum machst du nicht dort weiter, wo du aufgehört hast? @@ -1207,6 +1214,7 @@ Vorlage Einzelnachweis Vorschau des Links anzeigen + Einen Benutzer erwähnen Medien einfügen Wähle eine Datei aus Wikimedia Commons Medien suchen @@ -1259,6 +1267,8 @@ Titel der Nachricht Veröffentlichen Abbrechen + Nicht speichern + Gespeicherte Nachrichten Diese Diskussionsseite ist leer. Die Konversation beginnt hier Auf den Diskussionsseiten wird darüber diskutiert, wie man Wikipedia-Inhalte am besten durchführen kann. Füge ein neues Diskussionsthema hinzu, um dich mit einer Gemeinschaft von Wikipedianern zu vernetzen und zusammenzuarbeiten. @@ -1346,6 +1356,7 @@ Abschnitt entfernt Bist du sicher, dass du diese Bearbeitung rückgangig machen willst? Damit werden die Änderungen, die durch die hier angezeigte(n) Version(en) des Artikels vorgenommen wurden, rückgängig gemacht. + Zusammenfassung (optional) Um fortzufahren, gib bitte einen Grund für die Rückgängigmachung dieser Bearbeitung an: Die Version wurde rückgängig gemacht. Bist du sicher, dass du die Bearbeitungen rückgängig machen willst? diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c8e9f442de6..1a185aa7fcc 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -203,6 +203,7 @@ Tus idiomas de Wikipedia Publicar cambios Se publicó la edición. + Edición publicada! Los cambios pueden tardar en aparecer. Falló la edición. Reintentar Cancelar @@ -476,6 +477,7 @@ Guardar Guardado Compartir + Este artículo es un resumen, lo que significa que no hay suficiente contenido en el artículo para generar una vista previa. Sin embargo, puedes cambiar eso. Esta página no existe Wikipedia no tiene una <a href=\"%1$s\">página de usario</a> con este nombre exacto. En general, esta página debe ser creada y editada por <b>%2$s</b>. En caso de duda, verifique que exista \"%3$s\". No se pudo conectar a Internet. @@ -498,6 +500,16 @@ Puedes contactar <a href=\"%2$s\">%1$s</a> o otro <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administrator</a> para hablar sobre el bloque. Personalice su barra de herramientas Puedes contactar un <a href=\"https://es.wikipedia.org/wiki/Wikipedia:Bibliotecarios\">bibliotecario</a> para hablar del bloqueo. + Descartar cambios e iniciar sesión + + La cuenta temporal %1$s se creó después de que se publicara su edición. Caducará en %2$d día. + La cuenta temporal %1$s se creó después de que se publicara la edición. Caducará en %2$d días. + + + La cuenta caducará en %d días. + La cuenta caducará en %d días. + + Esto cerrará la sesión de su cuenta temporal. ¿Quieres continuar? Error de la aplicación La aplicación de Wikipedia ha experimentado un error y se cerró.\n\n¿Te gustaría volver a empezar o salir? Iniciar de nuevo @@ -1367,7 +1379,7 @@ ¡Hola! Me gustaría compartir mi lista de lectura de Wikipedia contigo: ¿Podrías ayudarnos a mejorar \"Compartir listas de lectura\"? \"Compartir listas de lectura\" es una función de prueba y necesitamos tus comentarios para mejorarla o eliminarla. - Cree sus propios mensajes de advertencia o utilice <a href=\"#\">mensajes de ejemplo</a> para comenzar. + Cree sus propios mensajes de o utilice <a href=\"#\">mensajes de ejemplo</a> para comenzar. Eliminar El mensaje se ha eliminado Sus mensajes diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index ae96b37a89d..3758d85a9c2 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -176,7 +176,7 @@ Kirjaudu sisään Kirjaudu sisään Kirjaudu sisään - Kirjaudu + Kirjaudu sisään Kirjaudutaan… Kirjauduttu sisään! Aseta salasanasi @@ -192,6 +192,7 @@ Kirjaudu sisään Peruuta Häivytä käyttäjätunnus + Varoitus häivyttämisestä Ei äskettäin tarkasteltuja artikkeleita Pidä kirjaa lukemastasi. Jotkut lukuhistorian artikkelit eivät ehkä ole nähtävissä ilman verkkoyhteyttä. @@ -222,7 +223,7 @@ Lisää sähköpostiosoite Luo käyttäjätunnus Käyttäjänimi \"%s\" ei ole käytettävissä. Valitse toinen nimi. - IP-osoitteesi on tällä hetkellä estetty luomasta uusia tunnuksia. + IP-osoitteesi on tällä hetkellä estetty luomasta uusia käyttäjätunnuksia. https://fi.wikipedia.org/wiki/Wikipedia:Esto Tiedot Yleiset @@ -584,15 +585,15 @@ Haluatko varmasti poistaa %d listaa? Kirjaudu sisään ottaaksesi synkronoinnin käyttöön - Kirjaudu sisään salliaksesi lukulistojesi tallentamisen tunnuksellesi. + Kirjaudu sisään salliaksesi lukulistojesi tallentamisen käyttäjätunnuksellesi. Peruuta Kirjaudu sisään Lukulistojen synkronointi pois käytöstä - Lukulistojen synkronointi on pois päältä tunnuksellesi, ja tallennettuja artikkeleita sisäänkirjautuneissa laitteissasi ei enää varmuuskopioida. Kytke lukulistojen synkronointi päälle asetuksista. + Lukulistojen synkronointi on pois päältä käyttäjätunnuksellesi, ja tallennettuja artikkeleita sisäänkirjautuneissa laitteissasi ei enää varmuuskopioida. Kytke lukulistojen synkronointi päälle asetuksista. OK Asetukset Otetaanko lukulistan synkronointi käyttöön? - Artikkelit, jotka on tallennettu lukulistoihin, voidaan nyt synkronoida Wikipedia-tunnuksellesi. <a href=\"#faq\">Lisätietoja</a> + Artikkelit, jotka on tallennettu lukulistoihin, voidaan nyt synkronoida Wikipedia-käyttäjätunnuksellesi. <a href=\"#faq\">Lisätietoja</a> Älä näytä tätä uudelleen Ota synkronointi käyttöön Ei kiitos @@ -1233,7 +1234,10 @@ Korkeus kuvapistettä Lisää + Lisää esim. %s + %s (valinnainen) + %s (ehdotettu) Lisätietoja Ohje Kirjaudu sisään / liity Wikipediaan @@ -1258,6 +1262,7 @@ Viestin otsikko Julkaise Peruuta + Älä tallenna Viesti julkaistu muokkaajan keskustelusivulla Viesti tallennettu ja julkaistu muokkaajan keskustelusivulla Tallennetut viestit @@ -1466,7 +1471,7 @@ Hei! Haluan jakaa Wikipedian lukulistani kanssasi: Voisitko auttaa meitä parantamaan lukulistojen jakamista? Lukulistojen jakaminen on testiominaisuus, jonka kehittämiseen tarvitsemme palautettasi. - Sinulla ei ole tallennettuja varoitusviestejä. + Luo omia viestejä tai käytä <a href=\"#\">malliviestejä</a> aloittaaksesi. Uusi viesti Aihe Kirjoita viesti @@ -1492,6 +1497,8 @@ Viestit on poistettu Otsikko ei voi olla tyhjä. + Omat viestit + Esimerkkiviestit Etsi tai suodata muokkauksia Merkinnät: %s Ei mitään diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6a4b851a9b0..5055e71a3c7 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -27,6 +27,7 @@ * Golmore * Gomoko * Great11 +* Hecatonchire * Hydros * Iketsi * JeanPlu @@ -1500,7 +1501,7 @@ Bonjour ! J’aimerais partager ma liste de lecture Wikipédia avec vous : Pourriez-vous nous aider à améliorer la fonctionnalité « Partager des listes de lecture » ? Le « Partage de listes de lecture » est une fonctionnalité en test et nous avons besoin de vos commentaires pour l’améliorer ou la supprimer. - Vous n’avez pas de message d’avertissement enregistré. + Créez vos propres messages ou utilisez <a href=\"#\">message d\'exemple</a> pour commencer. Nouveau message Sujet Composer le message diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 1d352cf9737..feeaadc9bde 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -437,6 +437,7 @@ आप प्रतिबंध पर चर्चा करने के लिए <a href=\"%2$s\">%1$s</a> या फिर किसी दूसरे <a href=\"https://hi.wikipedia.org/wiki/%E0%A4%B5%E0%A4%BF%E0%A4%95%E0%A4%BF%E0%A4%AA%E0%A5%80%E0%A4%A1%E0%A4%BF%E0%A4%AF%E0%A4%BE:%E0%A4%AA%E0%A5%8D%E0%A4%B0%E0%A4%AC%E0%A4%A8%E0%A5%8D%E0%A4%A7%E0%A4%95\">प्रबंधक</a> से संपर्क कर सकते हैं। अपने टूलबार में परिवर्तन करें प्रतिबंध पर चर्चा करने के लिए आप किसी <a href=\"https://hi.wikipedia.org/wiki/%E0%A4%B5%E0%A4%BF%E0%A4%95%E0%A4%BF%E0%A4%AA%E0%A5%80%E0%A4%A1%E0%A4%BF%E0%A4%AF%E0%A4%BE:%E0%A4%AA%E0%A5%8D%E0%A4%B0%E0%A4%AC%E0%A4%A8%E0%A5%8D%E0%A4%A7%E0%A4%95\">प्रबन्धक</a> से संपर्क कर सकते हैं। + समझ गया अनुप्रयोग त्रुटि हमें खेद है कि किसी त्रुटि को अनुभव करने के कारणवश विकिपीडिया एप को बंद कर दिया गया। \n\nक्या आप फिर से शुरू या बंद करना चाहते हैं? फिर से शुरू करें diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index fb273fea9bb..d69522a5c00 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -136,6 +136,7 @@ Wikipédia-nyelveid Változtatások közzététele Szerkesztés közzétéve! + Szerkesztés közzétéve! A változások megjelenése időbe telhet. A szerkesztés nem sikerült! Újra Mégse @@ -415,6 +416,7 @@ Mentés Elmentve Megosztás + Ez a szócikk egy csonk, ami azt jelenti, hogy nincs elég tartalom a cikkben az előnézet létrehozásához. Ezen azonban változtathatsz. Ez a lap nem létezik Nincs pontosan ilyen nevű <a href=\"%1$s\">szerkesztői lap</a> a Wikipédián. Általánosságban ezt a lapot csak a tulajdonosának (<b>%2$s</b>) szabad létrehoznia és szerkesztenie. Ha kétséged van, ellenőrizd, hogy létezik-e „%3$s” nevű regisztrált szerkesztő. Nem sikerült csatlakozni az internethez @@ -437,6 +439,11 @@ Kapcsolatba léphetsz a blokkolás végrehajtójával (<a href=\"%2$s\">%1$s</a>) vagy egy másik <a href=\"https://hu.wikipedia.org/wiki/Wikipédia:Adminisztrátorok\">adminisztrátorral</a>, és megbeszélheted vele a blokkot. Eszköztár testreszabása Kapcsolatba léphetsz egy <a href=\"https://hu.wikipedia.org/wiki/Wikipédia:Adminisztrátorok\">adminisztrátorral</a>, és megbeszélheted vele a blokkot. + Nem vagy bejelentkezve + Értem + Ideiglenes fiókot használsz + Munkamenet befejezése + Ezzel kijelentkezel ideiglenes fiókodból. Akarod folytatni? Alkalmazáshiba Sajnáljuk, a Wikipédia alkalmazás hibát észlelt és leállt.\n\nSzeretnéd újrakezdeni, vagy kilépnél? Újrakezdés @@ -1264,6 +1271,7 @@ Üzenet címe Közzététel Mégse + Ne mentsd el Az üzenet közzétéve a szerkesztő vitalapján Az üzenet elmentve és közzétéve a szerkesztő vitalapján Mentett üzenetek @@ -1277,6 +1285,7 @@ Üzenet megfogalmazása Az üzenet nem lehet üres. A tárgy nem lehet üres. + A tárgynév már létezik. Próbálj ki egy másikat. Válasz közzétéve. Visszavonás <b>Utoljára szerkesztette %1$s</b> ekkor: %2$s @@ -1498,6 +1507,8 @@ Az üzenetek törölve Az cím nem lehet üres. + Üzeneteid + Példaüzenetek Szerkesztések keresése vagy szűrése Címkék: %s Semmi @@ -1578,6 +1589,7 @@ Semleges Elégedetlen Hogyan javíthatjuk a funkciót? + Szócikk szerkesztési laptörténet Visszajelzés Elküldés Visszajelzés elküldve. @@ -1586,8 +1598,11 @@ Tesztszerkesztések Semleges nézőpont Automatikus fordítás + Összeférhetetlenségi emlékeztető Utolsó figyelmeztetés Szerzői jog megsértésére vonatkozó figyelmeztetés + Hagyjál szerkesztési összefoglalót + Ne cenzúrázz Szócikk javítási javaslat Szerkesztés Elfogad diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 7c6d3f2df3f..53eaeb4a736 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -1441,7 +1441,7 @@ Salute! Io vole condivider mi lista de lectura de Wikipedia con te: Poterea tu adjutar nos a meliorar \"Condivider listas de lectura\"? \"Condivider listas de lectura\" es un function in test e nos ha besonio de tu retroaction pro meliorar o remover lo. - Crea tu proprie messages de advertimento o usa le <a href=\"#\">messages de exemplo</a> pro comenciar. + Crea tu proprie messages o usa le <a href=\"#\">messages de exemplo</a> pro comenciar. Nove message Subjecto Componer message diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index a6760e76fbf..5d33e15f100 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -23,6 +23,7 @@ * דגש * דגש חזק * המקיסט +* יוסף בן מלמד * מקף * נדב ס --> @@ -452,6 +453,17 @@ באפשרותך ליצור קשר עם <a href=\"%2$s\">%1$s</a> או עם <a href=\"https://he.wikipedia.org/wiki/WP:SYSOP\">מפעיל</a> התאמת סרגל הכלים שלך באפשרותך ליצור קשר עם <a href=\"https://he.wikipedia.org/wiki/WP:SYSOP\">מפעיל</a> כדי לדון בחסימה. + לא נכנסת לחשבון + לאחר ביצוע עריכה, ייווצר בשבילך חשבון זמני כדי להגן על פרטיותך. <a href=\"%1$s\">מידע נוסף</a>.<br /><br /><a href=\"https://#login\">כניסה</a> או <a href=\"https://#login\">יצירת חשבון</a> תאפשר לך לקבל קרדיט על עריכות עתידיות ולגשת לאפשרויות אחרות. + העריכה שלך תיוחס לשם המשתמש %1$s. כתובת ה־IP שלך תהיה גלויה למפעילים.<br /><br /> <a href=\"https://#login\">כניסה</a> או <a href=\"https://#login\">יצירת חשבון</a> תגרום לכך שהעריכות שלך תיוחסנה לשם הנבחר שלך, ויש לזה גם יתרונות נוספים. + הבנתי + זהו חשבון זמני + לזרוק את השינויים ולהיכנס לחשבון + <b>לא נכנסת לחשבון.</b> לאחר ביצוע עריכה, ייווצר בשבילך חשבון זמני כדי להגן על פרטיותך. <a href\n=\"%1$s\">מידע נוסף</a> + <b>החשבון שלך זמני.</b> העריכה שלך תיוחס לשם המשתמש %1$s. <a href=\"%2$s\">מידע נוסף</a>. + <b>זהו חשבון זמני.</b> עריכות שנעשו עם החשבון הזמני %1$s לא יועברו לחשבון הקבוע שלך בעת הכניסה. כניסה או יצירת חשבון תאפשר לך לקבל קרדיט על עריכות עתידיות, ויש לזה גם יתרונות נוספים. + יציאה מהתחברות + הפעולה הזאת תנתק אותך מחשבונך הזמני. האם ברצונך להמשיך? שגיאת יישום אנחנו מצטערים, ביישום ויקיפדיה אירעה שגיאה והוא נעצר.\n\nהאם להתחיל מהתחלה או לצאת? להתחיל מהתחלה @@ -1563,7 +1575,7 @@ שלום! אני רוצה לשתף את רשימת הקריאה שלי בוויקיפדיה איתך: אפשר לבקש ממך לעזור לנו לשפר את התכונה \"שיתוף רשימות קריאה\"? \"שיתוף רשימות קריאה\" היא תכונה בבדיקה ואנחנו זקוקים למשוב שלך כדי לשפר או להסיר אותה. - באפשרותך ליצור הודעות אזהרה משלך או להשתמש ב<a href=\"#\">הודעות לדוגמה</a> כדי להתחיל. + באפשרותך ליצור הודעות משלך או להשתמש ב<a href=\"#\">הודעות לדוגמה</a> כדי להתחיל. הודעה חדשה נושא כתיבת הודעה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c065ffa2a87..1550a6a5348 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -7,6 +7,7 @@ * Amire80 * Bonfire12 * Buntschann +* Chqaz * Dbrant * Fumi37s * GAMEZONE628 @@ -215,6 +216,8 @@ ウィキペディアからログアウトしました。もう一度ログインしますか? ログイン キャンセル + アカウントを削除 + アカウント削除の警告 履歴はまだありません! これまで読んだページを追跡できます。 インターネット未接続のときには、履歴にある記事は表示できない場合があります。 @@ -790,8 +793,8 @@ すべての項目のチェックを外す ウィキフィルター 種類フィルター - すべての「ウィキ」 - すべての「種類」 + すべてのウィキ + すべての種類 %sのトークページ この機能はオフラインでは利用できません。 閲覧履歴からのおすすめ @@ -1582,6 +1585,7 @@ フィードバック 送信 フィードバックが送信されました。 + 編集 承認 却下 ページの問題点 diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 56c18bc6fad..24dee2ab4a1 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -1062,6 +1062,7 @@ Titel vum Message Verëffentlechen Ofbriechen + Net späicheren Dës Diskussiouns-Säit ass eidel. D\'Konversatioun fänkt hei un Äntweren @@ -1253,6 +1254,8 @@ Messagë goufe geläscht Den Titel däerf net eidel sinn. + Är Messagen + Beispillmessagen Ännerungen duerchsichen oder filteren Keen Benotzersäit weisen diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index f41f0279577..16c21cbfc6b 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -423,6 +423,25 @@ Можете да се обратите кај <a href=\"%2$s\">%1$s</a> или некој друг <a href=\"https://mk.wikipedia.org/wiki/Википедија:Администратори\">администратор</a> ако сакате да поразговарате за блокот. Прилагодете си го алатникот Можете да се обратите кај <a href=\"https://https://mk.wikipedia.org/wiki/Википедија:Администратори\">администратор</a> за да поразговарате за блокот. + Не сте најавени + Откако ќе направите уредување, ќе ви биде создадена <b>привремена сметка</b> за да ви се заштити приватноста. <a href=\"%1$s\">Дознајте повеќе</a>.<br /><br /><a href=\"https://#login\">Најавете се</a> или <a href=\"https://#login\">Создајте сметка</a> за да добивате заслуги за сите идни уредувања и други можности. + Вашето уредување ќе му се припише на %1$s. Вашата IP-адреса ќе биде видлива за администратори.<br /><br />Ако <a href=\"https://#login\">се најавите</a> или <a href=\"https://#login\">создадете сметка</a>, вашите уредувања ќе му се припишуваат на име што вие ќе го одберете, меѓу други поволности. + Јасно + Користите привремена сметка + Отфрли промени и најави ме + + Создадена е привремената сметка %1$s откако беше објавено вашето уредување. Таа ќе истече за %2$d ден. + Создадена е привремената сметка %1$s откако беше објавено вашето уредување. Таа ќе истече за %2$d дена. + + + Сметката ќе истече за %d ден. + Сметката ќе истече за %d дена. + + <b>Не сте најавени.</b> Откако ќе направите уредување, ќе ви биде создадена привремена сметка за да ви се заштити приватноста. <a href=\"%1$s\">Дознајте повеќе</a> + <b>Користите привремена сметка.</b> Вашето уредување му е припишано на %1$s. <a href=\"%2$s\">Дознајте повеќе</a>. + <b>Моменталално користите приврмена сметка.</b> Уредувањата направени од привремената сметка %1$s нема да се префрлат во трајната сметка кога ќе се најавите. Најавете се или направете сметка за уредувањата да му се припишуваат на вашето корисничко име, меѓу други поволности. + Заврши седница + Ова ќе ве одјави од вашата привремена сметка. Сакате да продолжите? Грешка во прилогот За жал, прилогот наиде на грешка и беше запрен.\n\nДали би сакале да почнете одново или да напуштите? Почни одново @@ -1461,7 +1480,7 @@ Здраво! Сакам да споделам список за читање со вас: Можете ли да ни помогнете да го подобриме „Споделување на списоци за читање“? „Споделување на списоци за читање“ е пробна функција и ни требаат ваши мислења за да ја подобриме или отстраниме. - Создавајте ваши предупредувачки пораки или користете <a href=\"#\">примерни пораки</a> за да почнете. + Создавајте ваши пораки или користете <a href=\"#\">примерни пораки</a> за да почнете. Нова порака Наслов Напиши порака diff --git a/app/src/main/res/values-mnw/strings.xml b/app/src/main/res/values-mnw/strings.xml index de1fa4ad655..7382f42cebe 100644 --- a/app/src/main/res/values-mnw/strings.xml +++ b/app/src/main/res/values-mnw/strings.xml @@ -640,6 +640,7 @@ စဳရေၚ် တၚ်မကဵုသမ္တီဂမၠိုၚ် စဳရေၚ် တၚ်မကဵုသမ္တဳဂမၠိုၚ် သၠုၚ်ပတိုန် ဘာသာမန် ပ္ဍဲ အေပဳပဳ + ဟွံဂွံဗှ်ဏီ ဟိုတ်နူ မၞး ဗှ် ဂဇျောမ် လိက်ပရေင် လၟက် diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index e2726c92f22..e3c503cca51 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1252,6 +1252,7 @@ Meldingstittel Publiser Avbryt + Ikke lagre Melding publisert på bidragsyterens brukerdiskusjonsside Melding lagret og publisert på bidragsyterens brukerdiskusjonsside Denne diskusjonssiden er tom. @@ -1485,6 +1486,8 @@ Beskjedene har blitt slettet Tittelen kan ikke være tom. + Dine meldinger + Eksempelmeldinger Søk i eller filtrer redigeringer Tagger: %s Ingen diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9e14c9b81be..2b9dfcb2b8d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -26,6 +26,7 @@ * HenriqueCrang * Iohanen * Isabelle Belato +* Lc97 * Lowvy * Luk3 * Macofe @@ -1237,6 +1238,7 @@ Discussão: %s Novo tópico Tópico postado. + Não salve Esta página de discussão está vazia. A conversa começa aqui É nas páginas de discussão que as pessoas debatem como tornar o conteúdo da Wikipédia o melhor possível. Comece por adicionar um tópico de discussão novo para estabelecer uma ligação e colaborar com uma comunidade de wikipedistas. @@ -1247,6 +1249,7 @@ Compor mensagem A mensagem não pode estar vazia. O assunto não pode estar vazio. + O assunto já existe. Tente um diferente. Resposta postada. Desfazer <b>Última edição %1$s</b> por %2$s @@ -1438,6 +1441,10 @@ Olá! Gostaria de compartilhar a minha lista de leitura da Wikipédia com você: Pode nos ajudar a melhorar \"Compartilhar listas de leitura\"? \"Compartilhar listas de leitura\" é um recurso de teste e precisamos do seu feedback para melhorá-lo ou removê-lo. + Crie suas próprias mensagens ou use <uma href=\"#\">mensagem de exemplo</a> para iniciar. + Suas mensagens + Mensagens exemplo + Use a mensagem exemplo abaixo para personalizar, enviar e salvar suas mensagens. Aceitar Recusar diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 1b6769dbc5b..a3098a1aa31 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -14,6 +14,7 @@ * Kimberli Mäkäräinen (WMNO) * Kizule * KuboF +* Lc97 * Liuxinyu970226 * MarcoAurelio * Matma Rex @@ -40,9 +41,9 @@ * Zoranzoki21 --> - Name of the application.\n{{Identical|Wikipedia}} - Name of the beta version of the application.\n{{Identical|Wikipedia Beta}} - Name of the alpha version of the application. + {{Doc-protected-established}}\n\nName of the app as it will appear on the home screen. Should be the canonical, locally-trademarked name of Wikipedia, and identical to these messages:\n* iOS app name: {{msg-wm|Wikipedia-ios-meta-CFBundleDisplayName}}\n* Portal site name: {{msg-wm|Portals-wiki.name}}\n{{Identical|Wikipedia}} + {{Doc-protected-established}}\n\nName of the beta version of the application.\n{{Identical|Wikipedia Beta}} + {{Doc-protected-established}}\n\nName of the alpha version of the application. Wikimedia\'s name.\n{{Identical|Wikimedia}} Button label for navigating to the previous page.\n\n{{Identical|Back}} Back button description when exiting tabs of an article.\n{{Identical|Back}} @@ -454,6 +455,8 @@ Label stating the expiry date of the block. The %s symbol is replaced by the date. Label stating the ID of the block. The %s symbol is replaced by the ID. Text that explains how to get in touch with the user or administrator that created the block. The %1$s symbol is replaced by the username of the blocker, and %2$s is replaced by a URL that leads to the user page of the blocker. + Tooltip message text for customizing menu options on article screen + Text that explains how to get in touch with an administrator that created the block. Title of dialog informing the user that a temporary account is being used. Body text of dialog explaining that a temporary account is being used. Please preserve HTML formatting. The %1$s symbol is replaced with a URL. Body text of dialog explaining that a temporary account is being used. Please preserve HTML formatting. The %1$s symbol is replaced with a URL. @@ -473,8 +476,6 @@ Status message shown while editing, explaining that a temporary account named %1$s is being used. Please preserve HTML formatting. Button label for discarding the current temporary account. Confirmation message for logging out of a temporary account. - Tooltip message text for customizing menu options on article screen - Text that explains how to get in touch with an administrator that created the block. Title of the retry screen displayed when the app crashes. Message shown to user when the app crashes allowing them to relaunch or quit the app. Title of button user presses to relaunch the app after it crashes. @@ -1311,7 +1312,7 @@ Hint for text field for composing a new talk page topic. Error message shown when the talk page message is empty. Error message shown when the talk page subject is empty. - Error state text shown to user when they are trying to create a talk messgage with duplicate subject. + Error state text shown to user when they are trying to create a talk message with duplicate subject. Message shown when the response has been submitted. Button label to undo the operation of submitting the response.\n\n{{Identical|Undo}} Label for the last modified date of the talk page. Please preserve the %1$s and %2$s parameters, since these will be replaced with the actual date and user name.\n\nShould be similar to this MediaWiki messages such as this: {{msg-mw|Mobile-frontend-last-modified-with-user-hours}} diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 16dc5d5cf1d..255ab85d1e7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1342,6 +1342,7 @@ Заголовок сообщения Опубликовать Отмена + Не сохранять Эта страница обсуждения пустая. Обсуждение начинается здесь Ответить @@ -1351,6 +1352,7 @@ Написать сообщение Сообщение не может быть пустым. Тема не может быть пустой. + Название субъекта занято. Введите другое. Ответ опубликован. Отменить <b>Последняя правка сделана %1$s</b> участником %2$s @@ -1546,6 +1548,7 @@ Привет! Я хотел бы поделиться с тобой своим списком для чтения из Википедии: Могли бы вы помочь нам улучшить «Поделиться списком для чтения»? «Поделиться списком для чтения» — тестовый функционал, и нам была бы полезная ваша обратная связь, чтобы в дальнейшем улучшить или удалить этот функционал. + Создайте свои собственные сообщения или используйте <a href=\"#\">примеры сообщений</a> , чтобы начать работу. Новое сообщение Тема Написать сообщение @@ -1632,6 +1635,7 @@ Обратная связь отправлена. Предупреждение о нарушении авторских прав Судя по всему, ваша недавняя правка без разрешения содержит материалы, защищенные авторским правом. Пожалуйста, убедитесь, что весь контент соответствует политике [[Wikipedia:Авторские права|авторское право]] этой Википедии, чтобы избежать удаления. + Используйте примеры сообщения ниже для настройки, отправки и сохранения его в своих сообщениях. Принять Отклонить Проблемы страницы diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml index 218590c00fd..34fc74647cf 100644 --- a/app/src/main/res/values-sd/strings.xml +++ b/app/src/main/res/values-sd/strings.xml @@ -111,8 +111,8 @@ ٻي ٻوليءَ ۾ پڙھو %d ٻولين ۾ موجود ڪڪ بو-سا 4.0 - ڇاپڻ سان، توهان <a href=\"%1$s\">استعمال جي شرطن</a> سان، ۽ بغير رد ڪئي پنھنجون ڀاڱيداريون <a href=\"%2$s\">سيسي بي.واءِ-ايس.اي 3.0</a> اجازتنامي جاري ڪرڻ لاءِ راضي آھيو. - ڇاپڻ سان، توهان <a href=\"%1$s\">استعمال جي شرطن </a> ۽ بغير رد ڪئي پنھنجون ڀاڱيداريون <a href=\"%2$s\">سيسي بي.واءِ-ايس.اي 3.0</a> اجازتنامي ھيٺ جاري ڪرڻ لاءِ راضي آھيو. سنوارون توھان جي آئِپي پتي سان منتسب ڪيون وينديون. جيڪڏهن توهان <a href=\"https://#login\">داخل ٿيو</a> ٿا، تہ توھان کي وڌيڪ نويڪلائي هوندي. + ڇاپڻ سان، توهان <a href=\"%1$s\">استعمال جي شرطن</a> سان، ۽ بغير رد ڪئي پنھنجون ڀاڱيداريون <a href=\"%2$s\">CC BY-SA 4.0</a> اجازتنامي ھيٺ جاري ڪرڻ لاءِ راضي آھيو. + ڇاپڻ سان، توهان <a href=\"%1$s\">استعمال جي شرطن </a> ۽ بغير رد ڪئي پنھنجون ڀاڱيداريون <a href=\"%2$<a href\n=\"%2$s/\">CC BY-SA 4.0</a> اجازتنامي ھيٺ جاري ڪرڻ لاءِ راضي آھيو. سنوارون توھان جي آئِپي پتي سان منتسب ڪيون وينديون. جيڪڏهن توهان <a href=\"https://#login\">داخل ٿيو</a> ٿا، تہ توھان کي وڌيڪ نويڪلائي هوندي. سنوارون توهان جي ڊوائيس جي آئپي پتي ڏانھن منسوب ڪيون وينديون. جيڪڏھن توھان <a href=\"https://#login\">داخل ٿيو</a> ٿا، تہ اوھان کي وڌيڪ نويڪلائي ملندي. وڪيپيڊيا ٻوليون ڳوليو @@ -122,6 +122,7 @@ اوهانجون وڪيپيڊيا ٻوليون تبديليون ڇاپيو سنوار ڇپي وئي! + سنوار ڇپجي وئي! تبديليون ظاھر ٿيڻ ۾ وقت وٺي سگهن ٿيون. سنوار ناڪام! ٻيهر ڪوشش ڪريو رد @@ -164,6 +165,8 @@ توھان وڪيپيڊيا مان ٻاھر نڪري چڪا آھيو. ڇا توھان ٻيھر داخل ٿيڻ پسند ڪندا؟ داخل ٿيو رد + کاتو گم ڪريو + کاتو گم ڪرڻ تي چِتاءُ ڪي بہ تازا ڏٺل صفحا ڪونھن توھان ھتي جيڪو ڪجهہ پڙھي رھيا آھيو ان تي نظر رکو. سوانح ۾ ڪجهہ مضمون آفلائين دوران ڏسڻ-قابل ٿي نٿا سگهن. @@ -237,7 +240,7 @@ ترجميڪارَ هيءَ ايپ <a href=\"https://translatewiki.net\">translatewiki.net</a> تي موجود رضاڪار ترجميڪارن ترجمو ڪري ڏني. اجازتنامو - ذريعي جو ڪوڊ <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">جَيرٽ</a> ۽ <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">جِٽ-ھب</a> <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">اپاچي 2.0 اجازتنامي ھيٺ موجود آھي</a>. جيسيتائين ٻي صورت واضع نہ ڪئي وڃي، مواد <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License\">ڪريئيٽو ڪامنز ھڪجھڙي-ونڊ-انتساب اجازتنامي ھيٺ موجود آھي</a>. + ذريعي جو ڪوڊ <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">جِٽ-ھب</a> تي <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">اپاچي 2.0 اجازتنامي</a> ھيٺ موجود آهي. جڏھن تہ مواد <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">ڪريئيٽو ڪامنز ھڪجھڙي-ونڊ-انتساب اجازتنامي</a>> ھيٺ موجود آھي، جيسيتائين ٻي صورت واضع نہ ڪئي وڃي. <a href=\"https://wikimediafoundation.org/\">وڪيميڊيا فائونڊيشن</a> جي مصنوع بابت هيءُ صفحو بدلائجي چڪو آهي. توهان کي پڪ آهي تہ توهان تبديليون سانڍڻ کان سواءِ ڇڏي وڃڻ چاهيو ٿا؟ @@ -253,6 +256,9 @@ اڻڪريو وري-ڪريو واپس ورايو + چِتاءُ ڏيو + %s نقصان + %s نيت %s بائيٽ %s بائيٽون @@ -265,6 +271,7 @@ ٻيو هن صفحي کي توهان ٻين ڪهڙن طريقن سان سڌاريو سنوار ۾ تضاد + صفحو اڳ ۾ ئي ڪنھن ٻي واپرائيندڙ پاران تبديل ڪيو ويو آھي، ۽ توھان جي سنوار سان ٽڪراءَ ۾ آھي. مھرباني ڪري پنھنجيون تبديليون نقل ڪريو، واپس وڃو ۽ صفحي کي ريفريش ڪريو، پوءِ ٻيھر سنوارڻ جي ڪوشش ڪريو. سنوار جا اطلاع مھرباني ڪري سنوارڻ کان اڳ پڙھو سنوار جا اطلاع پاڻمرادو ڏيکاريو @@ -297,6 +304,8 @@ وڪيپيڊيا نمايان صفحو اڄ جو چونڊ صفحو: وڪيپيڊيا ڳولا + وڪيپيڊيا ۾ ڳولا ڪرڻ جو تيز ترين طريقو + بھترین مضمون جيڪي وڪيپيڊیا پيش ڪري ٿي ڪي بہ اطلاع نہ لڌا. نئين الفا جدت موجود آهي اتارڻ لاءِ ٺونگو ھڻو @@ -342,6 +351,7 @@ مضمون کي ڪنھن پڙھڻ جي فھرست ۾ وجھڻ لاءِ ڪتاب-نشاني جي نشان کي ڇھو. صفحي کي جھانگُوءَ ۾ ڏسو عنوان جي فھرست تڪڙي رسائي + توھان ھاڻي کاٻي پاسي سوائپ ڪري مواد جي فھرست کي کولي سگهو ٿا، ۽ پڻ ٽيپ ڪريو ۽ ڇڪيو ھن اسڪرولر بٽڻ کي جلدي ٽپو ڏيڻ لاءِ مضمون جي مختلف حصن ڏانھن. ھاڻي توھان ايپ ۾ وڪيپيڊيا جي گهڻين ئي ٻولين ۾ ڳولي ۽ پڙھي سگهو ٿا.\n\n\nوڌيڪ ٻوليون وجهن لاءِ آئڪن کي ڇُھو. سرور جي جواب کي درست نموني منھن نہ ڏنو ويو. اڻجاتل چُڪَ واقع ٿي. @@ -356,6 +366,7 @@ آفلائين ھجڻ وقت صفحو لاھي نٿو سگهجي. اشارو:ڪو بہ مضمون پنھنجي پڙھڻ جي فھرست ۾ شامل ڪريو ان کي لاٿو ويندو جڏھن توھان ٻيھر آنلائين ٿيندئو. توھان %s تي سانڍيل ھن مضمون جو ھڪ آفلائين ورجاءُ پڙھي رھيا آھيو. + \"%s\" کان چوريل ھدايتون حاصل ڪريو ھدايتون مھيا ڪندڙ ڪي بہ ايپس لڀجي نہ سگھيون. پھچ کوجيو @@ -378,6 +389,11 @@ %d چونڊيل ڪا خرابي پيش آئي برخواست ڪريو + پڙهو + سانڍيو + سانڍجي ويو + ونڊيو + ھي مضمون ڪچو آھي، جنھن جو مطلب آهي تہ پيشِ-نگاھ ڏيکاعڻ لاءِ مضمون ۾ ڪو گهڻو مواد نہ آھي. البتہ، توھان ان کي تبديل ڪري سگهو ٿا. ھي صفحو وجود نٿو رکي انٽرنيٽ سان ڳنڍي نٿو سگهي وڪيپيڊيا سان ڳنڍجي نٿو سگهجي. پنھنجي نيٽورڪ ڪنيڪشن کي چڪاسيو، يا بعد ۾ ٻيھر ڪوشش ڪريو @@ -397,6 +413,11 @@ بندش آئڊي: %s پنھنجي اوزارپٽي مرضي مطابق بڻايو توھان ڪنھن <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">منتظم</a> سان رابطو ڪري بندش بابت ڳالھائي سگهو ٿا. + توھان داخل ٿيل نہ آھيو + سمجهي ويس + توهان هڪ عارضي کاتو استعمال ڪري رهيا آهيو + تبديليون ڦٽو ڪريو ۽ داخل ٿيو + سيشن ختم ڪريو ايپليڪيشن جي چُڪَ اسان معذرتخواھ آهيون، وڪيپيڊيا ايپ هڪ خرابي کي منھن ڏنو ۽ بند ٿي وئي.\n\nڇا توهان ٻيهر شروع ڪرڻ پسند ڪندئو يا بس؟ شروع ڪريو @@ -425,7 +446,9 @@ سنوارڻ پڙھڻ تي ڌيان جو موڊ سنوارڻ جون خصوصيتون ۽ ھيٺيئن اوزار پٽي اسڪرول ڪرڻ تہ لڪائي ڇڏي ٿو + سنٽيڪس نمايان ڪرڻ سٽ نمبر ڏيکاريو + مونو اسپيس فونٽ استعمال ڪريو لکڻ جو صلاحون ڏيکاريو سانڍيل پڙھڻ جي فھرست ۾ سانڍيو @@ -637,6 +660,8 @@ تڏھن حاصل ٿيندي جڏھن توھان جي بطور واپرائيندڙ حقن ۾ بدلاءُ ٿيندو توھان پاران سرجيل مضمون ڏانھن ڳنڊڻا تڏھن ملندا جڏھن توھان پاران سرجيل صفحي ڏانھن ڪو نئون ڱنڍڻو جوڙيو وڃي + ڌڪيل اطلاع + ڌڪيل اطلاعن کي پنھنجي حساب سان ترتيب ڏيو ڊسپلي ترتيبون پڙھيل اطلاع لڪايو وڪيپيڊيا @@ -665,8 +690,8 @@ سڀني تان نشان ختم ڪريو وڪي ڇاڻي ڇاڻي جو قسم - سڀ \"وڪي\" - سڀ \"قسم\" + سڀ وڪيز + سڀ قسم %s جو بحث صفحو آفلائين ھجڻ دوران ھي فنڪشن موجود نہ آھي. ڇو تہ توھان پڙھو ٿا @@ -760,6 +785,8 @@ ننڍي شڪل واري اکر سان شروع ڪرڻ کان پاسو ڪريو. متن غيرمتوقع ٻولي ۾ محسوس ٿي ٿو. ٻولي %s ھجڻ گهرجي. مھرباني ڪري پڪ ڪريو تہ توھان جي تشريح %1$s ۾ آھي. هن چِتاءَ کي نظر انداز ڪرڻ لاءِ آزاد محسوس ڪريو جيڪڏهن توهان جيڪا وضاحت لکي آهي اها %2$s ۾ آهي. + صلاح ڏنل تشريحون ڏيکاريو + مشين طرفان صلاح ڏنل مضمونن جون تشريحون آزمايو مضمون جي تشريح ڇپجي وئي! مضمون جي تشريح ڇپجي وئي! مضمون جي تشريح ڇپجي وئي (%s) @@ -778,6 +805,7 @@ سنوارڻ شروع ڪريو شروع ڪرڻ سان، مان واعدو ٿو ڪريان مان ھن خصوصيت جو غلط استعمال نہ ڪندس. مشين پاران ڏسيل + صلاحون مشين پاران جوڙيون ويون آھن، نہ ڪي رضاڪارن يا وڪيميڊيا فائونڊيشن پاران اوزارپٽي مرضي مطابق بڻايو ھيٺئين اوزارپٽيءَکي 5 شارٽ ڪٽس سان ترتيب ڏيو جيڪي توھان کي تمام گهڻو مددگار لڳن ٿا. اوزارپٽي @@ -787,6 +815,7 @@ مضمونن کي بيان ڪريو عڪسن کي عنوان ڏيو عڪسن کي ٽيگ ھڻو + نظرثاني مضمون جي تشريح جي نظرثاني ڪريو تشريح ڏيو تشريح سنواريو @@ -859,6 +888,7 @@ ٽيگ ڳوليو توھان ھن عڪس لاءِ ڪي بہ ٽيگ ناھن چونڊيا ٽيگ وجهو + اڻ ڇپيل ٽيگ محفوظ نہ ڪيا ويندا ھن عڪس کي وڏو ڪرڻ لاءِ چونڊي پايو. %s، توھان جي سنوارن لاءِ مھرباني. ھيٺ توھان وڪيپيڊيا ۾ ڀاڱيداري ڪرڻ جا وڌيڪ طريقا ڏسي سگهو ٿا. <b>سلام %s</b>، ھيٺ توھان وڪيپيڊيا کي بھتر ڪرڻ جا تڪڙا ۽ آسان طريقا ڏسي سگهو ٿا. توھان جيئن شروعات ڪندا، ان کانپوءِ توھان جيڪو فرق پيدا ڪريو ٿا اھو ڏسي سگهندا. خوشگوار سنوارڪاري! @@ -897,9 +927,11 @@ آئپي تي بندش وڌل آھي آخري دفعو سنواريل ڪڏهن بہ نہ - نوان + نوان + ڇاپڻ سان، توهان <a href=\"%1$s\">استعمال جي شرطن</a> سان، ۽ بغير رد ڪئي ھي ڀاڱيداري <a href=\"%2$s\">CC0 اجازتنامي</a> ھيٺ جاري ڪرڻ لاءِ راضي آھيو. ڏسيل سنوارون وڪيپيڊيا کي سنوارڻ لاءِ مھرباني! ڇو نہ اتان شروع ڪجي جتان ڇڏيوسين؟ + وڪيپيڊيا کي بھتر ڪرڻ لاءِ ھڪ منٽ آھي؟ تبديلين جون ھي صلاحون ڏسو. %s جون ڀاڱيداريون ٻولي تاريخ / وقت @@ -907,6 +939,10 @@ عڪس مضمون %s ڏيک + + گذريل 30 ڏينھن ۾ ھڪ ڀيرو ڏٺو ويو. + گذريل 30 ڏينھن ۾ %s ڀيرا ڏٺو ويو. + گذريل 30 ڏينھن ۾ %s ڀيرا ڏٺل توھان %d ٽيگ وڌو @@ -921,6 +957,9 @@ وڌيڪ ڏسيل سنوارون ڏسيل تشريحون توھان ڇا رپورٽ ڪرڻ چاھيندا؟ + مناسب معلومات ناھي + صلاح ڏنل تشريحون نہ ٿا ڏسي سگهو + غير مناسب صلاحون ڪم سمجهہ ۾ نٿو اچي رپورٽ ڪريو رپورٽ اماڻي وئي @@ -940,6 +979,39 @@ توھان وڌو %d ھڪ حرف توھان وڌا %d حرف + مضمون جا عڪس + سمجهہ کي وڌائڻ لاءِ وڪيپيڊيا جي مضمونن ۾ صلاح ڏنل عڪس شامل ڪريو. + ڇا توھان ھن عڪس کي مضمون ۾ شامل ڪندا؟ + سکيانامو + ھا + نہ + پڪ ناھي + ڇو نہ؟ + توھان جا جواب ايندڙ صلاحن کي بھتر ڪن ٿا. + عڪس لاڳاپيل نہ آھي + فيصلي ڪرڻ لاءِ مناسب معلومات ناھي + عڪس چڙڏياريندڙ آھي + عڪس گهٽ معيار جو آھي + آئون ھي موضوع نٿو ڄاڻان + ٻيو ڪو سبب + اماڻيو + صلاح ڏنل سنوارن ۾ ايندڙ مضمونن ۾ کٽل عڪس شامل ڪريو + عڪس ماڻهن کي سمجهڻ ۾ مدد ڪن ٿا، پر گهڻن مضمونن ۾ اھي نہ آھن. + توھان فيصلو ڪندا تہ وڪيپيڊيا مضمون ۾ ڏسيل عڪس رکيو وڃي يا نہ. + صلاحون مشين پاران جوڙيل آھن ۽ توهان فيصلو ڪرڻ لاءِ پنھنجو فيصلو استعمال ڪندا تہ انهن کي قبول ڪجي يا رد ڪجي. + عڪس وڪيميڊیا ڪامنس مان آھن، آزاد لائسنس ٿيل عڪسن جو مجموعو جيڪو وڪيپيڊیا پاران استعمال ڪيو ويندو آھي. + ھن مضمون جو جائزو وٺو ان جي موضوع کي سمجھڻ لاءِ + عڪس ۽ ان سان جُڙيل معلومات جو معائنو ڪريو + فيصلو ڪريو تہ ڇا عڪس پڙهندڙن کي هن موضوع کي بھتر سمجهڻ ۾ مدد ڪري ٿو + اڳيون + مھرباني ڪري مضمون جو جائزو وٺو ان جي موضوع کي سمجھڻ لاءِ ۽ عڪس جو معائنو ڪريو + معاف ڪجو، هن وقت وڌيڪ صلاح ڏنل عڪس موجود نہ آھن. مھرباني ڪري ٻيون <a href=\"#\">صلاح ڏنل سنوارون</a> ڏسو يا بعد ۾ واپس اچو. + خاصيت ۾ مسئلو آھي + صلاح ڏنل سنوارن ۾ مسئلو آھي + عڪس شامل ٿي ويو + عنوان شامل ٿي ويو + عڪس ۽ عنوان شامل ٿي ويا + ڏسو فائيل صفحو عڪس کي عنوان ڏيو عڪس جا ٽيگ وجهو @@ -959,6 +1031,7 @@ شروع ڪريو بعد ۾ شايد کوجڻ جا نوان گس + ڊيٽا ۽ رازداري استعمال جي ڊيٽا موڪليو سمجھي ويئو اسان توھان جي اوزار تي ھي لڌيون آھن: @@ -1020,6 +1093,7 @@ ننڍو متن ڪوڊ ڳنڍڻو + ھيٺين-سرخي %d فارميٽنگ سرخيون ميڊيا وجهو @@ -1028,13 +1102,16 @@ سانچو حوالو پيش-نگاھ ڳنڍڻو + ڪنھن واپرائيندڙ کي مينشن ڪريو ميڊيا وجهو وڪيميڊيا ڪامنز مان ڪو فائيل چونڊيو ميڊيا ڳوليو - ميڊيا ترتيبون + عڪس تفصيل شامل ڪريو چڙھيل عڪس - عنوان + عڪس جو عنوان + مضمون ۾ عڪس جو ظاھر ٿيل ليبل متبادل متن + بصارت کان محروم پڙهندڙن لاءِ تشريح اعليٰ ترتيبون متن کي عڪس جي چوڌاري ويڙھيو عڪس جي بيھڪ @@ -1054,6 +1131,14 @@ اوچائي px وجهو + سانچا ڳوليو + درج ڪريو + مثال طور %s + %s (اختياري) + %s (صلاح ڏنل) + وڌيڪ ڄاڻيو + سانچا واپرائيندڙن پاران جوڙيا ويندا آھن، ممڪن آھي تہ انهن ۾ مڪمل تشريح نہ ھجي. + \" %s \" سانچي ۾ اڃا تائين ڪا تشريح ناهي. مدد وڪيپيڊيا ۾ داخل ٿيو/ شامل ٿيو سلام %s، ڇا توھان کي ڄاڻ ھئي تہ ھرڪو وڪيپيڊيا کي سنواري سگهي ٿو؟ @@ -1068,6 +1153,18 @@ بحث: %s نئون موضوع موضوع پوسٽ ڪيو ويو. + چِتاءُ ڏيو + تبديليون سانڍيو + نئين نياپي طور محفوظ ڪريو + فھرست ۾ نئين نياپي طور محفوظ ڪريو + موجوده نياپي کي اپڊيٽ ڪريو + نياپي جو عنوان + ڇاپيو + رد ڪريو + نہ سانڍيو + سنواريندڙ جي بحث صفجي تي نياپي کي ڇاپيو ويو + نياپي کي سانڍيو ويو ۽ سنواريندڙ جي بحث صفجي ڇاپيو ويو + سانڍيل نياپا ھي بحث صفحو خالي آھي. گفتگو هتي شروع ٿئي ٿي بحث صفحن تي ماڻھو ڳالھائيندا آهن تہ ڪيئن وڪيپيڊيا مواد کي بھترين طريقي سان ٺاهيو وڃي. وڪيپيڊينس جي برادريءَ سان ڳنڍجڻ ۽ تعاون ڪرڻ لاءِ هڪ نئون بحث موضوع شامل ڪري شروعات ڪريو. @@ -1078,10 +1175,13 @@ نياپو لکو نياپو خالي نٿو ٿي سگهي. موضوع خالي نٿو ٿي سگهي. + موضوع جو نالو اڳ ئي موجود آھي. ڪو ٻيو آزمايو. ورندي پوسٽ ڪئي وئي. اڻڪريو <b>%1$s کي آخري ڀيرو</b> %2$s سنواريو + بح صفحا استعمال ڪرڻ لاءِ مھرباني. ڇا توھان سروي ۾ حصو وٺي ايپ کي بھتر ڪرڻ ۾ اسان جي مدد ڪري سگهو ٿا؟ شروع ڪريو + وڪيپيڊيا - بحث صفحي جي موضوع تي گفتگو \"%s\" وڪيپيڊيا - بحث صفحي تي گفتگوئون نياپا لھو ڳولا جا موضوع @@ -1149,7 +1249,11 @@ ڪڍيل سِٽ وڌل پيراگراف ڪڍيل پيراگراف - سنوار اڻڪريو + ھن ورجاءَ ۾ ڪيل تبديليون عوامي طور حاصل نہ ٿيون ڪري سگهجن. + ڇا توھان پڪ سان ھي سنوار واپس ورائڻ چاھيو ٿا؟ + اڻڪرڻ جو مطلب ھڪ يا وڌيڪ سنوارن جا اثر ورائڻ آھي. + تَتُ (اختياري) + ورائڻ جو سبب ونڊيو ورجاء کي ختم ڪيو ويو. ڇا توھان کي پڪ آھي تہ توھان سنوارن کي واپس ورائڻ چاھيو ٿا؟ سنوارون موٽايون ويون @@ -1200,6 +1304,7 @@ نوان ايندڙ سکندڙ تجربيڪار واپرائيندڙ + ڀاڱيداري ڪندڙ مون پاران تبديليون ٻين پاران تبديليون پاڻمراديون ڀاڱيداريون @@ -1250,6 +1355,7 @@ ميڊيا کي هلائڻ ۾ چُڪَ. ڀاڱيداريون ڀاڱيداريون ڇاڻيو: + نقشي تي ڏسو ونڊيل فھرست درآمد ڪريو *نئون* ھڪ پڙھڻ جي فھرست توھان سان ونڊي وئي آھي @@ -1260,6 +1366,131 @@ سلام! آئون توھان سان پنھنجي وڪيپيڊيا جي پڙھڻ جي فھرست ونڊڻ چاھيندس: ڇا توھان \"پڙھڻ جون فھرستون ونڊيو\" ۾ اسان جي مدد ڪري سگهو ٿا؟ \"پڙھڻ جون فھرستون ونڊيو\" ھڪ آزمائشي خصوصيت آھي ۽ ان کي بھتر ڪرڻ يا ھٽائڻ لاءِ اسان کي توھان جي موٽ جي ضرورت آھي. + نئون نياپو + موضوع + نياپو لکو + سانڍيو + تبديليون سانڍيو + عنوان شامل ڪريو ۽ نياپو سانڍيو. + نياپي جو عنوان + سانڍيو + رد ڪريو + سانچو \" %s \" اڳ ۾ ئي موجود آهي. + پيغام محفوظ ڪيو ويو آهي + نياپو سنواريو + سانڍيو + ڊاھيو + نياپو اپڊيٽ ڪيو ويو آهي + نياپو ھٽايو + + پيغام ڊاهيو ويو آهي + پيغام ڊاهيا ويا آهن + + عنوان خالي نہ ٿو ڇڏي سگهجي. + توهان جا نياپا + مثالي نياپا + سنوارون ڳوليو يا ڇاڻيو + ٽيگَ: %s + ڪوبہ نہ + واپرائيندڙ جو صفحو ڏسو + بحث صفحو ڏسو + واپرائيندڙ جي معلومات + واپرائيندڙ جون ڀاڱيداريون ڏسو + مھرباني چئو + واپرائيندڙ جي معلومات + <b>ھن وقت کان کاتو:</b> %s + <b>سنوارن جو انگ: </b> %s + بند ڪريو + ڇاڻيون + ٻيھر مرتب ڪريو + وڪي + سڀ + واپرائيندڙن جي رجسٽريشن ۽ تجربو + رجسٽر نہ ٿيل + سنواريندڙ جيڪي داخل ٿيل ناھن. + رجسٽر ٿيل + داخل ٿيل سنواريندڙ. + نوان ايندڙ + رجسٽر ٿيل سنواريندڙ جن جون 10 کان گهٽ سنوارون آھن ۽ 4 ڏينھن کان گهٽ سرگرم آھن. + سکندڙ + رجسٽر ٿيل سنواريندڙ جن جو تجربو \"نون ايندڙن\" ۽ \"تجربيڪار واپرائيندڙن\" جي وچ ۾ اچي ٿو. + تجربيڪار واپرائيندڙ + رجسٽر ٿيل سنواريندڙ جن جون 500 کان مٿي سنوارون آھن ۽ 30 ڏينھن کان مٿي سرگرم آھن. + تازاترين ورجاءَ + تازوترين ورجاءُ + تازوترين ورجاءُ نہ آھي + پاڻمراديون ڀاڱيداريون + بوٽ + انسان (بوٽ نہ) + اهميت + معمولي سنوارون + غير-معمولي سنوارون + ڀاڱيداريءَ جي معيار جون اڳڪٿيون + گهڻو ڪري سٺي + مسئلا ٿي سگهن ٿا + امڪان آهي تہ مسئلا ھوندا + گهڻو امڪان آهي تہ مسئلا ھوندا + واپرائيندڙ جي نيت جون اڳڪٿيون + گهڻو ڪري نيڪ نيتيءَ سان ڪيل + شايد بدنيتيءَ سان ڪيل + ممڪنہ طور بدنيتيءَ تي ٻڌل + گهڻو ڪري بدنيتيءَ سان ڪيل + + %d ڇاڻي + %d ڇاڻيون + + مضمون جي سنوار سوانح + واپس ورائڻ مڪمل + مڪمل واپس موٽايو + ڏسو + خاصيت ۾ مسئلو آھي + وڌيڪ ڄاڻيو + مھرباني چئو + نظر۾رکو + چِتاءُ ڏيو + اڻڪريو/واپس موٽايو + ھن خصوصيت کي بھتر ڪرڻ ۾ اسان جي مدد ڪريو + ڇا توھان ھن خصوصيت سان مطمئن آھيو؟ + مطمئن + اڻڌريو + غير مطمئن + اسان خصوصيت کي ڪيئن بھتر ڪري سگهون ٿا؟ + مضمون جي سنوار سوانح + موٽ + اماڻيو + موٽ اماڻجي وئي. + تخريبڪاري جو چِتاءُ + سنوارڻ جون ٽيسٽون + اڻڌريو نقطۂ نظر + پاڻمرادو ترجمو + دلچسپين جي تڪرار جو ياد ڏياريندڙ + اخري چِتاءُ + ڪاپي رائيٽ جي خلاف ورزي جي خبرداري + سنوار جو تَتُ ڏيو + سينسر نہ ڪريو + مضمون بھتر ڪرڻ جي صلاح + سنواريو قبوليو رد ڪريو + صفحي جا مسئلا + معمولي بگ جي اصلاح ۽ واڌارا + اسان توهان کي سڀاڻي ٻيھر ياد ڏيارينداسين. + مھرباني، پيارا مدد ڪندڙ! توهان جي سخاوت وڪيپيڊيا ۽ ان جي ڀينر سائيٽن کي ترقي وٺرائڻ ۾ مدد ڪري ٿي. + واپس وڃو + سسٽم برائوزر ۾ کوليو + ماڳ + نقشي تي توھان جي جڳھ کي ڏسڻ لاءِ جڳھ جي اجازت گهربل آھي. مھراني ڪري ٻيھر ڪوشش ڪريو. + ماڳ ڳوليو + ٻولي ڇاڻيو + نقشو + فھرست + ماگ خصوصيت سان پنھنجي چوڌاري وڪيپيڊيا مضمونن کي ڳوليو + ھن مضمون جي مڪانيت ڏسڻ لاءِ \'نقشي تي ڏسو\' تي ٽيپ ڪريو + ڏاڍو مطمئن + ڏاڍو غير مطمئن + \'ماڳ\' کي بھتر ڪرڻ ۾ مدد ڪريو + \"ماڳ\" کي ڪيئن بھتر ڪري سگهجي ٿو؟ + رد ڪريو + توھان ڇا ٿا چاھيو جنھن کي اسان تبديل يا بھتر ڪريون؟ + هي علائقو خالي آهي. <a href=\"#\">نقشي تي</a> وڏو ڪريو. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index cc8bee54ddd..20f21e24311 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -427,6 +427,21 @@ Почетак блокаде: %s Истек блокаде: %s ID блокаде: %s + Нисте пријављени + Када начините измену <b>привремени налог</b> ће бити направљен ради заштите Ваше приватности. <a href=\"%1$s\">Сазнајте више</a>.<br /><br /><a href=\"https://#login\">Пријавите се</a> или <a href=\"https://#login\">отворите налог</a> тиме ће ваши доприноси бити приписивани корисничком имену које одаберете и стећи ћете многе погодности. + Ваше измене ће бити приписане %1$s. Ваша IP адреса ће бити видљива администраторима.<br /><br />Ако се <a href=\"https://#login\">пријавите</a> или <a href=\"https://#login\">отворите налог</a>, Ваше измене ће бити приписане имену које изаберете, између осталога. + Разумео + Користите привремени налог + Одбаци измене и пријави ме + + Налог ће истећи за %d дан. + Налог ће истећи за %d дана. + + <b>Нисте пријављени.</b> Чим начините измену, привремени налог ће бити направљен ради заштите Ваше приватности. <a href=\"%1$s\">Сазнајте више</a> + <b>Користите привремени налог.</b> Ваше измене ће бити приписане %1$s. <a href=\"%2$s\">Сазнајте више</a>. + <b>Тренутно користите привремени налог.</b> Измене начињене привременим налогм %1$s неће бити пренете Ваше сталном налогу када се пријавите. Пријавите се или отворите налог да би Ваше измене биле приписиване Вашем корисничком имену између осталога. + Заврши сесију + Одјавићете се из Вашег привременог налога. Наставити? Грешка у апликацији Апликација Википедија је наишла на грешку и обустављена је.\n\nЖелите ли поново да је покренете или да изађете? Покрени поново diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4f4451ecc15..6d91a36f7ae 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -451,6 +451,25 @@ 您可以向<a href=\"%2$s\">%1$s</a>或是其他<a href=\"https://zh.wikipedia.org/wiki/Wikipedia:管理员\">管理員</a>聯絡來商量該封鎖操作。 自訂您的工具列 您可以聯絡<a href=\"https://zh.wikipedia.org/wiki/Wikipedia:管理员\">管理員</a>來商量該封鎖操作。 + 您尚未登入 + 一旦您做出編輯,會為您建立<b>臨時帳號</b>以保護您的隱私。<a href=\"%1$s\">了解更多</a>。<br /><br />請<a href=\"https://#login\">登入</a>或<a href=\"https://#login\">建立帳號</a>來讓編輯內容歸在您名下,並存取其他功能。 + 您的編輯將會歸在%1$s名下。管理員可看到您的 IP 位址。<br /><br />如果您有<a href=\"https://#login\">登入</a>或<a href=\"https://#login\">建立帳號</a>,您做出的編輯將會歸在您所選的使用者名稱,並擁有其他好處。 + 了解 + 您正在使用臨時帳號 + 放棄更改並登入 + + 臨時帳號「%1$s」是在發布您的編輯後建立的,會在 %2$d 天後失效。 + 臨時帳號「%1$s」是在發布您的編輯後建立的,會在 %2$d 天後失效。 + + + 帳號會在 %d 天後失效。 + 帳號會在 %d 天後失效。 + + <b>您尚未登入。</b>一旦您做出編輯,會為您建立臨時帳號以保護您的隱私。<a href=\"%1$s\">了解更多</a> + <b>您正在使用臨時帳號。</b>您做出的編輯內容會歸在%1$s名下。<a href=\"%2$s\">了解更多</a>。 + <b>您目前使用的是臨時帳號。</b>當您登入時,使用臨時帳號「%1$s」所做過的編輯不會轉移到您的永久帳號。登入或建立帳號,可讓編輯記錄在您使用者名稱的名下,以及其他好處。 + 結束連線階段 + 這會讓您登出臨時帳號。您要繼續嗎? 應用程式錯誤 很抱歉,維基百科應用程式發生錯誤並且已終止運行。\n\n要重新啟動,還是結束程式? 重新啟動 @@ -461,7 +480,7 @@ 佈景主題 目次 編輯… - 編輯條目描述 + 編輯條目說明 編輯首節 佈景主題 明亮 @@ -857,7 +876,7 @@ 閱讀 新增條目描述 翻譯條目描述 - 編輯條目描述 + 編輯條目說明 新增圖片說明 編輯語言說明 翻譯圖片說明 @@ -1488,7 +1507,7 @@ 您好!我想與您分享我的維基百科閱讀清單: 您願意幫助我們改善「分享閱讀清單」嗎? 「分享閱讀清單」是一項測試功能,我們需要您的意見回饋來改善、或是移除這項功能。 - 建立您自己的警告訊息,或使用<a href=\"#\">範例訊息</a>來開始。 + 建立您自己的訊息,或使用<a href=\"#\">範例訊息</a>來開始。 新訊息 主旨 撰寫訊息 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4d021aeb9f7..fd370687990 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1496,7 +1496,7 @@ 你好!我想给你分享我的维基百科阅读清单: 您能帮助我们改进“分享阅读清单”吗? “分享阅读清单”是一项测试功能,我们需要您的反馈来改进或删除它。 - 您没有保存任何警告消息。 + 创建您自己的消息,或使用<a href=\"#\">示例消息</a>来开始。 新留言 主题 撰写消息 From 6c266a85d2c6e29031f13a89abea7ec5005dd433 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Thu, 4 Apr 2024 09:53:17 -0400 Subject: [PATCH 039/626] Fix string. --- app/src/main/res/values-sd/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml index 34fc74647cf..ff481c52d98 100644 --- a/app/src/main/res/values-sd/strings.xml +++ b/app/src/main/res/values-sd/strings.xml @@ -112,7 +112,7 @@ %d ٻولين ۾ موجود ڪڪ بو-سا 4.0 ڇاپڻ سان، توهان <a href=\"%1$s\">استعمال جي شرطن</a> سان، ۽ بغير رد ڪئي پنھنجون ڀاڱيداريون <a href=\"%2$s\">CC BY-SA 4.0</a> اجازتنامي ھيٺ جاري ڪرڻ لاءِ راضي آھيو. - ڇاپڻ سان، توهان <a href=\"%1$s\">استعمال جي شرطن </a> ۽ بغير رد ڪئي پنھنجون ڀاڱيداريون <a href=\"%2$<a href\n=\"%2$s/\">CC BY-SA 4.0</a> اجازتنامي ھيٺ جاري ڪرڻ لاءِ راضي آھيو. سنوارون توھان جي آئِپي پتي سان منتسب ڪيون وينديون. جيڪڏهن توهان <a href=\"https://#login\">داخل ٿيو</a> ٿا، تہ توھان کي وڌيڪ نويڪلائي هوندي. + ڇاپڻ سان، توهان <a href=\"%1$s\">استعمال جي شرطن </a> ۽ بغير رد ڪئي پنھنجون ڀاڱيداريون <a href\n=\"%2$s/\">CC BY-SA 4.0</a> اجازتنامي ھيٺ جاري ڪرڻ لاءِ راضي آھيو. سنوارون توھان جي آئِپي پتي سان منتسب ڪيون وينديون. جيڪڏهن توهان <a href=\"https://#login\">داخل ٿيو</a> ٿا، تہ توھان کي وڌيڪ نويڪلائي هوندي. سنوارون توهان جي ڊوائيس جي آئپي پتي ڏانھن منسوب ڪيون وينديون. جيڪڏھن توھان <a href=\"https://#login\">داخل ٿيو</a> ٿا، تہ اوھان کي وڌيڪ نويڪلائي ملندي. وڪيپيڊيا ٻوليون ڳوليو From 3bb0ba3df6caa98487ff42561e8eda8050cf172e Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 4 Apr 2024 10:35:56 -0700 Subject: [PATCH 040/626] Fix: use localizeDate for the watchlist day header (#4582) Co-authored-by: Dmitry Brant --- .../suggestededits/SuggestedEditsTasksFragment.kt | 5 ++++- .../java/org/wikipedia/views/EditHistoryStatsView.kt | 9 ++++----- .../java/org/wikipedia/watchlist/WatchlistFragment.kt | 5 ++++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt index 8d8a6c5bd12..7912a899872 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt @@ -50,6 +50,8 @@ import org.wikipedia.util.StringUtil import org.wikipedia.util.UriUtil import org.wikipedia.views.DefaultRecyclerAdapter import org.wikipedia.views.DefaultViewHolder +import java.time.LocalDateTime +import java.time.ZoneId class SuggestedEditsTasksFragment : Fragment() { private var _binding: FragmentSuggestedEditsTasksBinding? = null @@ -286,7 +288,8 @@ class SuggestedEditsTasksFragment : Fragment() { return true } else if (pauseEndDate != null) { clearContents() - binding.disabledStatesView.setPaused(getString(R.string.suggested_edits_paused_message, DateUtil.getShortDateString(pauseEndDate), AccountUtil.userName)) + val localDateTime = LocalDateTime.ofInstant(pauseEndDate.toInstant(), ZoneId.systemDefault()).toLocalDate() + binding.disabledStatesView.setPaused(getString(R.string.suggested_edits_paused_message, DateUtil.getShortDateString(localDateTime), AccountUtil.userName)) binding.disabledStatesView.visibility = VISIBLE UserContributionEvent.logPaused() return true diff --git a/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt b/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt index 21bb3fcc38a..76606adc944 100644 --- a/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt +++ b/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt @@ -16,7 +16,7 @@ import org.wikipedia.util.DateUtil import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.StringUtil -import java.util.* +import java.time.LocalDateTime class EditHistoryStatsView constructor(context: Context, attrs: AttributeSet? = null) : ConstraintLayout(context, attrs) { @@ -35,10 +35,9 @@ class EditHistoryStatsView constructor(context: Context, attrs: AttributeSet? = val timestamp = stats.revision.timeStamp if (timestamp.isNotBlank()) { val createdYear = DateUtil.getYearOnlyDateString(DateUtil.iso8601DateParse(timestamp)) - val calendar = Calendar.getInstance() - val today = DateUtil.getShortDateString(calendar.time) - calendar.add(Calendar.YEAR, -1) - val lastYear = DateUtil.getShortDateString(calendar.time) + val localDateTime = LocalDateTime.now() + val today = DateUtil.getShortDateString(localDateTime.toLocalDate()) + val lastYear = DateUtil.getShortDateString(localDateTime.minusYears(1).toLocalDate()) binding.editCountsView.text = context.resources.getQuantityString(R.plurals.page_edit_history_article_edits_since_year, stats.allEdits.count, stats.allEdits.count, createdYear) binding.statsGraphView.setData(stats.metrics.map { it.edits.toFloat() }) diff --git a/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt b/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt index 1b96e9d0681..0a912d70288 100644 --- a/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt +++ b/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt @@ -49,6 +49,8 @@ import org.wikipedia.util.ResourceUtil import org.wikipedia.util.StringUtil import org.wikipedia.views.NotificationButtonView import org.wikipedia.views.SearchAndFilterActionProvider +import java.time.LocalDateTime +import java.time.ZoneId import java.util.Date class WatchlistFragment : Fragment(), WatchlistItemView.Callback, MenuProvider { @@ -211,7 +213,8 @@ class WatchlistFragment : Fragment(), WatchlistItemView.Callback, MenuProvider { internal inner class WatchlistDateViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bindItem(date: Date) { val textView = itemView.findViewById(R.id.dateText) - textView.text = DateUtil.getShortDateString(date) + val localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate() + textView.text = DateUtil.getShortDateString(localDateTime) } } From 7af8548bec05f903ae64b04db17b609219016289 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 4 Apr 2024 10:45:21 -0700 Subject: [PATCH 041/626] Use Coroutine on Feed related classes (#4583) Co-authored-by: Dmitry Brant --- .../org/wikipedia/dataclient/RestService.kt | 24 ++++++---- .../org/wikipedia/feed/FeedCoordinator.kt | 20 ++++---- .../aggregated/AggregatedFeedContentClient.kt | 46 ++++++++----------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/wikipedia/dataclient/RestService.kt b/app/src/main/java/org/wikipedia/dataclient/RestService.kt index b2127a541a8..c91f5d19667 100644 --- a/app/src/main/java/org/wikipedia/dataclient/RestService.kt +++ b/app/src/main/java/org/wikipedia/dataclient/RestService.kt @@ -12,11 +12,23 @@ import org.wikipedia.feed.configure.FeedAvailability import org.wikipedia.feed.onthisday.OnThisDay import org.wikipedia.gallery.MediaList import org.wikipedia.readinglist.sync.SyncedReadingLists -import org.wikipedia.readinglist.sync.SyncedReadingLists.* +import org.wikipedia.readinglist.sync.SyncedReadingLists.RemoteIdResponse +import org.wikipedia.readinglist.sync.SyncedReadingLists.RemoteIdResponseBatch +import org.wikipedia.readinglist.sync.SyncedReadingLists.RemoteReadingList +import org.wikipedia.readinglist.sync.SyncedReadingLists.RemoteReadingListEntry +import org.wikipedia.readinglist.sync.SyncedReadingLists.RemoteReadingListEntryBatch import org.wikipedia.suggestededits.provider.SuggestedEditItem import retrofit2.Call import retrofit2.Response -import retrofit2.http.* +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Headers +import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Path +import retrofit2.http.Query interface RestService { @@ -106,14 +118,6 @@ interface RestService { @get:Headers("Accept: " + ACCEPT_HEADER_PREFIX + "announcements/0.1.0\"") val announcements: Observable - @Headers("Accept: " + ACCEPT_HEADER_PREFIX + "aggregated-feed/0.5.0\"") - @GET("feed/featured/{year}/{month}/{day}") - fun getAggregatedFeed( - @Path("year") year: String?, - @Path("month") month: String?, - @Path("day") day: String? - ): Observable - @Headers("Accept: " + ACCEPT_HEADER_PREFIX + "aggregated-feed/0.5.0\"") @GET("feed/featured/{year}/{month}/{day}") suspend fun getFeedFeatured( diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.kt b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.kt index 07cab03f492..827aabb0595 100644 --- a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.kt +++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.kt @@ -1,9 +1,11 @@ package org.wikipedia.feed import android.content.Context -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Completable -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.wikipedia.WikipediaApp import org.wikipedia.feed.aggregated.AggregatedFeedContentClient import org.wikipedia.feed.announcement.AnnouncementClient @@ -40,12 +42,12 @@ class FeedCoordinator internal constructor(context: Context) : FeedCoordinatorBa companion object { fun postCardsToCallback(cb: FeedClient.Callback, cards: List) { - Completable.fromAction { - val delayMillis = 150L - Thread.sleep(delayMillis) - }.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { cb.success(cards) } + CoroutineScope(Dispatchers.Default).launch { + delay(150L) + withContext(Dispatchers.Main) { + cb.success(cards) + } + } } } } diff --git a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt index 93ec1aaaa42..d65334c7886 100644 --- a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt +++ b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt @@ -1,10 +1,12 @@ package org.wikipedia.feed.aggregated import android.content.Context -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite @@ -23,7 +25,7 @@ import org.wikipedia.util.log.L class AggregatedFeedContentClient { private val aggregatedResponses = mutableMapOf() private var aggregatedResponseAge = -1 - private val disposables = CompositeDisposable() + var clientJob: Job? = null class OnThisDayFeed(aggregatedClient: AggregatedFeedContentClient) : BaseClient(aggregatedClient) { @@ -110,10 +112,6 @@ class AggregatedFeedContentClient { aggregatedResponseAge = -1 } - fun cancel() { - disposables.clear() - } - abstract class BaseClient internal constructor(private val aggregatedClient: AggregatedFeedContentClient) : FeedClient { private lateinit var cb: FeedClient.Callback private lateinit var wiki: WikiSite @@ -137,31 +135,27 @@ class AggregatedFeedContentClient { override fun cancel() {} private fun requestAggregated() { - aggregatedClient.cancel() + aggregatedClient.clientJob?.cancel() val date = DateUtil.getUtcRequestDateFor(age) - aggregatedClient.disposables.add(Observable.fromIterable(FeedContentType.aggregatedLanguages) - .flatMap({ lang -> - ServiceFactory.getRest(WikiSite.forLanguageCode(lang)) - .getAggregatedFeed(date.year, date.month, date.day) - .subscribeOn(Schedulers.io()) - }, { first, second -> Pair(first, second) }) - .toList() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ pairList -> + aggregatedClient.clientJob = CoroutineScope(Dispatchers.Default).launch( + CoroutineExceptionHandler { _, caught -> + L.v(caught) + cb.error(caught) + } + ) { + withContext(Dispatchers.Main) { val cards = mutableListOf() - for (pair in pairList) { - val content = pair.second ?: continue - aggregatedClient.aggregatedResponses[WikiSite.forLanguageCode(pair.first).languageCode] = content + FeedContentType.aggregatedLanguages.forEach { langCode -> + val feedContentResponse = ServiceFactory.getRest(WikiSite.forLanguageCode(langCode)).getFeedFeatured(date.year, date.month, date.day) + aggregatedClient.aggregatedResponses[WikiSite.forLanguageCode(langCode).languageCode] = feedContentResponse aggregatedClient.aggregatedResponseAge = age } if (aggregatedClient.aggregatedResponses.containsKey(wiki.languageCode)) { getCardFromResponse(aggregatedClient.aggregatedResponses, wiki, age, cards) } FeedCoordinator.postCardsToCallback(cb, cards) - }) { caught -> - L.v(caught) - cb.error(caught) - }) + } + } } } } From 21e703fe52fa852d0c0fa526c0e90715048d982a Mon Sep 17 00:00:00 2001 From: Jvr <109031036+Jvr2022@users.noreply.github.com> Date: Thu, 4 Apr 2024 21:11:32 +0200 Subject: [PATCH 042/626] chore: update deps (#4580) * update deps * update deps --------- Co-authored-by: Dmitry Brant --- .github/workflows/android.yml | 2 +- app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index b07b4ecf273..7558cf1faa6 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -38,7 +38,7 @@ jobs: run: git rev-parse HEAD > app/build/outputs/apk/alpha/release/rev-hash.txt - name: Rename APK to universal run: mv app/build/outputs/apk/alpha/release/app-alpha-release-signed.apk app/build/outputs/apk/alpha/release/app-alpha-universal-release.apk - - uses: dev-drprasad/delete-tag-and-release@v0.2.1 + - uses: dev-drprasad/delete-tag-and-release@v1.1 name: Delete latest alpha tag and release with: tag_name: latest diff --git a/app/build.gradle b/app/build.gradle index 8664a253030..267c8e1036f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -257,7 +257,7 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation "org.mockito:mockito-inline:$mockitoVersion" - testImplementation 'org.robolectric:robolectric:4.11.1' + testImplementation 'org.robolectric:robolectric:4.12.1' testImplementation "com.squareup.okhttp3:okhttp:$okHttpVersion" testImplementation "com.squareup.okhttp3:mockwebserver:$okHttpVersion" testImplementation 'org.hamcrest:hamcrest:2.2' From 7784da7cbdbea72964a195a52898a92dc2390e50 Mon Sep 17 00:00:00 2001 From: Tacsipacsi Date: Fri, 5 Apr 2024 01:26:01 +0200 Subject: [PATCH 043/626] Update links to [[mw:Wikimedia_Apps/Android_Suggested_edits]] (#4586) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While the English page redirects to the new title, translations don’t. This change will fuzzy the translations, so translators can notice and fix the broken links. Also take the chance to make all four links point to m.mediawiki.org, instead of one pointing to m.mediawiki.org and three to www.mediawiki.org. Bug: T348875 --- app/src/main/res/values/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9507b916767..35e31b22282 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -245,8 +245,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/ https://creativecommons.org/publicdomain/zero/1.0/ - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags Libraries used Contributors Team page]]> @@ -899,8 +899,8 @@ Voice input Learn more about article descriptions Learn more about image captions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions The text is too short. The text must not end with punctuation. From 807850511c22a73fe6620257e616ce5e82a81c21 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Fri, 5 Apr 2024 06:16:15 -0700 Subject: [PATCH 044/626] Fix: possible crash when adding the progressCard on Feed (#4588) --- .../main/java/org/wikipedia/feed/FeedCoordinatorBase.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.kt b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.kt index 994ab113278..4dd9cc609e8 100644 --- a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.kt +++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.kt @@ -21,7 +21,7 @@ import org.wikipedia.settings.Prefs import org.wikipedia.util.DeviceUtil import org.wikipedia.util.ThrowableUtil import org.wikipedia.util.log.L -import java.util.* +import java.util.Collections abstract class FeedCoordinatorBase(private val context: Context) { @@ -149,7 +149,7 @@ abstract class FeedCoordinatorBase(private val context: Context) { if (pendingClients.isNotEmpty()) { pendingClients.removeAt(0) } - if (lastCard !is ProgressCard && shouldShowProgressCard(pendingClients[0])) { + if (lastCard !is ProgressCard && shouldShowProgressCard(pendingClients.getOrNull(0))) { requestProgressCard() } requestCard(wiki) @@ -262,10 +262,11 @@ abstract class FeedCoordinatorBase(private val context: Context) { card is FeaturedImageCard } - private fun shouldShowProgressCard(pendingClient: FeedClient): Boolean { + private fun shouldShowProgressCard(pendingClient: FeedClient?): Boolean { return pendingClient is SuggestedEditsFeedClient || pendingClient is AnnouncementClient || - pendingClient is BecauseYouReadClient + pendingClient is BecauseYouReadClient || + pendingClient == null } companion object { From f516c34831cd895de9c9ffe6a8328235b870cc68 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Fri, 5 Apr 2024 13:05:08 -0700 Subject: [PATCH 045/626] Fix: load correct article and description for the featured article (#4587) * Fix: load correct article and description for the featured article * Fix incorrect Dispacter * Moved to AggregatedFeedContentClient and add more language codes to the request * Use language fallback * Dont use language fallback since it will return enwiki description --------- Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/dataclient/Service.kt | 5 ++ .../wikipedia/dataclient/wikidata/Entities.kt | 4 ++ .../feed/aggregated/AggregatedFeedContent.kt | 12 ++--- .../aggregated/AggregatedFeedContentClient.kt | 46 ++++++++++++++++++- .../org/wikipedia/language/LanguageUtil.kt | 2 +- ...uggestedEditsImageRecsFragmentViewModel.kt | 6 ++- 6 files changed, 64 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index 1ac6322ef19..3dac230c8a8 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -498,6 +498,11 @@ interface Service { @GET(MW_API_PREFIX + "action=wbgetentities&props=descriptions|labels|sitelinks") suspend fun getWikidataLabelsAndDescriptions(@Query("ids") idList: String): Entities + @GET(MW_API_PREFIX + "action=wbgetentities&props=descriptions") + suspend fun getWikidataDescription(@Query("titles") titles: String, + @Query("sites") sites: String, + @Query("languages") langCode: String): Entities + @POST(MW_API_PREFIX + "action=wbsetclaim&errorlang=uselang") @FormUrlEncoded fun postSetClaim( diff --git a/app/src/main/java/org/wikipedia/dataclient/wikidata/Entities.kt b/app/src/main/java/org/wikipedia/dataclient/wikidata/Entities.kt index 12735d80c60..8a25a091888 100644 --- a/app/src/main/java/org/wikipedia/dataclient/wikidata/Entities.kt +++ b/app/src/main/java/org/wikipedia/dataclient/wikidata/Entities.kt @@ -37,6 +37,10 @@ class Entities : MwResponse() { emptyMap() } } + + fun getDescription(langCode: String): String? { + return descriptions[langCode]?.value + } } @Serializable diff --git a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContent.kt b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContent.kt index 1b684911180..f1d478133d2 100644 --- a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContent.kt +++ b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContent.kt @@ -9,10 +9,10 @@ import org.wikipedia.feed.onthisday.OnThisDay import org.wikipedia.feed.topread.TopRead @Serializable -class AggregatedFeedContent { - val tfa: PageSummary? = null - val news: List? = null - @SerialName("mostread") val topRead: TopRead? = null - @SerialName("image") val potd: FeaturedImage? = null +class AggregatedFeedContent( + val tfa: PageSummary? = null, + val news: List? = null, + @SerialName("mostread") val topRead: TopRead? = null, + @SerialName("image") val potd: FeaturedImage? = null, val onthisday: List? = null -} +) diff --git a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt index d65334c7886..2ea7f84c616 100644 --- a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt +++ b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt @@ -5,11 +5,14 @@ import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.wikipedia.Constants import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite +import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.feed.FeedContentType import org.wikipedia.feed.FeedCoordinator import org.wikipedia.feed.dataclient.FeedClient @@ -146,8 +149,26 @@ class AggregatedFeedContentClient { withContext(Dispatchers.Main) { val cards = mutableListOf() FeedContentType.aggregatedLanguages.forEach { langCode -> - val feedContentResponse = ServiceFactory.getRest(WikiSite.forLanguageCode(langCode)).getFeedFeatured(date.year, date.month, date.day) - aggregatedClient.aggregatedResponses[WikiSite.forLanguageCode(langCode).languageCode] = feedContentResponse + val wikiSite = WikiSite.forLanguageCode(langCode) + val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(langCode).isNullOrEmpty() + var feedContentResponse = ServiceFactory.getRest(wikiSite).getFeedFeatured(date.year, date.month, date.day) + + // TODO: This is a temporary fix for T355192 + if (hasParentLanguageCode) { + // TODO: Needs to update tfa and most read + feedContentResponse.tfa?.let { + val tfaResponse = getPageSummaryForLanguageVariant(it, wikiSite) + feedContentResponse = AggregatedFeedContent( + tfa = tfaResponse, + news = feedContentResponse.news, + topRead = feedContentResponse.topRead, + potd = feedContentResponse.potd, + onthisday = feedContentResponse.onthisday + ) + } + } + + aggregatedClient.aggregatedResponses[langCode] = feedContentResponse aggregatedClient.aggregatedResponseAge = age } if (aggregatedClient.aggregatedResponses.containsKey(wiki.languageCode)) { @@ -157,5 +178,26 @@ class AggregatedFeedContentClient { } } } + + // TODO: This is a temporary fix for T355192 + private suspend fun getPageSummaryForLanguageVariant(pageSummary: PageSummary, wikiSite: WikiSite): PageSummary { + var newPageSummary = pageSummary + withContext(Dispatchers.IO) { + // First, get the correct description from Wikidata directly. + val wikiDataResponse = async { + ServiceFactory.get(Constants.wikidataWikiSite) + .getWikidataDescription(titles = pageSummary.apiTitle, sites = wikiSite.dbName(), langCode = wikiSite.languageCode) + } + // Second, fetch PageSummary endpoint instead of using the one with incorrect language variant (mostly from the feed endpoint). + val pageSummaryResponse = async { + ServiceFactory.getRest(wikiSite).getPageSummary(null, pageSummary.apiTitle) + } + + newPageSummary = pageSummaryResponse.await().apply { + description = wikiDataResponse.await().first?.getDescription(wikiSite.languageCode) ?: description + } + } + return newPageSummary + } } } diff --git a/app/src/main/java/org/wikipedia/language/LanguageUtil.kt b/app/src/main/java/org/wikipedia/language/LanguageUtil.kt index f73ba6d003c..d34e37b2264 100644 --- a/app/src/main/java/org/wikipedia/language/LanguageUtil.kt +++ b/app/src/main/java/org/wikipedia/language/LanguageUtil.kt @@ -7,7 +7,7 @@ import androidx.core.os.LocaleListCompat import org.apache.commons.lang3.StringUtils import org.wikipedia.WikipediaApp import org.wikipedia.util.StringUtil -import java.util.* +import java.util.Locale object LanguageUtil { diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt index e85fc94e4f3..d920124f710 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt @@ -4,9 +4,12 @@ import android.os.Bundle import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.FormBody import okhttp3.Request import okhttp3.Response @@ -29,7 +32,6 @@ import org.wikipedia.util.Resource import org.wikipedia.util.UriUtil import org.wikipedia.util.log.L import java.io.IOException -import java.util.* class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { From 1517b188158e89d323f3ed6ea6ad577d7ebc20f3 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 8 Apr 2024 14:23:43 +0200 Subject: [PATCH 046/626] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-anp/strings.xml | 4 ++-- app/src/main/res/values-ar/strings.xml | 4 ++-- app/src/main/res/values-ast/strings.xml | 4 ++-- app/src/main/res/values-az/strings.xml | 4 ++-- app/src/main/res/values-b+sr+Latn/strings.xml | 4 ++-- app/src/main/res/values-b+tt+Cyrl/strings.xml | 8 ++++---- app/src/main/res/values-ba/strings.xml | 8 ++++---- app/src/main/res/values-ban/strings.xml | 8 ++++---- app/src/main/res/values-be/strings.xml | 8 ++++---- app/src/main/res/values-bew/strings.xml | 8 ++++---- app/src/main/res/values-bg/strings.xml | 4 ++-- app/src/main/res/values-bho/strings.xml | 2 +- app/src/main/res/values-blk/strings.xml | 4 ++-- app/src/main/res/values-bn/strings.xml | 4 ++-- app/src/main/res/values-br/strings.xml | 10 ++++++++-- app/src/main/res/values-bs/strings.xml | 4 ++-- app/src/main/res/values-ca/strings.xml | 8 ++++---- app/src/main/res/values-ckb/strings.xml | 4 ++-- app/src/main/res/values-cs/strings.xml | 4 ++-- app/src/main/res/values-cv/strings.xml | 4 ++-- app/src/main/res/values-da/strings.xml | 8 ++++---- app/src/main/res/values-dag/strings.xml | 8 ++++---- app/src/main/res/values-de/strings.xml | 10 +++++----- app/src/main/res/values-dga/strings.xml | 8 ++++---- app/src/main/res/values-diq/strings.xml | 4 ++-- app/src/main/res/values-el/strings.xml | 4 ++-- app/src/main/res/values-eo/strings.xml | 4 ++-- app/src/main/res/values-es/strings.xml | 2 ++ app/src/main/res/values-eu/strings.xml | 4 ++-- app/src/main/res/values-fa/strings.xml | 8 ++++---- app/src/main/res/values-fi/strings.xml | 8 ++++---- app/src/main/res/values-fr/strings.xml | 15 ++++++++------- app/src/main/res/values-fy/strings.xml | 4 ++-- app/src/main/res/values-gl/strings.xml | 4 ++-- app/src/main/res/values-ha/strings.xml | 8 ++++---- app/src/main/res/values-hi/strings.xml | 8 ++++---- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-hsb/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 8 ++++---- app/src/main/res/values-ia/strings.xml | 8 ++++---- app/src/main/res/values-in/strings.xml | 8 ++++---- app/src/main/res/values-inh/strings.xml | 8 ++++---- app/src/main/res/values-io/strings.xml | 8 ++++---- app/src/main/res/values-is/strings.xml | 8 ++++---- app/src/main/res/values-it/strings.xml | 8 ++++---- app/src/main/res/values-iw/strings.xml | 8 ++++---- app/src/main/res/values-ja/strings.xml | 8 ++++---- app/src/main/res/values-jv/strings.xml | 2 +- app/src/main/res/values-kab/strings.xml | 4 ++-- app/src/main/res/values-kcg/strings.xml | 4 ++-- app/src/main/res/values-kn/strings.xml | 4 ++-- app/src/main/res/values-ko/strings.xml | 8 ++++---- app/src/main/res/values-ks/strings.xml | 4 ++-- app/src/main/res/values-ku/strings.xml | 8 ++++---- app/src/main/res/values-kus/strings.xml | 8 ++++---- app/src/main/res/values-lb/strings.xml | 9 ++++++--- app/src/main/res/values-lmo/strings.xml | 4 ++-- app/src/main/res/values-mhr/strings.xml | 8 ++++---- app/src/main/res/values-mk/strings.xml | 8 ++++---- app/src/main/res/values-mnw/strings.xml | 4 ++-- app/src/main/res/values-my/strings.xml | 4 ++-- app/src/main/res/values-nb/strings.xml | 8 ++++---- app/src/main/res/values-nl/strings.xml | 8 ++++---- app/src/main/res/values-nqo/strings.xml | 8 ++++---- app/src/main/res/values-pa/strings.xml | 4 ++-- app/src/main/res/values-pl/strings.xml | 8 ++++---- app/src/main/res/values-pt-rBR/strings.xml | 8 ++++---- app/src/main/res/values-pt/strings.xml | 11 ++++++----- app/src/main/res/values-ro/strings.xml | 4 ++-- app/src/main/res/values-ru/strings.xml | 8 ++++---- app/src/main/res/values-sah/strings.xml | 2 +- app/src/main/res/values-sd/strings.xml | 5 +++-- app/src/main/res/values-sdc/strings.xml | 4 ++-- app/src/main/res/values-sh/strings.xml | 4 ++-- app/src/main/res/values-shn/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 4 ++-- app/src/main/res/values-sl/strings.xml | 8 ++++---- app/src/main/res/values-sr/strings.xml | 4 ++-- app/src/main/res/values-sro/strings.xml | 4 ++-- app/src/main/res/values-sv/strings.xml | 8 ++++---- app/src/main/res/values-ta/strings.xml | 4 ++-- app/src/main/res/values-te/strings.xml | 4 ++-- app/src/main/res/values-th/strings.xml | 4 ++-- app/src/main/res/values-tl/strings.xml | 4 ++-- app/src/main/res/values-tly/strings.xml | 4 ++-- app/src/main/res/values-tr/strings.xml | 8 ++++---- app/src/main/res/values-uk/strings.xml | 8 ++++---- app/src/main/res/values-ur/strings.xml | 4 ++-- app/src/main/res/values-uz/strings.xml | 8 ++++---- app/src/main/res/values-vi/strings.xml | 4 ++-- app/src/main/res/values-yrl/strings.xml | 4 ++-- app/src/main/res/values-zgh/strings.xml | 4 ++-- app/src/main/res/values-zh-rTW/strings.xml | 8 ++++---- app/src/main/res/values-zh/strings.xml | 8 ++++---- 94 files changed, 286 insertions(+), 272 deletions(-) diff --git a/app/src/main/res/values-anp/strings.xml b/app/src/main/res/values-anp/strings.xml index 157a718e106..45e4e73eaba 100644 --- a/app/src/main/res/values-anp/strings.xml +++ b/app/src/main/res/values-anp/strings.xml @@ -182,8 +182,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://anp.wikipedia.org/wiki/विकिपीडिया:एगो_खाता_केरौ_अनुरोध - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags लाइब्रेरीज़ क प्रयोग होलै योगदानकर्ता सिनी <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">टीम पेज</a> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1ea6f0082c0..0ababbd196a 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -273,8 +273,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.ar https://creativecommons.org/publicdomain/zero/1.0/deed.ar - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits المكتبات المستخدمة المساهمون <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">صفحة الفريق</a> diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index eb1ff2b7d4f..bd7a2b3c1a1 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -183,8 +183,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://foundation.m.wikimedia.org/wiki/Terms_of_Use/ast https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Bbiblioteques utilizaes Collaboradores <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Páxina del equipu</a> diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index af4aeef96c5..740f5e444ef 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -235,8 +235,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Kitabxanalar istifadə edildi Tərtibatçılar <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Komanda</a> diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 87bad398bbd..e22c3c26e54 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -231,8 +231,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.sr https://creativecommons.org/publicdomain/zero/1.0/deed.sr_LATN - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/sr - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/sr#Oznake_slika + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/sr + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/sr#Oznake_slika Korišćene biblioteke Saradnici <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Stranica tima</a> diff --git a/app/src/main/res/values-b+tt+Cyrl/strings.xml b/app/src/main/res/values-b+tt+Cyrl/strings.xml index aaef754e3cb..643ff799e84 100644 --- a/app/src/main/res/values-b+tt+Cyrl/strings.xml +++ b/app/src/main/res/values-b+tt+Cyrl/strings.xml @@ -233,8 +233,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/tt#Оффлайнда_уку_һәм_мәгълүматлар https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/tt https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/tt - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/tt + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Кулланыла торган китапханәләр Авторлар <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Команда бите</a> @@ -830,8 +830,8 @@ Тавышлы язма Мәкаләләрнең тасвирламалары турында тулырак Сурәтләргә язмалар турында тулырак - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Текст бик кыска. Текст тыныш билгеләре белән тәмамланырга тиеш түгел. Беренче сүз ялгызлык исем булмаса, юл хрефтән башлагыз. diff --git a/app/src/main/res/values-ba/strings.xml b/app/src/main/res/values-ba/strings.xml index ad994f8b737..014a323281d 100644 --- a/app/src/main/res/values-ba/strings.xml +++ b/app/src/main/res/values-ba/strings.xml @@ -242,8 +242,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/ru#Офлайнда уҡыу һәм мәғлүмәттәр https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/ba https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Файҙаланылған китапханалар Авторҙар <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Команда бите</a> @@ -838,8 +838,8 @@ Тауыш ярҙамында мәғлүмәт индереү Мәҡәләләр тураһында ентекләберәк Рәсемдәр тасуирламаһы тураһында ентекләберәк - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D1%82%D0%B5%D0%B9 - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru#%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8_%D0%BA_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D1%82%D0%B5%D0%B9 + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru#%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8_%D0%BA_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC Текст бик ҡыҫҡа. Текст тыныш билдәләре менән тамамланырға тейеш түгел. Беренсе һүҙ яңғыҙлыҡ исем булмаһа, бәләкәй хәрефтән башлағыҙ diff --git a/app/src/main/res/values-ban/strings.xml b/app/src/main/res/values-ban/strings.xml index 28f72650af3..0d1a6a2b064 100644 --- a/app/src/main/res/values-ban/strings.xml +++ b/app/src/main/res/values-ban/strings.xml @@ -228,8 +228,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://foundation.wikimedia.org/wiki/Terms_of_Use https://ban.wikipedia.org/wiki/Wikipedia:Pinunas_satunggal_akun - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Kapustakaan kaanggén Papituut <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Kaca seka</a> @@ -606,8 +606,8 @@ Alih basa sesirah gambar Wangdé Indik Wikidata - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Déskripsi suratan sampun kawedar! Déskripsi suratan sampun kawedar! Déskripsi suratan sampun kawedar! (%s) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 0ae216ece8b..5c2268b157c 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -252,8 +252,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.be https://creativecommons.org/publicdomain/zero/1.0/deed.be - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Выкарыстаныя бібліятэкі Суаўтары <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Старонка каманды</a> @@ -901,8 +901,8 @@ Галасавы ўвод Даведайцеся больш пра апісанні артыкулаў Даведайцеся больш пра подпісы выяў - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Тэкст занадта кароткі. Тэкст не павінен сканчацца знакамі прыпынку. Пачынайце з маленькай літары, калі толькі першае слова не з’яўляецца імем уласным. diff --git a/app/src/main/res/values-bew/strings.xml b/app/src/main/res/values-bew/strings.xml index 086836a552a..3417d841ee9 100644 --- a/app/src/main/res/values-bew/strings.xml +++ b/app/src/main/res/values-bew/strings.xml @@ -227,8 +227,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/id#Baca_luar_jala_èn_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Pertanyaan_Sering_Android https://en.wikipedia.org/wiki/Wikipédi:Bikinin_rèkening - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Tenger_gambar + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Tenger_gambar Miswar nyang dipaké Penyumbang <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Halaman tim</a> @@ -824,8 +824,8 @@ Masupan suara Belajarin lebi lanjut pasal jabaran makalah Belajarin lebi lanjut pasal keterangan gambar - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Tèks – kepèndèkan. Tèks kaga\' bolé akirannya tenger baca. Mulain paké hurup kecil, kecuali kalo kata pertamanya – nama peada dèwèk. diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index df3caa3f4d7..6c3b890dac3 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -235,8 +235,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.bg - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Използвани библиотеки Сътрудници <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Страница на екипа</a> diff --git a/app/src/main/res/values-bho/strings.xml b/app/src/main/res/values-bho/strings.xml index 0697c13ffb3..1912b32d6d6 100644 --- a/app/src/main/res/values-bho/strings.xml +++ b/app/src/main/res/values-bho/strings.xml @@ -178,7 +178,7 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://bh.wikipedia.org/wiki/विकिपीडिया:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits इस्तेमाल कइल गइल लाइब्रेरी योगदान अनुवादक diff --git a/app/src/main/res/values-blk/strings.xml b/app/src/main/res/values-blk/strings.xml index 56192d9ce59..3d604a7ad36 100644 --- a/app/src/main/res/values-blk/strings.xml +++ b/app/src/main/res/values-blk/strings.xml @@ -218,8 +218,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://blk.wikipedia.org/wiki/ဝီခီပီးဒီးယား:ကွီ_အကောက်_တဗာႏ - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/blk - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/blk + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags ကထွားခါꩻဖို လိတ်ထွားခင်ႏလမ်းဖုံႏ ခွုမ်မာꩻသားဖုံႏ <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">ပါငီꩻသားလိတ်မဲ့ငါ</a> diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index a66fa62c231..3b2d000ef53 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -262,8 +262,8 @@ https://bn.wikipedia.org/wiki/উইকিপিডিয়া:অ্যাকাউন্টের_জন্য_অনুরোধ https://creativecommons.org/licenses/by-sa/4.0/deed.bn https://creativecommons.org/publicdomain/zero/1.0/deed.bn - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags ব্যবহৃত গ্রন্থাগারগুলি অবদানকারীগণ <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">দলের পাতা</a> diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index dbfa1a3bbef..24717c95cfa 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -242,8 +242,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/fr https://foundation.m.wikimedia.org/wiki/Terms_of_Use https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags Levraouegoù implijet Kenlabourerien <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Pajenn ar skipailh</a> @@ -415,6 +415,9 @@ Dibenn ar stankadenn: %s ID ar stankadur: %s Personelaat ho parrenn-ostilhoù + N\'oc\'h ket kevreet + Komprenet am eus + Ur c\'hont da c\'hortoz emaoc\'h oc\'h implij Fazi an arload Hon digarezit, ur fazi zo degouezhet gant an arolad Wikimedia ha chomet eo a-sav.\n\nHa c\'hoant ho peus da adloc\'hañ pe da guitaat ? Adloc\'hañ @@ -835,6 +838,8 @@ https://www.wikidata.org/wiki/Help:Description#Guidelines_for_descriptions_in_English Trugarez da ziskouez oc\'h dedennet da zegas cheñchamantoù e deskrivadurioù pennadoù. Evit ober muioc\'h a gemmoù, kevreit ouzh ho kont Wikipedia mar plij ganeoc\'h. Pa gemann deskrivadur ar pennad e tegemeran an <a href=\"%1$s\"> Divizoù implijout</a> ha lakaat ma tegasadennoù dindan an aotre-implijout <a href=\"%2$s\">Creative Commons CC0</a> ha ne c\'hallan ket distreiñ war ma diviz. + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Re verr eo an destenn-mañ. Embannet eo bet deskrivadur ar pennad ! Embannet eo bet deskrivadur ar pennad ! @@ -1128,6 +1133,7 @@ Titl ar gemennadenn Embann Nullañ + Na enrollañ Goullo eo ar bejenn gaozeal-mañ. Respont (Danvez ebet) diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index a5795f3f51a..5eb9fe91653 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -226,8 +226,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/bs https://foundation.wikimedia.org/wiki/Terms_of_Use https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Korištene biblioteke Saradnici <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Stranice ekipe</a> diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 70a5ce913d0..0b01966ab6a 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -256,8 +256,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.ca https://creativecommons.org/publicdomain/zero/1.0/deed.ca - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ca - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ca + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Biblioteques utilitzades Col·laboradors <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Pàgina de l\'equip</a> @@ -854,8 +854,8 @@ Entrada de veu Quant a les descripcions dels articles Quant a les llegendes de les imatges - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions El text és massa curt. El text no ha d\'acabar amb puntuació. Eviteu començar amb articles com \"un\" o \"el\"... diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 1806044858b..1999bb5964b 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -240,8 +240,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://foundation.wikimedia.org/wiki/Terms_of_Use https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags کتێبخانە بەکارھاتووەکان بەشداربووان <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">پەڕەی تیم</a> diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 6aa781d0059..e5796663507 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -268,8 +268,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.cs https://creativecommons.org/publicdomain/zero/1.0/deed.cs - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/cs - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/cs#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/cs + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/cs#Image_tags Použité knihovny Přispěvatelé <a href=\"https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Team/Android\">Stránka produkčního týmu</a> diff --git a/app/src/main/res/values-cv/strings.xml b/app/src/main/res/values-cv/strings.xml index 2885c368e06..869dad85ae4 100644 --- a/app/src/main/res/values-cv/strings.xml +++ b/app/src/main/res/values-cv/strings.xml @@ -210,8 +210,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/ru#Офлайнра_вуласси_тата_даннӑйсем https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/cv https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/cv - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/cv + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Усӑ курнӑ библиотекӑсем Авторсем Куҫаруҫӑсем diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 00213c7e068..f4b76fb6fd9 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -253,8 +253,8 @@ https://foundation.m.wikimedia.org/wiki/Terms_of_Use https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/publicdomain/zero/1.0/deed.da - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Suggested_edits#Image_tags Anvendte biblioteker Bidragsydere <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Teamside</a> @@ -858,8 +858,8 @@ Taleinput Lær mere om artikelbeskrivelser Lær mere om billedtekster - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Teksten er for kort. Teksten må ikke ende med skilletegn. Begynd med et lille bogstav med mindre det første ord er et egennavn. diff --git a/app/src/main/res/values-dag/strings.xml b/app/src/main/res/values-dag/strings.xml index 4b402123333..94291d36f7e 100644 --- a/app/src/main/res/values-dag/strings.xml +++ b/app/src/main/res/values-dag/strings.xml @@ -231,8 +231,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags bachinima kahigibu kundinima din zaŋ tum tuma tohiriba <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> @@ -831,8 +831,8 @@ Kukɔli lahabali kpɛhibu Bohimmi pahi zaŋkpa atikil buɣisibu lahabalinima polo Bohammi baŋsim zaŋkpa anfooni yuli tibu m-pahi - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Sabbu maa ji n-yaɣi. Sabbu maa bi tu ni di naai ni maliniŋ bia. piligimli ni bachikobbila naɣila di tuuli bachi maa nyɛla yuli bachinamdimaŋli. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index eacc72e9d87..3c96a66a67a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -277,8 +277,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.de https://creativecommons.org/publicdomain/zero/1.0/deed.de - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/de - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/de#Bild-Schlagworte + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/de + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/de#Bild-Schlagworte Verwendete Bibliotheken Mitwirkende <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team-Seite</a> @@ -879,8 +879,8 @@ Spracheingabe Erfahre mehr über Artikelbeschreibungen Erfahre mehr über Bildunterschriften - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Der Text ist zu kurz. Der Text darf nicht mit einem Satzzeichen enden. Vermeide Beschreibungen, die mit einem Artikel („Der…“/„Eine…“) beginnen. @@ -1521,7 +1521,7 @@ Seitenprobleme Kleinere Fehlerbehebungen und Verbesserungen Orte - Um deinen Standort auf der Karte anzuzeigen, ist eine Standortgenehmigung erforderlich. Bitte versuche es erneut. + Um deinen Standort auf der Karte anzeigen zu können, ist die Standortberechtigung erforderlich. Bitte versuche es erneut. Orte suchen Sprache filtern Karte diff --git a/app/src/main/res/values-dga/strings.xml b/app/src/main/res/values-dga/strings.xml index a5dbe566a41..ecf0a5dae43 100644 --- a/app/src/main/res/values-dga/strings.xml +++ b/app/src/main/res/values-dga/strings.xml @@ -230,8 +230,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Gama binziiri toŋ Tontomba <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> @@ -824,8 +824,8 @@ Yelyaga de emmbo Zanne yɛlɛ yaga kyaare atekele bigruu Zanne yɛlɛ yaga kyaare enfuoni yelzu ŋmaa - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions A sɛgre e la fẽẽ yaga. A sɛgere ba seŋ ka o baare ne tannoo tombiri. Piili neŋ sɛgebi bile see ka o waa yo-meŋa. diff --git a/app/src/main/res/values-diq/strings.xml b/app/src/main/res/values-diq/strings.xml index 7ca66b6375e..20438856f5d 100644 --- a/app/src/main/res/values-diq/strings.xml +++ b/app/src/main/res/values-diq/strings.xml @@ -176,8 +176,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Karkerdena kıtıbxani İştırakkerdoği <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android/tr\">Pela taxıme</a> diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e65c09d22f3..82838f05c79 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -233,8 +233,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.el https://creativecommons.org/publicdomain/zero/1.0/deed.el - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/el - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/el + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Βιβλιοθήκες που χρησιμοποιούνται Συνεισφέροντες <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index dbdfa25cb8a..281b4a08eeb 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -214,8 +214,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.eo https://creativecommons.org/publicdomain/zero/1.0/deed.eo - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/eo - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/eo + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Bibliotekoj uzataj Kontribuantoj Tradukantoj diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1a185aa7fcc..c9cb37d5171 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -895,6 +895,8 @@ Al cambiar la descripción del artículo, aceptas los <a href=\"%1$s\">Términos de uso</a> y a liberar irrevocablemente tus contribuciones bajo los términos de la licencia <a href=\"%2$s\">Creative Commons CC0</a>. típicamente comienza por una letra minúscula Entrada de voz + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions El texto es demasiado corto. El texto no tiene que acabar con puntuación. No empieces con artículos como \"un\", \"una\",\"el\", \"la\", \"los\" o \"las\". diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 950f693ae3a..5d43ad00239 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -224,8 +224,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.eu https://creativecommons.org/publicdomain/zero/1.0/deed.eu - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Erabilitako liburutegiak Ekarleak Itzultzaileak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index d7bf6a184fd..a4e4930ab28 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -278,8 +278,8 @@ https://fa.wikipedia.org/wiki/ویکی‌پدیا:درخواست_ایجاد_حساب_کاربری https://creativecommons.org/licenses/by-sa/4.0/deed.fa https://creativecommons.org/publicdomain/zero/1.0/deed.fa - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags کتابخانه‌های استفاده‌شده مشارکت‌کنندگان <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">صفحه تیم</a> @@ -835,8 +835,8 @@ صدای ورودی در خصوص توصیف‌های مقاله بیشتر بدانید در خصوص برنگاشت تصاویر بیشتر بدانید - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions متن بیش از حد کوتاه است. متن نباید با نقطه‌گذاری پایان یابد با حروف کوچک شروع کنید؛ مگر آن که واژهٔ اول یک نام خاص باشد. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 3758d85a9c2..7cde3e1e008 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -266,8 +266,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.fi https://creativecommons.org/publicdomain/zero/1.0/deed.fi - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fi - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fi#Kuvatunnisteet + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fi + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fi#Kuvatunnisteet Käytetyt kirjastot Tekijät <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Tiimin sivu</a> @@ -866,8 +866,8 @@ Äänisyöte Lue lisää artikkelien kuvauksista Lue lisää kuvateksteistä - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fi#Artikkelien_kuvaukset - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fi#Kuvatekstit + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Artikkelien_kuvaukset + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/fi#Kuvatekstit Teksti on liian lyhyt. Teksti ei saa päättyä välimerkkeihin. Aloita pienellä kirjaimella, ellei ensimmäinen sana ole erisnimi. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5055e71a3c7..229aa30ba9c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -55,6 +55,7 @@ * Papawy * Seb35 * SleaY +* Tacsipacsi * The RedBurn * Thibaut120094 * Trial @@ -294,15 +295,15 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.fr https://creativecommons.org/publicdomain/zero/1.0/deed.fr - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fr - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fr#Légendes_d\'images + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/fr + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/fr#Légendes_d\'images Bibliothèques utilisées Contributeurs <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Page de l’équipe</a> Traducteurs Cette application a été traduite par les traducteurs bénévoles de <a href=\"https://translatewiki.net\">translatewiki.net</a>. Licence - Code source disponible sur <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> et <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> sous la <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">licence Apache 2.0</a>. Sauf indication contraire, le contenu est disponible sous une <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">licence Creative Commons Attribution – Partage à l\'identique</a>. + Code source disponible sur <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> sous la <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">licence Apache 2.0</a>. Sauf indication contraire, le contenu est disponible sous une <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">licence Creative Commons Attribution – Partage à l\'identique</a>. Un produit de la <a href=\"https://wikimediafoundation.org/\">Fondation Wikimedia</a> À propos La page a été modifiée. Êtes-vous sûr de vouloir la quitter sans enregistrer vos modifications ? @@ -808,8 +809,8 @@ Décocher tous les éléments Filtre de wikis Filtre de types - Tous les « wikis » - Tous les « types » + Tous les wikis + Tous les types page de discussion de %s Cette fonction n’est pas disponible hors ligne. Parce que vous avez lu @@ -897,8 +898,8 @@ Entrée vocale En savoir plus sur les descriptions d’articles En savoir plus sur les légendes des images - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fr#Descriptions_d\'articles - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/fr#Légendes_d\'images + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/fr#Descriptions_d\'articles + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/fr#Légendes_d\'images Le texte est trop court. Le texte ne doit pas se terminer par une ponctuation. Éviter de commencer avec des articles comme « un » ou « le ». diff --git a/app/src/main/res/values-fy/strings.xml b/app/src/main/res/values-fy/strings.xml index acd8da56f78..588e1da1094 100644 --- a/app/src/main/res/values-fy/strings.xml +++ b/app/src/main/res/values-fy/strings.xml @@ -194,8 +194,8 @@ https://fy.wikipedia.org/wiki/Wikipedy:Gasteboek https://creativecommons.org/licenses/by-sa/4.0/deed.fy https://creativecommons.org/publicdomain/zero/1.0/deed.fy - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Brûkte subprogrammatuer Bydragers <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Tiimside</a> diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 11caab9f0c3..719cfb4a95f 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -235,8 +235,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.gl https://creativecommons.org/publicdomain/zero/1.0/deed.gl - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Bibliotecas empregadas Colaboradores <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Páxina do equipo</a> diff --git a/app/src/main/res/values-ha/strings.xml b/app/src/main/res/values-ha/strings.xml index 4b0a8f599f3..54ccd5e9d9a 100644 --- a/app/src/main/res/values-ha/strings.xml +++ b/app/src/main/res/values-ha/strings.xml @@ -235,8 +235,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Laburaren da aka yi amfani da su Gudummuwa <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Shafin tawaga</a> @@ -836,8 +836,8 @@ Shigar da murya Ƙari koyo game da bayanin labarin Koyi ƙarin bayani game da rubutun hoto - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_cations + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_cations Rubutun ya yi gajeren lokaci. Dole ne rubutun ya ƙare da alamar rubutu ba. Farawa da ƙananan harafi sai dai idan kalmar farko ta dace. diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index feeaadc9bde..ca038d075bd 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -260,8 +260,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags लाइब्रेरीज़ का प्रयोग किया गया योगदानकर्ता <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">टीम पेज</a> @@ -859,8 +859,8 @@ ध्वनि द्वारा लिखें लेख विवरण के बारे में और जानें चित्र कैप्शन के बारे में और जानें - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions पाठ बहुत छोटा है। पाठ विराम चिह्न के साथ समाप्त नहीं होना चाहिए। लोअरकेस से शुरू करें जब तक कि पहला शब्द एक प्रॉपर नाउन न हो। diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 0cc9d373828..8888f730e44 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -217,7 +217,7 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.hr https://creativecommons.org/publicdomain/zero/1.0/deed.hr - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits Korištene biblioteke Doprinositelji <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Timska stranica</a> diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index ca80a0e9f00..7bc4d31892d 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -184,7 +184,7 @@ https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/de https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits Trjebane biblioteki Přinošowarjo Přełožowarjo diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index d69522a5c00..3c713730edd 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -255,8 +255,8 @@ https://hu.wikipedia.org/wiki/Wikipédia:Felhasználói_fiók_kérése https://creativecommons.org/licenses/by-sa/4.0/deed.hu https://creativecommons.org/publicdomain/zero/1.0/deed.hu - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/hu - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/hu#K%C3%A9pc%C3%ADmk%C3%A9k + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/hu + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/hu#K%C3%A9pc%C3%ADmk%C3%A9k Felhasznált szoftverkönyvtárak Közreműködők <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Csapat oldala</a> @@ -865,8 +865,8 @@ Hangbevitel További információk a szócikkleírásokról További információk a képaláírásokról - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/hu#Cikkleírások - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/hu#Képfeliratok + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/hu#Cikkle%C3%ADr%C3%A1sok + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/hu#K%C3%A9pfeliratok A szöveg túl rövid. A szöveg nem végződhet írásjellel. Kerüld az „egy” vagy „a”/„az” névelővel kezdődő szócikkleírásokat. diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 53eaeb4a736..bfc1f8c9bd2 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -237,8 +237,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/ https://creativecommons.org/publicdomain/zero/1.0/ - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Bibliothecas usate Contributores <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Pagina del equipa</a> @@ -841,8 +841,8 @@ Entrata vocal Leger plus sur le descriptiones de articulos Leger plus sur le legendas de imagines - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Le texto es troppo curte. Le texto non debe terminar per un signo de punctuation. Comencia con un littera minuscule, excepte si le prime parola es un nomine proprie. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 883413eab03..041df6113a7 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -268,8 +268,8 @@ https://id.wikipedia.org/wiki/Wikipedia:Mohon_buatkan_akun https://creativecommons.org/licenses/by-sa/4.0/deed.id https://creativecommons.org/publicdomain/zero/1.0/deed.id - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/id - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/id + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Pustaka yang digunakan Kontributor <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Halaman tim</a> @@ -850,8 +850,8 @@ Input suara Pelajari lebih lanjut tentang deskripsi artikel Pelajari lebih lanjut tentang keterangan gambar - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Teksnya terlalu singkat. Teksnya tidak boleh diakhiri dengan tanda baca. Mulailah dengan huruf kecil, kecuali jika kata pertamanya adalah kata benda. diff --git a/app/src/main/res/values-inh/strings.xml b/app/src/main/res/values-inh/strings.xml index 97cd2d5634e..0699068857d 100644 --- a/app/src/main/res/values-inh/strings.xml +++ b/app/src/main/res/values-inh/strings.xml @@ -236,8 +236,8 @@ https://meta.m.wikimedia.org/wiki/Terms_of_Use/inh https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/publicdomain/zero/1.0/deed.ru - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Пайда ийца библиотекаш Автораш <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Тоабан оагӀув</a> @@ -838,8 +838,8 @@ Оазаца Ӏочуяздар Статьяех лаьцачох ма дарра Суртех лаьцачох ма дарра - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/inh#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D1%82%D0%B5%D0%B9 - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/inh#%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8_%D0%BA_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/inh#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D1%82%D0%B5%D0%B9 + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/inh#%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8_%D0%BA_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC Сов лоаца я ер текст. Текста тӀехьа зам латтийта йиш яц. ЗӀамигача алапаца дӀайолае текст, нагахьа санна хьалхара дош цхьан хӀаман е сага цӀи еце. diff --git a/app/src/main/res/values-io/strings.xml b/app/src/main/res/values-io/strings.xml index 6fe01cdabe2..1b0059f850f 100644 --- a/app/src/main/res/values-io/strings.xml +++ b/app/src/main/res/values-io/strings.xml @@ -232,8 +232,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Biblioteki uzita Kontributeri <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Pagino dil esquado</a> @@ -772,8 +772,8 @@ Eniro di voco Lektez pluse pri deskripto di artikli Lektez pluse pri texti (\'\'captions\'\') pri imaji - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions La texto esas tro kurta. La texto ne povas finar per puntizosigno. Komencez skribanta minuskula litero, ecepte se l\'unesma vorto esas propra nomo. diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index b6984900974..d26dd76f02a 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -236,8 +236,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.is https://creativecommons.org/publicdomain/zero/1.0/deed.is - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags notuð aðgerðasöfn framlög frá <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Síða teymisins</a> @@ -832,8 +832,8 @@ Raddskipun Frekari upplýsingar um lýsingar á greinum Frekari upplýsingar um myndatexta - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Textinn er of stuttur. Textinn má ekki enda á greinarmerkjum. Forðastu að byrja greinar með “a” eða “the”. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 0531d6795aa..123de06e20f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -278,8 +278,8 @@ https://it.wikipedia.org/wiki/Aiuto:Come_registrarsi https://creativecommons.org/licenses/by-sa/4.0/deed.it https://creativecommons.org/publicdomain/zero/1.0/deed.it - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags Librerie usate Contributori <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Pagina del gruppo</a> @@ -867,8 +867,8 @@ Input vocale Ulteriori informazioni sulle descrizioni delle voci Ulteriori informazioni sui sottotitoli delle immagini - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Il testo è troppo breve. Il testo non deve terminare con il punto. Evita di iniziare con articoli come \"un\" o \"il\". diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 5d33e15f100..d422b8603d8 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -263,8 +263,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.he https://creativecommons.org/publicdomain/zero/1.0/deed.he - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/he - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/he#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/he + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/he#Image_tags ספריות בשימוש תורמים <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">דף הצוות</a> @@ -932,8 +932,8 @@ קלט קולי מידע נוסף על תיאורי ערכים מידע נוסף על כיתובי תמונה - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions הטקסט קצר מדי. הטקסט לא צריך להסתיים בסימן פיסוק יש להתחיל באות קטנה, אלא אם המילה הראשונה היא שם פרטי. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 1550a6a5348..d88ac95c707 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -291,8 +291,8 @@ //ja.wikipedia.org/wiki/Help:ログイン#アカウントの作成 https://creativecommons.org/licenses/by-sa/4.0/deed.ja https://creativecommons.org/publicdomain/zero/1.0/deed.ja - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ja - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ja + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags 使用しているライブラリ 貢献者 <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">チームページ</a> @@ -881,8 +881,8 @@ 音声入力 記事の説明に関してもっと知る 画像のキャプションに関してもっと知る - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ja#記事の説明 - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ja#画像のキャプション + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ja#記事の説明 + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ja#画像のキャプション 文章が短すぎます。 文章の終わりに句点はつけません。 文章は、最初の語が固有名詞の場合を除いて、小文字で始めます。 diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 843dc301b41..6b2ed831002 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -180,7 +180,7 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://foundation.m.wikimedia.org/wiki/Terms_of_Use - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits Kapustakan sing dienggo Panyumbang Pamertal diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 35a9684b204..295dfddf2e3 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -197,8 +197,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/fr https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Timkaṛḍiyin yettwasqedcen Imttekkiyen <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> diff --git a/app/src/main/res/values-kcg/strings.xml b/app/src/main/res/values-kcg/strings.xml index a9da497ace8..82759473502 100644 --- a/app/src/main/res/values-kcg/strings.xml +++ b/app/src/main/res/values-kcg/strings.xml @@ -171,8 +171,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Á̱tutunkwambwat nang á̱ nyian ta̱m ma̱ng a̱mba Á̱nietnwuat <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index 5985b60c4df..28fc8ba53eb 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -180,8 +180,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags ಕೊಡುಗೆದಾರರು ಅನುವಾದಕರು ಪರವಾನಗಿ diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index e0a83c5b83c..8b306f4dd4e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -258,8 +258,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.ko https://creativecommons.org/publicdomain/zero/1.0/deed.ko - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags 사용된 라이브러리 기여자 <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">팀 페이지</a> @@ -836,8 +836,8 @@ 음성 입력 문서 설명에 대해 더 알아보기 이미지 캡션에 대해 더 알아보기 - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions 텍스트가 너무 짧습니다. 텍스트는 구두점으로 끝나서는 안 됩니다. 처음 오는 단어가 고유 명사가 아니면 소문자로 시작하십시오. diff --git a/app/src/main/res/values-ks/strings.xml b/app/src/main/res/values-ks/strings.xml index 26db16f410c..46903d4c769 100644 --- a/app/src/main/res/values-ks/strings.xml +++ b/app/src/main/res/values-ks/strings.xml @@ -219,8 +219,8 @@ https://foundation.wikimedia.org/wiki/استعمالٕکی شرٲئطہٕ https://en.wikipedia.org/wiki/Wikipedia: کھاتہٕ کھٲترٕ درخواست https://creativecommons.org/publicdomain/zero/1.0/ - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags کُتُب خانہٕ استعمال صٲرفیٖن <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 0ff2b25ee70..2c0e79f960b 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -234,8 +234,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Kitêbxaneyên bikarhatî Tevkar <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Rûpela tîmê</a> @@ -786,8 +786,8 @@ Xistina dengê Zêdetir hîn bibe derbarê danasînên gotaran Zêdetir hîn bibe derbarê binnivîsên wêneyan - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Nivîs pir kurt e. Divê nivîs bi niqteşaniyê xilas nebe. Ger peyva pêşî ne navdêreke xisûsî be, bi herfeke hûrdek dest pê bike. diff --git a/app/src/main/res/values-kus/strings.xml b/app/src/main/res/values-kus/strings.xml index d803f1979af..3ece3c90a9b 100644 --- a/app/src/main/res/values-kus/strings.xml +++ b/app/src/main/res/values-kus/strings.xml @@ -229,8 +229,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Gbana buoris banɛ zaŋi tʋm Tʋntʋnnib <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Tʋntʋnnib lakir</a> @@ -708,8 +708,8 @@ Pian\'a nɛ kʋkɔri kpɛn\'ɛs Zamis atikil pa\'ala bɛdegɔ Zamisim footo pian\'azut yɛla bɛdegʋ - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Sɔbʋg la gimnɛ galis. Pin\'ilim nɛ sɔb Biel baanlim asɛɛ yiiga pian\'uk la na an yʋ\'ʋmɛŋir Da pin\'in nɛ sɔb biel baanlʋgɔ. diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 24dee2ab4a1..3ade457fc70 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -217,7 +217,7 @@ https://lb.wikipedia.org/wiki/Wikipedia:Iwwer_d\'Wikipedia https://foundation.m.wikimedia.org/wiki/Privacy_policy https://foundation.m.wikimedia.org/wiki/Terms_of_Use - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits Benotzt Bibliothéiken Auteuren Iwwersetzer @@ -379,6 +379,9 @@ Spär-ID: %s Dir kënnt <a href=\"%2$s\">%1$s</a> oder een aneren <a href=\"https://lb.wikipedia.org/wiki/Wikipedia:Administrateuren\">Administrateur</a> kontaktéiere fir iwwer d\'Spär ze diskutéieren. Dir kënnt een <a href=\"https://lb.wikipedia.org/wiki/Wikipedia:Administrateuren\">Administrateur</a> kontaktéieren fir iwwer d\'Spär ze diskutéieren. + Dir sidd net ageloggt + Verstanen + Dir benotzt en temporäre Kont Feeler vum Programm Et deet eis Leed, bei der Wikipedai-App ass e Feeler geschitt a se gouf gestoppt.\n\nWëllt Dir se nei starten oder erausgoen? Nei starten @@ -761,8 +764,8 @@ Sprooch Input Méi iwwer Artikelbeschreiwunge gewuer ginn Méi iwwer Bildbeschreiwunge gewuer ginn - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Den Text ass ze kuerz. Den Text däerf net mat engem Sazzeechen ophalen. Fänkt mat engem klenge Buschtaf ob ausser wann dat éischt Wuert e Substantiv oder een Numm ass. diff --git a/app/src/main/res/values-lmo/strings.xml b/app/src/main/res/values-lmo/strings.xml index aaf33eb91a0..ab96a6c4c3b 100644 --- a/app/src/main/res/values-lmo/strings.xml +++ b/app/src/main/res/values-lmo/strings.xml @@ -225,8 +225,8 @@ https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/it#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/lmo https://it.wikipedia.org/wiki/Jut:Come_registràss - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Librerie doprade Contributor <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Pagina del grup</a> diff --git a/app/src/main/res/values-mhr/strings.xml b/app/src/main/res/values-mhr/strings.xml index 0c47a5852bc..42f491f3970 100644 --- a/app/src/main/res/values-mhr/strings.xml +++ b/app/src/main/res/values-mhr/strings.xml @@ -215,8 +215,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/mhr https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.mhr - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/mhr - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/mhr + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Кучылтмо библиотеке-влак Автор-влак <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Командын велыжше</a> @@ -540,8 +540,8 @@ Йӱкан пуртымаш Статьян возен ончыктымашыже нерген кумданрак Сӱрет деке возыш нерген кумданрак - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/mhr#Статьян_возен_ончыктымашыже - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/mhr#Сӱрет_деке_возыш + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/mhr#Статьян_возен_ончыктымашыже + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/mhr#Сӱрет_деке_возыш Тиде текст утыжден кӱчык. Текст препинаний пале-влак дене пытышаш огыл. Икымше мут шкенле вуйлӱм огыл гын, изи буква дене тӱҥал. diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 16c21cbfc6b..9728e67ae1a 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -239,8 +239,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.mk https://creativecommons.org/publicdomain/zero/1.0/deed.mk - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Користени библиотеки Учесници <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Екипна страница</a> @@ -864,8 +864,8 @@ Гласовен внос Дознајте повеќе за описи на статии Дознајте повеќе за толкувања на статии - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Текстот е прекраток. Текстот не смее да завршува со интерпункциски знак. Избегнувајте да започнувате со членовите „a“ и „the“ кога пишувате на англиски. diff --git a/app/src/main/res/values-mnw/strings.xml b/app/src/main/res/values-mnw/strings.xml index 7382f42cebe..b13ead06fb9 100644 --- a/app/src/main/res/values-mnw/strings.xml +++ b/app/src/main/res/values-mnw/strings.xml @@ -231,8 +231,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags တိုက်ဗွဟ်လိက် မသုင်စောဲလဝ် ညးမချူလိက်ဂမၠိုၚ် <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index c0d543e6860..22e2ec2ee45 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -224,8 +224,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://foundation.m.wikimedia.org/wiki/Terms_of_Use/my https://my.wikipedia.org/wiki/ဝီကီပီးဒီးယား:အကောင့်တစ်ခု_တောင်းဆိုရန် - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/my - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/my + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags အသုံးပြုထားသော စာကြည့်တိုက်များ ဆောင်ရွက်ပေးထားသူများ <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">အဖွဲ့စာမျက်နှာ</a> diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index e3c503cca51..35de68442d5 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -250,8 +250,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.no https://creativecommons.org/publicdomain/zero/1.0/deed.no - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Bibliotek brukt Bidragsytere <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Teamets side</a> @@ -855,8 +855,8 @@ Stemmestyring Lær mer om artikkelbeskrivelser Lær mer om bildetekster - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Teksten er for kort. Teksten kan ikke slutte med punktum. Ikke legg til «a» eller «the» i begynnelsen av artikkeltitler. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 8db1876fa29..0ccc9b51c07 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -275,8 +275,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.nl https://creativecommons.org/publicdomain/zero/1.0/deed.nl - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Gebruikte bibliotheken Bijdragers <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Teampagina</a> @@ -879,8 +879,8 @@ Steminvoer Meer informatie over artikelbeschrijvingen Meer informatie over afbeeldingsbijschriften - https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Suggested_edits#Image_captions De tekst is te kort. Tekst mag niet eindigen met een interpuctie. Start met een kleine letter tenzij het eerste woord een eigennaam is. diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index ad51d1977ff..5069f94fe6b 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -219,8 +219,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Offline_reading_and_data https://www.mediawiki.org/wiki/ߥߞߌߡߋߘߌߦߊ߫_ߟߥߊ߬ߟߌ߬ߟߊ߲/ߊ߲ߘߙߏߦߌߘ_ߢߡߢ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags ߛߓߍߘߊ߮ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ߠߊ ߟߎ߬ <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> @@ -722,8 +722,8 @@ ߡߍ߲ߞߊ߲߫ ߠߊߘߏ߲ ߘߏ߫ ߜߘߍ߫ ߟߎ߫ ߘߐߞߊ߬ߙߊ߲߫ ߞߊ߬ ߓߍ߲߬ ߞߎߡߘߊ ߛߓߍ߫ ߢߊ ߞߊ߲߬ ߘߏ߫ ߜߘߍ߫ ߟߎ߫ ߘߐߞߊ߬ߙߊ߲߫ ߖߌ߬ߦߊ߬ߓߍ ߝߍ߬ߛߓߍߟߌ ߞߊ߲߬ - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions ߛߓߍߟߌ ߛߘߎ߬ߡߊ߲߬ ߞߏߖߎ߰. ߛߓߍߟߌ ߕߍ߫ ߞߎ߲߭ߝߊ߰ ߟߊ߫ ߕߏ߲ߘߋߦߊߟߌ ߡߊ߬. ߊ߬ ߘߊߡߌ߬ߣߊ߬ ߞߟߏߘߋ߲߫ ߢߟߋߢߟߋ ߡߊ߬ ߛߐ߲߬ ߝߏ߫ ߞߟߏߘߋ߲߫ ߝߟߐ ߟߋ߬ ߦߋ߫ ߞߍ߫ ߞߟߏ߫ ߓߘߍ ߘߌ߫. diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 81a744bf292..8290b17550c 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -224,8 +224,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ https://foundation.m.wikimedia.org/wiki/Terms_of_Use https://en.wikipedia.org/wiki/Wikipedia:Request_an_account - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags ਵਰਤੀਆਂ ਲਾਇਬ੍ਰੇਰੀਆਂ ਯੋਗਦਾਨੀ <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">ਟੀਮ ਸਫ਼ਾ</a> diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 76a3096d65b..ff48a1c0ce0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -265,8 +265,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.pl https://creativecommons.org/publicdomain/zero/1.0/deed.pl - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pl - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pl + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Użyte biblioteki Autorzy <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Strona zespołu</a> @@ -804,8 +804,8 @@ Zmieniając opis artykułu, wyrażam zgodę na <a href=\"%1$s\"> Warunki korzystania </a> i nieodwołalnie udostępniam moje artykuły na podstawie licencji <a href=\"%2$s\"> Creative Commons CC0 </a>. zwykle zaczynają się od małej litery Wprowadzanie głosowe - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pl#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pl#Article_descriptions + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions Tekst jest zbyt krótki. Tekst nie może kończyć się znakiem interpunkcyjnym. Unikaj rozpoczynania artykułów od „a” bądź „the” (ang). diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2b9dfcb2b8d..54391905ef7 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -276,8 +276,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.pt_BR https://creativecommons.org/publicdomain/zero/1.0/deed.pt_BR - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pt-br - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pt-br + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pt-br + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pt-br Bibliotecas usadas Colaboradores <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Página da equipe</a> @@ -872,8 +872,8 @@ Entrada de voz Saiba mais sobre as descrições de artigos Saiba mais sobre as legendas de imagens - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pt-br#Descrições_de_artigos - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pt-br#Legendas_da_imagem + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pt-br#Descrições_de_artigos + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/pt-br#Legendas_da_imagem O texto é muito curto. O texto não deve terminar com pontuação. Evite começar com artigos como \"a\", \"o\" \"as\" ou \"os\". diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index a01de1160eb..f97cec2c5aa 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -2,6 +2,7 @@ @@ -768,8 +769,8 @@ Desmarcar todos os elementos Filtro de wikis Filtro de tipos - Todas as \"wikis\" - Todos os \"tipos\" + Todas as wikis + Todos os tipos Página de discussão de %s A função não está disponível offline. Porque leu @@ -1593,10 +1594,10 @@ Mapa Lista Descubra artigos da Wikipédia perto de si com Lugares - Toque em <b>\'Ver no mapa\'</b> para explorar a localização deste artigo + Toque em «Ver no mapa» para explorar a localização deste artigo Muito satisfeito Muito insatisfeito - Ajudar a melhorar \"Lugares\" + Ajudar a melhorar «Lugares» Como pode a funcionalidade \"Lugares\" ser melhorada? O que gostaria que mudássemos ou melhorássemos? Esta área está vazia. Reduza a ampliação <a href=\"#\">no mapa</a>. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 51ec4891cd4..222b8234c36 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -135,6 +135,7 @@ Dina Wikipedia-språk Publicera ändringar Redigeringen publicerades! + Redigeringen publicerades! Det kan ta en stund innan ändringarna visas. Redigeringen gick inte att spara! Försök igen Avbryt @@ -177,6 +178,9 @@ Du har loggats ut från Wikipedia. Vill du logga in igen? Logga in Avbryt + Få kontot att försvinna + Varning om försvinnande konto + Att få kontot att försvinna är en <b>sista utväg</b> och bör <b>endast användas när du vill sluta redigera för alltid</b> och även dölja så många av dina tidigare associationer som möjligt.<br/><br/>Konton raderas på Wikipedia genom att ändra kontonamnet för att göra så att andra inte kan känna igen bidragen i en process som kallas kontoförsvinnande. <b>Försvinnande garanterar inte fullständig anonymitet eller att bidrag tas bort från projekten</b>. Inga nyligen lästa artiklar Håll koll på vad du har läst här. En del artiklar i historiken kanske inte kan läsas utan uppkoppling. @@ -244,21 +248,21 @@ Användarvillkor https://sv.wikipedia.org/wiki/Wikipedia:Om https://meta.m.wikimedia.org/wiki/Privacy_policy/sv - https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/sv#Läslistor_och_läsa_offline + https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/sv#Offline_reading_and_data https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/sv https://foundation.m.wikimedia.org/wiki/Terms_of_Use https://en.m.wikipedia.org/w/index.php?title=Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.sv https://creativecommons.org/publicdomain/zero/1.0/deed.sv - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/sv - https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/sv + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/sv#Image_tags Bibliotek som har använts Bidragsgivare - <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Teamsidan</a> + <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android/sv\">Teamsidan</a> Översättare Denna app översattes av de frivilliga översättarna på <a href=\"https://translatewiki.net\">translatewiki.net</a>. Licens - Källkoden finns tillgänglig på <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> och <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> under licensen <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Om inget annat anges är innehållet tillgängligt under licensen <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Erkännande-DelaLika</a>. + Källkoden finns tillgänglig på <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> under licensen <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Om inget annat anges är innehållet tillgängligt under licensen <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Erkännande-DelaLika</a>. En app utvecklad av <a href=\"https://wikimediafoundation.org/\">Wikimedia Foundation</a> Om Ändringar har gjorts i sidan. Är du säker på att du vill lämna den utan att spara dina ändringar? @@ -433,6 +437,19 @@ Du kan kontakta <a href=\"%2$s\">%1$s</a> eller en annan <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administratör</a> för att diskutera blockeringen. Anpassa ditt verktygsfält Du kan kontakta en <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administratör</a> för att diskutera blockeringen. + Du är inte inloggad + Jag förstår + Du använder ett tillfälligt konto + Släng ändringar och logga in + + Kontot upphör om %d dag. + Kontot upphör om %d dagar. + + <b>Du är inte inloggad.</b> När du har gjort en redigering skapas ett temporärt konto för att skydda din integritet. <a href=\"%1$s\">Läs mer</a> + <b>Du använder ett temporärt konto.</b> Din redigering kommer att tillskrivas till %1$s. <a href=\"%2$s\">Läs mer</a>. + <b>Du använder för närvarande ett temporärt konto.</b> Redigeringar som görs med det temporära kontot %1$s kommer inte att överföras till ditt permanenta konto när du loggar in. Logga in eller skapa ett konto för att få erkännande med ditt användarnamn, bland andra förmåner. + Avsluta session + Detta kommer att logga ut dig från ditt temporära konto. Vill du fortsätta? Applikationsfel Tyvärr stötte Wikipedia-appen på ett fel och avslutades.\n\nVill du starta om eller avsluta? Starta om @@ -555,8 +572,8 @@ Artikeln förekommer i flera listor %s kommer inte längre vara tillgänglig offline för alla läslistor: Aktivera synkronisering av läslistor? - Artiklar som har sparats i läslistor kan nu synkroniseras till ditt Wikipedia-konto. <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Synced_reading_lists\">Läs mer</a> - Läslistor kan nu synkroniseras över enheter. Logga in med ditt Wikipediakonto och tillåt dina listor att sparas. <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Synced_reading_lists\">Läs mer</a> + Artiklar som har sparats i läslistor kan nu synkroniseras till ditt Wikipedia-konto. <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/sv#Synced_reading_lists\">Läs mer</a> + Läslistor kan nu synkroniseras över enheter. Logga in med ditt Wikipediakonto och tillåt dina listor att sparas. <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/sv#Synced_reading_lists\">Läs mer</a> Aktivera synkronisering Synkronisera läslistor Läslistor kan nu synkroniseras över enheter. Logga in med ditt Wikipediakonto och tillåt dina listor att sparas. @@ -765,8 +782,8 @@ Avmarkera alla objekt Wikifilter Typfilter - Alla \"wikier\" - Alla \"typer\" + Alla wikier + Alla typer %ss diskussionssida Funktionen är inte tillgänglig när du saknar uppkoppling. Eftersom du läste @@ -854,8 +871,8 @@ Röstinmatning Läs mer om artikelbeskrivningar Läs mer om bildtexter - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/sv#Artikelbeskrivningar - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/sv#Bildtexter + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/sv#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/sv#Image_captions Texten är för kort. Texten får inte sluta med ett skiljetecken. Undvik att inleda med artiklar som \"ett\" eller \"en\". @@ -1228,6 +1245,15 @@ Höjd px Infoga + Sök efter mallar + Infoga + t.ex. %s + %s (valfritt) + %s (föreslagen) + Läs mer + Mallar är användargenererade och kanske saknar fullständiga beskrivningar. + Mallen \"%s\" har ännu ingen beskrivning. + Den här mallen saknar <a href=\"%1$s\">TemplateData</a> och dess parametrar har <a href=\"%2$s\">genererats automatiskt</a>. Därför saknar mallen och dess parametrar beskrivningar. Hjälp Logga in / skapa konto på Wikipedia Hej, %s. Visste du att alla kan redigera på Wikipedia? @@ -1251,8 +1277,10 @@ Meddelandetitel Publicera Avbryt + Spara inte Meddelandet publicerades på redigerarens användardiskussionssida Meddelandet sparades och publicerades på redigerarens användardiskussionssida + Sparade meddelanden Den här diskussionssidan är tom. Konversationen börjar här Diskussionssidor är platsen där folk diskuterar hur man gör innehåll på Wikipedia så bra som möjligt. Börja med att lägga till ett nytt diskussionsämne för att få kontakt och samarbeta med en gemenskap av wikipedianer. @@ -1263,6 +1291,7 @@ Skriv meddelande Meddelandet kan inte vara tomt. Ämnet kan inte vara tomt. + Ämnesnamnet finns redan. Prova ett annat. Svaret skickades. Ångra <b>Senast redigerad %1$s</b> av %2$s @@ -1458,7 +1487,7 @@ Hej! Jag skulle vilja dela min Wikipedia-läslista med dig: Kan du hjälpa oss att förbättra \"Dela läslistor\"? \"Dela läslistor\" är en testfunktion och vi behöver din återkoppling för att förbättra eller ta bort den. - Du har inga varningsmeddelanden sparade. + Skapa dina egna meddelanden eller använd <a href=\"#\">exempelmeddelanden</a> för att komma igång. Nytt meddelande Ämne Skriv meddelande @@ -1484,6 +1513,8 @@ Meddelanden har raderats Titeln kan inte vara tom. + Dina meddelanden + Exempelmeddelanden Sök eller filtrera redigeringar Taggar: %s Inga @@ -1569,10 +1600,29 @@ Neutral Inte nöjd Hur kan vi förbättra funktionen? + Artikelns redigeringshistorik Återkoppling Skicka Återkoppling har skickats. Tryck på överflödesmenyn för att skicka återkoppling när som helst under \"Problem med funktion\". + Vandalismvarning + Redigeringstester + Neutral synvinkel + Automatisk översättning + Påminnelse om intressekonflikt + Sista varningen + Varning om upphovsrättsbrott + Lämna en redigeringssammanfattning + Censurera inte + Förslag på förbättring av artikel + Eftersom du har gjort flera destruktiva redigeringar kommer detta att fungera som din sista varning. Skulle du vandalisera Wikipedia igen kommer du att förbjudas att redigera. + Din senaste redigering verkar innehålla upphovsrättsskyddat material utan tillstånd. Se till att allt innehåll följer Wikipedias policyer om [[Wikipedia:Copyrights|upphovsrätt]] för att undvika borttagning. + Hej {{{username}}}, det verkar som att du har tagit bort innehåll från Wikipedia utan att lämna en redigeringssammanfattning. Lämna en redigeringssammanfattning när du lägger till eller tar bort innehåll på Wikipedia. + Hej {{{username}}}, det verkar som att du har tagit bort innehåll utan att diskutera detta på artikelns diskussionssida. Observera att Wikipedia inte censureras och innehåll bör inte tas bort eftersom det är kontroversiellt. Om du anser att informationen är felaktig, var god nå en konsensus på artikelns diskussionssida. + Läs mer om platshållare för meddelanden + Använd ett exempelmeddelande nedan för att anpassa, skicka och spara i dina meddelanden. + Hej {{{username}}}. Din artikel är en bra början! För att göra det ännu bättre kan du överväga att lägga till fler referenser till pålitliga källor. Detta hjälper till att verifiera informationen och förbättrar artikelns kvalitet. Se Wikipedias riktlinjer för [[Wikipedia:Reliable_sources|pålitliga källor]] för mer information. + Redigera Acceptera Avvisa Sidproblem From 2cc2eadbda2dedb39e3484d55f18add04f006b1c Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 15 Apr 2024 18:10:00 +0530 Subject: [PATCH 050/626] Localisation updates from https://translatewiki.net. (#4594) --- app/src/main/res/values-ast/strings.xml | 9 +-- app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 55 ++++++++++++-- app/src/main/res/values-es/strings.xml | 35 ++++++--- app/src/main/res/values-fa/strings.xml | 2 +- app/src/main/res/values-ky/strings.xml | 3 + app/src/main/res/values-mhr/strings.xml | 15 ++++ app/src/main/res/values-oc/strings.xml | 2 + app/src/main/res/values-scn/strings.xml | 95 ++++++++++++++++++++++++- 9 files changed, 196 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index bd7a2b3c1a1..3f198a83561 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -64,7 +64,7 @@ Ver l\'historial d\'ediciones Ver nun mapa Lleer n\'otra llingua - Disponible\'n %d idiomes más + Disponible en %d llingües más Al publicar, aceutes les <a href=\"%1$s\">Condiciones d\'usu</a>, y lliberar ensin torgues les tos collaboraciones baxo los términos de la llicencia <a href=\"%2$s\">CC BY-SA 3.0</a>. Al publicar, aceutes les <a href=\"%1$s\">Condiciones d\'usu</a>, y lliberar ensin torgues les tos collaboraciones baxo la llicencia <a href=\"%2$s\">CC BY-SA 3.0</a>. Les ediciones atribuiránse a la dirección IP del to preséu. Si <a href=\"https://#login\">anicies sesión</a>, tendrás más intimidá. Llingües de Wikipedia @@ -172,9 +172,9 @@ La to cuenta nun tienes permisos abondo pa editar esta páxina nesti momentu. Esta páxina nun puede editase de mou anónimu nesti momentu. Esta páxina ta protexida - Configuración - Configuración - Tocante a la app de Wikipedia + Axustes + Axustes + Tocante a l\'aplicación Wikipedia Política d\'intimidá Condiciones d\'usu https://ast.wikipedia.org/wiki/Wikipedia:Tocante_a @@ -735,6 +735,7 @@ Bucea nel universu de Wikipedia cola canal Esplorar, siempres anovándose.<br><b>Personaliza</b> la canal colo que t\'interese (por casu, conocer los acontecimientos históricos n\'<b>Un día como güei</b>, o xugar a los daos con <b>Al debalu</b>). Llistes de llectura con sincronización Puedes facer llistes de llectura a partir d\'artículos que quies lleer sero, inclusive cuando teas ensin conexón. <br/>Anicia sesión cola to cuenta de Wikipedia pa sincronizar les llistes de llectura. <a href=\"#login\">Xúnite a Wikipedia</a> + Datos y privacidá Unviar datos d\'usu Entendílo Atopamos les siguientes nel to preséu: diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 0b01966ab6a..61ea699ada6 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1125,6 +1125,7 @@ Capbusseu-vos a l\'univers de la Viquipèdia amb el canal d\'actualització contínua «Exploreu». <br/><b>Personalitzeu</b> el canal amb els vostres interessos, llegiu sobre els esdeveniments històrics d\'<b>Un dia com avui</b> o jugueu als daus amb l\'<b>Article a l\'atzar</b>. Llistes de lectura amb sincronització Podeu fer llistes de lectura d\'articles que voleu llegir més endavant, fins i tot quan sigueu fora de línia. <br/>Inicieu una sessió al vostre compte de Viquipèdia per sincronitzar les llistes de lectura. <a href=\"#login\">Uniu-vos a la Viquipèdia</a> + Dades i privadesa Envia les dades d\'ús Entesos Hem trobat el següent en el dispositiu: diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index f4b76fb6fd9..a65f22125c2 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -253,8 +253,8 @@ https://foundation.m.wikimedia.org/wiki/Terms_of_Use https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/publicdomain/zero/1.0/deed.da - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Special:MyLanguage/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Anvendte biblioteker Bidragsydere <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Teamside</a> @@ -437,6 +437,25 @@ Du kan kontakte <a href=\"%2$s\">%1$s</a> eller en anden <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administrator</a> for at diskutere blokeringen. Tilpas din værktøjslinje Du kan kontakte en <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administrator</a> for at diskutere blokeringen. + Du er ikke logget ind + Når du har foretaget en redigering, vil der blive oprettet en <b>midlertidig konto</b> til dig for at beskytte dit privatliv. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Lær mere</a> .<br /><br /> <a href=\"https://#login\">Log ind</a> eller <a href=\"https://#login\">opret en konto</a> for at få kredit for fremtidige redigeringer og for at få adgang til andre funktioner. + Din redigering vil blive tilskrevet %1$s. Din IP-adresse vil være synlig for administratorer.<br /><br />Hvis du <a href=\"https://#login\">logger ind</a> eller <a href=\"https://#login\">opretter en konto</a>, vil dine redigeringer blive tilskrevet et navn, du vælger, blandt andre fordele. + Forstået + Du bruger en midlertidig konto + Kassér ændringer og log ind + + Midlertidig konto %1$s blev oprettet efter din redigering blev offentliggjort. Den udløber om %2$d dag. + Den midlertidige konto %1$s blev oprettet, efter din redigering blev offentliggjort. Den udløber om %2$d dage. + + + Konto udløber om %d dag. + Konto udløber om %d dage. + + <b>Du er ikke logget ind.</b> Når du har foretaget en redigering, oprettes en midlertidig konto til dig for at beskytte dit privatliv. <a href=\"%1$s\">Lær mere</a> + <b>Du bruger en midlertidig konto.</b> Din redigering vil blive tilskrevet til %1$s. <a href=\"%2$s\">Lær mere</a>. + <b>Du bruger i øjeblikket en midlertidig konto.</b> Redigeringer foretaget med den midlertidige konto %1$s vil ikke blive overført til din permanente konto, når du logger ind. Log ind eller opret en konto for at få kredittering til dit brugernavn, blandt andre fordele. + Afslut session + Dette vil logge dig ud af din midlertidige konto. Vil du fortsætte? Applikationsfejl Vi beklager, Wikipedia-appen er stødt på en fejl, og blev afsluttet.\n\nVil du starte forfra eller afslutte? Start forfra @@ -858,8 +877,8 @@ Taleinput Lær mere om artikelbeskrivelser Lær mere om billedtekster - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Teksten er for kort. Teksten må ikke ende med skilletegn. Begynd med et lille bogstav med mindre det første ord er et egennavn. @@ -1467,6 +1486,7 @@ Beskeden er slettet Beskederne er slettet + Dine beskeder Tags: %s Ingen Vis brugerside @@ -1498,6 +1518,11 @@ Betydning Mindre ændringer Ikke-mindre ændringer + + %d filter + %d filtre + + Artiklens redigeringshistorik Er du sikker på, at du vil rulle ændringerne tilbage? Tilbageføring fuldført Vis @@ -1508,14 +1533,36 @@ Overvåg Advar Opret, send og gem advarselsmeddelelser på en bidragyders diskussionsside. + Er du tilfreds med denne funktion? Tilfreds Neutral Utilfreds + Hvordan kan vi forbedre funktionen? + Artiklens redigeringshistorik Feedback Indsend Feedback indsendt. + Advarsel om muligt hærværk + Neutral synvinkel + Automatisk oversættelse + Påmindelse om interessekonflikt + Sidste advarsel + Advarsel om mulig krænkelse af ophavsret + Giv et redigeringsresumé + Undlad at censurere + Forslag til artikelforbedring + Hej {{{username}}}, jeg vil gerne fortælle dig, at jeg har tilbageført et eller flere af dine [{{{diffLink}}}|nylige bidrag], fordi de ikke virker konstruktive. Hvis du mener, jeg har lavet en fejl eller har spørgsmål, kan du lægge en besked på [[User talk:{{{senderUserName}}}|min diskussionsside]]. Vær opmærksom på, at eventuel hærværk kan føre til restriktioner. + Hej {{{username}}}, jeg er glad for, at Wikipedia har fanget din opmærksomhed, og at du er interesseret i at lære, hvordan du kan redigere her. Redigeringstesten du lavede virkede; Du skal dog huske på, at målet med dette projekt er at udvikle en pålidelig og komplet encyklopædi, som alle kan benytte. Din redigering påvirkede indholdet, så det er blevet fjernet.\nHvis du vil lære at redigere Wikipedia, står [[Wikipedia:Sandbox|sandbox]] til din rådighed. Hvis dine kommentarer var specifikke for en artikel, er det korrekte sted artiklens diskussionsside. + Fordi du har lavet flere destruktive redigeringer, er dette din sidste advarsel. Skulle du igen vandalisere Wikipedia, vil du blive udelukket fra at redigere. + Din seneste redigering ser ud til at inkludere ophavsretligt beskyttet materiale uden tilladelse. Sørg for at alt indhold overholder denne Wikipedias [[Wikipedia:Copyrights|copyright]]-politikker for at undgå fjernelse. + Hej {{{username}}}, det ser ud til, at du har fjernet indhold fra Wikipedia uden at efterlade et redigeringsresumé. Efterlad venligst et redigeringsresumé, hver gang du tilføjer eller fjerner indhold til Wikipedia. + Hej {{{username}}}, det ser ud til, at du har fjernet indhold uden at diskutere det på artiklens diskussionsside. Bemærk venligst, at Wikipedia ikke er censureret, og indhold bør ikke fjernes, fordi det er kontroversielt. Hvis du mener, at oplysningerne er unøjagtige, bedes du nå til enighed på artiklens diskussionsside. + Hej {{{username}}}. Din artikel er en god start! For at gøre det endnu bedre, overvej at tilføje flere referencer til pålidelige kilder. Dette hjælper med at verificere oplysningerne og forbedrer artiklens kvalitet. Tjek denne Wikipedias retningslinjer om [[Wikipedia:Reliable_sources|pålidelige kilder]] for flere detaljer. + Rediger Accepter Afvis + Problemer med siden + Mindre fejlrettelser og forbedringer Gå tilbage Åbn i systembrowser Steder diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index de2a4b2e876..5a1870e4a0b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -52,6 +52,7 @@ * Josecurioso * Juan Cuartas * KATRINE1992 +* Kidneyspr * Ktranz * La Mantis * Luisangelrg @@ -156,7 +157,7 @@ Cambiar idioma Buscar en artículo Añadir a lista de seguimiento - Ver + Vigilar Dejar de vigilar Ver página de discusión Paǵina de discusión @@ -246,9 +247,9 @@ Se ha cerrado tu sesión en Wikipedia. ¿Quieres volver a iniciarla? Iniciar sesión Cancelar - Cuenta desaparecida + Desaparecer cuenta Advertencia de cuenta desaparecida - La desaparición es un <b>último recurso</b> y solo se debe cuando desee dejar de editar para siempre y también para ocultar tantas asociaciones pasadas como sea posible.<br/><br/> La eliminación de cuentas en Wikipedia se hace cambiando el nombre de su cuenta para que otros no puedan reconocer sus contribuciones en un proceso llamado desaparición de cuentos. <b>La desaparición no garantiza el anonimato total ni elimina las contribuciones a los proyectos</b>. + La desaparición es un <b>último recurso</b> y solo se debe usar cuando desee dejar de editar para siempre y también para ocultar tantas asociaciones pasadas como sea posible.<br/><br/> La eliminación de cuentas en Wikipedia se hace cambiando el nombre de su cuenta para que otros no puedan reconocer sus contribuciones en un proceso llamado desaparición de cuentas. <b>La desaparición no garantiza el anonimato total ni elimina las contribuciones a los proyectos</b>. No hay hay artículos visitados recientemente Consulta lo que has leído aquí. Es posible que algunos artículos del historial no aparezcan al estar sin conexión. @@ -330,7 +331,7 @@ Traductores Esta aplicación fue traducida por traductores voluntarios en <a href=\"https://translatewiki.net\">translatewiki.net</a>. Licencia - Código fuente disponible en <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> y <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> bajo la <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Licencia Apache 2.0</a>. A menos que se especifique lo contrario, el contenido está disponible bajo la <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_4.0_Unported_License\">Licencia Atribución-CompartirIgual de Creative Commons</a>. + Código fuente disponible en <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> bajo la <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Licencia Apache 2.0</a>. A menos que se especifique lo contrario, el contenido está disponible bajo la <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_4.0_Unported_License\">Licencia Atribución-CompartirIgual de Creative Commons</a>. Un producto de <a href=\"https://wikimediafoundation.org/es/?noredirect=es_ES\">Fundación Wikimedia</a> Acerca de Se ha modificado la página. ¿Quieres salir sin guardar los cambios? @@ -400,7 +401,7 @@ ¿Confirmas la descarga a través de datos móviles? Tienes activado «Descargar solo mediante wifi». ¿Quieres permitir el uso del plan de datos móviles durante esta descarga solamente? Permitir - Más información + Seguir leyendo Acerca de este artículo Ir a la página del archivo No se pudo dibujar la imagen. @@ -453,9 +454,9 @@ Redirigido desde \"%s\" Obtener indicaciones No se pudo encontrar ninguna aplicación que proporcione indicaciones. - Canal explorar + Canal Explorar Mostrar vistas previas de enlaces - Personaliza el canal explorar + Personaliza el canal Explorar Mostrar una vista previa rápida de los artículos al pulsar en los enlaces. Minimizar tablas Minimizar automáticamente tablas en los artículos, como por ejemplo cajas de información, referencias y notas. @@ -694,9 +695,11 @@ Aceptar Eliminar Lista de lectura: %s + Lista compartida Guardar Guardar lista Asigne un nombre a la lista y seleccione los artículos a guardar + Título Cancelar Guardar Preferencias @@ -837,7 +840,7 @@ Compartir Ocultar esta tarjeta Tarjeta ocultada. - Edita los idiomas de la tarjeta + Editar los idiomas de la tarjeta Más opciones Imagen destacada de Wikimedia Commons Explorar @@ -1081,9 +1084,11 @@ Añadiste %d etiquetas %1$d %2$s + Ayer ¿Sabías que todos pueden editar Wikipedia? Las ediciones sugeridas son una nueva forma de editar Wikipedia en Android. Te ayudan a hacer pequeñas pero vitales contribuciones a Wikipedia. ¡Nuestro objetivo es hacer que la edición sea más fácil y accesible para todos! Accede o únete a Wikipedia para comenzar. Acceder / unirse a Wikipedia + Etiqueta de imagen Tu edición es la más reciente en Wikipedia Más ediciones sugeridas Descripciones sugeridas @@ -1111,10 +1116,11 @@ Añadiste %d caracteres Imágenes del artículo - Agrega las imágenes sugeridas a los artículos de la Wikipedia para mejorar la comprensión + Agrega las imágenes sugeridas a los artículos de Wikipedia para mejorar la comprensión ¿Agregarías esta imagen al artículo? Tutorial + No ¿Por qué no? Tu respuesta puede mejorar futuras sugerencias. La imagen no es relevante @@ -1158,6 +1164,7 @@ Piérdete en la vastedad de Wikipedia a través del canal de exploración, siempre al día.<br/> <b>Personaliza</b> el canal en función de lo que te interesa. Aprende sobre acontecimientos históricos en <b>Un día como hoy</b> o lanza un dado virtual mediante <b>Aleatorio</b>. Listas de lectura con sincronización Puedes crear listas de los artículos que quieras leer más tarde, incluso sin conexión. <br/>Accede a tu cuenta de Wikipedia para sincronizar tus listas de lectura. <a href=\"#login\">Únete a Wikipedia</a> + Datos y privacidad Enviar datos de uso Entendido Encontramos lo siguiente en tu dispositivo: @@ -1228,7 +1235,7 @@ Leyenda Etiqueta que se muestra junto al elemento para todos los lectores Texto alternativo - Descripción de texto para lectores quiénes no pueden ver la imagen + Descripción para lectores con discapacidad visual Configuraciones avanzadas Envolver el texto alrededor de la imagen Posición de imagen @@ -1292,6 +1299,7 @@ Wikipedia - discusiones en página de discusión Temas de búsqueda Subscribirse + Compartir Icono de usuario Leer Sin leer @@ -1321,7 +1329,7 @@ Línea eliminada Párrafo añadido Párrafo eliminado - Deshacer la edición + ¿Estás seguro de que quieres deshacer esta edición? Esto deshará los cambios realizados por la(s) revisión(es) del artículo mostrado aquí. Para continuar, proporcione un motivo para deshacer esta edición: La revisión se deshizo. @@ -1372,6 +1380,7 @@ %d filtro %d filtros + Más información sobre resúmenes de edición Categorías Artículos Subcategorías @@ -1398,6 +1407,7 @@ <b>Cuenta de: </b> %s <b>Editar recuento: </b> %s Historial de edición del artículo + Enviar Advertencia de vandalismo Pestañas de edición Punto de vista neutral @@ -1425,6 +1435,9 @@ Rechazar Informe de problema: función de recomendaciones de imágenes He tenido un problema con la función de recomendación de imagen:\n- [Describe el problema en concreto]\n\nEl resultado que me gustaría ver es:\n- [Describe la solución propuesta] + Mapa + Lista + Cancelar ¿Qué quieres que cambiemos o mejoremos? Esta área está vacía. Alejar <a href=\"#\">el mapa</a> . diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index a4e4930ab28..5ac5c437693 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -435,7 +435,7 @@ محتوای آفلاین را ترجیح بده به‌جای دریافت آخرین نسخهٔ مقاله، با بارگیری محتوایی که در حالت آفلاین در دسترس است، می‌توانید در مصرف داده صرفه‌جویی کنید تطبیق با زمینه سامانه - محتوا تحت $1 در دسترس است، مگر اینکه خلافش ذکر شده‌باشد. + محتوا تحت $1 در دسترس است، مگر اینکه خلافش ذکر شده باشد. زبانۀ جدید ذخیرهٔ همهٔ برگه‌ها دسترسی حساب کاربری یا نشانی آی‌پی شما قطع شده است. diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index 695d93c9354..8e3369fa56f 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -119,6 +119,7 @@ авторлор Котормочулар Бул тиркеме <a href=\"https://translatewiki.net\">translatewiki.net</a>\'деги ыктыярчылар тарабынан которулган. + Лицензия <a href=\"https://wikimediafoundation.org/\">Уикимедиа Фонду</a>нун өнүмү Тиркеме жөнүндө Барак өзгөрүлдү. Сиз өзгөртүүлөрдү сактабай чыгууңузга ишенесизби? @@ -152,6 +153,7 @@ Альфа-нусканын жаңы жаңылануусу жеткиликтүү Жүктөп алуу үчүн басыңыз Жабуу + Бөлүшүү Ооба Жок Жабуу @@ -177,6 +179,7 @@ Жокко чыгаруу Башка Жүктөп алуу + Бөлүшүү бүгүнкү Жокко чыгаруу Жокко чыгаруу diff --git a/app/src/main/res/values-mhr/strings.xml b/app/src/main/res/values-mhr/strings.xml index 42f491f3970..2b20b62c235 100644 --- a/app/src/main/res/values-mhr/strings.xml +++ b/app/src/main/res/values-mhr/strings.xml @@ -117,6 +117,7 @@ Тыйын Википедийысе йылме-влак Вашталтышым савыкташ Вашталтышым аралыме! + Тӧрлымаш савыктыме! Вашталтыш лекташлан жап кӱлеш лийын кертеш. Тӧрлатыме годым йоҥылыш! Уэштараш Чараш @@ -159,6 +160,8 @@ Тый Википедий шке аккаунт гыч лектынат. Угыч пурынет? Пураш Чараш + Аккаунт йоммаш + Аккаунт йоммо нерген палдарымаш Шукерте огыл ончен лекме статья уке Тыште тыйын лудмо статья-влакым эскере. Эртылыкысе южо велыж-влак офлайн шот дене логалдыме лийын кертыт. @@ -198,12 +201,19 @@ Синхронизаций Трафикым кучылтмаш Экспериментлык + Лудмо спискым ик шотыш кондымаш Лудашлан спсике гыч статья-влакым тулен налаш + %s гыч ик шотыш кондымо лудмо списке влакым кораҥгдаш? Тӧрсыр лекме нерген отчётым колтедылаш + Чарыме домен-влаклан (%s) кылверлам мумо. Поро лий, нуным кораҥде да угыч тӧчен ончо. Фильтрын историйже Тиде кылверым ончыктен кертме огыл + Тиде велыж тичмашын огыл аралыме. + Тиде велыжым тичмашын аралыме. + Тиде велыж тыгай кӱкшытлаште аралыме:%s Чаманыман, кызытсе жаплан тиде велыжым тӧрлаташлан тыйын аккаунтын ситыше праваже уке. Чаманыман, кызытсе жаплан тиде велыжым лӱмдымын тӧрлатылаш огеш лий. + Тиде велыж аралыме Эскерыме спискыш ешараш Келыштарымаш Келыштарымаш @@ -256,11 +266,15 @@ Шижтарымашым тӧрлаташ Порылий, тӧрлатымаш деч ончыч лудын лек Тӧрлымаш нерген шижтарымашым вигак ончыктылаш + Статья тӧрлымӧ нерген палдарымашым ончалашлан тиде кнопкым темдал. Умбакыже муаш Ондыкше муаш Тиде икымше икгайлык Тиде пытартыш икгайлык + Тиде йӧрдымӧ тӧрлымаш лийын кертеш. Тый тудым савыктынетак? + Тый тиде тӧрлымашым савыктен от керт. Поро лий, пӧртыл да тудым вашталте. Икгайрак велыж-влак + Тый тидын нерген ойлет \"%s\"? Пытартыш кычалмаш: Лектыш уке @@ -268,6 +282,7 @@ %d лектыш Пытартыш кычалме йодмаш спискым эрыкташ + Тый кычалмаш эртылыкым эрыктынетак? Туге Уке Веб-велыжым почын кертме огыл (браузерын приложенийжым мумо огыл). diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index bdb8cb4a119..775d3da3ded 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -316,5 +316,7 @@ Edicions suggeridas Edicions suggeridas Darrièr comentari: %s + per 1 mes + 1 mes Problèmas de la pagina diff --git a/app/src/main/res/values-scn/strings.xml b/app/src/main/res/values-scn/strings.xml index f38a0d6894f..0a0ec28fd24 100644 --- a/app/src/main/res/values-scn/strings.xml +++ b/app/src/main/res/values-scn/strings.xml @@ -9,55 +9,131 @@ Wikipedia Beta Wikipedia Alfa Wikimedia + N\'arreri + N\'arreri + Arricerca supra Wikipedia + Arricerca vucali + Arricerca na lingua + Arricerca nti l\'elenchi Canciamenti Àutri cosi + Arricerca + Nun fu pussìbbili cunnèttirisi a Internet. Ripruva Ripruva Ripruva Ripruva Ripruva + N avanti Cancella la crunuluggìa + %s rimovutu dâ crunuluggìa + %d vuci rimuvuti dâ crunuluggìa Annulla Annulla + Mpustazzioni di l\'appricazzioni Crunuluggìa Mmàggini: %s Pàggina: %s Wikimedia Commons Wikidata + Svanca crunuluggìa di navigazzioni + Si cunfermi cancillirai tutta la tò crunuluggìa di navigazzioni e chiudirai tutti li schedi apruti attualimenti. Sî sìcuru? No Cunnividi cu + Cunnividi tràmiti + Riinnirizzamentu di %s + Crunuluggìa dî canciamenti: %s <b>n</b> %s + Uggettu canciamentu vacanti + Arricerca o filtri li canciamenti + Filtra pi + Tutti li canciamenti (%s) + Canciamenti di l\'utenti (%s) + Canciamenti anònimi (%s) + Canciamenti dî bot (%s) + Statìstichi dû %1$s ô %2$s + + %1$d canciamentu dû %2$s + %1$d canciamenti dû %2$s + + + %1$d canciamentu dû %2$s (%3$s) + %1$d canciamenti dû %2$s (%3$s) + + Pruva a canciari li <a href=\"#\">filtri</a> pi taliari cchiù canciamenti + Ammustra schedi Cancia lingua + Attrova ntâ vuci Agghiunci â lista taliata Talìa + Nun taliari cchiù Talìa la pàggina di discussioni Pàggina di discussioni Talìa la crunuluggìa dî canciamenti + Crunuluggìa dî canciamenti + Leva dâ lista taliata Talìata + Attrova ntâ pàggina + Caràttiri e tema + Agghiunci a l\'elencu di littura Sarva + Agghiunci a l\'elencu di littura Sarva + Cunnividi lijami Cunnividi vuci Cunnividi + Apri na scheda nova + Scheda nova + Elenchi di littura + Taliati ricentimenti + Archiviu + Apri + Apri nt\'una scheda nova + Copia lu nnirizzu dû lijami + Difinizzioni + Cunnividi + Cunnividi Cancia ccà + Cancia vuci + Ùrtimu aggiurnamentu %s Talìa la pàggina di discussioni Talìa la crunuluggìa dî canciamenti + Talìa supra la mappa Leggi n n\'àutra lingua Dispunìbbili n àutri %d lingui + Pubbricannu, accetti li nostri <a href=\"%1$s\">cunnizzioni d\'usu</a> e accetti di rilassari li tò cuntribbuti sutta la licenza <a href=\"%2$s\">CC BY-SA 4.0</a>. + Pubbricannu, accetti li nostri <a href=\"%1$s\">cunnizzioni d\'usu</a> e accetti di rilassari li tò cuntribbuti sutta la licenza <a href=\"%2$s\">CC BY-SA 4.0</a>. Li canciamenti vinirannu attribbuiti ô nnirizzu IP dû tò dispusitivu. Si <a href=\"https://#login\">trasi</a> avirrai majuri privacy. + Li canciamenti vinirannu attribbuiti ô nnirizzu IP dû tò dispusitivu. Si <a href=\"https://#login\">trasi</a> avirrai majuri privacy. Lingui di Wikipedia Risciduta + Sta pàggina nun è dispunìbbili n àutri lingui. + Nudda lingua attruvata Àutri lingui Li tò lingui di Wikipedia - Sarva i canciamenti + Pùbbrica li canciamenti + Canciamentu pubbricatu! + Canciamentu nun arrinisciutu! + Ripruva Annulla + Li tò canciamenti nun hannu stati ancora pubbricati. Sî sicuri di vuliri nèsciri di sta pàggina? + Lassa + Arresta + Ìnnici Nuddu risurtatu attruvatu Nuddu risurtatu attruvatu n \"%s\" + Nuddu risurtatu attruvatu nti l\'elenchi di littura Nuddu risurtatu attruvatu ntâ crunuluggìa + P\'aiutari a cummàttiri lu spam autumàticu, nzirisci pi favuri li palori chi cumpàrunu sutta + Nun arrinesci a taliari la mmàggini? <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Request_an_account\">Richiedi nu cuntu</a> + Arripeti li palori di supra Nzirisci lu CAPTCHA + Tocca lu CAPTCHA p\'arricaricari Trasi supra Wikipedia Nomu utenti Password Password + Còdici autentificazzioni a dui fattura Trasi Trasi Trasi @@ -74,17 +150,34 @@ Nisciutu Trasi Annulla + Arricerca Wikipedia n cchiù lingui <big>W</big>IKIPEDI<big>A</big> Nomu utenti + Nun hai un cuntu? Ti scurdasti la password? + Hai già nu cuntu? Crea nu cuntu Email (facultativu) Nnirizzu email nun vàlidu + Caràttiri nun vàliddi ntû nomu utenti + Nun fu pussìbbili criari lu cuntu \'N avanti + Crea nu cuntu senza nu nnirizzu di posta elittrònica? Agghiunci nu nnirizzu email Criazzioni dûn cuntu + Lu nomu utenti \"%s\" nun è dispunìbbili. Pi favuri, scegghi nu nomu diffirenti. + https://it.wikipedia.org/wiki/Wikipedia:Politiche_di_blocco_degli_utenti Dittagghî Ginirali + Cuntu + Wikipedia App FAQ + Manna cummentu supra l\'appricazzioni + Cuntu criatu! + Sincrunizzazzioni + Usu dî dati + Sincrunizzazzioni di l\'elenchi di littura + Scàrrica li vuci nti l\'elenchi di littura + Cancillari l\'elenchi di littura sincrunizzati di \"%s\"? Agghiunci â lista taliata Mpustazzioni Mpustazzioni From ed73f024cd0ebbb56a0c7db177441aa3160d77d1 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 15 Apr 2024 14:20:42 -0700 Subject: [PATCH 051/626] Add zh and ig for thrid roll-out for Patroller Tasks (#4595) --- .../suggestededits/SuggestedEditsRecentEditsActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsActivity.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsActivity.kt index 71310ddd1cd..051bd21ddf4 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsActivity.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsActivity.kt @@ -36,7 +36,7 @@ class SuggestedEditsRecentEditsActivity : SingleFragmentActivity Date: Tue, 16 Apr 2024 06:27:24 -0700 Subject: [PATCH 052/626] Use coroutine on BecauseYouRead client (#4592) Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/dataclient/Service.kt | 4 +- .../becauseyouread/BecauseYouReadClient.kt | 104 +++++++++--------- 2 files changed, 52 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index 3dac230c8a8..b439f348967 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -102,11 +102,11 @@ interface Service { "&origin=*&piprop=thumbnail&prop=pageimages|description|info|pageprops" + "&inprop=varianttitles&smaxage=86400&maxage=86400&pithumbsize=" + PREFERRED_THUMB_SIZE ) - fun searchMoreLike( + suspend fun searchMoreLike( @Query("gsrsearch") searchTerm: String?, @Query("gsrlimit") gsrLimit: Int, @Query("pilimit") piLimit: Int, - ): Observable + ): MwQueryResponse // ------- Miscellaneous ------- diff --git a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt index 1b2b8d75b59..3285ee3ef2d 100644 --- a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt +++ b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt @@ -1,10 +1,12 @@ package org.wikipedia.feed.becauseyouread import android.content.Context -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.WikipediaApp @@ -14,68 +16,62 @@ import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.feed.FeedCoordinator import org.wikipedia.feed.dataclient.FeedClient -import org.wikipedia.history.HistoryEntry import org.wikipedia.util.StringUtil +import org.wikipedia.util.log.L class BecauseYouReadClient : FeedClient { - - private val disposables = CompositeDisposable() - + private var clientJob: Job? = null override fun request(context: Context, wiki: WikiSite, age: Int, cb: FeedClient.Callback) { cancel() - disposables.add( - Observable.fromCallable { - AppDatabase.instance.historyEntryWithImageDao().findEntryForReadMore(age, - context.resources.getInteger(R.integer.article_engagement_threshold_sec)) + clientJob?.cancel() + clientJob = CoroutineScope(Dispatchers.Default).launch( + CoroutineExceptionHandler { _, caught -> + L.v(caught) + cb.success(emptyList()) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ entries -> - if (entries.size <= age) cb.success(emptyList()) else getCardForHistoryEntry(entries[age], cb) - }) { cb.success(emptyList()) }) - } + ) { + withContext(Dispatchers.Main) { + val entries = AppDatabase.instance.historyEntryWithImageDao().findEntryForReadMore(age, context.resources.getInteger(R.integer.article_engagement_threshold_sec)) + if (entries.size <= age) { + cb.success(emptyList()) + } else { + val entry = entries[age] + val langCode = entry.title.wikiSite.languageCode + // If the language code has a parent language code, it means set "Accept-Language" will slow down the loading time of /page/related + // TODO: remove when https://phabricator.wikimedia.org/T271145 is resolved. + val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(langCode).isNullOrEmpty() + val searchTerm = StringUtil.removeUnderscores(entry.title.prefixedText) + val relatedPages = mutableListOf() - override fun cancel() { - disposables.clear() - } + val moreLikeResponse = ServiceFactory.get(entry.title.wikiSite).searchMoreLike("morelike:$searchTerm", + Constants.SUGGESTION_REQUEST_ITEMS, Constants.SUGGESTION_REQUEST_ITEMS) - private fun getCardForHistoryEntry(entry: HistoryEntry, cb: FeedClient.Callback) { + val headerPage = PageSummary(entry.title.displayText, entry.title.prefixedText, entry.title.description, + entry.title.extract, entry.title.thumbUrl, langCode) - // If the language code has a parent language code, it means set "Accept-Language" will slow down the loading time of /page/related - // TODO: remove when https://phabricator.wikimedia.org/T271145 is resolved. - val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(entry.title.wikiSite.languageCode).isNullOrEmpty() - val searchTerm = StringUtil.removeUnderscores(entry.title.prefixedText) - disposables.add(ServiceFactory.get(entry.title.wikiSite) - .searchMoreLike("morelike:$searchTerm", - Constants.SUGGESTION_REQUEST_ITEMS, Constants.SUGGESTION_REQUEST_ITEMS) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .flatMap { response -> - val relatedPages = mutableListOf() - val langCode = entry.title.wikiSite.languageCode - relatedPages.add(PageSummary(entry.title.displayText, entry.title.prefixedText, entry.title.description, - entry.title.extract, entry.title.thumbUrl, langCode)) - response.query?.pages?.forEach { - if (it.title != searchTerm) { - relatedPages.add(PageSummary(it.displayTitle(langCode), it.title, it.description, - it.extract, it.thumbUrl(), langCode)) + moreLikeResponse.query?.pages?.forEach { + if (it.title != searchTerm) { + if (hasParentLanguageCode) { + val pageSummary = ServiceFactory.getRest(entry.title.wikiSite).getPageSummary(entry.referrer, it.title) + relatedPages.add(pageSummary) + } else { + relatedPages.add(PageSummary(it.displayTitle(langCode), it.title, it.description, + it.extract, it.thumbUrl(), langCode)) + } + } } + + FeedCoordinator.postCardsToCallback(cb, + if (relatedPages.isEmpty()) emptyList() + else listOf(toBecauseYouReadCard(relatedPages, headerPage, entry.title.wikiSite)) + ) } - Observable.fromIterable(relatedPages) - } - .concatMap { pageSummary -> - if (hasParentLanguageCode) ServiceFactory.getRest(entry.title.wikiSite).getSummary(entry.referrer, pageSummary.apiTitle) - else Observable.just(pageSummary) } - .observeOn(AndroidSchedulers.mainThread()) - .toList() - .subscribe({ list -> - val headerPage = list.removeAt(0) - FeedCoordinator.postCardsToCallback(cb, - if (list.isEmpty()) emptyList() - else listOf(toBecauseYouReadCard(list, headerPage, entry.title.wikiSite)) - ) - }) { caught -> cb.error(caught) }) + } + } + + override fun cancel() { + clientJob?.cancel() } private fun toBecauseYouReadCard(results: List, pageSummary: PageSummary, wikiSite: WikiSite): BecauseYouReadCard { From 418f2266e2de6fc59a45190e263eb1a4a6227bf3 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 16 Apr 2024 07:19:54 -0700 Subject: [PATCH 053/626] Fix: The Featured Article widget cannot show the content properly (#4596) Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt | 2 +- .../java/org/wikipedia/widgets/WidgetProviderFeaturedPage.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt b/app/src/main/java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt index 080aa3ee784..a8596a0c1d4 100644 --- a/app/src/main/java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt +++ b/app/src/main/java/org/wikipedia/widgets/WidgetFeaturedPageWorker.kt @@ -43,7 +43,7 @@ class WidgetFeaturedPageWorker( val pageTitle = summary.getPageTitle(app.wikiSite) pageTitle.displayText = summary.displayTitle - WidgetProviderFeaturedPage.forceUpdateWidget(applicationContext, pageTitle, false) + WidgetProviderFeaturedPage.forceUpdateWidget(applicationContext, pageTitle) Result.success() } catch (e: Exception) { diff --git a/app/src/main/java/org/wikipedia/widgets/WidgetProviderFeaturedPage.kt b/app/src/main/java/org/wikipedia/widgets/WidgetProviderFeaturedPage.kt index ccd601ee643..a39e8b245c2 100644 --- a/app/src/main/java/org/wikipedia/widgets/WidgetProviderFeaturedPage.kt +++ b/app/src/main/java/org/wikipedia/widgets/WidgetProviderFeaturedPage.kt @@ -95,7 +95,7 @@ class WidgetProviderFeaturedPage : AppWidgetProvider() { companion object { private var lastServerUpdateMillis = 0L - fun forceUpdateWidget(context: Context, pageTitle: PageTitle? = null, sendIntent: Boolean = true) { + fun forceUpdateWidget(context: Context, pageTitle: PageTitle? = null) { val appWidgetManager = AppWidgetManager.getInstance(context.applicationContext) val ids = appWidgetManager.getAppWidgetIds(ComponentName(context.applicationContext, WidgetProviderFeaturedPage::class.java)) ids.forEach { id -> @@ -105,7 +105,7 @@ class WidgetProviderFeaturedPage : AppWidgetProvider() { options.putParcelable(Constants.ARG_TITLE, bundle) appWidgetManager.updateAppWidgetOptions(id, options) } - if (ids.isNotEmpty() && sendIntent) { + if (ids.isNotEmpty()) { context.sendBroadcast(Intent(context, WidgetProviderFeaturedPage::class.java) .setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE) .putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)) From 3391cd67a954a6b755dc74602baa987e8831357b Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 16 Apr 2024 12:49:49 -0400 Subject: [PATCH 054/626] Fix Gallery playback of Ogg and other audio files. (#4599) --- .../org/wikipedia/gallery/GalleryItemFragment.kt | 13 ++++++------- .../java/org/wikipedia/gallery/MediaListItem.kt | 2 ++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt b/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt index e9c51dfaba0..ceaef115b64 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt @@ -184,7 +184,7 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener } .subscribe({ response -> mediaPage = response.query?.firstPage() - if (FileUtil.isVideo(mediaListItem.type)) { + if (FileUtil.isVideo(mediaPage?.imageInfo()?.mime.orEmpty())) { loadVideo() } else { loadImage(ImageUrlUtil.getUrlForPreferredSize(mediaInfo!!.thumbUrl, @@ -197,7 +197,7 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener } private fun getMediaInfoDisposable(title: String, lang: String): Observable { - return if (FileUtil.isVideo(mediaListItem.type)) { + return if (mediaListItem.isVideo) { ServiceFactory.get(if (mediaListItem.isInCommons) Constants.commonsWikiSite else pageTitle!!.wikiSite).getVideoInfo(title, lang) } else { @@ -209,13 +209,12 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener private val videoThumbnailClickListener: View.OnClickListener = object : View.OnClickListener { private var loading = false override fun onClick(v: View) { - val derivative = mediaInfo?.getBestDerivativeForSize(Constants.PREFERRED_GALLERY_IMAGE_SIZE) - if (loading || derivative == null) { + if (loading) { return } - val bestDerivative = derivative.src + val bestUrl = mediaInfo?.getBestDerivativeForSize(Constants.PREFERRED_GALLERY_IMAGE_SIZE)?.src ?: mediaInfo?.originalUrl ?: return loading = true - L.d("Loading video from url: $bestDerivative") + L.d("Loading video from url: $bestUrl") binding.videoView.visibility = View.VISIBLE mediaController = MediaController(requireActivity()) if (!DeviceUtil.isNavigationBarShowing) { @@ -244,7 +243,7 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener loading = false true } - binding.videoView.setVideoURI(Uri.parse(bestDerivative)) + binding.videoView.setVideoURI(Uri.parse(bestUrl)) } } diff --git a/app/src/main/java/org/wikipedia/gallery/MediaListItem.kt b/app/src/main/java/org/wikipedia/gallery/MediaListItem.kt index 977b8d2cba0..67020882895 100644 --- a/app/src/main/java/org/wikipedia/gallery/MediaListItem.kt +++ b/app/src/main/java/org/wikipedia/gallery/MediaListItem.kt @@ -19,6 +19,8 @@ class MediaListItem constructor(val title: String = "", val isInCommons get() = srcSets.firstOrNull()?.src?.contains(Service.URL_FRAGMENT_FROM_COMMONS) == true + val isVideo get() = type == "video" + fun getImageUrl(deviceScale: Float): String { var imageUrl = srcSets[0].src var lastScale = 1.0f From 96429ba61c1ab26aca10c4c44147e637d33c7562 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 16 Apr 2024 13:09:28 -0400 Subject: [PATCH 055/626] Update gradle and a few libraries. (#4598) Co-authored-by: Cooltey Feng --- app/build.gradle | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 267c8e1036f..9f478279144 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -173,7 +173,7 @@ dependencies { // Debug with ./gradlew -q app:dependencies --configuration compile String okHttpVersion = '4.12.0' - String retrofitVersion = '2.10.0' + String retrofitVersion = '2.11.0' String glideVersion = '4.16.0' String mockitoVersion = '5.2.0' String leakCanaryVersion = '2.13' @@ -182,7 +182,7 @@ dependencies { String mlKitVersion = '17.0.5' String roomVersion = "2.6.1" String espressoVersion = '3.5.1' - String serialization_version = '1.6.2' + String serialization_version = '1.6.3' String metricsVersion = '2.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/build.gradle b/build.gradle index ab82023b168..7099c7d7ba5 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:8.3.1' + classpath 'com.android.tools.build:gradle:8.3.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath 'com.google.gms:google-services:4.4.1' From 4c52f465b9e919b67f1828ced99990d67bd094c0 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 16 Apr 2024 10:41:22 -0700 Subject: [PATCH 056/626] Bump versionCode. (#4600) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9f478279144..236642b5cbe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50481 + versionCode 50482 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From 8115d65f8a7333558d058854d1cd4e3ac01e7f03 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 17 Apr 2024 09:57:07 -0700 Subject: [PATCH 057/626] Replace Warn text and icon with Talk text and icon in Edit Patrol Onboarding screen (#4601) * Replace Warn text and icon with Talk text and icon in Edit Patrol onboarding screen * Remove all warn related strings --- .../layout/view_onboarding_patroller_tasks.xml | 18 +++++++++--------- app/src/main/res/values-b+sr+Latn/strings.xml | 2 -- app/src/main/res/values-b+tt+Cyrl/strings.xml | 1 - app/src/main/res/values-ba/strings.xml | 2 -- app/src/main/res/values-be/strings.xml | 2 -- app/src/main/res/values-bew/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-br/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 2 -- app/src/main/res/values-dag/strings.xml | 2 -- app/src/main/res/values-dga/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 2 -- app/src/main/res/values-ha/strings.xml | 2 -- app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-ia/strings.xml | 2 -- app/src/main/res/values-in/strings.xml | 2 -- app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-iw/strings.xml | 2 -- app/src/main/res/values-ja/strings.xml | 2 -- app/src/main/res/values-ko/strings.xml | 2 -- app/src/main/res/values-lb/strings.xml | 1 - app/src/main/res/values-mhr/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 2 -- app/src/main/res/values-nb/strings.xml | 2 -- app/src/main/res/values-nl/strings.xml | 2 -- app/src/main/res/values-pt/strings.xml | 2 -- app/src/main/res/values-qq/strings.xml | 4 ++-- app/src/main/res/values-sd/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 2 -- app/src/main/res/values-sr/strings.xml | 2 -- app/src/main/res/values-sv/strings.xml | 2 -- app/src/main/res/values-tly/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 2 -- app/src/main/res/values-uk/strings.xml | 2 -- app/src/main/res/values-uz/strings.xml | 2 -- app/src/main/res/values-zh-rTW/strings.xml | 2 -- app/src/main/res/values-zh/strings.xml | 1 - app/src/main/res/values/strings.xml | 4 ++-- 42 files changed, 13 insertions(+), 75 deletions(-) diff --git a/app/src/main/res/layout/view_onboarding_patroller_tasks.xml b/app/src/main/res/layout/view_onboarding_patroller_tasks.xml index 9ab04dd7513..0844ce895b4 100644 --- a/app/src/main/res/layout/view_onboarding_patroller_tasks.xml +++ b/app/src/main/res/layout/view_onboarding_patroller_tasks.xml @@ -99,10 +99,10 @@ android:layout_marginTop="24dp"> diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index e22c3c26e54..96cb3576e6f 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -1493,8 +1493,6 @@ Vidite produktivnu izmenu? Zahvalite se korisniku za njegov doprinos. Nadgledaj Da li želite da pratite izmene članka? Dodajte ga na svoj spisak nadgledanja. Pogledajte ga pod \'Više\'. - Upozori - Pravite, šaljite, i čuvajte poruke upozorenja na uredničkoj stranici za razgovor Poništi/vrati Odaberite \'Poništi\' da bi ste poništili ili vratili potencionalnu destruktivnu izmenu. Pomozite nam da unapredimo ovu mogućnost diff --git a/app/src/main/res/values-b+tt+Cyrl/strings.xml b/app/src/main/res/values-b+tt+Cyrl/strings.xml index 643ff799e84..310bdd7231d 100644 --- a/app/src/main/res/values-b+tt+Cyrl/strings.xml +++ b/app/src/main/res/values-b+tt+Cyrl/strings.xml @@ -1508,7 +1508,6 @@ Күбрәк белергә Рәхмәт Күзәтү - Кисәтү Кире кагу/Кире кайтару Бу функцияне яхшыртырга ярдәм итегез Сезне бу функция канәгатьләндерәме? diff --git a/app/src/main/res/values-ba/strings.xml b/app/src/main/res/values-ba/strings.xml index 014a323281d..f761010e208 100644 --- a/app/src/main/res/values-ba/strings.xml +++ b/app/src/main/res/values-ba/strings.xml @@ -1526,8 +1526,6 @@ Һөҙөмтәле үҙгәртеү күрәһегеҙме? Индергән өлөшө өсөн ҡатнашыусыға рәхмәт әйтегеҙ. Күҙәтергә Мәҡәләләрҙәге үҙгәртеүҙәрҙе күҙәтеп барырға теләйһегеҙме? Күҙәтеү исемлегегеҙгә өҫтәгеҙ. Уны \"Ентеклерәк\" тип аталған бүлектә ҡарағыҙ. - Иҫкәртеү - Мөхәррирҙең фекер алышыу битендә иҫкәртеү хәбәрҙәрен яҙығыҙ, ебәрегеҙ, һаҡлағыҙ. Кире алырға Зыянлы үҙгәртеүҙе кире алыу өсөн \"Кире алырға\" ғәмәлен һайлағыҙ. Мөхәррирләү викиҙың боҙолоуына килтерәме икәнен күҙаллай. diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 5c2268b157c..fb75649e60a 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1621,8 +1621,6 @@ Бачыце прадуктыўную праўку? Дзякуй карыстальнікам за іх уклад. Назіраць Хочаце адсочваць праўкі артыкулаў? Дадайце ў свой спіс назірання. Праглядзіце яго ў раздзеле \"Яшчэ\". - Папярэджанне - Стварыць, адправіць і захаваць папярэджанні на старонцы абмеркавання карыстальніка. Адмена/Адкат Выберыце \"Адкаціць\" для скасавання або адкату патэнцыйна разбуральнай праўкі. \"Пашкоджанне\" прадказвае, калі праўка прычыняе шкоду ў вікі. diff --git a/app/src/main/res/values-bew/strings.xml b/app/src/main/res/values-bew/strings.xml index 3417d841ee9..d6c45b04d6c 100644 --- a/app/src/main/res/values-bew/strings.xml +++ b/app/src/main/res/values-bew/strings.xml @@ -1496,7 +1496,6 @@ Belajarin lebi lanjut Makasi Pantengin - Wanti-wanti Balikin/Aterèt Terima Tolak diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 6c3b890dac3..daefbd8e002 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1284,7 +1284,6 @@ Споделяне на списъка за четене с други Благодарност Наблюдение - Предупреждение Помогнете ни да подобрим тази възможност Доволни ли сте от тази възможност? Задоволителна diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 24717c95cfa..69c9a59e1a7 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -1302,7 +1302,6 @@ Gouzout hiroc\'h Trugarekaat Evezhiañ - Diwall Roit hoc\'h ali Kas Sav-boent neptu diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 61ea699ada6..8ea9882550e 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1543,7 +1543,6 @@ Contribuïu a la supervisió i aprovació de les edicions de la Viquipèdia. Agraeix Vigila - Avisa Ajudeu-nos a millorar aquesta funcionalitat Esteu satisfet amb aquesta funcionalitat? Satisfet diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index a65f22125c2..e4997bd6f73 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1531,8 +1531,6 @@ Tak Ser du en produktiv redigering? Tak en bruger for bidraget. Overvåg - Advar - Opret, send og gem advarselsmeddelelser på en bidragyders diskussionsside. Er du tilfreds med denne funktion? Tilfreds Neutral diff --git a/app/src/main/res/values-dag/strings.xml b/app/src/main/res/values-dag/strings.xml index 94291d36f7e..827da1c94af 100644 --- a/app/src/main/res/values-dag/strings.xml +++ b/app/src/main/res/values-dag/strings.xml @@ -1518,8 +1518,6 @@ Nyam maliniŋ din nyɛ chirichi? Puhimi ka paɣi ba ni bɛ tohibu maa Lihima A bori ni a tooi doli lahabali maliniŋnima? dinŋuna zaŋmili pahi a nini ni pa shɛŋa zuɣu. A ni tooi yulli \'din pahi\' yaɣili - zuɣuni kpahibu lahabali - Namma, zaŋ n-ti ha, ka gu zuɣu kpahibu lahabaya niŋ ŋun su maliniŋ yɛltɔɣa paagi ni yihimi niŋsim/labisim nyaanga Piimi \'m bi lanniŋ\' n yihi niŋsim bee n labisi yihi maliniŋ din ni tooi ti lahabali barina. Barina buɣisi ti lahabali di yi niŋ ka maliniŋ ni too tahi barina na Wiki puuni. diff --git a/app/src/main/res/values-dga/strings.xml b/app/src/main/res/values-dga/strings.xml index ecf0a5dae43..af2c8f46561 100644 --- a/app/src/main/res/values-dga/strings.xml +++ b/app/src/main/res/values-dga/strings.xml @@ -1455,7 +1455,6 @@ Zɛgere wikipiideɛ yelbulo papa ne deedee duori maale eŋ paala leɛkaabo ane hakelɛ teɛbo, soŋguubo ane korɔ maale enneba eŋyuori. Bareka Bɛll - Kpãã Leɛ e/leɛ puori Soŋ te baa nandaa ŋa A nandaa ŋa sege fo laa? diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 5ac5c437693..302a55cb227 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1491,7 +1491,6 @@ تشکر ویرایش سازنده‌ای می‌بینید؟ از کاربر برای مشارکت‌شان تشکر کنید پیگیری - هشدار خنثی‌سازی/واگردانی آیا از این ویژگی راضی هستید؟ راضی diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 88586386241..5fbd51b896a 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1566,7 +1566,6 @@ Näetkö hyvän muokkauksen? Kiitä käyttäjää. Tarkkaile Haluatko tarkkailla artikkelien muokkauksia? Lisää artikkeli tarkkailuluetteloosi. Löydät sen \"Lisää\"-valikosta. - Varoita Kumoa Valitse \"Kumoa\" kumotaksesi mahdollisesti haitallisen muokkauksen. Auta meitä parantamaan tätä ominaisuutta diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 229aa30ba9c..cc84f097056 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1601,8 +1601,6 @@ Vous voyez une modification pertinente ? Remerciez un utilisateur pour sa contribution ! Suivre Vous souhaitez suivre les modifications d’articles ? Ajoutez à votre liste de surveillance. Consultez-la sous « Plus ». - Avertissement - Créez, envoyez et stockez des messages d’avertissement sur la page de discussion d’un éditeur. Annuler/Restaurer Choisissez « Annuler » pour révoquer ou annuler une modification potentiellement problématique. Dommage prédit si une modification cause des dommages à un wiki. diff --git a/app/src/main/res/values-ha/strings.xml b/app/src/main/res/values-ha/strings.xml index 54ccd5e9d9a..4fb5752e5a7 100644 --- a/app/src/main/res/values-ha/strings.xml +++ b/app/src/main/res/values-ha/strings.xml @@ -1536,8 +1536,6 @@ Dubi gyare-gyare mai amfani? Na gode wa mai amfani saboda gudummawar da suka bayar. Kalli Yana so ya bi diddigin gyaran labarin? Ƙara a cikin Watchlist. Dubi shi a ƙarƙashin \'More\'. - Gargadi - Ka ƙirƙira, aikawa, da adana saƙonnin gargadi a shafin tattaunawa na edita. Maimaita/Bayarwa Zaɓi \'Undo\' don warwarewa ko juyawa wani gyare-gyare mai lalacewa. Lalacewar tana hasashen idan gyare-gyare yana haifar da lalacewa ga wiki. diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index ca038d075bd..09612410a03 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1440,7 +1440,6 @@ रद्द करें संदेश हटाएँ कोई नहीं - चेतावनी क्या आप इस सुविधा से संतुष्ट हैं? संतुष्ट ना संतुष्ट ना असंतुष्ट diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 3c713730edd..ef7da7b5d1a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1579,7 +1579,6 @@ Köszönet Hatékony szerkesztést láttál? Köszönd meg a felhasználó közreműködését! Lap figyelése - Figyelmeztetés Visszavonás/visszaállítás A potenciálisan romboló hatású szerkesztés visszavonásához vagy visszaállításához válassza a „Visszavonás” lehetőséget. A sérülés előrejelzi, ha egy szerkesztés kárt okoz a wikin. diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index bfc1f8c9bd2..51c2a3148fe 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -1540,8 +1540,6 @@ Vide tu un modification productive? Regratia le autor de illo pro su contribution. Observar Vole traciar le modificationes de un articulo? Adde lo a tu Observatorio. Iste se trova sub ‘Plus’. - Advertir - Crear, inviar e immagazinar messages de advertimento sur le pagina de discussion de un redactor. Disfacer/Revocar Elige ‘Disfacer’ pro disfacer o revocar un modification potentialmente destructive. ‘Damnos’ previde si un modification causa damnos a un wiki. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 041df6113a7..2d77b164f92 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -1525,8 +1525,6 @@ Melihat suntingan yang produktif? Ucapkan terima kasih kepada pengguna atas kontribusinya. Pantau Ingin melacak suntingan artikel? Tambahkan ke Daftar Pantauan Anda. Lihat di bawah \'Lainnya\'. - Peringatkan - Membuat, mengirim, dan menyimpan pesan peringatan di halaman pembicaraan editor. Batalkan/Kembalikan Pilih \'Batalkan\' untuk membatalkan atau mengembalikan penyuntingan yang berpotensi merusak. Kerusakan memperkirakan jika suatu suntingan menyebabkan kerusakan pada wiki. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 123de06e20f..5606b35d3e7 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1498,7 +1498,6 @@ Ringrazia Osserva Vuoi tenere traccia delle modifiche delle voci? Aggiungilo alla tua lista osservati. Visualizzalo in \"Altro\". - Avvisi Annulla/Ripristina Scegli \"Annulla\" per annullare o ripristinare una modifica potenzialmente distruttiva. Sei soddisfatto di questa funzionalità? diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 3d641d3fcad..4fba30c7d83 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -1694,8 +1694,6 @@ רואה עריכה מועילה? אפשר לשלוח תודה למשתמש על תרומתו. מעקב רוצה לעקוב אחר עריכות בערך? אפשר להוסיף לרשימת המעקב שלך. אפשר להציג אותה תחת \"עוד\". - אזהרה - יצירה, שליחה ואחסון של הודעות אזהרה בדף שיחה של עורך. ביטול/שחזור יש לבחור \"ביטול\" כדי לבטל או לשחזור עריכה שעשויה להיות הרסנית. מדד \"נזק\" מנבא אם עריכה גורמת נזק לוויקי. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d88ac95c707..436e5d387bc 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1573,8 +1573,6 @@ 最近の編集のフィードを積極的にレビューし、他の編集者にガイダンス、品質管理、励ましを提供することで、Wikipedia コンテンツの品質を向上させます。 感謝 ウォッチ - 警告 - 編集者のトーク ページで警告メッセージを作成、送信、保存します。 取り消し/巻き戻し この機能の改善にご協力ください この機能に満足していますか? diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 8b306f4dd4e..b2a17d2b140 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1511,8 +1511,6 @@ 감사 표현 주시 문서의 편집 내용을 추적하고 싶으신가요? 주시문서 목록에 추가하세요. \'더보기\'에서 확인하세요. - 경고 - 편집자의 토론 페이지에 경고 메시지를 만들고, 보내고, 저장하세요. 편집 취소/일괄 되돌리기 문서 훼손 가능성이 있는 편집을 실행 취소하거나 되돌리려면 \'실행 취소\'를 선택하세요. 손해는 이 편집으로 위키가 훼손될 것인지 예측합니다. diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 3ade457fc70..32e8d6ad58d 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -1312,7 +1312,6 @@ Merci Dir gesitt eng produktiv Ännerung? Sot dem Benotzer Merci fir seng Kontributioun. Iwwerwaachen - Warnen Hëlleft eis dës Funktioun ze verbesseren Sidd Dir zefridde mat dëser Funktioun? Zefridden diff --git a/app/src/main/res/values-mhr/strings.xml b/app/src/main/res/values-mhr/strings.xml index 2b20b62c235..3eab3f897b9 100644 --- a/app/src/main/res/values-mhr/strings.xml +++ b/app/src/main/res/values-mhr/strings.xml @@ -778,6 +778,5 @@ Айдеме (бот огыл) Ончалаш Эскераш - Шижтарымаш Ӧрдыжтараш diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 9728e67ae1a..d7a90036855 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -1581,8 +1581,6 @@ Видовте продуктивно уредување? Заблагодарете му се не корисникот. Набљудувај Сакате да гу следите уредувањата во статијата? Додајте ја во Набљудуваните. Погледајте ја во „Повеќе“. - Предупреди - Создавајте, испраќајте и складирајте предупредителни пораки на корисничка разговорна страница. Враќање/Поништување Изберете „Врати“ за да поништите или отповикате потенцијално штетно уредување. Штетата предвидува дали едно уредување ќе причини штета на едно вики. diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 35de68442d5..698f28ae6ec 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1561,8 +1561,6 @@ Ser du en produktiv redigering? Takk en bruker for bidraget. Overvåk Vil du spore artikkelredigeringer? Legg til på overvåkningslisten din. Se den under «Mer». - Advar - Opprett, send og lagre advarselsmeldinger på en bidragsyters diskusjonsside. Omgjør/Tilbakestill Velg «Gjør om» for å omgjøre eller tilbakestille en potensielt ødeleggende redigering. Skade forutsier om en redigering forårsaker skade på en wiki. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b91ba122c1e..138cf164af1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1592,8 +1592,6 @@ Ziet u een productieve bewerking? Bedank een gebruiker voor diens bijdrage. Volgen Wilt u de bewerkingen van een artikel bijhouden? Voeg het toe aan uw volglijst. Bekijk het onder ‘Meer’. - Waarschuwen - Creëer, verzend en bewaar waarschuwingsberichten op de overlegpagina van een redacteur. Ongedaan maken/terugdraaien Kies ‘Ongedaan maken’ om een mogelijk schadelijke bewerking ongedaan te maken of terug te draaien. Schade voorspelt of een bewerking schade aan een wiki veroorzaakt. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index ba2d3412a6a..c3cf4a9c9f3 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1559,8 +1559,6 @@ Viu uma edição produtiva? Agradeça a um utilizador a contribuição. Vigiar Quer monitorizar as edições do artigo? Adicione-o às suas páginas vigiadas. Veja-o em \'Mais\'. - Avisar - Criar, enviar e armazenar mensagens de aviso na página de discussão de um editor. Desfazer/Reverter Escolher \'Desfazer\' para desfazer ou reverter uma edição potencialmente destrutiva. \"Danos\" prevê se uma edição causa dano a uma wiki. diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index a3098a1aa31..2712bb71ff9 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1609,8 +1609,8 @@ Content of the thank section of the second patroller tasks onboarding screen. Title of the watch section of the second patroller tasks onboarding screen. Content of the watch section of the second patroller tasks onboarding screen. - Title of the warn section of the second patroller tasks onboarding screen. - Content of the warn section of the second patroller tasks onboarding screen. + Title of the talk section of the second patroller tasks onboarding screen. + Content of the talk section of the second patroller tasks onboarding screen. Title of the undo/rollback section of the second patroller tasks onboarding screen. Content of the undo/rollback section of the second patroller tasks onboarding screen. Text of the first tooltip for edit diff screen. diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml index 21eddbee391..651ef96bea0 100644 --- a/app/src/main/res/values-sd/strings.xml +++ b/app/src/main/res/values-sd/strings.xml @@ -1448,7 +1448,6 @@ وڌيڪ ڄاڻيو مھرباني چئو نظر۾رکو - چِتاءُ ڏيو اڻڪريو/واپس موٽايو ھن خصوصيت کي بھتر ڪرڻ ۾ اسان جي مدد ڪريو ڇا توھان ھن خصوصيت سان مطمئن آھيو؟ diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 699c0937d84..488a9f33717 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -1632,8 +1632,6 @@ Vidite produktivno urejanje? Zahvalite se uporabniku za njegov prispevek. Opazuj Želite spremljati urejanje člankov? Dodajte jih na svoj spisek nadzorov. Oglejte si ga pod »Več«. - Opozorilo - Ustvarjajte, pošljajte in shranjujte opozorilna sporočila na urejevalčevi pogovorni strani. Razveljavi/vrni Izberite »Razveljavi«, da razveljavite ali vrnete morebitno škodljivo urejanje. Škoda napoveduje, ali urejanje škoduje vikiju. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 1868aeb6eae..9e3b80064a8 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1556,8 +1556,6 @@ Видите продуктивну измену? Захвалите се кориснику за његов допринос. Надгледај Да ли желите да пратите измене чланка? Додајте га на свој списак надгледања. Погледајте га под \'Више\'. - Упозори - Правите, шаљите, и чувајте поруке упозорења на уредничкој страници за разговор Поништи/врати Одаберите \'Поништи\' да би сте поништили или вратили потенционалну деструктивну измену. Помозите нам да унапредимо ову могућност diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 222b8234c36..07c6bbf5653 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1588,8 +1588,6 @@ Har du hittat en produktiv redigering? Tacka en användare för deras bidrag. Bevaka Vill du spåra artikelredigeringar? Lägg till i din bevakningslista. Se den under \"Mer\". - Varna - Skapa, skicka och lagra varningsmeddelanden på en redigerares diskussionssida. Gör ogjord/Rulla tillbaka Välj \"Gör ogjord\" för att återställa en potentiellt destruktiv redigering. Skada förutsäger om en redigering orsakar skada på en wiki. diff --git a/app/src/main/res/values-tly/strings.xml b/app/src/main/res/values-tly/strings.xml index 6b725f469af..ba4787409cf 100644 --- a/app/src/main/res/values-tly/strings.xml +++ b/app/src/main/res/values-tly/strings.xml @@ -1011,7 +1011,6 @@ Ve omute Sepas Rymuz kardej - Cocašin Ǧəbul kardej Ohaštej Səhifə problemon diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c41aeeef36d..caf13c7eefb 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1584,8 +1584,6 @@ Verimli bir düzenleme mi gördünüz? Katkılarından dolayı bir kullanıcıya teşekkür edin. İzle Madde düzenlemelerini takip etmek mi istiyorsunuz? İzleme Listenize ekleyin. \'Diğer\' altında görüntüleyin. - Uyar - Bir düzenleyicinin tartışma sayfasında uyarı iletileri oluşturun, gönderin ve saklayın. Geri Al/Geri Döndür Zararlı olabilecek bir düzenlemeyi geri almak ya da geri döndürmek için \'Geri Al\'ı seçin. Hasar, bir düzenlemenin vikiye zarar verip vermeyeceğini kestirir. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index bf241fc0c52..2c6e11fbfc1 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1628,8 +1628,6 @@ Бачите продуктивне редагування? Подякуйте користувачу за їхній внесок. Спостереження Хочете відстежувати редагування статті? Додайте її до свого списку спостереження. Перегляньте його в розділі «Більше». - Попередження - Створюйте, надсилайте та зберігайте попереджувальні повідомлення на сторінці обговорення редактора. Скасування / відкіт Виберіть «Скасувати», щоб скасувати або повернути потенційно деструктивні зміни. «Шкода» передбачає, що редагування завдає шкоди вікі. diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 4e5cecc05e0..5c8d4694adb 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -1544,8 +1544,6 @@ Samarali tahrir qilmoqchimisiz? Foydalanuvchiga hissasi uchun tashakkur. Kuzatmoq Maqola tahrirlarini kuzatishni xohlaysizmi? Kuzatuv roʻyxatingizga qoʻshing. Uni \'Batafsil\' koʻrib chiqing. - Ogohlantirish - Tahrirlovchining munozara sahifasida ogohlantirish xabarlarini yarating, yuboring va saqlang. Bekor qilish/Qayta tiklash Ehtimoliy notoʻgʻri tahrirni bekor qilish yoki orqaga qaytarish uchun “Bekor qilish” bandini tanlang. Zarar, tahrir vikiga zarar yetkazish yoki yo‘qligini bashorat qiladi. diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 997b24ad7cf..b032e97134c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1608,8 +1608,6 @@ 有看到優質內容的編輯嗎?來對使用者感謝他們的貢獻。 監視 想要追蹤條目的編輯嗎?添加到您的監視清單。在「更多」下方查看。 - 警告 - 在編輯者的討論頁面上建立、發送,和儲存警告訊息。 撤銷/回退 選擇「撤銷」以撤銷或回退可能帶有破壞性的編輯。 破壞預測編輯是否有對 wiki 造成破壞。 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 460454e1a49..67ce87ee101 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1573,7 +1573,6 @@ 了解更多 感谢 监视 - 警告 帮助我们改进此功能 您对该功能满意吗? 满意 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 35e31b22282..0878596e0f8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1678,8 +1678,8 @@ See a productive edit? Thank a user for their contribution. Watch Want to track article edits? Add to your Watchlist. View it under \'More\'. - Warn - Create, send, and store warning messages on an editor\'s talk page. + Talk + Communicate with other editors. Save commonly used talk page messages or use a template. Undo/Rollback Choose \'Undo\' to undo or rollback a potentially destructive edit. Damage predicts if an edit causes damage to a wiki. From d27fcc54b04574cf01adac4a10e770a5c4cbf0af Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 17 Apr 2024 16:27:21 -0400 Subject: [PATCH 058/626] Fix showing Link Preview stub edit pencil only for Main namespace. (#4603) --- .../java/org/wikipedia/page/linkpreview/LinkPreviewContents.kt | 3 ++- .../java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewContents.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewContents.kt index 54398481a92..a4e0b438745 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewContents.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewContents.kt @@ -5,8 +5,9 @@ import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.util.L10nUtil -class LinkPreviewContents constructor(pageSummary: PageSummary, wiki: WikiSite) { +class LinkPreviewContents(pageSummary: PageSummary, wiki: WikiSite) { val title = pageSummary.getPageTitle(wiki) + val ns = pageSummary.namespace val isDisambiguation = pageSummary.type == PageSummary.TYPE_DISAMBIGUATION val extract = if (isDisambiguation) "

" + L10nUtil.getStringForArticleLanguage(title, R.string.link_preview_disambiguation_description) + "

" + pageSummary.extractHtml diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt index f342dc95430..c218b38a07c 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt @@ -398,7 +398,7 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV ) ) val dir = if (L10nUtil.isLangRTL(viewModel.pageTitle.wikiSite.languageCode)) "rtl" else "ltr" - val editVisibility = contents.extract.isNullOrBlank() && viewModel.pageTitle.namespace() == Namespace.MAIN + val editVisibility = contents.extract.isNullOrBlank() && contents.ns?.id == Namespace.MAIN.code() binding.linkPreviewEditButton.isVisible = editVisibility binding.linkPreviewThumbnailGallery.isVisible = !editVisibility val extract = if (editVisibility) "" + getString(R.string.link_preview_stub_placeholder_text) + "" else contents.extract From 91ef059929afb1987016776a6fb9df0a89bfe0ee Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 17 Apr 2024 16:08:01 -0700 Subject: [PATCH 059/626] Fix: crashes on Explore Feed when airplane mode is activated (#4606) * Fix: crashes on Explore Feed when airplane mode is activated * Remove withContext --- .../aggregated/AggregatedFeedContentClient.kt | 54 ++++++++-------- .../becauseyouread/BecauseYouReadClient.kt | 61 +++++++++---------- 2 files changed, 55 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt index 2ea7f84c616..481ff8e72a3 100644 --- a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt +++ b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt @@ -140,42 +140,40 @@ class AggregatedFeedContentClient { private fun requestAggregated() { aggregatedClient.clientJob?.cancel() val date = DateUtil.getUtcRequestDateFor(age) - aggregatedClient.clientJob = CoroutineScope(Dispatchers.Default).launch( + aggregatedClient.clientJob = CoroutineScope(Dispatchers.Main).launch( CoroutineExceptionHandler { _, caught -> L.v(caught) cb.error(caught) } ) { - withContext(Dispatchers.Main) { - val cards = mutableListOf() - FeedContentType.aggregatedLanguages.forEach { langCode -> - val wikiSite = WikiSite.forLanguageCode(langCode) - val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(langCode).isNullOrEmpty() - var feedContentResponse = ServiceFactory.getRest(wikiSite).getFeedFeatured(date.year, date.month, date.day) - - // TODO: This is a temporary fix for T355192 - if (hasParentLanguageCode) { - // TODO: Needs to update tfa and most read - feedContentResponse.tfa?.let { - val tfaResponse = getPageSummaryForLanguageVariant(it, wikiSite) - feedContentResponse = AggregatedFeedContent( - tfa = tfaResponse, - news = feedContentResponse.news, - topRead = feedContentResponse.topRead, - potd = feedContentResponse.potd, - onthisday = feedContentResponse.onthisday - ) - } + val cards = mutableListOf() + FeedContentType.aggregatedLanguages.forEach { langCode -> + val wikiSite = WikiSite.forLanguageCode(langCode) + val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(langCode).isNullOrEmpty() + var feedContentResponse = ServiceFactory.getRest(wikiSite).getFeedFeatured(date.year, date.month, date.day) + + // TODO: This is a temporary fix for T355192 + if (hasParentLanguageCode) { + // TODO: Needs to update tfa and most read + feedContentResponse.tfa?.let { + val tfaResponse = getPageSummaryForLanguageVariant(it, wikiSite) + feedContentResponse = AggregatedFeedContent( + tfa = tfaResponse, + news = feedContentResponse.news, + topRead = feedContentResponse.topRead, + potd = feedContentResponse.potd, + onthisday = feedContentResponse.onthisday + ) } - - aggregatedClient.aggregatedResponses[langCode] = feedContentResponse - aggregatedClient.aggregatedResponseAge = age - } - if (aggregatedClient.aggregatedResponses.containsKey(wiki.languageCode)) { - getCardFromResponse(aggregatedClient.aggregatedResponses, wiki, age, cards) } - FeedCoordinator.postCardsToCallback(cb, cards) + + aggregatedClient.aggregatedResponses[langCode] = feedContentResponse + aggregatedClient.aggregatedResponseAge = age + } + if (aggregatedClient.aggregatedResponses.containsKey(wiki.languageCode)) { + getCardFromResponse(aggregatedClient.aggregatedResponses, wiki, age, cards) } + FeedCoordinator.postCardsToCallback(cb, cards) } } diff --git a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt index 3285ee3ef2d..0b7bb7a9f22 100644 --- a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt +++ b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt @@ -6,7 +6,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.WikipediaApp @@ -24,48 +23,46 @@ class BecauseYouReadClient : FeedClient { override fun request(context: Context, wiki: WikiSite, age: Int, cb: FeedClient.Callback) { cancel() clientJob?.cancel() - clientJob = CoroutineScope(Dispatchers.Default).launch( + clientJob = CoroutineScope(Dispatchers.Main).launch( CoroutineExceptionHandler { _, caught -> L.v(caught) cb.success(emptyList()) } ) { - withContext(Dispatchers.Main) { - val entries = AppDatabase.instance.historyEntryWithImageDao().findEntryForReadMore(age, context.resources.getInteger(R.integer.article_engagement_threshold_sec)) - if (entries.size <= age) { - cb.success(emptyList()) - } else { - val entry = entries[age] - val langCode = entry.title.wikiSite.languageCode - // If the language code has a parent language code, it means set "Accept-Language" will slow down the loading time of /page/related - // TODO: remove when https://phabricator.wikimedia.org/T271145 is resolved. - val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(langCode).isNullOrEmpty() - val searchTerm = StringUtil.removeUnderscores(entry.title.prefixedText) - val relatedPages = mutableListOf() + val entries = AppDatabase.instance.historyEntryWithImageDao().findEntryForReadMore(age, context.resources.getInteger(R.integer.article_engagement_threshold_sec)) + if (entries.size <= age) { + cb.success(emptyList()) + } else { + val entry = entries[age] + val langCode = entry.title.wikiSite.languageCode + // If the language code has a parent language code, it means set "Accept-Language" will slow down the loading time of /page/related + // TODO: remove when https://phabricator.wikimedia.org/T271145 is resolved. + val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(langCode).isNullOrEmpty() + val searchTerm = StringUtil.removeUnderscores(entry.title.prefixedText) + val relatedPages = mutableListOf() - val moreLikeResponse = ServiceFactory.get(entry.title.wikiSite).searchMoreLike("morelike:$searchTerm", - Constants.SUGGESTION_REQUEST_ITEMS, Constants.SUGGESTION_REQUEST_ITEMS) + val moreLikeResponse = ServiceFactory.get(entry.title.wikiSite).searchMoreLike("morelike:$searchTerm", + Constants.SUGGESTION_REQUEST_ITEMS, Constants.SUGGESTION_REQUEST_ITEMS) - val headerPage = PageSummary(entry.title.displayText, entry.title.prefixedText, entry.title.description, - entry.title.extract, entry.title.thumbUrl, langCode) + val headerPage = PageSummary(entry.title.displayText, entry.title.prefixedText, entry.title.description, + entry.title.extract, entry.title.thumbUrl, langCode) - moreLikeResponse.query?.pages?.forEach { - if (it.title != searchTerm) { - if (hasParentLanguageCode) { - val pageSummary = ServiceFactory.getRest(entry.title.wikiSite).getPageSummary(entry.referrer, it.title) - relatedPages.add(pageSummary) - } else { - relatedPages.add(PageSummary(it.displayTitle(langCode), it.title, it.description, - it.extract, it.thumbUrl(), langCode)) - } + moreLikeResponse.query?.pages?.forEach { + if (it.title != searchTerm) { + if (hasParentLanguageCode) { + val pageSummary = ServiceFactory.getRest(entry.title.wikiSite).getPageSummary(entry.referrer, it.title) + relatedPages.add(pageSummary) + } else { + relatedPages.add(PageSummary(it.displayTitle(langCode), it.title, it.description, + it.extract, it.thumbUrl(), langCode)) } } - - FeedCoordinator.postCardsToCallback(cb, - if (relatedPages.isEmpty()) emptyList() - else listOf(toBecauseYouReadCard(relatedPages, headerPage, entry.title.wikiSite)) - ) } + + FeedCoordinator.postCardsToCallback(cb, + if (relatedPages.isEmpty()) emptyList() + else listOf(toBecauseYouReadCard(relatedPages, headerPage, entry.title.wikiSite)) + ) } } } From 58f2f3c0f919fd8aa544c6f65b57f6565fe17ebd Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 18 Apr 2024 21:24:41 +0530 Subject: [PATCH 060/626] Localisation updates from https://translatewiki.net. (#4607) --- app/src/main/res/values-az/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 38 +- app/src/main/res/values-ia/strings.xml | 53 +- app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-iw/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 9 + app/src/main/res/values-krc/strings.xml | 988 +++++++++++++++++++++ app/src/main/res/values-mk/strings.xml | 10 +- app/src/main/res/values-pt-rBR/strings.xml | 3 +- app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 31 +- app/src/main/res/values-se/strings.xml | 17 + app/src/main/res/values-smn/strings.xml | 5 + app/src/main/res/values-sms/strings.xml | 9 +- app/src/main/res/values-sr/strings.xml | 4 +- 15 files changed, 1152 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/values-krc/strings.xml diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 740f5e444ef..bd16a8dc7c3 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -624,5 +624,7 @@ Başlamaq üçün öz xəbərdarlıq mesajlarınızı yaradın və ya <a href=\"#\">nümunə mesajlarından</a> istifadə edin. Mesajlarınız Nümunə mesajlar + Müzakirə + Digər redaktorlarla əlaqə saxlayın. Tez-tez istifadə olunan müzakirə səhifəsi mesajlarını yadda saxlayın və ya şablondan istifadə edin. Mesajlarınızı fərdiləşdirmək, göndərmək və saxlamaq üçün aşağıdakı nümunə mesajından istifadə edin. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5a1870e4a0b..1b011215d76 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1063,11 +1063,12 @@ Dirección IP bloqueada Última edición Nunca - nuevo + Nuevo Al publicar, aceptas los <a href=\"%1$s\">Términos de uso</a> y a liberar irrevocablemente tus contribuciones bajo los términos de la <a href=\"%2$s\">licencia</a> Ediciones sugeridas ¡Gracias por editar Wikipedia! ¿Por qué no continúas donde lo dejaste? ¿Tienes un minuto para seguir mejorando Wikipedia? Echa un vistazo a estas sugerencias de edición. + Contribuciones de %s Idioma Fecha y hora Tipo de contribución @@ -1331,7 +1332,7 @@ Párrafo eliminado ¿Estás seguro de que quieres deshacer esta edición? Esto deshará los cambios realizados por la(s) revisión(es) del artículo mostrado aquí. - Para continuar, proporcione un motivo para deshacer esta edición: + Comparte el motivo de la reversión: La revisión se deshizo. %1$s y su página de discusión han sido añadidos a tu lista de seguimiento %2$s. Cambiar @@ -1401,11 +1402,42 @@ \"Compartir listas de lectura\" es una función de prueba y necesitamos tus comentarios para mejorarla o eliminarla. Cree sus propios mensajes de o utilice <a href=\"#\">mensajes de ejemplo</a> para comenzar. Eliminar - El mensaje se ha eliminado + + Se ha eliminado el mensaje + Se han eliminado los mensajes + + El título no puede estar vacío. Sus mensajes Mensajes de ejemplo + Buscar o filtrar ediciones + Etiquetas: %s + Ninguna + Ver página de usuario + Ver página de discusión + Información de usuario <b>Cuenta de: </b> %s <b>Editar recuento: </b> %s + Ediciones no menores + Predicciones de calidad de las contribuciones + Muy probablemente buenas + Muy preciso para encontrar casi todas las ediciones que no plantean problemas. + Pueden tener problemas + Encuentra la mayoría de ediciones erróneas o perjudiciales, pero con menor precisión. + Probablemente tienen problemas + Con precisión media, encuentra una fracción intermedia de ediciones problemáticas. + Muy probablemente tienen problemas + Encuentra con gran precisión las ediciones claramente más erróneas o dañinas. + Predicciones de las intenciones del usuario + Muy probablemente de buena fe + Muy preciso para encontrar casi todas las ediciones realizadas de buena fe. + Pueden ser de mala fe + Encuentra la mayoría de ediciones de mala fe, pero con menor precisión. + Probablemente de mala fe + Con precisión media, encuentra una fracción intermedia de ediciones de mala fe. + Muy probablemente de mala fe + Encuentra con gran precisión las ediciones de mala fe más obvias. + Discusión + Comunicarse con otros editores. Guarde los mensajes de la página de discusión de uso común o use una plantilla. Historial de edición del artículo Enviar Advertencia de vandalismo diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 51c2a3148fe..ae5cab8ae97 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -237,8 +237,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/ https://creativecommons.org/publicdomain/zero/1.0/ - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags Bibliothecas usate Contributores <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Pagina del equipa</a> @@ -421,6 +421,25 @@ Tu pote contactar <a href=\"%2$s\">%1$s</a> o un altere <a href=\"https://ia.wikipedia.org/wiki/Wikipedia:Administratores\">administrator</a> pro discuter le blocada. Personalisar tu barra de utensiles Tu pote contactar un <a href=\"https://ia.wikipedia.org/wiki/Wikipedia:Administratores\">administrator</a> pro discuter le blocada. + Tu non ha aperite session + Quando tu face un modification, un <b>conto temporari</b> te essera create pro proteger tu vita private. <a href=\"%1$s\">Lege plus</a>.<br /><br /><a href=\"https://#login\">Aperi session</a> o <a href=\"https://#login\">crea un conto</a> pro reciper credito pro futur modificationes e acceder a altere functiones. + Tu modification essera attribuite a %1$s. Tu adresse IP essera visibile al administratores.<br /><br />Si tu <a href=\"https://#login\">aperi session</a> oor <a href=\"https://#login\">crea un conto</a>, tu modificationes essera attribuite a un nomine que tu elige, inter altere beneficios. + Comprendite + Tu usa un conto temporari + Abandonar cambiamentos e aperir session + + Le conto temporari %1$s ha essite create post le publication de tu modification. Illo expirara in %2$d die. + Le conto temporari %1$s ha essite create post le publication de tu modification. Illo expirara in %2$d dies. + + + Le conto expirara in %d die. + Le conto expirara in %d dies. + + <b>Tu non ha aperite session.</b> Un vice que tu apporta un modification, un conto temporari essera create pro te pro proteger tu vita private. <a href=\"%1$s\">Leger plus</a> + <b>Tu usa un conto temporari.</b> Tu modification essera attribuite a %1$s. <a href=\"%2$s\">Leger plus</a>. + <b>Tu usa in iste momento un conto temporari.</b> Le modificationes apportate con le conto temporari %1$s non essera transferite a tu conto permanente quando tu aperi session. Aperi session o crea un conto pro reciper attribution a tu nomine de usator, inter altere beneficios. + Clauder session + Isto te disconnectera de tu conto temporari. Vole tu continuar? Error del application Regrettabilemente, le application Wikipedia ha incontrate un error e se ha terminate.\n\nVole tu reinitiar o quitar? Reinitiar @@ -841,8 +860,8 @@ Entrata vocal Leger plus sur le descriptiones de articulos Leger plus sur le legendas de imagines - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Le texto es troppo curte. Le texto non debe terminar per un signo de punctuation. Comencia con un littera minuscule, excepte si le prime parola es un nomine proprie. @@ -1112,6 +1131,7 @@ Listas de lectura con synchronisation Tu pote facer listas de lectura de articulos que tu vole leger plus tarde, mesmo quando tu es disconnectite. <br/>Aperi session in tu conto de Wikipedia pro synchronisar tu listas de lectura. <a href=\"#login\">Crear un conto sur Wikipedia</a> Datos e vita private + Nos crede que non debe esser necessari fornir information personal pro participar in le movimento de cognoscentia libere. Le datos de uso colligite pro iste application es anonyme. Lege plus sur nostre <a href=\"#privacy\">politica de confidentialitate</a> e <a href=\"#termsOfUse\">conditiones de uso</a>. Inviar datos de uso Comprendite Nos ha trovate lo sequente sur tu apparato: @@ -1213,6 +1233,14 @@ Altitude px Inserer + Inserer + p.ex. %s + %s (optional) + %s (suggerite) + Leger plus + Le patronos es generate per usatores e pote non haber descriptiones complete. + Le patrono “%s” non ha ancora un description. + Iste patrono non ha <a href=\"%1$s\">TemplateData</a> e su parametros ha essite <a href=\"%2$s\">generate automaticamente</a>. Como resultato, le patrono e su parametros non ha descriptiones. Adjuta Aperir session / crear conto sur Wikipedia Salute %s, sapeva tu que omnes pote modificar Wikipedia? @@ -1236,8 +1264,10 @@ Titulo del message Publicar Cancellar + Non salveguardar Message publicate sur le pagina de discussion del contributor Message salveguardate e publicate sur le pagina de discussion de usator del contributor + Messages salveguardate Iste pagina de discussion es vacue. Le conversation comencia hic Le paginas de discussion es ubi le gente discute como facer le contento de Wikipedia le melior que pote esser. Adde un nove topico de discussion pro connecter te e collaborar con un communitate de wikipedianos. @@ -1248,6 +1278,7 @@ Componer message Le message non pote esser vacue. Le subjecto non pote esser vacue. + Le nomine de subjecto ja existe. Proba un altere. Responsa publicate. Disfacer <b>Ultime modification %1$s</b> per %2$s @@ -1429,6 +1460,8 @@ Error de reproduction multimedial. Contributiones Filtrar contributiones + Vider sur carta + Le coordinatas geographic non es disponibile pro iste pagina Importar lista de lectura condividite Como vole tu nominar le lista de lectura que ha essite condividite con te? *nove* @@ -1467,6 +1500,8 @@ Le messages ha essite delite Le titulo non pote esser vacue. + Tu messages + Messages de exemplo Cercar o filtrar modificationes Etiquettas: %s Necun @@ -1550,10 +1585,20 @@ Neutral Non satisfacite Como pote nos meliorar le function? + Historia de modificationes del articulo Commentario Submitter Commentario submittite. Pro inviar commentarios, tocca sur le menu de disbordamento sub ‘Problema con function’. + Advertimento de vandalismo + Tests de modification + Puncto de vista neutral + Traduction automatic + Rememoration sur conflictos de interesse + Ultime advertimento + Alerta sur le violation del derecto de autor + Lassar un summario de modification + Non censurar Acceptar Rejectar Problemas con le pagina diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5606b35d3e7..00dacea6424 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1498,6 +1498,7 @@ Ringrazia Osserva Vuoi tenere traccia delle modifiche delle voci? Aggiungilo alla tua lista osservati. Visualizzalo in \"Altro\". + Discussione Annulla/Ripristina Scegli \"Annulla\" per annullare o ripristinare una modifica potenzialmente distruttiva. Sei soddisfatto di questa funzionalità? diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 4fba30c7d83..19f166cb8e6 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -1694,6 +1694,7 @@ רואה עריכה מועילה? אפשר לשלוח תודה למשתמש על תרומתו. מעקב רוצה לעקוב אחר עריכות בערך? אפשר להוסיף לרשימת המעקב שלך. אפשר להציג אותה תחת \"עוד\". + שיחה ביטול/שחזור יש לבחור \"ביטול\" כדי לבטל או לשחזור עריכה שעשויה להיות הרסנית. מדד \"נזק\" מנבא אם עריכה גורמת נזק לוויקי. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index b2a17d2b140..87791d85c31 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -145,6 +145,7 @@ 내 위키백과 언어 변경사항 게시 편집이 게시됐습니다! + 편집이 게시되었습니다! 변경사항이 표시되기까지 시간이 걸릴 수 있습니다. 편집에 실패했습니다! 다시 시도 취소 @@ -329,6 +330,7 @@ 오늘의 알찬 글: 위키백과 검색 위키백과를 검색하는 가장 빠른 방법 + 위키백과가 제공하는 최고의 문서 정의가 발견되지 않았습니다 새로운 알파 업데이트를 이용할 수 있습니다 다운로드하려면 탭하세요 @@ -416,6 +418,7 @@ 저장 저장됨 공유 + 이 문서는 토막글입니다. 이는 미리 보기를 생성할 만큼 문서 내용이 충분하지 않음을 의미합니다. 그러나 여러분이 이를 바꿀 수 있습니다. 이 문서가 존재하지 않습니다 위키백과에 이 이름의 <a href=\"%1$s\">사용자 문서</a>가 없습니다. 일반적으로 이 문서는 <b>%2$s</b>님이 만들고 편집해야 합니다. 의심이 들면 \"%3$s\" 문서가 존재하는지 확인해 주십시오. 인터넷에 연결할 수 없습니다 @@ -438,6 +441,10 @@ <a href=\"%2$s\">%1$s</a>님 이나 다른 <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">관리자</a>와 차단에 관해 의논할 수 있습니다. 도구 모음 사용자 지정 <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">관리자</a>와 차단에 관해 의논할 수 있습니다. + 로그인하고 있지 않습니다 + 알겠습니다 + 임시 계정을 사용하고 있습니다 + 변경사항을 버리고 로그인 애플리케이션 오류 죄송합니다, 위키백과 앱이 오류가 발생하여 종료되었습니다.\n\n다시 시작하거나 나가시겠습니까? 다시 시작 @@ -1224,6 +1231,7 @@ 메시지 제목 게시 취소 + 저장하지 않음 편집자의 사용자 토론 페이지에 게시된 메시지 편집자의 사용자 토론 페이지에 메시지가 저장 및 게시되었습니다. 이 토론 문서는 비어있습니다. @@ -1448,6 +1456,7 @@ 메시지가 삭제되었음 제목은 비워둘 수 없습니다. + 예시 메시지 편집 내용 검색 또는 필터링 태그: %s 없음 diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml new file mode 100644 index 00000000000..c235c2230f2 --- /dev/null +++ b/app/src/main/res/values-krc/strings.xml @@ -0,0 +1,988 @@ + + + + Википедия + Википедия бета + Википедия альфа + Викимедия + Кери + Кери + Алгъа + Википедияда излеу + Ауаз бла излеу + Тилни изле + Тизимлерими сюз + Тюрлениуле + Энтда + Изле + Интернетге байланалмайды + Джангыдан сына + Джангыдан сына + Джангыдан сына + Джангыдан сына + Джангыдан сына + Кери къайт + Кери къайт + Эндиги + Тарихни ариула + %s тарихден къоратылды + %d статья тарихден къоратылды + Кери ал + Кери ал + Хайырланыу джараштрыулары + Излеу сорууламаны джазыб башлар ючюн, белгиге энтда бир кере бас + Тарих + Сурат: %s + Бет: %s + Викигёзен + Викибилгиле + Къарауланы тарихин ариула + Бу ишлеу, бютеу браузер терихнигизни кетерликди эмда бютеу ачыкъ салгъычларыгъызны джабарыкъды. Ишексизмисиз? + Хоу + Огъай + Буну бла юлюшле: + Буну бла юлюшле: + %s бетден джиберилгенди + Версия тарих: %s + <b>k</b> %s + Бош тюзетиуню бютеую + Тюзетиулени изле неда фильтр эт + Буну фильтр эт: + Бютеу тюзетиуле (%s) + Хайрланыучу тюзетиуле (%s) + Аноним тюзетиуле (%s) + Бот тюзетиуле (%s) + %1$s бла %2$s арасындагъы ёлчемле + + %2$s джылдан бери %1$d тюзетиу + %2$s джылдан бери %1$d тюзетиу + + + %2$s джылдан бери %1$d тюзетиу (%3$s) + %2$s джылдан бери %1$d тюзетиу (%3$s) + + Аслам тюрлениу кёрюр ючюн <a href=\"#\">süzgeci</a> тюзетиб кёрюгюз + Салгъычланы кёргюз + Тилни ауушдур + Статьяда таб + Кёзде тургъан тизмеге къош + Кёзде тут + Кёзде тутма + Сюзюу бетни кёргюз + Сюзюу бет + Тюзетиу тарихни кёргюз + Тюзетиуню тарихи + Кёзде тургъан тизмеден къорат + Кёзде турады + Бетде таб + Шрифт эмда тема + Окъуу тизмеге къош + Сакъландыр + Окъуу тизмеге къош + Сакъландыр + Джибериуню юлюшле + Статьяны юлюшле + Юлюшле + Джангы салгъыч ач + Джангы салгъыч + Окъуу тизмеле + Ахыр къаралгъан + Архив + Ач + Джангы салгъычда ач + Джибериу адресни копия эт + Таныт + Юлюшле + Юлюшле + Былайын тюзет + Статьяны тюзет + Ахыр джангыртылгъан: %s + Сюзюу бетни кёргюз + Тюзетиу тарихни кёргюз + Картада кёргюз + Башха тилде окъу + %d башха тилледе барды + CC BY-SA 4.0 + Басмалаб <a href=\"%1$s\">Хайырлану Шартла</a>ны эмда къошумларыгъызны кери къайтмаз шекелде <a href=\"%2$s\">CC BY-SA 4.0</a> лицензия бла басмалауну къабыл этериксиз. + Басмалаб <a href=\"%1$s\">Хайырланыу Шартла</a>ны эмда къошумларыгъызны кери къайтмаз шекелде <a href=\"%2$s\">CC BY-SA 4.0</a> лицезния бла басмалауну къабыл этериксиз. Тюрлендириулеригиз девайсыгъызны IP-адреси бла байланныкъды. <a href=\"https://#login\">Кирсегиз</a> андан аслам ташалыкъгъа ие боллукъсуз. + Тюрлениуле девайсыгъызны IP-адреси бла джаздырыллыкъдыла. <a href=\"https://#login\">Кирсегиз</a> андан аслам ташалыкъгъа ие боллукъсуз. + Википедияны тиллери + Изле + Бу бет башха тилледе джокъду. + Тилле табылмадыла + Башха тилле + Википедия тиллеригиз + Тюрлениулени басмала + Тюзетиу басмаланды! + Тюзетиу басмаланды! Тюрлениуле чыгъар ючюн заман керек болургъа боллукъду. + Тюрлендириу халат! + Джангыдан сына + Ызына ал + Этген тюрлениулеригиз алкъын басмаланмагъанды. Бу бетден кетерге излегенигизге ишексизмисиз? + Кет + Къал + Ичиндегиси + Джукъ да табылмады + \"%s\" ичинде эсебле табылмады + Окъуу тизмегизде эсебле табылмадыла + Тарихде эсебле табылмадыла + Автоат халда спамлагъа къаршчы къоруунланыргъа болушлукъ берир ючюн, энишгеде кёрюннген сёзлени джазыгъыз. + Суратны кёралмаймысыз? <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Request_an_account\">Хыйсаб излем этигиз</a> + Ёргедеги сёзлени къайтарыгъыз + CAPTCHA киргизтигиз + Джангыдан джюклер ючюн CAPTCHA басыгъыз + Википедиягъа кир + Хайырланыучуну аты + Пароль + Пароль + Эки дараджалы аутентификация код + Эки дараджалы аутентификация код керекди! Баш къуллугъугъузгъа кайтыгъыз эмда 2FA-токенни болушлугъу бла системагъа киригиз, аны ызындан дагъыда бир сынагъыз. + Кир + Кир + Кир + Кир + Кир + Кир + Системагъа кириледи... + Авторизация тыйыншлы ётдю! + Паролунгу сал + Кёзюулю пароль бла кирдигиз. Кириуню тамамлар ючюн, былайда джангы пароль салыгъыз. + Джангы пароль + Сакъла эмда кир + Чыкъ + Системадан чыгъылды + Бу, кирген бютеу девейсларыгъыздан чыгъарлыкъды. Андан ары бардырыргъа излеймисиз? + Ызына ал + Системадан чыгъылды + Википедиядан чыкъдыгъыз. Джангыдан кирирге излеймисиз? + Кир + Ызына ал + Хыйсабны джокъ эт + Хыйсабны джокъ этиу эсгертиу + Джокъ этиу — <b>ахыр амалды</b>, эмда аны <b>тюзетиуню тамамы бла тохтатыргъа излегесиз хайырланыргъа керекди</b>, неда эскиде ассоциацияланы бир мадар болуб аслам джашырыргъа излесегиз.<br/><br />Википедияда хыйсабны кетериу, башхала хыйсабны джокъ этиу атны джюрютген процессде сизни кошугъузну танымазча, хыйсабыгъызны атын тюрлендириу бла этиледи.<b>Джокъ этиу толу анонимликни гарантия этмейди эмда проектде къошумларыгъызны къоратмайды</b>. + Кёб болмай кёргюзюлген статьяла джокъдула + Окъугъан статьяларыгъызны былайдан ызлагъыз. + Тарихдеги бир къауум статьтяла, оффлайн халда кёрюрча тюлдюле. + Эркин энциклопедияны кеси тилигизде излегиз эмда окъугъуз + Википедияда башха тилледе да излегиз + Сайланнган элементлени кетер + <big>В</big>ИКИПЕДИ<big>Я</big> + Хайырланыучуну аты + Хыйсабынг джокъмуду? + Википедиягъа къошул + Паролунгу унутдунгму? + Алайсыз да хыйсабыгъыз бармыды? + Хыйсаб къура + Тинте турады + Email (амалсыз тюлдю) + Паролну джангыдан джаз + Пароль хайырланыучу ат бла бирча болургъа болмайды + Паролла бир бирлери бла келишмейдиле + Терс email адрес + Хайырланыучуну атында джараусуз символла бардыла + Пароль эм азы бла 8 символдан болургъа керекди + Тергеу джазыу (аккаунт) къураргъа болмайды + Эндиги + Электрон почтасыз хыйсаб къуралсынмы? + Электрон почтаны белгилеу амалсыз болмаса да, паролугъузну тас этсегиз, къутхарыр ючюн электрон почта керек болгъаны себебли, электрон адресни къошаргъа <b>бек насихат этебиз</b> + Хыйсабны къутхарыр ючюн, электрон адрес къошаргъа тыйыншлыды. + Электрон почтасыз бардыр + Электрон адресни къошугъуз + Хыйсаб къура + \"%s\" хайырланыучу ат джокъду. Тилейбиз, башха хайырланыучу ат сайлагъыз. + Кечериксиз, IP-адресигиз джангы хыйсабла къурамазча блокдады. + https://en.wikipedia.org/wiki/Help:I_have_been_blocked + Толу ачыкълаула + Баш + Хыйсаб + Wikipedia App FAQ + Кери билдириу + Тергеу джазыу къуралды! + Синхронизация + Трафик хайырланыу + Экспериментли + Окъуу тизмени синхронизациясы + Окъуу тизмени статьяларын эндир + Тюрлю-тюрлю девайсладагъы окъуу тизмелени, Википедия хыйсабыгъызда сакъландырыб, синхронизация этигиз + Окъуу тизмелени, \"%s\" атлы Википедия хыйсабыгъызгъа сакъландырыб, тюрлю-тюрлю девайслада синхронизация этигиз + Синхронизация этилген окъуу тизмеле \"%s\" хыйсабдан къоратылсынмы? + Бу, аллындан синхронизация этилген бютеу окъуу тизмелени узакъ асыраучудан тамамы бла кетерир. Синхронизация этилген бютеу тизмеле. \"%s\" атлы хыйсабыгъыздан къоратылсынмы? + Бузулуу отчётланы джибер + Биз авариягъа чурум болгъан проблеманы тинтиб, халатны дженгилирек эмда тынчыракъ тюзеталырча, программаны аварияларыны юсюнден тыш сервисге автомат халда отчетла иерге эркинлик беригиз. + Блок этилген доменлеге (%s) джибериуле табылгъандыла. Тилейбиз, аланы кетериб джангыдан кёрюгюз. + Фильтрни тарихи + Бу джибериу кёрюнмеди + Бу бет джарым къорууланыулуду. + Бу бет тамамы бла къорууланыулуду. + Бу бет, бу дараджада къорууланыбды: %s + Керечеркисиз, хыйсабыгъыз бусагъатда, бу бетни тюзетирча онгнга ие тюлдю. + Кечериксиз, бу бет, бусагъатда аноним халда тюзетилирча тюлдю. + Бу бет къорууланыбды + Кёзде тургъан тизмеге къош + Эсигизни бёлген статьяла бла не болгъанын марагъыз. Статьядагъы тюрлендириулени кёрюр ючюн, къошакъ менюну басыгъыз эмда <b>Кёзде тургъан тизмеге къош</b> сайлауну сайла. + Джарашдырыўла + Джарашдырыўла + Википедия программаны юсюнден + Ташалыкъ политика + Хайырланыу шартла + https://en.wikipedia.org/wiki/Wikipedia:Юсюнден + https://meta.wikimedia.org/wiki/Privacy_policy/krc + https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/tr#Offline_reading_and_data + https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/krc + https://meta.m.wikimedia.org/wiki/Terms_of_Use/krc + https://en.wikipedia.org/wiki/Wikipedia:Request_an_account + https://creativecommons.org/licenses/by-sa/4.0/deed.krc + https://creativecommons.org/publicdomain/zero/1.0/deed.krc + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags + Хайырланнган китабханала + Авторла + <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android/krc\">Команда бет</a> + Кёчюрюучюле + Бу программаны <a href=\"https://translatewiki.net\">translatewiki.net</a>-деги волонтёрла кёчюргендиле. + Лицензия + Къайнакъ код, былайдан <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">Github</a> лицензияны тамалында <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a> барды. Башхасы белгиленмеген эсе, ичиндегиси <a href=\"https://creativecommons.org/licenses/by-sa/4.0/deed.ru\">Creative Commons Attribution-ShareAlike</a> лицензияны тамалындады. + <a href=\"https://wikimediafoundation.org/\">Викимедия Фондну</a> чыгъармасыды + Юсюнден + Бет тюрлендирилди. Тюрлениулени сакъландырмагъанлай чыгъаргъа излегенигизге ишексизмисиз? + Хоу + Огъай + Блок этилди + Хайырланыучу хыйсабыгъыз, бу викиде тюзетиу этмезча блок этилди. + IP-адресигизден тюзетиу этиу блок этилди. + Бетде къаллай маджаллашдырыу этдигиз? + Эндиги + Басмала + Ал къарау + Кери ал + Къайтар + Кери къайтар + Билдириб къой + Заран %s + Иннет %s + + %s байт + %s байт + + Джууукълашдыр + Узакълашдыр + Джазыу халат тюзелтилди + Грамматика тюзетилди + Джибериуле къошулдула + Башха + Бетни сиз тюзетген башха мадарла + Тюзетиу конфликт + Бет башха хайырланыучуну тюзетиуюн ётгени себебли, тюзетиу конфликт чыкъгъанды. Тюзетиулеригизни копия этиб, къайтыгъыз эмда бетни джангыртыгъыз, андан сора энтда тюзетиб кёрюгюз. + Тюзетиу хапарландырыула + Тилейбиз, тюзетиуню аллы бла окъугъуз + Тюзетиу хапарландырыуланы автомат халда кёргюз + Бу бетни хапарландырыуларын кёрюр ючюн бу тиекге басыгъыз. + Эндигини таб + Алгъыннгыланы таб + Бу биринчи болууду + Бу ахыр болууду + Статья, фон салгъычда ачылды. + Бу, антиконструктив тюзетиу болургъа болур. Сакъландырыргъа излегенигизге ишексизмисиз? + Бу тюзетиуню басмалаялмазсыз. Тилейбиз, кери къайтыб тюзетигиз аны. + Автомат фильтр, бу тюзетиуню потенциал заран бериучу болуб айгъакълагъанды. Тюзетиу буланы бирисини неда андан асламыны тутаргъа болур:<br /><br />· Тамамы уллу харифле бла джазылыу<br />· Бетлени ичин бошалтыу неда спам<br />· Келишмеген тыш джибериуле неда суратла<br />· Къайтарыб салыннган символла + Автомат фильтр, бу тюзетиуню потенциал антиконструктив неда потенциал вандализм болуб айгъакълагъанды.<br /><br /> Википедия энчиклопедияды, эмда мында къуру нейтрал эмда магъаналы контент болургъа боллукъду. + Ушаш бетле + Сиз дерге излеген бумуду \"%s\"? + Ахыр излеуле: + Эсебле джокъдула + + 1 эсеб + %d эсеб + + Ахыр излеулени тазала + Излеу тарихни тазаларгъа излегенигизден ишексизмисиз? + Хоу + Огъай + Веб-бет ачыламады (браузер программа табылмады). + Терк фактла + Аслам информация + Джаб + Википедияны сайланнган статьясы + Бюгюннгю сайланнган бет: + Википедия излеу + Википедияда излеуню эм дженгил джолу + Википедия теджен эм иги статьяла + Ачыкълаула табылмадыла. + Джангы альфа джангартыу барды + Эндирир ючюн бас + Джаб + Суратланы кёргюз + Бетледеги суратланы джюклениулерин джандырыгъыз неда джукълатыгъыз. Интернет байламыгъыз акъыртын неда трафигигиз чеклениб эсе, бу сайлауну белгилемегиз. + Къуру Wi-Fi бла эндир + Мобил билгиле бла эндирирге разымысыз? + Джарашдырыулада \"Джангыз Wi-Fi бла эндир\" сайладыгъыз. Къуру бу эндириуге мобил билгилеригизни хайырланыргъа эркинлик беремисиз? + Эркинлик бер + Энтда окъу + Бу статьяны юсюнден + Сурат бетге кёч + Сурат кёргюзюлалмады. + %s ючюн лицензия + Юлюшле + Сурат джайылалмады: %s + Файл джюклене турады... + Файл сакъландырылды. + Видео ойнатылалмады. + Кёрюнюулени сакъландырыр ючюн девайсыгъызны асыраучусуна джаздырыр эркинлик керекди. + Сурат тюб джазыуну тюзет + Сурат тюб джазыу къош + Сурат тюб джазыу къош (%s) + Файл сакъланалмайды + Керир ючюн бас + Creative Commons лицензия + Капча сурат + Адил хайырлан + Джюклеген билинмейди + Галлерея кёрюнюу оффлайн хайырланырча тюлдю. + Унама + Джангы салгъыч + Бютеу салгъычланы джаб + Бютеу салгъычланы джабаргъа излегенинге ишексизмисе? + Хоу + Огъай + Салгъычны джаб + Салгъыч джабылды. + %s джабылды. + Бютеу салгъычла джабылдыла. + Окъуу тизмеге къош + Статьяны окъуу тизмеге къошар ючюн белгилеу иконачыкгъа бас. + Браузерде бетни кёргюз + Ичиндегилеге дженгил джетишиу + Энди контентни суратын ачар ючюн солгъа буруб, эмда сайланнган статьяны айры бёлюмлерине дженгил джетишир ючюн, бу буруу тиекге тийиб тарт. + Энди къошакъда бирден аслам Википедия тилде излеу этерге эмда окъургъа боллукъсуз.\n\n\n\nАндан аслам тил къошар ючюн белгилег басыгъыз. + Серверден келген джууаб тюз форматландырылмады. + Белгили болмагъан халат. + Билдириу: «%s» + Адрес алмашдырыу буферге копия этилгенди. + Текст алмашдырыу буферге копия этилгенди. + Статьяны окъу + Сюзюу бет ач + Ушаш бетлени кёргюз + Бу башлыкъ, бирден аслам бет бла байламлыды: + Окъуу тизмеге къош + Статья, оффлайн болса джюкленмез. + Айтдырыу: Статьяны окъуу тизмегег къошугъуз, джангыдан онлайн болгъанлай эндирилликди. + Бу бетни %s датада салкъландырылгъан оффлайн версиясын окъуйсуз. + \"%s\" бетден джиберилгенди + Маршрутну сал + Маршрут салырча чырт бир къошакъ табылмады. + Тасманы тинтигиз + Джибериу ал къарауланы кёргюз + Тинтиу тасманы джарашдыр + Джибериулеге тийсегиз, статьяланы терк ал къарауларын кёргюз. + Таблицаланы чырма + Инфобокс, белгилеуле эмда эсгертиуле кибик статьялада таблицаланы автомат халда чырма. + Багъышла + Кечериксиз, ауаз таныу хайырланырча тюлдю. + Локация къуллукъла джукъланыбдыла. + Джандыр + Джууукъдагъы джерлени кёрюр ючюн, локация эркинликлени джандырыгъыз. + Джандыр + Android System WebView бусагъатда джангыртыла турады. Тилейбиз, кечирек энтда бир кере кёрюгюз. + + %d сайланды + %d сайланды + + %d сайланды + Халат болду + Унама + Окъу + Сакъландыр + Сакъланды + Юлюшле + Бу статья битдирилмегенди, аны магъанысы, ал къарау ючюн джетерли контенти джокъду. Алай сиз бу болумну тюрлендирирге боллукъсуз. + Бу бет джокъду + Википедияда быллай атлы <a href=\"%1$s\">хайырланыучу бет</a> джокъду. Асламысы бла, бу бетни <b>%2$s</b> болдуруб тюзетирге керекди. Аккыллы болсагъыз, \"%3$s\" бетни бар болгъанына ишексиз болугъуз. + Интернетге байланалмайды + Википедиягъа байланалмайды. Ау байланыуну тинтигиз неда кечирек энтда бир кере кёрюгюз + Белгилеу %s + Белгилеуле + Суратланы къарартыу (Къарангы тема ючюн) + Оффлайн контентни сайла + Бу статьяны ахыр версиясын джюклер орнуна, хар кере оффлайн хайырланырча статьяланы джюклеб, трафикни аяулу эт + Система темагъа келишеди + Башха белгиленмеген эсе, ичиндегиси, $1 лицензиягъа кёре бериледи. + Джангы салгъыч + Бютеу салгъычланы сакъландыр + Хайырланыучу атыгъыз неда IP-адресигиз блок этилди. + Блокну, <a href=\"%2$s\">%1$s</a> этгенди. + Кёргюзюлген чурум: %s + Блокну башланыуу: %s + Блокну бошалыуу: %s + Блокну идентификатор: %s + Блкну сюзерючюн <a href=\"%2$s\">%1$s</a> неда башха <a href=\"https://krc.wikipedia.org/wiki/Википедия:Администраторла\">администратор\n</a> бла байлам къурургъа боллукъсуз. + Адыр панелигизни джарашдырыгъыз + Блокну сюзер ючюн <a href=\"https://krc.wikipedia.org/wiki/Википедия:Администраторла\">администратор</a> бла байлам къурургъа боллукъсуз. + Системагъа кирмегенсиз + Ташалыгъызны къоруулар ючюн, тюзетиу этгенлей <b>болджаллы хыйсаб</b> къураллыкъды. <a href=\"%1$s\">Аслам бил</a>.Келликде тюзетиуде эмда башха онгчулукъла бла хайырланырча <br /><br /><a href=\"https://#login\">Кир</a> неда <a href=\"https://#login\">Хыйсаб къура</a>. + Тюзетиуюгюз %1$s джаздырыллыкъды. IP-адресигиз администраторлагъа кёрюнюрча боллукъду.<br /><br />Сиз <a href=\"https://#login\">кирсегиз</a> неда <a href=\"https://#login \">хыйысаб къурасагъыз</a>, башха онгчулукъла бла бирге, тюзетиулеригиз, сайлагъан атыгъызгъа джаздырыллыкъды. + Англашынды + Сиз заманлы хыйсабны хайырланасыз + Тюрлениулени кери ал эмда системагъа кир + + Боджаллы хыйсаб %1$s тюзетиулеригиз басмаланнгандан сора къуралгъанды. Болджалы %2$d кюнден чыгъарыкъды. + Боджаллы хыйсаб %1$s тюзетиулеригиз басмаланнгандан сора къуралгъанды. Болджалы %2$d кюнден чыгъарыкъды. + + + Хыйсабны болджалы %d кюнден чыгъарыкъды. + Хыйсабны болджалы %d кюнден чыгъарыкъды. + + <b>Системагъа кирмегенсиз.</b> Тюзетиу этгенлей, ташалыгъызны къоруулар ючюн джангы хыйсаб къураллыкъды. <a href=\"%1$s\">Аслам бил</a> + <b>Болджаллы хыйсабны хайырланасыз.</b> Тюзетиуюгюз %1$s бла байламлы боллукъду. <a href=\"%2$s\">Аслам бил</a>. + <b>Бусагъатда болджаллы хыйсабны хайырланасыз.</b> %1$s болджаллы хыйсаб бла этилген тюзетиуле, кирсегиз дайым хыйсабыгъызгъа ташыныллыкъ тюлдюле. Кесигизни хыйсаб атыгъызгъа кредит алырча, эмда башха онгчулукъла бла хайырланырча болур ючюн системагъа киригиз неда хыйсаб къурагъыз. + Сессияны боша + Бу, болждаллы хыйсабыгъыздан чыгъаргъа себеб боллукъду. Андан ары бардыргъа излеймисиз? + Къошакъны халаты + Кечериксиз, Википедияны къошагъы халатха тюртюлдю эмда джабылды. \\\n\n\nДжангыдан башларгъамы огъесе чыгъаргъамы излейсиз? + Башдан башла + Чыкъ + Сакъландыр + Тил + Изле + Тема + Ичиндегиле + Тюзет... + Статья ачыкълауну тюзет + Ал сёзню тюзет + Тема + Джарыкъ + Къарангы + Къара + Сепия + Юлгю текст + Статьяланы окъугъан заманда текстни ёлчемин тюрлендирир ючюн, буруучуну тартыгъыз. Статья ёлчемни, къошакъны кери къалгъанында бегитир ючюн системагъызны текстини ёлчемин тюрлендиригиз. + Къошакъны темасы + Къошакъны къарангы темасына кёч + Шрифти ёлчемин уллу эт + Текстни ёлчемин гитче эт + %s (Тынгылау бла) + Шрифт + Окъуу + Тюзетиу + Окъууну фокус режими + Тюзетиу энчиликлени эмда скроллингде адыр панелни джашырады + Синтаксисни джарыкъ бла чертиу + Тизгин номерлени кёргюз + Монобошлукълу шрифтны хайырлан + Джазыу теджеулени кёргюз + Сакъланды + Окъуу тизмеде сакъландыр + Окъуу тизмеге ташы + Джангы болдур + \"%s\" атлы окъуу тизме алайсыз да барды. + %1$s, %2$s тизмеге кошулду. + %s сакъланды. Буну тизмеге къошаргъа излеймисиз? + %1$s, %2$s тизмеге кёчюрюлдю. + Хар не да аламатды! %2$s алайсыз да %1$s тизмеде орун алады. + Хар не да аламатды! %s бютеу статьяланы ичинде тутады. + Тизмеге къара + Тизмеге къош + + 1 статья + %d статья + + + 1 статья, %2$.2f MB + %1$d статья, %2$.2f MB + + + 1 статьядан %1$d оффлайн джетиширчады + %2$d статьядан %1$d оффлайн джетиширчады + + + %1$d - 1 статья оффлайн барды, %3$.2f MB + %1$d - %2$d статья оффлайн барды, %3$.2f MB + + Айыр + Айырыу шарты... + Атха кёре айыр + Атха кёре айыр (терсине) + Къошулгъан датасына кёре айыр (джангысындан) + Къошулгъан датасына кёре айыр (эскисинден) + Болдурулгъан датасына кёре айыр (джангысындан) + Болдурулгъан датасына кёре айыр (эскисинден) + Тизмени кетер + Тизмени экспорт эт + Сайла + Сайлауну къорат + Окъуу тизмени экспорт этер ючюн, девайсыгъызны асыраучусуна джаздырыр эркинлик керекди. + Атны/ачыкълауну тюзет + Оффлайндан къорат + Оффлайн сакъландыр + Оффлайндан болгъанны къорат + Оффлайнха болгъанны сакъла + Башха тизмеге къош + Башха тизмеге кёчюр + Окъуу Тизмем + Бу тизмени аты + Ачыкълау (амалсыз тюлдю) + %s, тизмеден къоратылды + %1$s, %2$s тизмеден къоратылды + + %d статья тизмеден къоратлды + %d статья тизмеден къоратлды + + + %d бет %s тизмеден къоратылды + %d бет %s тизмеден къоратылды + + + %d тизме кетерилди + %d тизме кетерилди + + Тынгылау бла тизме (%s) кетерилемез + %1$s кетерилди. Тынгылау бла тизме (%2$s) кетерилемез. + Тизмеле кетерилдиле. Тынгылау бла тизме (%s) кетерилемез. + %s (Википедия окъуу тизме).json + Википедия окъуу тизмеле (%s эмда асламы).json + %d статья тизмеден къоратылды + %s, тизмеледен къоратылды + Кери ал + %s кетерилди + Алкъын сакъланнган бет джокъду + Оффлайн болсагъыз да, артдан окъурча тизмелеригизге статьяла къошугъуз. + Бу тизмеге алкъын чырт бир статья къошмагъансыз. + Оффлайн джетиширчады + Бу статьяны оффлайн джетиширча эт + Башха окъуу тизмеге къош + Башха окъуу тизмеге кёчюр + %s тизмеден башха окъуу тизмеге кёчюр + %s тизмеден къорат + Окъуу тизмеледен къорат + Сайла + Оффлайндан къорат + Статья кёб тизмеде орун алады + %s мындан ары бу тизмеледе оффлайн джетиширча боллукъ тюлдю: + Окъуу тизмени синхронизациясы джандырылсынмы? + Окъуу тизмелеригизге сакъланнган статьяланы, мындан ары Википедия хыйсабыгъыз бла синхронизация этерчады. <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/tr#Synced_reading_lists\">Аслам бил</a> + Окъуу тизмеле энди девайсла арасында синхронизация этилирчады. Википедия хыйсабыгъызда сессия ачыгъыз эмда тизмелеригизни сакъландырыууна эркинлик беригиз. <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Synced_reading_lists\">Аслам бил</a> + Синхрозинацияны джандыр + Окъуу тимзелени синхронизация эт + Окъуу тизмеле энди девайсла арасында синхронизация этилирчады. Википедия хыйсабыгъызда сессия ачыгъыз эмда тизмелеригизни сакъландырыууна эркинлик беригиз. + Википедиягъа кир / къошул + Бусагъатда тюл + Хоу + Огъай + Статья эндириле турады, ишлеу тамамланнгандан сора, оффлайн джетиширча боллукъду. + %2$s ичиндегиге %1$d статья къошулду + %1$d статьяланны %2$s ташылды + Бу %s окъуу тизмени кетерирге излегенигизге ишексизмисиз? + Сайланнган тизме(ле) кетерилсинми? + + %d тизмени кетерирге излегенигизге ишексиизмсиз? + %d тизмени кетерирге излегенигизге ишексиизмсиз? + + Синхронизацияны джандырыр ючюн киригиз + Окъуу тизмелеригизни хыйсабыгъыгъа сакълар ючюн киригиз. + Ызына ал + Кир + Окъуу тизме синхронизация джукъланыбды + Окъуу тизме синхронизация хыйсабыгъыз ючюн джукъланыбды эмда системагъа кирген девайсларыгъызда сакъланнган статьяланы бэкаплары этилмейди. Джарашдырыуларыгъызда окъуу тизме синхронизацияны джандырыгъыз. + ОК + Джарашдырыўла + Окъуу тизмени синхронизациясы джандырылсынмы? + Окъуу тизмеледе сакъланнган статьяла энди Википедия хыйсабыгъызда синхронизация этилирчады.<a href=\"#faq\">Аслам бил</a> + Буну меннге энтда кёргюзме + Синхрозинацияны джандыр + Огъай, сау болугъуз + Сакъланды + Сакъланнган статьяларыгыз ючюн тынгылау бла тизме + Статьяланы тизмелеге кёре тюзет + Джолоучулукъ этиллик джерле, джаратхан темала, эмда бек кёб зат ючюн тизмеле къура + %1$s (хайырланыучу болдурулду) + Окъуу тизме башына %d статья мардасы барды. Бу мардадан чыкъгъан, болгъан тизмеле бирден аслам тизмеген юлешиннгендиле. + Бу тизмеге ташыналмайды. \"%1$s\" ючюн тизме башына %2$d статья мардагъа джетдигиз. + Бу тизмеге къошулалмайды. \"%1$s\" ючюн тизме башына %2$d статья мардагъа джетдигиз. + Башха тизме болдуралмазсыз. Хыйсаб башына 100 окъуу тизме мардагъа джетгенсиз. + Джангы тизме болдур + Тизмени импорт эт + Айырыу шарты + Синхронизацияны джангырт + Кир / регистрация эт + + Бу статьягъа энди оффлайн джетиширчады. + Бу статьягъа энди оффлайн джетиширчады. + + + Бу статьягъа энди оффлайн джетиширча тюлдю. + Бу статьягъа энди оффлайн джетиширча тюлдю. + + Окъуу тизмеле синхронизация этилди + Ахыр синхронизация: %s + ОК + ОК + Ызына ал + Ызына ал + Ызына ал + Ызына ал + ОК + Кетер + Окъуу тизме: %s + Окъургъа тизме(ле) экспорт болду + %d Окъуу тимзе/тизмеле \'reading_lists export.json\' болуб эндирилгенле папкагъа экспорт этилди + Окъуу тизмеле \'reading_lists_export.json\' болуб экспорт этилди + Эспорт эт + Импорт этиллик файлны сайла + Окъургъа тизме импорт болалмады + Эспорт этиллик тизмени/тизмелени сайла + Окъургъа тизме(ле) экспорт болду + + Окъуу тизме экспорт джетишимсиз болду + Окъуу тизме экспорт джетишимсиз болду + + + Окъуу тизме экспорт болду + Окъуу тизме экспорт болду + + Юлюшленнген тизме + Сакъландыр + Тизмен сакъландыр + Тизмеге ат бер эмда сакъландырлыкъ статьяланы сайла. + Башлыкъ + Ызына ал + Сакъландыр + Окъуу тизме сакъланныкъды + Кёргюз + Джарашдырыула + Кери алыннган тюзетиу + Статьяла эндириледиле + Эндириуню прогресси + Пауза + Бардыр + Ызына ал + Окъуу тизмеле синхронизация этиле турады + Окъуу тизмелени синхронизация процесси + %d окъулмагъан хапарландырыуугъуз барды + + Статья эндириледи + статья эндириледи + + + %1$d статья эндириле турады... + %1$d статья эндирилетурады... + + + %1$d статья къалды + %1$d статья къалды + + + Окъуу Тизме Синхронизация Этиледи + Окъуу Тизме Синхронизация Этиледи + + + %1$d тизме синхронизация этиле турады… + %1$d тизме синхронизация этиле турады… + + + %1$d тизме къалды + %1$d тизме къалды + + Википедия хапарландырыула + Хапарландырыула + Хапарландырыула (архив этилгенди) + Хапарландырыула изле + Окъулмагъанланы кёргюз + Архив этилгенни кёргнюз + Хапарландырыу джарашдырыула + Окъулду деб белгиле эмда архив эт + + Хапарландырыу архив этилди + %d хапарландырыу архив этилди + + Хапарландырыуланы джандыр + Джандыр + Бусагъатда тюл + Бютеу хапарландырыуланы окъугъансыз! + Архив этилген хапарландырыуланы кёргюз + Хапарландырыу джарашдырыула + Окъулмагъанча белгиле + Окъулгъанча белгиле + Джууабла + %s хайырланыучугъа джууаб джибериле турады… + Джууаб басмаланды. + Джууабны автомат халда басмаларча болмады. + %d окъулгъанча белгиленди + %d окъулмагъанча белгиленди + + 1 окъулгъанча белгиленди + %d окъулгъанча белгиленди + + + 1 окъулмагъанча белгиленди + %d окъулмагъанча белгиленди + + Кёздеги тизме + Сорушдуруу юсюнден хапарландырыула + Къошакъны, фонунда джангы хапарландырыуланы контроль этер ючюн билги хайырланыууна эркинлик беригиз. + Къошакъ ичинде хапарландырыу тюрлюлери + Система + Системадан билдириуле + Кёзюу + Белгили тюзетиу саннга джетилди + Сау болугъуз + Ким эсе да тюзетиуюгюз ючюн сизге сау бол деди + Эски халына къайтар + Къошумларыгъызны бири кери алынды + Кириу + Кириу активлигигиз + Сагъыныу + Ким эсе да бетде сизни сагъынды + Сюзюу бет + Сюзюу бетдеден келген билдируле эмда джууабла + Электрон мектуб алынды + Ким эсе да сизге викини юсю бла электрон мектуб джиберди + Хайырланыучу хакъ тюрлениуле + Хайырланыучу хакъларыгъыз тюрленсе алыныр + Къурагъан статьяларыгъызгъа джибериуле + Къурагъан бетге джангы джибериу этилсе алыныр + Push-хапарландырыула + Push-хапарландырыуланы джарашдыр + Кёрюнюуню джарашдырыулары + Окъулгъан билдириулени джашыр + Википедия + Википедиядан хапарландырыула + Башха + Программаладан башха хапарландырыула + Фильтр хапарландырыула + Фильтр хапарландырыула + Программаны тиллерин джангырт + Аслам хапарландырыу кёрюр ючюн %s кетериб кёрюгюз + + %d фильтр + %d фильтр + + Бютеу фильтрлени сайла + Барысы да + Сагъыныула + Хапарландырыуланы изле неда фильтр эт + Хапарландырыу фильтр + Окъулгъанды деб белгиле + Окъулмагъанды деб белгиле + Окъулгъан + Окъулмагъан + Бютеу элементлени сайла + Бютеу элементлени сайлауун къорат + Фики фильтр + Тип фильтр + Бютеу викиле + Бютеу тюрлюле + %s сюзюу бет + Бу функция оффлайн хайырланалмаз. + Окъугъанынг ючюн + Рандомайзер + Рандом статья + Аслам рандом статьяла + Эм бек окъулгъан + Аслам эм бек окъулгъан + %d минг + %d млн + Башха рандом статьяны джюкле + Википедияда бюгюн + Баш бетни кёргюз + Кюнню сураты + Эндир + Юлюшле + Бу картчыкъны джашыр + Картчыкъ джашырылды. + Картчыкъны тиллерин тюзет + Аслам сайлам + Викигёзенни сайланнган суратлары + Тинт + Баш бет + Картчыкъны белгичиги + Джангылыкълада + + тюнюне + %d кюн алгъа + + Бюгюн + Окъулгъанды %s + Огъай, сау болугъуз + Контент оффлайн джюкленелмез. + Сайланнган статья + Сакъландыр + Тасманы джарашдыр + Тынгылау бла кёрюнюуню кери джюкле + Барысын да кёргюз + Барысын да джашыр + Бютеу картчыкъ типлени Википедия тиллеринде болмагъанын унутмагъыз. Сайлагъан тиллени джарашдырыулада тюзетигиз. + Баргъан болууланы юсюнден статьяла + Тарихде бюгюн болгъан болуула + Къысха заман алгъа окъугъанларыгъыздан тамалланыб этилген теджеуле + Википедияда кюнню сайланнган статьясы + Кюнню эм кёб кёргюзюлген статьялары + Викигёзенде кюнню сайланнган сураты + Кюнню сайланнган статьясы болгъан Википедияны баш бети + Окъур ючюн рандом статьяла тизме болдур + Википедиягъа контент къошар ючюн теджеуле + Тасмагъызда чырт бир зат джокъду + Джарашдыр + ОК + Ызына ал + <strong>Тасмагъызны джарашдырыгъыз</strong><br /><br />Энди тасмагъызда нени кёргюзюллюгюн эмда эм сюйген контент типлени аллында берирчасыз. + ОК + Ызына ал + Тасмаггъызны артына джетдигиз. + Аслам джюкле + %s датада эм кёб окъулгъанла + Салгъычла + Статья ачыкълау + Статья + Статья ачыкълау (%s) + Статья ачыкълау (%s) + Сурат ачыкълау + Сурат тюб джазыу + Сурат тюб джазыу (%s) + Сурат тюб джазыу (%s) + Басмала + Окъу + Статьяны ачыкълау къош + Статья ачыкълауну кёчюр + Статья ачыкълауну тюзет + Сурат тюб джазыу къош + Сурат тюб джазыуну тюзет + Сурат тюб джазыуну кёчюр + Ызына ал + Информация: Статья ачыкълаула + Викибилгилени юсюнден + Викибилгилеге танытыу джазар ючюн юретиу + Статья ачыкълауланы тюзетирге болгъан интересигиз ючюн сау болугъуз! Аслам тюзетиу этер ючюн, тилейбиз, Википедия хыйсабыгъызгъа киригиз. + Статья ачыкълауну тюзетиб <a href=\"%1$s\">Хайырланыу Шартла</a>ны эмда къошумланы кери къайтмаз шекелде <a href=\"%2$s\">CC BY-SA 3.0</a> лицензия бла басмаларгъа къабыл этеме. + асламысында гитче харифле башланады + Ауаз киргизиу + Статья ачыкълауланы юсюнден аслам бил + Сурат тюб джазыуланы юсюнден аслам бил + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions + Текст асыры къысхады. + Текст тыйгъыч белгиле бла бошалыргъа керек тюлдю. + Биринчи сёз энчи ат тюл эсе, гитче хариф бла башла + Гитче хариф бла башлаудан джанлагъыз. + Сакъланамагъан тилде текст. Тил %s болургъа керекди. + Тилейбиз, ачыкълауугъузну %1$s болгъанына ишексиз болугъуз. Джазгъан ачыкълауугъуз %2$s эсе бу эсгертиуню къулакъгъа алмазгъа боллукъсуз. + Теджелген ачыкълауланы кёргюз + Автомат халда теджелген статья ачыкълауланы сынагъыз + Статья ачыкълау басмаланды! + Статья ачыкълау басмаланды! + Статья ачыкълау басмаланды! (%s) + Сурат тюб джазыу басмаланды! + Сурат тюб джазыу басмаланды! (%s) + Сурат тег(ле) басмаланды! + Джаратдыгъызмы? Бизге аслам къошаргъа болуш. + Википедияны хар ким ючюн да энтда маджаллашдырдынг + Тындырылды + Билемисиз? + Бу къошакъда текстни тюзетирге да боллукъсуз. Эндиги джол ^1 белгичикге басыб, джазыу халатланы эмда къысха айтымланы тюзетиб кёрюгюз + Статья ачыкълаула + Окъуучуланы къысха къарау бла теманы ангыларча болургъа болушур ючюн статьяны магъанасын береди + Къысха болугъуз + Идеалда экиден онеки сёзге дери бир тизгин + Тюзетиуню башла + Башлаб, бу энчиликни аманнга хайырламазлыгъыма сёз береме. + Автомат халда теджеуле + Теджеулени, волонтёрла неда Викимедия Фонд тюл, компьютер этеди + Адыр панелни джарашдыр + Тюб адыр панелни эм джараулу кёрген 5 къысха джол бла джарашдырыгъыз + Адыр панель + Меню + Сайланнган элементлеригизни бери басыб тартыгъыз 👋 + Тынгылаугъа ташла + Элементни ташыр ючюн тартыу белгини басыб тутугъуз + Орунун тюрлендирир ючюн элементни басыб тартыгъыз + Статьяны суратла + Суратланы тюб джазыулары + Сурат тегле + Тюзетиу осмакълау + Ахыр тюзетиулени тинтигиз эмда конструктив болуб болмагъанын белгилегиз. + Тинт + Статья ачыкълауну тинт + Ачыкълау къош + Ачыкълау тюзет + Кёчюрюуню къош + Кёчюрюуню тюзет + Тюб джазыу къош + Тюб джазыуну тюзет + Сурат тюб джазыуну тинт + Къошумларым + Бу файлны ачыкълауу джокъду + Ачыкълауну тюзетиб <a href=\"%1$s\">Хайырланыу Шартла</a>ны эмда къошумланы кери къайтмаз шекелде <a href=\"%2$s\"Creative Commons CC0</a> лицензия бла басмаларгъа къабыл этеме. + Сурат тюб джазыуну къошуб <a href=\"%1$s\">Хайырланыу Шартла</a>ны эмда къошумланы кери къайтмаз шекелде <a href=\"%2$s\">Creative Commons CC0</a> лицензия бла басмаларгъа къабыл этеме. + Информация + Статья ачыкълауланы къош + Ачыкълаусуз статьялагъа къошум эт + Сурат тюб джазыула къош + Суратлагъа джетмеген къысха тюб джазыуланы къош + Сурат тюб джазыуланы кёчюр + Сурат тюб джазыуланы башха тиллеге кёчюр + Кёб тилли редакторлагъа аслам къуллукъ + Бирден аслам Википедия тилде окъуй эмда джаза биле эсегиз, кёчюрюучю къуллукъ сизгеди. + Сиз %d сурат тюб джазыуну тюзетгинчи киритленди + %d статья ачыкълауланы тюзетгинчи киритленди (верфикация болду) + Меннге кёре тюлдю + Тилле къош + Сурат + Санатчы + Автор + Къайнакъ + Лицензия + Дата + + 1 къошум + %d къошум + + Теджелген тюзетиуле + Статьяны ачыкълау къош + Статья ачыкълау къош (%s) + Башла + Сурат тюб джазыу (%s) + Сурат + Викигёзенден файлла + Санатчы + Тегле + Дата + Къайнакъ/Фотограф + Лицензияланыу + Аслам информация + Викигёзенде файлланы саны + Википедияда файлны бети + Сурат теглени къош + Сурат тюб джазыу къош + Сурат тюб джазыу къош (%s) + Кёргюз + Сурат тюб джазыу къош + Сурат тюб джазыу къош (%s) + Сурат теглени къош + Тюзетиу сынамыгъыз къалай эди? Тилейбиз, къошакъны ичиндеги тюзетиу бла байламлы анкетаны толтурур ючюн такъикъагъызны айырыгъыз. + Соруугъа къошул + Къош + Кёчюр + Сурат тюб джазыула + Сурат тегле + Басмаланыу + Басмаланды + Суратланы теглеу, аланы табылгъанларын тынч этеди. + Суратха теглени къошуб, Википедияны статьяларындагъы суратла ючюн хайырланнган эркин лицензиялы гёзенни, Викигёзенде излениуюн тынч къолайланыууна болушурукъсуз. + Ушакъ мында башланады + Сюзюуню бетлери — Википедияда контентни не къадар маджал къалай этерге керек болгъанын сюзген джерди. Википедиячыланы джамагъаты бла байламлы болуб, иш бирлик джюрютюр ючюн, сюзюуге джангы теманы къошугъуз. + Чыгъаргъа излегенигзге таукелмисиз? + Тема бла текстни ичи сакъланныкъ тюлдюле. + Ортагъа салыннган окъургъа тизмени импорту + Сиз кириш ачылгъан тизмени къалай атаргъа излей эдигиз? + *джангы* + Окъургъа тизме сизни бла юлешиннгенди + Сизни бла окъургъа тизмени юлешгенлерин эследик. Программада тизмеге къарар ючюн, ал билдириуге къайтыгъыз эмда джибериуге джангыдан басыгъыз. + Англашынды + Окъургъа тизме импорт болду + Ортагъа салыргъа... + Бу окъургъа тизмени башхала бла арагъа сал + Салам! Мен кесими окъургъа тизмеми сизге джаяргъа излей эдим: + Окъургъа тизмени джайыу функцияны маджаллашдырыр ючюн болушлукъ эталлыкъмысыз? + \"Окъургъа тизмелени джайыу\" — тест функцияды, аны маджаллашдырырча неда кетерирча, бизге сизни багъаларыгъыз керекди. + diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index d7a90036855..e3c7ece37f9 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -239,8 +239,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.mk https://creativecommons.org/publicdomain/zero/1.0/deed.mk - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags Користени библиотеки Учесници <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Екипна страница</a> @@ -864,8 +864,8 @@ Гласовен внос Дознајте повеќе за описи на статии Дознајте повеќе за толкувања на статии - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Текстот е прекраток. Текстот не смее да завршува со интерпункциски знак. Избегнувајте да започнувате со членовите „a“ и „the“ кога пишувате на англиски. @@ -1581,6 +1581,8 @@ Видовте продуктивно уредување? Заблагодарете му се не корисникот. Набљудувај Сакате да гу следите уредувањата во статијата? Додајте ја во Набљудуваните. Погледајте ја во „Повеќе“. + Разговор + Општете со други уредници. Зачувајте често користени разговорни страници или користете предлошка. Враќање/Поништување Изберете „Врати“ за да поништите или отповикате потенцијално штетно уредување. Штетата предвидува дали едно уредување ќе причини штета на едно вики. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fef1617317f..5b56518b1f8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -32,6 +32,7 @@ * Macofe * McDutchie * Mello25 +* Mellogabi03 * Mordecool * MuratTheTurkish * Peter Fernando @@ -410,7 +411,7 @@ O artigo não pode ser carregado enquanto estiver offline. Dica: Adicione o artigo a uma lista de leitura e ele será baixado assim que estiver online novamente. Você está lendo uma versão offline deste artigo salvo em %s. - Redirecionado de %s + Redirecionado a partir de %s Obter itinerário Não foi possível encontrar aplicativos que forneceçam rotas. Feed de Explorar diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 570d65b9edf..281002b16bc 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1354,7 +1354,6 @@ Foarte probabil cu rea-credință Foarte precis în găsirea celor mai evidente editări de rea-credință. Revenire finalizată - Creați, trimiteți și stocați mesaje de avertizare pe pagina de discuții a unui editor. Sunteți mulțumit de această funcționalitate? Mulțumit Neutru diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 02266b929fc..d4e758440e8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -192,6 +192,7 @@ Ваши языки Википедии Опубликовать изменения Правка сохранена! + Правка опубликована! Для появления изменений может потребоваться некоторое время. Ошибка редактирования! Повторить Отмена @@ -234,6 +235,8 @@ Вы вышли из учётной записи Википедии. Желаете войти снова? Войти Отмена + Удалить учётную запись + Предупреждение об удалении учётной записи Нет недавно просмотренных статей Отслеживайте здесь прочитанные вами статьи. Некоторые страницы в истории могут быть недоступны оффлайн. @@ -307,8 +310,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.ru https://creativecommons.org/publicdomain/zero/1.0/deed.ru - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/ru + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/ru#Теги_изображений Используемые библиотеки Авторы <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Страница команды</a> @@ -496,6 +499,11 @@ Вы можете связаться с <a href=\"%2$s\">%1$s</a> или другим <a href=\"https://ru.wikipedia.org/wiki/Википедия:Администраторы\">администратором</a> для обсуждения блокировки. Настройте свою панель инструментов Вы можете связаться с <a href=\"https://ru.wikipedia.org/wiki/Википедия:Администраторы\">администратором</a> для обсуждения блокировки. + Вы не вошли в систему + Понятно + Вы используете временную учётную запись + Отменить изменения и войти в систему + Завершить сеанс Ошибка приложения Сожалеем, но в приложении Википедии случилась ошибка, в результате чего оно было закрыто.\n\nВы хотите перезапустить его или выйти? Перезапустить @@ -927,8 +935,8 @@ Голосовой ввод Подробнее об описаниях статей Подробнее о подписях к изображениям - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D1%82%D0%B5%D0%B9 - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ru#%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8_%D0%BA_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/ru#Описания_статей + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/ru#Подписи_к_изображениям Этот текст слишком короткий. Текст не должен заканчиваться знаками препинания. Начинайте с маленькой буквы, если только первое слово не является собственным названием. @@ -1339,10 +1347,12 @@ Предупреждение Сохранить изменения? Сохранить как новое сообщение + Обновить существующее сообщение Заголовок сообщения Опубликовать Отмена Не сохранять + Сохранённые сообщения Эта страница обсуждения пустая. Обсуждение начинается здесь Ответить @@ -1557,6 +1567,7 @@ Заголовок сообщения Сохранить Отмена + Шаблон «%s» уже существует. Сообщение сохранено Редактировать сообщение Сохранить @@ -1623,17 +1634,27 @@ Максимально точен в поиске очевидно недобросовестных правок. Откат завершён Посмотреть + Проблема с функцией Узнать больше Благодарность + Видите продуктивную правку? Поблагодарите участника за его вклад. Вы довольны этой функцией? Доволен Воздержусь Недоволен Как мы можем улучшить эту функцию? + История редактирования статьи Обратная связь Отправить Обратная связь отправлена. + Предупреждение о вандализме + Нейтральная точка зрения + Автоматический перевод + Напоминание о конфликте интересов + Последнее предупреждение Предупреждение о нарушении авторских прав + Оставить описания правки + Предложение по улучшению статьи Судя по всему, ваша недавняя правка без разрешения содержит материалы, защищенные авторским правом. Пожалуйста, убедитесь, что весь контент соответствует политике [[Wikipedia:Авторские права|авторское право]] этой Википедии, чтобы избежать удаления. Используйте примеры сообщения ниже для настройки, отправки и сохранения его в своих сообщениях. Принять @@ -1645,7 +1666,9 @@ Назад Открыть в системном браузере Места + Чтобы увидеть ваше местоположение на карте, требуется разрешение на определение местоположения. Пожалуйста, попробуйте ещё раз. Поиск мест + Фильтр по языку Карта Список Очень доволен diff --git a/app/src/main/res/values-se/strings.xml b/app/src/main/res/values-se/strings.xml index 6218a1b3167..8af521058bd 100644 --- a/app/src/main/res/values-se/strings.xml +++ b/app/src/main/res/values-se/strings.xml @@ -197,6 +197,7 @@ Synkronisere lohkanlisttuid iešguđet ovttadagaid gaskka, go vurket daid iežat Wikipedia dovddaldahkii \"%s\" Sihko synkroniserejuvvon lohkanlisttuid \"%s:is\"? Dát ollasit sihkku visot ovdal synkroniserejuvvon lohkanlisttuid gáiddusvuorkkás. Jávkat visot synkroniserejuvvon listtuid iežat dovddaldagas \"%s\"? + Sille historjjá Dán liŋkka čájeheapmi ii lihkostuvvan Dát siidu lea beallesuodjaluvvon. Dát siidu lea ollásit suodjaluvvon. @@ -234,6 +235,7 @@ Lassedieđut Gidde Wikipedia-ohcan + Meroštallan ii gávdno. Gidde Čájet govaid Loga eambbo @@ -251,6 +253,7 @@ Áiggutgo don duođaid buot leavggaid giddet? Gidde leavgga Lasit lohkanlistui + Dovdameahttun meattáhus iđii. Diehtu: ”%s” Loga artihkkala Lasit lohkanlistui @@ -258,8 +261,10 @@ Skeaŋkkat Váldde atnui Gidde + Loga Vurke Vurkejuvvon + Juoge Dát siidu ii gávdno Gáldu %s Gáldut @@ -268,9 +273,12 @@ Vurke buot leavggaid Du geavaheaddjinamma dahje IP-čujuhus lea hehttejuvvon. Sivva hehttemii lea: %s + It leat čálihuvvon sisa + Ok, ipmirdin. Vurke Giella Oza + Temá Sisdoallu Rievdat… Rievdat artihkkala govvádusa @@ -280,6 +288,9 @@ %s lea vurkejuvvon. Háliidatgo dan listui lasihit? Čájet listtu Lasit listui + Sirre + Sirrenvuohki… + Sirre nama mielde Sihko listtu Vállje Lasit nuppi listui @@ -296,6 +307,7 @@ Váldde synkroniserema atnui Ii giitu Vurkejuvvon + Sirrenvuohki Gaskkalduhte Gaskkalduhte Gaskkalduhte @@ -417,6 +429,7 @@ Rievdat %s Gaskkalduhte Joatkke + Ok, ipmirdin. Lasit dahje rievdat gielaid Oza Lasit giela @@ -454,7 +467,9 @@ Vurke rievdadusaid? Almmut Gaskkalduhte + Ale vurke Vástit + Sirrenvuohki Maŋemus rievdaduvvon Diŋgo Rievdat wikiteavsttain @@ -479,6 +494,7 @@ Vuollekategoriijat Nammagomuvuođat *ođđa* + Ok, ipmirdin. Vurke Vurke rievdadusaid Vurke @@ -493,5 +509,6 @@ Unna rievdadusažat Eará rievdadusat go unna rievdadusažat Lassedieđut + Máhcahat Dohkket diff --git a/app/src/main/res/values-smn/strings.xml b/app/src/main/res/values-smn/strings.xml index 21b9d41dc34..732636bd388 100644 --- a/app/src/main/res/values-smn/strings.xml +++ b/app/src/main/res/values-smn/strings.xml @@ -156,10 +156,13 @@ Lasseet luuhâmliiston Luuvâ artikkâl Lasseet luuhâmliiston + Luuvâ Vuorkkii Vyerkkejum + Jyevi Uđđâ koskâlostâ Vuorkkii puoh koskâloostâid + Jieh lah čáládâttâm siisâ Vuorkkii Kielâ Uusâ @@ -335,6 +338,7 @@ Vuorkkii uđđâ viestân Vuorkkii uđđâ viestân liiston Almostit + Ele vuorkkii Vyerkkejum viestah Västid Uusâ viestâid @@ -361,4 +365,5 @@ Vuorkkii nubástusâid Vuorkkii Vuorkkii + Macâttâs diff --git a/app/src/main/res/values-sms/strings.xml b/app/src/main/res/values-sms/strings.xml index 991edbe15ba..259ed5074a6 100644 --- a/app/src/main/res/values-sms/strings.xml +++ b/app/src/main/res/values-sms/strings.xml @@ -140,7 +140,7 @@ Ij käunnʼjam ni mii Lââʹssteâđ Piij ǩidd - Ij käunnʼjam ni õhtt meäʹrteeʹlm. + Ij käunnʼjam ni õhtt meäʹrtelm. Piij ǩidd Čuäʹjet kaartid Looǥǥ lââʹzz @@ -165,13 +165,17 @@ Looǥǥ artikkeeʹl Seeʹrd saǥstõõllâmssijddu Lââʹzzet lookkâmliʹstte + Looǥǥ Ruõkk + Jueʹjj Tät seidd ij kaunnu Teâttkäivv %s Teâttkääiv Siiskâž lij vuäǯǯamnalla $1 -liseeʹnsin, ǥõõi ij nuuʹbbnalla leäkku peäggtum. Ođđ kõskklõstt Ruõkk puk kõskklõõstid + Jiõk leäkku ǩeeʹrjtõõttâm sizz + Äʹšš lij seʹlvv. Ruõkk Ǩiõll Ooʒʒ @@ -342,6 +346,7 @@ Lââʹssasetõõzz Snimldõõǥǥâž Lââʹzzet + Lââʹssteâđ Tiõrv %s! Tiõʹđžiǩ-a ton, što puk vuäiʹtte Wikipedia muʹtted? Tiõʹđžiǩ-a ton, što puk vuäiʹtte Wikipedia muʹtted? Valvvâmlistt @@ -351,6 +356,7 @@ Õõʹnni %s saǥstõõllmõõžž Ruõkk muttsid? Õlmstââʹtt + Jeäʹl ruõkk Vaʹstted Kååʹmet Ooʒʒ saaǥǥid @@ -399,4 +405,5 @@ Ruõkk muttsid Ruõkk Ruõkk + Maacctõs diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 9e3b80064a8..856f3be3c01 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1086,7 +1086,7 @@ Следеће Молимо Вас да прегледате чланак да би сте разумели његову тему и проверите слику Извините, у овом моменту нема више доступних слика за предлагање. Погледајте остале <a href=\"#\">предложене измене</a> или покушајте касније. - Проблем са могућношћу + Проблем са функцијом Проблем са Предложеним изменама Додата слика Додат натпис @@ -1547,7 +1547,7 @@ Сигурно врати измене? Враћање извршено Прикажи - Проблем са могућношћу + Проблем са функцијом Сазнајте више Допринесите надзору или одобравању измена на Википедији. Побољшајте квалитет садржаја Википедије активним прегледом фида скорашњих измена и пружањем смерница, контролом квалитета и охрабривањем других уредника/ца. From f13e14f7d53d4c95977621aa62ec172e20e16105 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 18 Apr 2024 09:10:05 -0700 Subject: [PATCH 061/626] Bump versionCode. (#4608) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 236642b5cbe..297651b7809 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50482 + versionCode 50483 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From c232307f302f1f03e2141b64f412421b53f16210 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 18 Apr 2024 14:07:18 -0700 Subject: [PATCH 062/626] Fix: use subdomain for available wikis in Patroller Tasks (#4610) * Fix: use subdomain for available wikis in Patroller Tasks * Fix lint --- .../org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt index 7912a899872..1d6978a3f75 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt @@ -348,7 +348,7 @@ class SuggestedEditsTasksFragment : Fragment() { vandalismPatrolTask.new = !Prefs.recentEditsOnboardingShown if (viewModel.allowToPatrolEdits && viewModel.blockMessageWikipedia.isNullOrEmpty() && - SuggestedEditsRecentEditsActivity.AVAILABLE_WIKIS.contains(WikipediaApp.instance.wikiSite.languageCode)) { + SuggestedEditsRecentEditsActivity.AVAILABLE_WIKIS.contains(WikipediaApp.instance.wikiSite.subdomain())) { // TODO: limit to the primary language now. Prefs.recentEditsWikiCode = WikipediaApp.instance.appOrSystemLanguageCode displayedTasks.add(vandalismPatrolTask) From d6e98fc6016426fd62d9a3cc6f9c242bf7abfb1c Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Fri, 19 Apr 2024 07:41:40 -0700 Subject: [PATCH 063/626] Use coroutine and ViewModel on Random related classes (#4602) * Use coroutine and ViewModel on Random related classes * Fix lint * Use correct dispatchers * Fix test * More conversion and update test --------- Co-authored-by: Dmitry Brant --- .../org/wikipedia/dataclient/RestService.kt | 6 +- .../becauseyouread/BecauseYouReadClient.kt | 1 - .../org/wikipedia/feed/random/RandomClient.kt | 56 ++++---- .../org/wikipedia/random/RandomFragment.kt | 132 ++++++++---------- .../wikipedia/random/RandomItemFragment.kt | 126 +++++++---------- .../wikipedia/random/RandomItemViewModel.kt | 47 +++++++ .../org/wikipedia/random/RandomViewModel.kt | 43 ++++++ .../random/RandomSummaryClientTest.kt | 35 ++++- 8 files changed, 256 insertions(+), 190 deletions(-) create mode 100644 app/src/main/java/org/wikipedia/random/RandomItemViewModel.kt create mode 100644 app/src/main/java/org/wikipedia/random/RandomViewModel.kt diff --git a/app/src/main/java/org/wikipedia/dataclient/RestService.kt b/app/src/main/java/org/wikipedia/dataclient/RestService.kt index c91f5d19667..e62ea20e077 100644 --- a/app/src/main/java/org/wikipedia/dataclient/RestService.kt +++ b/app/src/main/java/org/wikipedia/dataclient/RestService.kt @@ -84,9 +84,9 @@ interface RestService { @GET("page/definition/{title}") fun getDefinition(@Path("title") title: String): Observable>> - @get:GET("page/random/summary") - @get:Headers("Accept: $ACCEPT_HEADER_SUMMARY") - val randomSummary: Observable + @GET("page/random/summary") + @Headers("Accept: $ACCEPT_HEADER_SUMMARY") + suspend fun getRandomSummary(): PageSummary @GET("page/media-list/{title}/{revision}") fun getMediaList( diff --git a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt index 0b7bb7a9f22..7117ac598bd 100644 --- a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt +++ b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.kt @@ -22,7 +22,6 @@ class BecauseYouReadClient : FeedClient { private var clientJob: Job? = null override fun request(context: Context, wiki: WikiSite, age: Int, cb: FeedClient.Callback) { cancel() - clientJob?.cancel() clientJob = CoroutineScope(Dispatchers.Main).launch( CoroutineExceptionHandler { _, caught -> L.v(caught) diff --git a/app/src/main/java/org/wikipedia/feed/random/RandomClient.kt b/app/src/main/java/org/wikipedia/feed/random/RandomClient.kt index 7f28c05195c..3409a759c1d 100644 --- a/app/src/main/java/org/wikipedia/feed/random/RandomClient.kt +++ b/app/src/main/java/org/wikipedia/feed/random/RandomClient.kt @@ -1,14 +1,14 @@ package org.wikipedia.feed.random import android.content.Context -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite -import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.feed.FeedContentType import org.wikipedia.feed.FeedCoordinator import org.wikipedia.feed.dataclient.FeedClient @@ -17,37 +17,35 @@ import org.wikipedia.util.log.L class RandomClient : FeedClient { - private val disposables = CompositeDisposable() + private var clientJob: Job? = null override fun request(context: Context, wiki: WikiSite, age: Int, cb: FeedClient.Callback) { cancel() - disposables.add( - Observable.fromIterable(FeedContentType.aggregatedLanguages) - .flatMap({ lang -> getRandomSummaryObservable(lang) }, { first, second -> Pair(first, second) }) - .observeOn(AndroidSchedulers.mainThread()) - .toList() - .subscribe({ pairs -> - val list = pairs.map { RandomCard(it.second, age, WikiSite.forLanguageCode(it.first)) } - FeedCoordinator.postCardsToCallback(cb, list) - }) { t -> - L.v(t) - cb.error(t) - }) - } - - private fun getRandomSummaryObservable(lang: String): Observable { - return ServiceFactory.getRest(WikiSite.forLanguageCode(lang)) - .randomSummary - .subscribeOn(Schedulers.io()) - .onErrorResumeNext { throwable -> - Observable.fromCallable { - val page = AppDatabase.instance.readingListPageDao().getRandomPage() ?: throw throwable as Exception - ReadingListPage.toPageSummary(page) + clientJob = CoroutineScope(Dispatchers.Main).launch( + CoroutineExceptionHandler { _, caught -> + L.v(caught) + cb.error(caught) + } + ) { + val list = mutableListOf() + FeedContentType.aggregatedLanguages.forEach { lang -> + val wikiSite = WikiSite.forLanguageCode(lang) + val randomSummary = try { + ServiceFactory.getRest(wikiSite).getRandomSummary() + } catch (e: Exception) { + AppDatabase.instance.readingListPageDao().getRandomPage()?.let { + ReadingListPage.toPageSummary(it) + } ?: run { + throw e + } } + list.add(RandomCard(randomSummary, age, wikiSite)) } + FeedCoordinator.postCardsToCallback(cb, list) + } } override fun cancel() { - disposables.clear() + clientJob?.cancel() } } diff --git a/app/src/main/java/org/wikipedia/random/RandomFragment.kt b/app/src/main/java/org/wikipedia/random/RandomFragment.kt index 5f6450199f9..e2f0abe1511 100644 --- a/app/src/main/java/org/wikipedia/random/RandomFragment.kt +++ b/app/src/main/java/org/wikipedia/random/RandomFragment.kt @@ -9,21 +9,20 @@ import android.view.View import android.view.ViewGroup import androidx.core.os.bundleOf import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.functions.Consumer -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.R import org.wikipedia.WikipediaApp -import org.wikipedia.database.AppDatabase import org.wikipedia.databinding.FragmentRandomBinding import org.wikipedia.dataclient.WikiSite import org.wikipedia.events.ArticleSavedOrDeletedEvent -import org.wikipedia.extensions.parcelable import org.wikipedia.history.HistoryEntry import org.wikipedia.page.PageActivity import org.wikipedia.page.PageTitle @@ -33,39 +32,19 @@ import org.wikipedia.readinglist.database.ReadingListPage import org.wikipedia.util.AnimationUtil.PagerTransformer import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.Resource import org.wikipedia.util.log.L import org.wikipedia.views.PositionAwareFragmentStateAdapter class RandomFragment : Fragment() { - companion object { - const val DEFAULT_PAGER_TAB = 0 - const val PAGER_OFFSCREEN_PAGE_LIMIT = 2 - const val ENABLED_BACK_BUTTON_ALPHA = 1f - const val DISABLED_BACK_BUTTON_ALPHA = 0.5f - - fun newInstance(wikiSite: WikiSite, invokeSource: InvokeSource) = RandomFragment().apply { - arguments = bundleOf( - Constants.ARG_WIKISITE to wikiSite, - Constants.INTENT_EXTRA_INVOKE_SOURCE to invokeSource - ) - } - } - private var _binding: FragmentRandomBinding? = null private val binding get() = _binding!! - private val disposables = CompositeDisposable() - private val viewPagerListener: ViewPagerListener = ViewPagerListener() - - private lateinit var wikiSite: WikiSite + private val viewModel: RandomViewModel by viewModels { RandomViewModel.Factory(requireArguments()) } + private val viewPagerListener = ViewPagerListener() private val topTitle get() = getTopChild()?.title - private var saveButtonState = false - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) _binding = FragmentRandomBinding.inflate(inflater, container, false) @@ -73,8 +52,6 @@ class RandomFragment : Fragment() { FeedbackUtil.setButtonTooltip(binding.randomNextButton, binding.randomSaveButton) - wikiSite = requireArguments().parcelable(Constants.ARG_WIKISITE)!! - binding.randomItemPager.offscreenPageLimit = 2 binding.randomItemPager.adapter = RandomItemAdapter(this) binding.randomItemPager.setPageTransformer(PagerTransformer(resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL)) @@ -84,13 +61,23 @@ class RandomFragment : Fragment() { binding.randomBackButton.setOnClickListener { onBackClick() } binding.randomSaveButton.setOnClickListener { onSaveShareClick() } - disposables.add(WikipediaApp.instance.bus.subscribe(EventBusConsumer())) + viewLifecycleOwner.lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + val eventBus = WikipediaApp.instance.bus.subscribe(EventBusConsumer()) + viewModel.uiState.collect { + when (it) { + is Resource.Success -> setSaveButton() + is Resource.Error -> L.w(it.throwable) + } + } + } + } - updateSaveShareButton() + updateSaveButton() updateBackButton(DEFAULT_PAGER_TAB) if (savedInstanceState != null && binding.randomItemPager.currentItem == DEFAULT_PAGER_TAB && topTitle != null) { - updateSaveShareButton(topTitle) + updateSaveButton(topTitle) } return view @@ -98,11 +85,10 @@ class RandomFragment : Fragment() { override fun onResume() { super.onResume() - updateSaveShareButton(topTitle) + updateSaveButton(topTitle) } override fun onDestroyView() { - disposables.clear() binding.randomItemPager.unregisterOnPageChangeCallback(viewPagerListener) _binding = null super.onDestroyView() @@ -128,25 +114,25 @@ class RandomFragment : Fragment() { private fun onSaveShareClick() { val title = topTitle ?: return - if (saveButtonState) { + if (viewModel.saveButtonState) { LongPressMenu(binding.randomSaveButton, existsInAnyList = false, callback = object : LongPressMenu.Callback { override fun onAddRequest(entry: HistoryEntry, addToDefault: Boolean) { ReadingListBehaviorsUtil.addToDefaultList(requireActivity(), title, addToDefault, InvokeSource.RANDOM_ACTIVITY) { - updateSaveShareButton(title) + updateSaveButton(title) } } override fun onMoveRequest(page: ReadingListPage?, entry: HistoryEntry) { page?.let { ReadingListBehaviorsUtil.moveToList(requireActivity(), page.listId, title, InvokeSource.RANDOM_ACTIVITY) { - updateSaveShareButton() + updateSaveButton() } } } }).show(HistoryEntry(title, HistoryEntry.SOURCE_RANDOM)) } else { ReadingListBehaviorsUtil.addToDefaultList(requireActivity(), title, true, InvokeSource.RANDOM_ACTIVITY) { - updateSaveShareButton(title) + updateSaveButton(title) } } } @@ -163,10 +149,7 @@ class RandomFragment : Fragment() { intent.putExtra(Constants.INTENT_EXTRA_HAS_TRANSITION_ANIM, true) } - startActivity( - intent, - if (DimenUtil.isLandscape(requireContext()) || sharedElements.isEmpty()) null else options.toBundle() - ) + startActivity(intent, if (DimenUtil.isLandscape(requireContext()) || sharedElements.isEmpty()) null else options.toBundle()) } private fun updateBackButton(pagerPosition: Int) { @@ -175,38 +158,24 @@ class RandomFragment : Fragment() { if (pagerPosition == DEFAULT_PAGER_TAB) DISABLED_BACK_BUTTON_ALPHA else ENABLED_BACK_BUTTON_ALPHA } - private fun updateSaveShareButton(title: PageTitle?) { - if (title == null) { - return + private fun updateSaveButton(title: PageTitle? = null) { + title?.let { + viewModel.findPageInAnyList(title) + } ?: run { + val enable = getTopChild()?.isLoadComplete ?: false + binding.randomSaveButton.isClickable = enable + binding.randomSaveButton.alpha = + if (enable) ENABLED_BACK_BUTTON_ALPHA else DISABLED_BACK_BUTTON_ALPHA } - - val d = Observable.fromCallable { - AppDatabase.instance.readingListPageDao().findPageInAnyList(title) != null - } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ exists: Boolean -> - saveButtonState = exists - val img = - if (saveButtonState) R.drawable.ic_bookmark_white_24dp else R.drawable.ic_bookmark_border_white_24dp - binding.randomSaveButton.setImageResource(img) - }, { t -> - L.w(t) - }) - - disposables.add(d) } - private fun updateSaveShareButton() { - val enable = getTopChild()?.isLoadComplete ?: false - - binding.randomSaveButton.isClickable = enable - binding.randomSaveButton.alpha = - if (enable) ENABLED_BACK_BUTTON_ALPHA else DISABLED_BACK_BUTTON_ALPHA + private fun setSaveButton() { + val imageSource = if (viewModel.saveButtonState) R.drawable.ic_bookmark_white_24dp else R.drawable.ic_bookmark_border_white_24dp + binding.randomSaveButton.setImageResource(imageSource) } fun onChildLoaded() { - updateSaveShareButton() + updateSaveButton() } private fun getTopChild(): RandomItemFragment? { @@ -221,7 +190,7 @@ class RandomFragment : Fragment() { } override fun createFragment(position: Int): Fragment { - return RandomItemFragment.newInstance(wikiSite) + return RandomItemFragment.newInstance(viewModel.wikiSite) } } @@ -235,12 +204,12 @@ class RandomFragment : Fragment() { override fun onPageSelected(position: Int) { updateBackButton(position) - updateSaveShareButton(topTitle) + updateSaveButton(topTitle) nextPageSelectedAutomatic = false prevPosition = position - updateSaveShareButton() + updateSaveButton() val storedOffScreenPagesCount = binding.randomItemPager.offscreenPageLimit * 2 + 1 if (position >= storedOffScreenPagesCount) { @@ -257,10 +226,23 @@ class RandomFragment : Fragment() { } for (page in event.pages) { if (page.apiTitle == topTitle?.prefixedText && page.wiki.languageCode == topTitle?.wikiSite?.languageCode) { - updateSaveShareButton(topTitle) + updateSaveButton(topTitle) } } } } } + + companion object { + const val DEFAULT_PAGER_TAB = 0 + const val ENABLED_BACK_BUTTON_ALPHA = 1f + const val DISABLED_BACK_BUTTON_ALPHA = 0.5f + + fun newInstance(wikiSite: WikiSite, invokeSource: InvokeSource) = RandomFragment().apply { + arguments = bundleOf( + Constants.ARG_WIKISITE to wikiSite, + Constants.INTENT_EXTRA_INVOKE_SOURCE to invokeSource + ) + } + } } diff --git a/app/src/main/java/org/wikipedia/random/RandomItemFragment.kt b/app/src/main/java/org/wikipedia/random/RandomItemFragment.kt index 60ecfd4d533..e97c0b3d1db 100644 --- a/app/src/main/java/org/wikipedia/random/RandomItemFragment.kt +++ b/app/src/main/java/org/wikipedia/random/RandomItemFragment.kt @@ -6,55 +6,36 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.os.bundleOf +import androidx.core.view.isVisible import androidx.fragment.app.Fragment -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.databinding.FragmentRandomItemBinding -import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.ImageUrlUtil.getUrlForPreferredSize import org.wikipedia.util.L10nUtil +import org.wikipedia.util.Resource import org.wikipedia.util.log.L class RandomItemFragment : Fragment() { - companion object { - private const val EXTRACT_MAX_LINES = 4 - - fun newInstance(wikiSite: WikiSite) = RandomItemFragment().apply { - arguments = bundleOf(Constants.ARG_WIKISITE to wikiSite) - } - } - private var _binding: FragmentRandomItemBinding? = null private val binding get() = _binding!! + private val viewModel: RandomItemViewModel by viewModels { RandomItemViewModel.Factory(requireArguments()) } - private val disposables = CompositeDisposable() - - private lateinit var wikiSite: WikiSite - private var summary: PageSummary? = null - - val isLoadComplete: Boolean get() = summary != null - val title: PageTitle? get() = summary?.getPageTitle(wikiSite) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - wikiSite = requireArguments().parcelable(Constants.ARG_WIKISITE)!! - - retainInstance = true - } + val isLoadComplete: Boolean get() = viewModel.summary != null + val title: PageTitle? get() = viewModel.summary?.getPageTitle(viewModel.wikiSite) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) _binding = FragmentRandomItemBinding.inflate(inflater, container, false) - val view = binding.root binding.randomItemWikiArticleCardView.setOnClickListener { title?.let { title -> @@ -68,74 +49,69 @@ class RandomItemFragment : Fragment() { binding.randomItemErrorView.retryClickListener = View.OnClickListener { binding.randomItemProgress.visibility = View.VISIBLE - getRandomPage() + viewModel.getRandomPage() } - updateContents() - - if (summary == null) { - getRandomPage() + L10nUtil.setConditionalLayoutDirection(binding.root, viewModel.wikiSite.languageCode) + + viewLifecycleOwner.lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + viewModel.uiState.collect { + when (it) { + is Resource.Loading -> { + binding.randomItemProgress.isVisible = true + } + is Resource.Success -> updateContents(it.data) + is Resource.Error -> setErrorState(it.throwable) + } + } + } } - L10nUtil.setConditionalLayoutDirection(view, wikiSite.languageCode) - return view + return binding.root } override fun onDestroyView() { - disposables.clear() _binding = null - super.onDestroyView() } - private fun getRandomPage() { - val d = ServiceFactory.getRest(wikiSite).randomSummary - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ pageSummary -> - summary = pageSummary - updateContents() - parent().onChildLoaded() - }, { t -> - setErrorState(t) - }) - - disposables.add(d) - } - private fun setErrorState(t: Throwable) { L.e(t) - binding.randomItemErrorView.setError(t) - binding.randomItemErrorView.visibility = View.VISIBLE - binding.randomItemProgress.visibility = View.GONE - binding.randomItemWikiArticleCardView.visibility = View.GONE + binding.randomItemErrorView.isVisible = true + binding.randomItemProgress.isVisible = false + binding.randomItemWikiArticleCardView.isVisible = false } - private fun updateContents() { - binding.randomItemErrorView.visibility = View.GONE - - binding.randomItemWikiArticleCardView.visibility = - if (summary == null) View.GONE else View.VISIBLE + private fun updateContents(summary: PageSummary?) { + binding.randomItemErrorView.isVisible = false + binding.randomItemProgress.isVisible = false + binding.randomItemWikiArticleCardView.isVisible = summary != null + summary?.run { + binding.randomItemWikiArticleCardView.setTitle(displayTitle) + binding.randomItemWikiArticleCardView.setDescription(description) + binding.randomItemWikiArticleCardView.setExtract(extract, EXTRACT_MAX_LINES) - binding.randomItemProgress.visibility = - if (summary == null) View.VISIBLE else View.GONE + var imageUri: Uri? = null - val summary = summary ?: return - - binding.randomItemWikiArticleCardView.setTitle(summary.displayTitle) - binding.randomItemWikiArticleCardView.setDescription(summary.description) - binding.randomItemWikiArticleCardView.setExtract(summary.extract, EXTRACT_MAX_LINES) - - var imageUri: Uri? = null - - summary.thumbnailUrl.takeUnless { it.isNullOrBlank() }?.let { thumbnailUrl -> - imageUri = Uri.parse(getUrlForPreferredSize(thumbnailUrl, Constants.PREFERRED_CARD_THUMBNAIL_SIZE)) + thumbnailUrl.takeUnless { it.isNullOrBlank() }?.let { thumbnailUrl -> + imageUri = Uri.parse(getUrlForPreferredSize(thumbnailUrl, Constants.PREFERRED_CARD_THUMBNAIL_SIZE)) + } + binding.randomItemWikiArticleCardView.setImageUri(imageUri, false) } - binding.randomItemWikiArticleCardView.setImageUri(imageUri, false) + parent().onChildLoaded() } private fun parent(): RandomFragment { return requireActivity().supportFragmentManager.fragments[0] as RandomFragment } + + companion object { + private const val EXTRACT_MAX_LINES = 4 + + fun newInstance(wikiSite: WikiSite) = RandomItemFragment().apply { + arguments = bundleOf(Constants.ARG_WIKISITE to wikiSite) + } + } } diff --git a/app/src/main/java/org/wikipedia/random/RandomItemViewModel.kt b/app/src/main/java/org/wikipedia/random/RandomItemViewModel.kt new file mode 100644 index 00000000000..be1ab2caf55 --- /dev/null +++ b/app/src/main/java/org/wikipedia/random/RandomItemViewModel.kt @@ -0,0 +1,47 @@ +package org.wikipedia.random + +import android.os.Bundle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.wikipedia.Constants +import org.wikipedia.dataclient.ServiceFactory +import org.wikipedia.dataclient.WikiSite +import org.wikipedia.dataclient.page.PageSummary +import org.wikipedia.extensions.parcelable +import org.wikipedia.util.Resource + +class RandomItemViewModel(bundle: Bundle) : ViewModel() { + + private val handler = CoroutineExceptionHandler { _, throwable -> + _uiState.value = Resource.Error(throwable) + } + val wikiSite: WikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! + var summary: PageSummary? = null + + private val _uiState = MutableStateFlow(Resource()) + val uiState = _uiState.asStateFlow() + + init { + getRandomPage() + } + + fun getRandomPage() { + _uiState.value = Resource.Loading() + viewModelScope.launch(handler) { + summary = ServiceFactory.getRest(wikiSite).getRandomSummary() + _uiState.value = Resource.Success(summary) + } + } + + class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { + @Suppress("unchecked_cast") + override fun create(modelClass: Class): T { + return RandomItemViewModel(bundle) as T + } + } +} diff --git a/app/src/main/java/org/wikipedia/random/RandomViewModel.kt b/app/src/main/java/org/wikipedia/random/RandomViewModel.kt new file mode 100644 index 00000000000..8e43d5b6cf3 --- /dev/null +++ b/app/src/main/java/org/wikipedia/random/RandomViewModel.kt @@ -0,0 +1,43 @@ +package org.wikipedia.random + +import android.os.Bundle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.wikipedia.Constants +import org.wikipedia.database.AppDatabase +import org.wikipedia.dataclient.WikiSite +import org.wikipedia.extensions.parcelable +import org.wikipedia.page.PageTitle +import org.wikipedia.util.Resource + +class RandomViewModel(bundle: Bundle) : ViewModel() { + + private val handler = CoroutineExceptionHandler { _, throwable -> + _uiState.value = Resource.Error(throwable) + } + val wikiSite: WikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! + var saveButtonState = false + + private val _uiState = MutableStateFlow(Resource()) + val uiState = _uiState.asStateFlow() + + fun findPageInAnyList(title: PageTitle) { + viewModelScope.launch(handler) { + val inAnyList = AppDatabase.instance.readingListPageDao().findPageInAnyList(title) != null + saveButtonState = inAnyList + _uiState.value = Resource.Success(inAnyList) + } + } + + class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { + @Suppress("unchecked_cast") + override fun create(modelClass: Class): T { + return RandomViewModel(bundle) as T + } + } +} diff --git a/app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.kt b/app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.kt index 549b6fde6df..7596f3680a1 100644 --- a/app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.kt +++ b/app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.kt @@ -1,6 +1,10 @@ package org.wikipedia.random +import kotlinx.coroutines.runBlocking +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers import org.junit.Test +import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.test.MockRetrofitTest class RandomSummaryClientTest : MockRetrofitTest() { @@ -8,24 +12,41 @@ class RandomSummaryClientTest : MockRetrofitTest() { @Throws(Throwable::class) fun testRequestEligible() { enqueueFromFile("rb_page_summary_valid.json") - restService.randomSummary.test().await() - .assertComplete().assertNoErrors() - .assertValue { it.displayTitle == "Fermat's Last Theorem" && it.description == "theorem in number theory" } + runBlocking { + getRandomSummary() + }.run { + MatcherAssert.assertThat(displayTitle, Matchers.`is`("Fermat's Last Theorem")) + MatcherAssert.assertThat(description, Matchers.`is`("theorem in number theory")) + } } @Test @Throws(Throwable::class) fun testRequestMalformed() { enqueueMalformed() - restService.randomSummary.test().await() - .assertError(Exception::class.java) + runBlocking { + try { + getRandomSummary() + } catch (e: Exception) { + MatcherAssert.assertThat(e, Matchers.notNullValue()) + } + } } @Test @Throws(Throwable::class) fun testRequestFailure() { enqueue404() - restService.randomSummary.test().await() - .assertError(Exception::class.java) + runBlocking { + try { + getRandomSummary() + } catch (e: Exception) { + MatcherAssert.assertThat(e, Matchers.notNullValue()) + } + } + } + + private suspend fun getRandomSummary(): PageSummary { + return restService.getRandomSummary() } } From 7eb37df3cf084e42273a76d108af6c6298fdc183 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Fri, 19 Apr 2024 10:11:10 -0700 Subject: [PATCH 064/626] Bump versionCode. (#4614) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 297651b7809..d4f72027326 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50483 + versionCode 50484 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From 04f7d1b60237b366484b5d7fae031f9ff9885917 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 19 Apr 2024 13:51:18 -0400 Subject: [PATCH 065/626] Fix enabling Next button in TalkReply from saved messages. (#4612) Co-authored-by: Cooltey Feng --- app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index d5b7abe4ce2..403bcb58f9b 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -185,6 +185,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre binding.replySubjectText.setText(it.subject) binding.replyInputView.editText.setText(it.message) shouldWatchText = true + setSaveButtonEnabled(true) } } @@ -213,7 +214,6 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre } private fun onInitialLoad() { - setSaveButtonEnabled(false) L10nUtil.setConditionalLayoutDirection(binding.talkScrollContainer, viewModel.pageTitle.wikiSite.languageCode) binding.learnMoreButton.isVisible = viewModel.isFromDiff if (viewModel.topic != null) { @@ -236,6 +236,8 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre shouldWatchText = true EditAttemptStepEvent.logInit(viewModel.pageTitle) + setSaveButtonEnabled(binding.replyInputView.editText.text.isNotEmpty()) + if (viewModel.isNewTopic || viewModel.isFromDiff) { if (viewModel.isNewTopic) { title = getString(R.string.talk_new_topic) From 0c22eee0c969f3f2e9d5c405f3ba3410dcf6c1a0 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 19 Apr 2024 14:00:06 -0400 Subject: [PATCH 066/626] Don't reset to Your Messages tab unless message was updated. (#4613) Co-authored-by: Cooltey Feng --- .../java/org/wikipedia/talk/template/TalkTemplatesFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index b1866fd1d15..b96ce2a6cbe 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -82,11 +82,11 @@ class TalkTemplatesFragment : Fragment() { } private val requestNewTemplate = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - binding.talkTemplatesTabLayout.getTabAt(0)?.select() if (result.resultCode == RESULT_OK || result.resultCode == RESULT_BACK_FROM_TOPIC) { viewModel.loadTalkTemplates() PatrollerExperienceEvent.logAction("save_message_toast", "pt_templates") if (result.resultCode != RESULT_BACK_FROM_TOPIC) { + binding.talkTemplatesTabLayout.getTabAt(0)?.select() FeedbackUtil.showMessage(this, R.string.talk_templates_new_message_saved) } } else if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { @@ -97,10 +97,10 @@ class TalkTemplatesFragment : Fragment() { private val requestEditTemplate = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK || result.resultCode == RESULT_BACK_FROM_TOPIC) { - binding.talkTemplatesTabLayout.getTabAt(0)?.select() viewModel.loadTalkTemplates() PatrollerExperienceEvent.logAction("update_message_toast", "pt_templates") if (result.resultCode != RESULT_BACK_FROM_TOPIC) { + binding.talkTemplatesTabLayout.getTabAt(0)?.select() FeedbackUtil.showMessage(this, R.string.talk_templates_edit_message_updated) } } else if (result.resultCode == TalkReplyActivity.RESULT_EDIT_SUCCESS || result.resultCode == TalkReplyActivity.RESULT_SAVE_TEMPLATE) { From 83fea3502ef6765b236fc54e24a34c13b4dc4e0e Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 19 Apr 2024 14:22:13 -0400 Subject: [PATCH 067/626] Update help URL for "minor" edits. (#4615) Co-authored-by: Cooltey Feng --- app/src/main/res/values/strings_no_translate.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings_no_translate.xml b/app/src/main/res/values/strings_no_translate.xml index 58e5c6c4e74..3b98f614220 100644 --- a/app/src/main/res/values/strings_no_translate.xml +++ b/app/src/main/res/values/strings_no_translate.xml @@ -63,7 +63,7 @@ delete protect https://meta.wikimedia.org/wiki/Help:Edit_summary - https://meta.wikimedia.org/wiki/Help:Minor_edit + https://www.mediawiki.org/wiki/Help:Minor_edit https://www.mediawiki.org/wiki/Help:Watching_pages From f28014d1ba108fc88a8d198b4e7c7dc9e8ebcd09 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 19 Apr 2024 16:09:44 -0400 Subject: [PATCH 068/626] Update verbiage for image recommendation rejection dialog. (#4611) * Update verbiage for image recommendation rejection dialog. * Tweak verbiage. * Another tweak. --------- Co-authored-by: Cooltey Feng --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0878596e0f8..99bbcf6449d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1135,8 +1135,8 @@ Yes No Not sure - Why not? - Your answers improve future suggestions. + Rejection reason + The rejection reason is anonymous and will improve future image suggestions. Image is not relevant Not enough information to decide Image is offensive From cc07040f819b490bbc02abbee4fcaaefdd354fa3 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 19 Apr 2024 17:27:53 -0400 Subject: [PATCH 069/626] Add strings for Google Pay workflow. (#4616) * Add strings for Google Pay workflow. * Fix format. --- app/src/main/res/values-qq/strings.xml | 15 +++++++++++++++ app/src/main/res/values/strings.xml | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 2712bb71ff9..79323a0a6e1 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1661,6 +1661,21 @@ Text for the snackbar message when user hits the \"maybe later\" option. Text for the snackbar message when user hits the \"I already donated\" option. Button label for the webview that can go back to the previous screen. + Title of popup dialog asking if the user wants to donate via Google Pay. + Description of popup dialog asking if the user wants to donate via Google Pay. + Button that leads to the Google Pay donation screen. + Button that leads to the general donation workflow in a web browser. + Title for screen where the donation amount is selected. + Label for checkbox that adds the transaction fees to the donation amount. The %s symbol is replaced with the transaction fee amount, which will include the currency symbol. + Label for checkbox that makes the donation into a recurring one. + Label for checkbox that indicates consent to receive email communications. + Error message shown when the specified donation amount is less than the minimum allowed. The %s symbol is replaced with the minimum amount, which will include the currency symbol. + Error message shown when the specified donation amount is greater than the maximum allowed. The %s symbol is replaced with the maximum amount, which will include the currency symbol. Please keep the email address as-is. + Message shown when a donation was completed successfully. + Label for a link to documentation in case of any problems while donating. + Label for a link to resources with other ways to contribute. + Label for a link to a FAQ page about donating. + Label for a link to documentation about making donations tax-deductible. Menu option that indicates the web page can be opened in a system browser. Title for the Places screen. Message shown when a required permission was denied by the user. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 99bbcf6449d..633e7d7d3c7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1736,6 +1736,21 @@ Thank you, dear donor! Your generosity helps keep Wikipedia and its sister sites thriving. Go back Open in system browser + Donate with Google Pay? + Donate with Google Pay or choose another payment method. + Donate with Google Pay + Other payment method + Select an amount + I\'ll generously add %s to cover the transaction fees so you can keep 100%% of my donation. + Make this a monthly recurring donation. + Yes, the Wikimedia Foundation can send me an occasional email. + Please select an amount (minimum %s) + We cannot accept donations greater than %s through our app. Please contact our major gifts staff at benefactors@wikimedia.org. + Thank you! Your generosity to Wikipedia means so much to us.]]> + Problems donating? + Other ways to give + Frequently asked questions + Tax deductibility information From 9c9395aac0bb90cfe3ce0be08e005dd4d7a71920 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 22 Apr 2024 14:24:59 +0200 Subject: [PATCH 070/626] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-az/strings.xml | 1 + app/src/main/res/values-b+sr+Latn/strings.xml | 4 +- app/src/main/res/values-b+tt+Cyrl/strings.xml | 4 +- app/src/main/res/values-ba/strings.xml | 4 +- app/src/main/res/values-be/strings.xml | 4 +- app/src/main/res/values-bew/strings.xml | 6 +- app/src/main/res/values-bg/strings.xml | 4 +- app/src/main/res/values-bn/strings.xml | 5 +- app/src/main/res/values-br/strings.xml | 3 +- app/src/main/res/values-ca/strings.xml | 4 +- app/src/main/res/values-cy/strings.xml | 2 +- app/src/main/res/values-da/strings.xml | 4 +- app/src/main/res/values-dag/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values-dga/strings.xml | 7 +- app/src/main/res/values-es/strings.xml | 14 +- app/src/main/res/values-fa/strings.xml | 4 +- app/src/main/res/values-fi/strings.xml | 4 +- app/src/main/res/values-fr/strings.xml | 4 +- app/src/main/res/values-gn/strings.xml | 2 +- app/src/main/res/values-ha/strings.xml | 4 +- app/src/main/res/values-hi/strings.xml | 4 +- app/src/main/res/values-hu/strings.xml | 4 +- app/src/main/res/values-ia/strings.xml | 51 +- app/src/main/res/values-in/strings.xml | 4 +- app/src/main/res/values-is/strings.xml | 4 +- app/src/main/res/values-it/strings.xml | 36 +- app/src/main/res/values-iw/strings.xml | 15 +- app/src/main/res/values-ja/strings.xml | 4 +- app/src/main/res/values-ko/strings.xml | 20 +- app/src/main/res/values-krc/strings.xml | 667 +++++++++++++++++- app/src/main/res/values-kus/strings.xml | 4 +- app/src/main/res/values-ky/strings.xml | 2 + app/src/main/res/values-lb/strings.xml | 19 +- app/src/main/res/values-lt/strings.xml | 4 +- app/src/main/res/values-mhr/strings.xml | 2 +- app/src/main/res/values-mk/strings.xml | 19 +- app/src/main/res/values-ms/strings.xml | 2 +- app/src/main/res/values-nb/strings.xml | 4 +- app/src/main/res/values-ne/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 4 +- app/src/main/res/values-nqo/strings.xml | 4 +- app/src/main/res/values-pa/strings.xml | 4 +- app/src/main/res/values-pl/strings.xml | 4 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 4 +- app/src/main/res/values-qq/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 21 +- app/src/main/res/values-sd/strings.xml | 4 +- app/src/main/res/values-skr/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 4 +- app/src/main/res/values-sr/strings.xml | 17 +- app/src/main/res/values-sv/strings.xml | 4 +- app/src/main/res/values-te/strings.xml | 2 +- app/src/main/res/values-tly/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 4 +- app/src/main/res/values-uk/strings.xml | 4 +- app/src/main/res/values-uz/strings.xml | 4 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-xmf/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 29 +- app/src/main/res/values-zh/strings.xml | 4 +- 63 files changed, 970 insertions(+), 119 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index cac90accb54..5755e1ae95a 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1082,7 +1082,7 @@ نعم لا لست متأكدًا - لم لا؟ + لم لا؟ الصور مأخوذة من ويكيميديا ​​كومنز، وهي مجموعة من الصور المرخصة بحرية والتي تستخدمها ويكيبيديا. التالي أضيفت صورة diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index bd16a8dc7c3..4594519e0cc 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -3,6 +3,7 @@ * AZISS * Masalli qasimli * NMW03 +* Nemoralis * Neriman2003 * Serkanland * Toghrul Rahimli diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 96cb3576e6f..5dc7076c0a9 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -1026,8 +1026,8 @@ Da Ne Nisam siguran - Zašto ne? - Vaši odgovori unapređuju buduće predloge. + Zašto ne? + Vaši odgovori unapređuju buduće predloge. Slika nije relevantna Nedovoljno informacija za odluku Slika je uvredljiva diff --git a/app/src/main/res/values-b+tt+Cyrl/strings.xml b/app/src/main/res/values-b+tt+Cyrl/strings.xml index 310bdd7231d..2c2d4f70d8a 100644 --- a/app/src/main/res/values-b+tt+Cyrl/strings.xml +++ b/app/src/main/res/values-b+tt+Cyrl/strings.xml @@ -1052,8 +1052,8 @@ Әйе Юк Җавап бирергә кыенсынам - Ник булмасын? - Сезнең җавапларыгыз булачак киңәшләрне яхшырта. + Ник булмасын? + Сезнең җавапларыгыз булачак киңәшләрне яхшырта. Сурәтнең катнашы юк Карар кабул итү өчен җитәрлек мәгълүмат юк Сурәт мыскыллы diff --git a/app/src/main/res/values-ba/strings.xml b/app/src/main/res/values-ba/strings.xml index f761010e208..a43e54fe69b 100644 --- a/app/src/main/res/values-ba/strings.xml +++ b/app/src/main/res/values-ba/strings.xml @@ -1057,8 +1057,8 @@ Эйе Юҡ Яуап бирергә ҡыйынһынам - Ни өсөн юҡ? - Һеҙҙең яуаптарығыҙ кәңәштәрҙең сифатын яҡшыртасаҡ. + Ни өсөн юҡ? + Һеҙҙең яуаптарығыҙ кәңәштәрҙең сифатын яҡшыртасаҡ. Рәсем көнүҙәк түгел Ҡарар сығарыу өсөн мәғлүмәт етешмәй Мыҫҡыллы һүрәт diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index fb75649e60a..095d84f36d3 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1141,8 +1141,8 @@ Так Не Не ўпэўнены - Чаму не? - Вашы адказы паляпшаюць будучыя прапановы. + Чаму не? + Вашы адказы паляпшаюць будучыя прапановы. Відарыс недарэчны Недастаткова інфармацыі, каб прыняць рашэнне Відарыс абразлівы diff --git a/app/src/main/res/values-bew/strings.xml b/app/src/main/res/values-bew/strings.xml index d6c45b04d6c..6787a76c8b5 100644 --- a/app/src/main/res/values-bew/strings.xml +++ b/app/src/main/res/values-bew/strings.xml @@ -187,7 +187,7 @@ Terusin sonder surlès Tambahin aderès surlès Keja rèkening - Nama pemaké \"%s\" kaga\' derak. Padol dah, pilih nama nyang bèda. + Nama pemaké \"%s\" kaga\' derak. Padol dah, pilih nama nyang béda. Maap, lu punya aderès IP sekarang ni lagi digibang deri pengejaan rèkening baru. https://en.wikipedia.org/wiki/Help:I_have_been_blocked Tètèk bengèk @@ -1046,8 +1046,8 @@ Ya Kaga\' Kaga\' yakin - Ngapa kaga\'? - Lu punya jawaban bakalan ningkatin saran entarannya. + Ngapa kaga\'? + Lu punya jawaban bakalan ningkatin saran entarannya. Gambar kaga\' nyambung Kaga\' cukup pengabaran bakal nentuin Gambarnya nyinggung diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index daefbd8e002..a7e51795c15 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -955,8 +955,8 @@ Да Не Не съм сигурен/а - Защо не? - Вашите отговори подобряват бъдещите предложения. + Защо не? + Вашите отговори подобряват бъдещите предложения. Изображението не е уместно Няма достатъчно информация за вземане на решение Изображението е обидно diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 4fa222a7544..465440c50e0 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -907,8 +907,8 @@ হ্যাঁ না নিশ্চিত না - \"না\" কেন? - আপনার উত্তরসমূহ ভবিষ্যত পরামর্শগুলোকে উন্নত করবে। + \"না\" কেন? + আপনার উত্তরসমূহ ভবিষ্যত পরামর্শগুলোকে উন্নত করবে। চিত্রটি প্রাসঙ্গিক নয় সিদ্ধান্ত নেয়ার মত যথেষ্ট তথ্য নেই চিত্রটি আপত্তিকর @@ -1178,6 +1178,7 @@ বন্ধ উইকি দেখুন + আলাপ আপনি এই বৈশিষ্ট্যের সঙ্গে সন্তুষ্ট? সন্তুষ্ট নিরপেক্ষ diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 69c9a59e1a7..3e675382fbb 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -993,7 +993,7 @@ Ya Ket N\'on ket sur - Perak pas ? + Perak pas ? Tagus eo ar skeudenn Skeudenn a galite izel All @@ -1302,6 +1302,7 @@ Gouzout hiroc\'h Trugarekaat Evezhiañ + Kaozeadenn Roit hoc\'h ali Kas Sav-boent neptu diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 8ea9882550e..ef0993c8d55 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1077,8 +1077,8 @@ No No n\'estic segur - Per què no? - Les vostres respostes milloren suggeriments futurs. + Per què no? + Les vostres respostes milloren suggeriments futurs. La imatge no és rellevant No hi ha prou informació per a decidir La imatge és ofensiva diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index eba089486a1..b21e4affc62 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -364,7 +364,7 @@ Ynglŷn â Wicidata Ie Na - Pam? + Pam? Cyflwyno Ychwanegu delwedd Pennawd y ddelwedd diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e4997bd6f73..15c9877183c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1099,8 +1099,8 @@ Ja Nej Ikke sikker - Hvorfor ikke? - Dine svar forbedrer fremtidige forslag. + Hvorfor ikke? + Dine svar forbedrer fremtidige forslag. Billedet er ikke relevant Ikke nok information til at beslutte Billedet er stødende diff --git a/app/src/main/res/values-dag/strings.xml b/app/src/main/res/values-dag/strings.xml index 827da1c94af..6647d08c8a3 100644 --- a/app/src/main/res/values-dag/strings.xml +++ b/app/src/main/res/values-dag/strings.xml @@ -1046,8 +1046,8 @@ iin Aayi m-bi dihitabili - Bɔ n-lee chɛ ka anfɔɔni maa bɛ lu n zahim lahibali ŋɔ? - A labisiɣu maa ni sɔŋ mali tooni lahabali sɔŋda n-niŋ. + Bɔ n-lee chɛ ka anfɔɔni maa bɛ lu n zahim lahibali ŋɔ? + A labisiɣu maa ni sɔŋ mali tooni lahabali sɔŋda n-niŋ. Anfɔɔni bɛ tuhi Lahabali kani din yan gbaai Anfooni nyɛla taali diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8e514f43b14..3a69fb734d7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1109,8 +1109,8 @@ Ja Nein Nicht sicher - Warum nicht? - Deine Antworten können zukünftige Vorschläge verbessern. + Warum nicht? + Deine Antworten können zukünftige Vorschläge verbessern. Bild ist nicht zutreffend Nicht genügend Informationen für eine Entscheidung Bild ist anstößig diff --git a/app/src/main/res/values-dga/strings.xml b/app/src/main/res/values-dga/strings.xml index af2c8f46561..ca4b685af42 100644 --- a/app/src/main/res/values-dga/strings.xml +++ b/app/src/main/res/values-dga/strings.xml @@ -1027,8 +1027,8 @@ Ɔɔ Aayi Ba sage di baare - Boŋ zuiŋ? - Fo nɔ-iri baa la nandaare teɛrɛ. + Boŋ zuiŋ? + Fo nɔ-iri baa la nandaare teɛrɛ. Enfuoni ba taa tɔna Duoro ba seŋ bone na teɛre Enfuoni ŋmaara la doŋ @@ -1159,6 +1159,7 @@ Wogiroŋ px De eŋ + Aseŋ %s Soŋ Kpɛ/paahi a Wikipiideɛ poɔŋ Hi %s, fo baŋ ka neɛzaa na baŋ maale la Wikipiideɛ eŋ? @@ -1455,6 +1456,8 @@ Zɛgere wikipiideɛ yelbulo papa ne deedee duori maale eŋ paala leɛkaabo ane hakelɛ teɛbo, soŋguubo ane korɔ maale enneba eŋyuori. Bareka Bɛll + Yeli + Yeli yɛlɛ ne fo maale eŋ taaba. Biŋ tontona yelyeli peegyi tonaa naŋ pore duoro bee toŋ ne tɛmplɛte. Leɛ e/leɛ puori Soŋ te baa nandaa ŋa A nandaa ŋa sege fo laa? diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1b011215d76..8cd79af10c3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1122,8 +1122,8 @@ Tutorial No - ¿Por qué no? - Tu respuesta puede mejorar futuras sugerencias. + Motivo del rechazo + Tu respuesta puede mejorar futuras sugerencias. La imagen no es relevante No hay información suficiente para decidir La imagen es ofensiva @@ -1467,6 +1467,16 @@ Rechazar Informe de problema: función de recomendaciones de imágenes He tenido un problema con la función de recomendación de imagen:\n- [Describe el problema en concreto]\n\nEl resultado que me gustaría ver es:\n- [Describe la solución propuesta] + ¿Donar con Google Pay? + Donar con Google Pay + Otro método de pago + Hacer de esta una donación mensual periódica. + Por favor elegir una cantidad (mínimo %s) + No podemos aceptar donaciones superiores a %s a través de nuestra aplicación. Contacte a nuestro personal de donaciones importantes en benefactors@wikimedia.org. + <b>¡Gracias!</b> Su generosidad con Wikipedia significa mucho para nosotros. + ¿Problemas para donar? + Preguntas frecuentes + Información sobre desgravación de impuestos Mapa Lista Cancelar diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 302a55cb227..b365fc9de5a 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1054,8 +1054,8 @@ بله خیر مطمئن نیستم - دلیل رد کردن آن چیست؟ - پاسخ شما می + دلیل رد کردن آن چیست؟ + پاسخ شما می تصویر مرتبط نیست. اطلاعات کافی برای تصمیم گیری وجود ندارد. تصویر توهین آمیز است. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 5fbd51b896a..6d8a696684b 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1088,8 +1088,8 @@ Kyllä Ei Epävarma - Miksi ei? - Vastauksesi parantavat tulevia ehdotuksia. + Miksi ei? + Vastauksesi parantavat tulevia ehdotuksia. Kuva ei liity aiheeseen Ei riittävästi tietoa päätöksentekoon Kuva on loukkaava diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index cc84f097056..2de1c187c7e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1121,8 +1121,8 @@ Oui Non Pas sûr - Pourquoi pas ? - Vos réponses améliorent les prochaines suggestions. + Pourquoi pas ? + Vos réponses améliorent les prochaines suggestions. L’image n’est pas pertinente Pas assez d’informations pour décider L’image est offensante diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index 3cc97cfe36c..b6cfd6e2ea7 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -320,7 +320,7 @@ Upéicha Nahániri Ndaikuaái - Mba\'ére piko? + Mba\'ére piko? Ndaikuaái ko mba\'e Ambuéva Emondo diff --git a/app/src/main/res/values-ha/strings.xml b/app/src/main/res/values-ha/strings.xml index 4fb5752e5a7..e52fe35a8aa 100644 --- a/app/src/main/res/values-ha/strings.xml +++ b/app/src/main/res/values-ha/strings.xml @@ -1058,8 +1058,8 @@ E A\'a Ba tabbatacce ba ne - Me ya sa? - Amsoshinku suna inganta shawarwari na gaba. + Me ya sa? + Amsoshinku suna inganta shawarwari na gaba. Hoton ba ya dace Babu isasshen bayani don yanke shawara Hoton yana da banƙyama diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 09612410a03..bf2b4b25695 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1077,8 +1077,8 @@ अनुशिक्षण हाँ नहीं - क्यों नहीं? - आपका उत्तर आनेवाले सजेशंस में सुधार कर सकता है| + क्यों नहीं? + आपका उत्तर आनेवाले सजेशंस में सुधार कर सकता है| ईमेज रिलेवेंट नहीं है डिसाइड करने के लिए यह जानकारी काफी नहीं है ईमेज ऑफेंसिव है diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index ef7da7b5d1a..269b55e4e1d 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1088,8 +1088,8 @@ Igen Nem Nem tudom - Miért nem? - A válaszaid javítják a jövőbeli javaslatokat. + Miért nem? + A válaszaid javítják a jövőbeli javaslatokat. A kép nem releváns Nincs elég információ a döntéshez A kép sértő diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index ae5cab8ae97..aea93847f51 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -1082,8 +1082,8 @@ Si No Non secur - Proque non? - Tu responsas meliora futur suggestiones. + Motivo del rejection + Le motivo del rejection es anonyme e adjuta a meliorar futur suggestiones de imagines. Imagine non es relevante Non bastante information pro decider Imagine es offensive @@ -1233,6 +1233,7 @@ Altitude px Inserer + Cercar patronos Inserer p.ex. %s %s (optional) @@ -1575,6 +1576,8 @@ Vide tu un modification productive? Regratia le autor de illo pro su contribution. Observar Vole traciar le modificationes de un articulo? Adde lo a tu Observatorio. Iste se trova sub ‘Plus’. + Discussion + Communicar con altere redactores. Salveguardar messages de pagina de discussion frequentemente usate o usar un patrono. Disfacer/Revocar Elige ‘Disfacer’ pro disfacer o revocar un modification potentialmente destructive. ‘Damnos’ previde si un modification causa damnos a un wiki. @@ -1599,6 +1602,20 @@ Alerta sur le violation del derecto de autor Lassar un summario de modification Non censurar + Suggestion de melioration de articulo + Salute {{{username}}}, isto es pro informar te que io ha revertite un o plus de tu [{{{diffLink}}}|contributiones recente] perque illos non pare constructive. Si tu pensa que io ha committite un error o si tu ha questiones, tu pote lassar me un message sur [[User talk:{{{senderUserName}}}|mi pagina de discussion]]. Per favor nota que le vandalismo continue pote resultar in restrictiones. + Salute {{{username}}}, me gaude que Wikipedia ha attrahite tu attention e que tu te ha interessate a apprender como modificar lo. Le test de modification que tu ha facite ha functionate; nonobstante, per favor tene in mente que le objectivo de iste projecto es disveloppar un encyclopedia complete e digne de fide que tote le mundo pote consultar. Tu modification ha affectate le contento e dunque illo ha essite removite.\nSi tu vole apprender a modificar Wikipedia, le [[Wikipedia:Sandbox|sabliera]] es a tu disposition. Si tu commentos ha essite specific a un articulo, le loco correcte es le pagina de discussion de ille articulo. + Salute {{{username}}}, certe contributiones que tu ha apportate non satisface le criterios de neutralitate exigite per le politica de [[Wikipedia:NPOV|puncto de vista neutral]] de iste Wikipedia. Pro iste ration, alcun contento ha essite modificate o removite. Per favor modifica le paragraphos o sectiones que monstra un puncto de vista partial, reimplaciante los con un texto plus neutral e objective de accordo con lo que se expecta in un encyclopedia. + Salute {{{username}}}, certe contributiones que tu ha apportate pote esser traductiones machinal. Pro iste ration, illos ha essite modificate o marcate con un patrono. Si necun melioration se apporta al articulo, illo pote esser delite.\n\nSi, malgrado iste information, tu totevia ha questiones, senti te libere de lassar un message sur [[User talk:{{{senderUserName}}}|mi pagina de discussion]]. Non sia discoragiate per iste micre incidente. Tu contributiones es multo importante pro Wikipedia. + Salute {{{username}}}, io apprecia tu collaboration sur Wikipedia; nonobstante, io ha notate que tu es in un [[Wikipedia:Conflict_of_interest|conflicto de interesse]]. Un conflicto de interesse es le incompatibilitate inter le objectivos de neutralitate e confidibilitate de Wikipedia e le particular objectivos de certe redactores, individuos, entitates, o companias de qualcunque typo.\n\nTote contributiones in le spatio principal es subjecte al politicas del criterios de contento de iste Wikipedia ([[Wikipedia:What_Wikipedia_is_not|Lo que Wikipedia non es]]), de qualitate encyclopedic ([[Wikipedia:Verifiability|Verificabilitate]] e [[Wikipedia:No_original_research|Nulle recerca original]]), de methodo redactorial ([[Wikipedia:Neutral_point_of_view|Puncto de vista neutral]]), e de legitimitate del contento ([[Wikipedia:Copyrights|Derecto de autor]]). Es expectate que tote le redactores se conforma a iste politicas durante le creation e evalutation de contento e que illes respecta e presume le bon fide in le actiones de altere redactores pro assecurar que iste politicas es sequite.\n\nSi tu modifica sub un conflicto de interesse, tu debe applicar le politica correspondente con un cura special; alteremente, tu conto de usator pote esser considerate como essente a fines private e dunque blocate. Non hesita a contactar me sur mi pagina de discussion si tu ha questiones. + Perque tu ha apportate plure modificationes destructive, isto servira como tu ultime advertimento. Si tu vandalisa Wikipedia un altere vice, tu essera bannite de modificar. + Tu modification recente pare includer material protegite per le derecto de autor sin permission. Per favor assecura te que omne contento se conforme con le politicas de [[Wikipedia:Copyrights|derecto de autor]] de iste Wikipedia pro evitar su remotion. + Salute {{{username}}}, il pare que tu ha removite contento de Wikipedia sin fornir un summario de modification. Per favor, lassa un summario de modification quando tu adde o remove contento a Wikipedia. + Salute {{{username}}}, il pare que tu ha removite contento sin discuter lo sur le pagina de discussion del articulo. Per favor, nota que Wikipedia non es censurate, e contento non debe esser removite perque illo es controversial. Si tu crede que le information es inexacte, per favor, arriva a un consenso sur le pagina de discussion del articulo. + Leger plus sur le messages de substitution + Usa un message de exemplo hic infra pro personalisar, inviar e salveguardar in tu messages. + Salute {{{username}}}. Tu articulo es un bon initio! Pro facer lo ancora melior, considera adder plus referentias a fontes digne de fide. Isto adjuta a verificar le information e meliora le qualitate del articulo. Consulta le directivas de iste Wikipedia sur [[Wikipedia:Reliable_sources|fontes digne de fide]] pro plus detalios. + Modificar Acceptar Rejectar Problemas con le pagina @@ -1611,4 +1628,34 @@ Gratias, car donator! Tu generositate adjuta Wikipedia e su sitos fratres a prosperar. Retornar Aperir in le navigator del systema + Donar con Google Pay? + Dona con Google Pay o elige un altere methodo de pagamento. + Donar con Google Pay + Altere methodo de pagamento + Selige un amonta + Io vole generosemente adder %s pro coperir le costo del transaction de maniera que vos pote retener 100%% de mi donation. + Facer isto un donation mensual recurrente. + Si, le Fundation Wikimedia pote inviar me un message de e-mail occasional. + Per favor selige un amonta (minimo %s) + Nos non pote acceptar donationes in excesso de %s per nostre application. Per favor contacta nostre personal de donos major a benefactors@wikimedia.org. + <b>Gratias!</b> Tu generositate a Wikipedia significa tanto pro nos. + Problemas de donar? + Altere modos de donation + Folio a questiones + Information sur le deductibilitate fiscal + Locos + Le permission de localisation es necessari pro vider tu position sur le carta. Per favor tenta lo de novo. + Cercar locos + Filtrar per lingua + Carta + Lista + Discoperi articulos de Wikipedia circa te con Locos + Tocca ‘Vider sur carta’ pro explorar le loco de iste articulo + Multo satisfacite + Multo insatisfacite + Adjuta a meliorar ‘Locos’ + Como pote ‘Locos’ esser meliorate? + Cancellar + Que vole tu que nos cambia o meliora? + Iste area es vacue. Face zoom retro sur <a href=\"#\">le carta</a>. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 2d77b164f92..11696bfafcc 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -1051,8 +1051,8 @@ Ya Tidak Tidak yakin - Kenapa tidak? - Jawaban Anda akan meningkatkan saran di masa mendatang. + Kenapa tidak? + Jawaban Anda akan meningkatkan saran di masa mendatang. Gambar tidak relevan Tidak cukup informasi untuk memutuskan Gambarnya menyinggung diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index d26dd76f02a..8ce92369a89 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -1052,8 +1052,8 @@ Nei Ekki viss - Af hverju ekki? - Svör þínar bæta tillögur í framtíðinni. + Af hverju ekki? + Svör þínar bæta tillögur í framtíðinni. Mynd er ekki viðeigandi Ekki nægar upplýsingar til að ákveða Myndin er ögrandi diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 00dacea6424..99061b3958f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -6,6 +6,7 @@ * Beta16 * Black Sky83 * Bsitzmann +* Champ0999 * Ciampix * Dbrant * Elitre @@ -435,6 +436,10 @@ %d selezionati Si è verificato un errore Nascondi + Leggi + Salva + Salvato + Condividi Questa pagina non esiste Wikipedia non ha una <a href=\"%1$s\">pagina utente</a> con questo esatto nome. In generale, questa pagina dovrebbe essere creata e modificata da <b>%2$s</b>. Se sei in dubbio, per favore verifica se \"%3$s\" esiste. Non è possibile connettersi ad internet @@ -457,6 +462,8 @@ Puoi contattare <a href=\"%2$s\">%1$s</a> o un altro <a href=\"https://it.wikipedia.org/wiki/Wikipedia:Amministratori\">amministratore</a> per discutere del blocco. Personalizza la barra degli strumenti Puoi contattare un\'<a href=\"https://it.wikipedia.org/wiki/Wikipedia:Amministratori\">amministratore</a> per discutere del blocco. + Non hai effettuato l\'accesso + Termina la sessione Errore dell\'applicazione Spiacenti, si è verificato un errore nell\'applicazione Wikipedia ed è stata terminata.\n\nVuoi riavviarla o uscire? Avvia di nuovo @@ -1082,15 +1089,21 @@ Immagini della voce Aggiungi immagini suggerite alle voci di Wikipedia per migliorarne la comprensione. + Vuoi aggiungere questa immagine alla voce? Tutorial No Non sono sicuro - Perché no? + Motivo del rifiuto + L\'immagine non è rilevante + L\'immagine è offensiva + L\'immagine è di bassa qualità Non conosco questo argomento Altro Invia Aggiungi le immagini mancanti alle voci in Modifiche suggerite + I suggerimenti sono generati automaticamente e dovrai scegliere tu se accettarli o rifiutarli. + Decidi se l\'immagine aiuta i lettori a comprendere meglio questo argomento Successivo Problemi con le modifiche suggerite Immagine aggiunta @@ -1241,6 +1254,7 @@ Nuovo argomento Argomento pubblicato. Salva come nuovo messaggio + Titolo del messaggio Pubblica Annulla Non salvare @@ -1430,6 +1444,8 @@ Errore durante la riproduzione del contenuto multimediale. Contributi Filtra i contributi + Visualizza sulla mappa + Le coordinate geografiche non sono disponibili per questa pagina Importa elenco di lettura condiviso Come vorresti nominare l\'elenco che è stato condiviso con te? *nuovo* @@ -1443,6 +1459,7 @@ Puoi aiutarci a migliorare \"Condividi elenchi di lettura\"? \"Condividi elenchi di lettura\" è una funzione di prova e abbiamo bisogno del tuo commento per migliorarla o rimuoverla. Nuovo messaggio + Oggetto Scrivi un messaggio Salva Salva modifiche @@ -1474,6 +1491,7 @@ Vedi la pagina utente Vedi la pagina di discussione Informazioni utente + Visualizza i contributi degli utenti Ringrazia Informazioni sull\'utente Chiudi @@ -1481,6 +1499,11 @@ Reimposta Wiki Tutto + Non registrato + Contributori che non hanno effettuato l\'accesso. + Registrato + Contributori che hanno effettuato l\'accesso. + Nuovi utenti Contributi automatici Bot Modifiche minori @@ -1520,6 +1543,17 @@ Grazie a te che hai donato! La tua generosità aiuta a far crescere Wikipedia e i suoi siti correlati. Torna indietro Apri nel browser di sistema + Donare con Google Pay? + Dona con Google Pay o scegli un altro metodo di pagamento. + Dona con Google Pay + Altro metodo di pagamento + Rendila una donazione mensile ricorrente. + Si prega di selezionare un importo (minimo %s) + <b>Grazie!</b> La tua generosità verso Wikipedia significa molto per noi. + Problemi con la donazione? + Domande frequenti + Informazioni di deducibilità fiscale + Mappa Scopri le voci di Wikipedia intorno a te con Luoghi Tocca \"Visualizza sulla mappa\" per esplorare la posizione di questa voce Aiuta a migliorare \'Luoghi\' diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 19f166cb8e6..a9113f2d097 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -1184,8 +1184,8 @@ כן לא אין לי תשובה - למה לא? - התשובות שלך משפרות הצעות עתידיות. + סיבת הדחייה + סיבת הדחייה אלמונית והיא תסייע בשיפור הצעות תמונות עתידיות. התמונה אינה רלוונטית אין מספיק מידע בשביל להחליט התמונה פוגענית @@ -1745,6 +1745,17 @@ תודה, תורם יקר! הנדיבות שלך עוזרת להבטיח את צמיחתם של ויקיפדיה ושל האתרים הקשורים אליה. חזרה פתיחה בדפדפן המערכת + לתרום עם Google Pay? + לתרום עם Google Pay + שיטת תשלום אחרת + בחירת סכום + נא לבחור סכום (לפחות %s) + אנחנו לא יכולים לקבל תרומות מעבר ל־%s דרך היישום שלנו. נא ליצור קשר עם צוות המתנות הגדולות שלנו דרך benefactors@wikimedia.org. + <b>תודה רבה!</b> רוחב הלב שלך למען ויקיפדיה הוא מאוד משמעותי עבורנו. + בעיות בתרומה? + דרכים אחרות לתת + שאלות ותשובות + מידע על פטור ממס מקומות נדרשת הרשאת מיקום כדי לראות את מיקומך על המפה. נא לנסות שוב. חיפוש מקומות diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 436e5d387bc..8b8e856b649 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1103,8 +1103,8 @@ はい いいえ わからない - なぜだめですか? - あなたの回答により、将来の提案が改善されます。 + なぜだめですか? + あなたの回答により、将来の提案が改善されます。 関連する画像ではありません 判断するのに十分な情報がありません 不快な画像です diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 87791d85c31..81824b16cce 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -188,6 +188,9 @@ 위키백과에서 로그아웃되었습니다. 다시 로그인하시겠습니까? 로그인 취소 + 계정 버리기 + 계정 버리기 경고 + 버리기는 <b>최후의 수단</b>이며 <b>편집을 영원히 중단하고 과거의 연관성을 최대한 숨기고 싶은 경우에만 사용해야</b> 합니다.<br/><br/>위키백과에서 계정 삭제는 계정 버리기라는 프로세스를 통해 다른 사람들이 귀하의 기여를 인식할 수 없도록 계정 이름을 변경하여 수행됩니다.<b>버리기는 완전한 익명성을 보장하거나 프로젝트에 수행한 기여를 제거하지는 않습니다</b>. 최근에 본 글이 없습니다 당신이 읽고 계신 문서를 여기에서 추적하세요. 오프라인 상태에서는 역사에서 일부 문서를 보지 못할 수 있습니다. @@ -259,15 +262,15 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.ko https://creativecommons.org/publicdomain/zero/1.0/deed.ko - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https\n://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags 사용된 라이브러리 기여자 <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">팀 페이지</a> 번역자 이 앱은 <a href=\"https://translatewiki.net\">translatewiki.net</a>의 자원 번역자가 번역했습니다. 라이선스 - 소스 코드는 <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">아파치 2.0 라이선스</a> 하에 <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">게릿</a>과 <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">깃허브</a>에서 확인할 수 있습니다. 별도로 명시하지 않은 내용은 <a href=\"https://creativecommons.org/licenses/by-sa/4.0/deed.ko\">크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스</a> 하에 이용할 수 있습니다. + 소스 코드는 <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">아파치 2.0 라이선스</a> 하에 <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">깃허브</a>에서 확인할 수 있습니다. 별도로 명시하지 않은 내용은 <a href=\"https://creativecommons.org/licenses/by-sa/4.0/deed.ko\">크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스</a> 하에 이용할 수 있습니다. <a href=\"https://wikimediafoundation.org/\">위키미디어 재단</a>의 제품 정보 문서가 수정되어 있습니다. 바뀐 내용을 저장하지 않고 빠져나가겠습니까? @@ -445,6 +448,11 @@ 알겠습니다 임시 계정을 사용하고 있습니다 변경사항을 버리고 로그인 + <b>로그인 상태가 아닙니다.</b> 편집을 하면 개인정보 보호를 위해 임시 계정이 생성됩니다. <a href=\"%1$s\">더 알아보기</a> + <b>임시 계정을 사용하고 있습니다.</b> 귀하의 편집은 %1$s에 귀속됩니다. <a href=\"%2$s\">더 알아보기</a>. + <b>현재 임시 계정을 사용하고 있습니다.</b> %1$s 임시 계정에서 이루어진 편집은 로그인할 때 영구 계정으로 이전되지 않습니다. 로그인하거나 계정을 만들면 사용자 이름에 대한 신뢰를 얻는 등 여러 장점이 있습니다. + 세션 끝내기 + 임시 계정에서 로그아웃합니다. 계속하시겠습니까? 애플리케이션 오류 죄송합니다, 위키백과 앱이 오류가 발생하여 종료되었습니다.\n\n다시 시작하거나 나가시겠습니까? 다시 시작 @@ -1056,8 +1064,8 @@ 아니오 확실치 않음 - 그렇게 하지 않는 이유는 무엇입니까? - 귀하의 답변은 향후 제안을 개선합니다. + 그렇게 하지 않는 이유는 무엇입니까? + 귀하의 답변은 향후 제안을 개선합니다. 이미지가 적절하지 않습니다 결정할 정보가 충분하지 않습니다 이미지가 공격적입니다 @@ -1456,6 +1464,7 @@ 메시지가 삭제되었음 제목은 비워둘 수 없습니다. + 내 메시지 예시 메시지 편집 내용 검색 또는 필터링 태그: %s @@ -1520,6 +1529,7 @@ 감사 표현 주시 문서의 편집 내용을 추적하고 싶으신가요? 주시문서 목록에 추가하세요. \'더보기\'에서 확인하세요. + 토론 편집 취소/일괄 되돌리기 문서 훼손 가능성이 있는 편집을 실행 취소하거나 되돌리려면 \'실행 취소\'를 선택하세요. 손해는 이 편집으로 위키가 훼손될 것인지 예측합니다. diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml index c235c2230f2..ac1440f2b65 100644 --- a/app/src/main/res/values-krc/strings.xml +++ b/app/src/main/res/values-krc/strings.xml @@ -199,7 +199,7 @@ Баш Хыйсаб Wikipedia App FAQ - Кери билдириу + Къошакъ ючюн кери билдириу джибер Тергеу джазыу къуралды! Синхронизация Трафик хайырланыу @@ -501,7 +501,7 @@ %1$d - %2$d статья оффлайн барды, %3$.2f MB Айыр - Айырыу шарты... + Айырыу шарт... Атха кёре айыр Атха кёре айыр (терсине) Къошулгъан датасына кёре айыр (джангысындан) @@ -603,7 +603,7 @@ Башха тизме болдуралмазсыз. Хыйсаб башына 100 окъуу тизме мардагъа джетгенсиз. Джангы тизме болдур Тизмени импорт эт - Айырыу шарты + Айырыу шарт Синхронизацияны джангырт Кир / регистрация эт @@ -702,7 +702,7 @@ Бютеу хапарландырыуланы окъугъансыз! Архив этилген хапарландырыуланы кёргюз Хапарландырыу джарашдырыула - Окъулмагъанча белгиле + Окъулмагъанды деб белгиле Окъулгъанча белгиле Джууабла %s хайырланыучугъа джууаб джибериле турады… @@ -753,7 +753,7 @@ Фильтр хапарландырыула Фильтр хапарландырыула Программаны тиллерин джангырт - Аслам хапарландырыу кёрюр ючюн %s кетериб кёрюгюз + Аслам хапарландырыу кёрюр ючюн %s къоратыб кёрюгюз %d фильтр %d фильтр @@ -969,10 +969,499 @@ Басмаланды Суратланы теглеу, аланы табылгъанларын тынч этеди. Суратха теглени къошуб, Википедияны статьяларындагъы суратла ючюн хайырланнган эркин лицензиялы гёзенни, Викигёзенде излениуюн тынч къолайланыууна болушурукъсуз. + Къуру сайлагъан теглеригиз суратлагъа къошуллукъдула. + Табаргъа тынч болурча, суратха энчи тегле къошугъуз. + Келишген теглени къошугъуз неда сайлагъыз + Басмаланнган тегле + Теглени изле + Бу сурат ючюн чырт бир тег сайламадыгыз + Къуру сайлагъан теглеригиз суратлагъа къошулур. Сайланмагъан тегле уналмады деб белгиленникдиле. Бютеу теглени уналмады деб белгилерге излегенигизден ишексизмисиз? + Тег къош + Басмаланмагъан тегле сакъланныкъ тюлдюле + Бу суратны джууукълашдырыр ючюн чимдегиз. + %s, тюзетиулеригиз ючюн сау болугъуз. Энишгерек Википедиягъа къошум этер ючюн башха амалланы табаргъа боллукъсуз. + <b>Салам %s</b>, Энишгерек Википедияны маджаллашдырырча бир къауум дженгил эмда тынч джолну табаргъа боллукъсуз. Башлагъанлай, этгенигизни башхалыгъын кёрлюксюз. Насыблы тюзетиуле теджейбиз! + Окъуучуланы, ангыламыны эмда контекстин ангалыргъа болушурча, суратны танытыгъыз. + Окъуучуланы къысха къарау бла теманы ангыларча болургъа болушур ючюн статьяны магъанасын беригиз. + Бусагъатха дери бютеулей къошум саныгъыз. + Бир-бири ызындан къаллай бир кюн къошум этдигиз. Талай заман къошум этген эсегиз, ахыр къошумугъузну датасы кёрюннюкдю. + Ахыр 30 кюн ичинде къошум этген элементлени бютеулей бет кёргюзюулери. + Къошумларыгъызны бири ненча кере кери алындыгъына байламлы болуб (башха тюзетиучю кери алды). Кери алыннган тюзетиуле: %d + Теджелген тюзетиуле %1$s дери тохтатылды. Ай медет %2$s, эм ахыр къошумларыгъыздан бир къаууму кери алынды. + Теджелген тюзетиуле джукълатылдыла. Ай медет %s, джууукъ заманда этген къошумларыгъызны кёбюсю кери алынды. + IP-адресигиз (неда IP-адреслеригизни диапазону) бусагъатда Википедияны тюзетиуге блок этилгеннге ушайды. + Кечериксиз %s, бу энчиликни хайырланыр ючюн, бир статьяда эм азы бла юч тюзетиу этерге керексиз. + Тюзетиуде насихатла бла акъыл бериуле + Теджелген тюзетиулеге болушлукъ бет + Тюзетиу серия + Къараула + Тюзетиуню агъачы + Сейирлик + Аламат + Бек иги + Иги + Тамам + Джетерли + Иги тюл + Аман + Теджелген тюзетиуле + + 1 Къошум + Къошум + + + %d кюн + %d кюн + + Теджелген тюзетиулен недиле? + Теджелген тюзетиуле, Википедияда гитче, алай а джашау магъаналы къошумла ючюн амал бередиле. + Аслам бил + Пауза этилди + Джукъланыбды + IP блок этилди + Ахыр тюзетиу + Бир заманда да + Джангы + Басмалаб <a href=\"%1$s\">Хайырлану Шартла</a>ны эмда бу къошумугъузну кери къайтмаз шекелде <a href=\"%2$s\">CC0 лицензия</a> бла эркин ташларгъа къабыл этесиз. + Теджелген тюзетиуле + Википедияны тюзетгенигиз ючюн сау болугъуз! Тохтагъан джеригизден ары бардырыргъа нек излемейсиз? + Википедияны маджаллашдырыргъа андан ары да бардыр ючюн минутчугъугъуз бармыды? Бу тюзетиу теджеулеге кёз джетдиригиз. + %s хайырланыучуну къошумлары + Тил + Дата / Заман + Къошум тип + Сурат + Статья + %s кёргюзюу + + Ахыр 30 кюнде бир кере кёрюлдю. + Ахыр 30 кюн ичинде %s кере кёрюлдю. + + Ахыр 30 кюн ичинде %s кере кёрюлдю. + + Сиз %d тег къошдугъуз + Сиз added %d тег къошдугъуз + + %1$d %2$s + Тюнене + Хар ким да Википедияны тюзетирге болгъанын билемисиз? + Теджелген тюзетиуле, Андроидде Википедия тюзетиуюню джангы джолуду. Википедиягъа гитче, алай а джашау магъаналы къошумла этерге болушур. Нюзюрюбюз, тюзетиуню хар ким ючюн да тынч эмда джетиширча халгъа келтириудю! Башлар ючюн, сессия ачыгъыз неда Википедиягъа къошулугъуз. + Википедиягъа кир / къошул + Сурат тег + Тюзетиуюгюз бусагъатда Википедияда басмадады + Аслам теджелген тюзетиу + Теджелген ачыкълаула + Нени билдирирге излей эдигиз? + Джетерча бир информация джокъду + Теджелген ачыкълауланы кёралмайма + Орунсуз теджеу + Джумуш ангышынмады + Билдирме + Билдирме джиберилди + + %1$s тег + %1$s тег + + + %1$s символ + %1$s символ + + + %d символ къоратдыгъыз + %d символ къоратдыгъыз + + + %d символ къошдугъуз + %d символ къошдугъуз + + Статья суратла + Ангылашаллыгъын ёздюрюр ючюн, Википедияны статьяларына теджелген суратланы къошугъуз. + Бу суратны статьягъа къошармы эдигиз? + Юретиучю + Хоу + Огъай + Ишексиз тюлме + Нек болмасын? + Джууабларыгъыз боллукъ тедежулени игилешдирир. + Сурат релевант тюлдю + Оноу этер ючюн, джетерли информация джокъду + Сурат рахатсыз этерчады + Сурат аман агъачлыды + Бу теманы билмейме + Башха + Джибер + Теджелген Тюзетиуледе, статьялагъа джетмеген суратланы къошугъуз + Суратла, адамланы ангылауларына болушлукъчу болур, алай а кёб статьяда джокъду. + Теджелген суратны Википедиягъа орунларгъа керек болуб болмагъанын сиз оноу этериксиз. + Теджеуле автомат халда этилгендиле эмда быланы къабыл этиуню оноуун кесигизни оюмугъузгъа къоюгъуз. + Суратла, Википедия хайырланнган эркин лицензиялы сурат коллекция Викигёзенден алыныр. + Темасын ангылар ючюн бу статьяны тинтигиз + Суратны эмда байламлы информацияны тинтигиз + Суратны, окъуучуланы бу теманы андан да иги ангыларларына болушлукъ болуб болмагъанына оноу этигиз. + Эндиги + Темасын ангылар ючюн, тилейбиз, статьягъа джангыдан кёз джетдиригиз эмда суратны тинтигиз + Кечериксиз, бусагъатда башха теджелген сурат джокъду. Тилейбиз <a href=\"#\">теджелген башха тюзетиулени</a> тинтигиз неда кечирек кери къайтыгъыз. + Функция бла проблема + Теджелген Тюзетиуле бла проблема + Сурат къошулду + Тюб джазыу къошулду + Сурат эм тюб джазыу къошулдула + Кёргюз + Файл бет + Сурат тюб джазыу къош + Сурат теглени къош + %s кесегин тюзет + Википедияны тюзетгенигиз ючюн сау болугъуз! + Къолугъуздан келгенни эм игисин этгенигизни билебиз, алай тинтиучюледен бирини ишеги барды. Тюзетиуюгюзню кери алыныууну болургъа боллукъ чурумлары: + къошумугъуз <a href=\"%1$s\">джорукъланы</a> бирине келишмей эди. + къошумугъуз эксперимент неда вандализм кибик кёрюне эди. + Интересигиз бар эсе <a href=\"%1$s\">тюзетиу тарихге</a> къараргъа боллукъсуз. + Ызына ал + Оффлайн кёз джетдирир ючюн девайсыгъызны асыраучусуна джаздырыргъа эркинлик болургъа керекди. + Оффлайн Библиотеканы хайырланы ючюн девайсыгъыздагъы асыраучугъа эркинлик керекди. + %.2f ГБ + %.2f МБ + Атлат + Бардыр + Башла + Кечирек болургъа болур + Тинтиуню джангы джоллары + Википедия къоян тешикге джангыртылгъан Тасма бла кир. <br/> Тасмагъызны кёлюгюз ушатханча <b>джарашдырыгъыз</b> – <b>Тарихде бюгюн</b> тарихде болууланы юсюнден юрен неда <b>Рандом</b>гъа ышан. + Синхронизациясы бла окъуу тизмеле + Оффлайн болсагъыз да, артдан окъургъа излеген статьяланы окъуяллыкъсыз. <br/>Окъуу тизмелеригизни синхронизация этер ючюн Википедия хыйсабыгъызгъа киригиз. <a href=\"#login\">Википедиягъа къошулугъуз</a> + Билгиле эмда Ташалыкъ + Тёлеусюз билим къозгъалыугъа къошулур ючюн, энчи информациягъызны берирге керек болмагъанына ийнанабыз. Бу къошакъ ючюн джыйылгъан хайырланыу билиле аноним болур. <a href=\"#privacy\">Ташалыкъ политикабызны</a> эм <a href=\"#termsOfUse\">хайырланыу шартларыбызны</a> юснден аслам билигиз. + Хайырланыу билгини джибер + Англашынды + Девайсыгъызда тюбюндегилени табдыкъ: + Тил къош неда тюзет + Эркин Энциклопедия\n... 300-ден аслам тил + Рандомлу + Окъууну андан ары бардыр + Изле + Бу кюнде + Бу кюнде энтда + %2$s–%3$d джылладан %1$s болуу + Бу джыл + Эндиги ай + Аллындагъы ай + Дата сайлаучуну ач + + Былтыр + %d джыл алгъа + + Заманда джолоучу болдугъуз 🚀 + Келликге кери къайт + Тил къош + Теджелген + Бютёу тилле + Википедияны тиллери + Тиллеригиз + Тил къош + Тилни къорат + Тилни къорат + + Сайланнган тил къоратылсынмы? + Сайланнган тилле къоратылсынмы? + + Къалгъан Википедия тилле ючюн къуру Аулау тасмада эмда терк излеу фильтрледе контненти кёрлюксюз. + Бютеу тилле къоратылалмадыла + Ичиндегини окъур эмда ичиндегиде излеу этер ючюн эм азы бла бир Википедия тилни къоюгъуз. + энтда + Википедия тилле къош + Къошагъыгъызны тиллеринден къытай тил къоратылсынмы? + Къошагъыгъызны тиллеринде эртдеден келген эмда къысхартылгъан Къытай тил вариантлары барды. Къошагъыгъызны тиллерини джарашдырыуу джангыртылсынмы? + Тиллени тюзет + Огъай, сау болугъуз + Ызына ал + ОК + ОК + ОК + ОК + ОК + ОК + Ызына ал + Бютеу къошумла + Бет %1$d %2$d + Къалын + Сёдегей + Чертилген + Юсю сызылгъан + Тизгин башы + Тизгин тюбю + Уллу текст + Гитче текст + Код + Джибериу + Тюббашлыкъ %d + Бичимлендириу + Башлыкъла + Медианы сал + Ышанлы тизим + Номерленнген тизме + Шаблон + Белгилеу + Ал къараугъа джибериу + Хайырланыучуну сагъын + Медианы сал + Викигёзенде файл сайла + Медиа изле + Сурат толу хапарлауну сал + Джюкленнген сурат + Сурат тюб джазыу + Статьяда кёрюннген сурат белги + Альтернатив текст + Иги кёрмеген окъуучула ючюн ачыкълау + Къошакъ джарашдырыула + Текстни суратны тёгерегине орнатыгъыз + Суратны позициясы + Онг + Сол + Ара + Джокъду + Суратны типи + Миниатюра + Къабсыз + Къаб + Тамал + Медиа-элементни бетде къалай кёрюнюрюн белглилерге боллукъсуз. Бу, башха бетледе кёрюнгенча болурча, миниатюра форматда болургъа керекд. + Суратны ёлчеми + Тынгылау бла + Джарашдырылырча + Кенглик + Мийиклик + пикс. + Сал + Шаблонла изле + Сал + сёз ючюн %s + %s (Амалсыз тюлдю) + %s (Теджелген) + Аслам бил + Шаблонланы хайырланыучула болдурадыла эмда ала толу ачыкълаулу болмазгъа боллукъдула. + \"%s\" шаблон алкъын ачыкълаусузду. + Бу шаблонда <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">TemplateData</a> джокъду, аны параметрлери уа <a href=\"<span class=\"notranslate\" translate=\"no\">%2$s \">autogenerated</a> этилгенди . Ол себебден шаблонда эмда аны параметрлеринде ачыкълау джокъду. + Болушлукъ + Википедиягъа кир / къошул + Салам %s,хар ким да Википедияны тюзетирге болгъанын билемисе? + Хар ким да Википедияны тюзетирге болгъанын билемисиз? + Башла + Кёздеги тизме + Кёздеги тизмеге алгъаракъ къошхан статьяланы эмда бетлени <b>Кёзде тизме</b> тюбюндеги Къошакъ менюда табыгъыз. + ОК + ОК + Ызына ал + Ызына ал + Сюзюу + Сюзюу: %s + Джангы тема + Тема басмаланнганды. + Билдириб къой + Тюрлениулени сакълансынмы? + Джангы билдириуча сакъландыр + Джангы билдириу кибик тизмеге сакъландыр + Бар болгъан билдириуню джангырт + Билдириу башлыкъ + Басмала + Ызына ал + Сакъландырма + Билдириу, тюзетиучюсюню хайырланыучу сюзюу бетинде басмаланды + Билдириу, тюзетиучюсюню хайырланыучу сюзюу бетинде сакъланды эмда басмаланды + Сакъланнган билдириуле + Бу сюзюу бет бошду Ушакъ мында башланады Сюзюуню бетлери — Википедияда контентни не къадар маджал къалай этерге керек болгъанын сюзген джерди. Википедиячыланы джамагъаты бла байламлы болуб, иш бирлик джюрютюр ючюн, сюзюуге джангы теманы къошугъуз. + Джууабла + (Тема джокъду) + Тема + Джууаб джаз + Билдириу болдур + Билдириу бош болургъа болмайды. + Тема бош болургъа болмайды. + Теманы аты бош тюлдю. Башханы кёрюгюз. + Джууаб басмаланды. + Кери ал + <b>Ахыр тюзетиу %1$s датада</b> %2$s этди + Сюзюу бетлени хайырланнганыгъыз ючюн сау болугъуз. Анкетагъа къошулуб, къошакъны маджаллашдырыуубузгъа болушурмусуз? + Башла + Википедия - сюзюу бетдеги \"%s%\" темада сюзюу + Википедия - сюзюу бетдеги сюзюуле + Бу сюзюу бетди. Тилейбиз, сюзюу бетни джорукъларына сыйыныгъыз эмда джибергенлеригизни тёрт тильда джазыб, къол салыргъа унутмагъыз: викитекстни хайырланыб, джибергенигигзни ахырына ~~~~ къошугъуз.<br><br><a href=\"https://krc.wikipedia.org/wiki/Vikipedi:Сюзюу бет\">Википедия: Сюзюу бет</a> + Бирлдириулени изле + Темаланы изле + Сюзюу бетде теманы таб + Айырыу шарт + Басмаланыу датасы + Джангыртыу датасы + Теманы аты Чыгъаргъа излегенигзге таукелмисиз? Тема бла текстни ичи сакъланныкъ тюлдюле. + + Джууабны кёргюз + (%d) джууабны кёргюз + + + Джууабны джашыр + (%d) джууабны джашыр + + \"%s\" темагъа джаздырылды + \"%s\" темагъа джаздырылыудан чыгъарылды + Джаздырыл + Джаздырыл + Окъулгъанды деб белгиле + Окъулмагъанды деб белгиле + Юлюшле + Ахыр комментарий: %s + Бютеулей джууаб + Хайырланыучу белгичик + Окъулгъан + Окъулмагъан + Темалагъа джаздырылыр ючюн киригиз + Темалагъа джаздырылыуугъуз, бу темадагъы комментарийлени юсюнден хапарландырыу алыргъа амал берир. Бу темагъа джаздырылыр ючюн, тилейбиз, хыйсаб къурагъыз неда Википедия [sqcf,su]spu]f киригиз. + Сюзюу архив: %s + Сюзюуню ортагъа сал + Сюзюу бетни ортагъа сал + Тюзетиулени ортагъа сал + %s хайырланыучуну къошумлары + Къайнакъны тюзет + %s хайырланыучу бет + Сюзюу бетде теманы таб + Джибериуню алмашдырыу буферге копия эт + Текстни копия эт + Темаланы кер + Темаланы чырма + Кёзде тутуу + Кёзде тут + Эндиги тюзетиу + Аллындагъы тюзетиу + Бюсюреу + Хайырланыучу бетни кёргюз + Ачыкъдан \'Сау бол\' джибер + \'Сау бол\', редакторну Википедиядагъы ишлерине бюсюреу бериуню тынч джолуду. \'Сау бол\' кери алынмаз эмда хар ким да кёрюрчады. + Сау бол джибер + Ызына ал + \'Сау болунг %s хайырланыучугъа джиберилди 👍 + Хайырланыучу бетни кёргюз + Сюзюу бетни кёргюз + Хайырланыучу къошумланы кёргюз + Версияланы тенглешдир + Версияланы тенглешдир: %s + Джиберген: + Алгъан: + Сизгин %d + %1$d–%2$d тизгинле + Тизгин къошулду + Тизгин къоратылды + Параграф къошулгъанды + Параграф къоратылгъанды + Бу версида этилген тюрлендириуле хар кимге да хайырланыугъа ачыкъ тюлдюле. + Бу тюзетиуню кери алыргъа излегенигизге ишексизмисиз? + Кери алыу, бир неда аслам тюзетиуню эффектлерин кери алыу магъанасына келеди. + Къысха хапарлау (амалсыз тюлдю) + Кери алыу чурумну ортагъа сал + Версия кери алынды. + Тюзетиулени кери алыргъа излегенигизге ишексизмисиз? + Тюзетиуле кери алындыла. + Тенглешдир + Къуру эки версия сайларгъа боллукъду. + %1$s эмда аны сюзюу бети %2$s кёздеги тизмеге къошулду. + Тюрлендир + дайым + 1 ыйыкълыкъ + 1 кюнлюк + 3 айлыкъ + 6 айлыкъ + %s эмда аны сюзюу бети кёздеги тизмегизден къоратылды. + Кёздеги тизме заман кёзюуюн сайлагъыз + Дайым + 1 ыйыкъ + 1 ай + 3 ай + 6 ай + Кёздеги тизмегизде статья джокъду. + Кёздеги тизмеде изле + Барысы да + Сюзюу + Бетле + Башха + Ташылды + Къорууланыбды + Кетерилди + Кёздеги тизме фильтр + Вики + Барысы да + Ызлама тизмеде ишлеуле + Къаралмагъан тюрлениуле + Къаралгъан тюрлениуле + Къошумну агъачыны ал къарауу + Бир ишексиз игиди + Проблемалары болургъа болур + Проблемары баргъа ушайды + Ишексиз проблемалыла болургъа болур + Хайырланыучу иннетни аллындан сезиу + Ишексиз иги иннетлиге ушайды + Аман иннетли болургъа болур + Аман иннетлиге ушайды + Ишексиз аман иннетлиге ушайды + Хайырланыучуну регистрациясы эмда сынамы + Регистрация болмагъанла + Регистрация этгенле + Джангы келгенле + Окъуучула + Сынамлы хайырланыучула + Къошум авторлукъ + Сизни тюрлениулеригизге кёре + Башхаланы тюрлендириулери + Автомат халдагъы къошумла + Бот + Адам (бот тюлдю) + Магъаналыкъ + Гитче тюзетиуле + Гитче болмагъан тюзетиуле + Ахыр версияла + Ахыр версия + Ахыр версия тюлдю + Тюрлениуню тюрлюсю + Бетни тюзетиулери + Бет болдуруула + Категория тюрлениуле + Викибилгилени тюзетиулери + Кюнлюк ишлеуле + Джангы хайырланыучу + Ариула + Кёздеги тизмени излегиз эмда фильтр этигиз + Кёздеги тизме фильтр + Эсебле джокъдула, асламын кёрюр ючюн %s къоратыб кёрюгюз. + + %d фильтр + %d фильтр + + Тюзетиуню ал къарауу + Тюзетиуню къысха хапарлауу + Бу бетни къалай маджаллашдырдыгъыз? + Бу гитче тюрлениудю + Бу бетни кёзде тут + Тюзетиу къысха хапарлауланы юсюнден аслам бил + Категорияла + Бу бет бир категорияныкъы да тюлдю. + Статьяла + Тюбкатегорияла + Бу категорияда статьяла табылмайдыла. + Бу категорияда тюб категорияла табылмадыла. + Ат аламла + Джокъду (бу биринчи версияды) + %s къошумла + Архивленнген бетде табылмадыла. + Ат аламгъа кёре фильтр эт + Бютеу ат аламла + Ат алам фильтр + Статья + бусагъатдагъы + Медиа ойнауда халат. + Къошумла + Къошумланы фильтри + Картада кёргюз + Бу бет ючюн география координатла джокъду Ортагъа салыннган окъургъа тизмени импорту Сиз кириш ачылгъан тизмени къалай атаргъа излей эдигиз? *джангы* @@ -985,4 +1474,172 @@ Салам! Мен кесими окъургъа тизмеми сизге джаяргъа излей эдим: Окъургъа тизмени джайыу функцияны маджаллашдырыр ючюн болушлукъ эталлыкъмысыз? \"Окъургъа тизмелени джайыу\" — тест функцияды, аны маджаллашдырырча неда кетерирча, бизге сизни багъаларыгъыз керекди. + Ишлеб башлар ючюн, кесигизни энчи билдириулеригизни къурагъыз неда <a href=\"#\">билдириу юлгюле</a> къурагъыз. + Джангы билдириу + Тема + Билдириу болдур + Сакъландыр + Тюрлениулени сакъландыр + Башлыкъ къош эмда белдириуню сакъландыр. + Билдириу башлыкъ + Сакъландыр + Ызына ал + \"%s\" шаблон алайсыз да барды. + Билдириу сакъланнган эди + Билдириуню тюзет + Сакъландыр + Кетер + Билдириу джангыртылгъан эди + Билдириуню къорат + + Билдириуню тизмеден кетерирге излегенигизге ишексизмисиз? + Билдириуню тизмеден кетерирге излегенигизге ишексизмисиз? + + + Билдириу кетерилген эди + Билдириуле кетерилген эдиле + + Башлыкъ бош болургъа болмайды. + Билдириулеригиз + Билдириу юлгюле + Тюзетиулени изле неда фильтр эт + Тегле: %s + Джокъду + Хайырланыучу бетни кёргюз + Сюзюу бетни кёргюз + Хайырланыучуну информациясы + Хайырланыучу къошумланы кёргюз + Бюсюреу + Хайырланыучуну информациясы + <b>Хайысаб дата: </b> %s + <b>Тюзетиу сан: </b> %s + Джаб + Фильтрле + Ариула + Вики + Барысы да + Хайырланыучуну регистрациясы эмда сынамы + Регистрация болмагъанла + Системагъа кирмеген редакторла. + Регистрация этгенле + Кирген редакторла. + Джангы келгенле + 4 кюн ичинде 10-дан аз тюзетиую болгъан регистрация этилген редакторла. + Окъуучула + Сынамы \"Джангы келгенле\" бла \"Сынамлы хайырланыучу\" арасындагъы регистрация болгъан редакторла. + Сынамлы хайырланыучула + 30-дан аслам кюн сынамы эмда 500-ден аслам тюзетиую болгъан регистрация этген редакторла. + Ахыр версияла + Ахыр версия + Ахыр версия тюлдю + Автомат халдагъы къошумла + Бот + Адам (бот тюлдю) + Магъаналыкъ + Гитче тюзетиуле + Гитче болмагъан тюзетиуле + Къошумну агъачыны ал къарауу + Бир ишексиз игиди + Бютеу проблемасыз тюзетиулени табаргъа кескин амал. + Проблемалары болургъа болур + Халатлы эмда заран берген тюзетиулени кёбюсюн табар, алай а буну андан да гитче кесикнлик бла этер. + Проблемары баргъа ушайды + Орта кескинлик бла, проблемалы тюзетиулени орта бёлюмюн табады. + Ишексиз проблемалыла болургъа болур + Эм ачыкъ эмда эм проблемалы тюзетиулени табыуда бек кескинди. + Хайырланыучу иннетни аллындан сезиу + Ишексиз иги иннетлиге ушайды + Бютеу иги иннетли тюзетиулени табаргъа кескин амал. + Аман иннетли болургъа болур + Аман иннетли тюзетиулени кёбюсюн табар, алай а буну гитче кескинлик бла этер. + Аман иннетлиге ушайды + Орта кескинлик бла, аман иннетли тюзетиулени орта бёлюмюн табады. + Ишексиз аман иннетлиге ушайды + Эм ачыкъ аман иннетли тюзетиулени табыуда бек кескинди. + Аслам тюзетиуле кёрюр ючюн %s къоратыб кёрюгюз + + %d фильтр + %d фильтр + + Статья тюзетиу тарих + Кери алыу тамамланды + Кери къайтыргъа излегенигизге ишексизмисиз? + Кери къайтыу тамамланды + Кёргюз + Функция бла проблема + Аслам бил + Википедия тюзетиулени гёзетлеуде эмда бегитиуде къошум этигиз. + Ахыр тюзетиулени тасмасына тири къараб эмда башха тюзетиучюлеге юретиу, агъачны тинтиу эмда дагъан бериб, Википедияны контентини агъачын маджаллашдыр. + Башхалыкъ экранда кери билдириуле теджегиз, тюзетиулени марагъыз эмда этиулени алыгъыз. + Бюсюреу + Хайырлы тюзетиу кёремисиз? Къошуму ючюн бу хайырланыучугъа бюсюреу этигиз. + Кёзде тут + Статья тюзетиулени мараргъамы излейсиз? Кёздеги тизмеге къошугъуз. \'Аслам\' тюбюнде кёргюзюгюз. + Сюзюу + Башха редакторла бла ушакъда болугъуз. Кёб хайырланнган билдириулени сюзюу бетде сакъландырыгъыз неда шаблонну хайырланыгъыз. + Кери ал/Кери къайтар + Заранлы болургъа боллукъ тюзетиуню кери алыр неда кери къайтарыр ючюн \'Кери Ал\'ны сайлагъыз. + Бузулуу, тюзетиуню викиге заран берирге боллугъун белгилер. + Нюзюр, тюзетиуню иги нюзюр бла сакъландырыргъа боллугъун белгилер. + Бу функцияны маджаллашдырыр ючюн болушугъуз + Бу функциядан разымысы? + Разыма + Къошулмайма + Разы тюлме + Функцияны къалай маджаллашдырыргъа боллукъбуз? + Статья тюзетиу тарих + Кери билдириу + Джибер + Кери билдириу джиберилди. + \'Функция бла байламлы проблема\' тюбюнде излеген заман кери билдириу джиберир ючюн къошакъ менюню басыгъыз. + Вандализм эсгертиу + Тюзетиу тестле + Нейтрал оюм + Автомат халда кёчюрюу + Интереслени даууну юсюнден эсгертиу + Ахыр эсгертиу + Автор хакъны бузлуууну билдириу + Тюзетиуню къысха хапарлауларын къой + Цензура этмегиз + Статья маджаллашдырыу теджеу + Салам {{{username}}}, бир неда аслам [{{{diffLink}}}|кёб болмай этилген къошумугъузну] кери алгъанымы билдирирге излейме, ала меннге конструктив кёрюнмейдиле. Мен халат этгеннге санай эсегиз неда сорууугъуз бар эсе, [[User talk:{{{senderUserName}}}|сюзюу бетимде]] билдириу къояргъа боллукъсуз. Вандализм мындан ары бардырылса чеклендириуле келирге боллугъун унутмагъыз. + Салам, {{{username}}}! Википедия эмда анда тюзетиу этиу сизни эсигизни бёлгенине къууанама. Сиз этген тюзетиу тест ишледи; Алай а, бу проектни нюзюрю хар ким да танышырча ышангылы эмда толу энциклопедия болгъанын эсде тутаргъа кереди. Тюзетиуюгюз контентге тийгени себебли, кетерирлгенди.\nВикипедияны тюзетирге юрениригиз келе эсе, сизге [[Wikipedia:Sandbox|къум къалаучукъ]] барды. Комментарийлеригиз белгили статья бла байламлы эсе, ала ючюн бу статьяны сюзюу бети эм тыйыншлы джерди. + Салам, {{{username}}}, бир къауум къошумугъуз бу Википедиядагъы [[Wikipedia:NPOV|нейтрал оюм]] политикасыны тамалына келишмейди. Ол себебден бир къауум контент тюзетилгенди неда къоратылгъанды. Тилейбиз, энчи оюмну белгилеген параграфланы неда бёлюмлени, аслам нейтрал эмда объектив текст бла, энциклопедияда сакъланнган келишгенча тюрлендиригиз. + Салам {{{username}}}, бир къауум кёчюрюуюгюз автомат халда этилгеннге ушайды, аны ючюн ала тюзетилгендиле неда шаблон бла белгиленнгендиле. Статьягъа джукъ тюзетиу этилмесе, кетерилирге боллукъду.\n\nБютеу информация бла къалмай, энтда сорууларыгъыз бар эсе, [[Хайырланыучуну сюзюу:{{{senderUserName}}}|сюзюу бетимде]] билдириу къоюгъуз. Бу гитче джангылышчыкъ ючюн къайналмагъыз. Къошумугъуз Википедия ючюн бек магъаналыды. + Салам, {{{username}}}, Википедияда иш бирлигигиз ючюн бюсюреу этеме; Алай а [[Википедия:Интереслени дауу|интереслени дауунда]] болгъаныгъызны эслегенме. Интереслени дауу - бир джанындан Википедияны нейтраллыкъ эмда ышангылыкъ нюзюрлери бла, башха джанындан да айры редакторланы,айры инсанланы, къуралышланы эмда компанияланы энчи нюзюрлерини бир-бирлерине келишмегенликди.\n\nОртакъ аламдагъы бютеу къошумла бу Википедиядагъы ёлчелени политикасына ([[Wikipedia:What_Wikipedia_is_not|Википедия не тюлдю]]), энциклопедиялыкъ агъачына ([[Wikipedia:Verifiability|тинтирча болгъанына]] эмда [[[Wikipedia:No_original_research|энчи тинтиулери болмагъанына]]), редакциялыкъ мадаргъа([[Wikipedia:Neutral_point_of_view|нейтрал оюмгъа]]) эмда контненти легитимлилигине ([[Wikipedia:Copyrights|авторлукъ хакъла]]) бойсунады. Контентни болдургъан эмда багъа бичген заманда боютеу авторладан бу политикагъа келишириклери сакъланады, аны бла бирге башха авторланы ишлерини, бу политикагъа келишиу гарантия болур ючюн, сыйын кёрюллюгю да керекди.\n\nИнтереслени дауу болгъан шартлада тюзетиу эте эсегиз, бу политиканы эсгериб хайырланыргъа керексиз; Алай болмаса, сизни хыйсабыгъыз энчиге саналыб блокга салыныргъа боллукъду. Сорууларыгъыз бар эсе, сюзюу бетимде джазаргъа уялмагъыз. + Талай деструктив тюзетиу этгегиз себебли, бу ахыр эсгертиуюгюздю. Энтда бир кере Википедиягъа заран этсегиз, тюзетиу эркинлигигиз сыйырыллыкъды. + Тюзетиулеригизде авторлукъ хакъла бла къорууланнган материалланы эркинликсиз хайырланнганы эсленнгеннге ушайды. Тилейбиз, къоратыуну джанлар ючюн, бютеу контентни бу Википедияны [[Wikipedia:Copyrights|авторлукъ хакъларына]] келишгенин тинтигиз. + Салам, {{{username}}}! Википедиядан контентни, тюзетиу хапарлауну къоймай кетергеннге ушайсыз. Википедиядан контентни къошсагъыз неда къоратсагъыз тюзетиу хапарлауну къоя туругъуз деб тилейбиз. + Салам, {{{username}}}! Статьяны сюзюу бетинде сюзмей, контентни къоратханнга ушайсыз. Эс бёлюгюз, Википедияда цензура джокъду, ол себебден контент бир-бирин тутмайды деб кетерирге болмайды. Информация кескин, тюз тюлдю деб сагъыш эте эсегиз, статьяны сюзюу бетинде консенсусха келиригизни тилейбиз. + Билдириу толтуруучуланы юсюнден юрен + Билдириулеригизни джарашдырыуда, джибериуде эмда сакъландырыуда тюбюрекдеги билдириу юлгюлени хайырланыгъыз. + Салам {{{username}}}. Статьягъы аламат башлангычды! Аны андан да маджал этер ючюн, ышангылы къайнакълагъа къошакъ джибериулени къошууну юсюнден сагъыш этигиз. Бу информацияны тинтерге эмда статьяны агъачын маджал этерге болушады. Аслам информация алыр ючюн, бу Википедияны [[Wikipedia:Reliable_sources|ышангылы къайнакълары]] бла байламлы теджеулери бла танышыгъыз. + Тюзет + Къабыл эт + Унама + Бетни джетмегенликлери + Гитче халат тюзетиуле эмда маджаллашдырыула + Джетмегенлик Билдирме-Сурат Теджеуле функция + Сурат теджеуле бла байламлы проблемагъа тюбедим:\n- [Белгили проблеманы таныт]\n\nКёрюрге излеген джууаблау:\n- [Теджелген оноуну таныт] + Джетишмегенлик Билдирим - Тюзетиу Патруль Функция + Тюзетиу Патруль Функция бла байламлы проблемагъа тюбедим:\n- [Белгили проблеманы таныт]\n\nКёрюрге излеген джууаблау:\n-[Теджелген оноуну таныт]\n\n[Скриншотла неда джибериуле] + Тамбла да сизге эсгертирикбиз. + Сау бол, багъалы багъышчы! Чомартлыгъыгъыз Википедияны эмда эгеч сайтланы маджаллашдырыуларны болушурукъду. + Кери къайт + Система браузерде ач + Джерле + Локациягъызны картада кёрюр ючюн, локация эркинлик керекди. Тилейбиз, энтда бир кере кёрюгюз. + Джерле изле + Фильтр тил + Карта + Тизме + Джерле бла тёгеригигиздеги Википедия статьяланы табыгъыз + Бу статьяны темасын ортагъа чыгъарыр ючюн \'Картада кёр\'ге басыгъыз + Бек разыма + Бек разы тюлме + \'Джерле\'ни маджаллашдырыргъа болушлукъчу бол + \"Джерле\" къалай маджаллашдырылыр? + Ызына ал + Нени тюрлендиририбизни неда маджаллашдырырыбзны излейсиз? + Бу юс бошду. <a href=\"#\">Картаны</a> узакълашдырыгъыз. diff --git a/app/src/main/res/values-kus/strings.xml b/app/src/main/res/values-kus/strings.xml index 3ece3c90a9b..5bcec3e6933 100644 --- a/app/src/main/res/values-kus/strings.xml +++ b/app/src/main/res/values-kus/strings.xml @@ -824,8 +824,8 @@ Ɛɛn Ayei Pʋ tis sidaa - Bɔ\' ka di kʋ nyaŋɛ? - Fʋ gandigi la na sʋŋ bɛog sa pʋtɛnda. + Bɔ\' ka di kʋ nyaŋɛ? + Fʋ gandigi la na sʋŋ bɛog sa pʋtɛnda. Footo la pʋ mɔr sʋŋirɛ Labaar la pʋ zu\'oe ka m na gban\'e gban\'arɛ Footo la mɔr daʋŋ diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index 8e3369fa56f..8c042dfa2fa 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -191,6 +191,7 @@ Которуу жаңы Тил + Кечээ %s түзөтүү Жокко чыгаруу Улантуу @@ -200,6 +201,7 @@ Жокко чыгаруу Шилтеме Калып + Булак Жокко чыгаруу Жокко чыгаруу Талкуу diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 32e8d6ad58d..a8dbf98c556 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -107,7 +107,7 @@ Op enger Kaart weisen An enger anerer Sprooch liesen Disponibel an %d anere Sproochen - Mam Verëffentleche sidd Dir mat den <a href=\"%1$s\">Notzungsbedingungen</a> d\'accord an iwwerloosst Är Kontributioun onwiderruflech ënner der <a href=\"%2$s\">CC BY-SA 3.0</a>-Lizenz. + Mam Verëffentleche sidd Dir mat den <a href=\"%1$s\">Notzungsbedingungen</a> d\'accord an iwwerloosst Är Kontributioun onwidderrufflech ënner der <a href=\"%2$s\">CC BY-SA 4.0</a>-Lizenz. Wikipedia-Sproochen Sichen Dës Säit ass net an anere Sproochen disponibel @@ -223,7 +223,7 @@ Iwwersetzer Dës App gouf vun de fräiwëllegen Iwwersetzer op <a href=\"https://translatewiki.net\">translatewiki.net</a> iwwersat. Lizenz - Quellcode disponibel op <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> a <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> ënner der <a href=\"https://phabricator.wikimedia.org/diffusion/APAW/browse/master/COPYING?view=raw\">Apache-2.0-Lizenz</a>. Wann et net anescht uginn ass, ass den Inhalt disponibel ënner enger <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative-Commons-Attribution-ShareAlike-Lizenz</a>. + Quellcode disponibel op <a<a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> ënner der <a href=\"https://phabricator.wikimedia.org/diffusion/APAW/browse/master/COPYING?view=raw\">Apache-2.0-Lizenz</a>. Wann et net anescht uginn ass, ass den Inhalt disponibel ënner enger <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative-Commons-Attribution-ShareAlike-Lizenz</a>. E Produkt vun der <a href=\"https://wikimediafoundation.org/\">Wikimedia Foundation</a> Iwwer D\'Säit gouf geännert. Sidd dir sécher datt Dir erausgoe wëllt ouni Är Ännerungen ze späicheren? @@ -921,8 +921,8 @@ Jo Neen Net sécher - Firwat net? - Är Äntwerte wäerten zukünfteg Virschléi besser maachen. + Firwat net? + Är Äntwerte wäerten zukünfteg Virschléi besser maachen. D\'Bild ass net relevant Net genuch Informatioune fir ze decidéieren Bild huet eng niddreg Qualitéit @@ -1023,7 +1023,7 @@ Eropgeluedent Bild Bildbeschreiwung Alternativen Text - Textbeschreiwung fir Lieser, déi d\'Bild net gesi kënnen + Beschreiwung fir visuell behënnert Lieser Erweidert Astellungen Text ronderëm d\'Bild fléisse loossen Bildpositioun @@ -1329,6 +1329,15 @@ Problemer mat der Säit Mir erënneren Iech muer nach eng Kéier. Zréckgoen + Een Don iwwer Google Pay maachen? + Een Don iwwer Google Pay maachen + Aner Bezuelmethod + Wielt ee Betrag + Wielt wgl. ee Betrag (mindestens %s) + Mir kënnen iwwer eis App keng Donen iwwer %s akzeptéieren. Kontaktéiert wgl. eist Personal fir gréisser Done iwwer benefactors@wikimedia.org. + <b>Merci!</b> Är Generositéit géigeniwwer Wikipedia bedeit eis vill. + Probleemer fir en Don ze maachen? + Dacks gestallte Froen Plazen Kaart Lëscht diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index f520f93ff6e..5e29fe7a79e 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -895,8 +895,8 @@ Taip Ne Nežinau - Kodėl ne? - Jūsų atsakymai pagerina būsimus siūlymus. + Kodėl ne? + Jūsų atsakymai pagerina būsimus siūlymus. Paveikslėlis neaktualus Nepakanka informacijos apsispręsti Paveikslėlis įžeidžiantis diff --git a/app/src/main/res/values-mhr/strings.xml b/app/src/main/res/values-mhr/strings.xml index 3eab3f897b9..debdc10e73a 100644 --- a/app/src/main/res/values-mhr/strings.xml +++ b/app/src/main/res/values-mhr/strings.xml @@ -664,7 +664,7 @@ Статьян сӱретше Туге Уке - Молан уке? + Молан уке? Сӱрет шӱктарыше улеш Уда сайлыкан сӱрет Моло diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index e3c7ece37f9..021eff5d635 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -1087,8 +1087,8 @@ Да Не Не знам - Зошто не? - Вашите одговори ги подобруваат идните предлози. + Причина за одбивање + Причината за одбивање е анонимна и ги идните предлози. Сликата е нерелевантна Немам доволно сознанија за да одлучам Сликата е неумесна @@ -1633,6 +1633,21 @@ Ви благодариме, драг дарителу! Википедија и нејзините збратимени проекти напредуваат благодарение на вашата великодушност. Назад Отвори во системскиот прелистувач + Дарувате со Google Pay? + Дарувајте со Google Pay или изберете друг начин на плаќање. + Дарувај со Google Pay + Друг начин на плаќање + Изберете износ + Великодушно ќе додадам %s за да ја покријам трансакциската провизија за да задржите 100%% од мојот дар. + Повторувај го овој дар секој месец. + Да, Фондацијата Викимедија може повремено да ми испраќа е-пошта. + Одберете износ (барем %s) + Не можеме да прифатиме износи поголеми од %s преку нашиот прилог. Обратете се кај персоналот за големи дарови на benefactors@wikimedia.org. + <b>Ви благодариме!</b> Вашата великодушност кон Википедија многу ни значи. + Имате проблеми при дарувањето? + Други начини на дарување + Често поставувани прашања + Информации за даночното олеснување Места Потребна е дозвола за споделување на вашата местоположба на карта. Обидете се повторно. Пребарај места diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 1148420ac5f..af3e505fe79 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -257,7 +257,7 @@ Bagaimanakah anda menambah baik laman ini? Seterusnya Terbitkan - Pralihat + Pratayang Nyahbuat Buat semula Zum dekat diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 698f28ae6ec..d52b63cbbd5 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1078,8 +1078,8 @@ Ja Nei Usikker - Hvorfor ikke? - Svarene dine hjelper til å forbedre framtidige forslag. + Hvorfor ikke? + Svarene dine hjelper til å forbedre framtidige forslag. Bildet er ikke relevant Ikke nok informasjon til å avgjøre Bildet er støtende diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 86b6c1c947b..d471378fb68 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -748,4 +748,5 @@ उपश्रेणीहरू यस श्रेणीमा कुनै लेख फेला परेन। योगदानहरू + वार्तालाप diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 138cf164af1..a0476234053 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1101,8 +1101,8 @@ Ja Nee Niet zeker - Waarom niet? - Uw antwoorden verbeteren toekomstige suggesties. + Waarom niet? + Uw antwoorden verbeteren toekomstige suggesties. Afbeelding is niet relevant Onvoldoende informatie om te beslissen De afbeelding is aanstootgevend diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index 5069f94fe6b..f83259ddff3 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -898,8 +898,8 @@ ߐ߲߬ߐ߲߬ߐ߲߫ ߊ߬ߦߌ߫ ߒ ߡߊ߫ ߟߴߊ߬ ߟߊ߫ - ߡߎ߲߬ߠߊ߫ ߍ߲߬ߍ߲߫؟ - ߌ ߟߊ߫ ߖߋ߬ߓߌ߬ߟߌ ߦߋ߫ ߞߎ߲߬ߦߌ߬ߘߊ߬ߟߌ ߣߊ߬ߕߐ ߟߊߢߊ߬ ߟߊ߫ ߟߋ߬. + ߡߎ߲߬ߠߊ߫ ߍ߲߬ߍ߲߫؟ + ߌ ߟߊ߫ ߖߋ߬ߓߌ߬ߟߌ ߦߋ߫ ߞߎ߲߬ߦߌ߬ߘߊ߬ߟߌ ߣߊ߬ߕߐ ߟߊߢߊ߬ ߟߊ߫ ߟߋ߬. ߖߌ߬ߦߊ߬ߓߍ ߕߍ߫ ߢߊ߬ߕߣߐ߬ߡߊ߬ ߘߌ߫ ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ߫ ߞߟߊ߬ߟߊ߬ߡߊ߫ ߕߴߦߋ߲߬ ߡߍ߲ ߘߌ߫ ߡߐ߰ ߟߊߝߊ߲ߞߊ߲߫ ߖߌ߬ߦߊ߬ߓߍ ߦߋ߫ ߡߛߊ߬ߡߊ߲߬ߠߌ߲ ߠߋ߬ ߘߌ߫ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 8290b17550c..c0dc6107967 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -419,8 +419,8 @@ ਲੇਖ ਚਿੱਤਰ ਸਮਝ ਨੂੰ ਵਧਾਉਣ ਲਈ ਵਿਕੀਪੀਡੀਆ ਲੇਖਾਂ ਵਿੱਚ ਸੁਝਾਏ ਚਿੱਤਰ ਸ਼ਾਮਲ ਕਰੋ। ਹਾਂ - ਕਿਉਂ ਨਹੀਂ? - ਤੁਹਾਡੇ ਜਵਾਬ ਭਵਿੱਖ ਦੇ ਸੁਝਾਵਾਂ ਵਿੱਚ ਸੁਧਾਰ ਕਰਦੇ ਹਨ। + ਕਿਉਂ ਨਹੀਂ? + ਤੁਹਾਡੇ ਜਵਾਬ ਭਵਿੱਖ ਦੇ ਸੁਝਾਵਾਂ ਵਿੱਚ ਸੁਧਾਰ ਕਰਦੇ ਹਨ। ਚਿੱਤਰ ਘੱਟ ਗੁਣਵੱਤਾ ਵਾਲਾ ਹੈ ਮੈ ਇਹ ਵਿਸ਼ਾ ਨਹੀਂ ਜਾਣਦਾ ਤੁਸੀਂ ਫੈਸਲਾ ਕਰੋਗੇ ਕਿ ਸੁਝਾਏ ਚਿੱਤਰ ਨੂੰ ਵਿਕੀਪੀਡੀਆ ਲੇਖ ਵਿੱਚ ਰੱਖਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ff48a1c0ce0..ce721e8e648 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -996,8 +996,8 @@ Tak Nie Nie jestem pewien - Dlaczego nie? - Twoje odpowiedzi ulepszają przyszłe sugestie. + Dlaczego nie? + Twoje odpowiedzi ulepszają przyszłe sugestie. Obraz nie jest istotny Za mało informacji, żeby podjąć decyzję Obraz jest obraźliwy diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5b56518b1f8..26e002af94b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1101,7 +1101,7 @@ Sim Não Não tenho certeza - Por que não? + Por que não? A imagem não é relevante Não há informações suficientes para decidir A imagem é ofensiva diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c3cf4a9c9f3..a2e9846e7b4 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1081,8 +1081,8 @@ Sim Não Não tenho a certeza - Por que não? - Sua resposta pode melhorar sugestões futuras. + Por que não? + Sua resposta pode melhorar sugestões futuras. A imagem não é relevante Não há informações suficientes para decidir A imagem é ofensiva diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 79323a0a6e1..9c1688f6d61 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1661,6 +1661,7 @@ Text for the snackbar message when user hits the \"maybe later\" option. Text for the snackbar message when user hits the \"I already donated\" option. Button label for the webview that can go back to the previous screen. + Menu option that indicates the web page can be opened in a system browser. Title of popup dialog asking if the user wants to donate via Google Pay. Description of popup dialog asking if the user wants to donate via Google Pay. Button that leads to the Google Pay donation screen. @@ -1676,7 +1677,6 @@ Label for a link to resources with other ways to contribute. Label for a link to a FAQ page about donating. Label for a link to documentation about making donations tax-deductible. - Menu option that indicates the web page can be opened in a system browser. Title for the Places screen. Message shown when a required permission was denied by the user. Hint text for the search box inside the Places screen. Should be as short as possible. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d4e758440e8..de4f012f32f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -237,6 +237,7 @@ Отмена Удалить учётную запись Предупреждение об удалении учётной записи + Исчезновение — это <b>последнее средство</b> , и его следует <b>использовать только в том случае, если вы хотите навсегда прекратить редактирование</b> , а также скрыть как можно больше своих прошлых ассоциаций.<br/><br/> Удаление учетной записи в Википедии осуществляется путем изменения имени вашей учетной записи, чтобы другие не могли признать ваш вклад в процесс, называемый исчезновением учетной записи. <b>Vanishing не гарантирует полную анонимность и не удаляет вклады в проекты</b> . Нет недавно просмотренных статей Отслеживайте здесь прочитанные вами статьи. Некоторые страницы в истории могут быть недоступны оффлайн. @@ -477,6 +478,7 @@ Сохранить Сохранено Поделиться + Эта статья является незавершенной, что означает, что в ней недостаточно содержимого для предварительного просмотра. Однако вы можете это изменить. Такой страницы не существует В Википедии нет <a href=\"%1$s\">страницы участника_цы</a> с точно таким именем. Как правило, эта страница должна быть создана и редактироваться участником_цей <b>%2$s</b>. Если есть сомнения, пожалуйста, проверьте, существует ли «%3$s». Не удаётся подключиться к интернету @@ -500,10 +502,16 @@ Настройте свою панель инструментов Вы можете связаться с <a href=\"https://ru.wikipedia.org/wiki/Википедия:Администраторы\">администратором</a> для обсуждения блокировки. Вы не вошли в систему + После внесения изменений для вас будет создана <b>временная учетная запись</b> для защиты вашей конфиденциальности. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Learn more</a> .<br /><br /> <a href=\"https://#login\">Войдите в систему</a> или <a href=\"https://#login\">создайте учетную запись</a> , чтобы получить признание за будущие изменения и получить доступ к другим функциям. + Ваше изменение будет отнесено к %1$s . Ваш IP-адрес будет виден администраторам.<br /><br /> Если вы <a href=\"https://#login\">войдете в систему</a> или <a href=\"https://#login\">создадите учетную запись</a> , ваши изменения будут связаны с выбранным вами именем, помимо других преимуществ. Понятно Вы используете временную учётную запись Отменить изменения и войти в систему + <b>Вы не вошли в систему.</b> После внесения изменений для вас будет создана временная учетная запись для защиты вашей конфиденциальности. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Learn more</a> + <b>Вы используете временную учетную запись.</b> Ваше изменение будет отнесено к %1$s . <a href=\"<span class=\"notranslate\" translate=\"no\">%2$s \">Подробнее...</a> . + <b>В настоящее время вы используете временную учетную запись.</b> Изменения, внесенные с помощью временной учетной записи %1$s не будут перенесены в вашу постоянную учетную запись при входе в систему. Войдите в систему или создайте учетную запись, чтобы получить кредит на свое имя пользователя, помимо других преимуществ. Завершить сеанс + Это приведет к выходу из вашей временной учетной записи. Вы хотите продолжать? Ошибка приложения Сожалеем, но в приложении Википедии случилась ошибка, в результате чего оно было закрыто.\n\nВы хотите перезапустить его или выйти? Перезапустить @@ -579,6 +587,7 @@ Экспортировать список Выбрать Отменить выбор + Для сохранения изображений требуется разрешение на запись в хранилище вашего устройства. Изменить название/описание Удалить из офлайн-режима Сохранить в автономный режим @@ -604,7 +613,10 @@ Статей удалено из %s: %d Список по умолчанию (%s) не может быть удалён + %1$s удалено, но список по умолчанию (%2$s) невозможно удалить. Списки удалены. Список по умолчанию (%s) не может быть удалён. + %s (Список для чтения в Википедии).json + Списки для чтения в Википедии (%s и другие).json %d статей удалено из списка %s удалено из списков Отменить @@ -667,6 +679,7 @@ Невозможно добавить в текущий список. Вы исчерпали лимит %2$d статей для \"%1$s\". Невозможно создать новый список. Вы достигли лимита в 100 списков для одной учётной записи. Создать новый список + Импортированный список Сортировать по Перезапустить синхронизацию Войти / зарегистрироваться @@ -693,6 +706,7 @@ ОК Удалить Список чтения: %s + Списк(и) для чтения экспортирован(ы). Экспортировать Выберите файл для импорта Не удалось импортировать списки чтения @@ -1172,8 +1186,8 @@ Да Нет Затрудняюсь ответить - Почему нет? - Ваши ответы улучшают качество будущих подсказок. + Причина отклонения + Причина отклонения является анонимной и позволит улучшить будущие предложения изображений. Изображение не релевантно Мало информации, чтобы решить Изображение оскорбительно @@ -1638,6 +1652,8 @@ Узнать больше Благодарность Видите продуктивную правку? Поблагодарите участника за его вклад. + Обсуждение + Общайтесь с другими редакторами. Сохраняйте часто используемые сообщения на странице обсуждения или используйте шаблон. Вы довольны этой функцией? Доволен Воздержусь @@ -1665,6 +1681,7 @@ Спасибо за ваше пожертвование! Ваша поддержка помогает Википедии и её родственным проектам процветать. Назад Открыть в системном браузере + Другой способ оплаты Места Чтобы увидеть ваше местоположение на карте, требуется разрешение на определение местоположения. Пожалуйста, попробуйте ещё раз. Поиск мест diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml index 651ef96bea0..64eb0c73b53 100644 --- a/app/src/main/res/values-sd/strings.xml +++ b/app/src/main/res/values-sd/strings.xml @@ -987,8 +987,8 @@ ھا نہ پڪ ناھي - ڇو نہ؟ - توھان جا جواب ايندڙ صلاحن کي بھتر ڪن ٿا. + ڇو نہ؟ + توھان جا جواب ايندڙ صلاحن کي بھتر ڪن ٿا. عڪس لاڳاپيل نہ آھي فيصلي ڪرڻ لاءِ مناسب معلومات ناھي عڪس چڙڏياريندڙ آھي diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index ad343cd48e8..059c1bd6d84 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -475,7 +475,7 @@ جیا کو پک کائنی - کیوں نہ؟ + کیوں نہ؟ تصویر غیرمتعلقہ ہے فیصلہ کرݨ کیتے کافی معلومات کائنی ٻیا diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 488a9f33717..83f0c360817 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -1138,8 +1138,8 @@ Da Ne Nisem prepričan_a - Zakaj ne? - Vaši odgovori izboljšujej prihodnje predloge. + Zakaj ne? + Vaši odgovori izboljšujej prihodnje predloge. Slika ni relevantna Ni dovolj informacij za odločitev Slika je žaljiva diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 856f3be3c01..74cd5c243d0 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1067,7 +1067,7 @@ Не Нисам сигуран Зашто не? - Ваши одговори унапређују будуће предлоге. + Ваши одговори су анонимни и унапређују будуће предлоге. Слика није релевантна Недовољно информација за одлуку Слика је увредљива @@ -1556,6 +1556,7 @@ Видите продуктивну измену? Захвалите се кориснику за његов допринос. Надгледај Да ли желите да пратите измене чланка? Додајте га на свој списак надгледања. Погледајте га под \'Више\'. + Разговор Поништи/врати Одаберите \'Поништи\' да би сте поништили или вратили потенционалну деструктивну измену. Помозите нам да унапредимо ову могућност @@ -1585,6 +1586,20 @@ Хвала, драги донаторе! Ваша великодушност помаже да Википедија и њени сестрински сајтови буду успешни. Назад Отвори у прегледачу + Донирајте путем Google Pay-а? + Донирајте путем Google Pay-а или одаберите други начин плаћања. + Донирајте путем Google Pay-а + Други начини донирања + Изаберите износ + Донирај аутоматски сваког месеца. + Да, нека ми Задужбина Викимедија периодично шаље имејлове. + Изаберите износ (најмање %s) + Нисмо у могућности да прихватимо донације веће од %s путем наше апликације. Контактирајте наш тим за поклоне на benefactors@wikimedia.org. + <b>Хвала пуно!</b> Ваша великодушност ка Википедији значи нам много. + Проблема при донирању? + Други начини донирања + Често постављана питања + Подаци о пореским олакшицама Места Мапа Списак diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 07c6bbf5653..ab07f463efc 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1094,8 +1094,8 @@ Ja Nej Inte säker - Varför inte? - Dina svar förbättrar kvaliteten på framtida förslag. + Varför inte? + Dina svar förbättrar kvaliteten på framtida förslag. Bilden är inte relevant Inte tillräckligt med information för att avgöra Bilden är kränkande diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 57b6de53d8a..32d9b1ae5b0 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -940,7 +940,7 @@ వ్యాస చిత్రాలు వికీపీడియా వ్యాసాలను మరింత మెరుగ్గా అర్థం చేసుకోవడానికి సూచించిన చిత్రాలను చేర్చండి. సరే - ఎందుకని వద్దు? + ఎందుకని వద్దు? ఈ విషయం గురించి నాకు తెలియదు సూచించబడిన చిత్రాన్ని వికీపీడియా వ్యాసంలో చేర్చాలా వద్దా అనేది నిర్ణయించవలసినది మీరే. ఈ సూచనలు యాంత్రికంగా తయారైనవి. వీటిని స్వీకరించాలో తిరస్కరించాలో లేదో మీ విజ్ఞతతో మీరే నిర్ణయించుకోవాలి. diff --git a/app/src/main/res/values-tly/strings.xml b/app/src/main/res/values-tly/strings.xml index ba4787409cf..d0979b29655 100644 --- a/app/src/main/res/values-tly/strings.xml +++ b/app/src/main/res/values-tly/strings.xml @@ -740,7 +740,7 @@ Bəle Ne Cətine vote - Buci ne? + Buci ne? Čo Vyǧandej Dumotono šə diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index caf13c7eefb..c1229802613 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1103,8 +1103,8 @@ Evet Hayır Emin değilim - Neden? - Yanıtlarınız gelecek önerileri iyileştirir. + Neden? + Yanıtlarınız gelecek önerileri iyileştirir. Görsel ilgili değil Karar vermek için yeterli bilgi yok Görsel rahatsız edici diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2c6e11fbfc1..dc4455c957c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1149,8 +1149,8 @@ Так Ні Не впевнений - Чому ні? - Ваші відповіді допоможуть покращити наступні пропозиції. + Чому ні? + Ваші відповіді допоможуть покращити наступні пропозиції. Зображення не релевантне Недостатньо інформації, щоб прийняти рішення Зображення образливе diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 5c8d4694adb..2bcc99b7074 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -1064,8 +1064,8 @@ Ha Yoʻq Balki yoʻq - Nega yoʻq? - Javoblaringiz kelajakdagi takliflarni yaxshilaydi. + Nega yoʻq? + Javoblaringiz kelajakdagi takliflarni yaxshilaydi. Rasm tegishli emas Qaror qabul qilish uchun yetarli maʼlumot yoʻq Rasm haqoratli diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 9142cf9bce3..f7fc2e59424 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -965,7 +965,7 @@ Hướng dẫn Không - Tại sao không? + Tại sao không? Kế tiếp Trang tập tin Thêm chú thích hình ảnh diff --git a/app/src/main/res/values-xmf/strings.xml b/app/src/main/res/values-xmf/strings.xml index 4bacfd7586c..a77fbdbc410 100644 --- a/app/src/main/res/values-xmf/strings.xml +++ b/app/src/main/res/values-xmf/strings.xml @@ -453,7 +453,7 @@ ქო ვარი ვამაფუ გინოჭყვადილჷ - მუშენ ვარ? + მუშენ ვარ? ვა რე დასაბაღუ ინფორმაცია გინაჭყვიდირალო სურათი კუჩხიშ გემადგჷმუ რე სურათი დაბალი ხარისხიშ რე diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b032e97134c..b4af85b9af5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -267,8 +267,8 @@ https://zh.wikipedia.org/wiki/Wikipedia:账号请求 https://creativecommons.org/licenses/by-sa/4.0/deed.zh_TW https://creativecommons.org/publicdomain/zero/1.0/deed.zh_TW - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/zh#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/zh + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/zh#%E5%9B%BE%E5%83%8F%E6%A0%87%E7%AD%BE 使用的函式庫 貢獻者 <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">團隊頁面</a> @@ -891,8 +891,8 @@ 語音輸入 了解更多關於條目描述的內容 了解更多關於圖片說明的內容 - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/zh#条目描述 - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/zh#图片说明 + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/zh#%E6%9D%A1%E7%9B%AE%E6%8F%8F%E8%BF%B0 + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/zh#%E5%9B%BE%E5%83%8F%E8%AF%B4%E6%98%8E 文字太短。 文字不能以標點符號結束。 避免以「a」或是「the」定冠詞作為條目開頭。 @@ -1114,8 +1114,8 @@ 不確定 - 為何不呢? - 您的回答可以改善往後建議。 + 拒絕原因 + 拒絕原因採用匿名方式,用於改善未來的圖片建議。 圖片不相關 沒有足夠資訊來決定 圖片令人感到不快 @@ -1608,6 +1608,8 @@ 有看到優質內容的編輯嗎?來對使用者感謝他們的貢獻。 監視 想要追蹤條目的編輯嗎?添加到您的監視清單。在「更多」下方查看。 + 討論 + 與其他編輯者交流。儲存常用的討論頁訊息或使用模版。 撤銷/回退 選擇「撤銷」以撤銷或回退可能帶有破壞性的編輯。 破壞預測編輯是否有對 wiki 造成破壞。 @@ -1658,6 +1660,21 @@ 謝謝您,親愛的捐贈者!您的慷慨贊助會幫助維基百科與相關姐妹網站蓬勃發展。 返回 在系統瀏覽器開啟 + 使用 Google Pay 捐款? + 使用 Google Pay 或選擇其他支付方式捐款。 + 使用 Google Pay 捐款 + 其他支付方式 + 選擇金額 + 我願意慷慨地添加 %s 來支付手續費,這樣維基百科就可以保有我的 100% 捐款。 + 將此作為每月定期捐款。 + 是的,維基媒體基金會可以臨時對我發送電子郵件。 + 請選擇金額(最少 %s) + 我們無法透過我們的應用程式接受超過 %s 的捐款。請藉由 benefactors@wikimedia.org 電郵帳號來聯絡我們的贈品專門處理人員。 + <b>感謝您!</b>您對維基百科的慷慨捐款對我們至關重要。 + 捐贈時遇到問題? + 其他給予方式 + 常見問題 + 減稅資訊 地點 需要位置權限才能在地圖上查看您的位置。請再試一次。 搜尋地點 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 67ce87ee101..7c2e0f9ba75 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1121,8 +1121,8 @@ 不确定 - 为什么不会呢? - 您的回答有助于改进今后关于图片的建议。 + 为什么不会呢? + 您的回答有助于改进今后关于图片的建议。 图片与条目无关 信息不足,无法决定 图片令人不悦 From 93f3e8fc5141de8edd8ea50b805b9438228a45f5 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 23 Apr 2024 08:51:23 -0400 Subject: [PATCH 071/626] Fix string. --- app/src/main/res/values-krc/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml index ac1440f2b65..76e0627c377 100644 --- a/app/src/main/res/values-krc/strings.xml +++ b/app/src/main/res/values-krc/strings.xml @@ -1284,7 +1284,7 @@ <b>Ахыр тюзетиу %1$s датада</b> %2$s этди Сюзюу бетлени хайырланнганыгъыз ючюн сау болугъуз. Анкетагъа къошулуб, къошакъны маджаллашдырыуубузгъа болушурмусуз? Башла - Википедия - сюзюу бетдеги \"%s%\" темада сюзюу + Википедия - сюзюу бетдеги \"%s\" темада сюзюу Википедия - сюзюу бетдеги сюзюуле Бу сюзюу бетди. Тилейбиз, сюзюу бетни джорукъларына сыйыныгъыз эмда джибергенлеригизни тёрт тильда джазыб, къол салыргъа унутмагъыз: викитекстни хайырланыб, джибергенигигзни ахырына ~~~~ къошугъуз.<br><br><a href=\"https://krc.wikipedia.org/wiki/Vikipedi:Сюзюу бет\">Википедия: Сюзюу бет</a> Бирлдириулени изле From a3120ecb448ae5f81a814b20f8ee3d534def4c48 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 23 Apr 2024 14:28:41 -0400 Subject: [PATCH 072/626] Use new and updated gradle wrapper validator. (#4620) --- .github/workflows/android_pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android_pr.yml b/.github/workflows/android_pr.yml index bf5855f1d79..f0e68f1ba9d 100644 --- a/.github/workflows/android_pr.yml +++ b/.github/workflows/android_pr.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: gradle/wrapper-validation-action@v2 + - uses: gradle/actions/wrapper-validation@v3 - uses: actions/setup-java@v4 with: distribution: 'temurin' From 730686fbe485be811a15a782f14560b2bae3cb64 Mon Sep 17 00:00:00 2001 From: Jvr <109031036+Jvr2022@users.noreply.github.com> Date: Wed, 24 Apr 2024 02:10:42 +0200 Subject: [PATCH 073/626] Chore: update deps (#4621) * Chore: update deps * Chore: update deps --------- Co-authored-by: Cooltey Feng --- app/build.gradle | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d4f72027326..16e044c0f26 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -176,7 +176,7 @@ dependencies { String retrofitVersion = '2.11.0' String glideVersion = '4.16.0' String mockitoVersion = '5.2.0' - String leakCanaryVersion = '2.13' + String leakCanaryVersion = '2.14' String kotlinCoroutinesVersion = '1.8.0' String firebaseMessagingVersion = '23.4.1' String mlKitVersion = '17.0.5' diff --git a/build.gradle b/build.gradle index 7099c7d7ba5..ef911cce83e 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { } plugins { - id 'com.google.devtools.ksp' version '1.9.23-1.0.19' apply false + id 'com.google.devtools.ksp' version '1.9.23-1.0.20' apply false } allprojects { From 3f5cf8ce21f4e28d7fdffae0e468cebb3c37b92c Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 24 Apr 2024 14:01:10 -0400 Subject: [PATCH 074/626] Update core-ktx dependency. (#4623) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 16e044c0f26..676084b3dce 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -194,7 +194,7 @@ dependencies { implementation "com.google.android.material:material:1.11.0" implementation 'androidx.appcompat:appcompat:1.6.1' - implementation "androidx.core:core-ktx:1.12.0" + implementation "androidx.core:core-ktx:1.13.0" implementation "androidx.browser:browser:1.8.0" implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.fragment:fragment-ktx:1.6.2" From 8b24346d37c30d1590fd239afb2f4f39b9d9d060 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 24 Apr 2024 14:38:50 -0400 Subject: [PATCH 075/626] Foundations for Google Pay integration. (#4622) * Foundations for Google Pay integration. * Version. * Clarify double-escaping of string. --------- Co-authored-by: Cooltey Feng --- app/build.gradle | 17 ++++++++++++----- .../org/wikipedia/donate/GooglePayActivity.kt | 10 ++++++++++ .../org/wikipedia/donate/GooglePayComponent.kt | 12 ++++++++++++ app/src/fdroid/AndroidManifest.xml | 7 +++++++ .../org/wikipedia/donate/GooglePayComponent.kt | 12 ++++++++++++ app/src/main/AndroidManifest.xml | 6 ++++++ .../donate/PaymentResponseContainer.kt | 13 ++++++++++--- app/src/main/res/values-qq/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 9 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt create mode 100644 app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt create mode 100644 app/src/fdroid/java/org/wikipedia/donate/GooglePayComponent.kt diff --git a/app/build.gradle b/app/build.gradle index 676084b3dce..978a53db324 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -71,11 +71,10 @@ android { sourceSets { - prod { java.srcDirs += 'src/extra/java' } - beta { java.srcDirs += 'src/extra/java' } - alpha { java.srcDirs += 'src/extra/java' } - dev { java.srcDirs += 'src/extra/java' } - custom { java.srcDirs += 'src/extra/java' } + [ prod, beta, alpha, dev, custom ].forEach { + it.java.srcDirs += 'src/extra/java' + it.res.srcDirs += 'src/extra/res' + } androidTest { assets.srcDirs += files("$projectDir/schemas".toString()) @@ -180,6 +179,7 @@ dependencies { String kotlinCoroutinesVersion = '1.8.0' String firebaseMessagingVersion = '23.4.1' String mlKitVersion = '17.0.5' + String googlePayVersion = '19.3.0' String roomVersion = "2.6.1" String espressoVersion = '3.5.1' String serialization_version = '1.6.3' @@ -252,6 +252,13 @@ dependencies { devImplementation "com.google.firebase:firebase-messaging-ktx:$firebaseMessagingVersion" customImplementation "com.google.firebase:firebase-messaging-ktx:$firebaseMessagingVersion" + // For integrating with Google Pay for donations + prodImplementation "com.google.android.gms:play-services-wallet:$googlePayVersion" + betaImplementation "com.google.android.gms:play-services-wallet:$googlePayVersion" + alphaImplementation "com.google.android.gms:play-services-wallet:$googlePayVersion" + devImplementation "com.google.android.gms:play-services-wallet:$googlePayVersion" + customImplementation "com.google.android.gms:play-services-wallet:$googlePayVersion" + debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion" implementation "com.squareup.leakcanary:plumber-android:$leakCanaryVersion" diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt new file mode 100644 index 00000000000..c1e12df6c16 --- /dev/null +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt @@ -0,0 +1,10 @@ +package org.wikipedia.donate + +import android.os.Bundle +import org.wikipedia.activity.BaseActivity + +class GooglePayActivity : BaseActivity() { + public override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } +} diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt new file mode 100644 index 00000000000..e807f0fff05 --- /dev/null +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt @@ -0,0 +1,12 @@ +package org.wikipedia.donate + +import android.app.Activity + +object GooglePayComponent { + suspend fun isGooglePayAvailable(activity: Activity): Boolean { + return false + } + + fun onGooglePayButtonClicked(activity: Activity) { + } +} diff --git a/app/src/fdroid/AndroidManifest.xml b/app/src/fdroid/AndroidManifest.xml index 235a93bb0ff..e5bcba74239 100644 --- a/app/src/fdroid/AndroidManifest.xml +++ b/app/src/fdroid/AndroidManifest.xml @@ -7,10 +7,17 @@ android:value="F-Droid" tools:replace="android:value" /> + + + + diff --git a/app/src/fdroid/java/org/wikipedia/donate/GooglePayComponent.kt b/app/src/fdroid/java/org/wikipedia/donate/GooglePayComponent.kt new file mode 100644 index 00000000000..e807f0fff05 --- /dev/null +++ b/app/src/fdroid/java/org/wikipedia/donate/GooglePayComponent.kt @@ -0,0 +1,12 @@ +package org.wikipedia.donate + +import android.app.Activity + +object GooglePayComponent { + suspend fun isGooglePayAvailable(activity: Activity): Boolean { + return false + } + + fun onGooglePayButtonClicked(activity: Activity) { + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 53851d512dd..9b0ea3f5a27 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -79,6 +79,9 @@ + + + + + = emptyList() -) +) { + init { + if (status == "error") { + throw MwException(MwServiceError("donate_error", errorMessage)) + } + } +} @Suppress("unused") @Serializable diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 9c1688f6d61..6bc3ddff11a 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1667,7 +1667,7 @@ Button that leads to the Google Pay donation screen. Button that leads to the general donation workflow in a web browser. Title for screen where the donation amount is selected. - Label for checkbox that adds the transaction fees to the donation amount. The %s symbol is replaced with the transaction fee amount, which will include the currency symbol. + Label for checkbox that adds the transaction fees to the donation amount. The %s symbol is replaced with the transaction fee amount, which will include the currency symbol. Please preserve the double-percent (100%%) escaping. Label for checkbox that makes the donation into a recurring one. Label for checkbox that indicates consent to receive email communications. Error message shown when the specified donation amount is less than the minimum allowed. The %s symbol is replaced with the minimum amount, which will include the currency symbol. diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b4af85b9af5..5ababa58e31 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1665,7 +1665,7 @@ 使用 Google Pay 捐款 其他支付方式 選擇金額 - 我願意慷慨地添加 %s 來支付手續費,這樣維基百科就可以保有我的 100% 捐款。 + 我願意慷慨地添加 %s 來支付手續費,這樣維基百科就可以保有我的 100%% 捐款。 將此作為每月定期捐款。 是的,維基媒體基金會可以臨時對我發送電子郵件。 請選擇金額(最少 %s) From e8bd2702efb1b87e2f7dc647dd6277bf82d20b86 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 25 Apr 2024 18:05:02 +0530 Subject: [PATCH 076/626] Localisation updates from https://translatewiki.net. (#4625) --- app/src/main/res/values-bn/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 11 ++++- app/src/main/res/values-es/strings.xml | 7 ++- app/src/main/res/values-hi/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 9 ++++ app/src/main/res/values-krc/strings.xml | 23 ++++----- app/src/main/res/values-mhr/strings.xml | 17 ++++++- app/src/main/res/values-ms/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 4 +- app/src/main/res/values-qq/strings.xml | 2 +- app/src/main/res/values-skr/strings.xml | 4 ++ app/src/main/res/values-sl/strings.xml | 54 ++++++++++++++++++---- app/src/main/res/values-zh/strings.xml | 7 ++- 13 files changed, 112 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 465440c50e0..49cb28f4e43 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -1197,6 +1197,7 @@ পাতার সমস্যা ফিরে যান সিস্টেম ব্রাউজারে খুলুন + প্রায়শই জিজ্ঞাসিত প্রশ্নসমূহ স্থানগুলি মানচিত্রে আপনার লোকেশন দেখতেলোকেশনের অনুমতি প্রয়োজন। অনুগ্রহকরে আবার চেষ্টা করুন। স্থানগুলি অনুসন্ধান করুন diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3a69fb734d7..b1b20404a45 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1109,8 +1109,8 @@ Ja Nein Nicht sicher - Warum nicht? - Deine Antworten können zukünftige Vorschläge verbessern. + Ablehnungsgrund + Der Ablehnungsgrund ist anonym und wird zukünftige Bildvorschläge verbessern. Bild ist nicht zutreffend Nicht genügend Informationen für eine Entscheidung Bild ist anstößig @@ -1567,6 +1567,13 @@ Wir werden dich morgen erneut erinnern. Zurück Im Systembrowser öffnen + Mit Google Pay spenden? + Andere Zahlungsmethode + Wir können über unsere App keine Spenden annehmen, die höher als %s sind. Bitte wende dich an unser Teammitglied für Großspenden unter benefactors@wikimedia.org. + <b>Danke!</b> Deine Großzügigkeit gegenüber Wikipedia bedeutet uns so viel. + Probleme beim Spenden? + Häufig gestellte Fragen + Informationen zur steuerlichen Absetzbarkeit Orte Um deinen Standort auf der Karte anzeigen zu können, ist die Standortberechtigung erforderlich. Bitte versuche es erneut. Orte suchen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8cd79af10c3..bdfed0264fb 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1123,7 +1123,7 @@ No Motivo del rechazo - Tu respuesta puede mejorar futuras sugerencias. + El motivo del rechazo es anónimo y mejorará futuras sugerencias de imágenes. La imagen no es relevante No hay información suficiente para decidir La imagen es ofensiva @@ -1468,13 +1468,18 @@ Informe de problema: función de recomendaciones de imágenes He tenido un problema con la función de recomendación de imagen:\n- [Describe el problema en concreto]\n\nEl resultado que me gustaría ver es:\n- [Describe la solución propuesta] ¿Donar con Google Pay? + Donar con Google Pay o elegir otro método de pago. Donar con Google Pay Otro método de pago + Seleccionar cantidad + Agregaré generosamente %s para cubrir las tarifas de transacción para que puedas conservar el 100%% de mi donación. Hacer de esta una donación mensual periódica. + Sí, la Fundación Wikimedia puede enviarme un correo electrónico ocasional. Por favor elegir una cantidad (mínimo %s) No podemos aceptar donaciones superiores a %s a través de nuestra aplicación. Contacte a nuestro personal de donaciones importantes en benefactors@wikimedia.org. <b>¡Gracias!</b> Su generosidad con Wikipedia significa mucho para nosotros. ¿Problemas para donar? + Otras maneras de donar Preguntas frecuentes Información sobre desgravación de impuestos Mapa diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index bf2b4b25695..74b1ba25be3 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1452,6 +1452,7 @@ अस्वीकार करें मामूली बग फिक्स और सुधार वापस जाएँ + राशि चुनें स्थानों मैप पर अपना लोकेशन देखने के लिए लोकेशन परमिशन की आवश्यकता है। कृपया दोबारा प्रयास करें। স্থানগুলি অনুসন্ধান করুন diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 99061b3958f..db97e2e3e03 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -463,6 +463,8 @@ Personalizza la barra degli strumenti Puoi contattare un\'<a href=\"https://it.wikipedia.org/wiki/Wikipedia:Amministratori\">amministratore</a> per discutere del blocco. Non hai effettuato l\'accesso + Capito + Stai utilizzando un\'utenza temporanea Termina la sessione Errore dell\'applicazione Spiacenti, si è verificato un errore nell\'applicazione Wikipedia ed è stata terminata.\n\nVuoi riavviarla o uscire? @@ -654,6 +656,7 @@ Esporta Scegli il file da importare Seleziona l\'elenco o gli elenchi da esportare + Elenco di lettura esportato Elenco condiviso Salva Salva elenco @@ -1096,6 +1099,7 @@ Non sono sicuro Motivo del rifiuto L\'immagine non è rilevante + Non dispongo di ababstanza informazioni per decidere L\'immagine è offensiva L\'immagine è di bassa qualità Non conosco questo argomento @@ -1253,6 +1257,7 @@ Discussione: %s Nuovo argomento Argomento pubblicato. + Salvare le modifiche? Salva come nuovo messaggio Titolo del messaggio Pubblica @@ -1504,11 +1509,15 @@ Registrato Contributori che hanno effettuato l\'accesso. Nuovi utenti + Principianti Contributi automatici Bot + Umani (non bot) Modifiche minori Modifiche non minori Molto probabilmente buona + Potrebbe avere problemi + Probabilmente ha problemi Molto probabilmente ha problemi Probabile in malafede Molto probabilmente in mala fede diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml index 76e0627c377..900d69d5444 100644 --- a/app/src/main/res/values-krc/strings.xml +++ b/app/src/main/res/values-krc/strings.xml @@ -1,5 +1,6 @@ @@ -149,7 +150,7 @@ Системагъа кириледи... Авторизация тыйыншлы ётдю! Паролунгу сал - Кёзюулю пароль бла кирдигиз. Кириуню тамамлар ючюн, былайда джангы пароль салыгъыз. + Кёзюулю пароль бла кирдигиз. Кириуню тамамлар ючюн, тилейбиз, былайда джангы пароль салыгъыз. Джангы пароль Сакъла эмда кир Чыкъ @@ -468,7 +469,7 @@ Тюзетиу Окъууну фокус режими Тюзетиу энчиликлени эмда скроллингде адыр панелни джашырады - Синтаксисни джарыкъ бла чертиу + Синтаксисни джарыкъ чертиу Тизгин номерлени кёргюз Монобошлукълу шрифтны хайырлан Джазыу теджеулени кёргюз @@ -625,14 +626,14 @@ ОК Кетер Окъуу тизме: %s - Окъургъа тизме(ле) экспорт болду + Окъуу тизме(ле) экспорт болду %d Окъуу тимзе/тизмеле \'reading_lists export.json\' болуб эндирилгенле папкагъа экспорт этилди Окъуу тизмеле \'reading_lists_export.json\' болуб экспорт этилди Эспорт эт Импорт этиллик файлны сайла - Окъургъа тизме импорт болалмады + Окъуу тизме импорт болалмады Эспорт этиллик тизмени/тизмелени сайла - Окъургъа тизме(ле) экспорт болду + Окъуу тизме(ле) экспорт болду Окъуу тизме экспорт джетишимсиз болду Окъуу тизме экспорт джетишимсиз болду @@ -738,7 +739,7 @@ Сюзюу бетдеден келген билдируле эмда джууабла Электрон мектуб алынды Ким эсе да сизге викини юсю бла электрон мектуб джиберди - Хайырланыучу хакъ тюрлениуле + Хайырланыучу хакълада тюрлениуле Хайырланыучу хакъларыгъыз тюрленсе алыныр Къурагъан статьяларыгъызгъа джибериуле Къурагъан бетге джангы джибериу этилсе алыныр @@ -794,7 +795,7 @@ Картчыкъны тиллерин тюзет Аслам сайлам Викигёзенни сайланнган суратлары - Тинт + Аула Баш бет Картчыкъны белгичиги Джангылыкълада @@ -1075,7 +1076,7 @@ %d символ къошдугъуз Статья суратла - Ангылашаллыгъын ёздюрюр ючюн, Википедияны статьяларына теджелген суратланы къошугъуз. + Ангылашаллыгъын ёсдюрюр ючюн, Википедияны статьяларына теджелген суратланы къошугъуз. Бу суратны статьягъа къошармы эдигиз? Юретиучю Хоу @@ -1097,7 +1098,7 @@ Суратла, Википедия хайырланнган эркин лицензиялы сурат коллекция Викигёзенден алыныр. Темасын ангылар ючюн бу статьяны тинтигиз Суратны эмда байламлы информацияны тинтигиз - Суратны, окъуучуланы бу теманы андан да иги ангыларларына болушлукъ болуб болмагъанына оноу этигиз. + Суратны, окъуучуланы бу теманы андан да иги ангыларларына болушлукъ болуб болмагъанына оноу этигиз Эндиги Темасын ангылар ючюн, тилейбиз, статьягъа джангыдан кёз джетдиригиз эмда суратны тинтигиз Кечериксиз, бусагъатда башха теджелген сурат джокъду. Тилейбиз <a href=\"#\">теджелген башха тюзетиулени</a> тинтигиз неда кечирек кери къайтыгъыз. @@ -1294,7 +1295,7 @@ Басмаланыу датасы Джангыртыу датасы Теманы аты - Чыгъаргъа излегенигзге таукелмисиз? + Чыгъаргъа излегенигзге ишексизмисиз? Тема бла текстни ичи сакъланныкъ тюлдюле. Джууабны кёргюз @@ -1468,7 +1469,7 @@ Окъургъа тизме сизни бла юлешиннгенди Сизни бла окъургъа тизмени юлешгенлерин эследик. Программада тизмеге къарар ючюн, ал билдириуге къайтыгъыз эмда джибериуге джангыдан басыгъыз. Англашынды - Окъургъа тизме импорт болду + Окъуу тизме импорт болду Ортагъа салыргъа... Бу окъургъа тизмени башхала бла арагъа сал Салам! Мен кесими окъургъа тизмеми сизге джаяргъа излей эдим: diff --git a/app/src/main/res/values-mhr/strings.xml b/app/src/main/res/values-mhr/strings.xml index debdc10e73a..dde672778b2 100644 --- a/app/src/main/res/values-mhr/strings.xml +++ b/app/src/main/res/values-mhr/strings.xml @@ -162,6 +162,7 @@ Чараш Аккаунт йоммаш Аккаунт йоммо нерген палдарымаш + Йоммаш — тиде <b>пытартыш йӧн</b> , да тудым кӱлеш <b> кучылташ тунам гына, кунам тый тӧрлатымым чарнынет </b> , тыгак шукырак тошто ассоциаций-влакым шылтынет.<br/><br/> Википедийыште аккаунтетым кораҥдашлан аккаунтын лӱмжым вашталташ кӱлеш, тыге моло-влак тиде пашаште, кудыжо аккаунт йоммаш маналтеш, тыйын надырет огыт уж. <b>Йоммаш тичмаш лӱмдымылыкым ок пу, тыгак проектысе надырым ок кораҥде</b> . Шукерте огыл ончен лекме статья уке Тыште тыйын лудмо статья-влакым эскере. Эртылыкысе южо велыж-влак офлайн шот дене логалдыме лийын кертыт. @@ -186,12 +187,14 @@ Аккаунтым ыштен кертме огыл Умбакыже Аккаунтым электрон почто деч посна ышташ? + Электрон почто тыманмеш ок кӱл гынат, тудо<b>пеш чот темлалтеш</b>, вет тудо парольым йомдаренат гын, аккаунтым пӧртылташ кӱлеш. Электрон почто аккаунтым пӧртылташ кучылталтеш, сандене темлалтеш. Электрон почто деч посна шуяш Электрон почто адресым ешараш Аккаунтым ышташ «%s» ушнышо лӱм лийын кертдыме. Порылий, вес лӱмым ончыкто. Вуеш ит нал, у ушнышо лӱмым ышташлан тыйын IP-адресетым петырыме. + https://ru.wikipedia.org/wiki/Полыш: Мый_чарыме_лийынам Кумданрак Чумыр Аккаунт @@ -203,7 +206,10 @@ Экспериментлык Лудмо спискым ик шотыш кондымаш Лудашлан спсике гыч статья-влакым тулен налаш + Шке Википедий аккаунтыштет арален тӱрлӧ арверлаште лудшаш списке-влакым ик шотыш кондо + Шке аккаунтыштет арален, тӱрлӧ арверлаште лудшаш списке-влакым ик шотыш кондо\"%s\" %s гыч ик шотыш кондымо лудмо списке влакым кораҥгдаш? + Тиде кораҥдыме аралтыш вер гыч ик шотыш кондымо лудшаш списке-влак кораҥдыме дек конгда. Чыла ик шотыш кондымо списке-влакым тыйын \"%s\" аккаунт гыч кораҥдаш? Тӧрсыр лекме нерген отчётым колтедылаш Чарыме домен-влаклан (%s) кылверлам мумо. Поро лий, нуным кораҥде да угыч тӧчен ончо. Фильтрын историйже @@ -215,6 +221,7 @@ Чаманыман, кызытсе жаплан тиде велыжым лӱмдымын тӧрлатылаш огеш лий. Тиде велыж аралыме Эскерыме спискыш ешараш + Тыланет кӱлшӧ статья-влакын мо лиймыштым эскере. Статьяште вашталтышым ужашлан утыж ден темме менюм темдал да ойыро <b>Эскерыме спискыш ешаре</b>. Келыштарымаш Келыштарымаш «Википедий» приложений нерген @@ -225,8 +232,8 @@ https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ/mhr https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.mhr - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/mhr - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/mhr + https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags Кучылтмо библиотеке-влак Автор-влак <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Командын велыжше</a> @@ -263,6 +270,7 @@ Моло Тыйын велыжым саемдыме вес йӧн-влак Тӧрлатымаште ваштӱкныш + Велыж вес ушнышо дене вашталтыме лийын да тыйын тӧрлымаш денет келшен ок тол. Поро лий, шке тӧрлымаш-влакетым копироватле, пӧртыл да велыжым уэмде, вара тудым угыч тӧрлаташ тӧчен ончо. Шижтарымашым тӧрлаташ Порылий, тӧрлатымаш деч ончыч лудын лек Тӧрлымаш нерген шижтарымашым вигак ончыктылаш @@ -271,6 +279,7 @@ Ондыкше муаш Тиде икымше икгайлык Тиде пытартыш икгайлык + Статьям фон вкладкыште почмо. Тиде йӧрдымӧ тӧрлымаш лийын кертеш. Тый тудым савыктынетак? Тый тиде тӧрлымашым савыктен от керт. Поро лий, пӧртыл да тудым вашталте. Икгайрак велыж-влак @@ -292,12 +301,16 @@ Википедийын ойырен налме велыжше Кечылан ойырен налме велыж: Википедий мучко кычалаш + Википедийыште эн писе кычалмаш йӧн + Википедийын темлыме эн сай статья-влак Нимогай рашлыкым мумо огыл. Альфа-версийлан у уэмдалтмаш уло Тулен налаш манын, темдал Петыраш Сӱретым ончыкташ + Велыжлаште сӱрет пуртымым чӱктыза але чарыза.\nИнтернет ден кылет эркын але тарифный планет иземдыме гын тиде флажокым кораҥде. Wi-Fi дене гына тулен наледылаш + Мобильный данный гоч вераҥдымаш дене келшаш? Кылдалтше статья-влак Тиде статья нерген Файл велыж деке куснаш diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index af3e505fe79..d7824fccf1e 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -768,7 +768,7 @@ Tambah kapsyen ke imej Terjemahkan kapsyen imej Terjemahkan kapsyen ke bahasa lain - Lebih banyak tugas untuk editor berbilang bahasa + Lebih banyak tugas untuk penyunting berbilang bahasa Tugas penterjemahan tersedia jika anda membaca dan menulis dalam lebih dari satu bahasa Wikipedia. Dikunci sehingga anda telah membuat %d suntingan dalam aplikasinya yang disahkan Dikunci sehingga anda telah menyunting %d penerangan tajuk diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 26e002af94b..f3a5e87a811 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1266,7 +1266,7 @@ Compor mensagem A mensagem não pode estar vazia. O assunto não pode estar vazio. - O assunto já existe. Tente um diferente. + O nome do assunto já existe. Tente um diferente. Resposta postada. Desfazer <b>Última edição %1$s</b> por %2$s @@ -1461,7 +1461,7 @@ Crie suas próprias mensagens ou use <uma href=\"#\">mensagem de exemplo</a> para iniciar. Suas mensagens Mensagens exemplo - Use a mensagem exemplo abaixo para personalizar, enviar e salvar suas mensagens. + Use uma mensagem exemplo abaixo para personalizar, enviar e salvar suas mensagens. Aceitar Recusar Mapa diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 6bc3ddff11a..9c1688f6d61 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1667,7 +1667,7 @@ Button that leads to the Google Pay donation screen. Button that leads to the general donation workflow in a web browser. Title for screen where the donation amount is selected. - Label for checkbox that adds the transaction fees to the donation amount. The %s symbol is replaced with the transaction fee amount, which will include the currency symbol. Please preserve the double-percent (100%%) escaping. + Label for checkbox that adds the transaction fees to the donation amount. The %s symbol is replaced with the transaction fee amount, which will include the currency symbol. Label for checkbox that makes the donation into a recurring one. Label for checkbox that indicates consent to receive email communications. Error message shown when the specified donation amount is less than the minimum allowed. The %s symbol is replaced with the minimum amount, which will include the currency symbol. diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 059c1bd6d84..06d7767795f 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -247,6 +247,7 @@ ساریاں ٹیباں محفوظ کرو بلاک آئی ڈی: %s بلاک بحث کرݨ کیتے تساں <a href=\"%2$s\">%1$s</a> or another <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">ایڈمن</a> نال رابطہ کر سڳدے ہو۔ + سمجھ آڳئی ول شروع کرو نکلو بچاؤ @@ -571,6 +572,7 @@ نواں عنوان خبردار منسوخ + محفوظ نہ کرو ڳالھ مہاڑ ورقے تے تے بھُوم ڳوجھی تے مواد کوں ممکن حد تائیں بہتر بݨاوݨ کیتے لوک بحث کریندے ہن۔ وکی پیڈیا برادری نال رل تے کم کرݨ تے رابطے کیتے نواں بحث دا موضوع شامل کرݨ نال شروع کرو۔ جواب (عنوان کائنی) @@ -671,6 +673,7 @@ بچاؤ مٹاؤ سنیہا ہٹاؤ + تہاݙے سنیہے ٹیگاں: %s کوئی وی کائنی ورتݨ آلے دا ورقہ ݙیکھو @@ -681,6 +684,7 @@ ٻوٹ معمولی تبدیلیاں ٻیا سِکھو + ڳالھ مہاڑ فیڈ بیک جمع کرواؤ لکھو diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 83f0c360817..806f589a053 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -127,10 +127,11 @@ Wikipedija v vaših jezikih Objavi spremembe Sprememba objavljena! + Urejanje je objavljeno! Morda bo trajalo nekaj časa, da se spremembe prikažejo. Urejanje neuspešno! Poskusi znova Prekliči - Vaše spremembe še niso bile shranjene. Res želite zapustiti to stran? + Vaše spremembe še niso shranjene. Res želite zapustiti to stran? Zapusti Ostani Kazalo vsebine @@ -169,6 +170,8 @@ Odjavili ste se iz Wikipedije. Ali se želite znova prijaviti? Prijava Prekliči + Izbris računa + Opozorilo o izbrisu računa Ni nedavno ogledanih člankov Tu lahko sledite, kaj ste prebrali. Nekateri članki v zgodovini brez povezave morda ne bodo vidni. @@ -429,6 +432,11 @@ Za pogovor o blokiranju se lahko obrnete na <a href=\"%2$s\">%1$s</a> ali drugega <a href=\"https://sl.wikipedia.org/wiki/Wikipedija:Administratorji\">administratorja</a>. Prilagodite svojo orodno vrstico Za pogovor o blokiranju se lahko obrnete na <a href=\"https://sl.wikipedia.org/wiki/Wikipedija:Administratorji\">administratorja</a>. + Razumem + Uporabljate začasen račun + Zavrzi spremembe in me prijavi + Končaj sejo + S tem se boste odjavili iz svojega začasnega računa. Želite nadaljevati? Napaka aplikacije Žal je prišlo do napake aplikacije Wikipedija, zato je bila prekinjena.\n\nŽelite začeti znova ali aplikacijo zapreti? Začni znova @@ -806,8 +814,8 @@ Odznači vse predmete Filter vikijev Filter tipov - Vsi vikiji - Vse vrste + Vsi vikiji + Vse vrste %s: pogovorna stran Ta funkcija ni na voljo brez internetne povezave. Ker ste prebrali @@ -897,8 +905,8 @@ Glasovni vnos Več o opisih člankov Več o napisih slik - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Besedilo je prekratko. Besedilo se ne sme končati z ločilom. Izogibajte se začenjanju s členi, kot je »ta« ali \"to\". @@ -1138,8 +1146,8 @@ Da Ne Nisem prepričan_a - Zakaj ne? - Vaši odgovori izboljšujej prihodnje predloge. + Razlog za zavrnitev + Vaši odgovori izboljšujejo prihodnje predloge. Slika ni relevantna Ni dovolj informacij za odločitev Slika je žaljiva @@ -1186,6 +1194,8 @@ Vstopite v zajčjo luknjo Wikipedije z neprestanim posodabljanjem vira raziskovanja. <br/> <b>Prilagodite</b> vir svojim zanimanjem – pa naj bodo to zgodovinski dogodki <b>Na današnji dan</b> ali metanje kocke z možnostjo <b>Naključno</b>. Bralni seznami s sinhroniziranjem Ustvarjate lahko bralne sezname člankov, ki jih želite prebrati pozneje, tudi če niste povezani na splet. <br/>Za sinhroniziranje bralnih seznamov se prijavite v svoj račun v Wikipediji. <a href=\"#login\">Pridružite se Wikipediji</a> + Podatki in zasebnost + Menimo, da vam za sodelovanje v gibanju svobodnega znanja ne bi bilo treba posredovati osebnih podatkov. Podatki o uporabi, zbrani za to aplikacijo, so anonimni. Preberite več o naši <a href=\"#privacy\">politiki zasebnosti</a> in <a href=\"#termsOfUse\">pogojih uporabe</a>. Pošiljaj podatke o uporabi Razumem Na vaši napravi smo našli naslednje: @@ -1291,6 +1301,12 @@ Višina točk Vstavi + Iskanje predlog + Vstavi + npr. %s + %s (izbirno) + %s (predlagano) + Več o tem Pomoč Prijavite se / pridružite se Wikipediji Pozdravljeni, %s, ste vedeli, da lahko Wikipedijo ureja vsakdo? @@ -1314,8 +1330,10 @@ Naslov sporočila Objavi Prekliči + Ne shrani Sporočilo je bilo objavljeno na urejevalčevi uporabniški pogovorni strani Sporočilo je shranjeno in objavljeno na urejevalčevi pogovorni strani + Shranjena sporočila Ta pogovorna stran je prazna. Pogovor se začne tukaj Pogovorne strani so namenjene razpravam o tem, kako čim bolj izboljšati vsebino v Wikipediji. Začnite z dodajanjem nove pogovorne teme, da se povežete in sodelujete s skupnostjo Wikipedistov. @@ -1326,6 +1344,7 @@ Sestavite sporočilo Sporočilo ne sme biti prazno. Predmet ne sme biti prazen. + To ime zadeve že obstaja. Poskusite z drugim. Odgovor objavljen. Razveljavi <b>Nazadnje spremenil/a %1$s</b> uporabnik/ca %2$s @@ -1527,7 +1546,7 @@ Zdravo! S tabo želim deliti svoj bralni seznam Wikipedije: Nam lahko pomagate izboljšati možnost »Deli bralne sezname«? »Deli bralne sezname« je preizkusna možnost in potrebujemo vaše povratne informacije, da jo izboljšamo ali odstranimo. - Nimate nobenega shranjenega opozorila. + Za začetek ustvarite lastna sporočila ali uporabite <a href=\"#\">zglede sporočil</a>. Novo sporočilo Tema Sestavi sporočilo @@ -1557,6 +1576,8 @@ Sporočila so izbrisana Naslov ne sme biti prazen. + Vaša sporočila + Zgledi sporočil Iskanje ali filtriranje urejanj Oznake: %s Brez @@ -1632,6 +1653,8 @@ Vidite produktivno urejanje? Zahvalite se uporabniku za njegov prispevek. Opazuj Želite spremljati urejanje člankov? Dodajte jih na svoj spisek nadzorov. Oglejte si ga pod »Več«. + Pogovor + Komunicirajte z drugimi uredniki. Shranite pogosto uporabljena sporočila za pogovorne strani ali uporabljajte predlogo. Razveljavi/vrni Izberite »Razveljavi«, da razveljavite ali vrnete morebitno škodljivo urejanje. Škoda napoveduje, ali urejanje škoduje vikiju. @@ -1642,10 +1665,22 @@ Nevtralno Ne ustreza mi Kako lahko izboljšamo to možnost? + Zgodovina urejanja članka Povratne informacije Pošlji Povratne informacije so poslane. Kadsr koli lahko v razdelku »Težava z možnostjo« tapnete prekrivni meni, da pošljete povratne informacije. + Opozorilo o vandalizmu + Peeizkušanja urejanja + Nepristransko stališče + Samodejni prevod + Opomnik o navzkrižju interesov + Končno opozorilo + Opozorilo o kršitvi avtorskih pravic + Dodajanje povzetkov urejanja + Brez cenzure + Predlog za izboljšanje članka + Uredi Sprejmem Zavrnem Težaev strani @@ -1658,6 +1693,8 @@ Hvala vam, spoštovani darovalec! Vaša velikodušnost pomaga ohranjati uspeh Wikipedije in njenih sestrskih spletnih mest. Nazaj Odprtje v sistemskem brskalniku + Drug način plačila + Izberite znesek Kraji Za ogled vaše lokacije na zemljevidu potrebujete dovoljenje za lokacijo. Prosimo, poskusite znova. Iskanje po krajih @@ -1670,6 +1707,7 @@ Zelo slaba izkušnja Pomagajte izboljšati »Kraje« Kako lahko izboljšamo »Kraje«? + Prekliči Kaj bi želeli, da spremenimo ali izboljšamo? To območje je prazno. Pomanjšaj <a href=\"#\">zemljevid</a>. diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 7c2e0f9ba75..e18c3b5013c 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -184,6 +184,7 @@ 您的维基百科语言 发布更改 编辑已发布! + 编辑已发布!更改可能需要一些时间才能显示。 编辑失败! 重试 取消 @@ -327,6 +328,7 @@ 重做 回退 警告 + 破坏:%s 意图%s %s字节 @@ -484,6 +486,7 @@ 您可以联系<a href=\"%2$s\">%1$s</a>或另一<a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\"></a>来讨论此封禁。 自定义您的工具栏 您可以联系<a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">管理员</a>来讨论此封禁。 + 您尚未登录 应用程序错误 我们很抱歉,维基百科应用发生了一个错误,并已终止。\n\n您要重启还是退出? 重启 @@ -1121,8 +1124,8 @@ 不确定 - 为什么不会呢? - 您的回答有助于改进今后关于图片的建议。 + 拒绝原因 + 拒绝原因采用匿名方式,用于改进今后的图片建议。 图片与条目无关 信息不足,无法决定 图片令人不悦 From 4cf44263c830715b14f5c78785bd2047004e12a6 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Thu, 25 Apr 2024 14:58:29 -0400 Subject: [PATCH 077/626] Make Location permissions not required in manifest. (#4626) --- app/src/main/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9b0ea3f5a27..d7677e4ab57 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,8 +37,8 @@ - - + + @string/wikimedia diff --git a/app/src/main/res/xml/developer_preferences.xml b/app/src/main/res/xml/developer_preferences.xml index 8fd47969af0..674dc147b73 100644 --- a/app/src/main/res/xml/developer_preferences.xml +++ b/app/src/main/res/xml/developer_preferences.xml @@ -463,6 +463,10 @@ android:key="@string/preference_key_places_show_one_time_survey" android:title="Survey status for places feature \n(-1=not initiated, 1=show survey, >1=do not show survey)" /> + + From 8a52045d0785aeac051f7635f1a4b0583769a1a7 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 13 May 2024 14:24:26 +0200 Subject: [PATCH 107/626] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-da/strings.xml | 21 +++ app/src/main/res/values-es/strings.xml | 21 +-- app/src/main/res/values-krc/strings.xml | 8 +- app/src/main/res/values-pt-rBR/strings.xml | 152 ++++++++++++++++++++- app/src/main/res/values-scn/strings.xml | 12 +- 5 files changed, 195 insertions(+), 19 deletions(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c0b19c8964b..1a51bb24c9c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1300,6 +1300,7 @@ Svaret er sendt. Fortryd <b>Redigerede sidst %1$s</b> af %2$s + Tak fordi du bruger diskussionssider. Vil du hjælpe os med at forbedre appen ved at deltage i en undersøgelse? Kom igang Wikipedia - diskussion om emnet \"%s\" Wikipedia - diskussioner på diskussionsside @@ -1442,6 +1443,15 @@ Nye brugere Nulstil Søg eller filtrér overvågningsliste + Filter til overvågningsliste + Ingen resultater. Prøv at fjerne %s for at se mere. + + %d filter + %d filtre + + Forhåndsvis ændring + Opsummer redigering + Hvordan har du forbedret denne side? Dette er en mindre ændring Overvåg denne side Læs mere om redigeringsresuméer @@ -1523,6 +1533,17 @@ Betydning Mindre ændringer Ikke-mindre ændringer + Forudsigelser om bidragskvalitet + Meget sandsynligt god + Meget præcis til at finde næsten alle problemfri redigeringer. + Kan have problemer + Finder de fleste fejlbehæftede eller skadelige redigeringer, men med lavere nøjagtighed. + Har sandsynligvis problemer + Med middel nøjagtighed, fund som del af problemredigeringer. + Har højst sandsynligvis problemer + Meget nøjagtig til at finde de mest åbenlyst fejlbehæftede eller skadelige redigeringer. + Forudsigelser om brugerens hensigter + Højst sandsynligt gjort med gode hensigter %d filter %d filtre diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3e91bc9a3f0..4aa1d1e1c7e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -66,6 +66,7 @@ * Mouse21 * Mynor Archila * No se +* PPenloglou-WMF * Pantareje * Papouten * Pedro Zimmer @@ -945,8 +946,8 @@ Pulse el icono de arrastre para mover el elemento Pulse y arrastre un elemento para reubicarlo Describir artículos - Leyenda de imágenes - Etiqueta de imágenes + Subtitular imágenes + Etiquetar imágenes Revisar descripción de artículo Añadir descripción Editar descripción @@ -1009,7 +1010,7 @@ Añadir Traducir Leyendas de imágenes - Etiquetas de imagen + Etiquetas de imágenes Publicando Publicado Etiquetar las imágenes facilita poderlas encontrar. @@ -1118,7 +1119,7 @@ Añadiste %d carácter Añadiste %d caracteres - Imágenes del artículo + Imágenes de artículos Agrega las imágenes sugeridas a los artículos de Wikipedia para mejorar la comprensión ¿Agregarías esta imagen al artículo? Tutorial @@ -1473,14 +1474,18 @@ Rechazar Informe de problema: función de recomendaciones de imágenes He tenido un problema con la función de recomendación de imagen:\n- [Describe el problema en concreto]\n\nEl resultado que me gustaría ver es:\n- [Describe la solución propuesta] + Volveremos a intentarlo mañana. + ¡Gracias por tu donación! Tu generosidad mantiene viva la Wikipedia y otros proyectos relacionados. + Atrás + Abrir en el navegador del sistema ¿Donar con Google Pay? Donar con Google Pay o elegir otro método de pago. Donar con Google Pay Otro método de pago - Seleccionar cantidad - Agregaré generosamente %s para cubrir las tarifas de transacción para que puedas conservar el 100%% de mi donación. - Hacer de esta una donación mensual periódica. - Sí, la Fundación Wikimedia puede enviarme un correo electrónico ocasional. + Selecciona un importe + Generosamente, acepto añadir %s a la donación para cubrir los gastos bancarios y que Wikimedia reciba el 100 %% de mi donación. + Quiero hacer una donación recurrente. + Sí, acepto que Wikimedia Foundation me envíe correos ocasionalmente. Por favor elegir una cantidad (mínimo %s) No podemos aceptar donaciones superiores a %s a través de nuestra aplicación. Contacte a nuestro personal de donaciones importantes en benefactors@wikimedia.org. <b>¡Gracias!</b> Su generosidad con Wikipedia significa mucho para nosotros. diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml index f9e5edd8a71..7c589ca9794 100644 --- a/app/src/main/res/values-krc/strings.xml +++ b/app/src/main/res/values-krc/strings.xml @@ -125,7 +125,7 @@ Этген тюрлениулеригиз алкъын басмаланмагъанды. Бу бетден кетерге излегенигизге ишексизмисиз? Кет Къал - Ичиндегиси + Ичиндегилени Таблицасы Джукъ да табылмады \"%s\" ичинде эсебле табылмады Окъуу тизмегизде эсебле табылмадыла @@ -704,7 +704,7 @@ Архив этилген хапарландырыуланы кёргюз Хапарландырыу джарашдырыула Окъулмагъанды деб белгиле - Окъулгъанча белгиле + Барсын да окъулгъанды деб белгиле Джууабла %s хайырланыучугъа джууаб джибериле турады… Джууаб басмаланды. @@ -729,7 +729,7 @@ Белгили тюзетиу саннга джетилди Сау болугъуз Ким эсе да тюзетиуюгюз ючюн сизге сау бол деди - Эски халына къайтар + Кери ал Къошумларыгъызны бири кери алынды Кириу Кириу активлигигиз @@ -1428,7 +1428,7 @@ Категория тюрлениуле Викибилгилени тюзетиулери Кюнлюк ишлеуле - Джангы хайырланыучу + Джангы хайырланыучула Ариула Кёздеги тизмени излегиз эмда фильтр этигиз Кёздеги тизме фильтр diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f3a5e87a811..9aa5586f3aa 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -208,6 +208,7 @@ Cancelar Conta abandonada Aviso de conta abandonada + O desaparecimento é um <b>recurso de última instância</b> que <b>só deve ser usado quando pretende parar de editar para sempre</b> e ocultar o máximo possível das suas associações anteriores.\n\nA exclusão de contas na Wikipédia é feita alterando o seu nome de usuário para que as pessoas não possam reconhecer as suas contribuições, em um processo chamado desaparecimento de conta. <b>O desaparecimento não garante o anonimato completo nem remove as participações nos projetos</b>. Nenhum artigo visto recentemente Acompanhe o que você está lendo aqui. Alguns artigos no histórico podem não ser visualizados enquanto estiver off-line. @@ -305,6 +306,9 @@ Desfazer Refazer Reverter + Avisar + Dano %s + Intenção %s um=%s byte @@ -438,6 +442,7 @@ Salvar Salvo Compartilhar + Este artigo é um esboço, o que significa que não há conteúdo suficiente no artigo para gerar uma visualização. No entanto, você pode mudar isso. Esta página não existe A Wikipedia não tem uma <a href=\"%1$s\">página de usuário</a> com este nome exato. Em geral, esta página deve ser criada e editada por <b>%2$s</b>. Em caso de dúvida, verifique se \"%3$s\" existe. Não foi possível conectar-se à Internet @@ -460,6 +465,9 @@ Você pode entrar em contato <a href=\"%2$s\">%1$s</a> ou outro <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administrador</a> para discutir o bloqueio. Personalize sua barra de ferramentas Você pode entrar em contato com um <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administrador</a> para discutir o bloqueio. + Não tem entrado + Entendi + Você está usando uma conta temporária Erro no aplicativo Desculpe-nos, o aplicativo da Wikipédia presenciou um erro e foi finalizado.\n\nGostaria de começar ou sair? Recomeçar @@ -923,6 +931,8 @@ Descrever artigos Imagens de legenda Marcações de imagens + Revisar edições recentes e determinar se são edições construtivas. + Revisar Revisar a descrição do artigo Adicionar descrição Editar descrição @@ -1097,11 +1107,12 @@ Imagem do artigo: Adicione imagens sugeridas aos artigos da Wikipedia para melhorar a compreensão. + Você adicionaria esta imagem ao artigo? Tutorial Sim Não Não tenho certeza - Por que não? + Razão para recusa A imagem não é relevante Não há informações suficientes para decidir A imagem é ofensiva @@ -1109,8 +1120,23 @@ Eu não sei esse assunto Outro Enviar + Adicionar imagens em falta aos artigos das Edições Sugeridas + As imagens ajudam as pessoas a entender melhor, mas muitos artigos não as têm. + Você decidirá se uma imagem sugerida deve ser colocada em um artigo da Wikipédia. + As sugestões são geradas automaticamente e você deverá julgar se deve aceitá-las ou rejeitá-las. As imagens vêm do Wikimedia Commons, uma coleção de imagens licenciadas livremente usadas pela Wikiédia. + Examine este artigo para entender melhor o assunto + Analise a imagem e as informações associadas + Decida se a imagem ajuda os leitores para entender melhor o assunto. Próximo + Examine o artigo para entender melhor o assunto e analise a imagem + Desculpe, neste momento não há mais imagens sugeridas disponíveis. Explore outras <a href=\"#\">edições sugeridas</a> ou volte noutra altura. + Problema com a funcionalidade + Problema com as Edições Sugeridas + Imagem adicionada + Legenda adicionada + Imagem e legenda adicionadas + Ver Página do arquivo Adicionar legenda à imagem Adicionar marcações de imagem @@ -1133,6 +1159,7 @@ Mergulhe no buraco de coelho da Wikipédia com um feed de Explorar em constante atualização. <br/> <b>Customizar</b> Personalize o feed de acordo com seus interesses – seja aprendendo sobre eventos históricos em <b>Neste dia</b>, ou rolando os dados com <b>Aleatório</b>. Listas de leitura com sincronização Você pode criar listas de leitura dos artigos que deseja ler mais tarde, mesmo quando estiver sem acesso à Internet. <br/>Entre na sua conta da Wikipédia para sincronizar as suas listas de leitura. <a href=\"#login\">Junte-se à Wikipédia</a> + Dados e privadade Enviar dados de uso Entendi Encontramos os seguintes no seu dispositivo: @@ -1204,6 +1231,7 @@ Predefinição Referência Pré-visualização de Link + Mencionar um usuário Inserir mídia Selecionar um arquivo do Wikimedia Commons Pesquisar mídia @@ -1233,6 +1261,11 @@ Altura px Inserir + Procurar predefinições + Inserir + %s (Opcional) + %s (Sugerido) + Saiba mais Ajuda Entrar / juntar-se à Wikipédia Olá %s, Você sabia que todos podem editar a Wikipédia? @@ -1248,6 +1281,7 @@ Discussão: %s Novo tópico Tópico postado. + Avisar Salvar alterações? Salvar como uma nova mensagem Salvar como uma nova mensagem na lista @@ -1256,6 +1290,8 @@ Publicar Cancelar Não salve + Mensagem publicada na página de discussão do editor + Mensagem salvada e publicada na página de discussão do editor Esta página de discussão está vazia. A conversa começa aqui É nas páginas de discussão que as pessoas debatem como tornar o conteúdo da Wikipédia o melhor possível. Comece por adicionar um tópico de discussão novo para estabelecer uma ligação e colaborar com uma comunidade de wikipedistas. @@ -1342,8 +1378,10 @@ Linha removida Parágrafo adicionado Parágrafo removido + As alterações feitas nesta revisão não estão publicamente acessíveis. Tem certeza que deseja desfazer esta edição? Desfazer significa reverter os efeitos de uma ou mais edições. + Resumo (opcional) Compartilhar o motivo para a reversão A revisão foi desfeita. Tem certeza de que deseja reverter as edições? @@ -1446,6 +1484,7 @@ Erro na reprodução de multimédia. Contribuições Filtrar contribuições + Ver no mapa Importar lista de leitura compartilhada Como você gostaria de nomear a lista que foi compartilhada com você? *nova* @@ -1459,10 +1498,121 @@ Pode nos ajudar a melhorar \"Compartilhar listas de leitura\"? \"Compartilhar listas de leitura\" é um recurso de teste e precisamos do seu feedback para melhorá-lo ou removê-lo. Crie suas próprias mensagens ou use <uma href=\"#\">mensagem de exemplo</a> para iniciar. + Mensagem nova + Assunto + Compor mensagem + Salvar + Salvar alterações + Adicionar título e salvar mensagem. + Título da mensagem + Salvar + Cancelar + A mensagem foi salvada + Editar mensagem + Salvar + Excluir + A mensagem foi atualizada + Remover mensagem + O título não pode ficar vazio. Suas mensagens Mensagens exemplo + Pesquisar ou filtrar edições + Etiquetas: %s + Nenhum + Ver página de usuário + Ver página de discussão + Informação sobre o usuário + Ver contribuições do usuário + Agradecer + Informação sobre o usuário + <b>Conta desde: </b> %s + <b>Número de edições: </b> %s + Fechar + Filtros + Reiniciar + Wiki + Todos + Registro e experiência do usuário + Não registrados + Editores que não estão autenticados. + Registrados + Editores registrados. + Novatos + Editores registados, que têm menos de 10 edições ou de 4 dias de atividade. + Aprendizes + Editores registados, com mais experiência do que Novatos mas menos do que Utilizadores experientes. + Usuários experientes + Mais de 30 dias de atividade e 500 edições. + Últimas revisões + Revisão atual + Não é a última revisão + Contribuições automatizadas + Robô + Humano (não robô) + Significado + Edições menores + Edições não menores + Previsões de qualidade de contribuição + Muito provavelmente boas + Altamente preciso em encontrar quase todas as edições sem problemas. + Podem ter problemas + Encontra as edições mais erradas ou prejudiciais, mas com menor precisão. + Provavelmente têm problemas + Com precisão média, encontra uma fração intermédia das edições problemáticas. + Muito provavelmente têm problemas + Muito exato em encontrar as edições mais obviamente falhas ou prejudiciais. + Previsões da intenção do usuário + Muito provavelmente de boa fé + Altamente precisa em encontrar quase todas as edições de boa fé. + Podem ser de má fé + Encontra a maioria das edições de má fé, mas com uma menor precisão. + Provavelmente de má fé + Com precisão média, encontra uma fração intermediária de edições de má fé. + Muito provavelmente de má fé + Muito exato em encontrar as edições mais óbvias de má fé. + Tente remover %s para ver mais edições + + %d filtro + %d filtros + + Reversão concluída + Tem a certeza de que deseja desfazer as edições? + Edições desfeitas + Ver + Problema com a funcionalidade + Saiba mais + Contribuir para a supervisão e aprovação das edições da Wikipédia. + Agradecer + Vigiar + Discussão + Desfazer/Reverter + Escolher \'Desfazer\' para desfazer ou reverter uma edição potencialmente destrutiva. + Satisfeito(a) + Neutro(a) + Insatisfeito(a) + Como podemos melhorar a funcionalidade? + Comentários + Enviar + Comentário enviado. Use uma mensagem exemplo abaixo para personalizar, enviar e salvar suas mensagens. + Editar Aceitar Recusar + Problemas da página + Pequenas correções e melhoramentos + Relatório de problema - Funcionalidade \"Recomendações de Imagens\" + Encontrei um problema com a funcionalidade \"Recomendações de imagens\":\n- [Descrever o problema específico]\n\nO comportamento que gostaria de ver é:\n- [Descrever a solução proposta] + Relatório de problema - Funcionalidade \"Patrulha de edições\" + Encontrei um problema com a funcionalidade \"Patrulha de edições\":\n- [Descrever o problema específico]\n\nO comportamento que gostaria de ver é:\n- [Descrever a solução proposta]\n\n[Capturas de ecrã ou hiperligações] + Iremos lembrá-lo novamente amanhã. + Voltar + Lugares + É necessária a permissão de localização para ver a sua localização no mapa. Tente novamente, por favor. + Procurar lugares + Filtrar por idioma Mapa + Lista + Muito satisfeito + Muito insatisfeito + Cancelar diff --git a/app/src/main/res/values-scn/strings.xml b/app/src/main/res/values-scn/strings.xml index 0a0ec28fd24..92f261bd6a9 100644 --- a/app/src/main/res/values-scn/strings.xml +++ b/app/src/main/res/values-scn/strings.xml @@ -108,7 +108,7 @@ Lingui di Wikipedia Risciduta Sta pàggina nun è dispunìbbili n àutri lingui. - Nudda lingua attruvata + Nuḍḍa lingua attruvata Àutri lingui Li tò lingui di Wikipedia Pùbbrica li canciamenti @@ -120,10 +120,10 @@ Lassa Arresta Ìnnici - Nuddu risurtatu attruvatu - Nuddu risurtatu attruvatu n \"%s\" - Nuddu risurtatu attruvatu nti l\'elenchi di littura - Nuddu risurtatu attruvatu ntâ crunuluggìa + Nuḍḍu risurtatu attruvatu + Nuḍḍu risurtatu attruvatu n \"%s\" + Nuḍḍu risurtatu attruvatu nti l\'elenchi di littura + Nuḍḍu risurtatu attruvatu ntâ crunuluggìa P\'aiutari a cummàttiri lu spam autumàticu, nzirisci pi favuri li palori chi cumpàrunu sutta Nun arrinesci a taliari la mmàggini? <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Request_an_account\">Richiedi nu cuntu</a> Arripeti li palori di supra @@ -197,7 +197,7 @@ Annulla Àutru Pàggini sìmili - Nuddu risurtatu + Nuḍḍu risurtatu 1 risurtatu %d risurtati From e7c5ecfb421463fb7717472f34d2a1a56bc06ca1 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 14 May 2024 11:45:55 -0400 Subject: [PATCH 108/626] Update list of codeowners. (#4662) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e9136bb4b92..02a644fb13b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,4 +3,4 @@ # For more information: https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners -* @cooltey @dbrant @sharvaniharan +* @cooltey @dbrant From 28d7c38d8a3448660e4b33d97d2b61eab671de52 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 14 May 2024 13:00:26 -0400 Subject: [PATCH 109/626] Follow-up to Google Pay integration (#4661) * Calculate maximum based on proportion of minimum, if unavailable. * Invalidate campaign when taking actions in DonateDialog. --------- Co-authored-by: Cooltey Feng --- .../org/wikipedia/donate/GooglePayActivity.kt | 4 ++-- .../org/wikipedia/donate/GooglePayComponent.kt | 1 + .../org/wikipedia/donate/GooglePayViewModel.kt | 16 +++++++++++++++- .../java/org/wikipedia/donate/DonateDialog.kt | 9 +++++++++ .../wikipedia/page/campaign/CampaignDialog.kt | 3 ++- 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt index 988401ca5de..fe81b64d467 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt @@ -155,8 +155,8 @@ class GooglePayActivity : BaseActivity() { private fun validateInput(text: String): Boolean { val amount = getAmountFloat(text) - val min = viewModel.donationConfig?.currencyMinimumDonation?.get(viewModel.currencyCode) ?: 0f - val max = viewModel.donationConfig?.currencyMaximumDonation?.get(viewModel.currencyCode) ?: 0f + val min = viewModel.minimumAmount + val max = viewModel.maximumAmount if (amount <= 0f || amount < min) { binding.donateAmountInput.error = getString(R.string.donate_gpay_minimum_amount, viewModel.currencyFormat.format(min)) diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt index 9fd5aee1edb..4ee7f390ccc 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt @@ -16,6 +16,7 @@ internal object GooglePayComponent { const val PAYMENTS_API_URL = "https://payments.wikimedia.org/" const val PAYMENT_METHOD_NAME = "paywithgoogle" + const val CURRENCY_FALLBACK = "USD" private val CURRENCIES_THREE_DECIMAL = arrayOf("BHD", "CLF", "IQD", "KWD", "LYD", "MGA", "MRO", "OMR", "TND") private val CURRENCIES_NO_DECIMAL = arrayOf("CLP", "DJF", "IDR", "JPY", "KMF", "KRW", "MGA", "PYG", "VND", "XAF", "XOF", "XPF") diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt index b0189956130..c4777cadf78 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt @@ -32,13 +32,27 @@ class GooglePayViewModel : ViewModel() { val currencyFormat: NumberFormat = NumberFormat.getCurrencyInstance(Locale.Builder() .setRegion(currentCountryCode).setLanguage(WikipediaApp.instance.appOrSystemLanguageCode).build()) - val currencyCode get() = currencyFormat.currency?.currencyCode ?: "USD" + val currencyCode get() = currencyFormat.currency?.currencyCode ?: GooglePayComponent.CURRENCY_FALLBACK val currencySymbol get() = currencyFormat.currency?.symbol ?: "$" val decimalFormat = GooglePayComponent.getDecimalFormat(currencyCode) val transactionFee get() = donationConfig?.currencyTransactionFees?.get(currencyCode) ?: donationConfig?.currencyTransactionFees?.get("default") ?: 0f + val minimumAmount get() = donationConfig?.currencyMinimumDonation?.get(currencyCode) ?: 0f + + val maximumAmount: Float get() { + var max = donationConfig?.currencyMaximumDonation?.get(currencyCode) ?: 0f + if (max == 0f) { + val defaultMin = donationConfig?.currencyMinimumDonation?.get(GooglePayComponent.CURRENCY_FALLBACK) ?: 0f + if (defaultMin > 0f) { + max = (donationConfig?.currencyMinimumDonation?.get(currencyCode) ?: 0f) / defaultMin * + (donationConfig?.currencyMaximumDonation?.get(GooglePayComponent.CURRENCY_FALLBACK) ?: 0f) + } + } + return max + } + val emailOptInRequired get() = donationConfig?.countryCodeEmailOptInRequired.orEmpty().contains(currentCountryCode) var finalAmount = 0f diff --git a/app/src/main/java/org/wikipedia/donate/DonateDialog.kt b/app/src/main/java/org/wikipedia/donate/DonateDialog.kt index 2de930b1468..c438dbf0807 100644 --- a/app/src/main/java/org/wikipedia/donate/DonateDialog.kt +++ b/app/src/main/java/org/wikipedia/donate/DonateDialog.kt @@ -19,6 +19,7 @@ import org.wikipedia.activity.BaseActivity import org.wikipedia.analytics.eventplatform.DonorExperienceEvent import org.wikipedia.databinding.DialogDonateBinding import org.wikipedia.page.ExtendedBottomSheetDialogFragment +import org.wikipedia.settings.Prefs import org.wikipedia.util.CustomTabsUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.Resource @@ -38,6 +39,7 @@ class DonateDialog : ExtendedBottomSheetDialogFragment() { } binding.donateGooglePayButton.setOnClickListener { + invalidateCampaign() DonorExperienceEvent.logAction("gpay_click", if (arguments?.getString(ARG_CAMPAIGN_ID).isNullOrEmpty()) "setting" else "article_banner") (requireActivity() as? BaseActivity)?.launchDonateActivity( GooglePayComponent.getDonateActivityIntent(requireActivity(), arguments?.getString(ARG_CAMPAIGN_ID), arguments?.getString(ARG_DONATE_URL))) @@ -81,9 +83,16 @@ class DonateDialog : ExtendedBottomSheetDialogFragment() { private fun onDonateClicked() { launchDonateLink(requireContext(), arguments?.getString(ARG_DONATE_URL)) + invalidateCampaign() dismiss() } + private fun invalidateCampaign() { + arguments?.getString(ARG_CAMPAIGN_ID)?.let { + Prefs.announcementShownDialogs = setOf(it) + } + } + companion object { const val ARG_CAMPAIGN_ID = "campaignId" const val ARG_DONATE_URL = "donateUrl" diff --git a/app/src/main/java/org/wikipedia/page/campaign/CampaignDialog.kt b/app/src/main/java/org/wikipedia/page/campaign/CampaignDialog.kt index a23cb6d86db..ac869b05017 100644 --- a/app/src/main/java/org/wikipedia/page/campaign/CampaignDialog.kt +++ b/app/src/main/java/org/wikipedia/page/campaign/CampaignDialog.kt @@ -48,10 +48,11 @@ class CampaignDialog internal constructor(private val context: Context, val camp val customTabUrl = Prefs.announcementCustomTabTestUrl.orEmpty().ifEmpty { url } if (context is BaseActivity) { context.launchDonateDialog(campaign.id, customTabUrl) + dismissDialog(false) } else { CustomTabsUtil.openInCustomTab(context, customTabUrl) + dismissDialog() } - dismissDialog() } override fun onNegativeAction() { From f7d8aa7c8175351c60ad3fa6cb60dbdf23d49b80 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 14 May 2024 13:17:46 -0400 Subject: [PATCH 110/626] Improve integration with Metrics Platform library lifecycle. (#4663) * Improve integration with Metrics Platform library lifecycle. * Use BaseActivity lifecycle. --------- Co-authored-by: Cooltey Feng --- .../main/java/org/wikipedia/ActivityLifecycleHandler.kt | 7 +------ app/src/main/java/org/wikipedia/activity/BaseActivity.kt | 9 +++++++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/wikipedia/ActivityLifecycleHandler.kt b/app/src/main/java/org/wikipedia/ActivityLifecycleHandler.kt index b20a63a550f..620d671cb03 100644 --- a/app/src/main/java/org/wikipedia/ActivityLifecycleHandler.kt +++ b/app/src/main/java/org/wikipedia/ActivityLifecycleHandler.kt @@ -6,7 +6,6 @@ import android.content.ComponentCallbacks2 import android.content.res.Configuration import android.os.Build import android.os.Bundle -import org.wikipedia.analytics.eventplatform.EventPlatformClient import org.wikipedia.main.MainActivity import org.wikipedia.settings.Prefs import org.wikipedia.theme.Theme @@ -66,9 +65,5 @@ class ActivityLifecycleHandler : ActivityLifecycleCallbacks, ComponentCallbacks2 override fun onLowMemory() {} - override fun onTrimMemory(trimMemoryType: Int) { - if (trimMemoryType == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { - EventPlatformClient.flushCachedEvents() - } - } + override fun onTrimMemory(trimMemoryType: Int) {} } diff --git a/app/src/main/java/org/wikipedia/activity/BaseActivity.kt b/app/src/main/java/org/wikipedia/activity/BaseActivity.kt index 25eda22bbf1..21b859c558a 100644 --- a/app/src/main/java/org/wikipedia/activity/BaseActivity.kt +++ b/app/src/main/java/org/wikipedia/activity/BaseActivity.kt @@ -21,7 +21,9 @@ import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.analytics.BreadcrumbsContextHelper import org.wikipedia.analytics.eventplatform.BreadCrumbLogEvent +import org.wikipedia.analytics.eventplatform.EventPlatformClient import org.wikipedia.analytics.eventplatform.NotificationInteractionEvent +import org.wikipedia.analytics.metricsplatform.MetricsPlatform import org.wikipedia.appshortcuts.AppShortcuts import org.wikipedia.auth.AccountUtil import org.wikipedia.connectivity.ConnectionStateMonitor @@ -119,14 +121,17 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba super.onDestroy() } - override fun onStop() { + override fun onPause() { + super.onPause() WikipediaApp.instance.appSessionEvent.persistSession() - super.onStop() + MetricsPlatform.client.onAppPause() + EventPlatformClient.flushCachedEvents() } override fun onResume() { super.onResume() WikipediaApp.instance.appSessionEvent.touchSession() + MetricsPlatform.client.onAppResume() BreadCrumbLogEvent.logScreenShown(this) // allow this activity's exclusive bus methods to override any existing ones. From 317701606108250e4947a719c0d1573c3e21fedc Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 14 May 2024 13:43:47 -0400 Subject: [PATCH 111/626] Bump versionCode. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9774efbe739..5960d6e53d0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50485 + versionCode 50486 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From e55e58b7e5cc345f71e6a310ec47e31fdbd381b4 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 14 May 2024 16:09:07 -0700 Subject: [PATCH 112/626] Convert GeoIPCookie and its test case to Kotlin (#4659) * Convert GeoIPCookie and its test case to Kotlin * Use val instead of functions * Lint fix --- .../feed/announcement/GeoIPCookie.java | 41 ------------ .../feed/announcement/GeoIPCookie.kt | 10 +++ .../main/java/org/wikipedia/util/GeoUtil.kt | 2 +- .../GeoIPCookieUnmarshallerTest.java | 63 ------------------ .../GeoIPCookieUnmarshallerTest.kt | 65 +++++++++++++++++++ 5 files changed, 76 insertions(+), 105 deletions(-) delete mode 100644 app/src/main/java/org/wikipedia/feed/announcement/GeoIPCookie.java create mode 100644 app/src/main/java/org/wikipedia/feed/announcement/GeoIPCookie.kt delete mode 100644 app/src/test/java/org/wikipedia/feed/announcement/GeoIPCookieUnmarshallerTest.java create mode 100644 app/src/test/java/org/wikipedia/feed/announcement/GeoIPCookieUnmarshallerTest.kt diff --git a/app/src/main/java/org/wikipedia/feed/announcement/GeoIPCookie.java b/app/src/main/java/org/wikipedia/feed/announcement/GeoIPCookie.java deleted file mode 100644 index 48088eb54a4..00000000000 --- a/app/src/main/java/org/wikipedia/feed/announcement/GeoIPCookie.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.wikipedia.feed.announcement; - -import android.location.Location; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -public class GeoIPCookie { - - @NonNull private final String country; - @NonNull private final String region; - @NonNull private final String city; - @Nullable private final Location location; - - GeoIPCookie(@NonNull String country, @NonNull String region, @NonNull String city, @Nullable Location location) { - this.country = country; - this.region = region; - this.city = city; - this.location = location; - } - - @NonNull - public String country() { - return country; - } - - @NonNull - public String region() { - return region; - } - - @NonNull - public String city() { - return city; - } - - @Nullable - public Location location() { - return location; - } -} diff --git a/app/src/main/java/org/wikipedia/feed/announcement/GeoIPCookie.kt b/app/src/main/java/org/wikipedia/feed/announcement/GeoIPCookie.kt new file mode 100644 index 00000000000..d45006ab10e --- /dev/null +++ b/app/src/main/java/org/wikipedia/feed/announcement/GeoIPCookie.kt @@ -0,0 +1,10 @@ +package org.wikipedia.feed.announcement + +import android.location.Location + +class GeoIPCookie( + val country: String, + val region: String, + val city: String, + val location: Location? +) diff --git a/app/src/main/java/org/wikipedia/util/GeoUtil.kt b/app/src/main/java/org/wikipedia/util/GeoUtil.kt index 98a97a6a7aa..971c9c3cccc 100644 --- a/app/src/main/java/org/wikipedia/util/GeoUtil.kt +++ b/app/src/main/java/org/wikipedia/util/GeoUtil.kt @@ -33,7 +33,7 @@ object GeoUtil { if (!Prefs.geoIPCountryOverride.isNullOrEmpty()) { Prefs.geoIPCountryOverride } else { - GeoIPCookieUnmarshaller.unmarshal().country() + GeoIPCookieUnmarshaller.unmarshal().country } } catch (e: IllegalArgumentException) { // For our purposes, don't care about malformations in the GeoIP cookie for now. diff --git a/app/src/test/java/org/wikipedia/feed/announcement/GeoIPCookieUnmarshallerTest.java b/app/src/test/java/org/wikipedia/feed/announcement/GeoIPCookieUnmarshallerTest.java deleted file mode 100644 index af35b1f2ede..00000000000 --- a/app/src/test/java/org/wikipedia/feed/announcement/GeoIPCookieUnmarshallerTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.wikipedia.feed.announcement; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.nullValue; - -@RunWith(RobolectricTestRunner.class) -public class GeoIPCookieUnmarshallerTest { - - private static final double LATITUDE = 37.33; - private static final double LONGITUDE = -121.89; - - @Test public void testGeoIPWithLocation() { - GeoIPCookie cookie = GeoIPCookieUnmarshaller.INSTANCE.unmarshal("US:California:San Francisco:" + LATITUDE + ":" + LONGITUDE + ":v4"); - assertThat(cookie.country(), is("US")); - assertThat(cookie.region(), is("California")); - assertThat(cookie.city(), is("San Francisco")); - assertThat(cookie.location(), is(notNullValue())); - assertThat(cookie.location().getLatitude(), is(LATITUDE)); - assertThat(cookie.location().getLongitude(), is(LONGITUDE)); - } - - @Test public void testGeoIPWithoutLocation() { - GeoIPCookie cookie = GeoIPCookieUnmarshaller.INSTANCE.unmarshal("FR::Paris:::v4"); - assertThat(cookie.country(), is("FR")); - assertThat(cookie.region(), is("")); - assertThat(cookie.city(), is("Paris")); - assertThat(cookie.location(), is(nullValue())); - } - - @Test public void testGeoIPEmpty() { - GeoIPCookie cookie = GeoIPCookieUnmarshaller.INSTANCE.unmarshal(":::::v4"); - assertThat(cookie.country(), is("")); - assertThat(cookie.region(), is("")); - assertThat(cookie.city(), is("")); - assertThat(cookie.location(), is(nullValue())); - } - - @Test(expected = IllegalArgumentException.class) - public void testGeoIPWrongVersion() { - GeoIPCookieUnmarshaller.INSTANCE.unmarshal("RU::Moscow:1:2:v5"); - } - - @Test(expected = IllegalArgumentException.class) - public void testGeoIPWrongParamCount() { - GeoIPCookieUnmarshaller.INSTANCE.unmarshal("CA:Toronto:v4"); - } - - @Test(expected = IllegalArgumentException.class) - public void testGeoIPMalformed() { - GeoIPCookieUnmarshaller.INSTANCE.unmarshal("foo"); - } - - @Test(expected = IllegalArgumentException.class) - public void testGeoIPWithBadLocation() { - GeoIPCookieUnmarshaller.INSTANCE.unmarshal("US:California:San Francisco:foo:bar:v4"); - } -} diff --git a/app/src/test/java/org/wikipedia/feed/announcement/GeoIPCookieUnmarshallerTest.kt b/app/src/test/java/org/wikipedia/feed/announcement/GeoIPCookieUnmarshallerTest.kt new file mode 100644 index 00000000000..ece70f2aaea --- /dev/null +++ b/app/src/test/java/org/wikipedia/feed/announcement/GeoIPCookieUnmarshallerTest.kt @@ -0,0 +1,65 @@ +package org.wikipedia.feed.announcement + +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.wikipedia.feed.announcement.GeoIPCookieUnmarshaller.unmarshal + +@RunWith(RobolectricTestRunner::class) +class GeoIPCookieUnmarshallerTest { + @Test + fun testGeoIPWithLocation() { + val cookie = unmarshal("US:California:San Francisco:$LATITUDE:$LONGITUDE:v4") + MatcherAssert.assertThat(cookie.country, Matchers.`is`("US")) + MatcherAssert.assertThat(cookie.region, Matchers.`is`("California")) + MatcherAssert.assertThat(cookie.city, Matchers.`is`("San Francisco")) + MatcherAssert.assertThat(cookie.location, Matchers.`is`(Matchers.notNullValue())) + MatcherAssert.assertThat(cookie.location?.latitude, Matchers.`is`(LATITUDE)) + MatcherAssert.assertThat(cookie.location?.longitude, Matchers.`is`(LONGITUDE)) + } + + @Test + fun testGeoIPWithoutLocation() { + val cookie = unmarshal("FR::Paris:::v4") + MatcherAssert.assertThat(cookie.country, Matchers.`is`("FR")) + MatcherAssert.assertThat(cookie.region, Matchers.`is`("")) + MatcherAssert.assertThat(cookie.city, Matchers.`is`("Paris")) + MatcherAssert.assertThat(cookie.location, Matchers.`is`(Matchers.nullValue())) + } + + @Test + fun testGeoIPEmpty() { + val cookie = unmarshal(":::::v4") + MatcherAssert.assertThat(cookie.country, Matchers.`is`("")) + MatcherAssert.assertThat(cookie.region, Matchers.`is`("")) + MatcherAssert.assertThat(cookie.city, Matchers.`is`("")) + MatcherAssert.assertThat(cookie.location, Matchers.`is`(Matchers.nullValue())) + } + + @Test(expected = IllegalArgumentException::class) + fun testGeoIPWrongVersion() { + unmarshal("RU::Moscow:1:2:v5") + } + + @Test(expected = IllegalArgumentException::class) + fun testGeoIPWrongParamCount() { + unmarshal("CA:Toronto:v4") + } + + @Test(expected = IllegalArgumentException::class) + fun testGeoIPMalformed() { + unmarshal("foo") + } + + @Test(expected = IllegalArgumentException::class) + fun testGeoIPWithBadLocation() { + unmarshal("US:California:San Francisco:foo:bar:v4") + } + + companion object { + private const val LATITUDE = 37.33 + private const val LONGITUDE = -121.89 + } +} From b6613eb7d7d521d540ee6cbfa6b44981be61d8be Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 15 May 2024 06:32:09 -0700 Subject: [PATCH 113/626] Language test cases updates (#4666) * Update language test cases * Optimize --- .../language/AppLanguageStateTests.java | 53 ---- .../language/AppLanguageStateTests.kt | 54 ++++ .../wikipedia/language/LanguageUtilTest.java | 101 ------- .../wikipedia/language/LanguageUtilTest.kt | 45 +++ .../wikipedia/language/TranslationTests.java | 269 ------------------ .../wikipedia/language/TranslationTests.kt | 263 +++++++++++++++++ 6 files changed, 362 insertions(+), 423 deletions(-) delete mode 100644 app/src/test/java/org/wikipedia/language/AppLanguageStateTests.java create mode 100644 app/src/test/java/org/wikipedia/language/AppLanguageStateTests.kt delete mode 100644 app/src/test/java/org/wikipedia/language/LanguageUtilTest.java create mode 100644 app/src/test/java/org/wikipedia/language/LanguageUtilTest.kt delete mode 100644 app/src/test/java/org/wikipedia/language/TranslationTests.java create mode 100644 app/src/test/java/org/wikipedia/language/TranslationTests.kt diff --git a/app/src/test/java/org/wikipedia/language/AppLanguageStateTests.java b/app/src/test/java/org/wikipedia/language/AppLanguageStateTests.java deleted file mode 100644 index 4525f0e60b6..00000000000 --- a/app/src/test/java/org/wikipedia/language/AppLanguageStateTests.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.wikipedia.language; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.wikipedia.WikipediaApp; - -import java.util.ArrayList; -import java.util.List; - -@RunWith(RobolectricTestRunner.class) -public class AppLanguageStateTests { - - @Test public void testInitAppLanguages() { - Assert.assertEquals("en", WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCode()); - } - - @Test public void testAddAppLanguage() { - WikipediaApp.Companion.getInstance().getLanguageState().addAppLanguageCode("ja"); - Assert.assertEquals("en", WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCode()); - Assert.assertEquals(2, WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCodes().size()); - Assert.assertEquals("ja", WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCodes().get(1)); - } - - @SuppressWarnings("checkstyle:magicnumber") - @Test public void testAddMultipleAppLanguages() { - List list = new ArrayList<>(); - list.add("en"); - list.add("ja"); - list.add("es"); - list.add("zh-hant"); - WikipediaApp.Companion.getInstance().getLanguageState().setAppLanguageCodes(list); - Assert.assertTrue(WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCode().equals("en") - && WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCodes().size() == 4); - } - - @Test public void testRemoveAppLanguages() { - List list = new ArrayList<>(); - list.add("en"); - list.add("ja"); - list.add("es"); - list.add("zh-hant"); - WikipediaApp.Companion.getInstance().getLanguageState().setAppLanguageCodes(list); - - List listToRemove = new ArrayList<>(); - listToRemove.add("en"); - listToRemove.add("zh-hant"); - WikipediaApp.Companion.getInstance().getLanguageState().removeAppLanguageCodes(listToRemove); - Assert.assertEquals("ja", WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCode()); - Assert.assertEquals(2, WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCodes().size()); - } -} diff --git a/app/src/test/java/org/wikipedia/language/AppLanguageStateTests.kt b/app/src/test/java/org/wikipedia/language/AppLanguageStateTests.kt new file mode 100644 index 00000000000..8262e6e47a0 --- /dev/null +++ b/app/src/test/java/org/wikipedia/language/AppLanguageStateTests.kt @@ -0,0 +1,54 @@ +package org.wikipedia.language + +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.wikipedia.WikipediaApp + +@RunWith(RobolectricTestRunner::class) +class AppLanguageStateTests { + + private val languageState get() = WikipediaApp.instance.languageState + + @Test + fun testInitAppLanguages() { + Assert.assertEquals("en", languageState.appLanguageCode) + } + + @Test + fun testAddAppLanguage() { + languageState.addAppLanguageCode("ja") + Assert.assertEquals("en", languageState.appLanguageCode) + Assert.assertEquals(2, languageState.appLanguageCodes.size.toLong()) + Assert.assertEquals("ja", languageState.appLanguageCodes[1]) + } + + @Test + fun testAddMultipleAppLanguages() { + val list = mutableListOf() + list.add("en") + list.add("ja") + list.add("es") + list.add("zh-hant") + languageState.setAppLanguageCodes(list) + Assert.assertTrue(languageState.appLanguageCode == "en" && languageState.appLanguageCodes.size == 4) + } + + @Test + fun testRemoveAppLanguages() { + val list = mutableListOf() + list.add("en") + list.add("ja") + list.add("es") + list.add("zh-hant") + languageState.setAppLanguageCodes(list) + + val listToRemove = mutableListOf() + listToRemove.add("en") + listToRemove.add("zh-hant") + languageState.removeAppLanguageCodes(listToRemove) + Assert.assertEquals("ja", languageState.appLanguageCode) + Assert.assertEquals(2, languageState.appLanguageCodes.size.toLong()) + } +} diff --git a/app/src/test/java/org/wikipedia/language/LanguageUtilTest.java b/app/src/test/java/org/wikipedia/language/LanguageUtilTest.java deleted file mode 100644 index 6d3a4db37ab..00000000000 --- a/app/src/test/java/org/wikipedia/language/LanguageUtilTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.wikipedia.language; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.ParameterizedRobolectricTestRunner; -import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; - -import java.util.Arrays; -import java.util.Locale; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -public class LanguageUtilTest { - private static final String CHINESE_LANG = "zh"; - private static final String SIMPLIFIED_WIKI_LANG = AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE; - private static final String TRADITIONAL_WIKI_LANG = AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE; - - public static class LanguageCodeToWikiLanguageCodeChineseScript extends LanguageCodeToWikiLanguageCodeChinese { - @Parameters(name = "{0}") public static Iterable data() { - return Arrays.asList(new Object[][] { - {CHINESE_LANG, SIMPLIFIED_WIKI_LANG}, - {"zh-Hans", SIMPLIFIED_WIKI_LANG}, - {"zh-Hant", TRADITIONAL_WIKI_LANG}, - {"zh-Hans-HK", SIMPLIFIED_WIKI_LANG}, - {"zh-Hant-HK", TRADITIONAL_WIKI_LANG} - }); - } - - public LanguageCodeToWikiLanguageCodeChineseScript(@NonNull String input, - @NonNull String expected) { - super(input, expected); - } - - @Test public void test() { - Locale locale = Locale.forLanguageTag(input()); - test(locale, expected()); - } - } - - public static class LanguageCodeToWikiLanguageCodeChineseCountry extends LanguageCodeToWikiLanguageCodeChinese { - @Parameters(name = "{0}") public static Iterable data() { - return Arrays.asList(new Object[][] { - {Locale.CHINESE, SIMPLIFIED_WIKI_LANG}, - {Locale.CHINA, SIMPLIFIED_WIKI_LANG}, - {Locale.TAIWAN, TRADITIONAL_WIKI_LANG} - }); - } - - public LanguageCodeToWikiLanguageCodeChineseCountry(@NonNull Locale input, - @NonNull String expected) { - super(input, expected); - } - - @Test public void test() { - test(input(), expected()); - } - } - - // these tests could be much simpler with junit theories but the subject has a dependency on api - // level which requires robolectric to change - @RunWith(ParameterizedRobolectricTestRunner.class) - public abstract static class LanguageCodeToWikiLanguageCodeChinese { - private static Locale PREV_DEFAULT_LOCALE; - - @NonNull private final T input; - @NonNull private final String expected; - - @BeforeClass public static void setUpClass() { - PREV_DEFAULT_LOCALE = Locale.getDefault(); - } - - @AfterClass public static void tearDownClass() { - Locale.setDefault(PREV_DEFAULT_LOCALE); - } - - LanguageCodeToWikiLanguageCodeChinese(@NonNull T input, @NonNull String expected) { - this.input = input; - this.expected = expected; - } - - @NonNull T input() { - return input; - } - - @NonNull String expected() { - return expected; - } - - void test(@NonNull Locale defaultLocale, @Nullable String expected) { - Locale.setDefault(defaultLocale); - String wikiLang = LanguageUtil.localeToWikiLanguageCode(defaultLocale); - assertThat(wikiLang, is(expected)); - } - } -} diff --git a/app/src/test/java/org/wikipedia/language/LanguageUtilTest.kt b/app/src/test/java/org/wikipedia/language/LanguageUtilTest.kt new file mode 100644 index 00000000000..3c3950abf82 --- /dev/null +++ b/app/src/test/java/org/wikipedia/language/LanguageUtilTest.kt @@ -0,0 +1,45 @@ +package org.wikipedia.language + +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import java.util.Locale + +@RunWith(RobolectricTestRunner::class) +class LanguageUtilTest { + + @Test + fun testLanguageCodeToWikiLanguageCodeForChineseScripts() { + val list = listOf("zh" to AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE, + "zh-Hans" to AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE, + "zh-Hant" to AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE, + "zh-CN" to AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE, + "zh-TW" to AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE, + "zh-HK" to AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE, + "zh-MO" to AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE) + + list.forEach { + val defaultLocale = Locale.getDefault() + val locale = Locale.forLanguageTag(it.first) + Locale.setDefault(locale) + val wikiLang = LanguageUtil.localeToWikiLanguageCode(Locale.forLanguageTag(it.first)) + Assert.assertEquals(wikiLang, it.second) + Locale.setDefault(defaultLocale) + } + } + + @Test + fun testLanguageCodeToWikiLanguageCodeForChineseCountries() { + val list = listOf(Locale.CHINESE to AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE, + Locale.TAIWAN to AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE, + Locale.CHINA to AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE) + list.forEach { + val defaultLocale = Locale.getDefault() + Locale.setDefault(it.first) + val wikiLang = LanguageUtil.localeToWikiLanguageCode(it.first) + Assert.assertEquals(wikiLang, it.second) + Locale.setDefault(defaultLocale) + } + } +} diff --git a/app/src/test/java/org/wikipedia/language/TranslationTests.java b/app/src/test/java/org/wikipedia/language/TranslationTests.java deleted file mode 100644 index 4fac4c56fdb..00000000000 --- a/app/src/test/java/org/wikipedia/language/TranslationTests.java +++ /dev/null @@ -1,269 +0,0 @@ -package org.wikipedia.language; - -import androidx.annotation.NonNull; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.junit.Test; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -@SuppressWarnings("checkstyle:magicnumber") -public class TranslationTests { - private static final File RES_BASE = new File("src/main/res/"); - private static final String STRINGS_DIRECTORY = "values"; - private static final String STRINGS_XML_NAME = "strings.xml"; - - /** Add more if needed, but then also add some tests. */ - private static final String[] POSSIBLE_PARAMS = new String[] {"%s", "%1$s", "%2$s", "%3$s", - "%d", "%1$d", "%2$d", "%3$d", - "%.2f", "%1$.2f", "%2$.2f", "%3$.2f", - "^1"}; - private static final String[] UNSUPPORTED_TEXTS_REGEX = new String[] {"\\{\\{.*?\\}\\}", - "\\[\\[.*?\\]\\]", - "\\*\\*.*?\\*\\*", - "''.*?''"}; - private static final String[] BAD_NAMES = new String[]{"ldrtl", "sw360dp", "sw600dp", "sw720dp", "v19", "v21", "v23", "land", "night"}; - - private static File BASE_FILE; - private static File QQ_FILE; - private static File[] ALL_FILES; - - @Test - public void testAllTranslations() throws Throwable { - - StringBuilder mismatches = new StringBuilder(); - - // Step 1: collect counts of parameters in en/strings.xml - Map> baseMap = findMatchedParamsInXML(getBaseFile(), POSSIBLE_PARAMS, true); - - // Step 2: finding parameters in other languages - for (File dir : getAllFiles()) { - String lang = dir.getName().contains("-") ? dir.getName().substring(dir.getName().indexOf("-") + 1) : "en"; - File targetStringsXml = new File(dir, STRINGS_XML_NAME); - Map> targetMap = findMatchedParamsInXML(targetStringsXml, POSSIBLE_PARAMS, true); - - // compare the counts inside the maps - targetMap.forEach((targetKey, targetList) -> { - List baseList = baseMap.get(targetKey); - if (baseList != null && !baseList.equals(targetList)) { - mismatches.append("Parameters mismatched in ") - .append(lang) - .append("/") - .append(STRINGS_XML_NAME).append(": ") - .append(targetKey).append(" \n"); - } - }); - } - - // Step 3: check the result - assertThat("\n" + mismatches.toString(), mismatches.length(), is(0)); - } - - @Test - public void testTranslateWikiQQ() throws Throwable { - - StringBuilder mismatches = new StringBuilder(); - - // Step 1: collect all items in en/strings.xml - List baseList = findStringItemInXML(getBaseFile(), "string", "plurals"); - - // Step 2: collect all items in qq/strings.xml - List qqList = findStringItemInXML(getQQFile(), "string", "plurals"); - - // Step 3: check if item exists in qq/strings.xml - for (String item : baseList) { - if (!qqList.contains(item)) { - mismatches.append("Missing item in qq/strings.xml ") - .append(item).append(" \n"); - } - } - - // Step 4: check the result - assertThat("\n" + mismatches.toString(), mismatches.length(), is(0)); - } - - @Test - public void testPluralsDeclaration() throws Throwable { - - StringBuilder mismatches = new StringBuilder(); - - List baseList = findStringItemInXML(getBaseFile(), "plurals"); - - for (File dir : getAllFiles()) { - String lang = dir.getName().contains("-") ? dir.getName().substring(dir.getName().indexOf("-") + 1) : "en"; - File targetStringsXml = new File(dir, STRINGS_XML_NAME); - List targetList = findStringItemInXML(targetStringsXml, "plurals"); - - targetList.forEach(targetKey -> { - if (!baseList.contains(targetKey)) { - mismatches.append("Plurals item has no declaration in the base values folder in ") - .append(lang) - .append("/") - .append(STRINGS_XML_NAME).append(": ") - .append(targetKey).append(" \n"); - } - }); - } - - assertThat("\n" + mismatches.toString(), mismatches.length(), is(0)); - } - - @Test - public void testUnsupportedTexts() throws Throwable { - - StringBuilder mismatches = new StringBuilder(); - - // Step 1: collect counts of parameters in en/strings.xml - Map> baseMap = findMatchedParamsInXML(getBaseFile(), UNSUPPORTED_TEXTS_REGEX, false); - - // Step 2: finding parameters in other languages - for (File dir : getAllFiles()) { - String lang = dir.getName().contains("-") ? dir.getName().substring(dir.getName().indexOf("-") + 1) : "en"; - // Skip "qq" since it contains a lot of {{Identical}} tags - if (!lang.equals("qq")) { - File targetStringsXml = new File(dir, STRINGS_XML_NAME); - Map> targetMap = findMatchedParamsInXML(targetStringsXml, UNSUPPORTED_TEXTS_REGEX, false); - - // compare the counts inside the maps - targetMap.forEach((targetKey, targetList) -> { - List baseList = baseMap.get(targetKey); - if (baseList != null && !baseList.equals(targetList)) { - mismatches.append("Unsupported Wikitext/Markdown in ") - .append(lang) - .append("/") - .append(STRINGS_XML_NAME).append(": ") - .append(targetKey).append(" \n"); - } - }); - } - } - - // Step 3: check the result - assertThat("\n" + mismatches.toString(), mismatches.length(), is(0)); - } - - private File getBaseFile() { - if (BASE_FILE == null) { - BASE_FILE = new File(RES_BASE + "/" + STRINGS_DIRECTORY, STRINGS_XML_NAME); - } - return BASE_FILE; - } - - private File getQQFile() { - if (QQ_FILE == null) { - QQ_FILE = new File(RES_BASE + "/" + STRINGS_DIRECTORY + "-qq", STRINGS_XML_NAME); - } - return QQ_FILE; - } - - private File[] getAllFiles() { - if (ALL_FILES == null) { - ALL_FILES = RES_BASE.listFiles((File pathname) -> pathname.isDirectory() && pathname.getName().startsWith(STRINGS_DIRECTORY) && !hasBadName(pathname)); - if (ALL_FILES != null) { - Arrays.sort(ALL_FILES); - } - } - return ALL_FILES; - } - - private boolean hasBadName(File pathname) { - for (String name : BAD_NAMES) { - if (pathname.getName().startsWith(STRINGS_DIRECTORY + "-" + name)) { - return true; - } - } - return false; - } - - private List findStringItemInXML(@NonNull File xmlPath, @NonNull String ...strings) throws Throwable { - List list = new ArrayList<>(); - Document document = Jsoup.parse(xmlPath, "UTF-8"); - - for (String string : strings) { - Elements elements = document.select(string); - for (Element element : elements) { - String name = element.attr("name"); - list.add(name); - } - - } - return list; - } - - private Map> findMatchedParamsInXML(@NonNull File xmlPath, @NonNull String[] params, boolean quote) throws Throwable { - Map> map = new HashMap<>(); - Document document = Jsoup.parse(xmlPath, "UTF-8"); - - // For string items - // Wikipedia - Elements stringElements = document.select("string"); - for (Element element : stringElements) { - String name = element.attr("name"); - String value = element.text(); - - // Exclude pre-packaged messages for use with the patrolling feature, since they are - // intended to contain wikitext. - // TODO: test these messages separately and more thoroughly. - if (name.startsWith("patroller_saved_message_body")) { - continue; - } - - List countList = new ArrayList<>(); - for (String param : params) { - int count = 0; - Pattern pattern = Pattern.compile(quote ? Pattern.quote(param) : param); - Matcher matcher = pattern.matcher(value); - while (matcher.find()) { - count++; - } - countList.add(count); - } - map.put(name, countList); - } - - // For plural items - // - // Last year - // %d years ago - // - Elements pluralsElements = document.select("plurals"); - for (Element element : pluralsElements) { - String name = element.attr("name"); - Elements pluralElements = element.select("item"); - for (Element subElement : pluralElements) { - String subName = subElement.attr("quantity"); - String subValue = subElement.text(); - if (subName.equals("one")) { - continue; - } - - List countList = new ArrayList<>(); - for (String param : params) { - int count = 0; - Pattern pattern = Pattern.compile(quote ? Pattern.quote(param) : param); - Matcher matcher = pattern.matcher(subValue); - while (matcher.find()) { - count++; - } - countList.add(count); - } - map.put(name + "[" + subName + "]", countList); - } - } - - return map; - } -} diff --git a/app/src/test/java/org/wikipedia/language/TranslationTests.kt b/app/src/test/java/org/wikipedia/language/TranslationTests.kt new file mode 100644 index 00000000000..24b9c2a5be4 --- /dev/null +++ b/app/src/test/java/org/wikipedia/language/TranslationTests.kt @@ -0,0 +1,263 @@ +package org.wikipedia.language + +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.jsoup.Jsoup +import org.junit.Test +import java.io.File +import java.util.function.Consumer +import java.util.regex.Pattern + +class TranslationTests { + @Test + @Throws(Throwable::class) + fun testAllTranslations() { + val mismatches = StringBuilder() + + // Step 1: collect counts of parameters in en/strings.xml + val baseMap = findMatchedParamsInXML(baseFile, POSSIBLE_PARAMS, true) + + // Step 2: finding parameters in other languages + for (dir in allFiles) { + val lang = + if (dir.name.contains("-")) dir.name.substring(dir.name.indexOf("-") + 1) else "en" + val targetStringsXml = File(dir, STRINGS_XML_NAME) + val targetMap = findMatchedParamsInXML(targetStringsXml, POSSIBLE_PARAMS, true) + + // compare the counts inside the maps + targetMap.forEach { (targetKey, targetList) -> + val baseList = baseMap[targetKey] + if (baseList != null && baseList != targetList) { + mismatches.append("Parameters mismatched in ") + .append(lang) + .append("/") + .append(STRINGS_XML_NAME).append(": ") + .append(targetKey).append(" \n") + } + } + } + + // Step 3: check the result + MatcherAssert.assertThat("\n" + mismatches.toString(), mismatches.length, Matchers.`is`(0)) + } + + @Test + @Throws(Throwable::class) + fun testTranslateWikiQQ() { + val mismatches = StringBuilder() + + // Step 1: collect all items in en/strings.xml + val baseList = findStringItemInXML(baseFile, "string", "plurals") + + // Step 2: collect all items in qq/strings.xml + val qqList = findStringItemInXML(qQFile, "string", "plurals") + + // Step 3: check if item exists in qq/strings.xml + for (item in baseList) { + if (!qqList.contains(item)) { + mismatches.append("Missing item in qq/strings.xml ").append(item).append(" \n") + } + } + + // Step 4: check the result + MatcherAssert.assertThat("\n" + mismatches.toString(), mismatches.length, Matchers.`is`(0)) + } + + @Test + @Throws(Throwable::class) + fun testPluralsDeclaration() { + val mismatches = StringBuilder() + + val baseList = findStringItemInXML(baseFile, "plurals") + + for (dir in allFiles) { + val lang = + if (dir.name.contains("-")) dir.name.substring(dir.name.indexOf("-") + 1) else "en" + val targetStringsXml = File(dir, STRINGS_XML_NAME) + val targetList = findStringItemInXML(targetStringsXml, "plurals") + + targetList.forEach(Consumer { targetKey -> + if (!baseList.contains(targetKey)) { + mismatches.append("Plurals item has no declaration in the base values folder in ") + .append(lang) + .append("/") + .append(STRINGS_XML_NAME).append(": ") + .append(targetKey).append(" \n") + } + }) + } + + MatcherAssert.assertThat("\n" + mismatches.toString(), mismatches.length, Matchers.`is`(0)) + } + + @Test + @Throws(Throwable::class) + fun testUnsupportedTexts() { + val mismatches = StringBuilder() + + // Step 1: collect counts of parameters in en/strings.xml + val baseMap = findMatchedParamsInXML(baseFile, UNSUPPORTED_TEXTS_REGEX, false) + + // Step 2: finding parameters in other languages + for (dir in allFiles) { + val lang = + if (dir.name.contains("-")) dir.name.substring(dir.name.indexOf("-") + 1) else "en" + // Skip "qq" since it contains a lot of {{Identical}} tags + if (lang != "qq") { + val targetStringsXml = File(dir, STRINGS_XML_NAME) + val targetMap = findMatchedParamsInXML(targetStringsXml, UNSUPPORTED_TEXTS_REGEX, false) + + // compare the counts inside the maps + targetMap.forEach { (targetKey, targetList) -> + val baseList = baseMap[targetKey] + if (baseList != null && baseList != targetList) { + mismatches.append("Unsupported Wikitext/Markdown in ") + .append(lang) + .append("/") + .append(STRINGS_XML_NAME).append(": ") + .append(targetKey).append(" \n") + } + } + } + } + + // Step 3: check the result + MatcherAssert.assertThat("\n" + mismatches.toString(), mismatches.length, Matchers.`is`(0)) + } + + private val baseFile: File + get() { + if (BASE_FILE == null) { + BASE_FILE = File("$RES_BASE/$STRINGS_DIRECTORY", STRINGS_XML_NAME) + } + return BASE_FILE!! + } + + private val qQFile: File + get() { + if (QQ_FILE == null) { + QQ_FILE = File("$RES_BASE/$STRINGS_DIRECTORY-qq", STRINGS_XML_NAME) + } + return QQ_FILE!! + } + + private val allFiles: Array + get() { + if (ALL_FILES == null) { + ALL_FILES = RES_BASE.listFiles { pathName -> + pathName.isDirectory && pathName.name.startsWith(STRINGS_DIRECTORY) && !hasBadName(pathName) + } + ALL_FILES?.sort() + } + return ALL_FILES!! + } + + private fun hasBadName(pathname: File): Boolean { + return BAD_NAMES.any { pathname.name.startsWith("$STRINGS_DIRECTORY-$it") } + } + + @Throws(Throwable::class) + private fun findStringItemInXML(xmlPath: File, vararg strings: String): List { + val list = mutableListOf() + val document = Jsoup.parse(xmlPath, "UTF-8") + + for (string in strings) { + val elements = document.select(string) + for (element in elements) { + val name = element.attr("name") + list.add(name) + } + } + return list + } + + @Throws(Throwable::class) + private fun findMatchedParamsInXML(xmlPath: File, params: List, quote: Boolean): Map> { + val map = mutableMapOf>() + val document = Jsoup.parse(xmlPath, "UTF-8") + + // For string items + // Wikipedia + val stringElements = document.select("string") + for (element in stringElements) { + val name = element.attr("name") + val value = element.text() + + // Exclude pre-packaged messages for use with the patrolling feature, since they are + // intended to contain wikitext. + // TODO: test these messages separately and more thoroughly. + if (name.startsWith("patroller_saved_message_body")) { + continue + } + + val countList = mutableListOf() + for (param in params) { + var count = 0 + val pattern = Pattern.compile(if (quote) Pattern.quote(param) else param) + val matcher = pattern.matcher(value) + while (matcher.find()) { + count++ + } + countList.add(count) + } + map[name] = countList + } + + // For plural items + // + // Last year + // %d years ago + // + val pluralsElements = document.select("plurals") + for (element in pluralsElements) { + val name = element.attr("name") + val pluralElements = element.select("item") + for (subElement in pluralElements) { + val subName = subElement.attr("quantity") + val subValue = subElement.text() + if (subName == "one") { + continue + } + + val countList = mutableListOf() + for (param in params) { + var count = 0 + val pattern = Pattern.compile(if (quote) Pattern.quote(param) else param) + val matcher = pattern.matcher(subValue) + while (matcher.find()) { + count++ + } + countList.add(count) + } + map["$name[$subName]"] = countList + } + } + + return map + } + + companion object { + private val RES_BASE = File("src/main/res/") + private const val STRINGS_DIRECTORY = "values" + private const val STRINGS_XML_NAME = "strings.xml" + + /** Add more if needed, but then also add some tests. */ + private val POSSIBLE_PARAMS = listOf( + "%s", "%1\$s", "%2\$s", "%3\$s", + "%d", "%1\$d", "%2\$d", "%3\$d", + "%.2f", "%1$.2f", "%2$.2f", "%3$.2f", + "^1" + ) + private val UNSUPPORTED_TEXTS_REGEX = listOf( + "\\{\\{.*?\\}\\}", + "\\[\\[.*?\\]\\]", + "\\*\\*.*?\\*\\*", + "''.*?''" + ) + private val BAD_NAMES = listOf("ldrtl", "sw360dp", "sw600dp", "sw720dp", "v19", "v21", "v23", "land", "night") + + private var BASE_FILE: File? = null + private var QQ_FILE: File? = null + private var ALL_FILES: Array? = null + } +} From 2e6c12bf08ac5599804d959024c60c7a01495912 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 15 May 2024 11:44:02 -0400 Subject: [PATCH 114/626] Send correct country code when making payment. (#4667) --- app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt index c4777cadf78..3dc26321b64 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt @@ -138,9 +138,9 @@ class GooglePayViewModel : ViewModel() { BuildConfig.VERSION_NAME, campaignId, billingObj.optString("locality", ""), - infoObj.optString("countryCode", currentCountryCode), - currencyCode, currentCountryCode, + currencyCode, + billingObj.optString("countryCode", currentCountryCode), paymentDataObj.optString("email", ""), billingObj.optString("name", ""), WikipediaApp.instance.appOrSystemLanguageCode, From f02a88467124edc1564c418c7d2be54dfe69adec Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 15 May 2024 11:57:33 -0400 Subject: [PATCH 115/626] Allow Google Pay only in supported countries received from config. (#4668) Co-authored-by: Cooltey Feng --- app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt | 1 + .../java/org/wikipedia/dataclient/donate/DonationConfig.kt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt index 3dc26321b64..578c5509990 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt @@ -93,6 +93,7 @@ class GooglePayViewModel : ViewModel() { if (Prefs.paymentMethodsMerchantId.isEmpty() || Prefs.paymentMethodsGatewayId.isEmpty() || + !donationConfig!!.countryCodeGooglePayEnabled.contains(currentCountryCode) || !donationConfig!!.currencyAmountPresets.containsKey(currencyCode)) { uiState.value = NoPaymentMethod() } else { diff --git a/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfig.kt b/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfig.kt index 4fe767442f9..af8e052d79f 100644 --- a/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfig.kt +++ b/app/src/main/java/org/wikipedia/dataclient/donate/DonationConfig.kt @@ -10,5 +10,6 @@ class DonationConfig( val currencyMaximumDonation: Map = emptyMap(), val currencyAmountPresets: Map> = emptyMap(), val currencyTransactionFees: Map = emptyMap(), - val countryCodeEmailOptInRequired: List = emptyList() + val countryCodeEmailOptInRequired: List = emptyList(), + val countryCodeGooglePayEnabled: List = emptyList() ) From 80c7f05f47a1720310af9f08fd9cae4e5ecf6765 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 15 May 2024 12:54:13 -0400 Subject: [PATCH 116/626] Bump versionCode. (#4669) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5960d6e53d0..274614d99c5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50486 + versionCode 50487 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From bb04792734c5a1d91f64a661982adaa681057005 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 15 May 2024 11:56:04 -0700 Subject: [PATCH 117/626] Fix: make sure sending data if it is from Edit Patrol (#4671) --- app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index 73ca6fb5241..07406be207d 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -393,7 +393,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre if (messagePreviewFragment.isActive) { EditAttemptStepEvent.logSaveAttempt(viewModel.pageTitle) - PatrollerExperienceEvent.logAction("publish_message_click", "pt_warning_messages") + sendPatrollerExperienceEvent("publish_message_click", "pt_warning_messages") binding.progressBar.isVisible = true setSaveButtonEnabled(false) viewModel.postReply(subject, getWikitextBody()) @@ -465,7 +465,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre private fun onSaveSuccess(newRevision: Long) { AnonymousNotificationHelper.onEditSubmitted() - PatrollerExperienceEvent.logAction("publish_message_success", "pt_warning_messages", + sendPatrollerExperienceEvent("publish_message_success", "pt_warning_messages", PatrollerExperienceEvent.getPublishMessageActionString(isModified = viewModel.selectedTemplate != null && subjectOrBodyModified, isSaved = viewModel.talkTemplateSaved, isExample = viewModel.isExampleTemplate, exampleMessage = if (viewModel.isExampleTemplate) viewModel.selectedTemplate?.title else null)) From 76327d2f0e1ca2cee1a141d7d53259e98c23ddcb Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 15 May 2024 15:11:47 -0400 Subject: [PATCH 118/626] Always send final amount in canonical decimal format. (#4670) --- .../extra/java/org/wikipedia/donate/GooglePayComponent.kt | 7 +++++-- .../extra/java/org/wikipedia/donate/GooglePayViewModel.kt | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt index 4ee7f390ccc..acef58e1d23 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayComponent.kt @@ -11,6 +11,8 @@ import org.json.JSONArray import org.json.JSONObject import org.wikipedia.settings.Prefs import java.text.DecimalFormat +import java.text.DecimalFormatSymbols +import java.util.Locale internal object GooglePayComponent { @@ -44,8 +46,9 @@ internal object GooglePayComponent { put("allowedPaymentMethods", JSONArray().put(baseCardPaymentMethod)) } - fun getDecimalFormat(currencyCode: String): DecimalFormat { - return DecimalFormat(if (CURRENCIES_THREE_DECIMAL.contains(currencyCode)) "0.000" else if (CURRENCIES_NO_DECIMAL.contains(currencyCode)) "0" else "0.00") + fun getDecimalFormat(currencyCode: String, canonical: Boolean = false): DecimalFormat { + val formatSpec = if (CURRENCIES_THREE_DECIMAL.contains(currencyCode)) "0.000" else if (CURRENCIES_NO_DECIMAL.contains(currencyCode)) "0" else "0.00" + return if (canonical) DecimalFormat(formatSpec, DecimalFormatSymbols.getInstance(Locale.ROOT)) else DecimalFormat(formatSpec) } fun createPaymentsClient(activity: Activity): PaymentsClient { diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt index 578c5509990..e77421c4731 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt @@ -133,9 +133,13 @@ class GooglePayViewModel : ViewModel() { val billingObj = infoObj.getJSONObject("billingAddress") val token = paymentMethodObj.getJSONObject("tokenizationData").getString("token") + // The backend expects the final amount in the canonical decimal format, instead of + // any localized format, e.g. comma as decimal separator. + val decimalFormatCanonical = GooglePayComponent.getDecimalFormat(currencyCode, true) + val response = ServiceFactory.get(WikiSite(GooglePayComponent.PAYMENTS_API_URL)) .submitPayment( - decimalFormat.format(finalAmount), + decimalFormatCanonical.format(finalAmount), BuildConfig.VERSION_NAME, campaignId, billingObj.optString("locality", ""), From ee677448750bba4d042df2f0e3297ddd24f3786d Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 15 May 2024 16:05:59 -0400 Subject: [PATCH 119/626] Remove Places survey. (#4672) * Remove Places survey. * Unused constant. --------- Co-authored-by: Cooltey Feng --- .../org/wikipedia/places/PlacesFragment.kt | 13 -------- .../places/PlacesFragmentViewModel.kt | 4 --- .../main/java/org/wikipedia/settings/Prefs.kt | 5 --- .../java/org/wikipedia/views/SurveyDialog.kt | 33 ++----------------- app/src/main/res/values/preference_keys.xml | 1 - .../main/res/xml/developer_preferences.xml | 5 --- 6 files changed, 3 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/org/wikipedia/places/PlacesFragment.kt b/app/src/main/java/org/wikipedia/places/PlacesFragment.kt index 81ee31f84b5..466ddca5e87 100644 --- a/app/src/main/java/org/wikipedia/places/PlacesFragment.kt +++ b/app/src/main/java/org/wikipedia/places/PlacesFragment.kt @@ -90,7 +90,6 @@ import org.wikipedia.util.StringUtil import org.wikipedia.util.TabUtil import org.wikipedia.util.log.L import org.wikipedia.views.DrawableItemDecoration -import org.wikipedia.views.SurveyDialog import org.wikipedia.views.ViewUtil import java.util.Locale import kotlin.math.abs @@ -395,8 +394,6 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi FeedbackUtil.showError(requireActivity(), it.throwable) } } - - maybeShowSurvey() } private fun updateToggleViews(isMapVisible: Boolean) { @@ -750,15 +747,6 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi return false } - private fun maybeShowSurvey() { - binding.root.postDelayed({ - if (isAdded && Prefs.shouldShowOneTimePlacesSurvey == 1) { - Prefs.shouldShowOneTimePlacesSurvey++ - SurveyDialog.showFeedbackOptionsDialog(requireActivity(), Constants.InvokeSource.PLACES) - } - }, 1000) - } - private inner class RecyclerViewAdapter(val nearbyPages: List) : RecyclerView.Adapter() { override fun getItemCount(): Int { return nearbyPages.size @@ -837,7 +825,6 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi const val CLUSTER_TEXT_LAYER_ID = "mapbox-android-cluster-text" const val CLUSTER_CIRCLE_LAYER_ID = "mapbox-android-cluster-circle0" const val ZOOM_IN_ANIMATION_DURATION = 1000 - const val SURVEY_NOT_INITIALIZED = -1 val CLUSTER_FONT_STACK = arrayOf("Open Sans Semibold") val MARKER_FONT_STACK = arrayOf("Open Sans Regular") diff --git a/app/src/main/java/org/wikipedia/places/PlacesFragmentViewModel.kt b/app/src/main/java/org/wikipedia/places/PlacesFragmentViewModel.kt index 3bd7a3354e2..5bcc1cd3bbf 100644 --- a/app/src/main/java/org/wikipedia/places/PlacesFragmentViewModel.kt +++ b/app/src/main/java/org/wikipedia/places/PlacesFragmentViewModel.kt @@ -28,10 +28,6 @@ class PlacesFragmentViewModel(bundle: Bundle) : ViewModel() { var lastKnownLocation: Location? = null val nearbyPagesLiveData = MutableLiveData>>() - init { - Prefs.shouldShowOneTimePlacesSurvey++ - } - fun fetchNearbyPages(latitude: Double, longitude: Double, radius: Int, maxResults: Int) { viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> nearbyPagesLiveData.postValue(Resource.Error(throwable)) diff --git a/app/src/main/java/org/wikipedia/settings/Prefs.kt b/app/src/main/java/org/wikipedia/settings/Prefs.kt index 7619cb9bda5..2bf0e65191b 100644 --- a/app/src/main/java/org/wikipedia/settings/Prefs.kt +++ b/app/src/main/java/org/wikipedia/settings/Prefs.kt @@ -15,7 +15,6 @@ import org.wikipedia.json.JsonUtil import org.wikipedia.page.PageTitle import org.wikipedia.page.action.PageActionItem import org.wikipedia.page.tabs.Tab -import org.wikipedia.places.PlacesFragment import org.wikipedia.suggestededits.SuggestedEditsRecentEditsFilterTypes import org.wikipedia.theme.Theme.Companion.fallback import org.wikipedia.util.DateUtil.dbDateFormat @@ -700,10 +699,6 @@ object Prefs { get() = PrefsIoUtil.getString(R.string.preference_key_places_wiki_code, WikipediaApp.instance.appOrSystemLanguageCode).orEmpty() set(value) = PrefsIoUtil.setString(R.string.preference_key_places_wiki_code, value) - var shouldShowOneTimePlacesSurvey - get() = PrefsIoUtil.getInt(R.string.preference_key_places_show_one_time_survey, PlacesFragment.SURVEY_NOT_INITIALIZED) - set(value) = PrefsIoUtil.setInt(R.string.preference_key_places_show_one_time_survey, value) - var showOneTimePlacesPageOnboardingTooltip get() = PrefsIoUtil.getBoolean(R.string.preference_key_show_places_page_onboarding_tooltip, true) set(value) = PrefsIoUtil.setBoolean(R.string.preference_key_show_places_page_onboarding_tooltip, value) diff --git a/app/src/main/java/org/wikipedia/views/SurveyDialog.kt b/app/src/main/java/org/wikipedia/views/SurveyDialog.kt index 8eac785481e..79e580f8011 100644 --- a/app/src/main/java/org/wikipedia/views/SurveyDialog.kt +++ b/app/src/main/java/org/wikipedia/views/SurveyDialog.kt @@ -9,7 +9,6 @@ import com.google.android.material.textfield.TextInputEditText import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.analytics.eventplatform.PatrollerExperienceEvent -import org.wikipedia.analytics.eventplatform.PlacesEvent import org.wikipedia.settings.Prefs import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil @@ -23,8 +22,7 @@ object SurveyDialog { val clickListener = View.OnClickListener { val feedbackOption = (it as TextView).text.toString() dialog?.dismiss() - if ((source == Constants.InvokeSource.PLACES && feedbackOption != activity.getString(R.string.patroller_diff_feedback_dialog_option_unsatisfied) && feedbackOption != activity.getString(R.string.places_survey_very_unsatisfied_option)) || - (source != Constants.InvokeSource.PLACES && feedbackOption == activity.getString(R.string.patroller_diff_feedback_dialog_option_satisfied))) { + if (feedbackOption == activity.getString(R.string.patroller_diff_feedback_dialog_option_satisfied)) { showFeedbackSnackbarAndTooltip(activity, source) } else { showFeedbackInputDialog(activity, source) @@ -37,28 +35,11 @@ object SurveyDialog { feedbackView.findViewById(R.id.optionSatisfied).setOnClickListener(clickListener) feedbackView.findViewById(R.id.optionNeutral).setOnClickListener(clickListener) feedbackView.findViewById(R.id.optionUnsatisfied).setOnClickListener(clickListener) - if (source == Constants.InvokeSource.PLACES) { - val verySatisfied = feedbackView.findViewById(R.id.optionVerySatisfied) - val veryUnsatisfied = feedbackView.findViewById(R.id.optionVeryUnsatisfied) - verySatisfied.visibility = View.VISIBLE - veryUnsatisfied.visibility = View.VISIBLE - verySatisfied.setOnClickListener(clickListener) - veryUnsatisfied.setOnClickListener(clickListener) - } sendAnalyticsEvent("impression", "feedback_form", source) val dialogBuilder = MaterialAlertDialogBuilder(activity) - .setTitle( - if (source == Constants.InvokeSource.PLACES) R.string.places_survey_dialog_title else - R.string.patroller_diff_feedback_dialog_title - ) + .setTitle(R.string.patroller_diff_feedback_dialog_title) .setCancelable(false) .setView(feedbackView) - if (source == Constants.InvokeSource.PLACES) { - dialogBuilder.setNegativeButton(R.string.logged_out_in_background_cancel) { _, _ -> - dialog?.dismiss() - sendAnalyticsEvent("feedback_cancel", "feedback_form", source) - } - } dialog = dialogBuilder.show() } @@ -66,12 +47,7 @@ object SurveyDialog { val feedbackView = activity.layoutInflater.inflate(R.layout.dialog_patrol_edit_feedback_input, null) sendAnalyticsEvent("impression", "feedback_input_form", source) MaterialAlertDialogBuilder(activity) - .setTitle( - if (source == Constants.InvokeSource.PLACES) - R.string.places_survey_feedback_low_satisfaction_dialog_title - else - R.string.patroller_diff_feedback_dialog_feedback_title - ) + .setTitle(R.string.patroller_diff_feedback_dialog_feedback_title) .setView(feedbackView) .setPositiveButton(R.string.patroller_diff_feedback_dialog_submit) { _, _ -> val feedbackInput = feedbackView.findViewById(R.id.feedbackInput).text.toString() @@ -109,8 +85,5 @@ object SurveyDialog { if (source == Constants.InvokeSource.SUGGESTED_EDITS_RECENT_EDITS) { PatrollerExperienceEvent.logAction(action, activeInterface, actionData) } - if (source == Constants.InvokeSource.PLACES) { - PlacesEvent.logAction(action, activeInterface, actionData) - } } } diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 8c8d99ba346..19176fc8c79 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -168,7 +168,6 @@ showPlacesPageOnboardingTooltip showPlacesMainNavOnboardingTooltip placesLastLocationAndZoomLevel - placesShowOneTimeSurvey recentUsedTemplates donationTestEnv paymentMethodsLastQueryTime diff --git a/app/src/main/res/xml/developer_preferences.xml b/app/src/main/res/xml/developer_preferences.xml index 674dc147b73..9b971dd412d 100644 --- a/app/src/main/res/xml/developer_preferences.xml +++ b/app/src/main/res/xml/developer_preferences.xml @@ -458,11 +458,6 @@ android:key="ab_test_mBART25" android:title="Test group for machine generated article descriptions \n(0=no suggestions, 1=suggestions, 2=suggestions+blp)" /> - - From c1b14db418cf13c91690a1e13478e8dff10414da Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 15 May 2024 16:22:17 -0400 Subject: [PATCH 120/626] Bump versionCode. (#4673) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 274614d99c5..a3137bd2b2d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50487 + versionCode 50488 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From a0aba348274502c68e8c73626d29d0b9164281c9 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 15 May 2024 16:01:32 -0700 Subject: [PATCH 121/626] Strings for zhwiki language variants prompt (#4674) Co-authored-by: Dmitry Brant --- app/src/main/res/values-qq/strings.xml | 6 ++++++ app/src/main/res/values/strings.xml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 6bc3ddff11a..19d42681946 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1692,4 +1692,10 @@ Negative action button text for places survey dialog Title text for the secondary dialog which is shown as a result of an action on the main dialog for places feature - shown only to users who are very unsatisfied with the feature Empty message for the list in the current map area. Please keep the anchor link around the \"on the map\". + Title text for the dialog of selecting a new Chinese language variant as the primary language. + Message text for the dialog of selecting a new Chinese language variant as the primary language. + Button label for the dialog of selecting a new Chinese language variant as the primary language. + Title text for the dialog of going to the Settings for selecting the new secondary languages. + Message text for the dialog of going to the Settings for selecting the new secondary languages. + Button label for the dialog of going to the Settings for selecting the new secondary languages. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 633e7d7d3c7..3a56e0c1cdb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -865,6 +865,12 @@ Cancel You have reached the bottom of the feed. Load more + Select a regional language variant for an improved reading experience + You are currently using an unsupported generic Chinese language variant as your primary Wikipedia language + Save + Please update your secondary languages + You are currently using an unsupported generic Chinese language variant as a secondary language. Please go to your settings to select a new secondary language or to confirm your language list. + Go to Settings Top read on %s From ff3e4f476feb0e66066808e2bf4b663f77e90a1d Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 16 May 2024 18:09:23 +0530 Subject: [PATCH 122/626] Localisation updates from https://translatewiki.net. (#4676) --- app/src/main/res/values-cs/strings.xml | 12 +++++++++++- app/src/main/res/values-it/strings.xml | 6 ++++++ app/src/main/res/values-mk/strings.xml | 6 ++++++ app/src/main/res/values-qq/strings.xml | 12 ++++++------ app/src/main/res/values-ru/strings.xml | 11 +++++++++++ app/src/main/res/values-skr/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 8 +++++++- app/src/main/res/values-zh/strings.xml | 17 ++++++++++++++++- 8 files changed, 65 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index e5796663507..9cbb608bc91 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -897,7 +897,7 @@ Přizpůsobit panel nástrojů Menu Přetáhněte své oblíbené položky sem 👋 - Obnovit do základu + Obnovit výchozí Chcete-li položku přesunout, podržte ikonu přetažení Stisknutím a přetažením položky přemístěte Popište články @@ -1076,6 +1076,7 @@ Rozhodněte, zda obrázek pomůže čtenářům lépe porozumět tomuto tématu Další Problém s funkcí + Přidán obrázek Stránka souboru Přidat titulek obrázku Přidejte značky obrázků @@ -1246,6 +1247,10 @@ Do: Řádek %d Řádky %1$d-%2$d + Přidán řádek + Odstraněn řádek + Přidán odstavec + Odstraněn odstavec Porovnat Stránka „%1$s“ a její diskusní stránka byly přidány do sledovaných stránek %2$s. Změnit @@ -1319,6 +1324,11 @@ Příspěvky Filtrovat příspěvky Zobrazit na mapě + Informace o uživateli + Informace o uživateli + <b>Účet od: </b> %s + <b>Počet úprav: </b> %s + Zavřít Problém s funkcí Jste s touto funkcí spokojen(a)? Spokojen(a) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index b9f506856ec..b77ab6e8d81 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -849,6 +849,12 @@ Annulla Hai raggiunto la fine del feed. Carica di più + Seleziona una variante linguistica regionale per un\'esperienza di lettura migliore + Al momento stai utilizzando una variante generica della lingua cinese non supportata come lingua principale di Wikipedia + Salva + Aggiorna le tue lingue secondarie + Al momento stai utilizzando una variante generica della lingua cinese non supportata come lingua secondaria. Vai alle impostazioni per selezionare una nuova lingua secondaria o per confermare l\'elenco delle lingue. + Vai alle impostazioni Tendenze del %s Schede Descrizione della voce diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 021eff5d635..d53112cc596 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -835,6 +835,12 @@ Откажи Дојдовте до дното на доводот. Вчитај уште + Изберете регионална јазична варијанта за да го подобрите читачкото доживување + Моментално користите неподдржана општа варијанта на кинескиот јазик како ваш главен јазик на Википедија + Зачувај + Подновете ги вашите споредни јазици + Моментално користите неподдржана општа варијанта на кинескиот јазик како спореден јазик. Одете во нагодувањата за да изберете нов спореден јазик или за да го потврдите вашиот список на јазици. + Оди на Нагодувањата Најчитани на %s Јазичиња Опис на статијата diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 19d42681946..267f2450bea 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -869,6 +869,12 @@ Negative action button text in pop-up dialog for feed card language selection. Short description for the accessibility card that tells user it is the bottom of the explore feed. Button lable for manually loading more cards to the explore feed. + Title text for the dialog of selecting a new Chinese language variant as the primary language. + Message text for the dialog of selecting a new Chinese language variant as the primary language. + Button label for the dialog of selecting a new Chinese language variant as the primary language. + Title text for the dialog of going to the Settings for selecting the new secondary languages. + Message text for the dialog of going to the Settings for selecting the new secondary languages. + Button label for the dialog of going to the Settings for selecting the new secondary languages. Title for the screen with all top read links. \"%s\" represents the date string Title for the tabs screen. Hint text that is shown when the article description field is empty. @@ -1692,10 +1698,4 @@ Negative action button text for places survey dialog Title text for the secondary dialog which is shown as a result of an action on the main dialog for places feature - shown only to users who are very unsatisfied with the feature Empty message for the list in the current map area. Please keep the anchor link around the \"on the map\". - Title text for the dialog of selecting a new Chinese language variant as the primary language. - Message text for the dialog of selecting a new Chinese language variant as the primary language. - Button label for the dialog of selecting a new Chinese language variant as the primary language. - Title text for the dialog of going to the Settings for selecting the new secondary languages. - Message text for the dialog of going to the Settings for selecting the new secondary languages. - Button label for the dialog of going to the Settings for selecting the new secondary languages. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index de4f012f32f..d4401138e6e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1562,6 +1562,7 @@ Вклад фильтровать вклад Посмотреть на карте + Географические координаты недоступны для этой страницы. Импортирование расшаренного списка для чтения Как бы вы хотели назвать список, которым с вами поделились? *новый* @@ -1646,12 +1647,14 @@ Со средней точностью находит промежуточную часть недобросовестных изменений. Скорее всего недобросовестные Максимально точен в поиске очевидно недобросовестных правок. + История редактирования статьи Откат завершён Посмотреть Проблема с функцией Узнать больше Благодарность Видите продуктивную правку? Поблагодарите участника за его вклад. + Следить Обсуждение Общайтесь с другими редакторами. Сохраняйте часто используемые сообщения на странице обсуждения или используйте шаблон. Вы довольны этой функцией? @@ -1673,6 +1676,7 @@ Предложение по улучшению статьи Судя по всему, ваша недавняя правка без разрешения содержит материалы, защищенные авторским правом. Пожалуйста, убедитесь, что весь контент соответствует политике [[Wikipedia:Авторские права|авторское право]] этой Википедии, чтобы избежать удаления. Используйте примеры сообщения ниже для настройки, отправки и сохранения его в своих сообщениях. + Править Принять Отклонить Проблемы страницы @@ -1681,7 +1685,14 @@ Спасибо за ваше пожертвование! Ваша поддержка помогает Википедии и её родственным проектам процветать. Назад Открыть в системном браузере + Пожертвовать через Google Pay? + Пожертвовать через Google Pay Другой способ оплаты + Выберите сумму + Возникла проблема с пожертвованием? + Другие способы сделать пожертвование + Часто задаваемые вопросы + Информация об освобождении пожертвований от налогов Места Чтобы увидеть ваше местоположение на карте, требуется разрешение на определение местоположения. Пожалуйста, попробуйте ещё раз. Поиск мест diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 06d7767795f..3f5159c9aaa 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -389,6 +389,8 @@ ٹھیک ہے منسوخ ٻئے لوڈ کرو + محفوظ کرو + ترتیباں تے ون٘ڄو ٹیباں مضمون تفصیل مضمون diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 5ababa58e31..5f2967fcd3e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -486,7 +486,7 @@ 明亮 陰暗 漆黑 - 深褐 + 棕褐色 試樣文字 拖拉滑標來變更使用在閱讀條目的文字大小。要設定應用程式之外其餘文字大小部份,請在您的系統文字大小做變更。 套用佈景主題 @@ -862,6 +862,12 @@ 取消 您已達到摘要下端。 載入更多 + 選擇區域語言變體來改善閱讀體驗 + 您目前使用了未受支援通用中文語言變體來作為您的主要維基百科語言 + 儲存 + 請更新您的次要語言 + 您目前使用了未受支援通用中文語言變體來作為您的次要語言。請前往設定來選擇新的次要語言,或是確認您的語言清單。 + 前往設定 在 %s 的熱門條目 分頁 條目描述 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 568ec9d9e29..a41711b5d02 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -487,6 +487,10 @@ 自定义您的工具栏 您可以联系<a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">管理员</a>来讨论此封禁。 您尚未登录 + 明白了 + 您正在使用临时账号 + 放弃更改并登录 + 放弃临时账号 应用程序错误 我们很抱歉,维基百科应用发生了一个错误,并已终止。\n\n您要重启还是退出? 重启 @@ -875,6 +879,8 @@ 取消 您已到达信息流的底部。 加载更多 + 保存 + 请更新您的次要语言 %s的热门阅读 分页 条目描述 @@ -939,7 +945,7 @@ 菜单 将您喜欢的项目拖放到这里👋 重置到默认 - 按住拖拽图标移动项目 + 按住并拖动图标可移动项目 按下并拖拽一个要重新定位的项目 描述条目 说明图像 @@ -1275,6 +1281,12 @@ 高度 像素 插入 + 例如%s + %s(选填) + %s(推荐) + 了解更多 + 模板由用户生成,可能缺少完整描述。 + “%s”模板还没有描述。 帮助 登录/加入维基百科 您好,%s,您知道维基百科是人人都可编辑吗? @@ -1298,6 +1310,7 @@ 消息标题 发布 取消 + 不保存 消息发布到编辑的用户的讨论页面 消息已保存并发布到编辑的用户的讨论页面 已保存的消息 @@ -1576,6 +1589,7 @@ 了解更多 感谢 监视 + 讨论 帮助我们改进此功能 您对该功能满意吗? 满意 @@ -1623,6 +1637,7 @@ 地点 需要位置权限才能在地图上显示您的位置。请重试。 搜索地点 + 筛选语言 地图 列表 借助地点功能来探索周围的维基百科条目 From 6d0fe8015220c296efb6af63bf11bf5ed131d40e Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 16 May 2024 06:02:28 -0700 Subject: [PATCH 123/626] Convert Java test classes to Kotlin (#4665) * Convert OfflineCache test class to Kotlin * Convert more test cases * Remove Jvm --------- Co-authored-by: Dmitry Brant --- .../org/wikipedia/csrf/CsrfTokenClient.kt | 6 +- .../java/org/wikipedia/dataclient/WikiSite.kt | 1 - .../okhttp/OfflineCacheInterceptor.kt | 1 - .../okhttp/AvailableInputStreamTest.java | 32 --- .../okhttp/AvailableInputStreamTest.kt | 28 +++ .../okhttp/OfflineCacheInterceptorTest.java | 24 -- .../okhttp/OfflineCacheInterceptorTest.kt | 28 +++ .../wikipedia/language/LanguageUtilTest.kt | 7 - .../wikipedia/language/LanguageVariantTest.kt | 39 ++++ .../org/wikipedia/page/NamespaceTest.java | 103 --------- .../java/org/wikipedia/page/NamespaceTest.kt | 101 +++++++++ .../org/wikipedia/page/PageTitleTest.java | 160 -------------- .../java/org/wikipedia/page/PageTitleTest.kt | 205 ++++++++++++++++++ .../java/org/wikipedia/page/SectionTest.java | 24 -- .../java/org/wikipedia/page/SectionTest.kt | 25 +++ .../wikipedia/test/LanguageVariantTest.java | 81 ------- 16 files changed, 427 insertions(+), 438 deletions(-) delete mode 100644 app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.java create mode 100644 app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.kt delete mode 100644 app/src/test/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptorTest.java create mode 100644 app/src/test/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptorTest.kt create mode 100644 app/src/test/java/org/wikipedia/language/LanguageVariantTest.kt delete mode 100644 app/src/test/java/org/wikipedia/page/NamespaceTest.java create mode 100644 app/src/test/java/org/wikipedia/page/NamespaceTest.kt delete mode 100644 app/src/test/java/org/wikipedia/page/PageTitleTest.java create mode 100644 app/src/test/java/org/wikipedia/page/PageTitleTest.kt delete mode 100644 app/src/test/java/org/wikipedia/page/SectionTest.java create mode 100644 app/src/test/java/org/wikipedia/page/SectionTest.kt delete mode 100644 app/src/test/java/org/wikipedia/test/LanguageVariantTest.java diff --git a/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt b/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt index 47ebec8f774..3e7c61b4f1a 100644 --- a/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt +++ b/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt @@ -19,11 +19,7 @@ object CsrfTokenClient { private const val ANON_TOKEN = "+\\" private const val MAX_RETRIES = 3 - fun getToken(site: WikiSite, type: String = "csrf"): Observable { - return getToken(site, type, null) - } - - fun getToken(site: WikiSite, type: String = "csrf", svc: Service?): Observable { + fun getToken(site: WikiSite, type: String = "csrf", svc: Service? = null): Observable { return Observable.create { emitter -> var token = "" try { diff --git a/app/src/main/java/org/wikipedia/dataclient/WikiSite.kt b/app/src/main/java/org/wikipedia/dataclient/WikiSite.kt index 7c8bc198f95..d72da5abc23 100644 --- a/app/src/main/java/org/wikipedia/dataclient/WikiSite.kt +++ b/app/src/main/java/org/wikipedia/dataclient/WikiSite.kt @@ -132,7 +132,6 @@ data class WikiSite( DEFAULT_BASE_URL = url.ifEmpty { Service.WIKIPEDIA_URL } } - @JvmStatic fun forLanguageCode(languageCode: String): WikiSite { val uri = ensureScheme(Uri.parse(DEFAULT_BASE_URL)) return WikiSite( diff --git a/app/src/main/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptor.kt b/app/src/main/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptor.kt index 86f48b086d4..6a2072d5fbd 100644 --- a/app/src/main/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptor.kt +++ b/app/src/main/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptor.kt @@ -230,7 +230,6 @@ class OfflineCacheInterceptor : Interceptor { const val SAVE_HEADER_SAVE = "save" const val OFFLINE_PATH = "offline_files" - @JvmStatic fun shouldSave(request: Request): Boolean { return "GET" == request.method && SAVE_HEADER_SAVE == request.header(SAVE_HEADER) } diff --git a/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.java b/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.java deleted file mode 100644 index bebf743187a..00000000000 --- a/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.wikipedia.dataclient.okhttp; - -import org.junit.Test; -import org.wikipedia.test.TestFileUtil; - -import java.io.ByteArrayInputStream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -public class AvailableInputStreamTest { - - @SuppressWarnings("checkstyle:magicnumber") - @Test public void testAvailableInputStream() throws Throwable { - - byte[] contentBytes = TestFileUtil.readRawFile("page_lead_rb.json").getBytes(); - ByteArrayInputStream inputStream = new ByteArrayInputStream(contentBytes); - - AvailableInputStream availableStream - = new AvailableInputStream(inputStream, contentBytes.length); - - assertThat(availableStream.available(), is(contentBytes.length)); - - byte[] tempBytes = new byte[10]; - availableStream.read(); - availableStream.read(tempBytes); - availableStream.read(tempBytes, 0, 10); - availableStream.skip(10); - - assertThat(availableStream.available(), is(contentBytes.length - 31)); - } -} diff --git a/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.kt b/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.kt new file mode 100644 index 00000000000..d584d1b87f8 --- /dev/null +++ b/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.kt @@ -0,0 +1,28 @@ +package org.wikipedia.dataclient.okhttp + +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.junit.Test +import org.wikipedia.test.TestFileUtil +import java.io.ByteArrayInputStream + +class AvailableInputStreamTest { + @Test + @Throws(Throwable::class) + fun testAvailableInputStream() { + val contentBytes = TestFileUtil.readRawFile("page_lead_rb.json").toByteArray() + val inputStream = ByteArrayInputStream(contentBytes) + + val availableStream = AvailableInputStream(inputStream, contentBytes.size.toLong()) + + MatcherAssert.assertThat(availableStream.available(), Matchers.`is`(contentBytes.size)) + + val tempBytes = ByteArray(10) + availableStream.read() + availableStream.read(tempBytes) + availableStream.read(tempBytes, 0, 10) + availableStream.skip(10) + + MatcherAssert.assertThat(availableStream.available(), Matchers.`is`(contentBytes.size - 31)) + } +} diff --git a/app/src/test/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptorTest.java b/app/src/test/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptorTest.java deleted file mode 100644 index 07ba3311bc8..00000000000 --- a/app/src/test/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptorTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.wikipedia.dataclient.okhttp; - -import org.junit.Test; -import org.wikipedia.dataclient.Service; - -import okhttp3.Request; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -public class OfflineCacheInterceptorTest { - @Test public void testIsCacheableTrue() { - Request req = new Request.Builder() - .url(Service.WIKIPEDIA_URL) - .addHeader(OfflineCacheInterceptor.SAVE_HEADER, OfflineCacheInterceptor.SAVE_HEADER_SAVE) - .build(); - assertThat(OfflineCacheInterceptor.shouldSave(req), is(true)); - } - - @Test public void testIsCacheableFalse() { - Request req = new Request.Builder().url(Service.WIKIPEDIA_URL).build(); - assertThat(OfflineCacheInterceptor.shouldSave(req), is(false)); - } -} diff --git a/app/src/test/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptorTest.kt b/app/src/test/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptorTest.kt new file mode 100644 index 00000000000..bcc8ae19375 --- /dev/null +++ b/app/src/test/java/org/wikipedia/dataclient/okhttp/OfflineCacheInterceptorTest.kt @@ -0,0 +1,28 @@ +package org.wikipedia.dataclient.okhttp + +import okhttp3.Request +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.junit.Test +import org.wikipedia.dataclient.Service +import org.wikipedia.dataclient.okhttp.OfflineCacheInterceptor.Companion.shouldSave + +class OfflineCacheInterceptorTest { + @Test + fun testIsCacheableTrue() { + val request = Request.Builder() + .url(Service.WIKIPEDIA_URL) + .addHeader( + OfflineCacheInterceptor.SAVE_HEADER, + OfflineCacheInterceptor.SAVE_HEADER_SAVE + ) + .build() + MatcherAssert.assertThat(shouldSave(request), Matchers.`is`(true)) + } + + @Test + fun testIsCacheableFalse() { + val request = Request.Builder().url(Service.WIKIPEDIA_URL).build() + MatcherAssert.assertThat(shouldSave(request), Matchers.`is`(false)) + } +} diff --git a/app/src/test/java/org/wikipedia/language/LanguageUtilTest.kt b/app/src/test/java/org/wikipedia/language/LanguageUtilTest.kt index 3c3950abf82..6f3605f45ce 100644 --- a/app/src/test/java/org/wikipedia/language/LanguageUtilTest.kt +++ b/app/src/test/java/org/wikipedia/language/LanguageUtilTest.kt @@ -20,12 +20,8 @@ class LanguageUtilTest { "zh-MO" to AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE) list.forEach { - val defaultLocale = Locale.getDefault() - val locale = Locale.forLanguageTag(it.first) - Locale.setDefault(locale) val wikiLang = LanguageUtil.localeToWikiLanguageCode(Locale.forLanguageTag(it.first)) Assert.assertEquals(wikiLang, it.second) - Locale.setDefault(defaultLocale) } } @@ -35,11 +31,8 @@ class LanguageUtilTest { Locale.TAIWAN to AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE, Locale.CHINA to AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE) list.forEach { - val defaultLocale = Locale.getDefault() - Locale.setDefault(it.first) val wikiLang = LanguageUtil.localeToWikiLanguageCode(it.first) Assert.assertEquals(wikiLang, it.second) - Locale.setDefault(defaultLocale) } } } diff --git a/app/src/test/java/org/wikipedia/language/LanguageVariantTest.kt b/app/src/test/java/org/wikipedia/language/LanguageVariantTest.kt new file mode 100644 index 00000000000..7b7480d414e --- /dev/null +++ b/app/src/test/java/org/wikipedia/language/LanguageVariantTest.kt @@ -0,0 +1,39 @@ +package org.wikipedia.language + +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.wikipedia.WikipediaApp +import org.wikipedia.dataclient.WikiSite +import java.util.Locale + +@RunWith(RobolectricTestRunner::class) +class LanguageVariantTest { + + /** Ensure that the more specific dialect is first in the list. */ + @Test + fun testDefaultLocaleAndAcceptLanguageAgree() { + val defaultLocale = Locale.getDefault() + val appLanguage = WikipediaApp.instance.languageState.appLanguageCode + + testDefaultLocaleAndAcceptLanguageAgree("zh,zh-Hant;q=0.8", "zh", Locale.TRADITIONAL_CHINESE) + testDefaultLocaleAndAcceptLanguageAgree("zh,zh-Hans;q=0.8", "zh", Locale.SIMPLIFIED_CHINESE) + testDefaultLocaleAndAcceptLanguageAgree("zh,en;q=0.8", "zh", Locale.US) + testDefaultLocaleAndAcceptLanguageAgree("zh,en;q=0.8", "zh", Locale.ENGLISH) + testDefaultLocaleAndAcceptLanguageAgree("en,zh-Hans;q=0.8", "en", Locale.SIMPLIFIED_CHINESE) + testDefaultLocaleAndAcceptLanguageAgree("test,zh-Hans;q=0.8", "test", Locale.SIMPLIFIED_CHINESE) + testDefaultLocaleAndAcceptLanguageAgree("es,zh-Hans;q=0.9,zh-Hant;q=0.8", AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE, Locale.TRADITIONAL_CHINESE, WikiSite.forLanguageCode("es")) + testDefaultLocaleAndAcceptLanguageAgree("zh-Hant", AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE, Locale.TRADITIONAL_CHINESE) + + WikipediaApp.instance.languageState.setAppLanguageCodes(listOf(appLanguage)) + Locale.setDefault(defaultLocale) + } + + private fun testDefaultLocaleAndAcceptLanguageAgree(expected: String, appLanguage: String, systemLocale: Locale, wiki: WikiSite? = null) { + WikipediaApp.instance.languageState.setAppLanguageCodes(listOf(appLanguage)) + Locale.setDefault(systemLocale) + MatcherAssert.assertThat(expected, Matchers.`is`(WikipediaApp.instance.getAcceptLanguage(wiki))) + } +} diff --git a/app/src/test/java/org/wikipedia/page/NamespaceTest.java b/app/src/test/java/org/wikipedia/page/NamespaceTest.java deleted file mode 100644 index cf6fffc4d81..00000000000 --- a/app/src/test/java/org/wikipedia/page/NamespaceTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.wikipedia.page; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.wikipedia.dataclient.WikiSite; - -import java.util.Locale; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.wikipedia.page.Namespace.FILE; -import static org.wikipedia.page.Namespace.MAIN; -import static org.wikipedia.page.Namespace.MEDIA; -import static org.wikipedia.page.Namespace.SPECIAL; -import static org.wikipedia.page.Namespace.TALK; -import static org.wikipedia.page.Namespace.USER; -import static org.wikipedia.page.Namespace.USER_TALK; - -@RunWith(RobolectricTestRunner.class) public class NamespaceTest { - private static Locale PREV_DEFAULT_LOCALE; - - @BeforeClass public static void setUp() { - PREV_DEFAULT_LOCALE = Locale.getDefault(); - Locale.setDefault(Locale.ENGLISH); - } - - @AfterClass public static void tearDown() { - Locale.setDefault(PREV_DEFAULT_LOCALE); - } - - @Test public void testOf() { - assertThat(Namespace.of(SPECIAL.code()), is(SPECIAL)); - } - - @Test public void testFromLegacyStringMain() { - //noinspection deprecation - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("test"), null), is(MAIN)); - } - - @Test public void testFromLegacyStringFile() { - //noinspection deprecation - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("he"), "קובץ"), is(FILE)); - } - - @Test public void testFromLegacyStringSpecial() { - //noinspection deprecation - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("lez"), "Служебная"), is(SPECIAL)); - } - - @Test public void testFromLegacyStringTalk() { - //noinspection deprecation - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("en"), "Talk"), is(TALK)); - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("ru"), "Обсуждение"), is(TALK)); - } - - @Test public void testFromLegacyStringUser() { - //noinspection deprecation - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("en"), "User"), is(USER)); - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("af"), "Gebruiker"), is(USER)); - } - - @Test public void testFromLegacyStringUserTalk() { - //noinspection deprecation - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("en"), "User talk"), is(USER_TALK)); - assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("vi"), "Thảo luận Thành viên"), is(USER_TALK)); - } - - @Test public void testCode() { - assertThat(MAIN.code(), is(0)); - assertThat(TALK.code(), is(1)); - } - - @Test public void testSpecial() { - assertThat(SPECIAL.special(), is(true)); - assertThat(MAIN.special(), is(false)); - } - - @Test public void testMain() { - assertThat(MAIN.main(), is(true)); - assertThat(TALK.main(), is(false)); - } - - @Test public void testFile() { - assertThat(FILE.file(), is(true)); - assertThat(MAIN.file(), is(false)); - } - - @Test public void testTalkNegative() { - assertThat(MEDIA.talk(), is(false)); - assertThat(SPECIAL.talk(), is(false)); - } - - @Test public void testTalkZero() { - assertThat(MAIN.talk(), is(false)); - } - - @Test public void testTalkOdd() { - assertThat(TALK.talk(), is(true)); - } -} diff --git a/app/src/test/java/org/wikipedia/page/NamespaceTest.kt b/app/src/test/java/org/wikipedia/page/NamespaceTest.kt new file mode 100644 index 00000000000..6f140120b95 --- /dev/null +++ b/app/src/test/java/org/wikipedia/page/NamespaceTest.kt @@ -0,0 +1,101 @@ +package org.wikipedia.page + +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.wikipedia.dataclient.WikiSite + +@RunWith(RobolectricTestRunner::class) +class NamespaceTest { + + @Test + fun testOf() { + MatcherAssert.assertThat(Namespace.of(Namespace.SPECIAL.code()), Matchers.`is`(Namespace.SPECIAL)) + } + + @Test + fun testFromLegacyStringMain() { + MatcherAssert.assertThat( + Namespace.fromLegacyString(WikiSite.forLanguageCode("test"), null), + Matchers.`is`(Namespace.MAIN) + ) + } + + @Test + fun testFromLegacyStringFile() { + MatcherAssert.assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("he"), "קובץ"), + Matchers.`is`(Namespace.FILE)) + } + + @Test + fun testFromLegacyStringSpecial() { + MatcherAssert.assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("lez"), "Служебная"), + Matchers.`is`(Namespace.SPECIAL)) + } + + @Test + fun testFromLegacyStringTalk() { + MatcherAssert.assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("en"), "Talk"), + Matchers.`is`(Namespace.TALK)) + MatcherAssert.assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("ru"), "Обсуждение"), + Matchers.`is`(Namespace.TALK)) + } + + @Test + fun testFromLegacyStringUser() { + MatcherAssert.assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("en"), "User"), + Matchers.`is`(Namespace.USER)) + MatcherAssert.assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("af"), "Gebruiker"), + Matchers.`is`(Namespace.USER)) + } + + @Test + fun testFromLegacyStringUserTalk() { + MatcherAssert.assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("en"), "User talk"), + Matchers.`is`(Namespace.USER_TALK)) + MatcherAssert.assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("vi"), "Thảo luận Thành viên"), + Matchers.`is`(Namespace.USER_TALK)) + } + + @Test + fun testCode() { + MatcherAssert.assertThat(Namespace.MAIN.code(), Matchers.`is`(0)) + MatcherAssert.assertThat(Namespace.TALK.code(), Matchers.`is`(1)) + } + + @Test + fun testSpecial() { + MatcherAssert.assertThat(Namespace.SPECIAL.special(), Matchers.`is`(true)) + MatcherAssert.assertThat(Namespace.MAIN.special(), Matchers.`is`(false)) + } + + @Test + fun testMain() { + MatcherAssert.assertThat(Namespace.MAIN.main(), Matchers.`is`(true)) + MatcherAssert.assertThat(Namespace.TALK.main(), Matchers.`is`(false)) + } + + @Test + fun testFile() { + MatcherAssert.assertThat(Namespace.FILE.file(), Matchers.`is`(true)) + MatcherAssert.assertThat(Namespace.MAIN.file(), Matchers.`is`(false)) + } + + @Test + fun testTalkNegative() { + MatcherAssert.assertThat(Namespace.MEDIA.talk(), Matchers.`is`(false)) + MatcherAssert.assertThat(Namespace.SPECIAL.talk(), Matchers.`is`(false)) + } + + @Test + fun testTalkZero() { + MatcherAssert.assertThat(Namespace.MAIN.talk(), Matchers.`is`(false)) + } + + @Test + fun testTalkOdd() { + MatcherAssert.assertThat(Namespace.TALK.talk(), Matchers.`is`(true)) + } +} diff --git a/app/src/test/java/org/wikipedia/page/PageTitleTest.java b/app/src/test/java/org/wikipedia/page/PageTitleTest.java deleted file mode 100644 index 1d63796333b..00000000000 --- a/app/src/test/java/org/wikipedia/page/PageTitleTest.java +++ /dev/null @@ -1,160 +0,0 @@ -package org.wikipedia.page; - -import android.net.Uri; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.wikipedia.dataclient.WikiSite; -import org.wikipedia.staticdata.MainPageNameData; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.emptyString; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; - -@RunWith(RobolectricTestRunner.class) public class PageTitleTest { - @Test public void testPrefixedText() { - WikiSite enwiki = WikiSite.forLanguageCode("en"); - - assertThat(new PageTitle(null, "Test title", enwiki).getPrefixedText(), is("Test__title")); - assertThat(new PageTitle(null, "Test title", enwiki).getPrefixedText(), is("Test_title")); - assertThat(new PageTitle("Talk", "Test title", enwiki).getPrefixedText(), is("Talk:Test_title")); - assertThat(new PageTitle(null, "Test title", enwiki).getText(), is("Test_title")); - } - - @Test public void testFromInternalLink() { - WikiSite enwiki = WikiSite.forLanguageCode("en"); - - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/India", enwiki).getPrefixedText(), is("India")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/India", enwiki).getNamespace(), emptyString()); - - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India", enwiki).getNamespace(), is("Talk")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India", enwiki).getText(), is("India")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India", enwiki).getFragment(), nullValue()); - - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India#", enwiki).getNamespace(), is("Talk")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India#", enwiki).getText(), is("India")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India#", enwiki).getFragment(), nullValue()); - - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India#History", enwiki).getNamespace(), is("Talk")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India#History", enwiki).getText(), is("India")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Talk:India#History", enwiki).getFragment(), is("History")); - } - - @Test public void testCanonicalURL() { - WikiSite enwiki = WikiSite.forLanguageCode("en"); - - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/India", enwiki).getUri(), is("https://en.wikipedia.org/wiki/India")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/India Gate", enwiki).getUri(), is("https://en.wikipedia.org/wiki/India_Gate")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/India's Gate", enwiki).getUri(), is("https://en.wikipedia.org/wiki/India%27s_Gate")); - } - - @Test public void testVariants() { - WikiSite zhwiki = WikiSite.forLanguageCode("zh-hant"); - - assertThat(new PageTitle("Taiwan", WikiSite.forLanguageCode("en")).getUri(), is("https://en.wikipedia.org/wiki/Taiwan")); - assertThat(new PageTitle("Taiwan", WikiSite.forLanguageCode("zh")).getUri(), is("https://zh.wikipedia.org/zh/Taiwan")); - assertThat(new PageTitle("Taiwan", WikiSite.forLanguageCode("zh-hant")).getUri(), is("https://zh.wikipedia.org/zh-hant/Taiwan")); - assertThat(new PageTitle("Taiwan", WikiSite.forLanguageCode("zh-hans")).getUri(), is("https://zh.wikipedia.org/zh-hans/Taiwan")); - assertThat(PageTitle.Companion.titleForInternalLink("/zh/Taiwan", zhwiki).getUri(), is("https://zh.wikipedia.org/zh-hant/Taiwan")); - assertThat(PageTitle.Companion.titleForInternalLink("/zh-hant/Taiwan", zhwiki).getUri(), is("https://zh.wikipedia.org/zh-hant/Taiwan")); - assertThat(PageTitle.Companion.titleForInternalLink("/wiki/Taiwan", zhwiki).getUri(), is("https://zh.wikipedia.org/zh-hant/Taiwan")); - } - - @Test public void testWikiSite() { - WikiSite enwiki = WikiSite.forLanguageCode("en"); - assertThat(new PageTitle(null, "Test", enwiki).getWikiSite(), is(enwiki)); - assertThat(WikiSite.forLanguageCode("en"), is(enwiki)); - } - - @Test public void testLangAsNamespace() { - Uri uri = Uri.parse("https://en.wikipedia.org/wiki/fr:Article"); - WikiSite site = new WikiSite(uri); - PageTitle title = PageTitle.Companion.titleForUri(uri, site); - assertThat(title.getWikiSite().authority(), is("fr.wikipedia.org")); - assertThat(title.getDisplayText(), is("Article")); - } - - @Test public void testParsing() { - WikiSite enwiki = WikiSite.forLanguageCode("en"); - - assertThat(new PageTitle("Hello", enwiki).getDisplayText(), is("Hello")); - assertThat(new PageTitle("Talk:Hello", enwiki).getDisplayText(), is("Talk:Hello")); - assertThat(new PageTitle("Talk:Hello", enwiki).getText(), is("Hello")); - assertThat(new PageTitle("Talk:Hello", enwiki).getNamespace(), is("Talk")); - assertThat(new PageTitle("Wikipedia_talk:Hello world", enwiki).getDisplayText(), is("Wikipedia talk:Hello world")); - } - - @Test public void testSpecial() { - assertThat(new PageTitle("Special:Version", WikiSite.forLanguageCode("en")).isSpecial(), is(true)); - assertThat(new PageTitle("特別:Version", WikiSite.forLanguageCode("ja")).isSpecial(), is(true)); - assertThat(new PageTitle("Special:Version", WikiSite.forLanguageCode("ja")).isSpecial(), is(true)); - assertThat(new PageTitle("特別:Version", WikiSite.forLanguageCode("en")).isSpecial(), is(false)); - } - - @Test public void testFile() { - assertThat(new PageTitle("File:SomethingSomething", WikiSite.forLanguageCode("en")).isFilePage(), is(true)); - assertThat(new PageTitle("ファイル:Version", WikiSite.forLanguageCode("ja")).isFilePage(), is(true)); - assertThat(new PageTitle("File:SomethingSomething", WikiSite.forLanguageCode("ja")).isFilePage(), is(true)); - assertThat(new PageTitle("ファイル:Version", WikiSite.forLanguageCode("en")).isFilePage(), is(false)); - } - - @Test public void testMainPage() { - WikiSite enwiki = WikiSite.forLanguageCode("en"); - assertThat(new PageTitle("", enwiki).getPrefixedText(), is(new PageTitle(MainPageNameData.valueFor("en"), enwiki).getPrefixedText())); - } - - @Test public void testIsMainPageNoTitleNoProps() { - final String text = null; - WikiSite wiki = WikiSite.forLanguageCode("test"); - PageTitle subject = new PageTitle(text, wiki); - - assertThat(subject.isMainPage(), is(true)); - } - - @Test public void testIsMainPageTitleNoProps() { - String text = "text"; - WikiSite wiki = WikiSite.forLanguageCode("test"); - PageTitle subject = new PageTitle(text, wiki); - - assertThat(subject.isMainPage(), is(false)); - } - - /** https://bugzilla.wikimedia.org/66151 */ - @Test public void testHashChar() { - PageTitle pageTitle = new PageTitle("#", WikiSite.forLanguageCode("en")); - assertThat(pageTitle.getNamespace(), emptyString()); - assertThat(pageTitle.getText(), is("")); - assertThat(pageTitle.getFragment(), nullValue()); - } - - @Test public void testColonChar() { - PageTitle pageTitle = new PageTitle(":", WikiSite.forLanguageCode("en")); - assertThat(pageTitle.getNamespace(), emptyString()); - assertThat(pageTitle.getText(), is(":")); - assertThat(pageTitle.getFragment(), nullValue()); - } - - @Test public void testEquality() { - PageTitle title1 = new PageTitle("Test Article", WikiSite.forLanguageCode("en")); - PageTitle title2 = new PageTitle("Test Article", WikiSite.forLanguageCode("en")); - assertThat(title1.equals(title2), is(true)); - assertThat(title2.equals(title1), is(true)); - title2.setDisplayText("TEST ARTICLE"); - title2.setThumbUrl("http://thumb.url"); - title2.setExtract("Foo"); - title2.setDescription("Bar"); - assertThat(title1.equals(title2), is(true)); - assertThat(title2.equals(title1), is(true)); - title2.setNamespace("File"); - assertThat(title1.equals(title2), is(false)); - assertThat(title2.equals(title1), is(false)); - - title2 = new PageTitle("Test Article", WikiSite.forLanguageCode("ru")); - assertThat(title1.equals(title2), is(false)); - assertThat(title2.equals(title1), is(false)); - - assertThat(title1.equals(new Object()), is(false)); - } -} diff --git a/app/src/test/java/org/wikipedia/page/PageTitleTest.kt b/app/src/test/java/org/wikipedia/page/PageTitleTest.kt new file mode 100644 index 00000000000..2dd1bf6708d --- /dev/null +++ b/app/src/test/java/org/wikipedia/page/PageTitleTest.kt @@ -0,0 +1,205 @@ +package org.wikipedia.page + +import android.net.Uri +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.wikipedia.dataclient.WikiSite +import org.wikipedia.staticdata.MainPageNameData + +@RunWith(RobolectricTestRunner::class) +class PageTitleTest { + @Test + fun testPrefixedText() { + val enwiki = WikiSite.forLanguageCode("en") + + MatcherAssert.assertThat(PageTitle(null, "Test title", enwiki).prefixedText, + Matchers.`is`("Test__title")) + MatcherAssert.assertThat(PageTitle(null, "Test title", enwiki).prefixedText, + Matchers.`is`("Test_title")) + MatcherAssert.assertThat(PageTitle("Talk", "Test title", enwiki).prefixedText, + Matchers.`is`("Talk:Test_title")) + MatcherAssert.assertThat(PageTitle(null, "Test title", enwiki).text, + Matchers.`is`("Test_title")) + } + + @Test + fun testFromInternalLink() { + val enwiki = WikiSite.forLanguageCode("en") + + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/India", enwiki).prefixedText, + Matchers.`is`("India")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/India", enwiki).namespace, + Matchers.emptyString()) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India", enwiki).namespace, + Matchers.`is`("Talk")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India", enwiki).text, + Matchers.`is`("India")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India", enwiki).fragment, + Matchers.nullValue()) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India#", enwiki).namespace, + Matchers.`is`("Talk")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India#", enwiki).text, + Matchers.`is`("India")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India#", enwiki).fragment, + Matchers.nullValue()) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India#History", enwiki).namespace, + Matchers.`is`("Talk")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India#History", enwiki).text, + Matchers.`is`("India")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Talk:India#History", enwiki).fragment, + Matchers.`is`("History")) + } + + @Test + fun testCanonicalURL() { + val enwiki = WikiSite.forLanguageCode("en") + + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/India", enwiki).uri, + Matchers.`is`("https://en.wikipedia.org/wiki/India")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/India Gate", enwiki).uri, + Matchers.`is`("https://en.wikipedia.org/wiki/India_Gate")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/India's Gate", enwiki).uri, + Matchers.`is`("https://en.wikipedia.org/wiki/India%27s_Gate")) + } + + @Test + fun testVariants() { + val zhwiki = WikiSite.forLanguageCode("zh-tw") + + MatcherAssert.assertThat(PageTitle("Taiwan", WikiSite.forLanguageCode("en")).uri, + Matchers.`is`("https://en.wikipedia.org/wiki/Taiwan")) + MatcherAssert.assertThat(PageTitle("Taiwan", WikiSite.forLanguageCode("zh")).uri, + Matchers.`is`("https://zh.wikipedia.org/zh/Taiwan")) + MatcherAssert.assertThat(PageTitle("Taiwan", WikiSite.forLanguageCode("zh-tw")).uri, + Matchers.`is`("https://zh.wikipedia.org/zh-tw/Taiwan")) + MatcherAssert.assertThat(PageTitle("Taiwan", WikiSite.forLanguageCode("zh-cn")).uri, + Matchers.`is`("https://zh.wikipedia.org/zh-cn/Taiwan")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/zh/Taiwan", zhwiki).uri, + Matchers.`is`("https://zh.wikipedia.org/zh-tw/Taiwan")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/zh-tw/Taiwan", zhwiki).uri, + Matchers.`is`("https://zh.wikipedia.org/zh-tw/Taiwan")) + MatcherAssert.assertThat(PageTitle.titleForInternalLink("/wiki/Taiwan", zhwiki).uri, + Matchers.`is`("https://zh.wikipedia.org/zh-tw/Taiwan")) + } + + @Test + fun testWikiSite() { + val enwiki = WikiSite.forLanguageCode("en") + MatcherAssert.assertThat(PageTitle(null, "Test", enwiki).wikiSite, Matchers.`is`(enwiki)) + MatcherAssert.assertThat(WikiSite.forLanguageCode("en"), Matchers.`is`(enwiki)) + } + + @Test + fun testLangAsNamespace() { + val uri = Uri.parse("https://en.wikipedia.org/wiki/fr:Article") + val site = WikiSite(uri) + val title = PageTitle.titleForUri(uri, site) + MatcherAssert.assertThat(title.wikiSite.authority(), Matchers.`is`("fr.wikipedia.org")) + MatcherAssert.assertThat(title.displayText, Matchers.`is`("Article")) + } + + @Test + fun testParsing() { + val enwiki = WikiSite.forLanguageCode("en") + + MatcherAssert.assertThat(PageTitle("Hello", enwiki).displayText, Matchers.`is`("Hello")) + MatcherAssert.assertThat(PageTitle("Talk:Hello", enwiki).displayText, + Matchers.`is`("Talk:Hello")) + MatcherAssert.assertThat(PageTitle("Talk:Hello", enwiki).text, Matchers.`is`("Hello")) + MatcherAssert.assertThat(PageTitle("Talk:Hello", enwiki).namespace, Matchers.`is`("Talk")) + MatcherAssert.assertThat(PageTitle("Wikipedia_talk:Hello world", enwiki).displayText, + Matchers.`is`("Wikipedia talk:Hello world")) + } + + @Test + fun testSpecial() { + MatcherAssert.assertThat(PageTitle("Special:Version", WikiSite.forLanguageCode("en")).isSpecial, + Matchers.`is`(true)) + MatcherAssert.assertThat(PageTitle("特別:Version", WikiSite.forLanguageCode("ja")).isSpecial, + Matchers.`is`(true)) + MatcherAssert.assertThat(PageTitle("Special:Version", WikiSite.forLanguageCode("ja")).isSpecial, + Matchers.`is`(true)) + MatcherAssert.assertThat(PageTitle("特別:Version", WikiSite.forLanguageCode("en")).isSpecial, + Matchers.`is`(false)) + } + + @Test + fun testFile() { + MatcherAssert.assertThat(PageTitle("File:SomethingSomething", WikiSite.forLanguageCode("en")).isFilePage, + Matchers.`is`(true)) + MatcherAssert.assertThat(PageTitle("ファイル:Version", WikiSite.forLanguageCode("ja")).isFilePage, + Matchers.`is`(true)) + MatcherAssert.assertThat(PageTitle("File:SomethingSomething", WikiSite.forLanguageCode("ja")).isFilePage, + Matchers.`is`(true)) + MatcherAssert.assertThat(PageTitle("ファイル:Version", WikiSite.forLanguageCode("en")).isFilePage, + Matchers.`is`(false)) + } + + @Test + fun testMainPage() { + val enwiki = WikiSite.forLanguageCode("en") + MatcherAssert.assertThat(PageTitle("", enwiki).prefixedText, + Matchers.`is`(PageTitle(MainPageNameData.valueFor("en"), enwiki).prefixedText)) + } + + @Test + fun testIsMainPageNoTitleNoProps() { + val text: String? = null + val wiki = WikiSite.forLanguageCode("test") + val subject = PageTitle(text, wiki) + + MatcherAssert.assertThat(subject.isMainPage, Matchers.`is`(true)) + } + + @Test + fun testIsMainPageTitleNoProps() { + val text = "text" + val wiki = WikiSite.forLanguageCode("test") + val subject = PageTitle(text, wiki) + + MatcherAssert.assertThat(subject.isMainPage, Matchers.`is`(false)) + } + + /** https://bugzilla.wikimedia.org/66151 */ + @Test + fun testHashChar() { + val pageTitle = PageTitle("#", WikiSite.forLanguageCode("en")) + MatcherAssert.assertThat(pageTitle.namespace, Matchers.emptyString()) + MatcherAssert.assertThat(pageTitle.text, Matchers.`is`("")) + MatcherAssert.assertThat(pageTitle.fragment, Matchers.nullValue()) + } + + @Test + fun testColonChar() { + val pageTitle = PageTitle(":", WikiSite.forLanguageCode("en")) + MatcherAssert.assertThat(pageTitle.namespace, Matchers.emptyString()) + MatcherAssert.assertThat(pageTitle.text, Matchers.`is`(":")) + MatcherAssert.assertThat(pageTitle.fragment, Matchers.nullValue()) + } + + @Test + fun testEquality() { + val title1 = PageTitle("Test Article", WikiSite.forLanguageCode("en")) + var title2 = PageTitle("Test Article", WikiSite.forLanguageCode("en")) + MatcherAssert.assertThat(title1, Matchers.`is`(title2)) + MatcherAssert.assertThat(title2, Matchers.`is`(title1)) + title2.displayText = "TEST ARTICLE" + title2.thumbUrl = "http://thumb.url" + title2.extract = "Foo" + title2.description = "Bar" + MatcherAssert.assertThat(title1, Matchers.`is`(title2)) + MatcherAssert.assertThat(title2, Matchers.`is`(title1)) + title2.namespace = "File" + MatcherAssert.assertThat(title1, Matchers.not(title2)) + MatcherAssert.assertThat(title2, Matchers.not(title1)) + + title2 = PageTitle("Test Article", WikiSite.forLanguageCode("ru")) + MatcherAssert.assertThat(title1, Matchers.not(title2)) + MatcherAssert.assertThat(title2, Matchers.not(title1)) + + MatcherAssert.assertThat(title1, Matchers.not(Any())) + } +} diff --git a/app/src/test/java/org/wikipedia/page/SectionTest.java b/app/src/test/java/org/wikipedia/page/SectionTest.java deleted file mode 100644 index 96d733e8b2c..00000000000 --- a/app/src/test/java/org/wikipedia/page/SectionTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.wikipedia.page; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -@RunWith(RobolectricTestRunner.class) public class SectionTest { - @Test public void testSectionLead() { - // Section 0 is the lead - Section section = new Section(0, 0, "Heading", "Heading", "Content"); - assertThat(section.isLead(), is(true)); - - // Section 1 is not - section = new Section(1, 1, "Heading", "Heading", "Content"); - assertThat(section.isLead(), is(false)); - - // Section 1 is not, even if it's somehow at level 0 - section = new Section(1, 0, "Heading", "Heading", "Content"); - assertThat(section.isLead(), is(false)); - } -} diff --git a/app/src/test/java/org/wikipedia/page/SectionTest.kt b/app/src/test/java/org/wikipedia/page/SectionTest.kt new file mode 100644 index 00000000000..7cb252bc1ca --- /dev/null +++ b/app/src/test/java/org/wikipedia/page/SectionTest.kt @@ -0,0 +1,25 @@ +package org.wikipedia.page + +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class SectionTest { + @Test + fun testSectionLead() { + // Section 0 is the lead + var section = Section(0, 0, "Heading", "Heading", "Content") + MatcherAssert.assertThat(section.isLead, Matchers.`is`(true)) + + // Section 1 is not + section = Section(1, 1, "Heading", "Heading", "Content") + MatcherAssert.assertThat(section.isLead, Matchers.`is`(false)) + + // Section 1 is not, even if it's somehow at level 0 + section = Section(1, 0, "Heading", "Heading", "Content") + MatcherAssert.assertThat(section.isLead, Matchers.`is`(false)) + } +} diff --git a/app/src/test/java/org/wikipedia/test/LanguageVariantTest.java b/app/src/test/java/org/wikipedia/test/LanguageVariantTest.java deleted file mode 100644 index f4b0163dd90..00000000000 --- a/app/src/test/java/org/wikipedia/test/LanguageVariantTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.wikipedia.test; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.wikipedia.WikipediaApp; -import org.wikipedia.dataclient.WikiSite; -import org.wikipedia.language.AppLanguageLookUpTable; - -import java.util.Collections; -import java.util.Locale; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -@RunWith(RobolectricTestRunner.class) public class LanguageVariantTest { - private Locale defaultLocale; - private String appLanguage; - - /** Ensure that the more specific dialect is first in the list. */ - @Test public void testDefaultLocaleAndAcceptLanguageAgree() { - preserveAppState(); - - testDefaultLocaleAndAcceptLanguageAgree("zh,zh-Hant;q=0.8", "zh", - Locale.TRADITIONAL_CHINESE); - testDefaultLocaleAndAcceptLanguageAgree("zh,zh-Hans;q=0.8", "zh", - Locale.SIMPLIFIED_CHINESE); - testDefaultLocaleAndAcceptLanguageAgree("zh,en;q=0.8", "zh", Locale.US); - testDefaultLocaleAndAcceptLanguageAgree("zh,en;q=0.8", "zh", Locale.ENGLISH); - testDefaultLocaleAndAcceptLanguageAgree("en,zh-Hans;q=0.8", "en", - Locale.SIMPLIFIED_CHINESE); - testDefaultLocaleAndAcceptLanguageAgree("test,zh-Hans;q=0.8", "test", - Locale.SIMPLIFIED_CHINESE); - testDefaultLocaleAndAcceptLanguageAgree("es,zh-Hans;q=0.9,zh-Hant;q=0.8", - AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE, - Locale.TRADITIONAL_CHINESE, WikiSite.forLanguageCode("es")); - testDefaultLocaleAndAcceptLanguageAgree("zh-Hant", - AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE, - Locale.TRADITIONAL_CHINESE); - - restoreAppState(); - } - - private void testDefaultLocaleAndAcceptLanguageAgree(String expected, String appLanguage, - Locale systemLocale) { - testDefaultLocaleAndAcceptLanguageAgree(expected, appLanguage, systemLocale, null); - } - - private void testDefaultLocaleAndAcceptLanguageAgree(String expected, - String appLanguage, Locale systemLocale, WikiSite wiki) { - WikipediaApp.Companion.getInstance().getLanguageState().setAppLanguageCodes(Collections.singletonList(appLanguage)); - Locale.setDefault(systemLocale); - assertThat(expected, is(WikipediaApp.Companion.getInstance().getAcceptLanguage(wiki))); - } - - private void preserveAppState() { - preserveDefaultLocale(); - preserveAppLanguage(); - } - - private void restoreAppState() { - restoreAppLanguage(); - restoreDefaultLocale(); - } - - private void preserveAppLanguage() { - appLanguage = WikipediaApp.Companion.getInstance().getLanguageState().getAppLanguageCode(); - } - - private void restoreAppLanguage() { - WikipediaApp.Companion.getInstance().getLanguageState().setAppLanguageCodes(Collections.singletonList(appLanguage)); - } - - private void preserveDefaultLocale() { - defaultLocale = Locale.getDefault(); - } - - private void restoreDefaultLocale() { - Locale.setDefault(defaultLocale); - } -} From 779f82568bcec55897a9586c645863c2eb2da33d Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 16 May 2024 06:16:37 -0700 Subject: [PATCH 124/626] Hygiene: clean up and update to present code style for LangLinksActivity (#4675) Co-authored-by: Dmitry Brant --- .../wikipedia/language/LangLinksActivity.kt | 22 +++++++++++++------ .../java/org/wikipedia/page/PageActivity.kt | 6 +---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/wikipedia/language/LangLinksActivity.kt b/app/src/main/java/org/wikipedia/language/LangLinksActivity.kt index fe78a2b4450..ee435d174f2 100644 --- a/app/src/main/java/org/wikipedia/language/LangLinksActivity.kt +++ b/app/src/main/java/org/wikipedia/language/LangLinksActivity.kt @@ -1,13 +1,19 @@ package org.wikipedia.language import android.content.Context +import android.content.Intent import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.view.ActionMode import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.activity.BaseActivity @@ -229,13 +235,13 @@ class LangLinksActivity : BaseActivity() { } } - private open inner class DefaultViewHolder constructor(itemView: View) : RecyclerView.ViewHolder(itemView) { + private open inner class DefaultViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { open fun bindItem(pageTitle: PageTitle) { itemView.findViewById(R.id.section_header_text).text = StringUtil.fromHtml(pageTitle.displayText) } } - private inner class LangLinksItemViewHolder constructor(itemView: View) : DefaultViewHolder(itemView), View.OnClickListener { + private inner class LangLinksItemViewHolder(itemView: View) : DefaultViewHolder(itemView), View.OnClickListener { private val localizedLanguageNameTextView = itemView.findViewById(R.id.localized_language_name) private val nonLocalizedLanguageNameTextView = itemView.findViewById(R.id.non_localized_language_name) private val articleTitleTextView = itemView.findViewById(R.id.language_subtitle) @@ -259,8 +265,7 @@ class LangLinksActivity : BaseActivity() { override fun onClick(v: View) { app.languageState.addMruLanguageCode(pageTitle.wikiSite.languageCode) - val historyEntry = HistoryEntry(pageTitle, HistoryEntry.SOURCE_LANGUAGE_LINK) - val intent = PageActivity.newIntentForCurrentTab(this@LangLinksActivity, historyEntry, pageTitle, false) + val intent = PageActivity.newIntentForCurrentTab(this@LangLinksActivity, HistoryEntry(pageTitle, HistoryEntry.SOURCE_LANGUAGE_LINK), pageTitle, false) setResult(ACTIVITY_RESULT_LANGLINK_SELECT, intent) DeviceUtil.hideSoftKeyboard(this@LangLinksActivity) finish() @@ -269,9 +274,12 @@ class LangLinksActivity : BaseActivity() { companion object { const val ACTIVITY_RESULT_LANGLINK_SELECT = 1 - const val ACTION_LANGLINKS_FOR_TITLE = "org.wikipedia.langlinks_for_title" - private const val VIEW_TYPE_HEADER = 0 private const val VIEW_TYPE_ITEM = 1 + + fun newIntent(context: Context, title: PageTitle): Intent { + return Intent(context, LangLinksActivity::class.java) + .putExtra(Constants.ARG_TITLE, title) + } } } diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.kt b/app/src/main/java/org/wikipedia/page/PageActivity.kt index 6b13ea900b2..8e6a031008a 100644 --- a/app/src/main/java/org/wikipedia/page/PageActivity.kt +++ b/app/src/main/java/org/wikipedia/page/PageActivity.kt @@ -430,11 +430,7 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo } override fun onPageRequestLangLinks(title: PageTitle) { - val langIntent = Intent() - langIntent.setClass(this, LangLinksActivity::class.java) - langIntent.action = LangLinksActivity.ACTION_LANGLINKS_FOR_TITLE - langIntent.putExtra(Constants.ARG_TITLE, title) - requestHandleIntentLauncher.launch(langIntent) + requestHandleIntentLauncher.launch(LangLinksActivity.newIntent(this, title)) } override fun onPageRequestGallery(title: PageTitle, fileName: String, wikiSite: WikiSite, revision: Long, source: Int, options: ActivityOptionsCompat?) { From 12a42776829911073babd60549b8a7a62e4f6bb1 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 16 May 2024 09:58:14 -0700 Subject: [PATCH 125/626] Correctly handle language variants selection in LangLinks (#4644) --- .../java/org/wikipedia/language/LangLinksViewModel.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt b/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt index dd37d893bcb..aede093c035 100644 --- a/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt +++ b/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt @@ -17,7 +17,6 @@ import org.wikipedia.page.PageTitle import org.wikipedia.staticdata.MainPageNameData import org.wikipedia.util.Resource import org.wikipedia.util.SingleLiveData -import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L class LangLinksViewModel(bundle: Bundle) : ViewModel() { @@ -124,17 +123,14 @@ class LangLinksViewModel(bundle: Bundle) : ViewModel() { companion object { fun addVariantEntriesIfNeeded(language: AppLanguageState, title: PageTitle, languageEntries: MutableList) { - if (languageEntries.isEmpty()) { - return - } val parentLanguageCode = language.getDefaultLanguageCode(title.wikiSite.languageCode) if (parentLanguageCode != null) { val languageVariants = language.getLanguageVariants(parentLanguageCode) if (languageVariants != null) { for (languageCode in languageVariants) { if (!title.wikiSite.languageCode.contains(languageCode)) { - val pageTitle = PageTitle(if (title.isMainPage) MainPageNameData.valueFor(languageCode) else title.displayText, WikiSite.forLanguageCode(languageCode)) - pageTitle.text = StringUtil.removeNamespace(title.prefixedText) + val pageTitle = PageTitle(if (title.isMainPage) MainPageNameData.valueFor(languageCode) else title.prefixedText, WikiSite.forLanguageCode(languageCode)) + pageTitle.displayText = title.displayText languageEntries.add(pageTitle) } } From 73bd2066a0f066864907917d98a66e9920db6e6a Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Fri, 17 May 2024 06:05:27 -0700 Subject: [PATCH 126/626] Fix: correctly extract language code from Url in WikiSite (#4678) --- .../main/java/org/wikipedia/util/UriUtil.kt | 9 +++---- .../org/wikipedia/dataclient/WikiSiteTest.kt | 26 ++++++++++++++++++- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/wikipedia/util/UriUtil.kt b/app/src/main/java/org/wikipedia/util/UriUtil.kt index 30dfb35b947..e8ff58c37ab 100644 --- a/app/src/main/java/org/wikipedia/util/UriUtil.kt +++ b/app/src/main/java/org/wikipedia/util/UriUtil.kt @@ -133,13 +133,10 @@ object UriUtil { return removeFragment(removeLinkPrefix(url)).replace("_", " ") } - /** Get language variant code from a Uri, e.g. "zh.*", otherwise returns empty string. */ + /** Get language variant code from a Uri path, e.g. "/wiki/Foo" or "/zh-tw/Foo". + * It will return "zh-tw" or an empty string */ fun getLanguageVariantFromUri(uri: Uri): String { - if (uri.path.isNullOrEmpty()) { - return "" - } - val parts = uri.path!!.split('/') - return if (parts.size > 1 && parts[0] != "wiki") parts[0] else "" + return uri.path?.split('/')?.getOrNull(1)?.takeUnless { it == "wiki" }.orEmpty() } /** For internal links only */ diff --git a/app/src/test/java/org/wikipedia/dataclient/WikiSiteTest.kt b/app/src/test/java/org/wikipedia/dataclient/WikiSiteTest.kt index b479c18edb8..ef0051f9d47 100644 --- a/app/src/test/java/org/wikipedia/dataclient/WikiSiteTest.kt +++ b/app/src/test/java/org/wikipedia/dataclient/WikiSiteTest.kt @@ -100,7 +100,31 @@ class WikiSiteTest { @Test fun testCtorUriLangVariant() { - val subject = WikiSite("zh.wikipedia.org/zh-hant/Foo") + var subject = WikiSite("en.wikipedia.org/wiki/Foo") + MatcherAssert.assertThat(subject.authority(), Matchers.`is`("en.wikipedia.org")) + MatcherAssert.assertThat(subject.subdomain(), Matchers.`is`("en")) + MatcherAssert.assertThat(subject.languageCode, Matchers.`is`("en")) + MatcherAssert.assertThat(subject.scheme(), Matchers.`is`("https")) + MatcherAssert.assertThat(subject.dbName(), Matchers.`is`("enwiki")) + MatcherAssert.assertThat(subject.url(), Matchers.`is`("https://en.wikipedia.org")) + + subject = WikiSite("zh.wikipedia.org/zh-tw/Foo") + MatcherAssert.assertThat(subject.authority(), Matchers.`is`("zh.wikipedia.org")) + MatcherAssert.assertThat(subject.subdomain(), Matchers.`is`("zh")) + MatcherAssert.assertThat(subject.languageCode, Matchers.`is`("zh-tw")) + MatcherAssert.assertThat(subject.scheme(), Matchers.`is`("https")) + MatcherAssert.assertThat(subject.dbName(), Matchers.`is`("zhwiki")) + MatcherAssert.assertThat(subject.url(), Matchers.`is`("https://zh.wikipedia.org")) + + subject = WikiSite("zh.wikipedia.org/zh-cn/Foo") + MatcherAssert.assertThat(subject.authority(), Matchers.`is`("zh.wikipedia.org")) + MatcherAssert.assertThat(subject.subdomain(), Matchers.`is`("zh")) + MatcherAssert.assertThat(subject.languageCode, Matchers.`is`("zh-cn")) + MatcherAssert.assertThat(subject.scheme(), Matchers.`is`("https")) + MatcherAssert.assertThat(subject.dbName(), Matchers.`is`("zhwiki")) + MatcherAssert.assertThat(subject.url(), Matchers.`is`("https://zh.wikipedia.org")) + + subject = WikiSite("zh.wikipedia.org/zh-hant/Foo") MatcherAssert.assertThat(subject.authority(), Matchers.`is`("zh.wikipedia.org")) MatcherAssert.assertThat(subject.subdomain(), Matchers.`is`("zh")) MatcherAssert.assertThat(subject.languageCode, Matchers.`is`("zh-hant")) From 7faaa1e20cd28caf52a8ab8fe1594a2cec1e20fa Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 17 May 2024 15:47:59 -0400 Subject: [PATCH 127/626] GPay: Fix setting language for currency NumberFormat. (#4680) --- app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt index e77421c4731..8b42b46471a 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt @@ -27,11 +27,11 @@ import kotlin.math.abs class GooglePayViewModel : ViewModel() { val uiState = MutableStateFlow(Resource()) - var donationConfig: DonationConfig? = null + private var donationConfig: DonationConfig? = null private val currentCountryCode get() = GeoUtil.geoIPCountry.orEmpty() val currencyFormat: NumberFormat = NumberFormat.getCurrencyInstance(Locale.Builder() - .setRegion(currentCountryCode).setLanguage(WikipediaApp.instance.appOrSystemLanguageCode).build()) + .setLocale(Locale.getDefault()).setRegion(currentCountryCode).build()) val currencyCode get() = currencyFormat.currency?.currencyCode ?: GooglePayComponent.CURRENCY_FALLBACK val currencySymbol get() = currencyFormat.currency?.symbol ?: "$" val decimalFormat = GooglePayComponent.getDecimalFormat(currencyCode) From d6e160120af5872c2620029a7392d737b9d3b160 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 17 May 2024 16:05:52 -0400 Subject: [PATCH 128/626] Image recs: insert into infobox only for English. (#4679) Co-authored-by: Cooltey Feng --- .../org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt b/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt index 4dd0fe19864..1c136e20920 100644 --- a/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt +++ b/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt @@ -220,7 +220,10 @@ class InsertMediaViewModel(bundle: Bundle) : ViewModel() { } } - if (autoInsert && attemptInfobox && infoboxMatch != null) { + // Verify a few conditions before attempting to insert into an infobox, including + // whether the infobox actually exists, and whether the current language wiki is + // supported by our hardcoded infoboxVars. + if (autoInsert && attemptInfobox && infoboxMatch != null && infoboxVarsByLang.containsKey(langCode)) { val infoboxStartIndex = infoboxMatch.range.first val infoboxEndIndex = infoboxMatch.range.last From 17dc38a198f4ee3e6cd7dcebe36495abb0515d47 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 20 May 2024 18:18:38 +0530 Subject: [PATCH 129/626] Localisation updates from https://translatewiki.net. (#4683) --- app/src/main/res/values-bn/strings.xml | 1 + app/src/main/res/values-br/strings.xml | 2 ++ app/src/main/res/values-ca/strings.xml | 26 ++++++++++++++-- app/src/main/res/values-ia/strings.xml | 6 ++++ app/src/main/res/values-iw/strings.xml | 6 ++++ app/src/main/res/values-ja/strings.xml | 20 +++++++----- app/src/main/res/values-lb/strings.xml | 2 ++ app/src/main/res/values-sr/strings.xml | 4 +++ app/src/main/res/values-uk/strings.xml | 42 +++++++++++++++++++------- app/src/main/res/values-zh/strings.xml | 4 +++ 10 files changed, 92 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 49cb28f4e43..adc165d25a4 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -716,6 +716,7 @@ বাতিল আপনি ফিডের একদম শেষে পৌঁছে গেছেন। আরও লোড করুন + সেটিংসে যান %s-এ শীর্ষ পঠিত ট্যাব নিবন্ধের বিবরণ diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index aa39fdc3de2..9c9e407d0c5 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -814,6 +814,8 @@ Mat eo Nullañ Kargañ muioc\'h + Enrollañ + Mont d\'an arventennoù Steudennoù Deskrivadur ar pennad Pennad diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ef0993c8d55..009dd665e50 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -19,6 +19,7 @@ * McDutchie * Mguix * Paucabot +* Rbndev * SMP * Skurz0 * Ssola @@ -130,6 +131,7 @@ Mostra al mapa Llegeix en una altra llengua Disponible en %d altres llengües + CC BY-SA 4.0 En publicar accepteu les <a href=\"%1$s\">condicions d\'ús</a> i que alliberareu irrevocablement les vostres contribucions sota la llicència <a href=\"%2$s\">CC BY-SA 4.0</a>. En publicar accepteu les <a href=\"%1$s\">condicions d\'ús</a> i que alliberareu irrevocablement les vostres contribucions sota la llicència <a href=\"%2$s\">CC BY-SA 4.0</a>. Les edicions s\'atribuiran a l\'adreça IP del vostre dispositiu. Si <a href=\"https://#login\">inicieu una sessió</a> gaudireu de més privadesa. Les edicions s\'atribuiran a l\'adreça IP del vostre dispositiu. Si <a href=\"https://#login\">inicieu una sessió</a>, gaudireu de més privadesa. @@ -141,6 +143,7 @@ Les vostres llengües de la Viquipèdia Publica els canvis Modificació publicada! + S\'ha publicat l\'edició. Els canvis poden trigar un temps a aparèixer. La modificació no s\'ha desat! Torna-ho a provar Cancel·la @@ -183,6 +186,8 @@ Heu finalitzat la sessió de la Viquipèdia. Voleu provar d\'iniciar la sessió de nou? Inicia una sessió Cancel·la + Fes desaparèixer el compte + Avís de supressió del compte No hi ha articles vists recentment Consulteu el que heu llegit aquí. Alguns articles de l\'historial potser no són visibles quan s\'és fora de línia. @@ -390,9 +395,9 @@ Redirigit de «%s» Obtén indicacions No es pot trobar cap aplicació que proporcioni direccions. - Canal d\'exploració + Canal «Exploreu» Mostra l\'enllaç de vistes prèvies - Personalitza el canal d\'exploració + Personalitza el canal «Exploreu» Mostra una vista prèvia ràpida d\'articles en tocar enllaços. Amaga les taules Amaga automàticament les taules en els articles. Per exemple, amb les infotaules, les referències i les anotacions. @@ -410,6 +415,9 @@ %d seleccionats S\'ha produït un error Descarta + Desa + S\'ha desat + Comparteix La pàgina no existeix La Viquipèdia no té cap <a href=\"%1$s\">pàgina d\'usuari</a> amb aquest nom exacte. En general, la pàgina hauria de ser creada i editada per <b>%2$s</b>. Si teniu cap dubte, verifiqueu que «%3$s» existeixi. No es pot connectar a Internet @@ -432,6 +440,9 @@ Podeu contactar <a href=\"%2$s\">%1$s</a> o un altre <a href=\"https://ca.wikipedia.org/wiki/Viquipèdia:Administradors\">administrador o administradora</a> per a discutir el blocatge. Personalitza la barra d\'eines Podeu contactar un <a href=\"https://ca.wikipedia.org/wiki/Viquipèdia:Administradors\"> administrador o una administradora</a> per a discutir el blocatge. + D\'acord + Esteu utilitzant un compte temporal + Descarta els canvis i inicia sessió Error de l\'aplicació Ens sap greu, l\'aplicació de Viquipèdia ha experimentat un error i s\'ha tancat.\n\nVoleu començar de nou o sortir? Comença de nou @@ -1159,7 +1170,7 @@ Voleu suprimir la llengua seleccionada? Voleu suprimir les llengües seleccionades? - Només veureu el contingut del canal d\'exploració i els filtres de cerca ràpids per a les llengües de Viquipèdia restants. + Només veureu el contingut del canal «Exploreu» i els filtres de cerca ràpids per a les llengües de Viquipèdia restants. No es poden suprimir totes les llengües Mantingueu com a mínim una llengua de Viquipèdia a partir de la qual cercar i llegir contingut. més @@ -1228,6 +1239,8 @@ px Insereix Insereix + Més informació + Les plantilles són creacions dels usuaris i poden tenir descripcions incompletes. Ajuda Inicia una sessió / uniu-vos a la Viquipèdia Hola %s, sabíeu que tothom pot editar la Viquipèdia? @@ -1562,4 +1575,11 @@ He trobat un problema amb la funcionalitat de patrulla d\'edicions: \n- [Descriviu el problema específic] \n\nEl comportament que m\'agradaria veure-hi és: \n- [Descriviu la solució proposada] \n\n[Captures de pantalla o enllaços] Enrere Obre al navegador del sistema + Llocs + Cal permís d\'ubicació per a veure la teva ubicació al mapa. Torneu-ho a provar. + Cerqueu llocs + Filtra per llengua + Mapa + Llista + Cancel·la diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index aea93847f51..eecb61017a9 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -832,6 +832,12 @@ Cancellar Tu ha attingite le fin del canal. Cargar plus + Selige un variante linguistic regional pro un experientia de lectura melior + Tu usa al momento un variante generic del lingua chinese non supportate como lingua principal de Wikipedia + Salveguardar + Per favor actualisa tu linguas secundari + Tu usa al momento un variante generic del lingua chinese non supportate como lingua secundari. Per favor visita tu parametros pro seliger un nove lingua secundari o pro confirmar tu lista de linguas. + Ir al parametros Le plus legite del %s Schedas Description del articulo diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index bcce2091ab1..c625f14c137 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -915,6 +915,12 @@ ביטול הגעת לסוף ההזנה. לטעון עוד + נא לבחור תקן כתיב אזורי לחוויית קריאה משופרת + בחרת בתקן כתיב סיני שאינו נתמך בתור שפת הוויקיפדיה הראשית שלך + שמירה + נא לעדכן את השפות המשניות שלך + בחרת בתקן כתיב סיני שאינו נתמך בתור השפה המשנית שלך. נא לעבור להגדרות שלך ולבחור שפה משנית חדשה או לאשר את רשימת השפות שלך. + לעבור להגדרות ערכים מובילים ב%s לשוניות תיאור הערך diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 72f0b7bfab5..ccce65ca063 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -31,6 +31,7 @@ * Mugenpman * Omotecho * Otokoume +* PPenloglou-WMF * Penn Station * RYOUMA1117 * RYU N @@ -619,7 +620,7 @@ あとで読むリストに保存された記事は、あなたのウィキペディアアカウントと同期できるようになりました。<a href=\"#faq\">もっと詳しく</a> 次からは表示しない 同期を有効にする - いいえ + いいえ、結構です。 保存済み 保存したページの既定の一覧 記事をリストにまとめる @@ -828,7 +829,7 @@ 今日 %s閲覧 - いいえ + いいえ、結構です。 オフラインではコンテンツが読み込めません。 秀逸な記事 保存 @@ -1148,7 +1149,7 @@ スキップ 続ける 始めよう - あとで + あとで寄付する 新しいツールで探検しよう 絶えずアップデートしていく「探検」のフィードを追って、ウィキペディアの未知の世界に潜り込みましょう。過去の出来事を<b>今日は何の日</ b>を学んだり、<b>おまかせ表示</ b>で運にまかせるなど、フィードをあなたの興味のままに<b>カスタマイズ</ b>することができます。 あとで読むリストの同期 @@ -1195,7 +1196,7 @@ 中国語の文字違い版をアプリの言語から削除しますか? 現在、繁体字と簡体字の両方の中国語版をアプリの言語として指定しています。アプリの言語設定を更新しますか? 言語の設定を編集 - やめます + いいえ、結構です。 キャンセル OK OK @@ -1599,13 +1600,18 @@ 画像お勧め機能で問題に出くわしました:\n- [具体的な問題の説明]\n\n求めている挙動は:\n- [提案する解決策の説明] 問題報告 - 編集巡回機能 編集巡回機能で問題に出くわしました:\n- [具体的な問題の説明]\n\n求めている挙動は:\n- [提案する解決策の説明]\n\n[スクリーンショットまたはリンク] - 明日改めてお知らせいたします。 - 親愛なる寄付者様、ありがとうございます!あなたの寛大なご協力により、ウィキペディアとその姉妹サイトが繁栄し続けることができます。 + 明日、再度お知らせいたします。 + ご寄付をしてくださり、ありがとうございます!あなたの寛大なご寄付が、ウィキペディアとその姉妹サイトの繁栄を支えています。 戻る - システムブラウザで開く + 規定のブラウザで開く Google Payで寄付しますか? Google Payで寄付するか、他の支払い方法を選択してください。 Google Pay で寄付する + その他の支払方法 + 金額を選択する + 寄付の100%%が確実に届くよう、手数料として%sを追加してお支払いします。 + 毎月、この金額を定期的に寄付します。 + はい、ウィキメディア財団はごく稀に私にメールを送ることができます。 場所 地図上に自分の位置を表示するには、位置情報の許可が必要です。もう一度試してください。 場所を検索 diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index a8dbf98c556..d6afd1594a8 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -736,6 +736,8 @@ OK Ofbriechen Méi lueden + Späicheren + Op d’Astellunge goen Am meeschte gelies de(n) %s Tabs Artikelbeschreiwung diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 74cd5c243d0..af0931439bc 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -826,6 +826,8 @@ Откажи Дошли сте до краја фида. Учитај још + Сачувај + Подешавања Најчитаније на %s Језичци Опис чланка @@ -1601,6 +1603,8 @@ Често постављана питања Подаци о пореским олакшицама Места + Претражи места + Филтрирај по језику Мапа Списак Откријите Википедијине чланке око Вас са Местима diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index dc4455c957c..1fe9c2b4229 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -131,6 +131,7 @@ Переглянути на мапі Читати іншою мовою Доступно %d іншими мовами + CC BY-SA 4.0 Зберігаючи, ви погоджуєтеся з <a href=\"%1$s\">Умовами користування</a>, та остаточно публікуєте свій внесок під ліцензією <a href=\"%2$s\">CC BY-SA 4.0</a>. Зберігаючи, ви погоджуєтеся з <a href=\"%1$s\">Умовами користування</a>, та невідклично публікуєте свій внесок під ліцензією <a href=\"%2$s\">CC BY-SA 4.0</a>. Редагування будуть пов\'язані з IP-адресою вашого пристрою. Якщо ви <a href=\"https://#login\">увійдете до системи</a>, то матимете більше приватності. Редагування будуть приписані ІР-адресі вашого пристрою. Якщо ви <a href=\"https://#login\">увійдете в систему</a>, ваші дії будуть більш конфіденційними. @@ -142,6 +143,7 @@ Ваші мови Вікіпедії Опублікувати зміни Редагування опубліковано! + Редагування опубліковано! Для появи змін може знадобитися деякий час. Невдале редагування! Повторити Скасувати @@ -184,6 +186,9 @@ Ви вийшли з обілкового запису у Вікіпедії. Бажаєте увійти знову? Увійти до системи Скасувати + Знищити обліковий запис + Попередження про знищення облікового запису + Зникнення є <b>останнім заходом</b>, і його слід використовувати <b>лише тоді, коли ви хочете назавжди припинити редагування</b>, а також щоб приховати якомога більше своїх минулих зв\'язків.<br/><br/>Вилучення облікового запису у Вікіпедії робиться шляхом зміни імені вашого облікового запису, щоб інші не могли розпізнати ваші внески; це називають зникненням облікового запису. <b>Зникнення не гарантує повної анонімності і не вилучає внесок у проєкти</b>. Немає нещодавно відвіданих сторінок Відстежувати те, що ви вже читали тут. Деякі статті в історії можуть бути недоступними в режимі офлайн. @@ -257,15 +262,15 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.uk https://creativecommons.org/publicdomain/zero/1.0/deed.uk - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/uk - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/uk#Теги_зображень + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/uk + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/uk#Image_tags Використовувані бібліотеки Співавтори <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Сторінка команди</a> Перекладачі Цей додаток був перекладений перекладачами-волонтерами на <a href=\"https://translatewiki.net\">translatewiki.net</a>. Ліцензія - Вихідний код доступний на <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> та <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> під ліцензією <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Якщо не вказано інше, вміст доступний під ліцензією <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Attribution-ShareAlike</a>. + Вихідний код доступний на <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> під ліцензією <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Якщо не вказано інше, вміст доступний під ліцензією <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Attribution-ShareAlike</a>. Продукт <a href=\"https://wikimediafoundation.org/\">Фонду Вікімедіа</a> Про програму Сторінка була змінена. Ви впевнені, що хочете вийти без збереження змін? @@ -333,6 +338,8 @@ Вибрана сторінка Вікіпедії Сьогоднішня вибрана сторінка: Пошук у Вікіпедії + Найшвидший спосіб пошуку у Вікіпедії + Найкращі статті, які може запропонувати Вікіпедія Визначень не знайдено. Доступне оновлення альфа-версії Натисніть, щоб завантажити @@ -418,6 +425,11 @@ %d вибрано Сталася помилка Відхилити + Читати + Зберегти + Збережено + Поділитися + Ця стаття є заготовкою, що означає, що в статті недостатньо вмісту для створення попереднього перегляду. Однак ви можете це змінити. Ця сторінка не існує У Вікіпедії немає <a href=\"%1$s\">сторінки користувача</a> з такою точною назвою. Загалом, цю сторінку має створити та відредагувати \'\'\'%2$s\'\'\'. Якщо ви сумніваєтеся, будь ласка, переконайтеся, що «%3$s» існує. Не вдається підключитися до інтернету. @@ -440,6 +452,8 @@ Ви можете зв\'язатися із <a href=\"%2$s\">%1$s</a> або іншим <a href=\"https://uk.wikipedia.org/wiki/Вікіпедія:Адміністратори\">адміністратором</a> й обговорити блокування. Налаштувати панель інструментів Ви можете зв\'язатися з <a href=\"https://uk.wikipedia.org/wiki/Вікіпедія:Адміністратори\">адміністратором</a> й обговорити блокування. + Ви не ввійшли в систему + Щойно ви внесете зміни, для вас буде створено <b>тимчасовий обліковий запис</b> для захисту вашої конфіденційності. <a href=\"%1$s\">Дізнатися більше</a>.<br /><br /><a href=\"https://#login\">Увійдіть</a> або <a href=\"https://#login\">створіть обліковий запис</a>, щоб робити майбутні редагування під власноруч обраним іменем та отримати доступ до інших функцій. Помилка програми Перепрошуємо, у додатку Вікіпедії сталася помилка і його було закрито.\n\nХочете почати спочатку чи вийти? Почати спочатку @@ -817,8 +831,8 @@ Зніміть прапорці з усіх елементів Фільтр вікі Тип фільтра - Усі «вікі» - Всі «тип» + Усі вікі + Всі типи сторінка обговорення %s Функція недоступна в автономному режимі. Оскільки Ви читали @@ -908,8 +922,8 @@ Голосове введення Докладніше про описи статей Докладніше про підписи до зображень - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https\n://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/uk#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/uk#Image_captions Текст закороткий. Текст не має закінчуватися розділовим знаком. Уникайте артиклів на початку, на зразок «a» чи «the». @@ -1149,8 +1163,8 @@ Так Ні Не впевнений - Чому ні? - Ваші відповіді допоможуть покращити наступні пропозиції. + Причина відмови + Причина відмови анонімна і допоможе покращити наступні пропозиції зображень. Зображення не релевантне Недостатньо інформації, щоб прийняти рішення Зображення образливе @@ -1536,7 +1550,7 @@ Привіт! Хочу поділитися з вами своїм списком для читання у Вікіпедії: Чи могли б ви допомогти нам покращити функцію спільних списків для читання? Спільні списки читання є тестовою функцією і нам потрібні ваші відгуки, щоб ми могли її покращити або прибрати. - У вас немає збережених попереджень. + Створіть власні повідомлення або використовуйте <a href=\"#\">зразки повідомлень</a>, щоб почати. Нове повідомлення Тема Написати повідомлення @@ -1552,7 +1566,12 @@ Зберегти Вилучити Повідомлення оновлено - Повідомлення вилучено + + Повідомлення вилучено + Повідомлення вилучено + Повідомлення вилучено + Повідомлення вилучено + Шукати або фільтрувати редагування Мітки: %s Немає @@ -1642,6 +1661,7 @@ Надіслати Відгук надіслано. Торкніться додаткового меню, щоб надіслати відгук будь-коли у розділі «Проблема з функцією». + Автоматичний переклад Прийняти Відхилити Проблеми сторінки diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index a41711b5d02..c7e650389ee 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -879,8 +879,12 @@ 取消 您已到达信息流的底部。 加载更多 + 为改善阅读体验,请选择区域语言变体 + 您当前使用了未受支持的通用中文语言变体作为您的主要维基百科语言 保存 请更新您的次要语言 + 您当前使用了未受支持的通用中文语言变体作为您的次要维基百科语言。请前往设置来选择新的次要语言,或确认您当前的语言列表。 + 前往设置 %s的热门阅读 分页 条目描述 From 7c8ca0651c4875c65969f0346d05d42b303fe728 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 20 May 2024 13:56:22 -0400 Subject: [PATCH 130/626] Bump versionCode. (#4684) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a3137bd2b2d..cd4d4ec5bcd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50488 + versionCode 50489 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From 184793d744876e6fc41046ebf81aa18ad7531f74 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 20 May 2024 12:53:21 -0700 Subject: [PATCH 131/626] Use coroutine in EditSummary related classes (#4648) Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/edit/db/EditSummary.kt | 4 ++-- .../org/wikipedia/edit/db/EditSummaryDao.kt | 13 ++++++----- .../edit/summaries/EditSummaryHandler.kt | 23 +++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/wikipedia/edit/db/EditSummary.kt b/app/src/main/java/org/wikipedia/edit/db/EditSummary.kt index a67983fc765..5417c88c42e 100644 --- a/app/src/main/java/org/wikipedia/edit/db/EditSummary.kt +++ b/app/src/main/java/org/wikipedia/edit/db/EditSummary.kt @@ -2,10 +2,10 @@ package org.wikipedia.edit.db import androidx.room.Entity import androidx.room.PrimaryKey -import java.util.* +import java.util.Date @Entity -class EditSummary constructor( +class EditSummary( @PrimaryKey val summary: String, val lastUsed: Date = Date()) { diff --git a/app/src/main/java/org/wikipedia/edit/db/EditSummaryDao.kt b/app/src/main/java/org/wikipedia/edit/db/EditSummaryDao.kt index 140f5771f38..6b200b4121b 100644 --- a/app/src/main/java/org/wikipedia/edit/db/EditSummaryDao.kt +++ b/app/src/main/java/org/wikipedia/edit/db/EditSummaryDao.kt @@ -1,17 +1,18 @@ package org.wikipedia.edit.db -import androidx.room.* -import io.reactivex.rxjava3.core.Completable -import io.reactivex.rxjava3.core.Single +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query @Dao interface EditSummaryDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertEditSummary(summary: EditSummary): Completable + suspend fun insertEditSummary(summary: EditSummary) @Query("SELECT * FROM EditSummary ORDER BY lastUsed DESC") - fun getEditSummaries(): Single> + suspend fun getEditSummaries(): List @Query("DELETE FROM EditSummary") - fun deleteAll(): Completable + suspend fun deleteAll() } diff --git a/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryHandler.kt b/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryHandler.kt index ce01fb14ef1..449399edc46 100644 --- a/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryHandler.kt +++ b/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryHandler.kt @@ -3,8 +3,9 @@ package org.wikipedia.edit.summaries import android.view.View import android.widget.ArrayAdapter import android.widget.AutoCompleteTextView -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.wikipedia.database.AppDatabase import org.wikipedia.edit.db.EditSummary import org.wikipedia.page.PageTitle @@ -18,14 +19,12 @@ class EditSummaryHandler(private val container: View, container.setOnClickListener { summaryEdit.requestFocus() } setConditionalTextDirection(summaryEdit, title.wikiSite.languageCode) - AppDatabase.instance.editSummaryDao().getEditSummaries() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { summaries -> - if (container.isAttachedToWindow) { - updateAutoCompleteList(summaries) - } + CoroutineScope(Dispatchers.Main).launch { + val summaries = AppDatabase.instance.editSummaryDao().getEditSummaries() + if (container.isAttachedToWindow) { + updateAutoCompleteList(summaries) } + } } private fun updateAutoCompleteList(editSummaries: List) { @@ -38,9 +37,9 @@ class EditSummaryHandler(private val container: View, } fun persistSummary() { - AppDatabase.instance.editSummaryDao().insertEditSummary(EditSummary(summary = summaryEdit.text.toString())) - .subscribeOn(Schedulers.io()) - .subscribe() + CoroutineScope(Dispatchers.IO).launch { + AppDatabase.instance.editSummaryDao().insertEditSummary(EditSummary(summary = summaryEdit.text.toString())) + } } fun handleBackPressed(): Boolean { From fa73bd508dd6f5f7a24b76e63bf637a8d53d5ecc Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 20 May 2024 16:34:16 -0400 Subject: [PATCH 132/626] Follow-up to coroutines in EditSummary. (#4685) --- .../wikipedia/edit/summaries/EditSummaryFragment.kt | 2 +- .../wikipedia/edit/summaries/EditSummaryHandler.kt | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryFragment.kt b/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryFragment.kt index fa0016c6643..e7e9e26d452 100644 --- a/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryFragment.kt +++ b/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryFragment.kt @@ -128,7 +128,7 @@ class EditSummaryFragment : Fragment() { } override fun onStart() { super.onStart() - editSummaryHandler = EditSummaryHandler(binding.root, binding.editSummaryText, title) + editSummaryHandler = EditSummaryHandler(lifecycleScope, binding.root, binding.editSummaryText, title) } override fun onDestroyView() { diff --git a/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryHandler.kt b/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryHandler.kt index 449399edc46..3e2b246d61a 100644 --- a/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryHandler.kt +++ b/app/src/main/java/org/wikipedia/edit/summaries/EditSummaryHandler.kt @@ -4,14 +4,14 @@ import android.view.View import android.widget.ArrayAdapter import android.widget.AutoCompleteTextView import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.wikipedia.database.AppDatabase import org.wikipedia.edit.db.EditSummary import org.wikipedia.page.PageTitle import org.wikipedia.util.L10nUtil.setConditionalTextDirection -class EditSummaryHandler(private val container: View, +class EditSummaryHandler(private val coroutineScope: CoroutineScope, + private val container: View, private val summaryEdit: AutoCompleteTextView, title: PageTitle) { @@ -19,11 +19,9 @@ class EditSummaryHandler(private val container: View, container.setOnClickListener { summaryEdit.requestFocus() } setConditionalTextDirection(summaryEdit, title.wikiSite.languageCode) - CoroutineScope(Dispatchers.Main).launch { + coroutineScope.launch { val summaries = AppDatabase.instance.editSummaryDao().getEditSummaries() - if (container.isAttachedToWindow) { - updateAutoCompleteList(summaries) - } + updateAutoCompleteList(summaries) } } @@ -37,7 +35,7 @@ class EditSummaryHandler(private val container: View, } fun persistSummary() { - CoroutineScope(Dispatchers.IO).launch { + coroutineScope.launch { AppDatabase.instance.editSummaryDao().insertEditSummary(EditSummary(summary = summaryEdit.text.toString())) } } From 0057da9cc59b354a11e541d42626b4cc1abda4a8 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 21 May 2024 12:54:24 -0700 Subject: [PATCH 133/626] Add edit summary for adding/updating short description to an article (#4654) Co-authored-by: Dmitry Brant --- .../org/wikipedia/descriptions/DescriptionEditFragment.kt | 8 +++++++- app/src/main/res/values-qq/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt index 7458a42fcf9..894c4096a70 100644 --- a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt +++ b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt @@ -340,8 +340,14 @@ class DescriptionEditFragment : Fragment() { val baseRevId = mwQueryResponse.query?.firstPage()!!.revisions[0].revId text = updateDescriptionInArticle(text, binding.fragmentDescriptionEditView.description.orEmpty()) + val automaticallyAddedEditSummary = getString(if (pageTitle.description.isNullOrEmpty()) R.string.edit_summary_added_short_description + else R.string.edit_summary_updated_short_description) + var editSummary = automaticallyAddedEditSummary + getEditComment()?.let { + editSummary += ", $it" + } ServiceFactory.get(wikiSite).postEditSubmit(pageTitle.prefixedText, "0", null, - getEditComment().orEmpty(), + editSummary, if (AccountUtil.isLoggedIn) "user" else null, text, null, baseRevId, editToken, if (captchaHandler.isActive) captchaHandler.captchaId() else null, diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 267f2450bea..2cac4d8142c 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -311,6 +311,8 @@ Clickable summary tag for adding links. A part of a list that includes:\n* {{msg-wm|Wikipedia-android-strings-edit summary tag typo}}\n* {{msg-wm|Wikipedia-android-strings-edit summary tag grammar}}\n* {{msg-wm|Wikipedia-android-strings-edit summary tag links}}\n* {{msg-wm|Wikipedia-android-strings-edit summary tag other}} Clickable summary tag for a custom/other edit summary text. A part of a list that includes:\n* {{msg-wm|Wikipedia-android-strings-edit summary tag typo}}\n* {{msg-wm|Wikipedia-android-strings-edit summary tag grammar}}\n* {{msg-wm|Wikipedia-android-strings-edit summary tag links}}\n* {{msg-wm|Wikipedia-android-strings-edit summary tag other}}\n{{Identical|Other}} Hint (input field placeholder) for the user to write a custom summary of edits + Edit summary that is automatically included after adding article description. + Edit summary that is automatically included after updating article description. Title for dialog box that warns the user about \'\'\'an\'\'\' edit conflict.\n\nThis is not the verb \"to edit/modify some conflict\", but the name for a \"conflict occuring while editing/modifying a page and trying to save the changes\". Message explaining to the user that the edit they are submitting is conflicting with the current state of the article, and instructs the user to go back and reload the page before trying to edit again. Title for popup dialog that contains edit notices for the current article. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3a56e0c1cdb..c5ba296d9d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -283,6 +283,8 @@ Added links Other Other ways you improved the page + Added short description + Updated short description Edit conflict The page has already been modified by a different user, and is conflicting with your edit. Please copy your edits, go back and refresh the page, then try editing again. Edit notices From f4ae4eafeaf1c1598af1cbffdf43e85b9b7df912 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 21 May 2024 14:34:37 -0700 Subject: [PATCH 134/626] Use Coroutine in PageFragmentLoadState (#4649) * Use coroutine in PageFragmentLoadState * More update * Use parent lifecycleScope and use CoroutineExceptionHandler instead of try catch * Remove unused callback --------- Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/dataclient/Service.kt | 7 +- .../AnonymousNotificationHelper.kt | 9 +- .../wikipedia/page/PageFragmentLoadState.kt | 158 +++++++++--------- 3 files changed, 82 insertions(+), 92 deletions(-) diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index 366b2fd6dac..85776c934a7 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -325,6 +325,9 @@ interface Service { @get:GET(MW_API_PREFIX + "action=query&meta=userinfo&uiprop=groups|blockinfo|editcount|latestcontrib|hasmsg") val userInfo: Observable + @GET(MW_API_PREFIX + "action=query&meta=userinfo&uiprop=groups|blockinfo|editcount|latestcontrib|hasmsg") + suspend fun getUserInfo(): MwQueryResponse + @GET(MW_API_PREFIX + "action=query&list=users&usprop=editcount|groups|registration|rights") suspend fun userInfo(@Query("ususers") userName: String): MwQueryResponse @@ -569,10 +572,6 @@ interface Service { // ------- Watchlist ------- - @Headers("Cache-Control: no-cache") - @GET(MW_API_PREFIX + "action=query&prop=info&converttitles=&redirects=&inprop=watched") - fun getWatchedInfo(@Query("titles") titles: String): Observable - @Headers("Cache-Control: no-cache") @GET(MW_API_PREFIX + "action=query&prop=info&converttitles=&redirects=&inprop=watched") suspend fun getWatchedStatus(@Query("titles") titles: String): MwQueryResponse diff --git a/app/src/main/java/org/wikipedia/notifications/AnonymousNotificationHelper.kt b/app/src/main/java/org/wikipedia/notifications/AnonymousNotificationHelper.kt index 38dd26e3baf..f23cf7bebbd 100644 --- a/app/src/main/java/org/wikipedia/notifications/AnonymousNotificationHelper.kt +++ b/app/src/main/java/org/wikipedia/notifications/AnonymousNotificationHelper.kt @@ -1,6 +1,5 @@ package org.wikipedia.notifications -import io.reactivex.rxjava3.core.Observable import org.wikipedia.auth.AccountUtil import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite @@ -8,7 +7,7 @@ import org.wikipedia.dataclient.mwapi.MwQueryResponse import org.wikipedia.page.PageTitle import org.wikipedia.settings.Prefs import org.wikipedia.util.DateUtil -import java.util.* +import java.util.Date import java.util.concurrent.TimeUnit object AnonymousNotificationHelper { @@ -20,11 +19,11 @@ object AnonymousNotificationHelper { } } - fun observableForAnonUserInfo(wikiSite: WikiSite): Observable { + suspend fun observableForAnonUserInfo(wikiSite: WikiSite): MwQueryResponse { return if (Date().time - Prefs.lastAnonEditTime < TimeUnit.DAYS.toMillis(NOTIFICATION_DURATION_DAYS)) { - ServiceFactory.get(wikiSite).userInfo + ServiceFactory.get(wikiSite).getUserInfo() } else { - Observable.just(MwQueryResponse()) + MwQueryResponse() } } diff --git a/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt b/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt index 8c8dc5d5c6a..e48288e7b35 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt @@ -1,14 +1,13 @@ package org.wikipedia.page import android.widget.Toast -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Completable -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil @@ -42,14 +41,6 @@ class PageFragmentLoadState(private var model: PageViewModel, private var leadImagesHandler: LeadImagesHandler, private var currentTab: Tab) { - private fun interface ErrorCallback { - fun call(error: Throwable) - } - - private var networkErrorCallback: ErrorCallback? = null - private val app = WikipediaApp.instance - private val disposables = CompositeDisposable() - fun load(pushBackStack: Boolean) { if (pushBackStack && model.title != null && model.curEntry != null) { // update the topmost entry in the backstack, before we start overwriting things. @@ -121,87 +112,86 @@ class PageFragmentLoadState(private var model: PageViewModel, if (!fragment.isAdded) { return } - val callback = networkErrorCallback - networkErrorCallback = null fragment.requireActivity().invalidateOptionsMenu() - callback?.call(caught) + fragment.onPageLoadError(caught) } private fun pageLoadCheckReadingLists() { model.title?.let { - disposables.clear() - disposables.add(Completable.fromAction { model.readingListPage = AppDatabase.instance.readingListPageDao().findPageInAnyList(it) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .doAfterTerminate { pageLoadFromNetwork { fragment.onPageLoadError(it) } } - .subscribe()) + fragment.lifecycleScope.launch(CoroutineExceptionHandler { _, throwable -> + L.e("Page details network error: ", throwable) + commonSectionFetchOnCatch(throwable) + }) { + model.readingListPage = AppDatabase.instance.readingListPageDao().findPageInAnyList(it) + pageLoadFromNetwork(it) + } } } - private fun pageLoadFromNetwork(errorCallback: ErrorCallback) { - model.title?.let { title -> - fragment.updateQuickActionsAndMenuOptions() - networkErrorCallback = errorCallback - if (!fragment.isAdded) { - return - } + private suspend fun pageLoadFromNetwork(title: PageTitle) { + fragment.updateQuickActionsAndMenuOptions() + if (!fragment.isAdded) { + return + } + fragment.requireActivity().invalidateOptionsMenu() + fragment.callback()?.onPageUpdateProgressBar(true) + model.page = null + val delayLoadHtml = title.prefixedText.contains(":") + if (!delayLoadHtml) { + bridge.resetHtml(title) + } + if (title.namespace() === Namespace.SPECIAL) { + // Short-circuit the entire process of fetching the Summary, since Special: pages + // are not supported in RestBase. + bridge.resetHtml(title) + leadImagesHandler.loadLeadImage() fragment.requireActivity().invalidateOptionsMenu() - fragment.callback()?.onPageUpdateProgressBar(true) - model.page = null - val delayLoadHtml = title.prefixedText.contains(":") - if (!delayLoadHtml) { - bridge.resetHtml(title) + fragment.onPageMetadataLoaded() + return + } + + withContext(Dispatchers.Main) { + val pageSummaryRequest = async { + ServiceFactory.getRest(title.wikiSite).getSummaryResponseSuspend(title.prefixedText, null, model.cacheControl.toString(), + if (model.isInReadingList) OfflineCacheInterceptor.SAVE_HEADER_SAVE else null, title.wikiSite.languageCode, UriUtil.encodeURL(title.prefixedText)) + } + val watchedRequest = async { + if (WikipediaApp.instance.isOnline && AccountUtil.isLoggedIn) { + ServiceFactory.get(title.wikiSite).getWatchedStatus(title.prefixedText) + } else if (WikipediaApp.instance.isOnline && !AccountUtil.isLoggedIn) { + AnonymousNotificationHelper.observableForAnonUserInfo(title.wikiSite) + } else { + MwQueryResponse() + } } - if (title.namespace() === Namespace.SPECIAL) { - // Short-circuit the entire process of fetching the Summary, since Special: pages - // are not supported in RestBase. + + val pageSummaryResponse = pageSummaryRequest.await() + val watchedResponse = watchedRequest.await() + val isWatched = watchedResponse.query?.firstPage()?.watched ?: false + val hasWatchlistExpiry = watchedResponse.query?.firstPage()?.hasWatchlistExpiry() ?: false + if (pageSummaryResponse.body() == null) { + throw RuntimeException("Summary response was invalid.") + } + val redirectedFrom = if (pageSummaryResponse.raw().priorResponse?.isRedirect == true) model.title?.displayText else null + createPageModel(pageSummaryResponse, isWatched, hasWatchlistExpiry) + if (OfflineCacheInterceptor.SAVE_HEADER_SAVE == pageSummaryResponse.headers()[OfflineCacheInterceptor.SAVE_HEADER]) { + showPageOfflineMessage(pageSummaryResponse.headers().getInstant("date")) + } + if (delayLoadHtml) { bridge.resetHtml(title) - leadImagesHandler.loadLeadImage() - fragment.requireActivity().invalidateOptionsMenu() - fragment.onPageMetadataLoaded() - return } - disposables.add(Observable.zip(ServiceFactory.getRest(title.wikiSite) - .getSummaryResponse(title.prefixedText, null, model.cacheControl.toString(), - if (model.isInReadingList) OfflineCacheInterceptor.SAVE_HEADER_SAVE else null, - title.wikiSite.languageCode, UriUtil.encodeURL(title.prefixedText)), - if (app.isOnline && AccountUtil.isLoggedIn) ServiceFactory.get(title.wikiSite).getWatchedInfo(title.prefixedText) - else if (app.isOnline && !AccountUtil.isLoggedIn) AnonymousNotificationHelper.observableForAnonUserInfo(title.wikiSite) - else Observable.just(MwQueryResponse())) { first, second -> Pair(first, second) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ pair -> - val pageSummaryResponse = pair.first - val watchedResponse = pair.second - val isWatched = watchedResponse.query?.firstPage()?.watched ?: false - val hasWatchlistExpiry = watchedResponse.query?.firstPage()?.hasWatchlistExpiry() ?: false - if (pageSummaryResponse.body() == null) { - throw RuntimeException("Summary response was invalid.") - } - val redirectedFrom = if (pageSummaryResponse.raw().priorResponse?.isRedirect == true) model.title?.displayText else null - createPageModel(pageSummaryResponse, isWatched, hasWatchlistExpiry) - if (OfflineCacheInterceptor.SAVE_HEADER_SAVE == pageSummaryResponse.headers()[OfflineCacheInterceptor.SAVE_HEADER]) { - showPageOfflineMessage(pageSummaryResponse.headers().getInstant("date")) - } - if (delayLoadHtml) { - bridge.resetHtml(title) - } - fragment.onPageMetadataLoaded(redirectedFrom) + fragment.onPageMetadataLoaded(redirectedFrom) - if (AnonymousNotificationHelper.shouldCheckAnonNotifications(watchedResponse)) { - checkAnonNotifications(title) - } - }) { - L.e("Page details network response error: ", it) - commonSectionFetchOnCatch(it) - } - ) + if (AnonymousNotificationHelper.shouldCheckAnonNotifications(watchedResponse)) { + checkAnonNotifications(title) + } } } private fun checkAnonNotifications(title: PageTitle) { CoroutineScope(Dispatchers.Main).launch { - val response = ServiceFactory.get(title.wikiSite).getLastModified(UserTalkAliasData.valueFor(title.wikiSite.languageCode) + ":" + Prefs.lastAnonUserWithMessages) + val response = ServiceFactory.get(title.wikiSite) + .getLastModified(UserTalkAliasData.valueFor(title.wikiSite.languageCode) + ":" + Prefs.lastAnonUserWithMessages) if (AnonymousNotificationHelper.anonTalkPageHasRecentMessage(response, title)) { fragment.showAnonNotification() } @@ -236,7 +226,7 @@ class PageFragmentLoadState(private var model: PageViewModel, title.fragment = response.raw().request.url.fragment } if (title.description.isNullOrEmpty()) { - app.appSessionEvent.noDescription() + WikipediaApp.instance.appSessionEvent.noDescription() } if (!title.isMainPage) { title.displayText = page?.displayTitle.orEmpty() @@ -245,18 +235,20 @@ class PageFragmentLoadState(private var model: PageViewModel, fragment.requireActivity().invalidateOptionsMenu() // Update our history entry, in case the Title was changed (i.e. normalized) - val curEntry = model.curEntry - curEntry?.let { - model.curEntry = HistoryEntry(title, it.source, timestamp = it.timestamp) - model.curEntry!!.referrer = it.referrer + model.curEntry?.let { + model.curEntry = HistoryEntry(title, it.source, timestamp = it.timestamp).apply { + referrer = it.referrer + } } // Update our tab list to prevent ZH variants issue. - app.tabList.getOrNull(app.tabCount - 1)?.setBackStackPositionTitle(title) + WikipediaApp.instance.tabList.getOrNull(WikipediaApp.instance.tabCount - 1)?.setBackStackPositionTitle(title) // Save the thumbnail URL to the DB val pageImage = PageImage(title, pageSummary?.thumbnailUrl) - Completable.fromAction { AppDatabase.instance.pageImagesDao().insertPageImage(pageImage) }.subscribeOn(Schedulers.io()).subscribe() + CoroutineScope(Dispatchers.IO).launch { + AppDatabase.instance.pageImagesDao().insertPageImage(pageImage) + } title.thumbUrl = pageImage.imageName } } From 8aaf24a9c83a15314de303cbb9a39c5aa36e1023 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 22 May 2024 04:58:39 -0700 Subject: [PATCH 135/626] Fix: show top read title and description correctly for zhwiki (#4681) * Fix: show top read title and description correctly for zhwiki * Add underscores for title from mwQueryResponse * Add comment --------- Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/dataclient/Service.kt | 5 ++- .../aggregated/AggregatedFeedContentClient.kt | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index 85776c934a7..c0c94c1dd1d 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -520,7 +520,7 @@ interface Service { @GET(MW_API_PREFIX + "action=wbgetentities&props=descriptions|labels|sitelinks") suspend fun getWikidataLabelsAndDescriptions(@Query("ids") idList: String): Entities - @GET(MW_API_PREFIX + "action=wbgetentities&props=descriptions") + @GET(MW_API_PREFIX + "action=wbgetentities&props=descriptions|labels") suspend fun getWikidataDescription(@Query("titles") titles: String, @Query("sites") sites: String, @Query("languages") langCode: String): Entities @@ -740,6 +740,9 @@ interface Service { suspend fun getTemplateData(@Query("lang") langCode: String, @Query("titles") titles: String): TemplateDataResponse + @GET(MW_API_PREFIX + "action=query&prop=info&converttitles=&inprop=varianttitles") + suspend fun getVariantTitlesByTitles(@Query("titles") titles: String): MwQueryResponse + companion object { const val WIKIPEDIA_URL = "https://wikipedia.org/" const val WIKIDATA_URL = "https://www.wikidata.org/" diff --git a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt index 481ff8e72a3..cc641fdfb0e 100644 --- a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt +++ b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.kt @@ -21,8 +21,10 @@ import org.wikipedia.feed.image.FeaturedImageCard import org.wikipedia.feed.model.Card import org.wikipedia.feed.news.NewsCard import org.wikipedia.feed.onthisday.OnThisDayCard +import org.wikipedia.feed.topread.TopRead import org.wikipedia.feed.topread.TopReadListCard import org.wikipedia.util.DateUtil +import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L class AggregatedFeedContentClient { @@ -165,6 +167,16 @@ class AggregatedFeedContentClient { onthisday = feedContentResponse.onthisday ) } + feedContentResponse.topRead?.let { + val topReadResponse = getPagesForLanguageVariant(it.articles, wikiSite) + feedContentResponse = AggregatedFeedContent( + tfa = feedContentResponse.tfa, + news = feedContentResponse.news, + topRead = TopRead(it.date, topReadResponse), + potd = feedContentResponse.potd, + onthisday = feedContentResponse.onthisday + ) + } } aggregatedClient.aggregatedResponses[langCode] = feedContentResponse @@ -197,5 +209,38 @@ class AggregatedFeedContentClient { } return newPageSummary } + + private suspend fun getPagesForLanguageVariant(list: List, wikiSite: WikiSite): List { + val newList = mutableListOf() + withContext(Dispatchers.IO) { + val titles = list.joinToString(separator = "|") { it.apiTitle } + // First, get the correct description from Wikidata directly. + val wikiDataResponse = async { + ServiceFactory.get(Constants.wikidataWikiSite) + .getWikidataDescription(titles = titles, sites = wikiSite.dbName(), langCode = wikiSite.languageCode) + } + // Second, fetch varianttitles from prop=info endpoint. + val mwQueryResponse = async { + ServiceFactory.get(wikiSite).getVariantTitlesByTitles(titles) + } + + list.forEach { pageSummary -> + // Find the correct display title from the varianttitles map, and insert the new page summary to the list. + val displayTitle = mwQueryResponse.await().query?.pages?.find { StringUtil.addUnderscores(it.title) == pageSummary.apiTitle }?.varianttitles?.get(wikiSite.languageCode) + val newPageSummary = pageSummary.apply { + val newDisplayTitle = displayTitle ?: pageSummary.displayTitle + this.titles = PageSummary.Titles( + canonical = pageSummary.apiTitle, + display = newDisplayTitle + ) + this.description = wikiDataResponse.await().entities.values.firstOrNull { + it.labels[wikiSite.languageCode]?.value == newDisplayTitle + }?.descriptions?.get(wikiSite.languageCode)?.value ?: pageSummary.description + } + newList.add(newPageSummary) + } + } + return newList + } } } From af0c230d1653e7f0d7f1353830f662adc0a2803d Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 22 May 2024 06:46:53 -0700 Subject: [PATCH 136/626] Convert SearchActionModeCallback to Kotlin (#4652) * Convert SearchActionModeCallback to Kotlin * More simplify --------- Co-authored-by: Dmitry Brant --- .../edit/insertmedia/InsertMediaActivity.kt | 12 +--- .../org/wikipedia/history/HistoryFragment.kt | 4 +- .../history/SearchActionModeCallback.java | 58 ------------------- .../history/SearchActionModeCallback.kt | 42 ++++++++++++++ .../language/LanguagesListActivity.kt | 7 ++- .../notifications/NotificationActivity.kt | 11 ++-- .../edithistory/EditHistoryListActivity.kt | 7 +-- .../readinglist/ReadingListFragment.kt | 28 +++++++-- .../SuggestedEditsRecentEditsFragment.kt | 9 +-- .../org/wikipedia/talk/TalkTopicActivity.kt | 12 +--- .../org/wikipedia/talk/TalkTopicsActivity.kt | 12 +--- .../usercontrib/UserContribListActivity.kt | 7 +-- .../wikipedia/views/SearchActionProvider.kt | 4 +- .../views/SearchAndFilterActionProvider.kt | 2 +- .../wikipedia/watchlist/WatchlistFragment.kt | 9 +-- 15 files changed, 95 insertions(+), 129 deletions(-) delete mode 100644 app/src/main/java/org/wikipedia/history/SearchActionModeCallback.java create mode 100644 app/src/main/java/org/wikipedia/history/SearchActionModeCallback.kt diff --git a/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaActivity.kt b/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaActivity.kt index 9d6ef91750b..f373374c378 100644 --- a/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaActivity.kt +++ b/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaActivity.kt @@ -328,18 +328,10 @@ class InsertMediaActivity : BaseActivity() { private inner class SearchCallback : SearchActionModeCallback() { var searchActionProvider: SearchActionProvider? = null override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - searchActionProvider = SearchActionProvider(this@InsertMediaActivity, searchHintString, - object : SearchActionProvider.Callback { - override fun onQueryTextChange(s: String) { - onQueryChange(s) - } - - override fun onQueryTextFocusChange() { - } - }) + searchActionProvider = SearchActionProvider(this@InsertMediaActivity, getSearchHintString()) { onQueryChange(it) } searchActionProvider?.setQueryText(viewModel.searchQuery) searchActionProvider?.selectAllQueryTexts() - val menuItem = menu.add(searchHintString) + val menuItem = menu.add(getSearchHintString()) MenuItemCompat.setActionProvider(menuItem, searchActionProvider) actionMode = mode binding.imageInfoContainer.isVisible = false diff --git a/app/src/main/java/org/wikipedia/history/HistoryFragment.kt b/app/src/main/java/org/wikipedia/history/HistoryFragment.kt index fd881df0346..20fe2ac71d2 100644 --- a/app/src/main/java/org/wikipedia/history/HistoryFragment.kt +++ b/app/src/main/java/org/wikipedia/history/HistoryFragment.kt @@ -155,7 +155,7 @@ class HistoryFragment : Fragment(), BackPressedHandler { } private fun beginMultiSelect() { - if (SearchActionModeCallback.`is`(actionMode)) { + if (SearchActionModeCallback.matches(actionMode)) { finishActionMode() } } @@ -231,7 +231,7 @@ class HistoryFragment : Fragment(), BackPressedHandler { private fun onLoadItemsFinished(items: List) { val list = mutableListOf() - if (!SearchActionModeCallback.`is`(actionMode)) { + if (!SearchActionModeCallback.matches(actionMode)) { list.add(SearchBar()) } list.addAll(items) diff --git a/app/src/main/java/org/wikipedia/history/SearchActionModeCallback.java b/app/src/main/java/org/wikipedia/history/SearchActionModeCallback.java deleted file mode 100644 index d5a207cbd3f..00000000000 --- a/app/src/main/java/org/wikipedia/history/SearchActionModeCallback.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.wikipedia.history; - -import android.content.Context; -import android.view.Menu; -import android.view.MenuItem; - -import androidx.annotation.Nullable; -import androidx.appcompat.view.ActionMode; -import androidx.core.view.MenuItemCompat; - -import org.wikipedia.views.SearchActionProvider; - -public abstract class SearchActionModeCallback implements ActionMode.Callback { - public static final String ACTION_MODE_TAG = "searchActionMode"; - - public static boolean is(@Nullable ActionMode mode) { - return mode != null && ACTION_MODE_TAG.equals(mode.getTag()); - } - - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - mode.setTag(ACTION_MODE_TAG); - MenuItem menuItem = menu.add(getSearchHintString()); - // Manually setup a action provider to be able to adjust the left margin of the search field. - MenuItemCompat.setActionProvider(menuItem, new SearchActionProvider(getParentContext(), getSearchHintString(), new SearchActionProvider.Callback() { - @Override - public void onQueryTextChange(String s) { - onQueryChange(s); - } - - @Override - public void onQueryTextFocusChange() { - } - })); - - return true; - } - - protected abstract String getSearchHintString(); - - protected abstract void onQueryChange(String s); - - protected abstract Context getParentContext(); - - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - return true; - } - - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) { - return false; - } - - @Override - public void onDestroyActionMode(ActionMode mode) { - } -} diff --git a/app/src/main/java/org/wikipedia/history/SearchActionModeCallback.kt b/app/src/main/java/org/wikipedia/history/SearchActionModeCallback.kt new file mode 100644 index 00000000000..b9da0442d2c --- /dev/null +++ b/app/src/main/java/org/wikipedia/history/SearchActionModeCallback.kt @@ -0,0 +1,42 @@ +package org.wikipedia.history + +import android.content.Context +import android.view.Menu +import android.view.MenuItem +import androidx.appcompat.view.ActionMode +import androidx.core.view.MenuItemCompat +import org.wikipedia.views.SearchActionProvider + +abstract class SearchActionModeCallback : ActionMode.Callback { + + protected abstract fun getSearchHintString(): String + protected abstract fun onQueryChange(s: String) + protected abstract fun getParentContext(): Context + + override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { + mode.tag = ACTION_MODE_TAG + val menuItem = menu.add(getSearchHintString()) + // Manually setup a action provider to be able to adjust the left margin of the search field. + MenuItemCompat.setActionProvider(menuItem, SearchActionProvider(getParentContext(), getSearchHintString()) { onQueryChange(it) }) + return true + } + + override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean { + return true + } + + override fun onActionItemClicked(mode: ActionMode, menuItem: MenuItem): Boolean { + return false + } + + override fun onDestroyActionMode(mode: ActionMode) { + } + + companion object { + const val ACTION_MODE_TAG: String = "searchActionMode" + + fun matches(mode: ActionMode?): Boolean { + return ACTION_MODE_TAG == mode?.tag + } + } +} diff --git a/app/src/main/java/org/wikipedia/language/LanguagesListActivity.kt b/app/src/main/java/org/wikipedia/language/LanguagesListActivity.kt index 55f81c13a33..a95ec5b601e 100644 --- a/app/src/main/java/org/wikipedia/language/LanguagesListActivity.kt +++ b/app/src/main/java/org/wikipedia/language/LanguagesListActivity.kt @@ -3,7 +3,11 @@ package org.wikipedia.language import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.view.ActionMode @@ -19,7 +23,6 @@ import org.wikipedia.settings.languages.WikipediaLanguagesFragment import org.wikipedia.util.DeviceUtil import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil -import java.util.* class LanguagesListActivity : BaseActivity() { private lateinit var binding: ActivityLanguagesListBinding diff --git a/app/src/main/java/org/wikipedia/notifications/NotificationActivity.kt b/app/src/main/java/org/wikipedia/notifications/NotificationActivity.kt index be57fd24a8a..bb9e21910bb 100644 --- a/app/src/main/java/org/wikipedia/notifications/NotificationActivity.kt +++ b/app/src/main/java/org/wikipedia/notifications/NotificationActivity.kt @@ -151,7 +151,7 @@ class NotificationActivity : BaseActivity() { super.onResume() actionMode?.let { postprocessAndDisplay() - if (SearchActionModeCallback.`is`(it)) { + if (SearchActionModeCallback.matches(it)) { searchActionModeCallback.refreshProvider() } } @@ -318,7 +318,7 @@ class NotificationActivity : BaseActivity() { } private fun beginMultiSelect() { - if (SearchActionModeCallback.`is`(actionMode)) { + if (SearchActionModeCallback.matches(actionMode)) { finishActionMode() } if (!MultiSelectActionModeCallback.isTagType(actionMode)) { @@ -582,15 +582,12 @@ class NotificationActivity : BaseActivity() { var searchAndFilterActionProvider: SearchAndFilterActionProvider? = null override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { adjustRefreshViewLayoutParams(true) - searchAndFilterActionProvider = SearchAndFilterActionProvider(this@NotificationActivity, searchHintString, + searchAndFilterActionProvider = SearchAndFilterActionProvider(this@NotificationActivity, getSearchHintString(), object : SearchAndFilterActionProvider.Callback { override fun onQueryTextChange(s: String) { onQueryChange(s) } - override fun onQueryTextFocusChange() { - } - override fun onFilterIconClick() { DeviceUtil.hideSoftKeyboard(this@NotificationActivity) startActivity(NotificationFilterActivity.newIntent(this@NotificationActivity)) @@ -605,7 +602,7 @@ class NotificationActivity : BaseActivity() { } }) - val menuItem = menu.add(searchHintString) + val menuItem = menu.add(getSearchHintString()) MenuItemCompat.setActionProvider(menuItem, searchAndFilterActionProvider) diff --git a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt index 296e7132654..1e1e34c185a 100644 --- a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt +++ b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt @@ -481,15 +481,12 @@ class EditHistoryListActivity : BaseActivity() { val searchBarFilterIcon get() = searchAndFilterActionProvider?.filterIcon override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - searchAndFilterActionProvider = SearchAndFilterActionProvider(this@EditHistoryListActivity, searchHintString, + searchAndFilterActionProvider = SearchAndFilterActionProvider(this@EditHistoryListActivity, getSearchHintString(), object : SearchAndFilterActionProvider.Callback { override fun onQueryTextChange(s: String) { onQueryChange(s) } - override fun onQueryTextFocusChange() { - } - override fun onFilterIconClick() { showFilterOverflowMenu() } @@ -503,7 +500,7 @@ class EditHistoryListActivity : BaseActivity() { } }) - val menuItem = menu.add(searchHintString) + val menuItem = menu.add(getSearchHintString()) MenuItemCompat.setActionProvider(menuItem, searchAndFilterActionProvider) diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt index 818ae126578..98170fcfe25 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt @@ -5,7 +5,12 @@ import android.content.Intent import android.graphics.Color import android.os.Build import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity @@ -29,7 +34,11 @@ import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.schedulers.Schedulers -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Runnable +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.R @@ -51,10 +60,19 @@ import org.wikipedia.readinglist.database.ReadingListPage import org.wikipedia.readinglist.sync.ReadingListSyncEvent import org.wikipedia.settings.Prefs import org.wikipedia.settings.RemoteConfig -import org.wikipedia.util.* +import org.wikipedia.util.DeviceUtil +import org.wikipedia.util.DimenUtil +import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.ResourceUtil +import org.wikipedia.util.ShareUtil import org.wikipedia.util.log.L -import org.wikipedia.views.* +import org.wikipedia.views.CircularProgressBar +import org.wikipedia.views.DefaultViewHolder +import org.wikipedia.views.DrawableItemDecoration +import org.wikipedia.views.MultiSelectActionModeCallback import org.wikipedia.views.MultiSelectActionModeCallback.Companion.isTagType +import org.wikipedia.views.PageItemView +import org.wikipedia.views.SwipeableItemTouchHelperCallback class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDialog.Callback { @@ -408,7 +426,7 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial } private fun beginMultiSelect() { - if (SearchActionModeCallback.`is`(actionMode)) { + if (SearchActionModeCallback.matches(actionMode)) { finishActionMode() } if (!isTagType(actionMode)) { diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt index ca1c03bbf3f..446794bad0a 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsFragment.kt @@ -157,7 +157,7 @@ class SuggestedEditsRecentEditsFragment : Fragment(), MenuProvider { override fun onResume() { super.onResume() actionMode?.let { - if (SearchActionModeCallback.`is`(it)) { + if (SearchActionModeCallback.matches(it)) { searchActionModeCallback.refreshProvider() } } @@ -427,15 +427,12 @@ class SuggestedEditsRecentEditsFragment : Fragment(), MenuProvider { var searchAndFilterActionProvider: SearchAndFilterActionProvider? = null override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - searchAndFilterActionProvider = SearchAndFilterActionProvider(requireContext(), searchHintString, + searchAndFilterActionProvider = SearchAndFilterActionProvider(requireContext(), getSearchHintString(), object : SearchAndFilterActionProvider.Callback { override fun onQueryTextChange(s: String) { onQueryChange(s) } - override fun onQueryTextFocusChange() { - } - override fun onFilterIconClick() { launchFilterActivity.launch(SuggestedEditsRecentEditsFilterActivity.newIntent(requireContext())) } @@ -449,7 +446,7 @@ class SuggestedEditsRecentEditsFragment : Fragment(), MenuProvider { } }) - val menuItem = menu.add(searchHintString) + val menuItem = menu.add(getSearchHintString()) MenuItemCompat.setActionProvider(menuItem, searchAndFilterActionProvider) diff --git a/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt index dda648deb2d..485689cfe3d 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt @@ -225,17 +225,9 @@ class TalkTopicActivity : BaseActivity() { private inner class SearchCallback : SearchActionModeCallback() { var searchActionProvider: SearchActionProvider? = null override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - searchActionProvider = SearchActionProvider(this@TalkTopicActivity, searchHintString, - object : SearchActionProvider.Callback { - override fun onQueryTextChange(s: String) { - onQueryChange(s) - } - - override fun onQueryTextFocusChange() { - } - }) + searchActionProvider = SearchActionProvider(this@TalkTopicActivity, getSearchHintString()) { onQueryChange(it) } - val menuItem = menu.add(searchHintString) + val menuItem = menu.add(getSearchHintString()) MenuItemCompat.setActionProvider(menuItem, searchActionProvider) searchActionProvider?.setQueryText(viewModel.currentSearchQuery) diff --git a/app/src/main/java/org/wikipedia/talk/TalkTopicsActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkTopicsActivity.kt index 5d4bb531868..bf7ba4c8882 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkTopicsActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkTopicsActivity.kt @@ -528,17 +528,9 @@ class TalkTopicsActivity : BaseActivity(), WatchlistExpiryDialog.Callback { private inner class SearchCallback : SearchActionModeCallback() { var searchActionProvider: SearchActionProvider? = null override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - searchActionProvider = SearchActionProvider(this@TalkTopicsActivity, searchHintString, - object : SearchActionProvider.Callback { - override fun onQueryTextChange(s: String) { - onQueryChange(s) - } - - override fun onQueryTextFocusChange() { - } - }) + searchActionProvider = SearchActionProvider(this@TalkTopicsActivity, getSearchHintString()) { onQueryChange(it) } - val menuItem = menu.add(searchHintString) + val menuItem = menu.add(getSearchHintString()) MenuItemCompat.setActionProvider(menuItem, searchActionProvider) diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserContribListActivity.kt b/app/src/main/java/org/wikipedia/usercontrib/UserContribListActivity.kt index eb837a5c6a4..ad91e16a4f6 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserContribListActivity.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserContribListActivity.kt @@ -362,15 +362,12 @@ class UserContribListActivity : BaseActivity() { var searchAndFilterActionProvider: SearchAndFilterActionProvider? = null override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - searchAndFilterActionProvider = SearchAndFilterActionProvider(this@UserContribListActivity, searchHintString, + searchAndFilterActionProvider = SearchAndFilterActionProvider(this@UserContribListActivity, getSearchHintString(), object : SearchAndFilterActionProvider.Callback { override fun onQueryTextChange(s: String) { onQueryChange(s) } - override fun onQueryTextFocusChange() { - } - override fun onFilterIconClick() { launchFilterActivity.launch(UserContribFilterActivity.newIntent(this@UserContribListActivity)) } @@ -384,7 +381,7 @@ class UserContribListActivity : BaseActivity() { } }) - val menuItem = menu.add(searchHintString) + val menuItem = menu.add(getSearchHintString()) MenuItemCompat.setActionProvider(menuItem, searchAndFilterActionProvider) diff --git a/app/src/main/java/org/wikipedia/views/SearchActionProvider.kt b/app/src/main/java/org/wikipedia/views/SearchActionProvider.kt index 1741e01e6d7..12770fd320d 100644 --- a/app/src/main/java/org/wikipedia/views/SearchActionProvider.kt +++ b/app/src/main/java/org/wikipedia/views/SearchActionProvider.kt @@ -15,9 +15,9 @@ import org.wikipedia.util.ResourceUtil.getThemedColor class SearchActionProvider(context: Context, private val searchHintString: String, private val callback: Callback) : ActionProvider(context) { - interface Callback { + fun interface Callback { fun onQueryTextChange(s: String) - fun onQueryTextFocusChange() + fun onQueryTextFocusChange() {} } private val binding = GroupSearchBinding.inflate(LayoutInflater.from(context)) diff --git a/app/src/main/java/org/wikipedia/views/SearchAndFilterActionProvider.kt b/app/src/main/java/org/wikipedia/views/SearchAndFilterActionProvider.kt index d9ebf1b00c6..e058c51e193 100644 --- a/app/src/main/java/org/wikipedia/views/SearchAndFilterActionProvider.kt +++ b/app/src/main/java/org/wikipedia/views/SearchAndFilterActionProvider.kt @@ -20,7 +20,7 @@ class SearchAndFilterActionProvider(context: Context, interface Callback { fun onQueryTextChange(s: String) - fun onQueryTextFocusChange() + fun onQueryTextFocusChange() {} fun onFilterIconClick() fun getExcludedFilterCount(): Int fun getFilterIconContentDescription(): Int diff --git a/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt b/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt index 0a912d70288..b3bf7be2e3d 100644 --- a/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt +++ b/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt @@ -106,7 +106,7 @@ class WatchlistFragment : Fragment(), WatchlistItemView.Callback, MenuProvider { super.onResume() actionMode?.let { viewModel.updateList(false) - if (SearchActionModeCallback.`is`(it)) { + if (SearchActionModeCallback.matches(it)) { searchActionModeCallback.refreshProvider() } } @@ -295,15 +295,12 @@ class WatchlistFragment : Fragment(), WatchlistItemView.Callback, MenuProvider { var searchAndFilterActionProvider: SearchAndFilterActionProvider? = null override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - searchAndFilterActionProvider = SearchAndFilterActionProvider(requireContext(), searchHintString, + searchAndFilterActionProvider = SearchAndFilterActionProvider(requireContext(), getSearchHintString(), object : SearchAndFilterActionProvider.Callback { override fun onQueryTextChange(s: String) { onQueryChange(s) } - override fun onQueryTextFocusChange() { - } - override fun onFilterIconClick() { DeviceUtil.hideSoftKeyboard(requireActivity()) startActivity(WatchlistFilterActivity.newIntent(requireContext())) @@ -318,7 +315,7 @@ class WatchlistFragment : Fragment(), WatchlistItemView.Callback, MenuProvider { } }) - val menuItem = menu.add(searchHintString) + val menuItem = menu.add(getSearchHintString()) MenuItemCompat.setActionProvider(menuItem, searchAndFilterActionProvider) From 1916d4ce9b0ccf5e8303fda1958da8944352fd92 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 22 May 2024 12:01:14 -0400 Subject: [PATCH 137/626] Further improve compatibility for devices without hardware GPS. (#4691) --- app/src/main/AndroidManifest.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d7677e4ab57..1804450ed6d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,14 @@ + + + + @@ -40,12 +47,6 @@ - - - From dee0e1c69dc59cf4b06fbd95223a21c2b40d1c65 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 22 May 2024 12:24:00 -0400 Subject: [PATCH 138/626] Follow-up to coroutines in PageFragmentLoadState. (#4689) Co-authored-by: Cooltey Feng --- .../java/org/wikipedia/page/PageFragment.kt | 4 - .../wikipedia/page/PageFragmentLoadState.kt | 122 ++++++++---------- .../wikipedia/pageimages/db/PageImageDao.kt | 5 +- .../savedpages/SavedPageSyncService.kt | 2 +- 4 files changed, 61 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 65a3a2abb48..296f686550e 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -406,10 +406,6 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi } } - override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) { - onPageLoadError(RuntimeException(description)) - } - override fun onReceivedHttpError(view: WebView, request: WebResourceRequest, errorResponse: WebResourceResponse) { if (!request.url.toString().contains(RestService.PAGE_HTML_ENDPOINT)) { // If the request is anything except the main mobile-html content request, then diff --git a/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt b/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt index e48288e7b35..85fce389063 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt @@ -3,11 +3,8 @@ package org.wikipedia.page import android.widget.Toast import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil @@ -47,7 +44,7 @@ class PageFragmentLoadState(private var model: PageViewModel, updateCurrentBackStackItem() currentTab.pushBackStackItem(PageBackStackItem(model.title!!, model.curEntry!!)) } - pageLoadCheckReadingLists() + pageLoad() } fun loadFromBackStack(isRefresh: Boolean = false) { @@ -116,80 +113,72 @@ class PageFragmentLoadState(private var model: PageViewModel, fragment.onPageLoadError(caught) } - private fun pageLoadCheckReadingLists() { - model.title?.let { + private fun pageLoad() { + model.title?.let { title -> fragment.lifecycleScope.launch(CoroutineExceptionHandler { _, throwable -> L.e("Page details network error: ", throwable) commonSectionFetchOnCatch(throwable) }) { - model.readingListPage = AppDatabase.instance.readingListPageDao().findPageInAnyList(it) - pageLoadFromNetwork(it) - } - } - } - - private suspend fun pageLoadFromNetwork(title: PageTitle) { - fragment.updateQuickActionsAndMenuOptions() - if (!fragment.isAdded) { - return - } - fragment.requireActivity().invalidateOptionsMenu() - fragment.callback()?.onPageUpdateProgressBar(true) - model.page = null - val delayLoadHtml = title.prefixedText.contains(":") - if (!delayLoadHtml) { - bridge.resetHtml(title) - } - if (title.namespace() === Namespace.SPECIAL) { - // Short-circuit the entire process of fetching the Summary, since Special: pages - // are not supported in RestBase. - bridge.resetHtml(title) - leadImagesHandler.loadLeadImage() - fragment.requireActivity().invalidateOptionsMenu() - fragment.onPageMetadataLoaded() - return - } + model.readingListPage = AppDatabase.instance.readingListPageDao().findPageInAnyList(title) + + fragment.updateQuickActionsAndMenuOptions() + fragment.requireActivity().invalidateOptionsMenu() + fragment.callback()?.onPageUpdateProgressBar(true) + model.page = null + val delayLoadHtml = title.prefixedText.contains(":") + if (!delayLoadHtml) { + bridge.resetHtml(title) + } + if (title.namespace() === Namespace.SPECIAL) { + // Short-circuit the entire process of fetching the Summary, since Special: pages + // are not supported in RestBase. + bridge.resetHtml(title) + leadImagesHandler.loadLeadImage() + fragment.requireActivity().invalidateOptionsMenu() + fragment.onPageMetadataLoaded() + return@launch + } - withContext(Dispatchers.Main) { - val pageSummaryRequest = async { - ServiceFactory.getRest(title.wikiSite).getSummaryResponseSuspend(title.prefixedText, null, model.cacheControl.toString(), - if (model.isInReadingList) OfflineCacheInterceptor.SAVE_HEADER_SAVE else null, title.wikiSite.languageCode, UriUtil.encodeURL(title.prefixedText)) - } - val watchedRequest = async { - if (WikipediaApp.instance.isOnline && AccountUtil.isLoggedIn) { - ServiceFactory.get(title.wikiSite).getWatchedStatus(title.prefixedText) - } else if (WikipediaApp.instance.isOnline && !AccountUtil.isLoggedIn) { - AnonymousNotificationHelper.observableForAnonUserInfo(title.wikiSite) - } else { - MwQueryResponse() + val pageSummaryRequest = async { + ServiceFactory.getRest(title.wikiSite).getSummaryResponseSuspend(title.prefixedText, null, model.cacheControl.toString(), + if (model.isInReadingList) OfflineCacheInterceptor.SAVE_HEADER_SAVE else null, title.wikiSite.languageCode, UriUtil.encodeURL(title.prefixedText)) + } + val watchedRequest = async { + if (WikipediaApp.instance.isOnline && AccountUtil.isLoggedIn) { + ServiceFactory.get(title.wikiSite).getWatchedStatus(title.prefixedText) + } else if (WikipediaApp.instance.isOnline && !AccountUtil.isLoggedIn) { + AnonymousNotificationHelper.observableForAnonUserInfo(title.wikiSite) + } else { + MwQueryResponse() + } } - } - val pageSummaryResponse = pageSummaryRequest.await() - val watchedResponse = watchedRequest.await() - val isWatched = watchedResponse.query?.firstPage()?.watched ?: false - val hasWatchlistExpiry = watchedResponse.query?.firstPage()?.hasWatchlistExpiry() ?: false - if (pageSummaryResponse.body() == null) { - throw RuntimeException("Summary response was invalid.") - } - val redirectedFrom = if (pageSummaryResponse.raw().priorResponse?.isRedirect == true) model.title?.displayText else null - createPageModel(pageSummaryResponse, isWatched, hasWatchlistExpiry) - if (OfflineCacheInterceptor.SAVE_HEADER_SAVE == pageSummaryResponse.headers()[OfflineCacheInterceptor.SAVE_HEADER]) { - showPageOfflineMessage(pageSummaryResponse.headers().getInstant("date")) - } - if (delayLoadHtml) { - bridge.resetHtml(title) - } - fragment.onPageMetadataLoaded(redirectedFrom) + val pageSummaryResponse = pageSummaryRequest.await() + val watchedResponse = watchedRequest.await() + val isWatched = watchedResponse.query?.firstPage()?.watched ?: false + val hasWatchlistExpiry = watchedResponse.query?.firstPage()?.hasWatchlistExpiry() ?: false + if (pageSummaryResponse.body() == null) { + throw RuntimeException("Summary response was invalid.") + } + val redirectedFrom = if (pageSummaryResponse.raw().priorResponse?.isRedirect == true) model.title?.displayText else null + createPageModel(pageSummaryResponse, isWatched, hasWatchlistExpiry) + if (OfflineCacheInterceptor.SAVE_HEADER_SAVE == pageSummaryResponse.headers()[OfflineCacheInterceptor.SAVE_HEADER]) { + showPageOfflineMessage(pageSummaryResponse.headers().getInstant("date")) + } + if (delayLoadHtml) { + bridge.resetHtml(title) + } + fragment.onPageMetadataLoaded(redirectedFrom) - if (AnonymousNotificationHelper.shouldCheckAnonNotifications(watchedResponse)) { - checkAnonNotifications(title) + if (AnonymousNotificationHelper.shouldCheckAnonNotifications(watchedResponse)) { + checkAnonNotifications(title) + } } } } private fun checkAnonNotifications(title: PageTitle) { - CoroutineScope(Dispatchers.Main).launch { + fragment.lifecycleScope.launch { val response = ServiceFactory.get(title.wikiSite) .getLastModified(UserTalkAliasData.valueFor(title.wikiSite.languageCode) + ":" + Prefs.lastAnonUserWithMessages) if (AnonymousNotificationHelper.anonTalkPageHasRecentMessage(response, title)) { @@ -246,7 +235,8 @@ class PageFragmentLoadState(private var model: PageViewModel, // Save the thumbnail URL to the DB val pageImage = PageImage(title, pageSummary?.thumbnailUrl) - CoroutineScope(Dispatchers.IO).launch { + + fragment.lifecycleScope.launch { AppDatabase.instance.pageImagesDao().insertPageImage(pageImage) } title.thumbUrl = pageImage.imageName diff --git a/app/src/main/java/org/wikipedia/pageimages/db/PageImageDao.kt b/app/src/main/java/org/wikipedia/pageimages/db/PageImageDao.kt index 222899fdf24..7fd60def511 100644 --- a/app/src/main/java/org/wikipedia/pageimages/db/PageImageDao.kt +++ b/app/src/main/java/org/wikipedia/pageimages/db/PageImageDao.kt @@ -8,7 +8,10 @@ import androidx.room.Query @Dao interface PageImageDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertPageImage(pageImage: PageImage) + fun insertPageImageSync(pageImage: PageImage) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertPageImage(pageImage: PageImage) @Query("SELECT * FROM PageImage") fun getAllPageImages(): List diff --git a/app/src/main/java/org/wikipedia/savedpages/SavedPageSyncService.kt b/app/src/main/java/org/wikipedia/savedpages/SavedPageSyncService.kt index 674c425b56b..da5072c4541 100644 --- a/app/src/main/java/org/wikipedia/savedpages/SavedPageSyncService.kt +++ b/app/src/main/java/org/wikipedia/savedpages/SavedPageSyncService.kt @@ -292,7 +292,7 @@ class SavedPageSyncService : JobIntentService() { } private fun persistPageThumbnail(title: PageTitle, url: String) { - AppDatabase.instance.pageImagesDao().insertPageImage(PageImage(title, url)) + AppDatabase.instance.pageImagesDao().insertPageImageSync(PageImage(title, url)) } private fun isRetryable(t: Throwable): Boolean { From 671f59a6f9312819124e76790ecfd2db2ccf38be Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 22 May 2024 11:49:41 -0700 Subject: [PATCH 139/626] Hygiene: clean up code in PageAvailableOfflineHandler (#4651) * Fix: add try and catch block for loading lead images info in offline * Add additional online check * Hygiene: clean up code in PageAvailableOfflineHandler * hygiene * Send lifecycleScope to check() * Unused import * Add `withContext()` back * Change function to suspend * Adding suspend --- .../wikipedia/feed/view/ListCardItemView.kt | 9 ++++++-- .../org/wikipedia/feed/view/ListCardView.kt | 1 - .../org/wikipedia/history/HistoryFragment.kt | 2 +- .../page/PageAvailableOfflineHandler.kt | 18 +++++++-------- .../java/org/wikipedia/page/PageFragment.kt | 14 ++++------- .../readinglist/ReadingListFragment.kt | 3 +-- .../readinglist/ReadingListsFragment.kt | 23 +++++++++++++++---- .../readinglist/db/ReadingListPageDao.kt | 12 +++++++--- 8 files changed, 50 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/wikipedia/feed/view/ListCardItemView.kt b/app/src/main/java/org/wikipedia/feed/view/ListCardItemView.kt index 837158bafe5..16435df53f5 100644 --- a/app/src/main/java/org/wikipedia/feed/view/ListCardItemView.kt +++ b/app/src/main/java/org/wikipedia/feed/view/ListCardItemView.kt @@ -7,12 +7,16 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting +import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import org.wikipedia.databinding.ViewListCardItemBinding import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.feed.model.Card import org.wikipedia.history.HistoryEntry -import org.wikipedia.page.PageAvailableOfflineHandler.check +import org.wikipedia.page.PageAvailableOfflineHandler import org.wikipedia.readinglist.LongPressMenu import org.wikipedia.readinglist.database.ReadingListPage import org.wikipedia.util.DeviceUtil @@ -102,7 +106,8 @@ class ListCardItemView(context: Context, attrs: AttributeSet? = null) : Constrai setTitle(StringUtil.fromHtml(entry.title.displayText)) setSubtitle(entry.title.description) setImage(entry.title.thumbUrl) - check(entry.title) { available -> setViewsGreyedOut(!available) } + val lifecycleScope = (context as? AppCompatActivity)?.lifecycleScope ?: CoroutineScope(Dispatchers.IO) + PageAvailableOfflineHandler.check(lifecycleScope, entry.title) { setViewsGreyedOut(!it) } return this } diff --git a/app/src/main/java/org/wikipedia/feed/view/ListCardView.kt b/app/src/main/java/org/wikipedia/feed/view/ListCardView.kt index 917ed68ff4d..0513ce22d4a 100644 --- a/app/src/main/java/org/wikipedia/feed/view/ListCardView.kt +++ b/app/src/main/java/org/wikipedia/feed/view/ListCardView.kt @@ -9,7 +9,6 @@ import org.wikipedia.databinding.ViewListCardBinding import org.wikipedia.feed.model.Card import org.wikipedia.views.DrawableItemDecoration -@Suppress("LeakingThis") abstract class ListCardView(context: Context) : DefaultFeedCardView(context) { interface Callback { fun onFooterClick(card: Card) diff --git a/app/src/main/java/org/wikipedia/history/HistoryFragment.kt b/app/src/main/java/org/wikipedia/history/HistoryFragment.kt index 20fe2ac71d2..0b86edc6e13 100644 --- a/app/src/main/java/org/wikipedia/history/HistoryFragment.kt +++ b/app/src/main/java/org/wikipedia/history/HistoryFragment.kt @@ -316,7 +316,7 @@ class HistoryFragment : Fragment(), BackPressedHandler { view.setDescription(entry.title.description) view.setImageUrl(entry.title.thumbUrl) view.isSelected = selectedEntries.contains(entry) - PageAvailableOfflineHandler.check(entry.title) { available: Boolean -> view.setViewsGreyedOut(!available) } + PageAvailableOfflineHandler.check(lifecycleScope, entry.title) { view.setViewsGreyedOut(!it) } } override fun onSwipe() { diff --git a/app/src/main/java/org/wikipedia/page/PageAvailableOfflineHandler.kt b/app/src/main/java/org/wikipedia/page/PageAvailableOfflineHandler.kt index 3bddf9160e9..130a0a35af6 100644 --- a/app/src/main/java/org/wikipedia/page/PageAvailableOfflineHandler.kt +++ b/app/src/main/java/org/wikipedia/page/PageAvailableOfflineHandler.kt @@ -1,7 +1,8 @@ package org.wikipedia.page -import android.annotation.SuppressLint -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import org.wikipedia.WikipediaApp import org.wikipedia.database.AppDatabase import org.wikipedia.readinglist.database.ReadingListPage @@ -16,19 +17,16 @@ object PageAvailableOfflineHandler { callback.onFinish(WikipediaApp.instance.isOnline || (page.offline && !page.saving)) } - @SuppressLint("CheckResult") - fun check(pageTitle: PageTitle, callback: Callback) { + fun check(lifeCycleScope: CoroutineScope, pageTitle: PageTitle, callback: Callback) { if (WikipediaApp.instance.isOnline) { callback.onFinish(true) return } - CoroutineScope(Dispatchers.Main).launch(CoroutineExceptionHandler { _, exception -> - run { - callback.onFinish(false) - L.w(exception) - } + lifeCycleScope.launch(CoroutineExceptionHandler { _, exception -> + callback.onFinish(false) + L.w(exception) }) { - val readingListPage = withContext(Dispatchers.IO) { AppDatabase.instance.readingListPageDao().findPageInAnyList(pageTitle) } + val readingListPage = AppDatabase.instance.readingListPageDao().findPageInAnyList(pageTitle) callback.onFinish(readingListPage != null && readingListPage.offline && !readingListPage.saving) } } diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 296f686550e..7623340ff8d 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -1054,15 +1054,11 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi fun updateBookmarkAndMenuOptionsFromDao() { title?.let { - disposables.add( - Completable.fromAction { model.readingListPage = AppDatabase.instance.readingListPageDao().findPageInAnyList(it) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .doAfterTerminate { - updateQuickActionsAndMenuOptions() - requireActivity().invalidateOptionsMenu() - } - .subscribe()) + lifecycleScope.launch { + model.readingListPage = AppDatabase.instance.readingListPageDao().findPageInAnyList(it) + updateQuickActionsAndMenuOptions() + requireActivity().invalidateOptionsMenu() + } } } diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt index 98170fcfe25..84288982bc4 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt @@ -54,7 +54,6 @@ import org.wikipedia.main.MainActivity import org.wikipedia.page.ExclusiveBottomSheetPresenter import org.wikipedia.page.PageActivity import org.wikipedia.page.PageAvailableOfflineHandler -import org.wikipedia.page.PageAvailableOfflineHandler.check import org.wikipedia.readinglist.database.ReadingList import org.wikipedia.readinglist.database.ReadingListPage import org.wikipedia.readinglist.sync.ReadingListSyncEvent @@ -643,7 +642,7 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial view.setActionHint(R.string.reading_list_article_make_offline) view.setSearchQuery(currentSearchQuery) view.setListItemImageDimensions(imageDimension, imageDimension) - check(page, PageAvailableOfflineHandler.Callback { available -> view.setViewsGreyedOut(!available) }) + PageAvailableOfflineHandler.check(page) { view.setViewsGreyedOut(!it) } if (!currentSearchQuery.isNullOrEmpty()) { view.setTitleMaxLines(2) view.setTitleEllipsis() diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt index b3d6d0c2829..eacb43c4ea8 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt @@ -5,7 +5,12 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity @@ -49,10 +54,20 @@ import org.wikipedia.readinglist.sync.ReadingListSyncAdapter import org.wikipedia.readinglist.sync.ReadingListSyncEvent import org.wikipedia.settings.Prefs import org.wikipedia.settings.RemoteConfig -import org.wikipedia.util.* +import org.wikipedia.util.DeviceUtil +import org.wikipedia.util.DimenUtil +import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.ResourceUtil +import org.wikipedia.util.ShareUtil +import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L -import org.wikipedia.views.* +import org.wikipedia.views.CircularProgressBar +import org.wikipedia.views.DefaultViewHolder +import org.wikipedia.views.DrawableItemDecoration +import org.wikipedia.views.MultiSelectActionModeCallback import org.wikipedia.views.MultiSelectActionModeCallback.Companion.isTagType +import org.wikipedia.views.PageItemView +import org.wikipedia.views.ReadingListsOverflowView class ReadingListsFragment : Fragment(), SortReadingListsDialog.Callback, ReadingListItemActionsDialog.Callback { private var _binding: FragmentReadingListsBinding? = null @@ -378,7 +393,7 @@ class ReadingListsFragment : Fragment(), SortReadingListsDialog.Callback, Readin view.setActionHint(R.string.reading_list_article_make_offline) view.setSearchQuery(currentSearchQuery) view.setUpChipGroup(ReadingListBehaviorsUtil.getListsContainPage(page)) - PageAvailableOfflineHandler.check(page) { available -> view.setViewsGreyedOut(!available) } + PageAvailableOfflineHandler.check(page) { view.setViewsGreyedOut(!it) } } } diff --git a/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt b/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt index 657bcb23c29..287f163f509 100644 --- a/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt +++ b/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt @@ -1,6 +1,12 @@ package org.wikipedia.readinglist.db -import androidx.room.* +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Transaction +import androidx.room.Update import org.apache.commons.lang3.StringUtils import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.WikiSite @@ -43,7 +49,7 @@ interface ReadingListPageDao { apiTitle: String, listId: Long, excludedStatus: Long): ReadingListPage? @Query("SELECT * FROM ReadingListPage WHERE wiki = :wiki AND lang = :lang AND namespace = :ns AND apiTitle = :apiTitle AND status != :excludedStatus") - fun getPageByParams(wiki: WikiSite, lang: String, ns: Namespace, + suspend fun getPageByParams(wiki: WikiSite, lang: String, ns: Namespace, apiTitle: String, excludedStatus: Long): ReadingListPage? @Query("SELECT * FROM ReadingListPage WHERE wiki = :wiki AND lang = :lang AND namespace = :ns AND apiTitle = :apiTitle AND status != :excludedStatus") @@ -130,7 +136,7 @@ interface ReadingListPageDao { updateThumbAndDescriptionByName(pageProto.lang, pageProto.apiTitle, thumbUrl, description) } - fun findPageInAnyList(title: PageTitle): ReadingListPage? { + suspend fun findPageInAnyList(title: PageTitle): ReadingListPage? { return getPageByParams( title.wikiSite, title.wikiSite.languageCode, title.namespace(), title.prefixedText, ReadingListPage.STATUS_QUEUE_FOR_DELETE From 326cd6c9189a2cba53661c80b0e842dcf5e07c6e Mon Sep 17 00:00:00 2001 From: Clare Ming Date: Wed, 22 May 2024 14:08:39 -0600 Subject: [PATCH 140/626] Bump Metrics Platform java lib version 2.7 (#4687) * Bump Metrics Platform java lib version 2.5 - Update schema ids for article instruments using custom schemas - Add device_family to agent data object Bug: T365179 * Bump version to 2.7 + update device_family --------- Co-authored-by: Clare Ming --- app/build.gradle | 2 +- .../org/wikipedia/analytics/metricsplatform/ArticleEvent.kt | 4 ++-- .../wikipedia/analytics/metricsplatform/MetricsPlatform.kt | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cd4d4ec5bcd..40659a3630b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -183,7 +183,7 @@ dependencies { String roomVersion = "2.6.1" String espressoVersion = '3.5.1' String serialization_version = '1.6.3' - String metricsVersion = '2.4' + String metricsVersion = '2.7' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/org/wikipedia/analytics/metricsplatform/ArticleEvent.kt b/app/src/main/java/org/wikipedia/analytics/metricsplatform/ArticleEvent.kt index c00de61c80c..f7531311e33 100644 --- a/app/src/main/java/org/wikipedia/analytics/metricsplatform/ArticleEvent.kt +++ b/app/src/main/java/org/wikipedia/analytics/metricsplatform/ArticleEvent.kt @@ -24,7 +24,7 @@ class ArticleFindInPageInteraction(private val fragment: PageFragment) : TimedMe fun logDone() { submitEvent( "android.product_metrics.find_in_page_interaction", - "/analytics/mobile_apps/product_metrics/android_find_in_page_interaction/1.1.0", + "/analytics/mobile_apps/product_metrics/android_find_in_page_interaction/1.1.1", "find_in_page_interaction", mapOf( "find_text" to findText, @@ -187,7 +187,7 @@ class ArticleTocInteraction(private val fragment: PageFragment, private val numS } submitEvent( "android.product_metrics.article_toc_interaction", - "/analytics/mobile_apps/product_metrics/android_article_toc_interaction/1.1.0", + "/analytics/mobile_apps/product_metrics/android_article_toc_interaction/1.1.1", "article_toc_interaction", mapOf( "num_opens" to numOpens, diff --git a/app/src/main/java/org/wikipedia/analytics/metricsplatform/MetricsPlatform.kt b/app/src/main/java/org/wikipedia/analytics/metricsplatform/MetricsPlatform.kt index fab839c52f3..ebeb03ea7ab 100644 --- a/app/src/main/java/org/wikipedia/analytics/metricsplatform/MetricsPlatform.kt +++ b/app/src/main/java/org/wikipedia/analytics/metricsplatform/MetricsPlatform.kt @@ -1,5 +1,6 @@ package org.wikipedia.analytics.metricsplatform +import android.os.Build import org.wikimedia.metrics_platform.MetricsClient import org.wikimedia.metrics_platform.context.AgentData import org.wikimedia.metrics_platform.context.ClientData @@ -19,6 +20,7 @@ object MetricsPlatform { "WikipediaApp/" + BuildConfig.VERSION_NAME, "android", "app", + Build.BRAND + " " + Build.MODEL, WikipediaApp.instance.languageState.systemLanguageCode, if (ReleaseUtil.isProdRelease) "prod" else "dev" ) From a7b1bcce13d0136301636691131ca2fbdb063125 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 23 May 2024 18:56:15 +0530 Subject: [PATCH 141/626] Localisation updates from https://translatewiki.net. (#4692) --- app/src/main/res/values-ary/strings.xml | 2 +- app/src/main/res/values-ban/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 17 +++++-- app/src/main/res/values-fr/strings.xml | 56 ++++++++++++++++++++++ app/src/main/res/values-hi/strings.xml | 2 + app/src/main/res/values-ia/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 2 + app/src/main/res/values-mk/strings.xml | 2 + app/src/main/res/values-sd/strings.xml | 17 +++++++ app/src/main/res/values-sms/strings.xml | 2 +- app/src/main/res/values-sr/strings.xml | 3 ++ app/src/main/res/values-tr/strings.xml | 39 +++++++++++++-- app/src/main/res/values-zh-rTW/strings.xml | 2 + app/src/main/res/values-zh/strings.xml | 6 ++- 14 files changed, 143 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-ary/strings.xml b/app/src/main/res/values-ary/strings.xml index 8831f3c072f..1e2687d18fa 100644 --- a/app/src/main/res/values-ary/strings.xml +++ b/app/src/main/res/values-ary/strings.xml @@ -316,7 +316,7 @@ حيت قريتي مقالة كيما كانت مقالات كيتشافو - زيد قرا + مقالات خرين كيتقراو بزاف ليوما ف ويكيپيديا شوف الصفحة اللولة تصويرة ديال نهار diff --git a/app/src/main/res/values-ban/strings.xml b/app/src/main/res/values-ban/strings.xml index 0d1a6a2b064..260ed76045e 100644 --- a/app/src/main/res/values-ban/strings.xml +++ b/app/src/main/res/values-ban/strings.xml @@ -754,7 +754,7 @@ Sesirah Sisipang média Lis titik - Lis angka + Lis nomer Mal Pustaka Pracingak pranala diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 009dd665e50..622a4baf699 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -261,8 +261,8 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.ca https://creativecommons.org/publicdomain/zero/1.0/deed.ca - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/ca - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/ca + https://www.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags/ca Biblioteques utilitzades Col·laboradors <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Pàgina de l\'equip</a> @@ -1088,7 +1088,7 @@ No No n\'estic segur - Per què no? + Motiu del rebuig Les vostres respostes milloren suggeriments futurs. La imatge no és rellevant No hi ha prou informació per a decidir @@ -1238,6 +1238,7 @@ Alçària px Insereix + Cerqueu plantilles Insereix Més informació Les plantilles són creacions dels usuaris i poden tenir descripcions incompletes. @@ -1266,6 +1267,7 @@ Cancel·la Missatge publicat a la pàgina de discussió d\'usuari de l\'editor Missatge desat i publicat a la pàgina de discussió d\'usuari de l\'editor + Missatges desats La pàgina de discussió és en blanc. La conversa comença aquí Les pàgines de discussió és on es discuteix on fer el contingut de la Viquipèdia el millor possible. Inicieu-vos-hi afegint-hi un nou tema de discussió per a connectar-vos i col·laborar amb una comunitat viquipedista. @@ -1457,6 +1459,7 @@ Error de reproducció multimèdia Contribucions Filtra les contribucions + Mostra al mapa Importa la llista de lectura compartida Com voleu anomenar la llista que se us ha compartit? *nova* @@ -1487,6 +1490,7 @@ El missatge s\'ha actualitzat El missatge s\'ha suprimit El títol no pot ser en blanc. + Missatges d\'exemple Cerca o filtra edicions Etiquetes: %s Cap @@ -1565,6 +1569,7 @@ Comentaris Tramet S\'han tramès els comentaris. + Edita Accepta Rebutja Problemes de la pàgina @@ -1573,8 +1578,14 @@ He trobat un problema amb la funcionalitat de recomanació d\'imatges: \n- [Descriviu un problema específic] \n\nEl comportament que m\'agradaria veure-hi és: \n- [Descriviu la solució proposada] Informe d\'incidència - Funcionalitat de la patrulla d\'edicions He trobat un problema amb la funcionalitat de patrulla d\'edicions: \n- [Descriviu el problema específic] \n\nEl comportament que m\'agradaria veure-hi és: \n- [Descriviu la solució proposada] \n\n[Captures de pantalla o enllaços] + Demà us ho tornarem a recordar. Enrere Obre al navegador del sistema + Voleu fer una donació amb Google Pay? + Feu una donació amb Google Pay o trieu un altre mètode de pagament. + Feu una donació amb Google Pay + Un altre mètode de pagament + Seleccioneu una quantitat Llocs Cal permís d\'ubicació per a veure la teva ubicació al mapa. Torneu-ho a provar. Cerqueu llocs diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8afecf0595b..e951563e0eb 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -37,6 +37,7 @@ * KATRINE1992 * Kimyungjog * Linedwell +* Lofhi * Ltrlg * Lulucmy * Léon973 @@ -180,6 +181,7 @@ Vos langues Wikipédia Publier les modifications Modification publiée ! + Modification publiée ! Les changements peuvent mettre du temps à apparaître. Échec de la modification ! Réessayer Annuler @@ -336,6 +338,8 @@ Liens ajoutés Autre Autres façons d’améliorer la page + Description courte ajoutée + Description courte importée Conflit de modification La page a déjà été modifiée par un autre utilisateur et est en conflit avec votre modification. Veuillez copier vos modifications, revenir en arrière et actualiser la page, puis essayer de la modifier à nouveau. Avertissements de modification @@ -483,6 +487,22 @@ Personnaliser votre barre d’outils Vous pouvez contacter un <a href=\"https://fr.wikipedia.org/wiki/Wikipédia:Administrateur\">administrateur</a> pour discuter du blocage. Vous n’êtes pas connecté(e) + Une fois que vous aurez effectué une modification, un <b>compte temporaire</b> sera créé pour vous permettre de protéger votre vie privée. <a href=\"%1$s\">En savoir plus</a>.<br /><br /><a href=\"https://#login\">Connectez-vous</a> ou <a href=\"https://#login\">créez un compte</a> pour obtenir un crédit pour les modifications futures et accéder à d\'autres fonctionnalités. + Votre modification sera attribuée à %1$s. Votre adresse IP sera visible par les administrateurs.<br /><br />Si vous <a href=\"https://#login\">vous connectez</a> ou <a href=\"https://#login\">créez un compte</a>, vos modifications seront attribuées à un pseudonyme que vous choisirez, parmi d\'autres avantages. + Compris ! + Vous utilisez un compte temporaire + Annuler les modifications et se connecter + + Le compte temporaire %1$s a été créé après la publication de votre modification. Il expirera dans %2$d jour. + Le compte temporaire %1$s a été créé après la publication de votre modification. Il expirera dans %2$d jours. + + + Le compte expirera dans %d jour. + Le compte expirera dans %d jours. + + <b>Vous n\'êtes pas connecté.</b> Une fois que vous aurez fait une modification, un compte temporaire vous sera créé pour protéger votre vie privée. <a href=\"%1$s\">En savoir plus</a> + <b>Vous utilisez un compte temporaire.</b> Votre modification sera attribuée à %1$s. <a href=\"%2$s\">En savoir plus</a>. + <b>Vous utilisez actuellement un compte temporaire.</b> Les modifications effectuées avec le compte temporaire %1$s ne seront pas transférées sur votre compte permanent lorsque vous vous connecterez. Entrez ou créez un compte pour obtenir un crédit à votre nom d\'utilisateur, parmi d\'autres avantages. Terminer la session Cela vous déconnectera de votre compte temporaire. Voulez-vous continuer ? Erreur de l’application @@ -878,6 +898,12 @@ Annuler Vous avez atteint la fin du flux. Charger davantage + Sélectionnez une variante linguistique régionale pour une meilleure expérience de lecture + Vous utilisez actuellement une variante générique de la langue chinoise non prise en charge comme langue principale de Wikipédia + Enregistrer + Veuillez mettre à jour vos langues secondaires + Vous utilisez actuellement une variante générique du chinois non prise en charge comme langue secondaire. Veuillez accéder à vos paramètres pour sélectionner une nouvelle langue secondaire ou pour confirmer votre liste de langues. + Aller aux paramètres Les plus lus sur %s Onglets Description de l’article @@ -1285,6 +1311,11 @@ Insérer par exemple %s %s (facultatif) + %s (suggéré) + En savoir plus + Les modèles sont générés par l\'utilisateur et peuvent manquer de descriptions complètes. + Le modèle « %s » n\'a pas encore de description. + Il manque un <a href=\"%1$s\">TemplateData</a> à ce modèle et ses paramètres ont été <a href=\"%2$s\">générés automatiquement</a>. Par conséquent, le modèle et ses paramètres manquent de descriptions. Aide Se connecter / rejoindre Wikipédia Bonjour %s, saviez-vous que chacun peut mettre à jour Wikipédia ? @@ -1308,8 +1339,10 @@ Titre du message Publier Annuler + Annuler Message publié sur la page de discussion utilisateur de l’éditeur Message enregistré et publié sur la page de discussion utilisateur de l’éditeur + Messages enregistrés Cette page de discussion est vide. La conversation commence ici Les pages de discussion sont des endroits pour discuter de la façon de rendre le contenu de Wikipédia le meilleur possible. Commencez par ajouter un nouveau sujet de discussion pour vous connecter et collaborer avec une communauté de Wikipédiens. @@ -1320,6 +1353,7 @@ Composer un message Le message ne peut pas être vide. Le sujet ne peut pas être vide. + Le nom du sujet existe déjà. Essayez-en un autre. Réponse postée. Annuler <b>Dernière modification le %1$s</b> par %2$s @@ -1541,6 +1575,8 @@ Les messages ont été supprimés Le titre ne peut pas être vide. + Vos messages + Messages d\'exemple Rechercher ou filtrer les modifications Balises : %s Aucune @@ -1614,6 +1650,8 @@ Vous voyez une modification pertinente ? Remerciez un utilisateur pour sa contribution ! Suivre Vous souhaitez suivre les modifications d’articles ? Ajoutez à votre liste de surveillance. Consultez-la sous « Plus ». + Discussion + Communiquer avec d\'autres contributeurs. Enregistrer les messages des pages de discussion couramment utilisés ou utiliser un modèle. Annuler/Restaurer Choisissez « Annuler » pour révoquer ou annuler une modification potentiellement problématique. Dommage prédit si une modification cause des dommages à un wiki. @@ -1624,6 +1662,7 @@ Neutre Insatisfait Comment pouvons-nous améliorer la fonctionnalité ? + Historique des modifications de l’article Commentaire Soumettre Commentaire envoyé. @@ -1647,7 +1686,10 @@ Bonjour {{{username}}}. Votre récente modification semble inclure du matériel protégé par le droit d\'auteur sans autorisation. Veuillez vous assurer que tout le contenu est [[WP:VDA|conforme aux politiques de Wikipédia en matière de droits d\'auteur]] afin d\'éviter toute annulation. Bonjour {{{username}}}, il semble que vous ayez supprimé du contenu de Wikipédia sans l\'expliquer dans le résumé de modification. Veuillez laisser un résumé de modification chaque fois que vous ajoutez ou supprimez du contenu sur Wikipédia. Bonjour {{{username}}}, il semble que vous ayez supprimé un contenu sans en discuter au préalable sur la page de discussion de l\'article. Veuillez noter que Wikipédia n\'est pas censurée et qu\'un contenu ne doit pas être supprimé parce qu\'il est controversé. Si vous pensez que l\'information est inexacte, veuillez parvenir à un consensus sur la page de discussion de l\'article. + En savoir plus sur les messages de substitution + Utilisez un exemple de message ci-dessous pour personnaliser, envoyer et enregistrer vos messages. Bonjour {{{username}}} ! Votre article est un excellent début ! Pour l\'améliorer encore, pensez à ajouter davantage de références à des sources fiables. Cela permet de vérifier les informations et d\'améliorer la qualité de l\'article. Pour plus de détails, consultez les pages de [[Wikipedia:Reliable_sources|sources fiables]]. + Modifier Accepter Rejeter Problèmes de la page @@ -1660,7 +1702,21 @@ Merci, cher donateur ! Votre générosité permet à Wikipédia et à ses sites frères de continuer à prospérer. Retour Ouvrir dans le navigateur système + Faire un don avec Google Pay ? + Faites un don avec Google Pay ou choisissez un autre mode de paiement. + Faire un don avec Google Pay + Autre moyen de paiement + Sélectionnez le montant + J\'ajouterai généreusement %s pour couvrir les frais de transaction afin de que vous puissiez conserver 100%% de mon don. + En faire un don mensuel récurrent. + Oui, la Fondation Wikimedia peut m\'envoyer un courriel de temps en temps. + Veuillez sélectionner un montant (minimum %s) + Nous ne pouvons pas accepter de dons supérieurs à %s via notre application. Veuillez contacter notre équipe chargée des dons importants à l\'adresse benefactors@wikimedia.org. + <b>Merci beaucoup.</b> Votre générosité envers Wikipédia signifie tellement pour nous. + Problèmes pour faire un don ? + Autres moyens de donner Foire aux questions + Informations sur les conditions de déductibilité fiscale Lieux Une autorisation de localisation est requise pour voir votre position sur la carte. Veuillez réessayer. Rechercher des lieux diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 2c7dd295df0..704287c9bea 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -296,6 +296,7 @@ कड़ियाँ लगाई अन्य अन्य तरीकों से आपके द्वारा पृष्ठ में सुधार + संक्षिप्त विवरण जोड़ा गया संपादन अंतर्विरोध इस पेज को पहले ही किसी अन्य यूज़र के द्वारा संपादित किया जा चुका है और आपके संपादन के साथ परस्पर-विरोध हो रहा है। कृपया अपने संपादन को कॉपी कर ले, वापस जाएं और पेज रिफ्रेश कर पुनः संपादन का प्रयास करें। नोटिस संपादित करें @@ -831,6 +832,7 @@ रद्द करें आप फ़ीड की अंत तक पहुंच गए हैं। और लोड करें + सहेजें %s को सबसे सर्वाधिक पठित टैब्स लेख वर्णन diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index eecb61017a9..6aac11407e0 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -275,6 +275,8 @@ Ligamines addite Altere Altere manieras del quales tu ha meliorate iste pagina + Curte description addite + Curte description actualisate Conflicto inter modificationes Le pagina ha ja essite modificate per un altere usator e es in conflicto con tu modification. Per favor copia tu modificationes, va retro e refresca le pagina, alora tenta modificar lo de novo. Avisos de modification diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index b77ab6e8d81..55f006d1008 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -318,6 +318,8 @@ Aggiunti collegamenti Altro Altri modi nei quali hai migliorato la pagina + Aggiunta descrizione breve + Aggiornata descrizione breve Conflitto di edizione La pagina è già stata modificata da un altro utente ed è in conflitto con la tua modifica. Copia le modifiche, torna indietro e aggiorna la pagina, quindi prova a modificare di nuovo. Avvisi per le modifiche diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index d53112cc596..080e224bac0 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -277,6 +277,8 @@ Додадени врски Друго Други начини на кои ја подобривте страницата + Додаден краток опис + Изменет краток опис Спротивставеност во уредувањето Оваа страница е веќе изменета од друг корисник, и се коси со вашето уредување. Прекопирајте ги вашите уредувања, превчитајте ја страницата и обидете се повторно. Белешки за уредување diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml index b700344ec32..c445da180c6 100644 --- a/app/src/main/res/values-sd/strings.xml +++ b/app/src/main/res/values-sd/strings.xml @@ -271,6 +271,8 @@ ڳنڍڻا وڌا ٻيو هن صفحي کي توهان ٻين ڪهڙن طريقن سان سڌاريو + مختصر تشريح شامل ڪئي + مختصر تشريح ۾ تجديد ڪئي سنوار ۾ تضاد صفحو اڳ ۾ ئي ڪنھن ٻي واپرائيندڙ پاران تبديل ڪيو ويو آھي، ۽ توھان جي سنوار سان ٽڪراءَ ۾ آھي. مھرباني ڪري پنھنجيون تبديليون نقل ڪريو، واپس وڃو ۽ صفحي کي ريفريش ڪريو، پوءِ ٻيھر سنوارڻ جي ڪوشش ڪريو. سنوار جا اطلاع @@ -751,6 +753,9 @@ رد توھان رسد جي تري تائين پھچي چڪا آھيو. وڌيڪ لاھيو + سانڍيو + مھرباني ڪري پنھنجي ثانوي ٻولين کي اپڊيٽ ڪريو + ترتيبن ڏانهن وڃو %s تي گهڻو پڙھيل ٽيبون مضمون جي تشريح @@ -1436,18 +1441,22 @@ شايد بدنيتيءَ سان ڪيل ممڪنہ طور بدنيتيءَ تي ٻڌل گهڻو ڪري بدنيتيءَ سان ڪيل + وڌيڪ سنوارون ڏسڻ لاءِ %s کي ھٽائي ڏسو %d ڇاڻي %d ڇاڻيون مضمون جي سنوار سوانح واپس ورائڻ مڪمل + ڇا توهان کي پڪ آهي تہ توهان واپس ورائڻ ٿا چاھيو؟ مڪمل واپس موٽايو ڏسو خاصيت ۾ مسئلو آھي وڌيڪ ڄاڻيو مھرباني چئو نظر۾رکو + بحث + ٻين سنواريندڙن سان لھ چڙھ ۾ اچو. عام طور تي استعمال ٿيندڙ بحث صفحي جا پيغام سانڍيو يا ڪو سانچو استعمال ڪريو. اڻڪريو/واپس موٽايو ھن خصوصيت کي بھتر ڪرڻ ۾ اسان جي مدد ڪريو ڇا توھان ھن خصوصيت سان مطمئن آھيو؟ @@ -1478,7 +1487,15 @@ مھرباني، پيارا مدد ڪندڙ! توهان جي سخاوت وڪيپيڊيا ۽ ان جي ڀينر سائيٽن کي ترقي وٺرائڻ ۾ مدد ڪري ٿي. واپس وڃو سسٽم برائوزر ۾ کوليو + گوگل پي ذريعي امداد ڏجي؟ + گوگل پي سان امداد ڏيو يا ٻيو ادائگي جو طريقو چونڊيو. + گوگل پي ذريعي امداد ڏيو + ادائگي جو ٻيو طريقو رقم چونڊيو + امداد ڏيڻ ۾ مسئلا اچن ٿا؟ + امداد ڏيڻ جا ٻيا طريقا + ڪثرتاً پڇجندڙ سوال + ٽيڪس ڪٽوتي جي معلومات ماڳ نقشي تي توھان جي جڳھ کي ڏسڻ لاءِ جڳھ جي اجازت گهربل آھي. مھراني ڪري ٻيھر ڪوشش ڪريو. ماڳ ڳوليو diff --git a/app/src/main/res/values-sms/strings.xml b/app/src/main/res/values-sms/strings.xml index 8c9efa231f2..1fca6360070 100644 --- a/app/src/main/res/values-sms/strings.xml +++ b/app/src/main/res/values-sms/strings.xml @@ -65,7 +65,7 @@ Mââimõssân peiʹvvuum %s Čuäʹjet saǥstõõllâmseeid Čuäʹjet muʹttemhistoria. - Čuäʹjet kaartâst + Čuäʹjet mäddkaartâst Looǥǥ jeeʹres ǩiõʹlle Wikipedia ǩiõl Ooccmõš diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index af0931439bc..5a311f065fc 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -285,6 +285,8 @@ Додати линкови Друго Други начини на које сте побољшали страницу + Додат кратак опис + Ажуриран кратак опис Сукоб измена Дошло је до сукоба измена јер је други корисник већ изменио страницу. Копирајте своје измене, вратите се и освежите страницу, па покушајте поново. Обавештење о чланку @@ -1117,6 +1119,7 @@ Листе за читање са синхронизацијом Можете да правите листе за читање од чланака које желите да читате касније, чак и када сте офлајн. <br/>Пријавите се на свој налог на Википедији да бисте синхронизовали листе за читање. <a href=\"#login\">Придружите се Википедији</a>. Подаци & приватност + Ми верујемо да не морате одавати личне информације да би учествовали у покрету за слободно знање. Подаци о употреби ове апликације се прикупљају анонимно. Сазнајте више о нашој <a href=\"#privacy\">политици приватности</a> и <a href=\"#termsOfUse\">условима коришћења</a>. Шаљи податке о употреби Разумем Пронашли смо следеће на вашем уређају: diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 791e6833152..d0c69b1c60f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -279,7 +279,7 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.tr https://creativecommons.org/publicdomain/zero/1.0/deed.tr - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/tr + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits/tr https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits/tr#Image_tags Kullanılan kütüphaneler Katkıda bulunanlar @@ -462,6 +462,10 @@ Engellemeyi görüşmek için <a href=\"%2$s\">%1$s</a> ya da başka bir <a href=\"https://tr.wikipedia.org/wiki/Vikipedi:Hizmetliler#Hizmetliler_listesi\">hizmetli</a> ile iletişime geçebilirsiniz. Araç çubuğunuzu özelleştirin Engellemeyi görüşmek için bir <a href=\"https://tr.wikipedia.org/wiki/Vikipedi:Hizmetliler#Hizmetliler_listesi\">hizmetli</a> ile iletişime geçebilirsiniz. + Oturum açmadınız + Anladım + Geçici bir hesap kullanıyorsunuz + Oturumu bitir Uygulama hatası Üzgünüz, Vikipedi uygulaması bir sorunla karşılaştı ve kapatıldı.\n\nBaştan başlatmak mı yoksa çıkmak mı istersiniz? Baştan başlat @@ -854,6 +858,8 @@ İptal Yayının altına ulaştınız. Daha fazla yükle + Sakla + Ayarlara git %s tarihinde en çok okunanlar Sekmeler Madde tanımı @@ -1103,8 +1109,8 @@ Evet Hayır Emin değilim - Neden? - Yanıtlarınız gelecek önerileri iyileştirir. + Geri çevirme gerekçesi + Geri çevirme gerekçesi anonimdir ve gelecek görsel önerilerini iyileştirir. Görsel ilgili değil Karar vermek için yeterli bilgi yok Görsel rahatsız edici @@ -1254,6 +1260,11 @@ Yükseklik px Ekle + Ekle + ör. %s + %s (İsteğe bağlı) + %s (Önerilen) + Daha fazla bilgi edin Yardım Vikipedi\'ye oturum açın / katılın Merhaba %s, herkesin Vikipedi\'yi düzenleyebileceğini biliyor muydun? @@ -1277,6 +1288,7 @@ İleti başlığı Yayımla İptal + Saklama İleti, düzenleyicinin kullanıcı tartışma sayfasında yayımlandı İleti, düzenleyicinin kullanıcı tartışma sayfasında saklandı ve yayımlandı Saklanan iletiler @@ -1511,6 +1523,8 @@ İletiler silindi Başlık boş olamaz. + İletileriniz + Örnek iletiler Değişiklikleri ara ya da filtrele Etiketler: %s Hiçbiri @@ -1599,6 +1613,13 @@ Gönder Geri bildirim gönderildi. \'Özellikle ilgili sorun\' altında istediğiniz zaman geri bildirim göndermek için taşan menüye dokunun. + Tarafsız bakış açısı + Otomatik çeviri + Son uyarı + Telif hakkı ihlali uyarısı + Düzenleme özeti bırakın + Madde iyileştirme önerisi + Düzenle Kabul et Reddet Sayfa sorunları @@ -1611,6 +1632,18 @@ Teşekkürler sevgili bağışçı! Cömertliğiniz Vikipedi\'nin ve kardeş sitelerinin gelişmesine yardımcı oluyor. Geri dön Sistem tarayıcısında aç + Google Pay ile bağış yapmak ister misiniz? + Google Pay ile bağış yapın + Diğer ödeme yöntemi + Bir tutar seçin + Bağışımın %%100\'ünü alabilmeniz için işlem ücretlerini karşılamak üzere cömertçe %s ekleyeceğim. + Bunu aylık olarak yinelenen bir bağış yapın. + Evet, Wikimedia Vakfı bana ara sıra e-posta gönderebilir. + Lütfen bir miktar seçin (en az %s) + Uygulamamız aracılığıyla %s üzerindeki bağışları kabul edemiyoruz. Lütfen benefactors@wikimedia.org adresinde büyük bağışlar ekibimizle iletişime geçin. + Bağış sorunları mı yaşıyorsunuz? + Sıkça sorulan sorular + Vergiden düşülebilirlik bilgileri Yerler Haritadaki yerinizi görmek için konum izni gereklidir. Lütfen tekrar deneyin. Yerleri ara diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 5f2967fcd3e..c544871539c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -305,6 +305,8 @@ 新增連結 其他 您改善頁面的其他方式 + 已新增簡短描述 + 已更新簡短描述 編輯衝突 頁面已被不同的使用者給變動,並且有與您的編輯產生衝突。請複製您的編輯並返回來重整頁面,然後再重試編輯。 編輯說明 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index c7e650389ee..d3d0fd8b1e9 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -798,8 +798,8 @@ 来自维基百科的通知 其他 来自应用程序的其他通知 - 过滤通知 - 过滤通知 + 筛选通知 + 筛选通知 更改应用程序语言 请移除所设的%s来查看更多通知 @@ -1285,6 +1285,8 @@ 高度 像素 插入 + 搜索模板 + 插入 例如%s %s(选填) %s(推荐) From afa8a13715e75f72ee443edd0d7023128bc2a23d Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Thu, 23 May 2024 14:45:25 -0400 Subject: [PATCH 142/626] GPay: add standard data policy disclaimer. (#4693) --- .../org/wikipedia/donate/GooglePayActivity.kt | 7 +++++++ .../wikipedia/donate/GooglePayViewModel.kt | 18 +++++++++++++++++ app/src/extra/res/layout/activity_donate.xml | 20 +++++++++++++++++++ .../java/org/wikipedia/dataclient/Service.kt | 3 ++- .../dataclient/donate/DonationConfigHelper.kt | 5 +++-- .../main/res/values/strings_no_translate.xml | 2 ++ 6 files changed, 52 insertions(+), 3 deletions(-) diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt index fe81b64d467..ed1c4bc51ec 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayActivity.kt @@ -6,6 +6,7 @@ import android.content.Intent import android.graphics.Color import android.net.Uri import android.os.Bundle +import android.text.method.LinkMovementMethod import android.view.View import androidx.activity.viewModels import androidx.core.view.children @@ -31,6 +32,7 @@ import org.wikipedia.dataclient.donate.DonationConfig import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.Resource import org.wikipedia.util.ResourceUtil +import org.wikipedia.util.StringUtil import org.wikipedia.util.UriUtil class GooglePayActivity : BaseActivity() { @@ -151,6 +153,8 @@ class GooglePayActivity : BaseActivity() { DonorExperienceEvent.logAction("taxinfo_click", "gpay") UriUtil.visitInExternalBrowser(this, Uri.parse(getString(R.string.donate_tax_url))) } + binding.disclaimerText1.movementMethod = LinkMovementMethod.getInstance() + binding.disclaimerText2.movementMethod = LinkMovementMethod.getInstance() } private fun validateInput(text: String): Boolean { @@ -194,6 +198,9 @@ class GooglePayActivity : BaseActivity() { binding.checkBoxTransactionFee.text = getString(R.string.donate_gpay_check_transaction_fee, viewModel.currencyFormat.format(viewModel.transactionFee)) + binding.disclaimerText1.text = StringUtil.fromHtml(viewModel.disclaimerInformationSharing) + binding.disclaimerText2.text = StringUtil.fromHtml(viewModel.disclaimerMonthlyCancel) + val methods = JSONArray().put(GooglePayComponent.baseCardPaymentMethod) binding.payButton.initialize(ButtonOptions.newBuilder() .setButtonTheme(if (WikipediaApp.instance.currentTheme.isDark) ButtonConstants.ButtonTheme.DARK else ButtonConstants.ButtonTheme.LIGHT) diff --git a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt index 8b42b46471a..b00d958085d 100644 --- a/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt +++ b/app/src/extra/java/org/wikipedia/donate/GooglePayViewModel.kt @@ -10,7 +10,9 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import org.json.JSONObject import org.wikipedia.BuildConfig +import org.wikipedia.R import org.wikipedia.WikipediaApp +import org.wikipedia.dataclient.Service import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.donate.DonationConfig @@ -55,6 +57,9 @@ class GooglePayViewModel : ViewModel() { val emailOptInRequired get() = donationConfig?.countryCodeEmailOptInRequired.orEmpty().contains(currentCountryCode) + var disclaimerInformationSharing: String? = null + var disclaimerMonthlyCancel: String? = null + var finalAmount = 0f init { @@ -69,8 +74,16 @@ class GooglePayViewModel : ViewModel() { uiState.value = Resource.Loading() val donationConfigCall = async { DonationConfigHelper.getConfig() } + val donationMessagesCall = async { ServiceFactory.get(WikipediaApp.instance.wikiSite, + DonationConfigHelper.DONATE_WIKI_URL, Service::class.java).getMessages( + listOf(MSG_DISCLAIMER_INFORMATION_SHARING, MSG_DISCLAIMER_MONTHLY_CANCEL).joinToString("|"), + null, WikipediaApp.instance.appOrSystemLanguageCode) } donationConfig = donationConfigCall.await() + donationMessagesCall.await().let { response -> + disclaimerInformationSharing = response.query?.allmessages?.find { it.name == MSG_DISCLAIMER_INFORMATION_SHARING }?.content?.replace("$1", WikipediaApp.instance.getString(R.string.donor_privacy_policy_url)) + disclaimerMonthlyCancel = response.query?.allmessages?.find { it.name == MSG_DISCLAIMER_MONTHLY_CANCEL }?.content?.replace("$1", WikipediaApp.instance.getString(R.string.donate_email)) + } // The paymentMethods API is rate limited, so we cache it manually. val now = Instant.now().epochSecond @@ -168,4 +181,9 @@ class GooglePayViewModel : ViewModel() { class NoPaymentMethod : Resource() class DonateSuccess : Resource() + + companion object { + private const val MSG_DISCLAIMER_INFORMATION_SHARING = "donate_interface-informationsharing" + private const val MSG_DISCLAIMER_MONTHLY_CANCEL = "donate_interface-monthly-cancel" + } } diff --git a/app/src/extra/res/layout/activity_donate.xml b/app/src/extra/res/layout/activity_donate.xml index 0e7e57a4063..018bf7f73f6 100644 --- a/app/src/extra/res/layout/activity_donate.xml +++ b/app/src/extra/res/layout/activity_donate.xml @@ -124,6 +124,26 @@ android:layout_marginTop="24dp" android:layout_marginBottom="16dp"/> + + + + () diff --git a/app/src/main/res/values/strings_no_translate.xml b/app/src/main/res/values/strings_no_translate.xml index 26c188758b2..000d9637ea4 100644 --- a/app/src/main/res/values/strings_no_translate.xml +++ b/app/src/main/res/values/strings_no_translate.xml @@ -19,6 +19,8 @@ https://donate.wikimedia.org/wiki/Special:LandingCheck?landing_page=Ways_to_Give&basic=true https://donate.wikimedia.org/wiki/Special:LandingCheck?landing_page=FAQ&basic=true https://donate.wikimedia.org/wiki/Special:LandingCheck?landing_page=Tax_deductibility&basic=true + donate@wikimedia.org + https://foundation.wikimedia.org/wiki/Policy:Donor_privacy_policy @string/wikimedia From 49fe32d582ebd14c7c18986abdbb4f3223a0771b Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Thu, 23 May 2024 15:04:08 -0400 Subject: [PATCH 143/626] Lazily load Read More items. (#4690) * Lazily load Read More items. * Unused strings. * Reset trigger when finished retrieving sections. * Lint. --------- Co-authored-by: Cooltey Feng --- .../bridge/JavaScriptActionHandler.kt | 18 ++++++++++++++++-- .../java/org/wikipedia/page/PageFragment.kt | 9 +++++++++ .../java/org/wikipedia/page/PageViewModel.kt | 1 + 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt b/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt index 4d25a643e64..c0768bcec64 100644 --- a/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt +++ b/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt @@ -6,7 +6,6 @@ import org.wikipedia.BuildConfig import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil -import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.page.Namespace import org.wikipedia.page.PageTitle @@ -137,7 +136,6 @@ object JavaScriptActionHandler { // TODO: page-library also supports showing disambiguation ("similar pages") links and // "page issues". We should be mindful that they exist, even if we don't want them for now. - val baseURL = ServiceFactory.getRestBasePath(model.title?.wikiSite!!).trimEnd('/') return "pcs.c1.Footer.add({" + " platform: \"android\"," + " clientVersion: \"${BuildConfig.VERSION_NAME}\"," + @@ -154,6 +152,22 @@ object JavaScriptActionHandler { " }," + " readMore: { " + " itemCount: 3," + + " readMoreLazy: true," + + " fragment: \"pcs-read-more\"" + + " }" + + "})" + } + + fun appendReadMode(model: PageViewModel): String { + if (model.page == null) { + return "" + } + val baseURL = model.title?.wikiSite!!.scheme() + "://" + model.title?.wikiSite!!.uri.authority!!.trimEnd('/') + return "pcs.c1.Footer.appendReadMore({" + + " platform: \"android\"," + + " clientVersion: \"${BuildConfig.VERSION_NAME}\"," + + " readMore: { " + + " itemCount: 3," + " baseURL: \"$baseURL\"," + " fragment: \"pcs-read-more\"" + " }" + diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 7623340ff8d..9b4aba6006f 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -234,6 +234,14 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi bottomBarHideHandler.setScrollView(webView) bottomBarHideHandler.enabled = Prefs.readingFocusModeEnabled + webView.addOnScrollChangeListener { _, scrollY, _ -> + if (scrollY > (DimenUtil.roundedDpToPx(webView.contentHeight.toFloat()) - (DimenUtil.displayHeightPx * 2)) && + !model.isReadMoreLoaded) { + bridge.execute(JavaScriptActionHandler.appendReadMode(model)) + model.isReadMoreLoaded = true + } + } + editHandler = EditHandler(this, bridge) sidePanelHandler = SidePanelHandler(this, bridge) leadImagesHandler = LeadImagesHandler(this, webView, binding.pageHeaderView, callback()) @@ -446,6 +454,7 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi sidePanelHandler.setupForNewPage(page) sidePanelHandler.setEnabled(true) + model.isReadMoreLoaded = false } } bridge.evaluate(JavaScriptActionHandler.getProtection()) { value -> diff --git a/app/src/main/java/org/wikipedia/page/PageViewModel.kt b/app/src/main/java/org/wikipedia/page/PageViewModel.kt index 4959c737b35..c945216acc2 100644 --- a/app/src/main/java/org/wikipedia/page/PageViewModel.kt +++ b/app/src/main/java/org/wikipedia/page/PageViewModel.kt @@ -13,6 +13,7 @@ class PageViewModel { var hasWatchlistExpiry = false var isWatched = false var forceNetwork = false + var isReadMoreLoaded = false val isInReadingList get() = readingListPage != null val cacheControl get() = if (forceNetwork) OkHttpConnectionFactory.CACHE_CONTROL_FORCE_NETWORK else OkHttpConnectionFactory.CACHE_CONTROL_NONE val shouldLoadAsMobileWeb get() = From 9832336bf1dc2091d93950ccaeb17f637ca97982 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Tue, 28 May 2024 17:58:25 +0530 Subject: [PATCH 144/626] Localisation updates from https://translatewiki.net. (#4697) --- app/src/main/res/values-fa/strings.xml | 47 ++++++++++++++++++++++++++ app/src/main/res/values-fi/strings.xml | 11 ++++++ app/src/main/res/values-ko/strings.xml | 4 +++ app/src/main/res/values-pa/strings.xml | 11 +++--- app/src/main/res/values-sv/strings.xml | 2 ++ app/src/main/res/values-uk/strings.xml | 2 ++ app/src/main/res/values-zh/strings.xml | 2 +- 7 files changed, 74 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index b365fc9de5a..69e69cf6ca1 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -345,6 +345,8 @@ صفحهٔ برگزیدهٔ ویکی‌پدیا صفحهٔ برگزیدهٔ امروز: جستجوی ویکی‌پدیا + سریع‌ترین راه برای جستجوی ویکی‌پدیا + بهترین مقاله‌های ارائه‌شده از سوی ویکی‌پدیا معنایی یافت نشد. به‌روزرسانی نسخهٔ آلفای جدید موجود است برای دانلود ضربه بزنید @@ -425,6 +427,11 @@ %d مورد انتخاب شد خطایی رخ داد نپذیرفتن + خواندن + ذخیره + ذخیره شد + اشتراک + این یک مقالهٔ خرد است، به این معنی که محتوای کافی برای تولید پیش‌نمایش در مقاله وجود ندارد. با این حال، می‌توانید آن را تغییر دهید. این صفحه وجود ندارد ویکی‌پدیا <a href=\"%1$s\">صفحهٔ کاربری‌ای</a> با این عنوان ندارد. به طور کلی، این صفحه باید توسط <b>%2$s</b> ایجاد و ویرایش شود. اگر شک دارید، لطفاً بررسی کنید که آیا «%3$s» وجود دارد یا خیر. امکان اتصال به اینترنت وجود ندارد @@ -447,6 +454,25 @@ برای گفتگو پیرامون قطع دسترسی می‌توانید با <a href=\"%2$s\">%1$s</a> یا یک <a href=\"https://fa.wikipedia.org/wiki/ویکی‌پدیا:مدیران\">مدیر</a> دیگر تماس بگیرید. نوار ابزار خود را سفارشی‌سازی کنید برای گفتگو پیرامون قطع دسترسی می‌توانید با یک <a href=\"https://fa.wikipedia.org/wiki/ویکی‌پدیا:مدیران\">مدیر</a> تماس بگیرید. + شما به سامانه وارد نشده‌اید + هرگاه ویرایشی انجام دهید، یک <b>حساب موقت</b> برای شما ایجاد خواهد شد تا از حریم خصوصی شما حفاظت شود. <a href=\"%1$s\">بیشتر بدانید</a>.<br /><br />برای این که ویرایش‌های آتی به خودتان منتسب شوند و به سایر ویژگی‌ها دسترسی داشته باشید، <a href=\"https://#login\">وارد سامانه شوید</a> یا <a href=\"https://#login\">یک حساب کاربری بسازید</a>. + ویرایش شما به %1$s منتسب خواهد شد. نشانی آی‌پی شما برای مدیران قابل مشاهده خواهد بود.<br /><br />اگر <a href=\"https://#login\">وارد سامانه شوید</a> یا <a href=\"https://#login\">حساب بسازید</a>، ویرایش‌های شما به نامی که خودتان انتخاب می‌کنید منتسب خواهند شد و از مزایای دیگری نیز بهره‌مند خواهید شد. + متوجه شدم + شما در حال استفاده از یک حساب موقت هستید + دور ریختن تغییرات و ورود به حساب + + حساب موقت %1$s پس از انتشار ویرایش شما ایجاد شده است. این حساب پس از %2$d روز منقضی خواهد شد. + حساب موقت %1$s پس از انتشار ویرایش شما ایجاد شده است. این حساب پس از %2$d روز منقضی خواهد شد. + + + این حساب پس از %d روز منقضی خواهد شد. + این حساب پس از %d روز منقضی خواهد شد. + + <b>شما به سامانه وارد نشده‌اید.</b> به محض این که ویرایشی انجام دهید، یک حساب موقت برای شما ایجاد خواهد شد تا از حریم خصوصی شما حفاظت شود. <a href=\"%1$s\">بیشتر بدانید</a> + <b>شما در حال استفاده از یک حساب موقت هستید.</b> ویرایش شما به %1$s منتسب خواهد شد. <a href=\"%2$s\">بیشتر بدانید</a>. + <b>شما در حال حاضر در حال استفاده از یک حساب موقت هستید.</b> ویرایش‌هایی که با حساب موقت %1$s انجام دهید، پس از ورود به سامانه به حساب دائمی شما منتقل نخواهند شد. برای انتساب ویرایش‌ها به نام کاربری خودتان و بهره‌مندی از مزایای دیگر، یک حساب کاربری بسازید. + پایان نشست + این کار باعث می‌شود که از حساب موقت خود خارج شوید. آیا می‌خواهید ادامه دهید؟ خطای برنامه با عرض پوزش، نرم‌افزار ویکی‌پدیا با خطا مواجه شد و بسته شد.\n\nآیا قصد شروع دوباره دارید یا می‌خواهید خارج شوید؟ شروع دوباره @@ -517,7 +543,10 @@ مرتب‌سازی بر اساس تاریخ ایجادشدن (جدیدترین) مرتب‌سازی بر اساس تاریخ ایجادشدن (قدیمی‌ترین) حذف فهرست + برون‌بری فهرست انتخاب + لغو انتخاب + برای برون‌بری فهرست مطالعهٔ شما، به اجازه برای نوشتن اطلاعات بر روی حافظهٔ دستگاه شما نیاز است. ویرایش نام/توضیحات حذف از مخزن آفلاین ذخیره در مخزن آفلاین @@ -538,6 +567,15 @@ %d مقاله از %s حذف شد %d مقاله از %s حذف شدند + + %d فهرست حذف شد + %d فهرست حذف شدند + + فهرست پیش‌فرض (%s) قابل حذف نیست + %1$s حذف شد. فهرست پیش‌فرض (%2$s) قابل حذف نیست. + فهرست‌ها حذف شدند. فهرست پیش‌فرض (%s) قابل حذف نیست. + %s (فهرست مطالعهٔ ویکی‌پدیا).json + فهرست‌های مطالعهٔ ویکی‌پدیا (%s و بیشتر).json %d مقاله از فهرست حذف شد %s از فهرست‌ها حذف شد واگردانی @@ -570,6 +608,11 @@ %1$d مقاله به %2$s اضافه شد %1$d مقاله به %2$s منتقل شد آیا مطمئن هستید که می‌خواهید %s را حذف کنید؟ + حذف فهرست(های) انتخاب‌شده؟ + + از حذف %d فهرست مطمئن هستید؟ + از حذف %d فهرست مطمئن هستید؟ + برای فعال‌کردن همگام‌سازی وارد شوید برای ممکن ساختن ذخیرهٔ فهرست‌های مطالعهٔ خود، به حساب خود وارد شوید. لغو @@ -616,6 +659,8 @@ تأیید حذف فهرست مطالعه: %s + فهرست(های) مطالعه برون‌بری شد + %d فهرست مطالعه تحت عنوان «reading_lists export.json» در پوشهٔ بارگیری‌های شما برون‌بری شد برون‌بری فایل مورد نظر را برای درون‌ریزی انتخاب کنید ذخیره @@ -806,6 +851,8 @@ لغو شما به انتهای محتوا رسیدید. بارگیری بیشتر + ذخیره‌سازی + رفتن به تنظیمات پربازدیدها در %s زبانه‌ها توضیحات مقاله diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index eae86bac935..cfc378229de 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -149,6 +149,7 @@ Omat Wikipedia-kielet Julkaise muutokset Muokkaus julkaistu! + Muokkaus julkaistu! Muutosten näkymiseen voi mennä jonkin aikaa. Muokkaus epäonnistui! Yritä uudelleen Peru @@ -303,6 +304,8 @@ Lisätty linkkejä Muu Muita sivulle tehtyjä parannuksia + Lyhyt kuvaus lisätty + Lyhyttä kuvausta päivitetty Päällekkäinen muokkaus. Toinen käyttäjä on jo muokannut sivua, ja se on ristiriidassa muokkauksesi kanssa. Kopioi muokkauksesi, palaa takaisin ja päivitä sivu, yritä sitten muokata uudelleen. Muokkausilmoitukset @@ -338,6 +341,7 @@ Päivän suositeltu sivu: Wikipedia-haku Nopein tapa etsiä Wikipediasta + Wikipedian parhaimmat artikkelit Määritelmiä ei löytynyt. Uusi alfaversio saatavilla Lataa napauttamalla @@ -425,6 +429,7 @@ Tallenna Tallennettu Jaa + Tämä artikkeli on tynkä, mikä tarkoittaa, että siinä ei ole tarpeeksi sisältöä esikatselun luomiseksi. Kuitenkin voit korjata asian. Tätä sivua ei ole olemassa Wikipediassa ei ole tämän nimistä <a href=\"%1$s\">käyttäjäsivua</a>. Useimmiten vain käyttäjän <b>%2$s</b> tulisi luoda tämä sivu ja muokata sitä. Mikäli et ole varma, varmista että käyttäjä \"%3$s\" on olemassa. Ei voitu yhdistää internetiin @@ -448,8 +453,10 @@ Mukauta työkalupalkkia Voit olla yhteydessä <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">ylläpitäjään</a> keskustellaksesi estosta. Et ole kirjautunut sisään + Selvä Käytät väliaikaista käyttäjätunnusta Hylkää muutokset ja kirjaudu sisään + Lopeta istunto Tämä kirjaa sinut ulos väliaikaiselta tililtäsi. Haluatko jatkaa? Sovellusvirhe Wikipedia-sovellus lopetti toimintansa teknisen vian takia.\n\nKäynnistetäänkö sovellus uudelleen vai poistutaanko? @@ -841,6 +848,8 @@ Peruuta Olet päässyt syötteen loppuun. Lataa enemmän + Tallenna + Mene asetuksiin Luetuimmat %s Välilehdet Artikkelin kuvaus @@ -1590,6 +1599,8 @@ Jätä muokkausyhteenveto Älä sensuroi Artikkelin parannusehdotus + Hei {{{username}}}, vaikuttaa siltä, että poistit sisältöä jättämättä muokkauksen yhteenvetoa. Jätäthän muokkauksen yhteenvedon kun lisäät sisältöä Wikipediaan tai poistat sitä. + Hei {{{username}}}, näyttää siltä, että poistit sisältöä keskustelematta asiasta artikkelin keskustelusivulla. Huomioithan, että Wikipedia ei ole sensuroitu ja sisältöä ei tulisi poistaa vain siksi, että se on kiistanalaista. Jos uskot tiedon olevan väärin, yritä saavuttaa yhteisymmärrys sen poistamisesta artikkelin keskustelusivulla. Muokkaa Hyväksy Hylkää diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 3b088c5492d..979c939f7bf 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -298,6 +298,8 @@ 추가된 링크 기타 문서를 개선하는 다른 방법 + 짧은 설명을 추가함 + 짧을 설명을 갱신함 편집 충돌 이 문서는 이미 다른 사용자에 의해 수정되었으며 편집과 충돌합니다. 편집을 복사하고 뒤로 돌아가서 문서를 새로 고친 다음 다시 편집을 시도하십시오. 편집 알림 @@ -822,6 +824,8 @@ 취소 피드의 끝에 도달했습니다. 더 불러오기 + 저장 + 설정으로 이동 %s의 가장 많이 읽은 글 문서 설명 diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index c0dc6107967..68d079df4f1 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -2,6 +2,7 @@ @@ -58,7 +59,7 @@ Къастам Йекъа Йекъа - Нисйе кхузахь + Кхузахь нисйан Нисбе йаззам ТӀаьххьара карлайаккхар: %s Дийцарийн агӀоне хьажа diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index c625f14c137..4379c8afb47 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -303,6 +303,8 @@ הוספתי קישורים אחר איך עוד שיפרת את הדף + נוסף תיאור קצר + עודכן תיאור קצר התנגשות עריכה הדף כבר שונה על־ידי משתמש אחר, וזה מתנגש עם העריכה שלך. נא להעתיק את העריכות שלך, לחזור, לרענן את הדף, ולנסות לערוך שוב. הודעות לעורכים diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ccce65ca063..08936057044 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -329,6 +329,8 @@ リンクを追加 その他 ページのその他の改善 + 短い説明を追加 + 短い説明を更新 編集の競合 ページが他の利用者によって既に変更されており、あなたの編集と競合しています。編集中のテキストをコピーして、戻ってページを読み込み直した上で、再度編集してください。 編集の通知 @@ -1591,6 +1593,7 @@ フィードバック 送信 フィードバックが送信されました。 + 自動翻訳 編集 承認 却下 diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index d6afd1594a8..2c4eeffa50f 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -829,7 +829,7 @@ 1 Kontributioun %d Kontributiounen - Proposéiert Ännerungen + Ännerungsvirschléi Artikelbeschreiwungen derbäisetzen Artikelbeschreiwungen derbäisetzen (%s) Fir unzefänken @@ -866,7 +866,7 @@ Genügend Schwaach Schlecht - Proposéiert Ännerungen + Ännerungsvirschléi Kontributioun Kontributiounen @@ -884,7 +884,7 @@ Lescht Ännerung Ni Nei - Proposéiert Ännerungen + Ännerungsvirschléi Merci fir Är Ännerungen op Wikipedia! Firwat net einfach do weidermaachen, wou Dir opgehalen hutt? Hutt Dir eng Minutt Zäit fir d\'Wikipedia weider ze verbesseren? Kuckt Iech dës Virschléi, fir Ännerungen ze maachen, un. Kontributioune vum %s diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index d7824fccf1e..c5b7b4c4bf3 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -15,6 +15,7 @@ * Macofe * MuratTheTurkish * SHaran (WMF) +* Stress 043 * Tofeiku --> @@ -119,6 +120,7 @@ Tersedia dalam %d bahasa lain Dengan menerbitkan, anda menyetujui <a href=\"%1$s\">Syarat-Syarat Penggunaan</a> serta melepaskan kesemua sumbangan anda tanpa tertarik balik dengan lesen <a href=\"%2$s\">CC BY-SA 4.0</a>. Dengan menerbitkan, anda menyetujui <a href=\"%1$s\">Syarat-Syarat Penggunaan</a> serta melepaskan kesemua sumbangan anda tanpa tertarik balik dengan lesen <a href=\"%2$s\">CC BY-SA 4.0</a>. Suntingan akan diatribusikan kepada alamat IP peranti anda. Jika anda <a href=\"https://#login\">log masuk</a>, maka privasi anda bertambah baik. + Suntingan akan dihubungkan kepada alamat IP peranti anda. Jika anda <a href=\"https://#login\">log masuk</a>, anda akan mendapat lebih privasi. Bahasa Wikipedia Cari Laman ini tidak terdapat dalam bahasa lain @@ -127,6 +129,7 @@ Bahasa Wikipedia anda Terbit perubahan Suntingan diterbitkan! + Suntingan diterbitkan! Perubahan mungkin mengambil masa untuk disiarkan. Suntingan gagal disimpan! Cuba lagi Batalkan @@ -169,6 +172,9 @@ Anda telah dilog keluar dari Wikipedia. Adakah anda ingin log masuk semula? Log masuk Batalkan + Lenyapkan akaun + Amaran pelenyapan akaun + Pelenyapan ialah <b>pilihan terakhir</b> dan sepatutnya <b>hanya digunakan jika anda tidak lagi meneruskan penyuntingan buat selamanya</b> dan juga menyembunyikan seberapa banyak sumbangan anda yang lalu.<br/><br/>Penghapusan akaun di Wikipedia dilakukan dengan menukar nama akaun anda supaya pengguna lain tidak dapat mengenalpasti sumbangan anda menerusi proses dipanggil pelenyapan akaun.<b>Pelenyapan tidak menjamin kerahsiaan atau menghilangkan sumbangan kepada projek.</b> Tiada rencana baru dilihat Menjejaki apa yang anda telah membaca di sini. Beberapa rencana dalam sejarah mungkin tidak boleh dilihat semasa di luar talian. diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 68d079df4f1..a960b093acb 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -46,7 +46,7 @@ ਖੋਜ ਸ਼ਬਦ ਨੂੰ ਸਿੱਧਾ ਟਾਈਪ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਆਈਕਾਨ ਨੂੰ ਦੁਬਾਰਾ ਦਬਾਓ। ਅਤੀਤ ਤਸਵੀਰ: %s - ਪੰਨਾ: %s + ਸਫ਼ਾ: %s ਵਿਕੀਮੀਡੀਆ ਕਾਮਨਜ਼ ਵਿਕੀਡਾਟਾ ਅਤੀਤ ਸਾਫ਼ ਕਰੋ @@ -87,7 +87,7 @@ ਸੋਧ ਅਤੀਤ ਨਿਗਰਾਨੀ-ਸੂਚੀ ’ਚੋਂ ਹਟਾਓ ਨਿਗਰਾਨੀ ਰੱਖੀ ਗਈ - ਪੰਨੇ \'ਚ ਲੱਭੋ + ਸਫ਼ੇ ਵਿੱਚ ਲੱਭੋ ਅੱਖਰ ਅਤੇ ਵਿਸ਼ਾ-ਵਸਤੂ ਪੜ੍ਹਨ ਵਾਲੀ ਸੂਚੀ \'ਚ ਜੋੜੋ ਸੰਭਾਲੋ @@ -110,7 +110,7 @@ ਇੱਥੋਂ ਸੋਧੋ ਲੇਖ ਸੋਧੋ ਆਖ਼ਰੀ ਉੱਨਤੀਕਰਨ %s - ਗੱਲ-ਬਾਤ ਵਾਲਾ ਪੰਨਾ ਦਿਖਾਓ + ਗੱਲਬਾਤ ਸਫ਼ਾ ਵੇਖੋ ਸੋਧ ਇਤਿਹਾਸ ਦਿਖਾਓ ਨਕਸ਼ੇ ਤੇ ਵੇਖੋ ਹੋਰ ਭਾਸ਼ਾ ਵਿੱਚ ਪੜ੍ਹੋ @@ -119,7 +119,7 @@ ਇਹਨੂੰ ਸਾਂਭ ਕੇ ਤੁਸੀਂ <a href=\"%1$s\">ਵਰਤੋਂ ਦੀਆਂ ਸ਼ਰਤਾਂ</a> ਨੂੰ ਅਤੇ <a href=\"%2$s\">CC BY-SA 4.0</a> ਲਸੰਸ ਹੇਠ ਆਪਣੇ ਯੋਗਦਾਨਾਂ ਨੂੰ ਸਦਾ ਵਾਸਤੇ ਦੇਣ ਨੂੰ ਮੰਨਦੇ ਹੋ। ਸੋਧਾਂ ਦਾ ਨਾਂ ਤੁਹਾਡੇ ਜੰਤਰ ਦੇ ਆਈ.ਪੀ ਪਤੇ \'ਤੇ ਲਾਇਆ ਜਾ ਜਾਵੇਗਾ। ਜੇਕਰ ਤੁਸੀਂ <a href=\"https://#login\">ਦਾਖ਼ਲ ਹੁੰਦੇ</a> ਹੋ ਤਾਂ ਤੁਹਾਡੇ ਕੋਲ਼ ਵਧੇਰੇ ਪਰਦੇਦਾਰੀ ਹੋਵੇਗੀ। ਵਿਕੀਪੀਡੀਆ ਭਾਸ਼ਾਵਾਂ ਖੋਜੋ - ਇਹ ਪੰਨਾ ਹੋਰਨਾਂ ਬੋਲੀਆਂ ਵਿੱਚ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ। + ਇਹ ਸਫ਼ਾ ਹੋਰਨਾ ਬੋਲੀਆਂ ਵਿੱਚ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ। ਕੋਈ ਭਾਸ਼ਾਵਾਂ ਨਹੀਂ ਮਿਲੀਆਂ ਹੋਰ ਬੋਲੀਆਂ ਤੁਹਾਡੀਆਂ ਵਿਕੀਪੀਡੀਆ ਭਾਸ਼ਾਵਾਂ @@ -160,7 +160,7 @@ ਬਾਹਰ ਆਉ ਬਾਹਰ ਆਏ ਰੱਦ ਕਰੋ - ਬਾਹਰ ਨਿਕਲੇ + ਬਾਹਰ ਆ ਗਏ ਤੁਸੀਂ ਵਿਕੀਪੀਡੀਆ \'ਚੋਂ ਬਾਹਰ ਨਿਕਲ ਚੁੱਕੇ ਹੋ। ਕੀ ਤੁਸੀਂ ਦੁਬਾਰਾ ਦਾਖਲ ਹੋਣਾ ਚਾਹੋਗੇ? ਦਾਖਲ ਹੋਵੋ ਰੱਦ ਕਰੋ @@ -278,8 +278,8 @@ ਵਿਸ਼ੇਸ਼ ਤੱਥ ਹੋਰ ਜਾਣਕਾਰੀ ਬੰਦ ਕਰੋ - ਵਿਕੀਪੀਡੀਆ ਦਾ ਚੋਣਵਾਂ ਪੰਨਾ - ਅੱਜ ਦਾ ਚੋਣਵਾਂ ਪੰਨਾ: + ਵਿਕੀਪੀਡੀਆ ਦਾ ਚੋਣਵਾਂ ਸਫ਼ਾ + ਅੱਜ ਦਾ ਚੋਣਵਾਂ ਸਫ਼ਾ: ਵਿਕੀਪੀਡੀਆ ਖੋਜ ਵਿਕੀਪੀਡੀਆ ਖੋਜਣ ਦਾ ਸਭ ਤੋਂ ਤੇਜ਼ ਤਰੀਕਾ ਵਿਕੀਪੀਡੀਆ ਵੱਲੋਂ ਪੇਸ਼ ਕੀਤੇ ਜਾਣ ਵਾਲੇ ਸਭ ਤੋਂ ਵਧੀਆ ਲੇਖ @@ -337,7 +337,7 @@ ਮੁਆਫ ਕਰਨਾ, ਆਵਾਜ਼ ਪਛਾਣ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਚਾਲੂ ਕਰੋ ਖ਼ਾਰਜ ਕਰੋ - ਇਹ ਪੰਨਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ। + ਇਹ ਸਫ਼ਾ ਹਾਲੇ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ਇੰਟਰਨੈਟ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੋ ਸਕਦੇ ਹਵਾਲੇ %s ਨਵਾਂ ਟੈਬ @@ -385,7 +385,7 @@ ਹੋਰ ਪੜ੍ਹੋ ਕੋਈ ਹੋਰ ਬੇਤਰਤੀਬ ਲੇਖ ਲੋਡ ਕਰੋ ਵਿਕੀਪੀਡੀਆ \'ਤੇ ਅੱਜ - ਮੁੱਖ ਸਫ਼ਾ ਦੇਖੋ + ਮੁੱਢਲਾ ਸਫ਼ਾ ਵੇਖੋ ਦਿਨ ਦੀ ਤਸਵੀਰ ਡਾਊਨਲੋਡ ਇਸ ਕਾਰਡ ਨੂੰ ਓਹਲੇ ਕਰੋ diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d4401138e6e..94db1bf6dd4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -351,6 +351,8 @@ Добавлены ссылки Другое Другие способы, которыми вы улучшили страницу + Добавлено краткое описание + Обновлено краткое описание Конфликт редактирования Возник конфликт редактирования, так как страница уже была изменена другим участником. Скопируйте свои изменения, вернитесь и обновите страницу, а затем повторите попытку редактирования. Уведомления о правках @@ -711,6 +713,7 @@ Выберите файл для импорта Не удалось импортировать списки чтения Выберите списки для экспорта + Списк(и) для чтения экспортирован(ы). Сохранить Сохранить список Заголовок @@ -989,6 +992,7 @@ Описать статьи Описание изображений Тегирование изображений + Редактировать патруль Проверить Предпросмотр описания Добавить описание @@ -1598,10 +1602,13 @@ Заголовок не может быть пустым. Ваши сообщения Примеры сообщений + Найти и отфильтровать правки Теги: %s + Нет Смотреть страницу участника Смотреть страницу обсуждения Информация об участнике + Просмотреть вклад участника Благодарность Информация об участнике Закрыть diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 5a311f065fc..977da571e53 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -28,7 +28,7 @@ Назад Назад Напред - Претражи Википедију + Претрага Претрага гласом Претражи језике Филтрирај моје листе @@ -254,7 +254,7 @@ Сарадници <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Страница тима</a> Преводиоци - Апликацију су превели добровољци на сајту <a href=\"https://translatewiki.net\">translatewiki.net</a>. + Апликацију су превели волонтери <a href=\"https://translatewiki.net\">Транслејтвикија</a>. Лиценца Изворни кôд је доступан на <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub-у</a> под лиценцом <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Садржај је доступан под лиценцом <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Ауторство—Делити под истим условима</a>, осим ако није другачије наведено. Производ <a href=\"https://wikimediafoundation.org/\">Задужбине Викимедија</a> @@ -273,7 +273,8 @@ Понови Врати Упозори - Оштећено %s + Штетно %s + Намера %s %s бајт %s бајтова @@ -328,7 +329,7 @@ Додирните да бисте преузели Затвори Приказуј слике - Омогућите или онемогућите учитавање слика на страницама. Уклоните ознаку са овог подешавања ако је ваша веза са интернетом спора или вам је ограничена тарифа за пренос података. + Омогућите или онемогућите учитавање слика на страницама. Искључите ову опцију ако Вам је интернет веза спора или Вам је ограничена количина података за пренос. Преузимај само преко Wi-Fi-а Потврдити преузимање са мобилним подацима? У подешавањима сте омогућили опцију „Преузимај само преко Wi-Fi-а”. Желите ли да дозволите преузимање са мобилним подацима само у овом случају? @@ -974,9 +975,9 @@ Опишите слику да бисте помогли читаоцима да разумеју њено значење и контекст. Опишите чланак да бисте помогли читаоцима да на први поглед разумеју тему. Укупан број доприноса до сада. - Колико дана заредом сте доприносили. Уколико нисте доприносили неко време, приказује се последњи датум вашег доприноса. + Колико дана заредом сте доприносили. Уколико нисте доприносили неко време, приказује се датум Вашег последњег доприноса. Укупни прегледи страница ставки којима сте допринели у последњих 30 дана. - Базирано на томе колико пута су ваше измене враћене (поништене од стране другог уредника/це). Враћено измена: %d + Базирано на томе колико пута су Ваше измене враћене (поништене од стране другог уредника/це). Враћено измена: %d Предложене измене су паузиране до %1$s. Извините %2$s, неки од ваших скорашњих доприноса су били враћени. Предложене измене су онемогућене. Извините %s, велики број ваших скорашњих доприноса је враћен. Изгледа да је Ваша IP адреса (или опсег адреса) тренутно блокиран на Википедији. @@ -1004,7 +1005,7 @@ %d дани Шта су „Предложене измене”? - Предложене измене приказују прилике за мале али значајне доприносе Википедији. + Предложене измене дају прилику за мале али значајне доприносе Википедији. Детаљније Паузирано Онемогућено @@ -1115,11 +1116,11 @@ Започните Можда касније Нови начини за истраживање - Завирите у непознати свет Википедије помоћу фида „Истражи“ који се непрекидно ажурира.<br/> <b>Прилагодите</b> фид својим интересима – упознајте историјске догађаје који су се одиграли <b>на данашњи дан</b> или искушајте срећу са <b>случајним чланком</b>. - Листе за читање са синхронизацијом + Завирите у непознати свет Википедије помоћу фида „Истражи“ који се непрекидно ажурира.<br/> <b>Прилагодите</b> фид својим интересовањима – упознајте историјске догађаје који су се одиграли <b>на данашњи дан</b> или искушајте срећу са <b>случајним чланком</b>. + Спискови за читање са синхронизацијом Можете да правите листе за читање од чланака које желите да читате касније, чак и када сте офлајн. <br/>Пријавите се на свој налог на Википедији да бисте синхронизовали листе за читање. <a href=\"#login\">Придружите се Википедији</a>. - Подаци & приватност - Ми верујемо да не морате одавати личне информације да би учествовали у покрету за слободно знање. Подаци о употреби ове апликације се прикупљају анонимно. Сазнајте више о нашој <a href=\"#privacy\">политици приватности</a> и <a href=\"#termsOfUse\">условима коришћења</a>. + Подаци и приватност + Ми верујемо да не морате одавати личне податке да би учествовали у покрету за слободно знање. Подаци о употреби ове апликације се прикупљају анонимно. Сазнајте више о нашој <a href=\"#privacy\">политици приватности</a> и <a href=\"#termsOfUse\">условима коришћења</a>. Шаљи податке о употреби Разумем Пронашли смо следеће на вашем уређају: @@ -1208,7 +1209,7 @@ Лево Средина Ништа - Врста слике + Поставка слике Минијатура Без оквира Оквир @@ -1328,9 +1329,9 @@ Захвали се Откажи Ваше хвала је послато %s 👍 - Прикажи страницу уредника - Прикажи страницу за разговор - Прикажи доприносе + Страница корисника + Страницу за разговор + Доприноси Упореди измене Упоређивање измена: %s Од: @@ -1380,12 +1381,12 @@ Активност списка надгледања Непогледане измене Погледане измене - Предвиђање квалитета доприноса + Процена квалитета доприноса Врло вероватно добро Проблематично Проблематично Врло вероватно има проблеме - Предвиђање намера корисника + Процена намера корисника Врло вероватно добронамерно Можда злонамерно Вероватно злонамерно @@ -1460,7 +1461,7 @@ Здраво! Желим да поделим моју листу за читање на Википедији са вама: Да ли можете да нам помогнете у унапређивању \"дељења листи за читање\"? \"Дељење листи за читање\" је тестна могућност и потребне су вам ваше повратне информације да би смо је унапредили или уклонили. - Немате сачуване поруке упозорења. + Напишите своју поруку или користите <a href=\"#\">примере порука</a> да почнете. Нова порука Тема Напиши поруку @@ -1524,24 +1525,24 @@ Значај Мање измене Нису мање измене - Предвиђање квалитета доприноса + Процена квалитета доприноса Врло вероватно добро - Веома прецизно проналази готово све непроблематичне измене. + Веома прецизно, проналази готово све добрр измене. Можда има проблеме Проналази већину мањкавих или штетних измена, али с мањом прецизношћу. Проблематично - Са средњом прецизношћу проналази средњи удео проблематичних измена. + Средња прецизност, проналази средњи удео проблематичних измена. Врло вероватно има проблеме - Високопрецизно проналази већину очигледно мањкавих или штетних измена. - Предвиђање намера корисника + Веома прецизно, проналази већину очигледно мањкавих или штетних измена. + Процена намера корисника Врло вероватно добра намера - Високопрецизно проналази готово све добронамерне измене. + Веома прецизно, проналази готово све добронамерне измене. Можда злонамерно Проналази већину злонамерних измена, али са мањом прецизношћу. Вероватно злонамерно - Са средњом прецизношћу проналази средњи удео проблематичних измена. + Средња прецизност, проналази средњи удео проблематичних измена. Врло вероватно злонамерно - Високопрецизно проналази већину очигледно злонамерних измена. + Веома прецизно, проналази већину очигледно злонамерних измена. Уклоните %s да видите више измена %d филтер @@ -1556,14 +1557,17 @@ Сазнајте више Допринесите надзору или одобравању измена на Википедији. Побољшајте квалитет садржаја Википедије активним прегледом фида скорашњих измена и пружањем смерница, контролом квалитета и охрабривањем других уредника/ца. - Предлажите повратне информације, пратите измене, и преузимајте акције на екрану за разлику + Предлажите повратне информације, пратите измене, и предузимајте радње на екрану за разлике Хвала Видите продуктивну измену? Захвалите се кориснику за његов допринос. Надгледај - Да ли желите да пратите измене чланка? Додајте га на свој списак надгледања. Погледајте га под \'Више\'. + Пратите измене чланка. Додајте га на свој списак надгледања. Погледајте га под \'Више\'. Разговор + Комуницирајте са другим уредницима. Сачувајте често употребљаване поруке или користите шаблон. Поништи/врати Одаберите \'Поништи\' да би сте поништили или вратили потенционалну деструктивну измену. + Процена штетности измене. + Процена добронамерности измене. Помозите нам да унапредимо ову могућност Да ли сте задовољни са овом могућношћу? Задовољавајуће @@ -1574,10 +1578,14 @@ Повратне информације Пошаљи Повратне информације послате. + Немојте вандализовати Неутрална тачка гледишта Аутоматски превод Последње упозорење + Кршење ауторских права Наведите опис измене + Не цензуришите + Користите примере порука испод да прилагодите, шаљете и сачувате у својим порукама. Уреди Прихватам Одбаци diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index f8b9d1f3951..bba446dec69 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -13,6 +13,7 @@ * Diskdance * Ff98sha * GoForceX +* Googology * Grace03 * GuoPC * Hehua @@ -341,6 +342,7 @@ 添加链接 其他 您改善该页面的其他方式 + 添加了简短描述 编辑冲突 页面已被不同的用户修改过,并且与您的编辑冲突。请复制您的编辑,返回并刷新页面,然后重试编辑。 编辑提示 From 30887947e2b6427279e689832f87ce8af4a269d8 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 3 Jun 2024 09:19:38 -0700 Subject: [PATCH 161/626] Refactoring GalleryActivity to use Coroutine and ViewModel (#4638) * Use coroutine in LeadImagesHandler * Simplified if statement * Refactoring GalleryActivity to use Coroutine and ViewModel * Use coroutine and viewModel in GalleryItem * Use the correct pageTitle * Some clean ups * Fix merge conflict * Add suspend --------- Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/dataclient/Service.kt | 13 +- .../SuggestedEditsCardItemFragment.kt | 2 +- .../org/wikipedia/gallery/GalleryActivity.kt | 343 ++++++++---------- .../wikipedia/gallery/GalleryItemFragment.kt | 136 +++---- .../wikipedia/gallery/GalleryItemViewModel.kt | 57 +++ .../org/wikipedia/gallery/GalleryViewModel.kt | 72 ++++ .../java/org/wikipedia/page/PageActivity.kt | 10 +- .../java/org/wikipedia/page/PageFragment.kt | 4 +- .../page/leadimages/LeadImagesHandler.kt | 2 +- .../page/linkpreview/LinkPreviewDialog.kt | 2 +- 10 files changed, 343 insertions(+), 298 deletions(-) create mode 100644 app/src/main/java/org/wikipedia/gallery/GalleryItemViewModel.kt create mode 100644 app/src/main/java/org/wikipedia/gallery/GalleryViewModel.kt diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index 03cc2769a8b..8b472ff6768 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -138,10 +138,10 @@ interface Service { ): MwQueryResponse @GET(MW_API_PREFIX + "action=query&prop=videoinfo&viprop=timestamp|user|url|mime|extmetadata|derivatives&viurlwidth=" + PREFERRED_THUMB_SIZE) - fun getVideoInfo( + suspend fun getVideoInfo( @Query("titles") titles: String, @Query("viextmetadatalanguage") lang: String - ): Observable + ): MwQueryResponse @GET(MW_API_PREFIX + "action=query&prop=imageinfo|entityterms&iiprop=timestamp|user|url|mime|extmetadata&iiurlwidth=" + PREFERRED_THUMB_SIZE) suspend fun getImageInfoWithEntityTerms( @@ -150,9 +150,6 @@ interface Service { @Query("wbetlanguage") entityLang: String ): MwQueryResponse - @GET(MW_API_PREFIX + "action=query&meta=userinfo&prop=info&inprop=protection&uiprop=groups") - fun getProtectionInfo(@Query("titles") titles: String): Observable - @GET(MW_API_PREFIX + "action=query&meta=userinfo&prop=info&inprop=protection&uiprop=groups") suspend fun getProtectionInfoSuspend(@Query("titles") titles: String): MwQueryResponse @@ -475,12 +472,6 @@ interface Service { // ------- Wikidata ------- - @GET(MW_API_PREFIX + "action=wbgetentities") - fun getEntitiesByTitle( - @Query("titles") titles: String, - @Query("sites") sites: String - ): Observable - @GET(MW_API_PREFIX + "action=wbgetentities") suspend fun getEntitiesByTitleSuspend( @Query("titles") titles: String, diff --git a/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemFragment.kt b/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemFragment.kt index 10955b7bd08..22c625f49b8 100644 --- a/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemFragment.kt @@ -70,7 +70,7 @@ class SuggestedEditsCardItemFragment : Fragment() { } val pageTitle = previousSourceSummaryForEdit!!.pageTitle if (cardActionType === ADD_CAPTION || cardActionType === TRANSLATE_CAPTION) { - startActivity(GalleryActivity.newIntent(requireActivity(), pageTitle, pageTitle.prefixedText, pageTitle.wikiSite, 0, GalleryActivity.SOURCE_NON_LEAD_IMAGE)) + startActivity(GalleryActivity.newIntent(requireActivity(), pageTitle, pageTitle.prefixedText, pageTitle.wikiSite, 0)) } else { startActivity(PageActivity.newIntentForNewTab(requireContext(), HistoryEntry(pageTitle, HistoryEntry.SOURCE_SUGGESTED_EDITS), pageTitle)) } diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt index ff9cf257442..549d1496dbe 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt @@ -1,28 +1,26 @@ package org.wikipedia.gallery -import android.app.Activity import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.Color import android.net.Uri import android.os.Bundle -import android.util.Pair import android.view.Gravity import android.view.View import android.widget.FrameLayout import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.dialog.MaterialAlertDialogBuilder -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.disposables.Disposable -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.Constants.ImageEditType import org.wikipedia.Constants.InvokeSource @@ -32,13 +30,11 @@ import org.wikipedia.activity.BaseActivity import org.wikipedia.auth.AccountUtil import org.wikipedia.bridge.JavaScriptActionHandler import org.wikipedia.commons.FilePageActivity -import org.wikipedia.commons.ImageTagsProvider import org.wikipedia.databinding.ActivityGalleryBinding import org.wikipedia.dataclient.Service -import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite +import org.wikipedia.dataclient.wikidata.Entities import org.wikipedia.descriptions.DescriptionEditActivity -import org.wikipedia.extensions.parcelableExtra import org.wikipedia.history.HistoryEntry import org.wikipedia.page.ExclusiveBottomSheetPresenter import org.wikipedia.page.LinkMovementMethodExt @@ -55,6 +51,7 @@ import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.GradientUtil import org.wikipedia.util.ImageUrlUtil +import org.wikipedia.util.Resource import org.wikipedia.util.ResourceUtil import org.wikipedia.util.ShareUtil import org.wikipedia.util.StringUtil @@ -68,34 +65,23 @@ import java.io.File class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, GalleryItemFragment.Callback { private lateinit var binding: ActivityGalleryBinding - private lateinit var sourceWiki: WikiSite private lateinit var galleryAdapter: GalleryItemAdapter + private val viewModel: GalleryViewModel by viewModels { GalleryViewModel.Factory(intent.extras!!) } private var pageChangeListener = GalleryPageChangeListener() - private var pageTitle: PageTitle? = null private var imageEditType: ImageEditType? = null - private val disposables = CompositeDisposable() - private var imageCaptionDisposable: Disposable? = null - private var revision = 0L private var controlsShowing = true - /** - * If we have an intent that tells us a specific image to jump to within the gallery, - * then this will be non-null. - */ - private var initialFilename: String? = null - /** - * If we come back from savedInstanceState, then this will be the previous pager position. - */ private var initialImageIndex = -1 private var targetLanguageCode: String? = null - private val app = WikipediaApp.instance + private val downloadReceiver = MediaDownloadReceiver() private val downloadReceiverCallback = MediaDownloadReceiverCallback() + private val currentItem get() = galleryAdapter.getFragmentAt(binding.pager.currentItem) as GalleryItemFragment? private val requestAddCaptionLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == RESULT_OK) { val action = it.data?.getSerializableExtra(Constants.INTENT_EXTRA_ACTION) as DescriptionEditActivity.Action? SuggestedEditsSnackbars.show(this, action, true, targetLanguageCode, false) - layOutGalleryDescription(currentItem) + fetchGalleryDescription(currentItem) setResult(ACTIVITY_RESULT_IMAGE_CAPTION_ADDED) } } @@ -104,13 +90,11 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall if (it.resultCode == RESULT_OK) { val action = DescriptionEditActivity.Action.ADD_IMAGE_TAGS SuggestedEditsSnackbars.show(this, action, true, targetLanguageCode, true) { - currentItem?.let { fragment -> - fragment.imageTitle?.let { pageTitle -> - startActivity(FilePageActivity.newIntent(this@GalleryActivity, pageTitle)) - } + currentItem?.let { + startActivity(FilePageActivity.newIntent(this@GalleryActivity, it.imageTitle)) } } - layOutGalleryDescription(currentItem) + fetchGalleryDescription(currentItem) setResult(ACTIVITY_RESULT_IMAGE_TAGS_ADDED) } } @@ -120,8 +104,8 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall binding = ActivityGalleryBinding.inflate(layoutInflater) setContentView(binding.root) setSupportActionBar(binding.toolbar) - supportActionBar!!.setDisplayHomeAsUpEnabled(true) - supportActionBar!!.title = "" + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.title = "" setNavigationBarColor(Color.BLACK) binding.toolbarGradient.background = GradientUtil.getPowerGradient(ResourceUtil.getThemedColor(this, R.attr.overlay_color), Gravity.TOP) binding.infoGradient.background = GradientUtil.getPowerGradient(ResourceUtil.getThemedColor(this, R.attr.overlay_color), Gravity.BOTTOM) @@ -132,14 +116,8 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall binding.errorView.backClickListener = View.OnClickListener { onBackPressed() } binding.errorView.retryClickListener = View.OnClickListener { binding.errorView.visibility = View.GONE - loadGalleryContent() - } - if (intent.hasExtra(Constants.ARG_TITLE)) { - pageTitle = intent.parcelableExtra(Constants.ARG_TITLE) + viewModel.fetchGalleryItems() } - initialFilename = intent.getStringExtra(EXTRA_FILENAME) - revision = intent.getLongExtra(EXTRA_REVISION, 0) - sourceWiki = intent.parcelableExtra(Constants.ARG_WIKISITE)!! galleryAdapter = GalleryItemAdapter(this@GalleryActivity) binding.pager.adapter = galleryAdapter binding.pager.registerOnPageChangeCallback(pageChangeListener) @@ -149,12 +127,11 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall initialImageIndex = savedInstanceState.getInt(KEY_PAGER_INDEX) // if we have a savedInstanceState, then the initial index overrides // the initial Title from our intent. - initialFilename = null - val fm = supportFragmentManager + viewModel.initialFilename = null if (supportFragmentManager.backStackEntryCount > 0) { val ft = supportFragmentManager.beginTransaction() - for (i in 0 until fm.backStackEntryCount) { - val fragment = fm.findFragmentById(fm.getBackStackEntryAt(i).id) + for (i in 0 until supportFragmentManager.backStackEntryCount) { + val fragment = supportFragmentManager.findFragmentById(supportFragmentManager.getBackStackEntryAt(i).id) if (fragment is GalleryItemFragment) { ft.remove(fragment) } @@ -182,22 +159,44 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall if (isDestroyed) { return@postDelayed } - loadGalleryContent() + viewModel.fetchGalleryItems() }, transitionMillis.toLong()) } else { TRANSITION_INFO = null binding.transitionReceiver.visibility = View.GONE - loadGalleryContent() + viewModel.fetchGalleryItems() } binding.captionEditButton.setOnClickListener { onEditClick(it) } binding.ctaButton.setOnClickListener { onTranslateClick() } binding.licenseContainer.setOnClickListener { onLicenseClick() } binding.licenseContainer.setOnLongClickListener { onLicenseLongClick() } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + launch { + viewModel.uiState.collect { + when (it) { + is Resource.Loading -> onLoading() + is Resource.Success -> onGallerySuccess(it.data.getItems("image", "video")) + is Resource.Error -> onError(it.throwable) + } + } + } + + launch { + viewModel.descriptionState.collect { + when (it) { + is Resource.Loading -> onLoading() + is Resource.Success -> onDescriptionSuccess(it.data.first, it.data.second) + is Resource.Error -> onDescriptionError(it.throwable) + } + } + } + } + } } public override fun onDestroy() { - disposables.clear() - disposeImageCaptionDisposable() binding.pager.unregisterOnPageChangeCallback(pageChangeListener) TRANSITION_INFO = null super.onDestroy() @@ -214,26 +213,28 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall } override fun onDownload(item: GalleryItemFragment) { - if (item.imageTitle != null && item.mediaInfo != null) { - downloadReceiver.download(this, item.imageTitle!!, item.mediaInfo!!) + item.mediaInfo?.let { + downloadReceiver.download(this, item.imageTitle, it) FeedbackUtil.showMessage(this, R.string.gallery_save_progress) - } else { + } ?: run { FeedbackUtil.showMessage(this, R.string.err_cannot_save_file) } } override fun onShare(item: GalleryItemFragment, bitmap: Bitmap?, subject: String, title: PageTitle) { - if (bitmap != null && item.mediaInfo != null) { - ShareUtil.shareImage(lifecycleScope, this, bitmap, - File(ImageUrlUtil.getUrlForPreferredSize(item.mediaInfo!!.thumbUrl, Constants.PREFERRED_GALLERY_IMAGE_SIZE)).name, - subject, title.uri) + if (bitmap != null) { + item.mediaInfo?.let { + ShareUtil.shareImage(lifecycleScope, this, bitmap, + File(ImageUrlUtil.getUrlForPreferredSize(it.thumbUrl, Constants.PREFERRED_GALLERY_IMAGE_SIZE)).name, subject, title.uri) + } } else { ShareUtil.shareText(this, title) } } override fun onError(throwable: Throwable) { - showError(throwable) + binding.errorView.setError(throwable) + binding.errorView.visibility = View.VISIBLE } override fun setTheme() { @@ -245,7 +246,8 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall if (item?.imageTitle == null || item.mediaInfo?.metadata == null) { return } - val isProtected = v.tag != null && v.tag as Boolean + + val isProtected = v.tag as Boolean if (isProtected) { MaterialAlertDialogBuilder(this) .setCancelable(false) @@ -259,19 +261,20 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall } private fun startCaptionEdit(item: GalleryItemFragment) { - val title = PageTitle(item.imageTitle!!.prefixedText, - WikiSite(Service.COMMONS_URL, sourceWiki.languageCode)) - val currentCaption = item.mediaInfo!!.captions[sourceWiki.languageCode] - title.description = currentCaption - val summary = PageSummaryForEdit(title.prefixedText, sourceWiki.languageCode, title, - title.displayText, RichTextUtil.stripHtml(item.mediaInfo!!.metadata!!.imageDescription()), item.mediaInfo!!.thumbUrl) - requestAddCaptionLauncher.launch(DescriptionEditActivity.newIntent(this, title, null, summary, null, - DescriptionEditActivity.Action.ADD_CAPTION, InvokeSource.GALLERY_ACTIVITY)) + item.mediaInfo?.let { + val title = PageTitle(item.imageTitle.prefixedText, + WikiSite(Service.COMMONS_URL, viewModel.wikiSite.languageCode)) + title.description = it.captions[viewModel.wikiSite.languageCode] + val summary = PageSummaryForEdit(title.prefixedText, viewModel.wikiSite.languageCode, title, + title.displayText, RichTextUtil.stripHtml(it.metadata?.imageDescription()), it.thumbUrl) + requestAddCaptionLauncher.launch(DescriptionEditActivity.newIntent(this, title, null, summary, null, + DescriptionEditActivity.Action.ADD_CAPTION, InvokeSource.GALLERY_ACTIVITY)) + } } private fun onTranslateClick() { val item = currentItem - if (item?.imageTitle == null || item.mediaInfo?.metadata == null || imageEditType == null) { + if (item?.mediaInfo?.metadata == null || imageEditType == null) { return } when (imageEditType) { @@ -282,32 +285,33 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall } private fun startTagsEdit(item: GalleryItemFragment) { - requestAddImageTagsLauncher.launch(SuggestedEditsImageTagEditActivity.newIntent(this, item.mediaPage!!, - InvokeSource.GALLERY_ACTIVITY)) + item.mediaPage?.let { + requestAddImageTagsLauncher.launch(SuggestedEditsImageTagEditActivity.newIntent(this, it, InvokeSource.GALLERY_ACTIVITY)) + } } private fun startCaptionTranslation(item: GalleryItemFragment) { - val sourceTitle = PageTitle(item.imageTitle!!.prefixedText, WikiSite(Service.COMMONS_URL, sourceWiki.languageCode)) - val targetTitle = PageTitle(item.imageTitle!!.prefixedText, WikiSite(Service.COMMONS_URL, - targetLanguageCode ?: app.languageState.appLanguageCodes[1])) - val currentCaption = item.mediaInfo!!.captions[sourceWiki.languageCode].orEmpty().ifEmpty { - RichTextUtil.stripHtml(item.mediaInfo!!.metadata!!.imageDescription()) + item.mediaInfo?.let { + val sourceTitle = PageTitle(item.imageTitle.prefixedText, WikiSite(Service.COMMONS_URL, viewModel.wikiSite.languageCode)) + val targetTitle = PageTitle(item.imageTitle.prefixedText, WikiSite(Service.COMMONS_URL, + targetLanguageCode ?: WikipediaApp.instance.languageState.appLanguageCodes[1])) + val currentCaption = it.captions[viewModel.wikiSite.languageCode].orEmpty().ifEmpty { + RichTextUtil.stripHtml(it.metadata?.imageDescription()) + } + val sourceSummary = PageSummaryForEdit(sourceTitle.prefixedText, sourceTitle.wikiSite.languageCode, + sourceTitle, sourceTitle.displayText, currentCaption, it.thumbUrl) + val targetSummary = PageSummaryForEdit(targetTitle.prefixedText, targetTitle.wikiSite.languageCode, + targetTitle, targetTitle.displayText, null, it.thumbUrl) + requestAddCaptionLauncher.launch(DescriptionEditActivity.newIntent(this, targetTitle, null, sourceSummary, + targetSummary, if (sourceSummary.lang == targetSummary.lang) DescriptionEditActivity.Action.ADD_CAPTION + else DescriptionEditActivity.Action.TRANSLATE_CAPTION, InvokeSource.GALLERY_ACTIVITY)) } - val sourceSummary = PageSummaryForEdit(sourceTitle.prefixedText, sourceTitle.wikiSite.languageCode, - sourceTitle, sourceTitle.displayText, currentCaption, item.mediaInfo!!.thumbUrl) - val targetSummary = PageSummaryForEdit(targetTitle.prefixedText, targetTitle.wikiSite.languageCode, - targetTitle, targetTitle.displayText, null, item.mediaInfo!!.thumbUrl) - requestAddCaptionLauncher.launch(DescriptionEditActivity.newIntent(this, targetTitle, null, sourceSummary, - targetSummary, if (sourceSummary.lang == targetSummary.lang) DescriptionEditActivity.Action.ADD_CAPTION - else DescriptionEditActivity.Action.TRANSLATE_CAPTION, InvokeSource.GALLERY_ACTIVITY)) } private fun onLicenseClick() { - if (binding.licenseIcon.contentDescription == null) { - return + binding.licenseIcon.contentDescription?.let { + FeedbackUtil.showMessageAsPlainText(this, it) } - FeedbackUtil.showMessageAsPlainText((binding.licenseIcon.context as Activity), - binding.licenseIcon.contentDescription) } private fun onLicenseLongClick(): Boolean { @@ -319,18 +323,12 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall return true } - private fun disposeImageCaptionDisposable() { - if (imageCaptionDisposable != null && !imageCaptionDisposable!!.isDisposed) { - imageCaptionDisposable!!.dispose() - } - } - private inner class GalleryPageChangeListener : OnPageChangeCallback() { private var currentPosition = -1 override fun onPageSelected(position: Int) { // the pager has settled on a new position currentItem?.let { item -> - layOutGalleryDescription(item) + fetchGalleryDescription(item) } currentPosition = position } @@ -346,11 +344,6 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall outState.putInt(KEY_PAGER_INDEX, binding.pager.currentItem) } - private fun updateProgressBar(visible: Boolean) { - binding.progressBar.isIndeterminate = true - binding.progressBar.visibility = if (visible) View.VISIBLE else View.GONE - } - override fun onBackPressed() { if (TRANSITION_INFO != null) { showTransitionReceiver() @@ -404,28 +397,23 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall LinkPreviewDialog.newInstance(HistoryEntry(title, HistoryEntry.SOURCE_GALLERY))) } - fun setViewPagerEnabled(enabled: Boolean) { - binding.pager.isUserInputEnabled = enabled - } - private val linkMovementMethod = LinkMovementMethodExt { urlStr -> L.v("Link clicked was $urlStr") var url = UriUtil.resolveProtocolRelativeUrl(urlStr) if (url.startsWith("/wiki/")) { - val title = PageTitle.titleForInternalLink(url, app.wikiSite) + val title = PageTitle.titleForInternalLink(url, WikipediaApp.instance.wikiSite) showLinkPreview(title) } else { val uri = Uri.parse(url) val authority = uri.authority - if (authority != null && WikiSite.supportedAuthority(authority) && - uri.path != null && uri.path!!.startsWith("/wiki/")) { + if (authority != null && WikiSite.supportedAuthority(authority) && uri.path?.startsWith("/wiki/") == true) { val title = PageTitle.titleForUri(uri, WikiSite(uri)) showLinkPreview(title) } else { // if it's a /w/ URI, turn it into a full URI and go external if (url.startsWith("/w/")) { - url = String.format("%1\$s://%2\$s", app.wikiSite.scheme(), - app.wikiSite.authority()) + url + url = String.format("%1\$s://%2\$s", WikipediaApp.instance.wikiSite.scheme(), + WikipediaApp.instance.wikiSite.authority()) + url } UriUtil.handleExternalLink(this@GalleryActivity, Uri.parse(url)) } @@ -442,37 +430,16 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall finishWithPageResult(title, entry) } - fun showError(caught: Throwable?) { - binding.errorView.setError(caught) - binding.errorView.visibility = View.VISIBLE - } - - private fun fetchGalleryItems() { - pageTitle?.let { - updateProgressBar(true) - disposables.add(ServiceFactory.getRest(it.wikiSite) - .getMediaList(it.prefixedText, revision) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ mediaList -> - applyGalleryList(mediaList.getItems("image", "video")) - }) { caught -> - updateProgressBar(false) - showError(caught) - }) - } + private fun onLoading() { + binding.progressBar.isVisible = true } - private fun loadGalleryContent() { - updateProgressBar(false) - fetchGalleryItems() - } - - private fun applyGalleryList(mediaListItems: MutableList) { + private fun onGallerySuccess(mediaListItems: MutableList) { + binding.progressBar.isVisible = false // first, verify that the collection contains the item that the user // initially requested, if we have one... var initialImagePos = -1 - initialFilename?.let { + viewModel.initialFilename?.let { for (item in mediaListItems) { // the namespace of a file could be in a different language than English. if (StringUtil.removeNamespace(item.title) == StringUtil.removeNamespace(it)) { @@ -500,42 +467,33 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall } } - private val currentItem get() = galleryAdapter.getFragmentAt(binding.pager.currentItem) as GalleryItemFragment? + private fun onDescriptionSuccess(isProtected: Boolean, entity: Entities.Entity?) { + binding.progressBar.isVisible = false + currentItem?.mediaInfo?.captions = viewModel.getCaptions(entity) + updateGalleryDescription(isProtected, viewModel.getDepicts(entity).size) + } + + private fun onDescriptionError(throwable: Throwable) { + L.e(throwable) + updateGalleryDescription(false, 0) + } - fun layOutGalleryDescription(callingFragment: GalleryItemFragment?) { + fun fetchGalleryDescription(callingFragment: GalleryItemFragment?) { val item = currentItem - if (item != callingFragment) { + if (item != callingFragment || item == null) { return } - if (item?.imageTitle == null || item.mediaInfo?.metadata == null) { + if (item.mediaInfo?.metadata == null) { binding.infoContainer.visibility = View.GONE return } - updateProgressBar(true) - disposeImageCaptionDisposable() - imageCaptionDisposable = - Observable.zip( - ServiceFactory.get(Constants.commonsWikiSite).getEntitiesByTitle(item.imageTitle!!.prefixedText, Constants.COMMONS_DB_NAME), - ServiceFactory.get(Constants.commonsWikiSite).getProtectionInfo(item.imageTitle!!.prefixedText) - ) { entities, protectionInfoRsp -> - val captions = entities.first?.labels?.values?.associate { it.language to it.value }.orEmpty() - item.mediaInfo!!.captions = captions - val depicts = ImageTagsProvider.getDepictsClaims(entities.first?.getStatements().orEmpty()) - Pair(protectionInfoRsp.query?.isEditProtected == true, depicts.size) - }.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - updateGalleryDescription(it.first, it.second) - }, { - L.e(it) - updateGalleryDescription(false, 0) - }) - } - - fun updateGalleryDescription(isProtected: Boolean, tagsCount: Int) { - updateProgressBar(false) + + viewModel.fetchGalleryDescription(item.imageTitle) + } + + private fun updateGalleryDescription(isProtected: Boolean, tagsCount: Int) { val item = currentItem - if (item?.imageTitle == null || item.mediaInfo?.metadata == null) { + if (item?.mediaInfo?.metadata == null) { binding.infoContainer.visibility = View.GONE return } @@ -561,43 +519,43 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall } private fun decideImageEditType(item: GalleryItemFragment, tagsCount: Int) { - imageEditType = null - if (!item.mediaInfo!!.captions.containsKey(sourceWiki.languageCode)) { - imageEditType = ImageEditType.ADD_CAPTION - targetLanguageCode = sourceWiki.languageCode - binding.ctaButtonText.text = getString(R.string.gallery_add_image_caption_button) - return - } - if (tagsCount == 0) { - imageEditType = ImageEditType.ADD_TAGS - binding.ctaButtonText.text = getString(R.string.suggested_edits_feed_card_add_image_tags) - return - } + item.mediaInfo?.let { mediaInfo -> + imageEditType = null + if (!mediaInfo.captions.containsKey(viewModel.wikiSite.languageCode)) { + imageEditType = ImageEditType.ADD_CAPTION + targetLanguageCode = viewModel.wikiSite.languageCode + binding.ctaButtonText.text = getString(R.string.gallery_add_image_caption_button) + return + } + if (tagsCount == 0) { + imageEditType = ImageEditType.ADD_TAGS + binding.ctaButtonText.text = getString(R.string.suggested_edits_feed_card_add_image_tags) + return + } - // and if we have another language in which the caption doesn't exist, then offer - // it to be translatable. - if (app.languageState.appLanguageCodes.size > 1) { - for (lang in app.languageState.appLanguageCodes) { - if (!item.mediaInfo!!.captions.containsKey(lang)) { - targetLanguageCode = lang + // and if we have another language in which the caption doesn't exist, then offer + // it to be translatable. + val languageState = WikipediaApp.instance.languageState + if (languageState.appLanguageCodes.size > 1) { + languageState.appLanguageCodes.firstOrNull { !mediaInfo.captions.containsKey(it) }?.let { + targetLanguageCode = it imageEditType = ImageEditType.ADD_CAPTION_TRANSLATION binding.ctaButtonText.text = getString(R.string.gallery_add_image_caption_in_language_button, - app.languageState.getAppLanguageLocalizedName(targetLanguageCode)) - break + WikipediaApp.instance.languageState.getAppLanguageLocalizedName(targetLanguageCode)) } } + binding.ctaContainer.isVisible = imageEditType != null } - binding.ctaContainer.visibility = if (imageEditType == null) View.GONE else View.VISIBLE } private fun displayApplicableDescription(item: GalleryItemFragment) { // If we have a structured caption in our current language, then display that instead // of the unstructured description, and make it editable. - val descriptionStr = item.mediaInfo?.captions!!.getOrElse(sourceWiki.languageCode) { - StringUtil.fromHtml(item.mediaInfo!!.metadata!!.imageDescription()) + val descriptionStr = item.mediaInfo?.captions?.getOrElse(viewModel.wikiSite.languageCode) { + StringUtil.fromHtml(item.mediaInfo?.metadata?.imageDescription()) } - if (descriptionStr.isNotEmpty()) { + if (!descriptionStr.isNullOrEmpty()) { binding.descriptionContainer.visibility = View.VISIBLE binding.descriptionText.text = StringUtil.strip(descriptionStr) } else { @@ -650,7 +608,7 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall } override fun createFragment(position: Int): Fragment { - return GalleryItemFragment.newInstance(pageTitle, list[position]) + return GalleryItemFragment.newInstance(viewModel.pageTitle, list[position]) } } @@ -663,28 +621,19 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall companion object { private const val KEY_CONTROLS_SHOWING = "controlsShowing" private const val KEY_PAGER_INDEX = "pagerIndex" + private var TRANSITION_INFO: JavaScriptActionHandler.ImageHitInfo? = null const val ACTIVITY_RESULT_PAGE_SELECTED = 1 const val ACTIVITY_RESULT_IMAGE_CAPTION_ADDED = 2 const val ACTIVITY_RESULT_IMAGE_TAGS_ADDED = 3 const val EXTRA_FILENAME = "filename" const val EXTRA_REVISION = "revision" - const val EXTRA_SOURCE = "source" - const val SOURCE_LEAD_IMAGE = 0 - const val SOURCE_NON_LEAD_IMAGE = 1 - const val SOURCE_LINK_PREVIEW = 2 - private var TRANSITION_INFO: JavaScriptActionHandler.ImageHitInfo? = null - fun newIntent(context: Context, pageTitle: PageTitle?, filename: String, wiki: WikiSite, revision: Long, source: Int): Intent { - val intent = Intent() - .setClass(context, GalleryActivity::class.java) - .putExtra(EXTRA_FILENAME, filename) + fun newIntent(context: Context, pageTitle: PageTitle?, filename: String, wiki: WikiSite, revision: Long): Intent { + return Intent(context, GalleryActivity::class.java) .putExtra(Constants.ARG_WIKISITE, wiki) + .putExtra(Constants.ARG_TITLE, pageTitle) + .putExtra(EXTRA_FILENAME, filename) .putExtra(EXTRA_REVISION, revision) - .putExtra(EXTRA_SOURCE, source) - if (pageTitle != null) { - intent.putExtra(Constants.ARG_TITLE, pageTitle) - } - return intent } fun setTransitionInfo(hitInfo: JavaScriptActionHandler.ImageHitInfo) { diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt b/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt index fbfba2688fb..b107f52712e 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt @@ -18,32 +18,28 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.core.os.bundleOf import androidx.core.view.MenuProvider +import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.R -import org.wikipedia.WikipediaApp import org.wikipedia.activity.FragmentUtil import org.wikipedia.commons.FilePageActivity import org.wikipedia.databinding.FragmentGalleryItemBinding -import org.wikipedia.dataclient.ServiceFactory -import org.wikipedia.dataclient.mwapi.MwQueryPage -import org.wikipedia.dataclient.mwapi.MwQueryResponse -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.DeviceUtil import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil -import org.wikipedia.util.FileUtil import org.wikipedia.util.ImageUrlUtil +import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L import org.wikipedia.views.ViewUtil @@ -59,13 +55,13 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener private var _binding: FragmentGalleryItemBinding? = null private val binding get() = _binding!! - private lateinit var mediaListItem: MediaListItem - private val disposables = CompositeDisposable() + private val viewModel: GalleryItemViewModel by viewModels { GalleryItemViewModel.Factory(requireArguments()) } + private var mediaController: MediaController? = null - private var pageTitle: PageTitle? = null - var imageTitle: PageTitle? = null - var mediaPage: MwQueryPage? = null - val mediaInfo get() = mediaPage?.imageInfo() + + val imageTitle get() = viewModel.imageTitle + val mediaPage get() = viewModel.mediaPage + val mediaInfo get() = viewModel.mediaPage?.imageInfo() private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean -> if (isGranted) { @@ -75,14 +71,6 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener } } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - mediaListItem = requireArguments().parcelable(ARG_GALLERY_ITEM)!! - pageTitle = requireArguments().parcelable(Constants.ARG_TITLE) - ?: PageTitle(mediaListItem.title, Constants.commonsWikiSite) - imageTitle = PageTitle("File:${StringUtil.removeNamespace(mediaListItem.title)}", pageTitle!!.wikiSite) - } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = FragmentGalleryItemBinding.inflate(inflater, container, false) requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) @@ -98,12 +86,27 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener binding.imageView.setAllowParentInterceptOnEdge(abs(binding.imageView.scale - 1f) < 0.01f) } } - loadMedia() return binding.root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + viewLifecycleOwner.lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + launch { + viewModel.uiState.collect { + when (it) { + is Resource.Loading -> onLoading(true) + is Resource.Success -> onSuccess(it.data) + is Resource.Error -> onError(it.throwable) + } + } + } + } + } + } + override fun onDestroyView() { - disposables.clear() binding.imageView.setOnMatrixChangeListener(null) binding.imageView.setOnClickListener(null) binding.videoThumbnail.setOnClickListener(null) @@ -121,10 +124,6 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener } } - private fun updateProgressBar(visible: Boolean) { - binding.progressBar.visibility = if (visible) View.VISIBLE else View.GONE - } - override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.menu_gallery, menu) } @@ -133,19 +132,16 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener if (!isAdded) { return } + val enableShareAndSave = mediaInfo?.thumbUrl?.isNotEmpty() == true && binding.imageView.drawable != null menu.findItem(R.id.menu_gallery_visit_image_page).isEnabled = mediaInfo != null - menu.findItem(R.id.menu_gallery_share).isEnabled = mediaInfo != null && - mediaInfo!!.thumbUrl.isNotEmpty() && binding.imageView.drawable != null - menu.findItem(R.id.menu_gallery_save).isEnabled = mediaInfo != null && - mediaInfo!!.thumbUrl.isNotEmpty() && binding.imageView.drawable != null + menu.findItem(R.id.menu_gallery_share).isEnabled = enableShareAndSave + menu.findItem(R.id.menu_gallery_save).isEnabled = enableShareAndSave } override fun onMenuItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.menu_gallery_visit_image_page -> { - if (mediaInfo != null && imageTitle != null) { - startActivity(FilePageActivity.newIntent(requireContext(), imageTitle!!)) - } + startActivity(FilePageActivity.newIntent(requireContext(), imageTitle)) true } R.id.menu_gallery_save -> { @@ -169,41 +165,24 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener } } - private fun loadMedia() { - if (pageTitle == null || imageTitle == null) { - return - } - updateProgressBar(true) - disposables.add(getMediaInfoDisposable(imageTitle!!.prefixedText, WikipediaApp.instance.appOrSystemLanguageCode) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .doAfterTerminate { - updateProgressBar(false) - requireActivity().invalidateOptionsMenu() - (requireActivity() as GalleryActivity).layOutGalleryDescription(this) - } - .subscribe({ response -> - mediaPage = response.query?.firstPage() - if (FileUtil.isVideo(mediaPage?.imageInfo()?.mime.orEmpty())) { - loadVideo() - } else { - loadImage(ImageUrlUtil.getUrlForPreferredSize(mediaInfo!!.thumbUrl, - Constants.PREFERRED_GALLERY_IMAGE_SIZE)) - } - }) { throwable -> - FeedbackUtil.showMessage(requireActivity(), R.string.gallery_error_draw_failed) - L.d(throwable) - }) + private fun onLoading(visible: Boolean) { + binding.progressBar.isVisible = visible } - private fun getMediaInfoDisposable(title: String, lang: String): Observable { - return if (mediaListItem.isVideo) { - ServiceFactory.get(if (mediaListItem.isInCommons) Constants.commonsWikiSite - else pageTitle!!.wikiSite).getVideoInfo(title, lang) + private fun onSuccess(isVideo: Boolean) { + if (isVideo) { + loadVideo() } else { - ServiceFactory.get(if (mediaListItem.isInCommons) Constants.commonsWikiSite - else pageTitle!!.wikiSite).getImageInfo(title, lang) + loadImage(ImageUrlUtil.getUrlForPreferredSize(mediaInfo?.thumbUrl.orEmpty(), Constants.PREFERRED_GALLERY_IMAGE_SIZE)) } + onLoading(false) + requireActivity().invalidateOptionsMenu() + (requireActivity() as GalleryActivity).fetchGalleryDescription(this) + } + + private fun onError(throwable: Throwable) { + FeedbackUtil.showMessage(requireActivity(), R.string.gallery_error_draw_failed) + L.d(throwable) } private val videoThumbnailClickListener: View.OnClickListener = object : View.OnClickListener { @@ -221,12 +200,12 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener mediaController?.setPadding(0, 0, 0, DimenUtil.dpToPx(DimenUtil.getNavigationBarHeight(requireContext())).toInt()) } - updateProgressBar(true) + onLoading(true) binding.videoView.setMediaController(mediaController) binding.videoView.setOnPreparedListener { - updateProgressBar(false) + onLoading(false) // ...update the parent activity, which will trigger us to start playing! - (requireActivity() as GalleryActivity).layOutGalleryDescription(this@GalleryItemFragment) + (requireActivity() as GalleryActivity).fetchGalleryDescription(this@GalleryItemFragment) // hide the video thumbnail, since we're about to start playback binding.videoThumbnail.visibility = View.GONE binding.videoPlayButton.visibility = View.GONE @@ -235,7 +214,7 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener loading = false } binding.videoView.setOnErrorListener { _, _, _ -> - updateProgressBar(false) + onLoading(false) FeedbackUtil.showMessage(activity!!, R.string.gallery_error_video_failed) binding.videoView.visibility = View.GONE binding.videoThumbnail.visibility = View.VISIBLE @@ -251,7 +230,7 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener binding.videoContainer.visibility = View.VISIBLE binding.videoPlayButton.visibility = View.VISIBLE binding.videoView.visibility = View.GONE - if (mediaInfo == null || mediaInfo!!.thumbUrl.isEmpty()) { + if (mediaInfo?.thumbUrl?.isNotEmpty() != true) { binding.videoThumbnail.visibility = View.GONE } else { // show the video thumbnail while the video loads... @@ -263,7 +242,7 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener private fun loadImage(url: String) { binding.imageView.visibility = View.INVISIBLE - updateProgressBar(true) + onLoading(true) ViewUtil.loadImage(binding.imageView, url, roundedCorners = false, largeRoundedSize = false, force = true, listener = this) } @@ -286,15 +265,12 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener if (!isAdded) { return@ImagePipelineBitmapGetter } - imageTitle?.let { title -> - callback()?.onShare(this@GalleryItemFragment, bitmap, shareSubject, title) - } + callback()?.onShare(this@GalleryItemFragment, bitmap, + StringUtil.removeHTMLTags(viewModel.imageTitle.displayText), imageTitle) } } } - private val shareSubject get() = StringUtil.removeHTMLTags(pageTitle?.displayText) - private fun saveImage() { mediaInfo?.let { callback()?.onDownload(this) } } @@ -304,7 +280,7 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener } companion object { - private const val ARG_GALLERY_ITEM = "galleryItem" + const val ARG_GALLERY_ITEM = "galleryItem" fun newInstance(pageTitle: PageTitle?, item: MediaListItem): GalleryItemFragment { return GalleryItemFragment().apply { diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryItemViewModel.kt b/app/src/main/java/org/wikipedia/gallery/GalleryItemViewModel.kt new file mode 100644 index 00000000000..683f12aa3e5 --- /dev/null +++ b/app/src/main/java/org/wikipedia/gallery/GalleryItemViewModel.kt @@ -0,0 +1,57 @@ +package org.wikipedia.gallery + +import android.os.Bundle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.wikipedia.Constants +import org.wikipedia.WikipediaApp +import org.wikipedia.dataclient.ServiceFactory +import org.wikipedia.dataclient.mwapi.MwQueryPage +import org.wikipedia.extensions.parcelable +import org.wikipedia.page.PageTitle +import org.wikipedia.util.FileUtil +import org.wikipedia.util.Resource +import org.wikipedia.util.StringUtil + +class GalleryItemViewModel(bundle: Bundle) : ViewModel() { + + private var mediaListItem = bundle.parcelable(GalleryItemFragment.ARG_GALLERY_ITEM)!! + private val pageTitle = bundle.parcelable(Constants.ARG_TITLE) ?: PageTitle(mediaListItem.title, Constants.commonsWikiSite) + var imageTitle = PageTitle("File:${StringUtil.removeNamespace(mediaListItem.title)}", pageTitle.wikiSite) + var mediaPage: MwQueryPage? = null + + private val _uiState = MutableStateFlow(Resource()) + val uiState = _uiState.asStateFlow() + + init { + loadMedia() + } + + private fun loadMedia() { + _uiState.value = Resource.Loading() + viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> + _uiState.value = Resource.Error(throwable) + }) { + val wikiSite = if (mediaListItem.isInCommons) Constants.commonsWikiSite else imageTitle.wikiSite + val response = if (mediaListItem.isVideo) { + ServiceFactory.get(wikiSite).getVideoInfo(imageTitle.prefixedText, WikipediaApp.instance.appOrSystemLanguageCode) + } else { + ServiceFactory.get(wikiSite).getImageInfoSuspend(imageTitle.prefixedText, WikipediaApp.instance.appOrSystemLanguageCode) + } + mediaPage = response.query?.firstPage() + _uiState.value = Resource.Success(FileUtil.isVideo(mediaPage?.imageInfo()?.mime.orEmpty())) + } + } + + class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { + @Suppress("unchecked_cast") + override fun create(modelClass: Class): T { + return GalleryItemViewModel(bundle) as T + } + } +} diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryViewModel.kt b/app/src/main/java/org/wikipedia/gallery/GalleryViewModel.kt new file mode 100644 index 00000000000..1afa6f6620d --- /dev/null +++ b/app/src/main/java/org/wikipedia/gallery/GalleryViewModel.kt @@ -0,0 +1,72 @@ +package org.wikipedia.gallery + +import android.os.Bundle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.async +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.wikipedia.Constants +import org.wikipedia.commons.ImageTagsProvider +import org.wikipedia.dataclient.ServiceFactory +import org.wikipedia.dataclient.WikiSite +import org.wikipedia.dataclient.wikidata.Entities +import org.wikipedia.extensions.parcelable +import org.wikipedia.page.PageTitle +import org.wikipedia.util.Resource + +class GalleryViewModel(bundle: Bundle) : ViewModel() { + + val pageTitle = bundle.parcelable(Constants.ARG_TITLE) + val wikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! + val revision = bundle.getLong(GalleryActivity.EXTRA_REVISION, 0) + var initialFilename = bundle.getString(GalleryActivity.EXTRA_FILENAME) + + private val _uiState = MutableStateFlow(Resource()) + val uiState = _uiState.asStateFlow() + + private val _descriptionState = MutableStateFlow(Resource>()) + val descriptionState = _descriptionState.asStateFlow() + + fun fetchGalleryItems() { + _uiState.value = Resource.Loading() + viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> + _uiState.value = Resource.Error(throwable) + }) { + pageTitle?.let { + val response = ServiceFactory.getRest(it.wikiSite).getMediaListSuspend(it.prefixedText, revision) + _uiState.value = Resource.Success(response) + } + } + } + + fun fetchGalleryDescription(pageTitle: PageTitle) { + _descriptionState.value = Resource.Loading() + viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> + _descriptionState.value = Resource.Error(throwable) + }) { + val firstEntity = async { ServiceFactory.get(Constants.commonsWikiSite).getEntitiesByTitleSuspend(pageTitle.prefixedText, Constants.COMMONS_DB_NAME).first } + val protectionInfoResponse = async { ServiceFactory.get(Constants.commonsWikiSite).getProtectionInfoSuspend(pageTitle.prefixedText) } + val isProtected = protectionInfoResponse.await().query?.isEditProtected == true + _descriptionState.value = Resource.Success(isProtected to firstEntity.await()) + } + } + + fun getCaptions(entity: Entities.Entity?): Map { + return entity?.labels?.values?.associate { it.language to it.value }.orEmpty() + } + + fun getDepicts(entity: Entities.Entity?): List { + return ImageTagsProvider.getDepictsClaims(entity?.getStatements().orEmpty()) + } + + class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { + @Suppress("unchecked_cast") + override fun create(modelClass: Class): T { + return GalleryViewModel(bundle) as T + } + } +} diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.kt b/app/src/main/java/org/wikipedia/page/PageActivity.kt index 8e6a031008a..e8b2ff90a72 100644 --- a/app/src/main/java/org/wikipedia/page/PageActivity.kt +++ b/app/src/main/java/org/wikipedia/page/PageActivity.kt @@ -155,7 +155,7 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo startActivity(FilePageActivity.newIntent(this, imageTitle)) } else if (action === DescriptionEditActivity.Action.ADD_CAPTION || action === DescriptionEditActivity.Action.TRANSLATE_CAPTION) { pageFragment.title?.let { pageTitle -> - startActivity(GalleryActivity.newIntent(this, pageTitle, imageTitle.prefixedText, wikiSite, 0, GalleryActivity.SOURCE_NON_LEAD_IMAGE)) + startActivity(GalleryActivity.newIntent(this, pageTitle, imageTitle.prefixedText, wikiSite, 0)) } } } @@ -433,11 +433,11 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo requestHandleIntentLauncher.launch(LangLinksActivity.newIntent(this, title)) } - override fun onPageRequestGallery(title: PageTitle, fileName: String, wikiSite: WikiSite, revision: Long, source: Int, options: ActivityOptionsCompat?) { - if (source == GalleryActivity.SOURCE_LEAD_IMAGE) { - requestGalleryEditLauncher.launch(GalleryActivity.newIntent(this, title, fileName, title.wikiSite, revision, source), options) + override fun onPageRequestGallery(title: PageTitle, fileName: String, wikiSite: WikiSite, revision: Long, isLeadImage: Boolean, options: ActivityOptionsCompat?) { + if (isLeadImage) { + requestGalleryEditLauncher.launch(GalleryActivity.newIntent(this, title, fileName, title.wikiSite, revision), options) } else { - requestHandleIntentLauncher.launch(GalleryActivity.newIntent(this, title, fileName, title.wikiSite, revision, source), options) + requestHandleIntentLauncher.launch(GalleryActivity.newIntent(this, title, fileName, title.wikiSite, revision), options) } } diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 9b4aba6006f..78abdcbf715 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -139,7 +139,7 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi fun onPageCloseActionMode() fun onPageRequestEditSection(sectionId: Int, sectionAnchor: String?, title: PageTitle, highlightText: String?) fun onPageRequestLangLinks(title: PageTitle) - fun onPageRequestGallery(title: PageTitle, fileName: String, wikiSite: WikiSite, revision: Long, source: Int, options: ActivityOptionsCompat?) + fun onPageRequestGallery(title: PageTitle, fileName: String, wikiSite: WikiSite, revision: Long, isLeadImage: Boolean, options: ActivityOptionsCompat?) fun onPageRequestAddImageTags(mwQueryPage: MwQueryPage, invokeSource: InvokeSource) fun onPageRequestEditDescription(text: String?, title: PageTitle, sourceSummary: PageSummaryForEdit?, targetSummary: PageSummaryForEdit?, action: DescriptionEditActivity.Action, invokeSource: InvokeSource) @@ -632,7 +632,7 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi return@post } model.title?.let { - callback()?.onPageRequestGallery(it, fileName, it.wikiSite, revision, GalleryActivity.SOURCE_NON_LEAD_IMAGE, options) + callback()?.onPageRequestGallery(it, fileName, it.wikiSite, revision, false, options) } } } diff --git a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.kt b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.kt index bee0a8cf5ab..cfacf4ed6e0 100644 --- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.kt +++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.kt @@ -229,7 +229,7 @@ class LeadImagesHandler(private val parentFragment: PageFragment, leadImageUrl!!, true) GalleryActivity.setTransitionInfo(hitInfo) val options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pageHeaderView.imageView, activity.getString(R.string.transition_page_gallery)) - callback?.onPageRequestGallery(it, filename, wiki, parentFragment.revision, GalleryActivity.SOURCE_LEAD_IMAGE, options) + callback?.onPageRequestGallery(it, filename, wiki, parentFragment.revision, true, options) } } } diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt index c218b38a07c..cbada05f4af 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt @@ -138,7 +138,7 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV options = ActivityOptionsCompat.makeSceneTransitionAnimation(requireActivity(), view, requireActivity().getString(R.string.transition_page_gallery)) } requestGalleryLauncher.launch(GalleryActivity.newIntent(requireContext(), viewModel.pageTitle, - imageName, viewModel.pageTitle.wikiSite, revision, GalleryActivity.SOURCE_LINK_PREVIEW), options) + imageName, viewModel.pageTitle.wikiSite, revision), options) } private val requestGalleryLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { From 9ab3678b0618c64394023e844977ab18371a7032 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 4 Jun 2024 13:51:26 -0400 Subject: [PATCH 162/626] Hygiene: Remove useless constructor from Page, and improve ns detection. (#4605) * Hygiene: Remove useless constructor from Page, and improve ns detection. * Fix tests. --------- Co-authored-by: Cooltey Feng --- app/src/main/java/org/wikipedia/page/Page.kt | 4 ++-- app/src/main/java/org/wikipedia/page/PageProperties.kt | 5 +---- .../wikipedia/descriptions/DescriptionEditClientTest.kt | 3 +++ app/src/test/java/org/wikipedia/test/ParcelableTest.kt | 9 --------- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/wikipedia/page/Page.kt b/app/src/main/java/org/wikipedia/page/Page.kt index 9e4959593d7..ba86dbfde31 100644 --- a/app/src/main/java/org/wikipedia/page/Page.kt +++ b/app/src/main/java/org/wikipedia/page/Page.kt @@ -1,8 +1,8 @@ package org.wikipedia.page -class Page(var title: PageTitle, var sections: List
= emptyList(), var pageProperties: PageProperties) { +class Page(val title: PageTitle, var sections: List
= emptyList(), val pageProperties: PageProperties) { val displayTitle = pageProperties.displayTitle val isMainPage = pageProperties.isMainPage - val isArticle = !isMainPage && title.namespace() === Namespace.MAIN + val isArticle = !isMainPage && pageProperties.namespace.main() val isProtected = !pageProperties.canEdit } diff --git a/app/src/main/java/org/wikipedia/page/PageProperties.kt b/app/src/main/java/org/wikipedia/page/PageProperties.kt index 1e6b1508466..d2ffea2b9df 100644 --- a/app/src/main/java/org/wikipedia/page/PageProperties.kt +++ b/app/src/main/java/org/wikipedia/page/PageProperties.kt @@ -17,7 +17,7 @@ import java.util.Date @Parcelize @TypeParceler() -data class PageProperties constructor( +data class PageProperties( val pageId: Int = 0, val namespace: Namespace, val revisionId: Long = 0, @@ -65,9 +65,6 @@ data class PageProperties constructor( descriptionSource = pageSummary.descriptionSource ) - constructor(title: PageTitle, isMainPage: Boolean) : this(namespace = title.namespace(), - displayTitle = title.displayText, isMainPage = isMainPage) - private val isLoggedInUserAllowedToEdit: Boolean get() = protection?.run { AccountUtil.isMemberOf(editRoles) } ?: false } diff --git a/app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.kt b/app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.kt index fe2c75803c6..2cf7cbd290b 100644 --- a/app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.kt +++ b/app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.kt @@ -9,6 +9,7 @@ import org.mockito.Mockito import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.mwapi.MwException import org.wikipedia.dataclient.wikidata.EntityPostResponse +import org.wikipedia.page.Namespace import org.wikipedia.page.Page import org.wikipedia.page.PageProperties import org.wikipedia.page.PageTitle @@ -103,6 +104,7 @@ class DescriptionEditClientTest : MockRetrofitTest() { Mockito.`when`(props.wikiBaseItem).thenReturn("Q123") Mockito.`when`(props.canEdit).thenReturn(true) Mockito.`when`(props.descriptionSource).thenReturn("central") + Mockito.`when`(props.namespace).thenReturn(Namespace.MAIN) val page = Page(PageTitle("Test", wiki), pageProperties = props) MatcherAssert.assertThat(DescriptionEditUtil.isEditAllowed(page), Matchers.`is`(true)) } @@ -112,6 +114,7 @@ class DescriptionEditClientTest : MockRetrofitTest() { val wiki = WikiSite.forLanguageCode("ru") val props = Mockito.mock(PageProperties::class.java) Mockito.`when`(props.wikiBaseItem).thenReturn(null) + Mockito.`when`(props.namespace).thenReturn(Namespace.MAIN) val page = Page(PageTitle("Test", wiki), pageProperties = props) MatcherAssert.assertThat(DescriptionEditUtil.isEditAllowed(page), Matchers.`is`(false)) } diff --git a/app/src/test/java/org/wikipedia/test/ParcelableTest.kt b/app/src/test/java/org/wikipedia/test/ParcelableTest.kt index 6598df5657b..af7f42f61b6 100644 --- a/app/src/test/java/org/wikipedia/test/ParcelableTest.kt +++ b/app/src/test/java/org/wikipedia/test/ParcelableTest.kt @@ -27,15 +27,6 @@ class ParcelableTest { TestParcelUtil.test(origTitle) } - @Test - @Throws(Throwable::class) - fun testPageProperties() { - val wiki = WikiSite.forLanguageCode("en") - val title = PageTitle("Talk", "India", wiki) - val props = PageProperties(title, false) - TestParcelUtil.test(props) - } - @Test @Throws(Throwable::class) fun testPagePropertiesFromSummary() { From eea30f14e9ec7f988230fb4fa829c9dfb71c4930 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 4 Jun 2024 14:03:57 -0400 Subject: [PATCH 163/626] Update gradle and dependencies. (#4717) Co-authored-by: Cooltey Feng --- app/build.gradle | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 15f3e8395d8..b8cc25963e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -179,7 +179,7 @@ dependencies { String kotlinCoroutinesVersion = '1.8.1' String firebaseMessagingVersion = '24.0.0' String mlKitVersion = '17.0.5' - String googlePayVersion = '19.3.0' + String googlePayVersion = '19.4.0' String roomVersion = "2.6.1" String espressoVersion = '3.5.1' String serialization_version = '1.6.3' @@ -193,7 +193,7 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization_version" implementation 'com.google.android.material:material:1.12.0' - implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.core:core-ktx:1.13.1' implementation "androidx.browser:browser:1.8.0" implementation 'androidx.constraintlayout:constraintlayout:2.1.4' diff --git a/build.gradle b/build.gradle index 87da346fcca..1347b1528f3 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:8.4.0' + classpath 'com.android.tools.build:gradle:8.4.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath 'com.google.gms:google-services:4.4.1' From 538ccc78267b5e0fe198aab41eff364c1ad52264 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 5 Jun 2024 06:35:50 -0700 Subject: [PATCH 164/626] Hygiene: use registerForActivityResult for launching activities in SE (#4721) tasks --- app/src/main/java/org/wikipedia/Constants.kt | 1 - .../SuggestedEditsTasksFragment.kt | 43 +++++++++++-------- .../org/wikipedia/views/MessageCardView.kt | 11 ++--- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/wikipedia/Constants.kt b/app/src/main/java/org/wikipedia/Constants.kt index 853215d92d2..5e9e9dcc719 100644 --- a/app/src/main/java/org/wikipedia/Constants.kt +++ b/app/src/main/java/org/wikipedia/Constants.kt @@ -10,7 +10,6 @@ object Constants { const val ACTIVITY_REQUEST_DESCRIPTION_EDIT = 55 const val ACTIVITY_REQUEST_FEED_CONFIGURE = 58 const val ACTIVITY_REQUEST_GALLERY = 52 - const val ACTIVITY_REQUEST_IMAGE_TAGS_ONBOARDING = 65 const val ACTIVITY_REQUEST_LOGIN = 53 const val ACTIVITY_REQUEST_OPEN_SEARCH_ACTIVITY = 62 const val ACTIVITY_REQUEST_SETTINGS = 41 diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt index f69263eabe9..15e562dce5f 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt @@ -1,7 +1,6 @@ package org.wikipedia.suggestededits import android.app.Activity -import android.content.Intent import android.net.Uri import android.os.Bundle import android.view.LayoutInflater @@ -9,6 +8,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup +import androidx.activity.result.contract.ActivityResultContracts import androidx.constraintlayout.widget.Group import androidx.core.view.isVisible import androidx.core.widget.NestedScrollView @@ -81,6 +81,23 @@ class SuggestedEditsTasksFragment : Fragment() { BreadCrumbLogEvent.logTooltipShown(requireActivity(), binding.contributionsStatsView) } + private val requestAddLanguage = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + binding.tasksRecyclerView.adapter?.notifyDataSetChanged() + } + + private val requestAddImageTags = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) { + Prefs.showImageTagsOnboarding = false + startActivity(SuggestionsActivity.newIntent(requireActivity(), ADD_IMAGE_TAGS, Constants.InvokeSource.SUGGESTED_EDITS)) + } + } + + private val requestLogin = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == LoginActivity.RESULT_LOGIN_SUCCESS) { + clearContents() + } + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) _binding = FragmentSuggestedEditsTasksBinding.inflate(inflater, container, false) @@ -145,18 +162,6 @@ class SuggestedEditsTasksFragment : Fragment() { refreshContents() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == Constants.ACTIVITY_REQUEST_ADD_A_LANGUAGE) { - binding.tasksRecyclerView.adapter!!.notifyDataSetChanged() - } else if (requestCode == Constants.ACTIVITY_REQUEST_IMAGE_TAGS_ONBOARDING && resultCode == Activity.RESULT_OK) { - Prefs.showImageTagsOnboarding = false - startActivity(SuggestionsActivity.newIntent(requireActivity(), ADD_IMAGE_TAGS, Constants.InvokeSource.SUGGESTED_EDITS)) - } else if (requestCode == Constants.ACTIVITY_REQUEST_LOGIN && resultCode == LoginActivity.RESULT_LOGIN_SUCCESS) { - clearContents() - } - } - override fun onDestroyView() { binding.tasksRecyclerView.adapter = null binding.suggestedEditsScrollView.removeCallbacks(sequentialTooltipRunnable) @@ -170,7 +175,9 @@ class SuggestedEditsTasksFragment : Fragment() { private fun onRequireLogin() { clearContents() - binding.disabledStatesView.setRequiredLogin(this) + binding.disabledStatesView.setRequiredLogin { + requestLogin.launch(LoginActivity.newIntent(requireContext(), LoginActivity.SOURCE_SUGGESTED_EDITS)) + } binding.disabledStatesView.isVisible = true } @@ -377,10 +384,8 @@ class SuggestedEditsTasksFragment : Fragment() { private inner class TaskViewCallback : SuggestedEditsTaskView.Callback { override fun onViewClick(task: SuggestedEditsTask, secondary: Boolean) { if (WikipediaApp.instance.languageState.appLanguageCodes.size < Constants.MIN_LANGUAGES_TO_UNLOCK_TRANSLATION && secondary) { - startActivityForResult(WikipediaLanguagesActivity.newIntent(requireActivity(), Constants.InvokeSource.SUGGESTED_EDITS), Constants.ACTIVITY_REQUEST_ADD_A_LANGUAGE) - return - } - if (task == addDescriptionsTask) { + requestAddLanguage.launch(WikipediaLanguagesActivity.newIntent(requireActivity(), Constants.InvokeSource.SUGGESTED_EDITS)) + } else if (task == addDescriptionsTask) { ImageRecommendationsEvent.logAction(if (secondary) "add_desc_translate_start" else "add_desc_start", "suggested_edits_dialog") startActivity(SuggestionsActivity.newIntent(requireActivity(), if (secondary) TRANSLATE_DESCRIPTION else ADD_DESCRIPTION, Constants.InvokeSource.SUGGESTED_EDITS)) } else if (task == addImageCaptionsTask) { @@ -389,7 +394,7 @@ class SuggestedEditsTasksFragment : Fragment() { } else if (task == addImageTagsTask) { ImageRecommendationsEvent.logAction("add_tag_start", "suggested_edits_dialog") if (Prefs.showImageTagsOnboarding) { - startActivityForResult(SuggestedEditsImageTagsOnboardingActivity.newIntent(requireContext()), Constants.ACTIVITY_REQUEST_IMAGE_TAGS_ONBOARDING) + requestAddImageTags.launch(SuggestedEditsImageTagsOnboardingActivity.newIntent(requireContext())) } else { startActivity(SuggestionsActivity.newIntent(requireActivity(), ADD_IMAGE_TAGS, Constants.InvokeSource.SUGGESTED_EDITS)) } diff --git a/app/src/main/java/org/wikipedia/views/MessageCardView.kt b/app/src/main/java/org/wikipedia/views/MessageCardView.kt index 147505ae602..e692c6a3019 100644 --- a/app/src/main/java/org/wikipedia/views/MessageCardView.kt +++ b/app/src/main/java/org/wikipedia/views/MessageCardView.kt @@ -7,16 +7,13 @@ import android.view.LayoutInflater import android.view.View import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.fragment.app.Fragment -import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.databinding.ViewMessageCardBinding -import org.wikipedia.login.LoginActivity import org.wikipedia.page.LinkMovementMethodExt import org.wikipedia.util.StringUtil import org.wikipedia.util.UriUtil -class MessageCardView constructor(context: Context, attrs: AttributeSet? = null) : WikiCardView(context, attrs) { +class MessageCardView(context: Context, attrs: AttributeSet? = null) : WikiCardView(context, attrs) { val binding = ViewMessageCardBinding.inflate(LayoutInflater.from(context), this, true) @@ -84,14 +81,14 @@ class MessageCardView constructor(context: Context, attrs: AttributeSet? = null) setOnClickListener { UriUtil.visitInExternalBrowser(context, Uri.parse(context.getString(R.string.create_account_ip_block_help_url))) } } - fun setRequiredLogin(fragment: Fragment) { + fun setRequiredLogin(onClickListener: OnClickListener) { binding.imageView.visibility = View.VISIBLE binding.messageTitleView.text = context.getString(R.string.suggested_edits_encourage_account_creation_title) binding.messageTextView.text = context.getString(R.string.suggested_edits_encourage_account_creation_message) binding.imageView.setImageResource(R.drawable.ic_require_login_header) binding.positiveButton.text = context.getString(R.string.suggested_edits_encourage_account_creation_login_button) - binding.positiveButton.setOnClickListener { fragment.startActivityForResult(LoginActivity.newIntent(context, LoginActivity.SOURCE_SUGGESTED_EDITS), Constants.ACTIVITY_REQUEST_LOGIN) } - binding.containerClickArea.setOnClickListener { fragment.startActivityForResult(LoginActivity.newIntent(context, LoginActivity.SOURCE_SUGGESTED_EDITS), Constants.ACTIVITY_REQUEST_LOGIN) } + binding.positiveButton.setOnClickListener(onClickListener) + binding.containerClickArea.setOnClickListener(onClickListener) } private fun setDefaultState() { From e7a7e91792fe806b3108c974ee54045aa08c0796 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 5 Jun 2024 06:44:46 -0700 Subject: [PATCH 165/626] Update google-services version to 4.4.2 (#4719) Co-authored-by: Dmitry Brant --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1347b1528f3..8dccb9f3c24 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { classpath 'com.android.tools.build:gradle:8.4.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath 'com.google.gms:google-services:4.4.1' + classpath 'com.google.gms:google-services:4.4.2' } } From 584e45b4be973df3b6146f52a81db0e3a9582226 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 5 Jun 2024 14:59:31 -0400 Subject: [PATCH 166/626] Fix tint and logic of Edit pencil in page toolbar. (#4722) --- .../main/java/org/wikipedia/page/PageFragment.kt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 78abdcbf715..860a8449e49 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -463,6 +463,7 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi } model.page?.let { page -> page.pageProperties.protection = JsonUtil.decodeFromString(value) + updateQuickActionsAndMenuOptions() } } } @@ -1031,19 +1032,18 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi } binding.pageActionsTabLayout.forEach { it as MaterialTextView val pageActionItem = PageActionItem.find(it.id) - val enabled = model.page != null && (!model.shouldLoadAsMobileWeb || (model.shouldLoadAsMobileWeb && pageActionItem.isAvailableOnMobileWeb)) + var enabled = model.page != null && (!model.shouldLoadAsMobileWeb || (model.shouldLoadAsMobileWeb && pageActionItem.isAvailableOnMobileWeb)) when (pageActionItem) { PageActionItem.ADD_TO_WATCHLIST -> { it.setText(if (model.isWatched) R.string.menu_page_unwatch else R.string.menu_page_watch) it.setCompoundDrawablesWithIntrinsicBounds(0, PageActionItem.watchlistIcon(model.isWatched, model.hasWatchlistExpiry), 0, 0) - it.isEnabled = enabled && AccountUtil.isLoggedIn - it.alpha = if (it.isEnabled) 1f else 0.5f + enabled = enabled && AccountUtil.isLoggedIn } PageActionItem.SAVE -> { it.setCompoundDrawablesWithIntrinsicBounds(0, PageActionItem.readingListIcon(model.isInReadingList), 0, 0) } PageActionItem.EDIT_ARTICLE -> { - it.setCompoundDrawablesRelativeWithIntrinsicBounds(0, PageActionItem.editArticleIcon(model.page?.pageProperties?.canEdit != true), 0, 0) + it.setCompoundDrawablesWithIntrinsicBounds(0, PageActionItem.editArticleIcon(model.page?.pageProperties?.canEdit != true), 0, 0) } PageActionItem.VIEW_ON_MAP -> { val geoAvailable = model.page?.pageProperties?.geo != null @@ -1051,11 +1051,10 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi it.setTextColor(tintColor) TextViewCompat.setCompoundDrawableTintList(it, tintColor) } - else -> { - it.isEnabled = enabled - it.alpha = if (enabled) 1f else 0.5f - } + else -> { } } + it.isEnabled = enabled + it.alpha = if (enabled) 1f else 0.5f } sidePanelHandler.setEnabled(false) requireActivity().invalidateOptionsMenu() From f18426b235bf4369f5d4b04ca1827c7e206e37ad Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 5 Jun 2024 17:26:15 -0400 Subject: [PATCH 167/626] Fix potential issue(s) with audio/video playback in WebView. (#4723) * Fix potential issue(s) with audio/video playback in WebView. * Add check for Range header, and expand comments. --------- Co-authored-by: Cooltey Feng --- .../dataclient/okhttp/AvailableInputStream.kt | 69 ------------------- .../dataclient/okhttp/OkHttpWebViewClient.kt | 32 ++++----- .../okhttp/AvailableInputStreamTest.kt | 28 -------- 3 files changed, 14 insertions(+), 115 deletions(-) delete mode 100644 app/src/main/java/org/wikipedia/dataclient/okhttp/AvailableInputStream.kt delete mode 100644 app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.kt diff --git a/app/src/main/java/org/wikipedia/dataclient/okhttp/AvailableInputStream.kt b/app/src/main/java/org/wikipedia/dataclient/okhttp/AvailableInputStream.kt deleted file mode 100644 index 715aa2df45b..00000000000 --- a/app/src/main/java/org/wikipedia/dataclient/okhttp/AvailableInputStream.kt +++ /dev/null @@ -1,69 +0,0 @@ -package org.wikipedia.dataclient.okhttp - -import java.io.IOException -import java.io.InputStream - -/** - * This is a subclass of InputStream that implements the available() method reliably enough - * to satisfy WebResourceResponses or other consumers like BufferedInputStream that depend - * on available() to return a meaningful value. - * - * The problem is that the InputStream provided by OkHttp's body().byteStream() returns zero - * when calling available() prior to making any read() calls, which means that it will break - * any consumers that wrap a BufferedInputStream onto this stream, or any other wrapper that - * relies on a consistent implementation of available(). - * - * This is initialized with the original InputStream plus its total size, which must be known - * at the time of instantiation. You may then call the read() and skip() methods in the usual - * way, and then be able to call available() and get the number of bytes left to read. - */ -class AvailableInputStream(private val stream: InputStream, private var available: Long) : InputStream() { - - @Throws(IOException::class) - override fun read(): Int { - decreaseAvailable(1) - return stream.read() - } - - @Throws(IOException::class) - override fun read(b: ByteArray): Int { - val ret = stream.read(b) - if (ret > 0) { - decreaseAvailable(ret.toLong()) - } - return ret - } - - @Throws(IOException::class) - override fun read(b: ByteArray, off: Int, len: Int): Int { - val ret = stream.read(b, off, len) - if (ret > 0) { - decreaseAvailable(ret.toLong()) - } - return ret - } - - @Throws(IOException::class) - override fun skip(n: Long): Long { - val ret = stream.skip(n) - if (ret > 0) { - decreaseAvailable(ret) - } - return ret - } - - @Throws(IOException::class) - override fun available(): Int { - val ret = stream.available() - return if (ret == 0 && available > 0) { - available.toInt() - } else ret - } - - private fun decreaseAvailable(n: Long) { - available -= n - if (available < 0) { - available = 0 - } - } -} diff --git a/app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpWebViewClient.kt b/app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpWebViewClient.kt index 08d030a7f88..eccc02d8fcb 100644 --- a/app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpWebViewClient.kt +++ b/app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpWebViewClient.kt @@ -15,7 +15,6 @@ import org.wikipedia.page.PageViewModel import org.wikipedia.util.UriUtil import org.wikipedia.util.log.L import java.io.IOException -import java.io.InputStream import java.nio.charset.Charset abstract class OkHttpWebViewClient : WebViewClient() { @@ -42,7 +41,15 @@ abstract class OkHttpWebViewClient : WebViewClient() { return null } if (request.method == "POST" || - request.url.toString().contains(RestService.PAGE_HTML_PREVIEW_ENDPOINT)) { + request.url.toString().contains(RestService.PAGE_HTML_PREVIEW_ENDPOINT) || + request.requestHeaders.containsKey("Range") || request.requestHeaders.containsKey("range")) { + // We do NOT want to intercept requests coming from the WebView in the following cases: + // 1. POST requests, because the WebView doesn't provide us the Body of the request, + // for security (?) reasons. + // 2. Page previews, because we're not interested in saving or caching them. + // 3. Requests with any kind of "Range" header, since this is very likely a request for + // playback of an audio or video file, which is problematic for us to intercept in + // the way that we do, and can lead to unintended behavior. return null } var response: WebResourceResponse @@ -55,10 +62,11 @@ abstract class OkHttpWebViewClient : WebViewClient() { if (rsp.networkResponse != null && shouldLogLatency) { WikipediaApp.instance.appSessionEvent.pageFetchEnd() } - response = if (CONTENT_TYPE_OGG == rsp.header(HEADER_CONTENT_TYPE) || - CONTENT_TYPE_WEBM == rsp.header(HEADER_CONTENT_TYPE)) { + val contentType = rsp.header(HEADER_CONTENT_TYPE).orEmpty() + response = if (contentType.startsWith("audio") || contentType.startsWith("video")) { + // One last check to make sure we're not intercepting a media file (see comments above). rsp.close() - return super.shouldInterceptRequest(view, request) + return null } else { // noinspection ConstantConditions WebResourceResponse(rsp.body!!.contentType()!!.type + "/" + rsp.body!!.contentType()!!.subtype, @@ -66,7 +74,7 @@ abstract class OkHttpWebViewClient : WebViewClient() { rsp.code, rsp.message.ifBlank { "Unknown error" }, addResponseHeaders(rsp.headers).toMap(), - getInputStream(rsp)) + rsp.body?.byteStream()) } } catch (e: Exception) { val reasonCode = if (e.message.isNullOrEmpty()) "Unknown error" else UriUtil.encodeURL(e.message!!) @@ -129,20 +137,8 @@ abstract class OkHttpWebViewClient : WebViewClient() { return headers.newBuilder().set("Access-Control-Allow-Origin", "*").build() } - private fun getInputStream(rsp: Response): InputStream? { - return rsp.body?.let { - var inputStream = it.byteStream() - if (CONTENT_TYPE_OGG == rsp.header(HEADER_CONTENT_TYPE)) { - inputStream = AvailableInputStream(it.byteStream(), it.contentLength()) - } - inputStream - } - } - companion object { private const val HEADER_CONTENT_TYPE = "content-type" - private const val CONTENT_TYPE_OGG = "application/ogg" - private const val CONTENT_TYPE_WEBM = "video/webm" private val SUPPORTED_SCHEMES = listOf("http", "https") } } diff --git a/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.kt b/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.kt deleted file mode 100644 index d584d1b87f8..00000000000 --- a/app/src/test/java/org/wikipedia/dataclient/okhttp/AvailableInputStreamTest.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.wikipedia.dataclient.okhttp - -import org.hamcrest.MatcherAssert -import org.hamcrest.Matchers -import org.junit.Test -import org.wikipedia.test.TestFileUtil -import java.io.ByteArrayInputStream - -class AvailableInputStreamTest { - @Test - @Throws(Throwable::class) - fun testAvailableInputStream() { - val contentBytes = TestFileUtil.readRawFile("page_lead_rb.json").toByteArray() - val inputStream = ByteArrayInputStream(contentBytes) - - val availableStream = AvailableInputStream(inputStream, contentBytes.size.toLong()) - - MatcherAssert.assertThat(availableStream.available(), Matchers.`is`(contentBytes.size)) - - val tempBytes = ByteArray(10) - availableStream.read() - availableStream.read(tempBytes) - availableStream.read(tempBytes, 0, 10) - availableStream.skip(10) - - MatcherAssert.assertThat(availableStream.available(), Matchers.`is`(contentBytes.size - 31)) - } -} From fb34e9eb468391ab6074f916ae148f3abe44f892 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 5 Jun 2024 17:35:33 -0400 Subject: [PATCH 168/626] Fix passing of userGroups to PCS when setting up. (#4724) Co-authored-by: Cooltey Feng --- .../main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt b/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt index c0768bcec64..7cefd8aaee5 100644 --- a/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt +++ b/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt @@ -7,6 +7,7 @@ import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil import org.wikipedia.dataclient.WikiSite +import org.wikipedia.json.JsonUtil import org.wikipedia.page.Namespace import org.wikipedia.page.PageTitle import org.wikipedia.page.PageViewModel @@ -117,7 +118,7 @@ object JavaScriptActionHandler { " \"areTablesInitiallyExpanded\": ${isPreview || !Prefs.isCollapseTablesEnabled}," + " \"textSizeAdjustmentPercentage\": \"100%%\"," + " \"loadImages\": ${Prefs.isImageDownloadEnabled}," + - " \"userGroups\": \"${AccountUtil.groups}\"," + + " \"userGroups\": ${JsonUtil.encodeToString(AccountUtil.groups)}," + " \"isEditable\": ${!Prefs.readingFocusModeEnabled}" + "}", topMargin, 16, 48, 16, leadImageHeight) } From 8b01618dd813677bf88703bfd4ad5e407f2c60c9 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 6 Jun 2024 06:23:58 -0700 Subject: [PATCH 169/626] Remove duplicated function from UserTalkPopupHelper (#4725) --- .../main/java/org/wikipedia/talk/UserTalkPopupHelper.kt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/src/main/java/org/wikipedia/talk/UserTalkPopupHelper.kt b/app/src/main/java/org/wikipedia/talk/UserTalkPopupHelper.kt index 8d77605c644..e7637065f74 100644 --- a/app/src/main/java/org/wikipedia/talk/UserTalkPopupHelper.kt +++ b/app/src/main/java/org/wikipedia/talk/UserTalkPopupHelper.kt @@ -37,13 +37,6 @@ import org.wikipedia.util.log.L @SuppressLint("RestrictedApi") object UserTalkPopupHelper { - fun show(activity: AppCompatActivity, title: PageTitle, anon: Boolean, anchorView: View, - invokeSource: Constants.InvokeSource, historySource: Int, revisionId: Long? = null, pageId: Int? = null) { - val pos = IntArray(2) - anchorView.getLocationInWindow(pos) - show(activity, title, anon, pos[0], pos[1], invokeSource, historySource, revisionId = revisionId, pageId = pageId) - } - fun show(activity: AppCompatActivity, title: PageTitle, anon: Boolean, anchorView: View, invokeSource: Constants.InvokeSource, historySource: Int, revisionId: Long? = null, pageId: Int? = null, showUserInfo: Boolean = false) { val pos = IntArray(2) From 709cf6e3b41afa620d0444626beeda7ab6fb9fa1 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Thu, 6 Jun 2024 13:00:33 -0700 Subject: [PATCH 170/626] Do not reload the feed content onResume in FeedFragment (#4726) --- app/src/main/java/org/wikipedia/feed/FeedFragment.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.kt b/app/src/main/java/org/wikipedia/feed/FeedFragment.kt index 9838004540b..0652a426676 100644 --- a/app/src/main/java/org/wikipedia/feed/FeedFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.kt @@ -149,10 +149,6 @@ class FeedFragment : Fragment(), BackPressedHandler { override fun onResume() { super.onResume() showRemoveChineseVariantPrompt() - - // Explicitly invalidate the feed adapter, since it occasionally crashes the StaggeredGridLayout - // on certain devices. (TODO: investigate further) - feedAdapter.notifyDataSetChanged() } override fun onDestroyView() { From feac39825d69b1a07978ad3426fef6c034100133 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 7 Jun 2024 12:29:05 -0400 Subject: [PATCH 171/626] Fix unintended parsing of language variant code from /w/ URLs. (#4727) --- app/src/main/java/org/wikipedia/util/UriUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/wikipedia/util/UriUtil.kt b/app/src/main/java/org/wikipedia/util/UriUtil.kt index e8ff58c37ab..21394bd3ca3 100644 --- a/app/src/main/java/org/wikipedia/util/UriUtil.kt +++ b/app/src/main/java/org/wikipedia/util/UriUtil.kt @@ -136,7 +136,7 @@ object UriUtil { /** Get language variant code from a Uri path, e.g. "/wiki/Foo" or "/zh-tw/Foo". * It will return "zh-tw" or an empty string */ fun getLanguageVariantFromUri(uri: Uri): String { - return uri.path?.split('/')?.getOrNull(1)?.takeUnless { it == "wiki" }.orEmpty() + return uri.path?.split('/')?.getOrNull(1)?.takeUnless { it == "wiki" || it == "w" }.orEmpty() } /** For internal links only */ From 7d546020afab68b29661c515ca968c3d2d8ed168 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 10 Jun 2024 05:40:53 -0700 Subject: [PATCH 172/626] Remove duplicated themed resource (#4730) --- .../res/drawable/ic_share_material_secondary_themed.xml | 9 --------- app/src/main/res/menu/menu_talk_thread_item.xml | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_share_material_secondary_themed.xml diff --git a/app/src/main/res/drawable/ic_share_material_secondary_themed.xml b/app/src/main/res/drawable/ic_share_material_secondary_themed.xml deleted file mode 100644 index b481f296b2b..00000000000 --- a/app/src/main/res/drawable/ic_share_material_secondary_themed.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/menu/menu_talk_thread_item.xml b/app/src/main/res/menu/menu_talk_thread_item.xml index fa8e226cc05..917271b2eda 100644 --- a/app/src/main/res/menu/menu_talk_thread_item.xml +++ b/app/src/main/res/menu/menu_talk_thread_item.xml @@ -4,7 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> From 1c81592c91221b5c97961c51020be66802eb5cde Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 10 Jun 2024 11:14:10 -0700 Subject: [PATCH 173/626] Refactoring LoginClient to use Coroutine (#4720) * Refactoring LoginClient to use Coroutine * Remove unused parameter * Fix lint * Code review fix --------- Co-authored-by: Dmitry Brant --- .../org/wikipedia/csrf/CsrfTokenClient.kt | 16 +- .../java/org/wikipedia/dataclient/Service.kt | 16 +- .../java/org/wikipedia/login/LoginActivity.kt | 11 +- .../java/org/wikipedia/login/LoginClient.kt | 187 +++++------------- .../wikipedia/login/LoginFailedException.kt | 3 + .../java/org/wikipedia/login/LoginResponse.kt | 51 +++++ .../wikipedia/login/ResetPasswordActivity.kt | 4 +- .../java/org/wikipedia/util/ThrowableUtil.kt | 2 +- 8 files changed, 127 insertions(+), 163 deletions(-) create mode 100644 app/src/main/java/org/wikipedia/login/LoginFailedException.kt create mode 100644 app/src/main/java/org/wikipedia/login/LoginResponse.kt diff --git a/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt b/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt index 3e7c61b4f1a..d106e1e6402 100644 --- a/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt +++ b/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt @@ -2,6 +2,7 @@ package org.wikipedia.csrf import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.runBlocking import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil import org.wikipedia.dataclient.Service @@ -33,12 +34,15 @@ object CsrfTokenClient { for (retry in 0 until MAX_RETRIES) { if (retry > 0) { // Log in explicitly - LoginClient().loginBlocking(site, AccountUtil.userName!!, AccountUtil.password!!, "") - .subscribeOn(Schedulers.io()) - .blockingSubscribe({ }) { - L.e(it) - lastError = it - } + // TODO: convert this with coroutines + runBlocking { + try { + LoginClient().loginBlocking(site, AccountUtil.userName!!, AccountUtil.password!!, "") + } catch (e: Exception) { + L.e(e) + lastError = e + } + } } if (emitter.isDisposed) { return@create diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index 8b472ff6768..cde42cfcae0 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -24,7 +24,7 @@ import org.wikipedia.dataclient.wikidata.Entities import org.wikipedia.dataclient.wikidata.EntityPostResponse import org.wikipedia.dataclient.wikidata.Search import org.wikipedia.edit.Edit -import org.wikipedia.login.LoginClient.LoginResponse +import org.wikipedia.login.LoginResponse import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.GET @@ -289,29 +289,29 @@ interface Service { @Field("captchaWord") captchaWord: String? ): Observable - @get:GET(MW_API_PREFIX + "action=query&meta=tokens&type=login") - @get:Headers("Cache-Control: no-cache") - val loginToken: Observable + @GET(MW_API_PREFIX + "action=query&meta=tokens&type=login") + @Headers("Cache-Control: no-cache") + suspend fun getLoginToken(): MwQueryResponse @FormUrlEncoded @POST(MW_API_PREFIX + "action=clientlogin&rememberMe=") - fun postLogIn( + suspend fun postLogIn( @Field("username") user: String?, @Field("password") pass: String?, @Field("logintoken") token: String?, @Field("loginreturnurl") url: String? - ): Observable + ): LoginResponse @FormUrlEncoded @POST(MW_API_PREFIX + "action=clientlogin&rememberMe=") - fun postLogIn( + suspend fun postLogIn( @Field("username") user: String?, @Field("password") pass: String?, @Field("retype") retypedPass: String?, @Field("OATHToken") twoFactorCode: String?, @Field("logintoken") token: String?, @Field("logincontinue") loginContinue: Boolean - ): Observable + ): LoginResponse @FormUrlEncoded @POST(MW_API_PREFIX + "action=logout") diff --git a/app/src/main/java/org/wikipedia/login/LoginActivity.kt b/app/src/main/java/org/wikipedia/login/LoginActivity.kt index a6667a6c188..bfd51663452 100644 --- a/app/src/main/java/org/wikipedia/login/LoginActivity.kt +++ b/app/src/main/java/org/wikipedia/login/LoginActivity.kt @@ -9,6 +9,7 @@ import android.os.Bundle import android.view.View import android.view.inputmethod.EditorInfo import androidx.activity.result.contract.ActivityResultContracts +import androidx.lifecycle.lifecycleScope import com.google.android.material.textfield.TextInputLayout import org.wikipedia.R import org.wikipedia.WikipediaApp @@ -17,7 +18,6 @@ import org.wikipedia.auth.AccountUtil.updateAccount import org.wikipedia.createaccount.CreateAccountActivity import org.wikipedia.databinding.ActivityLoginBinding import org.wikipedia.extensions.parcelableExtra -import org.wikipedia.login.LoginClient.LoginFailedException import org.wikipedia.notifications.PollNotificationWorker import org.wikipedia.page.PageTitle import org.wikipedia.push.WikipediaFirebaseMessagingService.Companion.updateSubscription @@ -98,7 +98,6 @@ class LoginActivity : BaseActivity() { override fun onStop() { binding.viewProgressBar.visibility = View.GONE - loginClient.cancel() super.onStop() } @@ -169,10 +168,11 @@ class LoginActivity : BaseActivity() { val twoFactorCode = getText(binding.login2faText) showProgressBar(true) if (twoFactorCode.isNotEmpty() && !firstStepToken.isNullOrEmpty()) { - loginClient.login(WikipediaApp.instance.wikiSite, username, password, + loginClient.login(lifecycleScope, WikipediaApp.instance.wikiSite, username, password, null, twoFactorCode, firstStepToken!!, loginCallback) } else { - loginClient.request(WikipediaApp.instance.wikiSite, username, password, loginCallback) + loginClient.login(lifecycleScope, WikipediaApp.instance.wikiSite, username, password, + null, null, null, loginCallback) } } @@ -229,7 +229,6 @@ class LoginActivity : BaseActivity() { const val LOGIN_REQUEST_SOURCE = "login_request_source" const val SOURCE_NAV = "navigation" const val SOURCE_EDIT = "edit" - const val SOURCE_BLOCKED = "blocked" const val SOURCE_SYSTEM = "system" const val SOURCE_ONBOARDING = "onboarding" const val SOURCE_SETTINGS = "settings" @@ -238,7 +237,7 @@ class LoginActivity : BaseActivity() { const val SOURCE_LOGOUT_BACKGROUND = "logout_background" const val SOURCE_SUGGESTED_EDITS = "suggestededits" - fun newIntent(context: Context, source: String, token: String? = null): Intent { + fun newIntent(context: Context, source: String): Intent { return Intent(context, LoginActivity::class.java) .putExtra(LOGIN_REQUEST_SOURCE, source) } diff --git a/app/src/main/java/org/wikipedia/login/LoginClient.kt b/app/src/main/java/org/wikipedia/login/LoginClient.kt index 4524017452f..ea5d9eb9f5c 100644 --- a/app/src/main/java/org/wikipedia/login/LoginClient.kt +++ b/app/src/main/java/org/wikipedia/login/LoginClient.kt @@ -1,25 +1,19 @@ package org.wikipedia.login import android.widget.Toast -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.Service import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite -import org.wikipedia.dataclient.mwapi.MwResponse import org.wikipedia.util.log.L import java.io.IOException class LoginClient { - private val disposables = CompositeDisposable() - interface LoginCallback { fun success(result: LoginResult) fun twoFactorPrompt(caught: Throwable, token: String?) @@ -27,150 +21,63 @@ class LoginClient { fun error(caught: Throwable) } - fun request(wiki: WikiSite, userName: String, password: String, cb: LoginCallback) { - cancel() - disposables.add(getLoginToken(wiki) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ loginToken -> - login(wiki, userName, password, null, null, loginToken, cb) - }, { caught -> cb.error(caught) })) - } - - fun login(wiki: WikiSite, userName: String, password: String, retypedPassword: String?, - twoFactorCode: String?, loginToken: String?, cb: LoginCallback) { - disposables.add(getLoginResponse(wiki, userName, password, retypedPassword, twoFactorCode, loginToken) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .flatMap { loginResponse -> - val loginResult = loginResponse.toLoginResult(wiki, password) - if (loginResult != null) { - if (loginResult.pass() && userName.isNotEmpty()) { - return@flatMap getExtendedInfo(wiki, loginResult) - } else if (LoginResult.STATUS_UI == loginResult.status) { - when (loginResult) { - is LoginOAuthResult -> cb.twoFactorPrompt(LoginFailedException(loginResult.message), loginToken) - is LoginResetPasswordResult -> cb.passwordResetPrompt(loginToken) - else -> cb.error(LoginFailedException(loginResult.message)) - } - } else { - cb.error(LoginFailedException(loginResult.message)) + fun login(coroutineScope: CoroutineScope, wiki: WikiSite, userName: String, password: String, + retypedPassword: String?, twoFactorCode: String?, token: String?, cb: LoginCallback) { + coroutineScope.launch(CoroutineExceptionHandler { _, throwable -> + L.e("Login process failed. $throwable") + cb.error(throwable) + }) { + val loginToken = token ?: getLoginToken(wiki) + val loginResult = getLoginResponse(wiki, userName, password, retypedPassword, twoFactorCode, loginToken).toLoginResult(wiki, password) + if (loginResult != null) { + if (loginResult.pass() && userName.isNotEmpty()) { + ServiceFactory.get(wiki).getUserInfo().query?.userInfo?.let { + loginResult.userId = it.id + loginResult.groups = it.groups() + L.v("Found user ID " + it.id + " for " + wiki.subdomain()) + } + cb.success(loginResult) + } else if (LoginResult.STATUS_UI == loginResult.status) { + when (loginResult) { + is LoginOAuthResult -> cb.twoFactorPrompt(LoginFailedException(loginResult.message), loginToken) + is LoginResetPasswordResult -> cb.passwordResetPrompt(loginToken) + else -> cb.error(LoginFailedException(loginResult.message)) } } else { - cb.error(IOException("Login failed. Unexpected response.")) + cb.error(LoginFailedException(loginResult.message)) } - Observable.empty() + } else { + cb.error(IOException("Login failed. Unexpected response.")) } - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ loginResult -> - cb.success(loginResult) - }) { caught -> - L.e("Login process failed. $caught") - cb.error(caught) - }) + } } - fun loginBlocking(wiki: WikiSite, userName: String, password: String, twoFactorCode: String?): Observable { - return getLoginToken(wiki) - .flatMap { loginToken -> - getLoginResponse(wiki, userName, password, null, twoFactorCode, loginToken) - } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .map { loginResponse -> - val loginResult = loginResponse.toLoginResult(wiki, password) ?: throw IOException("Unexpected response when logging in.") - if (LoginResult.STATUS_UI == loginResult.status) { - if (loginResult is LoginOAuthResult) { - // TODO: Find a better way to boil up the warning about 2FA - Toast.makeText(WikipediaApp.instance, - R.string.login_2fa_other_workflow_error_msg, Toast.LENGTH_LONG).show() - } - throw LoginFailedException(loginResult.message) - } else if (!loginResult.pass() || loginResult.userName.isNullOrEmpty()) { - throw LoginFailedException(loginResult.message) - } - loginResponse + suspend fun loginBlocking(wiki: WikiSite, userName: String, password: String, twoFactorCode: String?): LoginResponse { + val loginToken = getLoginToken(wiki) + val loginResponse = getLoginResponse(wiki, userName, password, null, twoFactorCode, loginToken) + val loginResult = loginResponse.toLoginResult(wiki, password) ?: throw IOException("Unexpected response when logging in.") + if (LoginResult.STATUS_UI == loginResult.status) { + if (loginResult is LoginOAuthResult) { + // TODO: Find a better way to boil up the warning about 2FA + Toast.makeText(WikipediaApp.instance, + R.string.login_2fa_other_workflow_error_msg, Toast.LENGTH_LONG).show() } + throw LoginFailedException(loginResult.message) + } else if (!loginResult.pass() || loginResult.userName.isNullOrEmpty()) { + throw LoginFailedException(loginResult.message) + } + return loginResponse } - private fun getLoginToken(wiki: WikiSite): Observable { - return ServiceFactory.get(wiki).loginToken - .subscribeOn(Schedulers.io()) - .map { response -> - val loginToken = response.query?.loginToken() - if (loginToken.isNullOrEmpty()) { - throw RuntimeException("Received empty login token.") - } - loginToken - } + private suspend fun getLoginToken(wiki: WikiSite): String { + val response = ServiceFactory.get(wiki).getLoginToken() + return response.query?.loginToken() ?: throw RuntimeException("Received empty login token.") } - private fun getLoginResponse(wiki: WikiSite, userName: String, password: String, retypedPassword: String?, - twoFactorCode: String?, loginToken: String?): Observable { + private suspend fun getLoginResponse(wiki: WikiSite, userName: String, password: String, retypedPassword: String?, + twoFactorCode: String?, loginToken: String?): LoginResponse { return if (twoFactorCode.isNullOrEmpty() && retypedPassword.isNullOrEmpty()) ServiceFactory.get(wiki).postLogIn(userName, password, loginToken, Service.WIKIPEDIA_URL) else ServiceFactory.get(wiki).postLogIn(userName, password, retypedPassword, twoFactorCode, loginToken, true) } - - private fun getExtendedInfo(wiki: WikiSite, loginResult: LoginResult): Observable { - return ServiceFactory.get(wiki).userInfo - .subscribeOn(Schedulers.io()) - .map { response -> - val id = response.query?.userInfo!!.id - loginResult.userId = id - loginResult.groups = response.query?.userInfo!!.groups() - L.v("Found user ID " + id + " for " + wiki.subdomain()) - loginResult - } - } - - fun cancel() { - disposables.clear() - } - - @Serializable - class LoginResponse : MwResponse() { - - @SerialName("clientlogin") - private val clientLogin: ClientLogin? = null - - fun toLoginResult(site: WikiSite, password: String): LoginResult? { - return clientLogin?.toLoginResult(site, password) - } - - @Serializable - private class ClientLogin { - - private val status: String? = null - private val requests: List? = null - private val message: String? = null - @SerialName("username") - private val userName: String? = null - - fun toLoginResult(site: WikiSite, password: String): LoginResult { - var userMessage = message - if (LoginResult.STATUS_UI == status) { - if (requests != null) { - for (req in requests) { - if (req.id.orEmpty().endsWith("TOTPAuthenticationRequest")) { - return LoginOAuthResult(site, status, userName, password, message) - } else if (req.id.orEmpty().endsWith("PasswordAuthenticationRequest")) { - return LoginResetPasswordResult(site, status, userName, password, message) - } - } - } - } else if (LoginResult.STATUS_PASS != status && LoginResult.STATUS_FAIL != status) { - // TODO: String resource -- Looks like needed for others in this class too - userMessage = "An unknown error occurred." - } - return LoginResult(site, status!!, userName, password, userMessage) - } - } - - @Serializable - private class Request { - val id: String? = null - } - } - - class LoginFailedException(message: String?) : Throwable(message) } diff --git a/app/src/main/java/org/wikipedia/login/LoginFailedException.kt b/app/src/main/java/org/wikipedia/login/LoginFailedException.kt new file mode 100644 index 00000000000..10137c29f29 --- /dev/null +++ b/app/src/main/java/org/wikipedia/login/LoginFailedException.kt @@ -0,0 +1,3 @@ +package org.wikipedia.login + +class LoginFailedException(message: String?) : Throwable(message) diff --git a/app/src/main/java/org/wikipedia/login/LoginResponse.kt b/app/src/main/java/org/wikipedia/login/LoginResponse.kt new file mode 100644 index 00000000000..2c25215d608 --- /dev/null +++ b/app/src/main/java/org/wikipedia/login/LoginResponse.kt @@ -0,0 +1,51 @@ +package org.wikipedia.login + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.wikipedia.dataclient.WikiSite +import org.wikipedia.dataclient.mwapi.MwResponse + +@Serializable +class LoginResponse : MwResponse() { + + @SerialName("clientlogin") + private val clientLogin: ClientLogin? = null + + fun toLoginResult(site: WikiSite, password: String): LoginResult? { + return clientLogin?.toLoginResult(site, password) + } + + @Serializable + private class ClientLogin { + + private val status: String? = null + private val requests: List? = null + private val message: String? = null + @SerialName("username") + private val userName: String? = null + + fun toLoginResult(site: WikiSite, password: String): LoginResult { + var userMessage = message + if (LoginResult.STATUS_UI == status) { + if (requests != null) { + for (req in requests) { + if (req.id.orEmpty().endsWith("TOTPAuthenticationRequest")) { + return LoginOAuthResult(site, status, userName, password, message) + } else if (req.id.orEmpty().endsWith("PasswordAuthenticationRequest")) { + return LoginResetPasswordResult(site, status, userName, password, message) + } + } + } + } else if (LoginResult.STATUS_PASS != status && LoginResult.STATUS_FAIL != status) { + // TODO: String resource -- Looks like needed for others in this class too + userMessage = "An unknown error occurred." + } + return LoginResult(site, status!!, userName, password, userMessage) + } + } + + @Serializable + private class Request { + val id: String? = null + } +} diff --git a/app/src/main/java/org/wikipedia/login/ResetPasswordActivity.kt b/app/src/main/java/org/wikipedia/login/ResetPasswordActivity.kt index c4370c6f441..497408ce368 100644 --- a/app/src/main/java/org/wikipedia/login/ResetPasswordActivity.kt +++ b/app/src/main/java/org/wikipedia/login/ResetPasswordActivity.kt @@ -7,6 +7,7 @@ import android.content.Intent import android.os.Bundle import android.view.View import android.view.inputmethod.EditorInfo +import androidx.lifecycle.lifecycleScope import com.google.android.material.textfield.TextInputLayout import org.wikipedia.R import org.wikipedia.WikipediaApp @@ -16,7 +17,6 @@ import org.wikipedia.createaccount.CreateAccountActivity.Companion.validateInput import org.wikipedia.createaccount.CreateAccountActivity.ValidateResult import org.wikipedia.databinding.ActivityResetPasswordBinding import org.wikipedia.extensions.parcelableExtra -import org.wikipedia.login.LoginClient.LoginFailedException import org.wikipedia.util.DeviceUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.log.L @@ -99,7 +99,7 @@ class ResetPasswordActivity : BaseActivity() { if (loginClient == null) { loginClient = LoginClient() } - loginClient?.login(WikipediaApp.instance.wikiSite, userName, password, + loginClient?.login(lifecycleScope, WikipediaApp.instance.wikiSite, userName, password, retypedPassword, twoFactorCode, firstStepToken, loginCallback) } diff --git a/app/src/main/java/org/wikipedia/util/ThrowableUtil.kt b/app/src/main/java/org/wikipedia/util/ThrowableUtil.kt index cc7bfa55d99..a1b3eabf4a1 100644 --- a/app/src/main/java/org/wikipedia/util/ThrowableUtil.kt +++ b/app/src/main/java/org/wikipedia/util/ThrowableUtil.kt @@ -12,7 +12,7 @@ import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.mwapi.MwException import org.wikipedia.dataclient.mwapi.MwServiceError import org.wikipedia.dataclient.okhttp.HttpStatusException -import org.wikipedia.login.LoginClient.LoginFailedException +import org.wikipedia.login.LoginFailedException import org.wikipedia.util.log.L import java.net.SocketException import java.net.SocketTimeoutException From 552691e5fc38d2a6d1c350ad18290f45a9d578cf Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 10 Jun 2024 14:26:06 -0400 Subject: [PATCH 174/626] Bump versionCode. (#4731) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b8cc25963e1..96c5b6d7f20 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50490 + versionCode 50491 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From 639f43d2e0fcf0530e9e725d030e8feb260100d1 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Tue, 11 Jun 2024 15:37:42 +0300 Subject: [PATCH 175/626] Localisation updates from https://translatewiki.net. (#4736) --- app/src/main/res/values-be/strings.xml | 150 ++++++++++++++++++++++-- app/src/main/res/values-ce/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 38 +++++- app/src/main/res/values-hy/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 24 ++++ app/src/main/res/values-ja/strings.xml | 16 ++- app/src/main/res/values-ms/strings.xml | 3 + app/src/main/res/values-ne/strings.xml | 5 +- app/src/main/res/values-pa/strings.xml | 6 +- app/src/main/res/values-si/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 40 ++++++- app/src/main/res/values-zgh/strings.xml | 4 +- app/src/main/res/values-zh/strings.xml | 11 ++ 13 files changed, 276 insertions(+), 26 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 095d84f36d3..a2bb4ae8522 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -139,6 +139,7 @@ Вашыя мовы Вікіпедыі Апублікаваць змены Праўка апублікавана! + Праўка апублікаваная! У хуткім часе змяненні з’явяцца. Праўка не апублікавана! Паўтарыць Скасаваць @@ -181,6 +182,9 @@ Вы выйшлі з уліковага запісу Вікіпедыі. Хочаце ўвайсці зноў? Увайсці Скасаваць + Выдаліць уліковы запіс + Папярэджанне аб выдаленні ўліковага запісу + Выдаленне з’яўляецца <b>апошнім сродкам/b> і мусіць <b> выкарыстоўвацца толькі ў тым выпадку, калі вы хочаце назаўсёды спыніць праўленне, а таксама схаваць як мага больш сваіх мінулых сувязяў.<br/><br/>Выдаленне ўліковага запісу ў Вікіпедыі здзяйсняецца шляхам змянення: пазначце імя вашага ўліковага запісу, каб іншыя карыстальнікі не маглі спазнаць ваш унёсак у працэсе, які мае назву выдаленне ўліковага запісу. <b>Выдаленне не гарантуе поўнай ананімнасці і не выдаляе ўнёскі ў праекты</b>. Няма нядаўна прагледжаных артыкулаў Сачыць за тым, што вы ўжо прачыталі. Некаторыя артыкулы ў гісторыі могуць быць недаступныя па-за сеткай. @@ -252,15 +256,15 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.be https://creativecommons.org/publicdomain/zero/1.0/deed.be - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags Выкарыстаныя бібліятэкі Суаўтары <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Старонка каманды</a> Перакладчыкі Гэты дадатак быў перакладзены валанцёрамі <a href=\"https://translatewiki.net\">translatewiki.net</a>. Ліцэнзія - Зыходны код даступны на <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> і <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> паводле ліцэнзіі <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0 License</a>. Калі не пазначана іншае, змесціва даступна паводле ліцэнзіі <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Attribution-ShareAlike License</a>. + Зыходны код даступны на <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">Github</a> пад ліцэнзіяй <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0</a>. Калі не азначана іншае, змесціва даступна ў адпаведнасці з ліцэнзіяй <a href=\"https://creativecommons.org/licenses/by-sa/4.0/deed.ru\">Creative Commons Attribution-ShareAlike</a>. Прадукт <a href=\"https://wikimediafoundation.org/\">Фонду Вікімедыа</a> Пра дадатак Старонка была зменена. Вы ўпэўненыя, што жадаеце выйсці без захавання зменаў? @@ -292,6 +296,8 @@ Дададзены спасылкі Іншае Іншыя спосабы, якімі вы палепшылі старонку + Дададзена кароткае апісанне + Абноўлена кароткае апісанне Канфлікт правак Старонка ўжо была зменена іншым удзельнікам і канфліктуе з вашай праўкай. Калі ласка, скапіюйце свае праўкі, вярніцеся і абнавіце старонку, затым паспрабуйце правіць яшчэ раз. Заўвагі да правак @@ -328,6 +334,8 @@ Абраная старонка Вікіпедыі Абраная старонка дня: Знайсці ў Вікіпедыі + Найхуткі спосаб пошуку ў Вікіпедыі + Найлепшыя артыкулы, якія можа прапанаваць Вікіпедыя Ніякіх азначэнняў не знойдзена. Даступна новае абнаўленне альфа-версіі Націсніце, каб спампаваць @@ -413,6 +421,11 @@ %d абрана Адбылася памылка Закрыць + Чытаць + Захаваць + Захавана + Падзяліцца + Гэты артыкул з’яўляецца незавершаным, што значыць, што ў ім недастаткова змесціва для папярэдняга прагляду. Аднак вы можаце гэта змяніць. Няма такой старонкі Вікіпедыя не мае <a href=\"%1$s\">старонкі карыстальніка</a> з такой дакладнай назвай. Увогуле, гэтая старонка павінна быць створана і адрэдагавана <b>%2$s</b>. Калі вы сумняваецеся, пераканайцеся, што \"%3$s\" існуе. Немагчыма падлучыцца да Інтэрнэту @@ -435,6 +448,29 @@ Вы можаце звязацца з <a href=\"%2$s\">%1$s</a> або з іншым <a href=\"https://be.wikipedia.org/wiki/Вікіпедыя: Адміністратары\">адміністратарам</a>, каб абмеркаваць блакіроўку. Наладзьце панэль інструментаў Вы можаце звязацца з <a href=\"https://be.wikipedia.org/wiki/Вікіпедыя: Адміністратары\">адміністратарам</a>, каб абмеркаваць блакіроўку. + Вы не ўвайшлі ў сістэму + Пасля ўнясення змяненняў для вас будзе створаны <b>часовы ўліковы запіс</b> для абароны вашай канфідэнцыяльнасці. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Даведайцеся больш</a> .<br /><br /> <a href=\"https://#login\">Увайдзіце ў сістэму</a> або <a href=\"https://#login\">стварыце ўліковы запіс</a>, каб вашыя будучыя праўкі былі ўлічаныя і атрымаць доступ да іншых функцый. + Вашае змяненне будзе аднесена да %1$s . Ваш IP-адрас будзе бачным для адміністратараў.<br /><br /> Калі вы <a href=\"https://#login\">ўвойдзеце ў сістэму/a> або <a href=\"https://#login\">створыце ўліковы запіс</a>, вашыя змяненні будуць спалучынімі з абраным вамі імем, апроч іншых пераваг. + Зразумела + Вы выкарыстоўваеце часовы ўліковы запіс + Скасаваць змяненні і ўвайсці ў сістэму + + Часовы ўліковы запіс %1$s быў створаны, пасля чаго вашыя праўкі апублікаваліся. Тэрмін дзеяння скончыцца праз %2$d дзень. + Часовы ўліковы запіс %1$s быў створаны, пасля чаго вашыя праўкі апублікаваліся. Тэрмін дзеяння скончыцца праз %2$d дні. + Часовы ўліковы запіс %1$s быў створаны, пасля чаго вашыя праўкі апублікаваліся. Тэрмін дзеяння скончыцца праз %2$d дзён. + Часовы ўліковы запіс %1$s быў створаны, пасля чаго вашыя праўкі апублікаваліся. Тэрмін дзеяння скончыцца праз %2$d дзён. + + + Тэрмін дзеяння вашага ўліковага запісу скончыцца праз %d дзень.. + Тэрмін дзеяння вашага ўліковага запісу скончыцца праз %d дні.. + Тэрмін дзеяння вашага ўліковага запісу скончыцца праз %d дзён.. + Тэрмін дзеяння вашага ўліковага запісу скончыцца праз %d дзён.. + + <b>Вы не ўвайшлі ў сістэму.</b> Пасля ўнясення змяненняў для вас будзе створаны часовы ўліковы запіс для абароны вашай канфідэнцыяльнасці. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Даведацца больш</a> + <b>Вы выкарыстоўваеце часовы ўліковы запіс.</b> Вашае змяненне будзе аднесена да %1$s . <a href=\"<span class=\"notranslate\" translate=\"no\">%2$s \">Даведацца больш</a> . + <b>На бягучы момант вы выкарыстоўваеце часовы ўліковы запіс.</b> Змяненні, якія ўносяцца з дапамогай часовага ўліковага запісу %1$s не будуць перанесенымі ў ваш пастаянны ўліковы запіс пры ўваходзе ў сістэму. Увайдзіце ў сістэму або стварыце ўліковы запіс, каб уносіць змяненні пад сваім імем, апроч іншых пераваг. + Скончыць сеанс + Гэта прывядзе да выхаду з вашага часовага ўліковага запісу. Вы хочаце працягнуць? Памылка праграмы На жаль, у праграме Вікіпедыі адбылася памылка, і яна была закрыта.\n\nХочаце запусціць яе зноў або выйсці? Перазапусціць @@ -811,8 +847,8 @@ Зняць адзнакі са ўсіх элементаў Вікі фільтр Тып фільтра - Усе \"вікі\" - Усе \"тыпы\" + Усе Вікі + Усе тыпы Старонка для размоў %s Функцыя недаступная пакуль вы знаходзіцеся па-за сеткай Праз тое, што вы чыталі @@ -873,6 +909,12 @@ Скасаваць Вы дасягнулі канца стужкі Загрузіць больш + Абярыце рэгіянальны моўны варыянт для паляпшэння якасці чытання + На дадзены момант вы выкарыстоўваеце агульны кітайскі варыянт мовы, якія не падтрымліваецца ў якасці асноўнай мовы Вікіпедыі + Захаваць + Калі ласка, абнавіце спіс сваіх другасных моў + На дадзены момант вы выкарыстоўваеце агульны варыянт кітайскай мовы ў якасці другаснай мовы. Калі ласка, перайдзіце да наладаў, каб абраць новую другасную мову або пацвердзіць ваш спіс моў. + Перайсці да наладаў Найбольш чытанае з %s Укладкі Апісанне артыкула @@ -901,8 +943,8 @@ Галасавы ўвод Даведайцеся больш пра апісанні артыкулаў Даведайцеся больш пра подпісы выяў - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Тэкст занадта кароткі. Тэкст не павінен сканчацца знакамі прыпынку. Пачынайце з маленькай літары, калі толькі першае слова не з’яўляецца імем уласным. @@ -1141,8 +1183,8 @@ Так Не Не ўпэўнены - Чаму не? - Вашы адказы паляпшаюць будучыя прапановы. + Прычына адхілення + Прычына адхілення з’яўляецца ананімнай і дазволіць палепшыць будучыя прапановы відарысаў. Відарыс недарэчны Недастаткова інфармацыі, каб прыняць рашэнне Відарыс абразлівы @@ -1189,6 +1231,8 @@ Вандруйце ў прасторах Вікіпедыі з шторазова абнаўляльнай стужкай Агляду. <br/> <b>Наладзьце</b> стужку адпаведна вашым зацікаўленасцям — няхай гэта будзе вывучэнне гістарычных падзей <b>У гэты дзень</b>, або шукайце нешта новае з <b>Выпадковым артыкулам</b>. Спісы для чытання з сінхранізацыяй Вы можаце складаць спісы для чытання з артыкулаў, якія вы хочаце прачытаць пазней, нават калі вы знаходзіцеся ў пазасеткавым рэжыме. <br/>Увайдзіце ў свой уліковы запіс Вікіпедыі, каб сінхранізаваць свае спісы для чытання. <a href=\"#login\">Далучайцеся да Вікіпедыі</a> + Даныя і прыватнасць + Мы мяркуем, што вы не павінны падаваць персанальныя даныя дзеля ўдзелу ў руху свабодных ведаў. Даныя аб выкарыстанні, якія збіраюцца для гэтай праграмы, з’яўляюцца ананімнымі. Даведайцеся больш у нашай <a href=\"#privacy\">палітыцы прыватнасці</a> і <a href=\"#termsOfUse\">умовах выкарыстання</a>. Адправіць даныя пра выкарыстанне Зразумела Мы знайшлі наступнае на вашай прыладзе: @@ -1294,6 +1338,15 @@ Вышыня пкс Уставіць + Пошук шаблонаў + Уставіць + напрыклад, %s + %s (неабавязкова) + %s (прапанавана) + Даведацца больш + Шаблоны ствараюцца карыстальнікамі і могуць не мець поўнага апісання. + Шаблон \"%s\" яшчэ не мае апісання. + У гэтым шаблоне адсутнічаюць <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">звесткі пра шаблон</a>, а ягоныя параметры былі <a href=\"<span class=\"notranslate\" translate=\"no\">%2$s \">аўтаматычна створаныя</a>. У выніку ў шаблона і ягоных параметраў адсутнічаюць апісанні. Даведка Увайсці / далучыцца да Вікіпедыі Вітаем %s! Ці вы ведалі, што кожны можа правіць у Вікіпедыі? @@ -1317,8 +1370,10 @@ Назва паведамлення Апублікаваць Скасаваць + Не захоўваць Паведамленне апублікавана на старонцы абмеркавання карыстальніка Паведамленне захавана і апублікавана на старонцы абмеркавання карыстальніка + Захаваныя паведамленні Гэтая старонка размовы пустая. Размова пачынаецца тут Старонкі размоў – месца, дзе людзі абмяркоўваюць як зрабіць змест Вікіпедыі як мага лепей. Пачніце з дадавання новай тэмы для размовы, каб устанавіць сувязь і супрацоўнічаць з супольнасцю вікіпедыстаў. @@ -1329,6 +1384,7 @@ Напісаць паведамленне Паведамленне не можа быць пустым. Тэма не можа быць пустой. + Назва суб’екта ўжо існуе. Увядзіце іншае. Адказ апублікаваны. Скасаваць <b>Апошняя праўка %1$s</b> за %2$s @@ -1516,6 +1572,8 @@ Памылка прайгравання мультымедыя. Уклад Фільтр укладу + Паглядзець на мапе + Геаграфічныя каардынаты недаступныя для гэтай старонкі Імпартаваць спіс для чытання Як бы вы хацелі назваць спіс, якім з вамі падзяліліся? *новы* @@ -1528,7 +1586,7 @@ Прывітанне! Я хацеў бы падзяліцца з вамі сваім спісам для чытання ў Вікіпедыі: Ці не маглі б вы дапамагчы нам палепшыць \"Падзяліцца спісам для чытання\"? \"Падзяліцца спісам для чытання\" – гэта тэставая функцыя, і нам патрабуюцца вашыя водгукі, каб палепшыць або выдаліць яе. - У вас няма захаваных папярэджанняў. + Стварыце свае паведамленні або скарыстайцеся <a href=\"#\">узорнымі паведамленнямі</a>, каб пачаць. Новае паведамленне Тэма Напісаць паведамленне @@ -1544,8 +1602,22 @@ Захаваць Выдаліць Паведамленне захавана - Паведамленне выдалена + Выдаліць паведамленне + + Ці вы перакананыя, што хочаце выдаліць паведамленне з гэтага спісу? + Ці вы перакананыя, што хочаце выдаліць паведамленні з гэтага спісу? + Ці вы перакананыя, што хочаце выдаліць паведамленні з гэтага спісу? + Ці вы перакананыя, што хочаце выдаліць паведамленні з гэтага спісу? + + + Паведамленне выдалена + Паведамленні выдаленыя + Паведамленні выдаленыя + Паведамленні выдаленыя + Тэма не можа быць пустой. + Вашыя паведамленні + Узорныя паведамленні Пошук або фільтр правак Тэгі: %s Няма @@ -1621,6 +1693,8 @@ Бачыце прадуктыўную праўку? Дзякуй карыстальнікам за іх уклад. Назіраць Хочаце адсочваць праўкі артыкулаў? Дадайце ў свой спіс назірання. Праглядзіце яго ў раздзеле \"Яшчэ\". + Абмеркаванне + Камунікуйце з іншымі праўнікамі. Захоўвайце часта выкарыстальныя паведамленні або выкарыстайце шаблон. Адмена/Адкат Выберыце \"Адкаціць\" для скасавання або адкату патэнцыйна разбуральнай праўкі. \"Пашкоджанне\" прадказвае, калі праўка прычыняе шкоду ў вікі. @@ -1631,10 +1705,34 @@ Абыякавы Незадаволены Як мы можам палепшыць функцыю? + Гісторыя праўкі артыкула Зваротная сувязь Адправіць Водгук адпраўлены. Націсніце на дадатковае меню, каб у любы час адправіць водгук у раздзеле \"Праблема з функцыяй\". + Папярэджанне аб вандалізме + Праўленне тэстаў + Нейтральны пункт гледжання + Аўтаматычны пераклад + Напамін пра канфлікт інтарэсаў + Апошняе папярэджанне + Папярэджанне аб парушэнні аўтарскага права + Пакінуць апісанні праўкі + Не цэнзураваць + Прапанова аб паляпшэнні артыкула + Прывітанне {{{username}}}, я хачу паведаміць вам, што я вярнуў адну або болей вашых [{{{diffLink}}}|нядаўніх унёскаў], бо яны не выглядаюць канструктыўнымі. Калі вы думаеце, што я памыліўся або ў вас ёсць пытанні, вы можаце пакінуць паведамленне ў [[User talk:{{{senderUserName}}}|маёй старонцы абмеркаванняў]]. Звярніце ўвагу, што працяг вандалізму можа прывесці да абмежаванняў. + Прывітанне, {{{username}}}, я рады, што Вікіпедыя прыцягнула вашу ўвагу і што вам было цікава навучыцца правіць у ёй. Праведзены вамі тэст правак спрацаваў; аднак вы павінны мець на ўвазе, што мэта гэтага праекта — распрацаваць надзейную і поўную энцыклапедыю, з якой кожны можа азнаёміцца. Ваша праўка паўплывала на змесціва, таму яно было выдалена.\nКалі вы хочаце навучыцца рабіць праўкі ў Вікіпедыі, у вашым распараджэнні [[Wikipedia:Sandbox|пясочніца]]. Калі вашы каментары датычыліся артыкула, правільным месцам будзе старонка абмеркавання гэтага артыкула. + Прывітанне, {{{username}}}, некаторыя зробленыя вамі ўнёскі не адпавядаюць патрабаванням нейтральнасці, неабходным для захавання [[Wikipedia:NPOV|нейтральнага пункту гледжання]] палітыкі Вікіпедыі. Па гэтай прычыне некаторае змесціва было зменена або выдалена. Калі ласка, змяніце абзацы або раздзелы, якія паказваюць асобны пункт гледжання, замяніўшы іх больш нейтральным і аб’ектыўным тэкстам у адпаведнасці з тым, што чакаецца ў энцыклапедыі. + Прывітанне, {{{username}}}, некаторыя вашыя ўнёскі, магчыма, з’яўляюцца машыннымі перакладамі, таму яны былі зменены або пазначаны шаблонам. Калі ў артыкул не ўнесены паляпшэнні, ён можа быць выдалены.\n\nКалі, нягледзячы на ўсю гэтую інфармацыю, у вас застаюцца пытанні, не саромейцеся пакінуць паведамленне на [[User talk:{{{senderUserName} }}|маёй старонцы абмеркаванняў]]. Не адчайвайцеся ад гэтага невялікага здарэння. Ваш унёсак вельмі важны для Вікіпедыі. + Прывітанне, {{{username}}}, я цаню вашае супрацоўніцтва ў Вікіпедыі; Тым не менш, я заўважыў, што вы знаходзіцеся ў [[Wikipedia:Conflict_of_interest|канфлікце інтарэсаў]]. Канфлікт інтарэсаў — гэта несумяшчальнасць паміж мэтамі Вікіпедыі па нейтральнасці і надзейнасці і канкрэтнымі мэтамі некаторых праўнікаў, фізічных асоб, арганізацый або кампаній усялякага тыпу.\n\nУсе ўнёскі ў асноўнай прасторы падпарадкоўваюцца палітыцы крытэрыяў змесціва гэтай Вікіпедыі, а менавіта ([[Wikipedia:What_Wikipedia_is_not|крытэрый неадпаведнасці Вікіпедыі]]), ([[Wikipedia:Verifiability|праверанасці энцыклапедычнай якасці) ]], [[Wikipedia:No_original_research|адсутнасці арыгінальных даследаванняў]]), ([[Wikipedia:Neutral_point_of_view|нейтральнасці пункту гледжання]]) і законнасці зместу ([[Wikipedia:Copyrights|аўтарскія правы]]). Чакаецца, што ўсе выдаўцы будуць прытрымлівацца гэтых палітык пры стварэнні і ацэнцы кантэнту, а таксама паважаць і добрасумленна ставіцца да дзеянняў іншых выдаўцоў, каб пераканацца, што гэтыя палітыкі выконваюцца.\n\nКалі вы робіце праўкі з-за канфлікту інтарэсаў, вы павінны ўжываць адпаведную палітыку з асаблівай асцярожнасцю; У адваротным выпадку ваш уліковы запіс можа быць прызнаны прыватным і заблакіраваны. Не саромейцеся звяртацца на маю старонку абмеркавання, калі ў вас ёсць якія-небудзь пытанні. + Паколькі вы зрабілі некалькі дэструктыўных правак, гэта будзе вашым апошнім папярэджаннем. Калі вы зноў будзеце бясчынстваваць ў Вікіпедыі, вам будзе забаронена рабіць праўкі. + Ваша нядаўняя праўка, здаецца, уключае матэрыялы, абароненыя аўтарскім правам, без дазволу. Пераканайцеся, што ўвесь кантэнт адпавядае палітыцы [[Wikipedia:Copyrights|аўтарскіх правоў]] гэтай Вікіпедыі, каб пазбегнуць выдалення. + Прывітанне, {{{username}}}, здаецца, вы выдалілі змесціва з Вікіпедыі, не пакінуўшы апісанне праўкі. Калі ласка, пакідайце апісанне кожны раз, калі вы дадаяце або выдаляеце змесціва ў Вікіпедыі. + Прывітанне, {{{username}}}, здаецца, вы выдалілі змесціва, не абмяркоўваючы яго на старонцы абмеркавання артыкула. Калі ласка, звярніце ўвагу, што Вікіпедыя не падвяргаецца цэнзуры, і змесціва не павінна быць выдалена, таму што яно выклікае спрэчкі. Калі вы лічыце, што інфармацыя недакладная, дасягніце кансэнсусу на старонцы абмеркавання артыкула. + Даведайцеся пра запаўняльнікі паведамленняў + Выкарыстоўваеце ўзорныя паведамленні ніжэй, каб наладзіць, адправіць і захаваць вашыя паведамленні. + Прывітанне, {{{username}}}. Ваш артыкул — выдатны пачатак! Каб зрабіць гэта яшчэ лепш, падумайце аб даданні большай колькасці спасылак на надзейныя крыніцы. Гэта дапамагае праверыць інфармацыю і паляпшае якасць артыкула. Каб атрымаць больш падрабязную інфармацыю, азнаёмцеся з рэкамендацыямі Вікіпедыі па [[Wikipedia:Reliable_sources|надзейных крыніцах]]. + Правіць Прыняць Адхіліць Праблемы старонкі @@ -1647,4 +1745,34 @@ Дзякуй, дарагі донар! Ваша шчодрасць дапамагае Вікіпедыі і роднасным сайтам развівацца. Вярнуцца Адкрыць у сістэмным браўзеры + Ахвяраваць з дапамогай Google Pay? + Ахвяруйце з дапамогай Google Pay або выберыце іншы спосаб аплаты. + Ахвяраваць праз Google Pay + Іншы спосаб аплаты + Выберыце суму + Я шчодра дадам %s, каб пакрыць камісію за транзакцыю, каб вы маглі пакінуць 100%% майго ахвяравання. + Зрабіце гэтае штомесячнае перыядычнае ахвяраванне. + Так, Фонд Вікіпедыі можа час ад часу дасылаць мне электронныя лісты. + Калі ласка, выберыце суму (мінімум %s) + Мы не можам прымаць ахвяраванні, якія перавышаюць %s праз нашу праграму. Калі ласка, звяжыцеся з нашым галоўным аддзелам падарункаў па адрасе эл.пошты benefactors@wikimedia.org. + <b>Дзякуй!</b> Ваша шчодрасць да Вікіпедыі так шмат значыць для нас. + Праблемы з ахвяраваннем? + Іншыя спосабы зрабіць ахвяраванне + Частыя пытанні + Інфармацыя аб вызваленні ахвяраванняў ад падаткаў + Месцы + Каб бачыць ваша месцазнаходжанне на мапе, патрабуецца дазвол на вызначэнне месцазнаходжання. Калі ласка, паспрабуйце яшчэ раз. + Пошук месцаў + Фільтраваць па мовам + Мапа + Спіс + Даследуйце артыкулы Вікіпедыі вакол вас з дапамогаю Месцаў + Націсніце «Паглядзець на мапе», каб даведацца пра месцазнаходжанне гэтага артыкула + Вельмі задаволены + Вельмі незадаволены + Дапамажыце палепшыць \"Месцы\" + Як можна палепшыць \"Месцы\"? + Скасаваць + Што б вы хацелі змяніць або палепшыць? + Гэтая зона пустая. Паменшыць <a href=\"#\">маштаб мапы</a> . diff --git a/app/src/main/res/values-ce/strings.xml b/app/src/main/res/values-ce/strings.xml index 11f076797f8..bd2982677de 100644 --- a/app/src/main/res/values-ce/strings.xml +++ b/app/src/main/res/values-ce/strings.xml @@ -148,7 +148,7 @@ ХӀокху агӀонах лаьцна Файлан агӀонг гӀо Сурт гучудаккха цаделира - Лицензин йоза %s библиотекина + Лицензин текст %s библиотекина Видео йолайалита цайелира. ХӀаъ ХӀан-хӀа diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 4aa1d1e1c7e..7c5ba59159c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -24,6 +24,7 @@ * DarkGames26 * David.novella * Dbrant +* Descubriunaisla * Destinid10 2 * Dgstranz * DiegoAmbrocio @@ -349,6 +350,12 @@ Rehacer Revertir Advertir + Daño %s + Intención %s + + %s byte + %s bytes + Acercar Alejar Ortografía corregida @@ -356,6 +363,8 @@ Enlaces añadidos Otro Otras formas en las que has mejorado la página + Descripción corta añadida + Descripción corta actualizada Conflicto de edición Otro usuario ya ha modificado la página y ello interfiere con tu edición. Copia tus cambios, vuelve atrás y actualiza la página. A continuación, intenta editar de nuevo. Avisos de edición @@ -619,6 +628,11 @@ %d lista eliminada %d listas eliminadas + La lista predeterminada (%s) no puede ser eliminada + %1$s eliminado. La lista predeterminada (%2$s) no puede ser eliminada. + Listas eliminadas. La lista predeterminada ( %s ) no puede ser eliminada. + %s (lista de lectura de Wikipedia).json + Listas de lectura de Wikipedia (%s y más).json %d artículos eliminados de la lista %s eliminado de las listas Deshacer @@ -651,6 +665,11 @@ Se añadieron %1$d artículos a %2$s %1$d artículos movidos a %2$s ¿Confirmas que quieres eliminar %s? + Eliminar la(s) lista(s) seleccionada(s)? + + ¿Estás seguro de que deseas eliminar la lista de %d? + ¿Estás seguro de que deseas eliminar las listas de %d? + Accede para activar la sincronización Accede a tu cuenta para permitir que se guarden tus listas de lectura. Cancelar @@ -674,6 +693,7 @@ No se pueden añadir elementos a esta lista. Se alcanzó el límite de %2$d artículos por lista para «%1$s». No se puede crear otra lista. Se alcanzó el límite de 100 listas de lectura por cuenta. Crear lista nueva + Importar lista Ordenar por Recargar sincronización Acceder/crear cuenta @@ -696,6 +716,8 @@ Aceptar Eliminar Lista de lectura: %s + Lista(s) de lectura exportadas + %d Las listas de lectura se han exportado como \'reading_lists export.json\' a su carpeta de descargas. Lista compartida Guardar Guardar lista @@ -1302,7 +1324,16 @@ Empezar Wikipedia - discusiones en página de discusión Temas de búsqueda - Subscribirse + Buscar en el tema de página de discusión + + Mostrar respuesta + Mostrar respuestas (%d) + + + Ocultar respuesta + Ocultar respuestas (%d) + + Suscribirse Compartir Icono de usuario Leer @@ -1312,7 +1343,11 @@ Compartir edición Contribuciones de %s Editar código + Buscar en el tema de página de discusión Copiar enlace en el portapapeles + Copiar texto + Expandir hilos + Contraer hilos Vigilando Vigilar Siguiente edición @@ -1340,6 +1375,7 @@ Esto deshará los cambios realizados por la(s) revisión(es) del artículo mostrado aquí. Comparte el motivo de la reversión: La revisión se deshizo. + Comparar %1$s y su página de discusión han sido añadidos a tu lista de seguimiento %2$s. Cambiar permanentemente diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 64d91b71267..5be7bef2847 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -327,6 +327,7 @@ Չեղարկել Լավ Չեղարկել + Հիշել Հոդված Պատկերի նկարագրություն Պատկերի նկարագրություն diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 55f006d1008..30e7455d322 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1520,6 +1520,8 @@ Contributori che hanno effettuato l\'accesso. Nuovi utenti Principianti + Utenti con esperienza + Utenti registrati con più di 500 modifiche e 30 giorni di attività. Contributi automatici Bot Umani (non bot) @@ -1529,8 +1531,16 @@ Potrebbe avere problemi Probabilmente ha problemi Molto probabilmente ha problemi + Previsioni delle intenzioni dell\'utente + Molto probabilmente in buona fede + Molto preciso nel trovare quasi tutte le modifiche in buona fede. + Potrebbe essere in malafede + Trova la maggior parte delle modifiche in malafede, ma con una precisione inferiore. Probabile in malafede + Con una precisione media, trova una frazione intermedia di modifiche in malafede. Molto probabilmente in mala fede + Molto accurato nel trovare le modifiche in malafede più evidenti. + Prova a rimuovere %s per vedere più modifiche %d filtro %d filtri @@ -1543,6 +1553,7 @@ Discussione Annulla/Ripristina Scegli \"Annulla\" per annullare o ripristinare una modifica potenzialmente distruttiva. + Aiutaci a migliorare questa funzionalità Sei soddisfatto di questa funzionalità? Soddisfatto Neutrale @@ -1554,10 +1565,14 @@ Punto di vista neutrale Traduzione automatica Avviso finale + Avviso di violazione di copyright + Non censurare Suggerimento per il miglioramento della voce Modifica Accetta Rifiuta + Problemi della pagina + Correzioni di bug minori e miglioramenti Te lo ricorderemo di nuovo domani. Grazie a te che hai donato! La tua generosità aiuta a far crescere Wikipedia e i suoi siti correlati. Torna indietro @@ -1566,15 +1581,24 @@ Dona con Google Pay o scegli un altro metodo di pagamento. Dona con Google Pay Altro metodo di pagamento + Seleziona un importo Rendila una donazione mensile ricorrente. + Sì, la Wikimedia Foundation può mandarmi delle email occasionali. Si prega di selezionare un importo (minimo %s) + Non possiamo accettare donazioni oltre %s tramite la nostra app. Si prega di contattare lo staff per le donazioni importanti all\'indirizzo benefactors@wikimedia.org. <b>Grazie!</b> La tua generosità verso Wikipedia significa molto per noi. Problemi con la donazione? + Altri modi per donare Domande frequenti Informazioni di deducibilità fiscale + Luoghi Mappa Scopri le voci di Wikipedia intorno a te con Luoghi Tocca \"Visualizza sulla mappa\" per esplorare la posizione di questa voce + Molto soddisfatto + Molto insoddisfatto Aiuta a migliorare \'Luoghi\' + Come possiamo migliorare \"Luoghi\"? Annulla + Cosa vorresti che cambiassimo o migliorassimo? diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 08936057044..22450879b5b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -175,6 +175,7 @@ ウィキペディアの言語 変更を公開 公開しました! + 編集を公開しました!変更の反映に時間がかかる場合があります。 編集に失敗しました! 再試行 キャンセル @@ -858,6 +859,8 @@ キャンセル フィード一覧はこれで最後です。 さらに読み込む + 保存 + 設定に移動 %sのよく読まれている記事 タブ 記事の説明 @@ -1108,8 +1111,8 @@ はい いいえ わからない - なぜだめですか? - あなたの回答により、将来の提案が改善されます。 + 却下の理由 + 却下の理由は匿名で、将来の画像提案が改善されます。 関連する画像ではありません 判断するのに十分な情報がありません 不快な画像です @@ -1258,6 +1261,8 @@ 高さ ピクセル 挿入 + テンプレートを検索 + 挿入 例: %s %s (省略可能) 詳細 @@ -1284,8 +1289,10 @@ メッセージのタイトル 公開 キャンセル + 保存しない メッセージが編集者の利用者トークページに公開されました メッセージが保存され編集者の利用者トークページに公開されました + 保存されたメッセージ トークページは空です。 議論を始める ノートページはウィキペディアのコンテンツを改善する方法について議論する場所です。新しい議論の話題を追加することから、ウィキペディア編集者のコミュニティと共同作業をはじめましょう。 @@ -1296,6 +1303,7 @@ メッセージを作成する メッセージを空にすることはできません。 件名を空にすることはできません。 + 既に存在する題名です。別の名前を試してください。 返信が送信されました。 取り消す <b>最終編集 %1$s</b> 編集者: %2$s @@ -1488,7 +1496,7 @@ こんにちは!私の閲覧リストを共有します。 「閲覧リストの共有」機能の改善にご協力いただけませんか? 「閲覧リストの共有」は実験的な機能であり、改善または棄却のためフィードバックを必要としています。 - 警告メッセージが何も保存されていません。 + 自分のメッセージを作成するか <a href=\"#\">メッセージの例</a> を使って始めます。 新しいメッセージ 件名 メッセージを作成 @@ -1512,6 +1520,8 @@ メッセージが削除されました タイトルを空にすることはできません。 + あなたのメッセージ + メッセージの例 編集を検索または絞り込む タグ: %s なし diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index c5b7b4c4bf3..8c93bfb76a5 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -246,8 +246,11 @@ https://foundation.m.wikimedia.org/wiki/Terms_of_Use https://ms.wikipedia.org/wiki/Wikipedia:Permohonan_akaun https://creativecommons.org/publicdomain/zero/1.0/deed.ms + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags Perpustakaan yang digunakan Penyumbang + <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team page</a> Penterjemah Aplikasi ini diterjemah oleh para penterjemah sukarela di <a href=\"https://translatewiki.net\">translatewiki.net</a>. Lesen diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index d471378fb68..273a3a4f960 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -107,7 +107,7 @@ अर्को भाषामा पढ्नुहोस् अरू %d ओटा भाषाहरूमा उपलब्ध CC BY-SA ४.० - सङ्ग्रह गरेर तपाईँ <a href=\"%1$s\">प्रयोगका सर्तहरू</a>मा सहमत हुनुहुन्छ र आफ्ना योगदानहरू अपरिवर्तनीय रूपमा <a href=\"%2$s\">CC BY-SA 3.0</a> इजाजतपत्र अन्तर्गत प्रकाशन गर्नुहुन्छ। + सङ्ग्रह गरेर तपाईँ <a href=\"%1$s\">प्रयोगका सर्तहरू</a>मा सहमत हुनुहुन्छ र आफ्ना योगदानहरू अपरिवर्तनीय रूपमा <a href=\"%2$s\">CC BY-SA 4.0</a> इजाजतपत्र अन्तर्गत प्रकाशन गर्नुहुन्छ। प्रकाशन गरेर तपाईँ <a href=\"%1$s\">प्रयोगका सर्तहरू</a>मा सहमत हुनुहुन्छ र आफ्ना योगदानहरू अपरिवर्तनीय रूपमा <a href=\"%2$s\">CC BY-SA 3.0</a> इजाजतपत्र अन्तर्गत प्रकाशन गर्नुहुन्छ। सम्पादनहरू तपाईँको उपकरणको आइपओ ठेगानामा एट्रिब्युट गरिनेछन् । यदि <a href=\"https://#login\">लग इन</a>, गर्नु भयो भने राम्रो गोपनियता प्राप्त हुनसक्छ। विकिपिडिया भाषाहरू खोज्नुहोस् @@ -117,6 +117,7 @@ तपाईंको विकिपिडिया भाषाहरू परिवर्तनहरू प्रकाशित गर्नुहोस् प्रकाशित भएकोलाई सम्पादन गर्नुहोस्! + सम्पादन प्रकाशित भयो! परिवर्तनहरू देखा पर्न समय लाग्न सक्छ। सम्पादन असफल भयो! पुनः प्रयास गर्नुहोस् रद्द गर्नुहोस् @@ -159,6 +160,8 @@ तपाईं विकिपिडियाबाट निर्गमन गरिनु भएको छ। के फेरि प्रवेश गर्न चाहनुहुन्छ? प्रवेग रद्द गर्नुहोस् + खाता नष्ट + खाताको चेतावनी समाप्त गर्नुहोस् भर्खरै हेरिएको कुनै पनि लेख छैन आफूले पढिरहेका कुराहरूलाई यहाँबाट पहिल्याउनुहोस्। केही इतिहासका लेखहरू अफलाइन भएको बेला हेर्न मिल्दैन। diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index a960b093acb..eb864d2d960 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -124,7 +124,7 @@ ਹੋਰ ਬੋਲੀਆਂ ਤੁਹਾਡੀਆਂ ਵਿਕੀਪੀਡੀਆ ਭਾਸ਼ਾਵਾਂ ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ - ਸੋਧ ਪ੍ਰਕਾਸ਼ਿਤ ਕੀਤੀ ਗਈ! + ਸੋਧ ਛਾਪ ਦਿੱਤੀ ਗਈ! ਸੋਧ ਅਸਫਲ ਹੋਈ! ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ ਰੱਦ ਕਰੋ @@ -289,7 +289,7 @@ ਬੰਦ ਕਰੋ ਤਸਵੀਰਾਂ ਵੇਖੋ ਸਿਰਫ਼ ਵਾਈ-ਫਾਈ \'ਤੇ ਡਾਊਨਲੋਡ ਕਰੋ - ਮੋਬਾਈਲ ਡਾਟਾ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਡਾਊਨਲੋਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ? + ਮੋਬਾਈਲ ਡੇਟਾ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਉਤਾਰੇ ਦੀ ਤਸਦੀਕ ਕਰੋ? ਇਜਾਜ਼ਤ ਦਿਓ ਹੋਰ ਪੜ੍ਹੋ ਇਸ ਲੇਖ ਬਾਰੇ @@ -385,7 +385,7 @@ ਹੋਰ ਪੜ੍ਹੋ ਕੋਈ ਹੋਰ ਬੇਤਰਤੀਬ ਲੇਖ ਲੋਡ ਕਰੋ ਵਿਕੀਪੀਡੀਆ \'ਤੇ ਅੱਜ - ਮੁੱਢਲਾ ਸਫ਼ਾ ਵੇਖੋ + ਮੁੱਖ ਸਫ਼ਾ ਵੇਖੋ ਦਿਨ ਦੀ ਤਸਵੀਰ ਡਾਊਨਲੋਡ ਇਸ ਕਾਰਡ ਨੂੰ ਓਹਲੇ ਕਰੋ diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index eb2401744b3..a886de3d277 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,5 +1,6 @@ විකිපීඩියා diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4bea16411ad..390410bd16b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -417,6 +417,7 @@ Spara Sparades Dela + Denna artikel är en stubb, vilket innebär att det inte finns tillräckligt med innehåll i artikeln för att kunna generera en förhandsgranskning. Däremot kan du ändra på det. Denna sida finns inte Wikipedia har inte en <a href=\"%1$s\">användarsida</a> med exakt detta namn. I allmänhet bör denna sida ha skapats och redigerats av <b>%2$s</b>. Om du är osäker bör du verifiera att \"%3$s\" finns. Kan inte ansluta till Internet @@ -440,9 +441,15 @@ Anpassa ditt verktygsfält Du kan kontakta en <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administratör</a> för att diskutera blockeringen. Du är inte inloggad + När du har gjort en redigering kommer ett <b>temporärt konto</b> att skapas åt dig för att skydda din integritet. <a href=\"%1$s\">Läs mer</a>.<br /><br /><a href=\"https://#login\">Logga in</a> eller <a href=\"https://#login\">skapa ett konto</a> för att få erkännande för framtida redigeringar och åtkomst till andra funktioner. + Din redigering kommer att tillskrivas %1$s. Din IP-adress kommer att vara synlig för administratörer.<br /><br /> Om du <a href=\"https://#login\">loggar in</a> eller <a href=\"https://#login\">skapar ett konto</a> kommer dina redigeringar att tillskrivas ett valfritt namn, tillsammans med andra förmåner. Jag förstår Du använder ett tillfälligt konto Släng ändringar och logga in + + Det temporära kontot %1$s skapades efter att din redigering publicerades. Det upphör att gälla om %2$d dag. + Det temporära kontot %1$s skapades efter att din redigering publicerades. Den upphör att gälla om %2$d dagar. + Kontot upphör om %d dag. Kontot upphör om %d dagar. @@ -844,6 +851,12 @@ Avbryt Du är nu längst ned i flödet. Läs in fler + Välj en regional språkvariant för en förbättrad läsupplevelse + Du använder för närvarande en generisk språkvariant av kinesiska som inte stöds som ditt primära Wikipedia-språk + Spara + Uppdatera dina sekundära språk + Du använder för närvarande en generisk språkvariant av kinesiska som inte stöds som ett sekundärt språk. Gå till dina inställningar för att välja ett nytt sekundärt språk eller för att bekräfta din språklista. + Gå till inställningarna Mest lästa den %s Flikar Titelbeskrivning @@ -1096,8 +1109,8 @@ Ja Nej Inte säker - Varför inte? - Dina svar förbättrar kvaliteten på framtida förslag. + Anledning till avslag + Din anledning till avslag är anonym och förbättrar kvaliteten på framtida bildförslag. Bilden är inte relevant Inte tillräckligt med information för att avgöra Bilden är kränkande @@ -1117,7 +1130,7 @@ Granska artikeln för att förstå ämnet och inspektera bilden Tyvärr finns det inga fler tillgängliga föreslagna bilder just nu. Var god utforska andra <a href=\"#\">föreslagna redigeringar</a> eller återvänd senare. Problem med funktion - Problem med Föreslagna redigeringar + Problem med redigeringsförslag Lade till ny bild Lade till bildtext Lade till bild och bildtext @@ -1590,6 +1603,8 @@ Har du hittat en produktiv redigering? Tacka en användare för deras bidrag. Bevaka Vill du spåra artikelredigeringar? Lägg till i din bevakningslista. Se den under \"Mer\". + Diskussion + Kommunicera med andra redigerare. Spara vanliga meddelanden på diskussionssidor eller använd en mall. Gör ogjord/Rulla tillbaka Välj \"Gör ogjord\" för att återställa en potentiellt destruktiv redigering. Skada förutsäger om en redigering orsakar skada på en wiki. @@ -1615,6 +1630,10 @@ Lämna en redigeringssammanfattning Censurera inte Förslag på förbättring av artikel + Hej {{{username}}}, jag vill meddela att jag har återställt ett eller flera av dina [{{{diffLink}}}|senaste bidrag] eftersom de inte verkar konstruktiva. Om du tror att jag har gjort ett misstag eller har frågor kan du lämna ett meddelande på [[User talk:{{{senderUserName}}}|min diskussionssida]]. Observera att fortsatt vandalism kan leda till restriktioner. + Hej {{{username}}}, det gläder mig att Wikipedia har fångat din uppmärksamhet och att du har varit intresserad av att lära dig hur man redigerar där. Ditt redigeringstest fungerade, men du bör dock komma ihåg att målet med detta projekt är att utveckla ett tillförlitligt och komplett uppslagsverk som alla kan konsultera. Din redigering påverkade innehållet, så det har tagits bort.\nOm du vill lära dig hur man redigerar på Wikipedia står [[Wikipedia:Sandbox|sandlådan]] till ditt förfogande. Om dina kommentarer var specifika för en artikel är artikelns diskussionssida den korrekta platsen. + Hej {{{username}}}, vissa bidrag du har gjort uppfyller inte den neutralitet som krävs för att följa Wikipedias policy om [[Wikipedia:NPOV|en neutrala synvinkel]]. Av denna anledning har en del innehåll ändrats eller tagits bort. Ändra de stycken eller avsnitt som visar en partiell synvinkel, ersätt dem med en mer neutral och objektiv text i linje med vad som förväntas i ett uppslagsverk. + Hej {{{username}}}, några bidrag du har gjort är möjligen maskinöversättningar vilket av denna anledning har ändrats eller markerats med mallen. Om inga förbättringar görs i artikeln kan den komma att raderas.\n\nOm du trots all denna information fortfarande har några frågor får du gärna lämna ett meddelande på [[User talk:{{{senderUserName}}}|min diskussionssida]]. Bli inte avskräckt av denna lilla händelse. Dina bidrag är mycket viktiga för Wikipedia. Eftersom du har gjort flera destruktiva redigeringar kommer detta att fungera som din sista varning. Skulle du vandalisera Wikipedia igen kommer du att förbjudas att redigera. Din senaste redigering verkar innehålla upphovsrättsskyddat material utan tillstånd. Se till att allt innehåll följer Wikipedias policyer om [[Wikipedia:Copyrights|upphovsrätt]] för att undvika borttagning. Hej {{{username}}}, det verkar som att du har tagit bort innehåll från Wikipedia utan att lämna en redigeringssammanfattning. Lämna en redigeringssammanfattning när du lägger till eller tar bort innehåll på Wikipedia. @@ -1635,6 +1654,21 @@ Tack, kära donator! Din generositet hjälper till att hålla Wikipedia och dess systerwebbplatser blomstrande. Gå tillbaka Öppna i systemwebbläsaren + Donera med Google Pay? + Donera med Google Pay eller välj en annan betalningsmetod. + Donera med Google Pay + Annan betalningsmetod + Välj ett belopp + Jag lägger generöst till %s för att täcka transaktionsavgifterna så att ni kan behålla 100 %% av min donation. + Gör detta till en återkommande månadsdonation. + Ja, Wikimedia Foundation får skicka e-postmeddelande till mig ibland. + Välj ett belopp (minst %s) + Vi kan inte acceptera donationer som överstiger %s via vår app. Var god kontakta vår personal för större gåvor på benefactors@wikimedia.org. + <b>Tack!</b> Din generositet till Wikipedia betyder mycket för oss. + Problem med att donera? + Andra sätt att ge + Vanliga frågor och svar + Information om avdragsmöjligheter Platser Platsbehörighet krävs för att se din plats på kartan. Var god försök igen. Sök platser diff --git a/app/src/main/res/values-zgh/strings.xml b/app/src/main/res/values-zgh/strings.xml index 98adc35a7f7..0da89cd9d50 100644 --- a/app/src/main/res/values-zgh/strings.xml +++ b/app/src/main/res/values-zgh/strings.xml @@ -74,8 +74,8 @@ ⵙⴽⵏ ⴳ ⵜⴽⴰⵕⴹⴰ ⵖⵔ ⵙ ⵛⴰ ⵏ ⵜⵓⵜⵍⴰⵢⵜ ⵢⴰⴹⵏ ⵉⵍⵍⴰ ⵙ %d ⵜⵓⵜⵍⴰⵢⵉⵏ ⵢⴰⴹⵏⵉⵏ - ⵙ ⵓⴼⵙⴰⵔ, ⵜⵎⵙⴰⵙⴰⴷ ⵖⴼ <a href=\"%1$s\">ⵜⴼⴰⴷⵉⵡⵉⵏ ⵏ ⵓⵙⵙⵎⵔⵙ</a>, ⴷ ⵔⴰⴷ ⴰⴱⴷⴰ ⵉⵍⵉⵏⵜ ⵜⵓⵎⵓⵜⵉⵏ ⵏⵏⴽ ⴷⴷⴰⵡ ⵜⵓⵔⴰⴳⵜ <a href=\"%2$s\">CC BY-SA 3.0</a>. - ⵙ ⵓⴼⵙⴰⵔ, ⵜⵎⵙⴰⵙⴰⴷ ⵖⴼ <a href=\"%1$s\">ⵜⴼⴰⴷⵉⵡⵉⵏ ⵏ ⵓⵙⵙⵎⵔⵙ</a>, ⴷ ⴰⴷ ⴰⴱⴷⴰ ⵉⵍⵉⵏⵜⵏ ⵜⵓⵎⵓⵜⵉⵏ ⵏⵏⴽ ⴷⴷⴰⵡ ⵜⵓⵔⴰⴳⵜ <a href=\"%2$s/\">CC BY-SA 3.0</a>. ⵉⵙⵏⴼⵍ ⵔⴰⴷ ⴹⴼⵕⵏ ⴰⵏⵙⴰ ⵏ ⵓⴱⵔⵓⵟⵓⴽⵓⵍ ⵏ ⵡⴰⵏⵜⵉⵔⵏⵉⵜ ⵏ ⵡⴰⵍⵍⴰⵍ ⵏⵏⴽ. ⵎⴽ <a href=\"https://#login\">ⵜⴽⵛⵎⴷ</a>, ⵔⴰⴷ ⵖⵓⵔⴽ ⵜⵉⵍⵉ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵓⴳⴳⵯⴰⵔ. + ⵙ ⵓⴼⵙⴰⵔ, ⵜⵎⵙⴰⵙⴰⴷ ⵖⴼ <a href=\"%1$s\">ⵜⴼⴰⴷⵉⵡⵉⵏ ⵏ ⵓⵙⵙⵎⵔⵙ</a>, ⴷ ⵔⴰⴷ ⴰⴱⴷⴰ ⵉⵍⵉⵏⵜ ⵜⵓⵎⵓⵜⵉⵏ ⵏⵏⴽ ⴷⴷⴰⵡ ⵜⵓⵔⴰⴳⵜ <a href=\"%2$s\">CC BY-SA 3.0</a>. + ⵙ ⵓⴼⵙⴰⵔ, ⵜⵎⵙⴰⵙⴰⴷ ⵖⴼ <a href=\"%1$s\">ⵜⴼⴰⴷⵉⵡⵉⵏ ⵏ ⵓⵙⵙⵎⵔⵙ</a>, ⴷ ⴰⴷ ⴰⴱⴷⴰ ⵉⵍⵉⵏⵜⵏ ⵜⵓⵎⵓⵜⵉⵏ ⵏⵏⴽ ⴷⴷⴰⵡ ⵜⵓⵔⴰⴳⵜ <a href=\"%2$s/\">CC BY-SA 3.0</a>. ⵉⵙⵏⴼⵍ ⵔⴰⴷ ⴹⴼⵕⵏ ⴰⵏⵙⴰ ⵏ ⵓⴱⵔⵓⵟⵓⴽⵓⵍ ⵏ ⵡⴰⵏⵜⵉⵔⵏⵉⵜ ⵏ ⵡⴰⵍⵍⴰⵍ ⵏⵏⴽ. ⵎⴽ <a href=\"https://#login\">ⵜⴽⵛⵎⴷ</a>, ⵔⴰⴷ ⵖⵓⵔⴽ ⵜⵉⵍⵉ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵓⴳⴳⵯⴰⵔ. ⵜⵓⵜⵍⴰⵢⵉⵏ ⵏ ⵡⵉⴽⵉⴱⵉⴷⵢⴰ ⵔⵣⵓ ⵓⵔ ⵜⵍⵍⵉ ⵜⴰⵙⵏⴰ ⴰⴷ ⵙ ⵜⵓⵜⵍⴰⵢⵉⵏ ⵢⴰⴹⵏⵉⵏ. diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index bba446dec69..542e8509637 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -343,6 +343,7 @@ 其他 您改善该页面的其他方式 添加了简短描述 + 已更新简短描述 编辑冲突 页面已被不同的用户修改过,并且与您的编辑冲突。请复制您的编辑,返回并刷新页面,然后重试编辑。 编辑提示 @@ -466,6 +467,7 @@ 保存 已保存 分享 + 本条目是一篇小作品,这意味着条目中的内容不足以生成预览。不过,您可以动手来改善条目内容。 该页面不存在 维基百科没有具有此确切名称的<a href=\"%1$s\">用户页</a>。通常来说,此页面只应由<b>%2$s</b>来创建和编辑。如果您对此抱有疑惑,请验证“%3$s”是否存在。 无法连接至互联网 @@ -1464,6 +1466,7 @@ 自动贡献 机器人 人工(非机器人) + 重要性 小编辑 不是小编辑 最新修订版本 @@ -1539,6 +1542,9 @@ 消息已删除 + 标题不能为空。 + 您的消息 + 示例消息 搜索或过滤编辑 标签: %s @@ -1593,7 +1599,12 @@ 以中等精度查找到中等概率的存在恶意的编辑。 高概率恶意 以极高精度查找出大多数明显存在恶意的编辑。 + 条目编辑历史 + 回退完成 + 您确定要回退么? + 回退完成 查看 + 功能问题 了解更多 感谢 监视 From 59972b89d7b21bebb929e8a4d6947dc497c4bdce Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 11 Jun 2024 06:24:17 -0700 Subject: [PATCH 176/626] Fix: remove toolbar space from first bitmap in TabsActivity (#4734) Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/page/PageActivity.kt | 10 +++++----- .../org/wikipedia/page/tabs/TabActivity.kt | 19 ++++++++++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.kt b/app/src/main/java/org/wikipedia/page/PageActivity.kt index e8b2ff90a72..ca015bd013a 100644 --- a/app/src/main/java/org/wikipedia/page/PageActivity.kt +++ b/app/src/main/java/org/wikipedia/page/PageActivity.kt @@ -179,13 +179,13 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo supportActionBar?.setDisplayHomeAsUpEnabled(true) binding.pageToolbarButtonSearch.setOnClickListener { pageFragment.articleInteractionEvent?.logSearchWikipediaClick() - pageFragment.metricsPlatformArticleEventToolbarInteraction?.logSearchWikipediaClick() + pageFragment.metricsPlatformArticleEventToolbarInteraction.logSearchWikipediaClick() startActivity(SearchActivity.newIntent(this@PageActivity, InvokeSource.TOOLBAR, null)) } binding.pageToolbarButtonTabs.updateTabCount(false) binding.pageToolbarButtonTabs.setOnClickListener { pageFragment.articleInteractionEvent?.logTabsClick() - pageFragment.metricsPlatformArticleEventToolbarInteraction?.logTabsClick() + pageFragment.metricsPlatformArticleEventToolbarInteraction.logTabsClick() TabActivity.captureFirstTabBitmap(pageFragment.containerView, pageFragment.title?.prefixedText.orEmpty()) requestBrowseTabLauncher.launch(TabActivity.newIntentFromPageActivity(this)) } @@ -194,14 +194,14 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo binding.pageToolbarButtonShowOverflowMenu.setOnClickListener { pageFragment.showOverflowMenu(it) pageFragment.articleInteractionEvent?.logMoreClick() - pageFragment.metricsPlatformArticleEventToolbarInteraction?.logMoreClick() + pageFragment.metricsPlatformArticleEventToolbarInteraction.logMoreClick() Prefs.showOneTimeCustomizeToolbarTooltip = false } binding.pageToolbarButtonNotifications.isVisible = AccountUtil.isLoggedIn binding.pageToolbarButtonNotifications.setOnClickListener { pageFragment.articleInteractionEvent?.logNotificationClick() - pageFragment.metricsPlatformArticleEventToolbarInteraction?.logNotificationClick() + pageFragment.metricsPlatformArticleEventToolbarInteraction.logNotificationClick() if (AccountUtil.isLoggedIn) { startActivity(NotificationActivity.newIntent(this@PageActivity)) } else if (AnonymousNotificationHelper.isWithinAnonNotificationTime() && !Prefs.lastAnonNotificationLang.isNullOrEmpty()) { @@ -357,7 +357,7 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo override fun onNavMenuSwipeRequest(gravity: Int) { if (!isCabOpen && gravity == Gravity.END) { pageFragment.articleInteractionEvent?.logTocSwipe() - pageFragment.metricsPlatformArticleEventToolbarInteraction?.logTocSwipe() + pageFragment.metricsPlatformArticleEventToolbarInteraction.logTocSwipe() pageFragment.sidePanelHandler.showToC() } } diff --git a/app/src/main/java/org/wikipedia/page/tabs/TabActivity.kt b/app/src/main/java/org/wikipedia/page/tabs/TabActivity.kt index a28b3aea6ae..71aa661cf7d 100644 --- a/app/src/main/java/org/wikipedia/page/tabs/TabActivity.kt +++ b/app/src/main/java/org/wikipedia/page/tabs/TabActivity.kt @@ -4,7 +4,11 @@ import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.appcompat.widget.AppCompatImageView @@ -31,7 +35,11 @@ import org.wikipedia.page.ExclusiveBottomSheetPresenter import org.wikipedia.page.PageActivity import org.wikipedia.readinglist.AddToReadingListDialog import org.wikipedia.settings.Prefs -import org.wikipedia.util.* +import org.wikipedia.util.DimenUtil +import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.L10nUtil +import org.wikipedia.util.ResourceUtil +import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L class TabActivity : BaseActivity() { @@ -57,7 +65,7 @@ class TabActivity : BaseActivity() { view.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) view.scaleType = ImageView.ScaleType.CENTER_CROP view.setImageBitmap(FIRST_TAB_BITMAP) - view.setPadding(0, if (topTabLeadImageEnabled()) 0 else -DimenUtil.getToolbarHeightPx(this@TabActivity), 0, 0) + view.setPadding(0, -DimenUtil.getToolbarHeightPx(this@TabActivity), 0, 0) return view } return inflater.inflate(R.layout.item_tab_contents, parent, false) @@ -66,7 +74,7 @@ class TabActivity : BaseActivity() { override fun onShowTab(context: Context, tabSwitcher: TabSwitcher, view: View, tab: de.mrapp.android.tabswitcher.Tab, index: Int, viewType: Int, savedInstanceState: Bundle?) { val tabIndex = app.tabCount - index - 1 - if (viewType == 1 || tabIndex < 0 || app.tabList[tabIndex] == null) { + if (viewType == 1 || tabIndex < 0 || app.tabList.getOrNull(tabIndex) == null) { return } val titleText = view.findViewById(R.id.tab_article_title) @@ -83,7 +91,8 @@ class TabActivity : BaseActivity() { } override fun getViewType(tab: de.mrapp.android.tabswitcher.Tab, index: Int): Int { - return if (FIRST_TAB_BITMAP_TITLE == app.tabList[app.tabCount - index - 1]?.backStackPositionTitle?.prefixedText) { + val tabIndex = app.tabCount - index - 1 + return if (FIRST_TAB_BITMAP_TITLE == app.tabList.getOrNull(tabIndex)?.backStackPositionTitle?.prefixedText) { 1 } else { 0 From df010e0075e055f451da9c2cb4b2341a939dec3a Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 11 Jun 2024 06:33:02 -0700 Subject: [PATCH 177/626] Hygiene: remove unused functions/variables and add suppress for unused (#4735) paramteres Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/gallery/ExtMetadata.kt | 13 +---------- .../org/wikipedia/gallery/GalleryActivity.kt | 4 ++-- .../java/org/wikipedia/gallery/GalleryItem.kt | 21 ++--------------- .../java/org/wikipedia/gallery/ImageInfo.kt | 1 + .../org/wikipedia/gallery/ImageLicense.kt | 23 +++++++++---------- .../org/wikipedia/gallery/MediaListItem.kt | 12 +++++----- 6 files changed, 23 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/org/wikipedia/gallery/ExtMetadata.kt b/app/src/main/java/org/wikipedia/gallery/ExtMetadata.kt index 35482fee04b..0366a9c5d5f 100644 --- a/app/src/main/java/org/wikipedia/gallery/ExtMetadata.kt +++ b/app/src/main/java/org/wikipedia/gallery/ExtMetadata.kt @@ -5,6 +5,7 @@ import kotlinx.parcelize.Parcelize import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +@Suppress("unused") @Parcelize @Serializable class ExtMetadata( @@ -35,18 +36,6 @@ class ExtMetadata( return imageDescription?.value.orEmpty() } - fun imageDescriptionSource(): String { - return imageDescription?.source.orEmpty() - } - - fun objectName(): String { - return objectName?.value.orEmpty() - } - - fun usageTerms(): String { - return usageTerms?.value.orEmpty() - } - fun dateTime(): String { return dateTimeOriginal?.value.orEmpty() } diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt index 549d1496dbe..61412831455 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt @@ -568,14 +568,14 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall val license = ImageLicense(metadata.license(), metadata.licenseShortName(), metadata.licenseUrl()) // determine which icon to display... - if (license.licenseIcon == R.drawable.ic_license_by) { + if (license.licenseIcon() == R.drawable.ic_license_by) { binding.licenseIcon.setImageResource(R.drawable.ic_license_cc) binding.licenseIconBy.setImageResource(R.drawable.ic_license_by) binding.licenseIconBy.visibility = View.VISIBLE binding.licenseIconSa.setImageResource(R.drawable.ic_license_sharealike) binding.licenseIconSa.visibility = View.VISIBLE } else { - binding.licenseIcon.setImageResource(license.licenseIcon) + binding.licenseIcon.setImageResource(license.licenseIcon()) binding.licenseIconBy.visibility = View.GONE binding.licenseIconSa.visibility = View.GONE } diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryItem.kt b/app/src/main/java/org/wikipedia/gallery/GalleryItem.kt index c0285aa5c94..698aaf8d998 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryItem.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryItem.kt @@ -2,10 +2,9 @@ package org.wikipedia.gallery import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.wikipedia.Constants.PREFERRED_GALLERY_IMAGE_SIZE import org.wikipedia.dataclient.Service -import org.wikipedia.util.ImageUrlUtil +@Suppress("unused") @Serializable open class GalleryItem { @@ -21,12 +20,10 @@ open class GalleryItem { @SerialName("structured") var structuredData: StructuredData? = null - // return the base url of Wiki Commons for WikiSite() if the file_page is null. @SerialName("file_page") var filePage: String = Service.COMMONS_URL val duration = 0.0 - val isShowInGallery = false var type: String = "" var thumbnail = ImageInfo() var original = ImageInfo() @@ -39,23 +36,9 @@ open class GalleryItem { var license: ImageLicense? = null val thumbnailUrl get() = thumbnail.source - val preferredSizedImageUrl get() = ImageUrlUtil.getUrlForPreferredSize(thumbnailUrl, PREFERRED_GALLERY_IMAGE_SIZE) - - // The getSources has different levels of source, - // should have an option that allows user to chose which quality to play - val originalVideoSource get() = sources?.lastOrNull() - - var structuredCaptions - get() = structuredData?.captions ?: emptyMap() - set(captions) { - if (structuredData == null) { - structuredData = StructuredData() - } - structuredData?.captions = HashMap(captions) - } @Serializable - class Titles constructor(val display: String = "", val canonical: String = "", val normalized: String = "") + class Titles(val display: String = "", val canonical: String = "", val normalized: String = "") @Serializable class StructuredData(var captions: HashMap? = null) diff --git a/app/src/main/java/org/wikipedia/gallery/ImageInfo.kt b/app/src/main/java/org/wikipedia/gallery/ImageInfo.kt index 3b038e40182..3bc9baaffa6 100644 --- a/app/src/main/java/org/wikipedia/gallery/ImageInfo.kt +++ b/app/src/main/java/org/wikipedia/gallery/ImageInfo.kt @@ -3,6 +3,7 @@ package org.wikipedia.gallery import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +@Suppress("unused") @Serializable class ImageInfo { diff --git a/app/src/main/java/org/wikipedia/gallery/ImageLicense.kt b/app/src/main/java/org/wikipedia/gallery/ImageLicense.kt index a7c4073be76..6c51c4a0cf7 100644 --- a/app/src/main/java/org/wikipedia/gallery/ImageLicense.kt +++ b/app/src/main/java/org/wikipedia/gallery/ImageLicense.kt @@ -21,19 +21,18 @@ class ImageLicense( private val isLicenseCCBySa: Boolean get() = (licenseName.replace("-", "").startsWith(CC_BY_SA, true) || licenseShortName.replace("-", "").startsWith(CC_BY_SA, true)) - @get:DrawableRes - val licenseIcon: Int - get() { - if (isLicensePD) { - return R.drawable.ic_license_pd - } - if (isLicenseCCBySa) { - return R.drawable.ic_license_by - } - return if (isLicenseCC) { - R.drawable.ic_license_cc - } else R.drawable.ic_license_cite + @DrawableRes + fun licenseIcon(): Int { + return if (isLicensePD) { + R.drawable.ic_license_pd + } else if (isLicenseCCBySa) { + R.drawable.ic_license_by + } else if (isLicenseCC) { + R.drawable.ic_license_cc + } else { + R.drawable.ic_license_cite } + } companion object { private const val CREATIVE_COMMONS_PREFIX = "cc" diff --git a/app/src/main/java/org/wikipedia/gallery/MediaListItem.kt b/app/src/main/java/org/wikipedia/gallery/MediaListItem.kt index 67020882895..94b652126d1 100644 --- a/app/src/main/java/org/wikipedia/gallery/MediaListItem.kt +++ b/app/src/main/java/org/wikipedia/gallery/MediaListItem.kt @@ -9,12 +9,12 @@ import org.wikipedia.util.UriUtil @Serializable @Parcelize -class MediaListItem constructor(val title: String = "", - val type: String = "", - val caption: TextInfo? = null, - val showInGallery: Boolean = false, - @SerialName("section_id") private val sectionId: Int = 0, - @SerialName("srcset") val srcSets: List = emptyList()) : +class MediaListItem(val title: String = "", + val type: String = "", + val caption: TextInfo? = null, + val showInGallery: Boolean = false, + @SerialName("section_id") private val sectionId: Int = 0, + @SerialName("srcset") val srcSets: List = emptyList()) : Parcelable { val isInCommons get() = srcSets.firstOrNull()?.src?.contains(Service.URL_FRAGMENT_FROM_COMMONS) == true From f0c6c3a2fb5a9a567665da6157c13a0a0c2785e9 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 11 Jun 2024 11:54:39 -0400 Subject: [PATCH 178/626] Revert "Do not reload the feed content onResume in FeedFragment" (#4737) * Revert "Do not reload the feed content onResume in FeedFragment (#4726)" This reverts commit 709cf6e3b41afa620d0444626beeda7ab6fb9fa1. * Add link to issue. --- app/src/main/java/org/wikipedia/feed/FeedFragment.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.kt b/app/src/main/java/org/wikipedia/feed/FeedFragment.kt index 0652a426676..379e40ed655 100644 --- a/app/src/main/java/org/wikipedia/feed/FeedFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.kt @@ -149,6 +149,11 @@ class FeedFragment : Fragment(), BackPressedHandler { override fun onResume() { super.onResume() showRemoveChineseVariantPrompt() + + // Explicitly invalidate the feed adapter, since it occasionally crashes the StaggeredGridLayout + // on certain devices. + // https://issuetracker.google.com/issues/188096921 + feedAdapter.notifyDataSetChanged() } override fun onDestroyView() { From 5a4f140d961ec1ae390c74fbc8b7b9a86b02516c Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 11 Jun 2024 12:30:12 -0400 Subject: [PATCH 179/626] Convert Push Notification registry calls to use coroutines. (#4732) * Convert Push Notification registry calls to use coroutines. * Use invokeOnCompletion. --------- Co-authored-by: Cooltey Feng --- .../push/WikipediaFirebaseMessagingService.kt | 125 ++++++++++-------- .../main/java/org/wikipedia/WikipediaApp.kt | 34 ++--- .../java/org/wikipedia/dataclient/Service.kt | 14 +- 3 files changed, 94 insertions(+), 79 deletions(-) diff --git a/app/src/extra/java/org/wikipedia/push/WikipediaFirebaseMessagingService.kt b/app/src/extra/java/org/wikipedia/push/WikipediaFirebaseMessagingService.kt index 798cd755b85..5d31a239826 100644 --- a/app/src/extra/java/org/wikipedia/push/WikipediaFirebaseMessagingService.kt +++ b/app/src/extra/java/org/wikipedia/push/WikipediaFirebaseMessagingService.kt @@ -4,10 +4,13 @@ import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil import org.wikipedia.csrf.CsrfTokenClient @@ -20,7 +23,6 @@ import org.wikipedia.settings.Prefs import org.wikipedia.util.log.L class WikipediaFirebaseMessagingService : FirebaseMessagingService() { - override fun onMessageReceived(remoteMessage: RemoteMessage) { L.d("Message from: ${remoteMessage.from}") @@ -53,7 +55,8 @@ class WikipediaFirebaseMessagingService : FirebaseMessagingService() { const val MESSAGE_TYPE_CHECK_ECHO = "checkEchoV1" private const val SUBSCRIBE_RETRY_COUNT = 5 private const val UNSUBSCRIBE_RETRY_COUNT = 3 - private var csrfDisposables = CompositeDisposable() + + private var subscriptionJob: Job? = null fun isUsingPush(): Boolean { return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(WikipediaApp.instance) == ConnectionResult.SUCCESS && @@ -67,24 +70,22 @@ class WikipediaFirebaseMessagingService : FirebaseMessagingService() { return } - csrfDisposables.clear() - - for (lang in WikipediaApp.instance.languageState.appLanguageCodes) { - csrfDisposables.add(CsrfTokenClient.getToken(WikiSite.forLanguageCode(lang)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - if (lang == WikipediaApp.instance.appOrSystemLanguageCode) { - subscribeWithCsrf(it) - } - setNotificationOptions(lang, it) - }, { - L.e(it) - })) + subscriptionJob?.cancel() + + subscriptionJob = MainScope().launch(CoroutineExceptionHandler { _, t -> + L.e(t) + }) { + for (lang in WikipediaApp.instance.languageState.appLanguageCodes) { + val csrfToken = withContext(Dispatchers.IO) { CsrfTokenClient.getToken(WikiSite.forLanguageCode(lang)).blockingSingle() } + if (lang == WikipediaApp.instance.appOrSystemLanguageCode) { + subscribeWithCsrf(csrfToken) + } + setNotificationOptions(lang, csrfToken) + } } } - private fun subscribeWithCsrf(csrfToken: String) { + private suspend fun subscribeWithCsrf(csrfToken: String) { if (Prefs.isPushNotificationTokenSubscribed || Prefs.pushNotificationToken.isEmpty()) { // Don't do anything if the token is already subscribed, or if the token is empty. return @@ -96,39 +97,48 @@ class WikipediaFirebaseMessagingService : FirebaseMessagingService() { // Make sure to unsubscribe the previous token, if any if (oldToken.isNotEmpty()) { if (oldToken != token) { - unsubscribePushToken(csrfToken, oldToken) - .subscribe({ - L.d("Previous token unsubscribed successfully.") - Prefs.pushNotificationTokenOld = "" - }, { - L.e(it) - if (it is MwException && it.error.title == "echo-push-token-not-found") { - // token was not found in the database, so consider it gone. - Prefs.pushNotificationTokenOld = "" - } - }) + try { + unsubscribePushToken(csrfToken, oldToken) + L.d("Previous token unsubscribed successfully.") + Prefs.pushNotificationTokenOld = "" + } catch (e: Exception) { + if (e is CancellationException) { + throw e + } else if (e is MwException && e.error.title == "echo-push-token-not-found") { + // token was not found in the database, so consider it gone. + Prefs.pushNotificationTokenOld = "" + } else { + L.e(e) + } + } } else { Prefs.pushNotificationTokenOld = "" } } - ServiceFactory.get(WikipediaApp.instance.wikiSite).subscribePush(csrfToken, token) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .retry(SUBSCRIBE_RETRY_COUNT.toLong()) - .subscribe({ + withContext(Dispatchers.IO) { + for (i in 0 until SUBSCRIBE_RETRY_COUNT) { + try { + ServiceFactory.get(WikipediaApp.instance.wikiSite).subscribePush(csrfToken, token) L.d("Token subscribed successfully.") Prefs.isPushNotificationTokenSubscribed = true - }, { - L.e(it) - if (it is MwException && it.error.title == "echo-push-token-exists") { + } catch (e: Exception) { + if (e is CancellationException) { + throw e + } else if (e is MwException && e.error.title == "echo-push-token-exists") { // token already exists in the database, so consider it subscribed. Prefs.isPushNotificationTokenSubscribed = true + } else { + L.e(e) + continue } - }) + } + break + } + } } - private fun setNotificationOptions(lang: String, csrfToken: String) { + private suspend fun setNotificationOptions(lang: String, csrfToken: String) { if (Prefs.isPushNotificationOptionsSet) { return } @@ -144,24 +154,27 @@ class WikipediaFirebaseMessagingService : FirebaseMessagingService() { ) ServiceFactory.get(WikiSite.forLanguageCode(lang)).postSetOptions(optionList.joinToString(separator = "|"), csrfToken) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - L.d("Notification options updated successfully.") - Prefs.isPushNotificationOptionsSet = true - }, { - L.e(it) - }) + L.d("Notification options updated successfully.") + Prefs.isPushNotificationOptionsSet = true } - fun unsubscribePushToken(csrfToken: String, pushToken: String): Observable { + suspend fun unsubscribePushToken(csrfToken: String, pushToken: String): MwQueryResponse { if (pushToken.isEmpty()) { - return Observable.just(MwQueryResponse()) + return MwQueryResponse() + } + return withContext(Dispatchers.IO) { + for (i in 0 until UNSUBSCRIBE_RETRY_COUNT) { + try { + return@withContext ServiceFactory.get(WikipediaApp.instance.wikiSite).unsubscribePush(csrfToken, pushToken) + } catch (e: Exception) { + if (e is CancellationException) { + throw e + } + L.e(e) + } + } + MwQueryResponse() } - return ServiceFactory.get(WikipediaApp.instance.wikiSite).unsubscribePush(csrfToken, pushToken) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .retry(UNSUBSCRIBE_RETRY_COUNT.toLong()) } } } diff --git a/app/src/main/java/org/wikipedia/WikipediaApp.kt b/app/src/main/java/org/wikipedia/WikipediaApp.kt index 2b9c455fca4..50824f50463 100644 --- a/app/src/main/java/org/wikipedia/WikipediaApp.kt +++ b/app/src/main/java/org/wikipedia/WikipediaApp.kt @@ -1,6 +1,5 @@ package org.wikipedia -import android.annotation.SuppressLint import android.app.Application import android.content.Intent import android.content.pm.PackageManager @@ -12,7 +11,9 @@ import android.webkit.WebView import androidx.appcompat.app.AppCompatDelegate import io.reactivex.rxjava3.internal.functions.Functions import io.reactivex.rxjava3.plugins.RxJavaPlugins -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch import org.wikipedia.analytics.InstallReferrerListener import org.wikipedia.analytics.eventplatform.AppSessionEvent import org.wikipedia.analytics.eventplatform.EventPlatformClient @@ -239,21 +240,22 @@ class WikipediaApp : Application() { defaultWikiSite = null } - @SuppressLint("CheckResult") fun logOut() { - L.d("Logging out") - AccountUtil.removeAccount() - Prefs.isPushNotificationTokenSubscribed = false - Prefs.pushNotificationTokenOld = "" - ServiceFactory.get(wikiSite).getTokenObservable() - .subscribeOn(Schedulers.io()) - .flatMap { - val csrfToken = it.query!!.csrfToken() - WikipediaFirebaseMessagingService.unsubscribePushToken(csrfToken!!, Prefs.pushNotificationToken) - .flatMap { ServiceFactory.get(wikiSite).postLogout(csrfToken).subscribeOn(Schedulers.io()) } - } - .doFinally { SharedPreferenceCookieManager.instance.clearAllCookies() } - .subscribe({ L.d("Logout complete.") }) { L.e(it) } + MainScope().launch(CoroutineExceptionHandler { _, t -> + L.e(t) + }) { + L.d("Logging out") + AccountUtil.removeAccount() + Prefs.isPushNotificationTokenSubscribed = false + Prefs.pushNotificationTokenOld = "" + + val token = ServiceFactory.get(wikiSite).getToken().query!!.csrfToken() + WikipediaFirebaseMessagingService.unsubscribePushToken(token!!, Prefs.pushNotificationToken) + ServiceFactory.get(wikiSite).postLogout(token) + }.invokeOnCompletion { + SharedPreferenceCookieManager.instance.clearAllCookies() + L.d("Logout complete.") + } } private fun enableWebViewDebugging() { diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index cde42cfcae0..3fbbf93f441 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -210,10 +210,10 @@ interface Service { @FormUrlEncoded @POST(MW_API_PREFIX + "action=options") - fun postSetOptions( + suspend fun postSetOptions( @Field("change") change: String, @Field("token") token: String - ): Observable + ): MwPostResponse @get:GET(MW_API_PREFIX + "action=streamconfigs&format=json&constraints=destination_event_service=eventgate-analytics-external") val streamConfigs: Observable @@ -315,7 +315,7 @@ interface Service { @FormUrlEncoded @POST(MW_API_PREFIX + "action=logout") - fun postLogout(@Field("token") token: String): Observable + suspend fun postLogout(@Field("token") token: String): MwPostResponse @get:GET(MW_API_PREFIX + "action=query&meta=authmanagerinfo|tokens&amirequestsfor=create&type=createaccount") val authManagerInfo: Observable @@ -371,17 +371,17 @@ interface Service { @FormUrlEncoded @POST(MW_API_PREFIX + "action=echopushsubscriptions&command=create&provider=fcm") - fun subscribePush( + suspend fun subscribePush( @Field("token") csrfToken: String, @Field("providertoken") providerToken: String - ): Observable + ): MwQueryResponse @FormUrlEncoded @POST(MW_API_PREFIX + "action=echopushsubscriptions&command=delete&provider=fcm") - fun unsubscribePush( + suspend fun unsubscribePush( @Field("token") csrfToken: String, @Field("providertoken") providerToken: String - ): Observable + ): MwQueryResponse // ------- Editing ------- From 2a7de2439789a94fb845035e6839e676e30b776f Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 11 Jun 2024 10:11:15 -0700 Subject: [PATCH 180/626] Refactoring NotificationDirectReplyHelper to use coroutine (#4729) * Refactoring NotificationDirectReplyHelper to use coroutine * Fix lint * Add TODO to test before using it * Code review fix --- .../org/wikipedia/dataclient/RestService.kt | 2 +- .../java/org/wikipedia/dataclient/Service.kt | 18 +++ .../talk/NotificationDirectReplyHelper.kt | 103 ++++++++---------- 3 files changed, 64 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/org/wikipedia/dataclient/RestService.kt b/app/src/main/java/org/wikipedia/dataclient/RestService.kt index 3ddb73fa62d..a6e9bd44e92 100644 --- a/app/src/main/java/org/wikipedia/dataclient/RestService.kt +++ b/app/src/main/java/org/wikipedia/dataclient/RestService.kt @@ -222,7 +222,7 @@ interface RestService { // ------- Talk pages ------- @Headers("Cache-Control: no-cache") @GET("page/talk/{title}") - fun getTalkPage(@Path("title") title: String?): Observable + suspend fun getTalkPage(@Path("title") title: String?): TalkPage @Headers("Cache-Control: no-cache") @GET("metrics/edits/per-page/{wikiAuthority}/{title}/all-editor-types/monthly/{fromDate}/{toDate}") diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index 3fbbf93f441..a82b097cfeb 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -420,6 +420,24 @@ interface Service { @Field("watchlist") watchlist: String? = null, ): Observable + @FormUrlEncoded + @POST(MW_API_PREFIX + "action=edit") + suspend fun postEditSubmitSuspend( + @Field("title") title: String, + @Field("section") section: String?, + @Field("sectiontitle") newSectionTitle: String?, + @Field("summary") summary: String, + @Field("assert") user: String?, + @Field("text") text: String?, + @Field("appendtext") appendText: String?, + @Field("baserevid") baseRevId: Long, + @Field("token") token: String, + @Field("captchaid") captchaId: String?, + @Field("captchaword") captchaWord: String?, + @Field("minor") minor: Boolean? = null, + @Field("watchlist") watchlist: String? = null, + ): Edit + @FormUrlEncoded @POST(MW_API_PREFIX + "action=visualeditoredit") suspend fun postVisualEditorEdit( diff --git a/app/src/main/java/org/wikipedia/talk/NotificationDirectReplyHelper.kt b/app/src/main/java/org/wikipedia/talk/NotificationDirectReplyHelper.kt index 20373a55efe..da7481da441 100644 --- a/app/src/main/java/org/wikipedia/talk/NotificationDirectReplyHelper.kt +++ b/app/src/main/java/org/wikipedia/talk/NotificationDirectReplyHelper.kt @@ -1,91 +1,76 @@ package org.wikipedia.talk +import android.Manifest import android.app.NotificationManager import android.content.Context +import android.content.pm.PackageManager import android.os.Build import android.widget.Toast +import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.getSystemService -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.auth.AccountUtil import org.wikipedia.csrf.CsrfTokenClient import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite -import org.wikipedia.dataclient.okhttp.HttpStatusException -import org.wikipedia.edit.Edit import org.wikipedia.page.PageTitle import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L -import java.util.concurrent.TimeUnit object NotificationDirectReplyHelper { - const val DIRECT_REPLY_EDIT_COMMENT = "#directreply-1.0" + private const val DIRECT_REPLY_EDIT_COMMENT = "#directreply-1.0" + // TODO: This is not being used anywhere. Please test before using it. // TODO: update this to use DiscussionTools API, and enable. fun handleReply(context: Context, wiki: WikiSite, title: PageTitle, replyText: String, replyTo: String, notificationId: Int) { Toast.makeText(context, context.getString(R.string.notifications_direct_reply_progress, replyTo), Toast.LENGTH_SHORT).show() - Observable.zip(CsrfTokenClient.getToken(wiki).subscribeOn(Schedulers.io()), - ServiceFactory.getRest(wiki).getTalkPage(title.prefixedText).subscribeOn(Schedulers.io())) { token, response -> - Pair(token, response) - }.subscribeOn(Schedulers.io()) - .flatMap { pair -> - val topic = pair.second.topics!!.find { - it.id > 0 && it.html?.trim().orEmpty() == StringUtil.removeUnderscores(title.fragment) - } - if (topic == null || title.fragment.isNullOrEmpty()) { - Observable.just(Edit()) - } else { - ServiceFactory.get(wiki).postEditSubmit( - title.prefixedText, topic.id.toString(), null, - DIRECT_REPLY_EDIT_COMMENT, if (AccountUtil.isLoggedIn) "user" else null, null, replyText, - pair.second.revision, pair.first, null, null - ) - } + CoroutineScope(Dispatchers.IO).launch(CoroutineExceptionHandler { _, throwable -> + L.e(throwable) + fallBackToTalkPage(context, title) + }) { + val token = async { CsrfTokenClient.getToken(wiki).blockingFirst() } + val talkPageResponse = async { ServiceFactory.getRest(wiki).getTalkPage(title.prefixedText) } + val topic = talkPageResponse.await().topics?.find { + it.id > 0 && it.html?.trim().orEmpty() == StringUtil.removeUnderscores(title.fragment) } - .subscribe({ - if (it.edit?.editSucceeded == true) { - waitForUpdatedRevision(context, wiki, title, it.edit.newRevId, notificationId) + + topic?.let { + val submitResponse = ServiceFactory.get(wiki).postEditSubmitSuspend( + title.prefixedText, topic.id.toString(), null, + DIRECT_REPLY_EDIT_COMMENT, if (AccountUtil.isLoggedIn) "user" else null, null, replyText, + talkPageResponse.await().revision, token.await(), null, null + ) + if (submitResponse.edit?.editSucceeded == true) { + waitForUpdatedRevision(context, wiki, title, submitResponse.edit.newRevId, notificationId) } else { fallBackToTalkPage(context, title) } - }, { - L.e(it) - fallBackToTalkPage(context, title) - }) + } + } } - private fun waitForUpdatedRevision(context: Context, wiki: WikiSite, title: PageTitle, - newRevision: Long, notificationId: Int) { - ServiceFactory.getRest(wiki).getTalkPage(title.prefixedText) - .delay(2, TimeUnit.SECONDS) - .subscribeOn(Schedulers.io()) - .map { - if (it.revision < newRevision) { - throw IllegalStateException() - } - it.revision - } - .retry(20) { - (it is IllegalStateException) || (it is HttpStatusException && it.code == 404) + private suspend fun waitForUpdatedRevision(context: Context, wiki: WikiSite, title: PageTitle, newRevision: Long, notificationId: Int) { + var tries = 0 + do { + if (tries > 0) { + delay(2000) } - .observeOn(AndroidSchedulers.mainThread()) - .doOnTerminate { - cancelNotification(context, notificationId) - } - .subscribe({ - // revisionForUndo = it - Toast.makeText(context, R.string.notifications_direct_reply_success, Toast.LENGTH_LONG).show() - }, { - L.e(it) - fallBackToTalkPage(context, title) - }) + val talkPageResponse = ServiceFactory.getRest(wiki).getTalkPage(title.prefixedText) + tries++ + } while (talkPageResponse.revision < newRevision && tries < 20) + Toast.makeText(context, R.string.notifications_direct_reply_success, Toast.LENGTH_LONG).show() + cancelNotification(context, notificationId) } private fun fallBackToTalkPage(context: Context, title: PageTitle) { @@ -97,15 +82,17 @@ object NotificationDirectReplyHelper { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O) { return } - context.getSystemService()?.activeNotifications?.find { - it.id == notificationId - }?.run { + context.getSystemService()?.activeNotifications?.find { it.id == notificationId }?.run { val n = NotificationCompat.Builder(context, this.notification) .setRemoteInputHistory(null) .setPriority(NotificationCompat.PRIORITY_MIN) .setVibrate(null) .setTimeoutAfter(1) .build() + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + // TODO: Consider calling ActivityCompat#requestPermissions + return + } NotificationManagerCompat.from(context).notify(notificationId, n) } } From 8d5df5949149264799d046aa13540db7d4a59b3e Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Tue, 11 Jun 2024 13:19:43 -0400 Subject: [PATCH 181/626] Bump versionCode. (#4738) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 96c5b6d7f20..8c0ecebb9f0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50491 + versionCode 50492 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From dd5cf4db59df13854b303d5e2d3786ad1432d499 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 12 Jun 2024 07:07:45 -0700 Subject: [PATCH 182/626] Remove unused ConfigurableTextView and update AppTextView (#4741) Co-authored-by: Dmitry Brant --- .../main/java/org/wikipedia/views/AppTextView.kt | 3 ++- .../org/wikipedia/views/ConfigurableTextView.kt | 15 --------------- 2 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 app/src/main/java/org/wikipedia/views/ConfigurableTextView.kt diff --git a/app/src/main/java/org/wikipedia/views/AppTextView.kt b/app/src/main/java/org/wikipedia/views/AppTextView.kt index 6a65783bf7f..4b8dfb48165 100644 --- a/app/src/main/java/org/wikipedia/views/AppTextView.kt +++ b/app/src/main/java/org/wikipedia/views/AppTextView.kt @@ -5,11 +5,12 @@ import android.os.Build import android.util.AttributeSet import android.view.MotionEvent import androidx.core.content.res.use +import com.google.android.material.textview.MaterialTextView import org.wikipedia.R import org.wikipedia.util.StringUtil // TODO: Document where it is desirable to use this class vs. a vanilla TextView -open class AppTextView constructor(context: Context, attrs: AttributeSet? = null) : ConfigurableTextView(context, attrs) { +open class AppTextView(context: Context, attrs: AttributeSet? = null) : MaterialTextView(context, attrs) { init { text = context.obtainStyledAttributes(attrs, R.styleable.AppTextView).use { StringUtil.fromHtml(it.getString(R.styleable.AppTextView_html)) diff --git a/app/src/main/java/org/wikipedia/views/ConfigurableTextView.kt b/app/src/main/java/org/wikipedia/views/ConfigurableTextView.kt deleted file mode 100644 index 11a273d3642..00000000000 --- a/app/src/main/java/org/wikipedia/views/ConfigurableTextView.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.wikipedia.views - -import android.content.Context -import android.util.AttributeSet -import com.google.android.material.textview.MaterialTextView -import org.wikipedia.util.L10nUtil - -open class ConfigurableTextView constructor(context: Context, attrs: AttributeSet? = null) : MaterialTextView(context, attrs) { - fun setText(text: CharSequence?, languageCode: String?) { - super.setText(text) - if (!isInEditMode) { - L10nUtil.setConditionalLayoutDirection(this, languageCode!!) - } - } -} From a14d00a038f63ec29300a549fd48a569586ca009 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 12 Jun 2024 07:22:03 -0700 Subject: [PATCH 183/626] Move PagerTransformer to Random package (#4740) Co-authored-by: Dmitry Brant --- .../org/wikipedia/random/PagerTransformer.kt | 77 ++++++++++++++++++ .../org/wikipedia/random/RandomFragment.kt | 1 - .../java/org/wikipedia/util/AnimationUtil.kt | 78 ------------------- 3 files changed, 77 insertions(+), 79 deletions(-) create mode 100644 app/src/main/java/org/wikipedia/random/PagerTransformer.kt delete mode 100644 app/src/main/java/org/wikipedia/util/AnimationUtil.kt diff --git a/app/src/main/java/org/wikipedia/random/PagerTransformer.kt b/app/src/main/java/org/wikipedia/random/PagerTransformer.kt new file mode 100644 index 00000000000..3018c382404 --- /dev/null +++ b/app/src/main/java/org/wikipedia/random/PagerTransformer.kt @@ -0,0 +1,77 @@ +package org.wikipedia.random + +import android.view.View +import androidx.viewpager2.widget.ViewPager2 +import org.wikipedia.util.DimenUtil + +class PagerTransformer(private val rtl: Boolean) : ViewPager2.PageTransformer { + override fun transformPage(view: View, position: Float) { + if (!rtl) { + when { + position < -1 -> { // [-Infinity,-1) + // This page is way off-screen to the left. + view.rotation = 0f + view.translationX = 0f + view.translationZ = -position + } + position <= 0 -> { // [-1,0] + val factor = position * 45f + view.rotation = factor + view.translationX = view.width * position / 2 + view.alpha = 1f + view.translationZ = -position + } + position <= 1 -> { // (0,1] + // keep it in place (undo the default translation) + view.translationX = -(view.width * position) + // but move it slightly down + view.translationY = DimenUtil.roundedDpToPx(12f) * position + view.translationZ = -position + // and make it translucent + view.alpha = 1f - position * 0.5f + // view.setAlpha(1f); + view.rotation = 0f + } + else -> { // (1,+Infinity] + // This page is way off-screen to the right. + view.rotation = 0f + view.translationX = 0f + view.translationZ = -position + } + } + } else { + when { + position > 1 -> { // (1,+Infinity] + // This page is way off-screen to the right. + view.rotation = 0f + view.translationX = 0f + view.translationZ = -position + } + position > 0 -> { // (0,1] + // keep it in place (undo the default translation) + view.translationX = view.width * position + // but move it slightly down + view.translationY = DimenUtil.roundedDpToPx(12f) * position + view.translationZ = -position + // and make it translucent + view.alpha = 1f - position * 0.5f + // view.setAlpha(1f); + view.rotation = 0f + } + position >= -1 -> { // [-1,0] + val factor = position * 45f + view.rotation = -factor + view.translationX = -(view.width * position / 2) + view.alpha = 1f + view.translationZ = -position + } + else -> { // [-Infinity,-1) + // This page is way off-screen to the left. + view.rotation = 0f + view.translationX = 0f + view.translationZ = -position + } + } + } + } +} diff --git a/app/src/main/java/org/wikipedia/random/RandomFragment.kt b/app/src/main/java/org/wikipedia/random/RandomFragment.kt index e2f0abe1511..e896102e8cf 100644 --- a/app/src/main/java/org/wikipedia/random/RandomFragment.kt +++ b/app/src/main/java/org/wikipedia/random/RandomFragment.kt @@ -29,7 +29,6 @@ import org.wikipedia.page.PageTitle import org.wikipedia.readinglist.LongPressMenu import org.wikipedia.readinglist.ReadingListBehaviorsUtil import org.wikipedia.readinglist.database.ReadingListPage -import org.wikipedia.util.AnimationUtil.PagerTransformer import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.Resource diff --git a/app/src/main/java/org/wikipedia/util/AnimationUtil.kt b/app/src/main/java/org/wikipedia/util/AnimationUtil.kt deleted file mode 100644 index b8001043740..00000000000 --- a/app/src/main/java/org/wikipedia/util/AnimationUtil.kt +++ /dev/null @@ -1,78 +0,0 @@ -package org.wikipedia.util - -import android.view.View -import androidx.viewpager2.widget.ViewPager2 - -class AnimationUtil private constructor() { - class PagerTransformer(private val rtl: Boolean) : ViewPager2.PageTransformer { - override fun transformPage(view: View, position: Float) { - if (!rtl) { - when { - position < -1 -> { // [-Infinity,-1) - // This page is way off-screen to the left. - view.rotation = 0f - view.translationX = 0f - view.translationZ = -position - } - position <= 0 -> { // [-1,0] - val factor = position * 45f - view.rotation = factor - view.translationX = view.width * position / 2 - view.alpha = 1f - view.translationZ = -position - } - position <= 1 -> { // (0,1] - // keep it in place (undo the default translation) - view.translationX = -(view.width * position) - // but move it slightly down - view.translationY = DimenUtil.roundedDpToPx(12f) * position - view.translationZ = -position - // and make it translucent - view.alpha = 1f - position * 0.5f - // view.setAlpha(1f); - view.rotation = 0f - } - else -> { // (1,+Infinity] - // This page is way off-screen to the right. - view.rotation = 0f - view.translationX = 0f - view.translationZ = -position - } - } - } else { - when { - position > 1 -> { // (1,+Infinity] - // This page is way off-screen to the right. - view.rotation = 0f - view.translationX = 0f - view.translationZ = -position - } - position > 0 -> { // (0,1] - // keep it in place (undo the default translation) - view.translationX = view.width * position - // but move it slightly down - view.translationY = DimenUtil.roundedDpToPx(12f) * position - view.translationZ = -position - // and make it translucent - view.alpha = 1f - position * 0.5f - // view.setAlpha(1f); - view.rotation = 0f - } - position >= -1 -> { // [-1,0] - val factor = position * 45f - view.rotation = -factor - view.translationX = -(view.width * position / 2) - view.alpha = 1f - view.translationZ = -position - } - else -> { // [-Infinity,-1) - // This page is way off-screen to the left. - view.rotation = 0f - view.translationX = 0f - view.translationZ = -position - } - } - } - } - } -} From e408054c5839d47adb6d254cf1d9e4c00cb0f742 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 12 Jun 2024 11:48:07 -0400 Subject: [PATCH 184/626] Update list of languages and static data. (#4742) --- .../staticdata/ContributionsNameData.kt | 4 + .../org/wikipedia/staticdata/FileAliasData.kt | 6 +- .../wikipedia/staticdata/MainPageNameData.kt | 8 +- .../wikipedia/staticdata/SpecialAliasData.kt | 6 +- .../org/wikipedia/staticdata/TalkAliasData.kt | 6 +- .../org/wikipedia/staticdata/UserAliasData.kt | 4 + .../wikipedia/staticdata/UserTalkAliasData.kt | 6 +- app/src/main/res/values/languages_list.xml | 1637 +++++++++-------- 8 files changed, 863 insertions(+), 814 deletions(-) diff --git a/app/src/main/java/org/wikipedia/staticdata/ContributionsNameData.kt b/app/src/main/java/org/wikipedia/staticdata/ContributionsNameData.kt index f0304dbfebd..3f5aa0ad333 100644 --- a/app/src/main/java/org/wikipedia/staticdata/ContributionsNameData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/ContributionsNameData.kt @@ -44,6 +44,7 @@ object ContributionsNameData { "bcl" to "Contributions", "be" to "Contributions", "be-tarask" to "Унёсак", + "bew" to "Kontribusi_pengguna", "bg" to "Приноси", "bh" to "योगदान", "bi" to "Contributions", @@ -81,6 +82,7 @@ object ContributionsNameData { "din" to "Contributions", "diq" to "İştıraki", "dsb" to "Pśinoski", + "dtp" to "Sumbangan", "dty" to "Contributions", "dv" to "ޙިއްސާ", "dz" to "Contributions", @@ -139,6 +141,7 @@ object ContributionsNameData { "id" to "Kontribusi_pengguna", "ie" to "Contributiones", "ig" to "Contributions", + "igl" to "Contributions", "ik" to "Contributions", "ilo" to "Contributions", "inh" to "Къахьегам", @@ -168,6 +171,7 @@ object ContributionsNameData { "ks" to "Contributions", "ksh" to "Beidräch", "ku" to "Beşdarî", + "kus" to "Contributions", "kv" to "Вклад", "kw" to "Kevrohow", "ky" to "Contributions", diff --git a/app/src/main/java/org/wikipedia/staticdata/FileAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/FileAliasData.kt index 497ed6c4dd5..9179a5de66d 100644 --- a/app/src/main/java/org/wikipedia/staticdata/FileAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/FileAliasData.kt @@ -44,6 +44,7 @@ object FileAliasData { "bcl" to "Ladawan", "be" to "Файл", "be-tarask" to "Файл", + "bew" to "Gepokan", "bg" to "Файл", "bh" to "चित्र", "bi" to "File", @@ -81,6 +82,7 @@ object FileAliasData { "din" to "Apamduööt", "diq" to "Dosya", "dsb" to "Dataja", + "dtp" to "Fail", "dty" to "चित्र", "dv" to "ފައިލު", "dz" to "File", @@ -123,7 +125,7 @@ object FileAliasData { "gur" to "Faali", "guw" to "Wepo", "gv" to "Coadan", - "ha" to "File", + "ha" to "Fayil", "hak" to "檔案", "haw" to "Waihona", "he" to "קובץ", @@ -139,6 +141,7 @@ object FileAliasData { "id" to "Berkas", "ie" to "File", "ig" to "Usòrò", + "igl" to "Fáílú", "ik" to "File", "ilo" to "Papeles", "inh" to "Файл", @@ -168,6 +171,7 @@ object FileAliasData { "ks" to "فَیِل", "ksh" to "Datei", "ku" to "Wêne", + "kus" to "File", "kv" to "Файл", "kw" to "Restren", "ky" to "Файл", diff --git a/app/src/main/java/org/wikipedia/staticdata/MainPageNameData.kt b/app/src/main/java/org/wikipedia/staticdata/MainPageNameData.kt index 11560615ec9..07e4459b8d3 100644 --- a/app/src/main/java/org/wikipedia/staticdata/MainPageNameData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/MainPageNameData.kt @@ -23,7 +23,7 @@ object MainPageNameData { "an" to "Portalada", "ang" to "Heafodtramet", "anp" to "मुख्य पृष्ठ", - "ar" to "الصفحة الرئيسية", + "ar" to "الصفحة الرئيسة", "arc" to "ܦܐܬܐ ܪܝܫܝܬܐ", "ary" to "الصفحة اللولا", "arz" to "الصفحه الرئيسيه", @@ -44,6 +44,7 @@ object MainPageNameData { "bcl" to "Panginot na Pahina", "be" to "Галоўная старонка", "be-tarask" to "Галоўная старонка", + "bew" to "Balé-balé", "bg" to "Начална страница", "bh" to "मुख्य पन्ना", "bi" to "Nambawan Pej", @@ -81,6 +82,7 @@ object MainPageNameData { "din" to "Apam këdït", "diq" to "Pela Seri", "dsb" to "Głowny bok", + "dtp" to "Natad tagayo", "dty" to "मुख्य पन्ना", "dv" to "މައި ޞަފްޙާ", "dz" to "མ་ཤོག།", @@ -139,6 +141,7 @@ object MainPageNameData { "id" to "Halaman Utama", "ie" to "Principal págine", "ig" to "Ihu mbụ", + "igl" to "Ogbá ogbolo", "ik" to "Aullaġniisaaġvik", "ilo" to "Umuna a Panid", "inh" to "Керттера оагӀув", @@ -168,6 +171,7 @@ object MainPageNameData { "ks" to "اَہَم صَفہٕ", "ksh" to "Wikipedia:Houpsigk", "ku" to "Destpêk", + "kus" to "Zug lakir", "kv" to "Медшӧр лист бок", "kw" to "Folen dre", "ky" to "Башкы барак", @@ -298,7 +302,7 @@ object MainPageNameData { "ti" to "መበገሲ ገጽ", "tk" to "Baş Sahypa", "tl" to "Unang Pahina", - "tly" to "Sarloha", + "tly" to "Sərlovhə", "tn" to "Main Page", "to" to "Peesi tali fiefia", "tpi" to "Fran pes", diff --git a/app/src/main/java/org/wikipedia/staticdata/SpecialAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/SpecialAliasData.kt index faa88cd47f6..e6ac4dab515 100644 --- a/app/src/main/java/org/wikipedia/staticdata/SpecialAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/SpecialAliasData.kt @@ -44,6 +44,7 @@ object SpecialAliasData { "bcl" to "Espesyal", "be" to "Адмысловае", "be-tarask" to "Спэцыяльныя", + "bew" to "Istimèwa", "bg" to "Специални", "bh" to "विशेष", "bi" to "Special", @@ -81,6 +82,7 @@ object SpecialAliasData { "din" to "Këcëweek", "diq" to "Bağse", "dsb" to "Specialne", + "dtp" to "Khas", "dty" to "बिशेष", "dv" to "ޚާއްސަ", "dz" to "Special", @@ -123,7 +125,7 @@ object SpecialAliasData { "gur" to "Zure", "guw" to "Vonọtaun", "gv" to "Er lheh", - "ha" to "Special", + "ha" to "Musamman", "hak" to "特殊", "haw" to "Papa nui", "he" to "מיוחד", @@ -139,6 +141,7 @@ object SpecialAliasData { "id" to "Istimewa", "ie" to "Special", "ig" to "Ihü kárírí", + "igl" to "Egwéyí", "ik" to "Special", "ilo" to "Espesial", "inh" to "Гӏулакха", @@ -168,6 +171,7 @@ object SpecialAliasData { "ks" to "خاص", "ksh" to "Extra", "ku" to "Taybet", + "kus" to "Special", "kv" to "Отсасян", "kw" to "Arbennek", "ky" to "Атайын", diff --git a/app/src/main/java/org/wikipedia/staticdata/TalkAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/TalkAliasData.kt index 620bafde1a4..2d054a58686 100644 --- a/app/src/main/java/org/wikipedia/staticdata/TalkAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/TalkAliasData.kt @@ -44,6 +44,7 @@ object TalkAliasData { "bcl" to "Olay", "be" to "Размовы", "be-tarask" to "Абмеркаваньне", + "bew" to "Kongko", "bg" to "Беседа", "bh" to "वार्तालाप", "bi" to "Talk", @@ -81,6 +82,7 @@ object TalkAliasData { "din" to "Jam", "diq" to "Vaten", "dsb" to "Diskusija", + "dtp" to "Perbincangan", "dty" to "कुरणि", "dv" to "ޚިޔާލު", "dz" to "Talk", @@ -123,7 +125,7 @@ object TalkAliasData { "gur" to "Tɔgum", "guw" to "Hodidọ", "gv" to "Resooney", - "ha" to "Talk", + "ha" to "Tattaunawa", "hak" to "討論", "haw" to "Kūkākūkā", "he" to "שיחה", @@ -139,6 +141,7 @@ object TalkAliasData { "id" to "Pembicaraan", "ie" to "Discussion", "ig" to "Okwu", + "igl" to "Úkọ̀lá", "ik" to "Talk", "ilo" to "Tungtungan", "inh" to "Ювцар", @@ -168,6 +171,7 @@ object TalkAliasData { "ks" to "کَتھ", "ksh" to "Klaaf", "ku" to "Gotûbêj", + "kus" to "Talk", "kv" to "Сёрнитанiн", "kw" to "Keskows", "ky" to "Талкуу", diff --git a/app/src/main/java/org/wikipedia/staticdata/UserAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/UserAliasData.kt index a4dc084b2f2..ab0b7f58170 100644 --- a/app/src/main/java/org/wikipedia/staticdata/UserAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/UserAliasData.kt @@ -44,6 +44,7 @@ object UserAliasData { "bcl" to "Paragamit", "be" to "Удзельнік", "be-tarask" to "Удзельнік", + "bew" to "Pemaké", "bg" to "Потребител", "bh" to "प्रयोगकर्ता", "bi" to "User", @@ -81,6 +82,7 @@ object UserAliasData { "din" to "Dulooi", "diq" to "Karber", "dsb" to "Wužywaŕ", + "dtp" to "Pengguna", "dty" to "प्रयोगकर्ता", "dv" to "މެމްބަރު", "dz" to "User", @@ -139,6 +141,7 @@ object UserAliasData { "id" to "Pengguna", "ie" to "Usator", "ig" to "Ọbanife", + "igl" to "Énéagwu", "ik" to "User", "ilo" to "Agar-aramat", "inh" to "Доакъашхо", @@ -168,6 +171,7 @@ object UserAliasData { "ks" to "رُکُن", "ksh" to "Metmaacher", "ku" to "Bikarhêner", + "kus" to "User", "kv" to "Пырысь", "kw" to "Devnydhyer", "ky" to "Колдонуучу", diff --git a/app/src/main/java/org/wikipedia/staticdata/UserTalkAliasData.kt b/app/src/main/java/org/wikipedia/staticdata/UserTalkAliasData.kt index 652467ad8c4..47827c129b8 100644 --- a/app/src/main/java/org/wikipedia/staticdata/UserTalkAliasData.kt +++ b/app/src/main/java/org/wikipedia/staticdata/UserTalkAliasData.kt @@ -44,6 +44,7 @@ object UserTalkAliasData { "bcl" to "Olay kan paragamit", "be" to "Размовы з удзельнікам", "be-tarask" to "Гутаркі ўдзельніка", + "bew" to "Kongko pemaké", "bg" to "Потребител беседа", "bh" to "प्रयोगकर्ता वार्ता", "bi" to "User talk", @@ -81,6 +82,7 @@ object UserTalkAliasData { "din" to "Jam kekë dulooi", "diq" to "Karber vaten", "dsb" to "Diskusija wužywarja", + "dtp" to "Perbincangan pengguna", "dty" to "प्रयोगकर्ता कुरणि", "dv" to "މެމްބަރުގެ ވާހަކަ", "dz" to "User talk", @@ -123,7 +125,7 @@ object UserTalkAliasData { "gur" to "Tuntuna tɔgum", "guw" to "Zinzantọ hodidọ", "gv" to "Resooney ymmydeyr", - "ha" to "User talk", + "ha" to "Tattaunawar user", "hak" to "使用者討論", "haw" to "Kūkākūkā o mea hoʻohana", "he" to "שיחת משתמש", @@ -139,6 +141,7 @@ object UserTalkAliasData { "id" to "Pembicaraan Pengguna", "ie" to "Usator Discussion", "ig" to "Okwu ọbanife", + "igl" to "Úkọ̀lá énéagwu", "ik" to "User talk", "ilo" to "Agar-aramat tungtungan", "inh" to "Доакъашхочун дувцар", @@ -168,6 +171,7 @@ object UserTalkAliasData { "ks" to "رُکُن کَتھ", "ksh" to "Metmaacher Klaaf", "ku" to "Gotûbêja bikarhêner", + "kus" to "User talk", "kv" to "Пырыськӧд сёрнитанiн", "kw" to "Keskows Devnydhyer", "ky" to "Колдонуучунун баарлашуулары", diff --git a/app/src/main/res/values/languages_list.xml b/app/src/main/res/values/languages_list.xml index 34a4f9bc959..3c6c21c86c9 100644 --- a/app/src/main/res/values/languages_list.xml +++ b/app/src/main/res/values/languages_list.xml @@ -4,8 +4,9 @@ en es ru - de ja + de + fr zh-cn zh-hans zh-hant @@ -14,349 +15,353 @@ zh-my zh-sg zh-tw - fr pt it ar id - tr fa - pl + tr ko + pl nl vi hi uk th - simple cs + simple sv - ro hu - el + ro he - fi + el bn + fi sr-ec sr-el sr - nb ms + nb hr da bg ta ca sk - kk - mr - sh-cyrl - sh-latn - sh uz-cyrl uz-latn uz + kk arz az - tl - te + sh-cyrl + sh-latn + sh lt - ml - bs - zh-yue + mr + te ka + bs + ml sl + tl + zh-yue sq hy - ur et + ur lv - kn mk af - ky + kn + gl sw - km - gu mn - gl + ky + eu + km my + be si - eu + cy nn - be + gu + eo ast + is wuu-hans wuu-hant wuu - cy ne - is - bh - eo as + bh tg-latn tg - ckb - sco ceb + ckb pa la - ha - jv azb - bcl - mzn + ha be-tarask - am + sco als - so + mzn tt + jv + so + zh-min-nan an - map-bms - tk - su - pnb lb + am + bcl br - zh-min-nan - bar + oc ce + war + pnb fy + tk ku-arab ku-latn ku - oc - ig + ga + su + lmo + bar zh-classical or ba - war - gor - lmo - ga + min + map-bms + vec + cv + ig li - xmf - gan-hans - gan-hant - gan - nds-nl - mai + nds + gor + mg ps - bpy + scn ary - nds + xmf + bpy io - mi - rue ia - min + diq + nds-nl anp - vec - mg - cv - ts - scn yi - ht + sa sah - hif + gan-hans + gan-hant + gan + rue + gn + ilo ban-bali ban-x-dharma ban-x-palmleaf ban-x-pku ban - frr - ilo - gn - sa + ht + hif fo - diq - rw - new - hyw - sn - pam + mai + frr yo - mt - eml qu + sn + new sd - om - bo + hsb lij szl + hyw + gd + rw + zu + pms + os + mt + bo + hak + eml + mhr + pam + lld + vls + ang + sat + wa + nap crh-cyrl crh-latn crh - vls - ang - dty - os se - lo - sc - kw - hsb - zu - gd cdo - lld - wa - hak - nap + om + sc + vo + lo + bat-smg + smn + gv + kaa ace - pms + co + kw + myv + fiu-vro awa + vep + kab ie + ug + frp bjn - bat-smg - vo - fiu-vro - co + dty + ts + mi + nv + avk + pap gag - kab - tcy - vep - smn - kaa - pcd - mhr - glk - frp roa-tara ext - ug - pap - chr - gv - gom - gpe - pdc - avk - udm - lfn - tet - ln - lez + lad ksh - bi nso - dsb av - nv - myv - csb - lad + lfn + pcd + tcy + dsb + krc + stq shn zea - fur + udm + csb bxr - stq - gcr - krc - sat xh - kv - bbc + nrm + fur + tet mdf + glk + tly-cyrl + tly + ln + lez + kv + dag olo - pfl - nrm mwl - haw - dv - inh - ny - ay - to - pag nah + inh + mrj + pfl rm - lg tum - tyv - tly-cyrl - tly cbk-zam - ike-cans - ike-latn - iu - za - ik - tpi - tw - dag - ks + pdc jam - fj - mrj + ks + ay roa-rup - mni - arc - ki - nov - jbo - koi - bug - skr + bbc + tpi + za pih + dv + tyv + bug + chr cu + pag + arc + gom + jbo + nov + gpe + to + gcr + kbd + mni wo - pnt - kbp - sm - chy + bi + lg + zgh-latn + zgh xal + haw + tw + kbp + szy + koi + ny + mnw + skr + blk tn - zgh - ltg + ike-cans + ike-latn + iu + pi shi-latn shi-tfng shi - mnw + sm + cr + fj + ff + ss + kg + pnt alt + st bm - mad - kbd - kg - ss - ve - lbe - ff + ik got - srn ady - st - rmy - szy + lbe + ch + ltg ee - blk - pi - cr dz - ti - ch + mad + ki + srn + kcg + rmy rn - atj - ty - nia + ve + chy ami - kl + ti nqo - kcg + nia + kl sg - trv + atj + ty tay - guc din + dga + guc + trv pcm guw - pwn fon + pwn gur - dga fat + bew + igl + kus + dtp test ab @@ -364,8 +369,9 @@ en es ru - de ja + de + fr zh-Hans-CN zh-Hans zh-Hant @@ -374,349 +380,353 @@ zh-Hans-MY zh-Hans-SG zh-Hant-TW - fr pt it ar id - tr fa - pl + tr ko + pl nl vi hi uk th - en-simple cs + en-simple sv - ro hu - el + ro he - fi + el bn + fi sr-Cyrl sr-Latn sr - nb ms + nb hr da bg ta ca sk - kk - mr - sh-Cyrl - sh-Latn - sh uz-Cyrl uz-Latn uz + kk arz az - tl - te + sh-Cyrl + sh-Latn + sh lt - ml - bs - yue + mr + te ka + bs + ml sl + tl + yue sq hy - ur et + ur lv - kn mk af - ky + kn + gl sw - km - gu mn - gl + ky + eu + km my + be si - eu + cy nn - be + gu + eo ast + is wuu-Hans wuu-Hant wuu - cy ne - is - bh - eo as + bh tg-Latn tg - ckb - sco ceb + ckb pa la - ha - jv azb - bcl - mzn + ha be-tarask - am + sco gsw - so + mzn tt + jv + so + nan an - jv-x-bms - tk - su - pnb lb + am + bcl br - nan - bar + oc ce + war + pnb fy + tk ku-Arab ku-Latn ku - oc - ig + ga + su + lmo + bar lzh or ba - war - gor - lmo - ga + min + jv-x-bms + vec + cv + ig li + nds + gor + mg + ps + scn + ary xmf - gan-Hans - gan-Hant - gan - nds-NL - mai - ps bpy - ary - nds io - mi - rue ia - min + diq + nds-NL anp - vec - mg - cv - ts - scn yi - ht + sa sah - hif + gan-Hans + gan-Hant + gan + rue + gn + ilo ban-Bali ban-x-dharma ban-x-palmleaf ban-x-pku ban - frr - ilo - gn - sa + ht + hif fo - diq - rw - new - hyw - sn - pam + mai + frr yo - mt - egl qu + sn + new sd - om - bo + hsb lij szl + hyw + gd + rw + zu + pms + os + mt + bo + hak + egl + mhr + pam + lld + vls + ang + sat + wa + nap crh-Cyrl crh-Latn crh - vls - ang - dty - os se - lo - sc - kw - hsb - zu - gd cdo - lld - wa - hak - nap + om + sc + vo + lo + sgs + smn + gv + kaa ace - pms + co + kw + myv + vro awa + vep + kab ie + ug + frp bjn - sgs - vo - vro - co + dty + ts + mi + nv + avk + pap gag - kab - tcy - vep - smn - kaa - pcd - mhr - glk - frp nap-x-tara ext - ug - pap - chr - gv - gom - gpe - pdc - avk - udm - lfn - tet - ln - lez + lad ksh - bi nso - dsb av - nv - myv - csb - lad + lfn + pcd + tcy + dsb + krc + stq shn zea - fur + udm + csb bxr - stq - gcr - krc - sat xh - kv - bbc + nrf + fur + tet mdf + glk + tly-Cyrl + tly + ln + lez + kv + dag olo - pfl - nrf mwl - haw - dv - inh - ny - ay - to - pag nah + inh + mrj + pfl rm - lg tum - tyv - tly-Cyrl - tly cbk - ike-Cans - ike-Latn - iu - za - ik - tpi - tw - dag - ks + pdc jam - fj - mrj + ks + ay rup - mni - arc - ki - nov - jbo - koi - bug - skr + bbc + tpi + za pih + dv + tyv + bug + chr cu + pag + arc + gom + jbo + nov + gpe + to + gcr + kbd + mni wo - pnt - kbp - sm - chy + bi + lg + zgh-Latn + zgh xal + haw + tw + kbp + szy + koi + ny + mnw + skr + blk tn - zgh - ltg + ike-Cans + ike-Latn + iu + pi shi-Latn shi-Tfng shi - mnw + sm + cr + fj + ff + ss + kg + pnt alt + st bm - mad - kbd - kg - ss - ve - lbe - ff + ik got - srn ady - st - rmy - szy + lbe + ch + ltg ee - blk - pi - cr dz - ti - ch + mad + ki + srn + kcg + rmy rn - atj - ty - nia + ve + chy ami - kl + ti nqo - kcg + nia + kl sg - trv + atj + ty tay - guc din + dga + guc + trv pcm guw - pwn fon + pwn gur - dga fat + bew + igl + kus + dtp test ab @@ -724,8 +734,9 @@ English español русский - Deutsch 日本語 + Deutsch + français 中文(中国大陆) 中文(简体) 中文(繁體) @@ -734,349 +745,353 @@ 中文(马来西亚) 中文(新加坡) 中文(臺灣) - français português italiano العربية Bahasa Indonesia - Türkçe فارسی - polski + Türkçe 한국어 + polski Nederlands Tiếng Việt हिन्दी українська ไทย - Simple English čeština + Simple English svenska - română magyar - Ελληνικά + română עברית - suomi + Ελληνικά বাংলা + suomi српски (ћирилица) srpski (latinica) српски / srpski - norsk bokmål Bahasa Melayu + norsk bokmål hrvatski dansk български தமிழ் català slovenčina - қазақша - मराठी - српскохрватски (ћирилица) - srpskohrvatski (latinica) - srpskohrvatski / српскохрватски ўзбекча oʻzbekcha oʻzbekcha / ўзбекча + қазақша مصرى azərbaycanca - Tagalog - తెలుగు + српскохрватски (ћирилица) + srpskohrvatski (latinica) + srpskohrvatski / српскохрватски lietuvių - മലയാളം - bosanski - 粵語 + मराठी + తెలుగు ქართული + bosanski + മലയാളം slovenščina + Tagalog + 粵語 shqip հայերեն - اردو eesti + اردو latviešu - ಕನ್ನಡ македонски Afrikaans - кыргызча + ಕನ್ನಡ + galego Kiswahili - ភាសាខ្មែរ - ગુજરાતી монгол - galego + кыргызча + euskara + ភាសាខ្មែរ မြန်မာဘာသာ + беларуская සිංහල - euskara + Cymraeg norsk nynorsk - беларуская + ગુજરાતી + Esperanto asturianu + íslenska 吴语(简体) 吳語(正體) 吴语 - Cymraeg नेपाली - íslenska - भोजपुरी - Esperanto অসমীয়া + भोजपुरी tojikī тоҷикӣ - کوردی - Scots Cebuano + کوردی ਪੰਜਾਬੀ Latina - Hausa - Jawa تۆرکجه - Bikol Central - مازِرونی + Hausa беларуская (тарашкевіца) - አማርኛ + Scots Alemannisch - Soomaaliga + مازِرونی татарча / tatarça + Jawa + Soomaaliga + Bân-lâm-gú aragonés - Basa Banyumasan - Türkmençe - Sunda - پنجابی Lëtzebuergesch + አማርኛ + Bikol Central brezhoneg - Bân-lâm-gú - Boarisch + occitan нохчийн + Winaray + پنجابی Frysk - كوردي (عەرەبی) + Türkmençe + کوردی (عەرەبی) kurdî (latînî) kurdî - occitan - Igbo + Gaeilge + Sunda + lombard + Boarisch 文言 ଓଡ଼ିଆ башҡортса - Winaray - Bahasa Hulontalo - lombard - Gaeilge + Minangkabau + Basa Banyumasan + vèneto + чӑвашла + Igbo Limburgs - მარგალური - 赣语(简体) - 贛語(繁體) - 贛語 - Nedersaksies - मैथिली + Plattdüütsch + Bahasa Hulontalo + Malagasy پښتو - বিষ্ণুপ্রিয়া মণিপুরী + sicilianu الدارجة - Plattdüütsch + მარგალური + বিষ্ণুপ্রিয়া মণিপুরী Ido - Māori - русиньскый interlingua - Minangkabau + Zazaki + Nedersaksies अंगिका - vèneto - Malagasy - чӑвашла - Xitsonga - sicilianu ייִדיש - Kreyòl ayisyen + संस्कृतम् саха тыла - Fiji Hindi + 赣语(简体) + 贛語(繁體) + 贛語 + русиньскый + Avañe\'ẽ + Ilokano ᬩᬲᬩᬮᬶ Basa Bali - Nordfriisk - Ilokano - Avañe\'ẽ - संस्कृतम् + Kreyòl ayisyen + Fiji Hindi føroyskt - Zazaki - Ikinyarwanda - नेपाल भाषा - Արեւմտահայերէն - chiShona - Kapampangan + मैथिली + Nordfriisk Yorùbá - Malti - emiliàn e rumagnòl Runa Simi + chiShona + नेपाल भाषा سنڌي - Oromoo - བོད་ཡིག + hornjoserbsce Ligure ślůnski + Արեւմտահայերէն + Gàidhlig + Ikinyarwanda + isiZulu + Piemontèis + ирон + Malti + བོད་ཡིག + 客家語/Hak-kâ-ngî + emiliàn e rumagnòl + олык марий + Kapampangan + Ladin + West-Vlams + Ænglisc + ᱥᱟᱱᱛᱟᱲᱤ + walon + Napulitano къырымтатарджа (Кирилл) qırımtatarca (Latin) qırımtatarca - West-Vlams - Ænglisc - डोटेली - ирон davvisámegiella - ລາວ - sardu - kernowek - hornjoserbsce - isiZulu - Gàidhlig 閩東語 / Mìng-dĕ̤ng-ngṳ̄ - Ladin - walon - 客家語/Hak-kâ-ngî - Napulitano + Oromoo + sardu + Volapük + ລາວ + žemaitėška + anarâškielâ + Gaelg + Qaraqalpaqsha Acèh - Piemontèis + corsu + kernowek + эрзянь + võro अवधी + vepsän kel’ + Taqbaylit Interlingue + ئۇيغۇرچە / Uyghurche + arpetan Banjar - žemaitėška - Volapük - võro - corsu + डोटेली + Xitsonga + Māori + Diné bizaad + Kotava + Papiamentu Gagauz - Taqbaylit - ತುಳು - vepsän kel’ - anarâškielâ - Qaraqalpaqsha - Picard - олык марий - گیلکی - arpetan tarandíne estremeñu - ئۇيغۇرچە / Uyghurche - Papiamentu - ᏣᎳᎩ - Gaelg - गोंयची कोंकणी / Gõychi Konknni - Ghanaian Pidgin - Deitsch - Kotava - удмурт - Lingua Franca Nova - tetun - lingála - лезги + Ladino Ripoarisch - Bislama Sesotho sa Leboa - dolnoserbski авар - Diné bizaad - эрзянь - kaszëbsczi - Ladino + Lingua Franca Nova + Picard + ತುಳು + dolnoserbski + къарачай-малкъар + Seeltersk ၽႃႇသႃႇတႆး Zeêuws - furlan + удмурт + kaszëbsczi буряад - Seeltersk - kriyòl gwiyannen - къарачай-малкъар - ᱥᱟᱱᱛᱟᱲᱤ isiXhosa - коми - Batak Toba + Nouormand + furlan + tetun мокшень + گیلکی + толыши + tolışi + lingála + лезги + коми + dagbanli livvinkarjala - Pälzisch - Nouormand Mirandés - Hawaiʻi - ދިވެހިބަސް - гӀалгӀай - Chi-Chewa - Aymar aru - lea faka-Tonga - Pangasinan Nāhuatl + гӀалгӀай + кырык мары + Pälzisch rumantsch - Luganda - chiTumbuka - тыва дыл - толыши - tolışi - Chavacano de Zamboanga - ᐃᓄᒃᑎᑐᑦ - inuktitut - ᐃᓄᒃᑎᑐᑦ / inuktitut - Vahcuengh - Iñupiatun - Tok Pisin - Twi - dagbanli - कॉशुर / کٲشُر + chiTumbuka + Chavacano de Zamboanga + Deitsch Patois - Na Vosa Vakaviti - кырык мары + कॉशुर / کٲشُر + Aymar aru armãneashti - ꯃꯤꯇꯩ ꯂꯣꯟ - ܐܪܡܝܐ - Gĩkũyũ - Novial - la .lojban. - перем коми - Basa Ugi - سرائیکی + Batak Toba + Tok Pisin + Vahcuengh Norfuk / Pitkern + ދިވެހިބަސް + тыва дыл + Basa Ugi + ᏣᎳᎩ словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ + Pangasinan + ܐܪܡܝܐ + गोंयची कोंकणी / Gõychi Konknni + la .lojban. + Novial + Ghanaian Pidgin + lea faka-Tonga + kriyòl gwiyannen + адыгэбзэ + ꯃꯤꯇꯩ ꯂꯣꯟ Wolof - Ποντιακά - Kabɩyɛ - Gagana Samoa - Tsetsêhestâhese + Bislama + Luganda + tamaziɣt tanawayt + ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ хальмг + Hawaiʻi + Twi + Kabɩyɛ + Sakizaya + перем коми + Chi-Chewa + ဘာသာမန် + سرائیکی + ပအိုဝ်ႏဘာႏသာႏ Setswana - ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ - latgaļu + ᐃᓄᒃᑎᑐᑦ + inuktitut + ᐃᓄᒃᑎᑐᑦ / inuktitut + पालि Taclḥit ⵜⴰⵛⵍⵃⵉⵜ Taclḥit - ဘာသာမန် + Gagana Samoa + Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ + Na Vosa Vakaviti + Fulfulde + SiSwati + Kongo + Ποντιακά алтай тил + Sesotho bamanankan - Madhurâ - адыгэбзэ - Kongo - SiSwati - Tshivenda - лакку - Fulfulde + Iñupiatun 𐌲𐌿𐍄𐌹𐍃𐌺 - Sranantongo адыгабзэ - Sesotho - romani čhib - Sakizaya + лакку + Chamoru + latgaļu eʋegbe - ပအိုဝ်ႏဘာႏသာႏ - पालि - Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ ཇོང་ཁ - ትግርኛ - Chamoru + Madhurâ + Gĩkũyũ + Sranantongo + Tyap + romani čhib ikirundi - Atikamekw - reo tahiti - Li Niha + Tshivenda + Tsetsêhestâhese Pangcah - kalaallisut + ትግርኛ ߒߞߏ - Tyap + Li Niha + kalaallisut Sängö - Seediq + Atikamekw + reo tahiti Tayal - wayuunaiki Thuɔŋjäŋ + Dagaare + wayuunaiki + Seediq Naijá gungbe - pinayuanan fɔ̀ngbè + pinayuanan farefare - Dagaare mfantse + Betawi + Igala + Kʋsaal + Dusun Bundu-liwan Test аԥсшәа @@ -1084,8 +1099,9 @@ English Spanish Russian - German Japanese + German + French Chinese (China) Simplified Chinese Traditional Chinese @@ -1094,349 +1110,353 @@ Chinese (Malaysia) Chinese (Singapore) Chinese (Taiwan) - French Portuguese Italian Arabic Indonesian - Turkish Persian - Polish + Turkish Korean + Polish Dutch Vietnamese Hindi Ukrainian Thai - Simple English Czech + Simple English Swedish - Romanian Hungarian - Greek + Romanian Hebrew - Finnish + Greek Bangla + Finnish Serbian (Cyrillic script) Serbian (Latin script) Serbian - Norwegian Malay + Norwegian Croatian Danish Bulgarian Tamil Catalan Slovak - Kazakh - Marathi - Serbo-Croatian (Cyrillic script) - Serbo-Croatian (Latin script) - Serbo-Croatian Uzbek (Cyrillic script) Uzbek (Latin script) Uzbek + Kazakh Egyptian Arabic Azerbaijani - Tagalog - Telugu + Serbo-Croatian (Cyrillic script) + Serbo-Croatian (Latin script) + Serbo-Croatian Lithuanian - Malayalam - Bosnian - Cantonese + Marathi + Telugu Georgian + Bosnian + Malayalam Slovenian + Tagalog + Cantonese Albanian Armenian - Urdu Estonian + Urdu Latvian - Kannada Macedonian Afrikaans - Kyrgyz + Kannada + Galician Swahili - Khmer - Gujarati Mongolian - Galician + Kyrgyz + Basque + Khmer Burmese + Belarusian Sinhala - Basque + Welsh Norwegian Nynorsk - Belarusian + Gujarati + Esperanto Asturian + Icelandic Wu (Simplified Han script) Wu (Traditional Han script) Wu - Welsh Nepali - Icelandic - Bhojpuri - Esperanto Assamese + Bhojpuri Tajik (Latin script) Tajik - Central Kurdish - Scots Cebuano + Central Kurdish Punjabi Latin - Hausa - Javanese South Azerbaijani - Central Bikol - Mazanderani + Hausa Belarusian (Taraškievica orthography) - Amharic + Scots Alemannic - Somali + Mazanderani Tatar + Javanese + Somali + Minnan Aragonese - Basa Banyumasan - Turkmen - Sundanese - Western Punjabi Luxembourgish + Amharic + Central Bikol Breton - Minnan - Bavarian + Occitan Chechen + Waray + Western Punjabi Western Frisian + Turkmen Kurdish (Arabic script) Kurdish (Latin script) Kurdish - Occitan - Igbo + Irish + Sundanese + Lombard + Bavarian Literary Chinese Odia Bashkir - Waray - Gorontalo - Lombard - Irish + Minangkabau + Basa Banyumasan + Venetian + Chuvash + Igbo Limburgish - Mingrelian - Gan (Simplified Han script) - Gan (Traditional Han script) - Gan - Low Saxon - Maithili + Low German + Gorontalo + Malagasy Pashto - Bishnupriya + Sicilian Moroccan Arabic - Low German + Mingrelian + Bishnupriya Ido - Māori - Rusyn Interlingua - Minangkabau + Zazaki + Low Saxon Angika - Venetian - Malagasy - Chuvash - Tsonga - Sicilian Yiddish - Haitian Creole + Sanskrit Yakut - Fiji Hindi + Gan (Simplified Han script) + Gan (Traditional Han script) + Gan + Rusyn + Guarani + Iloko Balinese (Balinese script) Balinese - Northern Frisian - Iloko - Guarani - Sanskrit - Faroese - Zazaki - Kinyarwanda - Newari - Western Armenian - Shona - Pampanga + Haitian Creole + Fiji Hindi + Faroese + Maithili + Northern Frisian Yoruba - Maltese - Emiliano-Romagnolo Quechua + Shona + Newari Sindhi - Oromo - Tibetan + Upper Sorbian Ligurian Silesian + Western Armenian + Scottish Gaelic + Kinyarwanda + Zulu + Piedmontese + Ossetic + Maltese + Tibetan + Hakka Chinese + Emiliano-Romagnolo + Eastern Mari + Pampanga + Ladin + West Flemish + Old English + Santali + Walloon + Neapolitan Crimean Tatar (Cyrillic script) Crimean Tatar (Latin script) Crimean Tatar - West Flemish - Old English - Doteli - Ossetic Northern Sami - Lao - Sardinian - Cornish - Upper Sorbian - Zulu - Scottish Gaelic Mindong - Ladin - Walloon - Hakka Chinese - Neapolitan + Oromo + Sardinian + Volapük + Lao + Samogitian + Inari Sami + Manx + Kara-Kalpak Achinese - Piedmontese + Corsican + Cornish + Erzya + Võro Awadhi + Veps + Kabyle Interlingue + Uyghur + Arpitan Banjar - Samogitian - Volapük - Võro - Corsican + Doteli + Tsonga + Māori + Navajo + Kotava + Papiamento Gagauz - Kabyle - Tulu - Veps - Inari Sami - Kara-Kalpak - Picard - Eastern Mari - Gilaki - Arpitan Tarantino Extremaduran - Uyghur - Papiamento - Cherokee - Manx - Goan Konkani - Ghanaian Pidgin - Pennsylvania German - Kotava - Udmurt - Lingua Franca Nova - Tetum - Lingala - Lezghian + Ladino Colognian - Bislama Northern Sotho - Lower Sorbian Avaric - Navajo - Erzya - Kashubian - Ladino + Lingua Franca Nova + Picard + Tulu + Lower Sorbian + Karachay-Balkar + Saterland Frisian Shan Zeelandic - Friulian + Udmurt + Kashubian Russia Buriat - Saterland Frisian - Guianan Creole - Karachay-Balkar - Santali Xhosa - Komi - Batak Toba + Norman + Friulian + Tetum Moksha + Gilaki + Talysh (Cyrillic script) + Talysh + Lingala + Lezghian + Komi + Dagbani Livvi-Karelian - Palatine German - Norman Mirandese - Hawaiian - Divehi - Ingush - Nyanja - Aymara - Tongan - Pangasinan Nāhuatl + Ingush + Western Mari + Palatine German Romansh - Ganda Tumbuka - Tuvinian - Talysh (Cyrillic script) - Talysh Chavacano - Eastern Canadian (Aboriginal syllabics) - Eastern Canadian (Latin script) - Inuktitut - Zhuang - Inupiaq - Tok Pisin - Twi - Dagbani - Kashmiri + Pennsylvania German Jamaican Creole English - Fijian - Western Mari + Kashmiri + Aymara Aromanian - Manipuri - Aramaic - Kikuyu - Novial - Lojban - Komi-Permyak - Buginese - Saraiki + Batak Toba + Tok Pisin + Zhuang Norfuk / Pitkern + Divehi + Tuvinian + Buginese + Cherokee Church Slavic + Pangasinan + Aramaic + Goan Konkani + Lojban + Novial + Ghanaian Pidgin + Tongan + Guianan Creole + Kabardian + Manipuri Wolof - Pontic - Kabiye - Samoan - Cheyenne + Bislama + Ganda + tamaziɣt tanawayt + Standard Moroccan Tamazight Kalmyk + Hawaiian + Twi + Kabiye + Sakizaya + Komi-Permyak + Nyanja + Mon + Saraiki + Pa\'O Tswana - Standard Moroccan Tamazight - Latgalian + Eastern Canadian (Aboriginal syllabics) + Eastern Canadian (Latin script) + Inuktitut + Pali Tachelhit (Latin script) Tachelhit (Tifinagh script) Tachelhit - Mon + Samoan + Cree + Fijian + Fula + Swati + Kongo + Pontic Southern Altai + Southern Sotho Bambara - Madurese - Kabardian - Kongo - Swati - Venda - Lak - Fula + Inupiaq Gothic - Sranan Tongo Adyghe - Southern Sotho - Vlax Romani - Sakizaya + Lak + Chamorro + Latgalian Ewe - Pa\'O - Pali - Cree Dzongkha - Tigrinya - Chamorro + Madurese + Kikuyu + Sranan Tongo + Tyap + Vlax Romani Rundi - Atikamekw - Tahitian - Nias + Venda + Cheyenne Amis - Kalaallisut + Tigrinya N’Ko - Tyap + Nias + Kalaallisut Sango - Taroko + Atikamekw + Tahitian Tayal - Wayuu Dinka + Dagaare + Wayuu + Taroko Nigerian Pidgin Gun - Paiwan Fon + Paiwan Frafra - Dagaare Fanti + Betawi + Igala + Kʋsaal + Central Dusun Test Abkhazian @@ -1453,6 +1473,7 @@ tly,tly-cyrl uz,uz-cyrl,uz-latn wuu,wuu-hans,wuu-hant + zgh,zgh-latn zh,zh-cn,zh-hans,zh-hant,zh-hk,zh-mo,zh-my,zh-sg,zh-tw From 6e6043522d691d28d44154db7b24339832385e98 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 13 Jun 2024 16:00:50 +0300 Subject: [PATCH 185/626] Localisation updates from https://translatewiki.net. (#4743) --- .../main/res/values-b+be+x+old/strings.xml | 6 +- app/src/main/res/values-es/strings.xml | 3 + app/src/main/res/values-fa/strings.xml | 10 ++ app/src/main/res/values-nb/strings.xml | 92 +++++++++++++++++-- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 5 files changed, 99 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-b+be+x+old/strings.xml b/app/src/main/res/values-b+be+x+old/strings.xml index f9728d90da8..de3fbd7ab82 100644 --- a/app/src/main/res/values-b+be+x+old/strings.xml +++ b/app/src/main/res/values-b+be+x+old/strings.xml @@ -154,7 +154,7 @@ Далучайцеся да Вікіпэдыі Забылі пароль? Ужо маеце ўліковы запіс? - Стварыць рахунак + Стварыць уліковы запіс Праверка Адрас электроннай пошты (не абавязкова) Паўтарыць пароль @@ -163,10 +163,10 @@ Няслушны адрас электроннай пошты Недапушчальныя сымбалі ў імені ўдзельніка Пароль мусіць мець прынамсі 8 сымбалеў - Немагчыма стварыць рахунак + Немагчыма стварыць уліковы запіс Далей Стварыць уліковы запіс без э-пошты? - Стварыць рахунак + Стварыць уліковы запіс Агульныя Частыя пытаньні па дастасаваньню Вікіпэдыя Дастаць водгук пра дастасаваньне diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7c5ba59159c..a3cb3a555dc 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1376,6 +1376,7 @@ Comparte el motivo de la reversión: La revisión se deshizo. Comparar + Solo se pueden seleccionar dos revisiones. %1$s y su página de discusión han sido añadidos a tu lista de seguimiento %2$s. Cambiar permanentemente @@ -1437,6 +1438,8 @@ Actual Error al reproducir medios. Contribuciones + Ver en mapa + No hay coordenadas geográficas disponibles para esta página Compartir… Compartir esta lista de lectura con otros ¡Hola! Me gustaría compartir mi lista de lectura de Wikipedia contigo: diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 69e69cf6ca1..26fb80adf36 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -163,6 +163,7 @@ زبان‌های ویکی‌پدیای شما انتشار تغییرات ویرایش منتشر شد! + ویرایش منتشر شد! اعمال تغییرات ممکن است زمان ببرد. ویرایش اِعمال نشد! تلاش مجدد انصراف @@ -205,6 +206,8 @@ شما از حساب کاربری‌تان در ویکی‌پدیا خارج شده‌اید. آیا می‌خواهید دوباره وارد شوید؟ ورود انصراف + حذف حساب + هشدار حذف حساب اخیراً هیچ مقاله‌ای دیده نشده است پیگیری مواردی که قبلاً مطالعه کردید. برخی از مقالات در تاریخچه ممکن است در حالت آفلاین دیده نشوند. @@ -1146,6 +1149,7 @@ جستجو در ویکی‌پدیا با به‌روزرسانی مداوم خوراک بازدید.<br/> <b>شخصی‌سازی</b> خوراک به‌صورت دلخواه- به نحوی که در مورد رویدادهای تاریخی <b>در این روز </b> یا جستجوی <b>تصادفی</b> فهرست‌های مطالعه با همگام‌سازی می‌توانید از مقاله‌هایی برای مطالعه در آینده، حتی در زمانی که آفلاین هستید، یک فهرست مطالعه تهیه کنید. برای همگام‌سازی فهرست‌ها، به حساب ویکی‌پدیای خود وارد شوید. <a href=\"#login\">به ویکی‌پدیا ملحق شوید.</a> + داده‌ها و حریم خصوصی ارسال دادهٔ مصرف فهمیدم ما مورد(های) زیر را بر روی دستگاه شما یافتیم: @@ -1247,6 +1251,7 @@ ارتفاع پیکسل درج + درج راهنما ورود / پیوستن به ویکیپدیا سلام %s، آیا می‌دانستید که همه می‌توانند ویکی‌پدیا را ویرایش کنند؟ @@ -1538,6 +1543,7 @@ تشکر ویرایش سازنده‌ای می‌بینید؟ از کاربر برای مشارکت‌شان تشکر کنید پیگیری + بحث خنثی‌سازی/واگردانی آیا از این ویژگی راضی هستید؟ راضی @@ -1564,5 +1570,9 @@ سلام {{{username}}}، به‌نظر می‌رسد که بدون ارائهٔ خلاصهٔ ویرایش، مطالبی را از ویکی‌پدیا حذف کرده‌اید. لطفاً هرگاه مطلبی را به ویکی‌پدیا می‌افزایید یا حذف می‌کنید، در خلاصهٔ ویرایش دلیل کار خود را توضیح دهید. سلام {{{username}}، به‌نظر می‌رسد که بدون گفتگو در صفحهٔ بحث مقاله، محتوایی را از آن حذف کرده‌اید. لطفاً دقت داشته باشید که ویکی‌پدیا سانسور نمی‌شود و محتوا را نباید تنها به این دلیل که مناقشه‌برانگیز است، حذف کرد. اگر باور دارید که اطلاعات مورد نظر دقیق نیست، لطفاً در صفحهٔ بحث مقاله به‌دنبال کسب اجماع باشید. ویرایش + تأیید + رد + نقشه + فهرست لغو diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index d52b63cbbd5..11bb4b6064a 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -137,6 +137,7 @@ Dine Wikipedia-språk Publiser endringer Redigeringen ble publisert! + Redigering publisert! Det kan ta noe tid før endringene dukker opp. Redigering feilet! Prøv igjen Avbryt @@ -179,6 +180,9 @@ Du har blitt logget ut av Wikipedia. Vil du logge inn igjen? Logg inn Avbryt + Få kontoen til å forsvinne + Advarsel om å få konto til å forsvinne + Å få en konto til å forsvinne er <b>siste utvei</b>, og bør <b>kun brukes når du vil slutte å redigere for alltid</b> og også skjule så mange av tilknytningene dine som mulig.<br/><br/>Kontosletting på Wikipedia gjøres ved å endre kontonavnet ditt for å gjøre at andre ikke kan kjenne igjen bidragene dine i en prosess som kalles kontoforsvinning. <b>Å få en konto til å forsvinne garanterer ikke fullstendig anonymitet, og fjerner ikke bidragene dine fra prosjektene.</b> Ingen nylig besøkte sider Finn igjen det du har lest her. Det kan hende at noen artikler i historikken ikke kan vises når du er uten nett. @@ -250,15 +254,15 @@ https://en.wikipedia.org/wiki/Wikipedia:Request_an_account https://creativecommons.org/licenses/by-sa/4.0/deed.no https://creativecommons.org/publicdomain/zero/1.0/deed.no - https://m.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_tags + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_tags Bibliotek brukt Bidragsytere <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Teamets side</a> Oversettere Appen ble oversatt av frivillige oversettere på <a href=\"https://translatewiki.net\">translatewiki.net</a>. Lisens - Kildekode tilgjengelig på <a href=\"https://gerrit.wikimedia.org/r/#/admin/projects/apps/android/wikipedia\">Gerrit</a> og <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> under <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0-lisensen</a>. Om ikke annet er angitt, er innhold tilgjengelig under lisensen <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Navngivelse-DelPåSammeVilkår</a>. + Kildekode tilgjengelig på <a href=\"https://github.com/wikimedia/apps-android-wikipedia\">GitHub</a> under <a href=\"https://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0-lisensen</a>. Om ikke annet er angitt, er innhold tilgjengelig under lisensen <a href=\"https://creativecommons.org/licenses/by-sa/4.0\">Creative Commons Navngivelse-DelPåSammeVilkår</a>. Et produkt fra <a href=\"https://wikimediafoundation.org/\">Wikimedia Foundation</a> Om Denne siden har blitt endret. Er du sikker på at du ønsker å avslutte uten å lagre endringene dine? @@ -288,6 +292,8 @@ La til lenker Annet Andre måter du kan forbedre denne siden + La til kort beskrivelse + Oppdaterte kort beskrivelse Redigeringskonflikt Siden har blitt redigert av en annen bruker i mellomtiden. Du kan kopiere endringene dine, gå tilbake og laste siden på nytt og prøve på nytt. Redigeringsnotiser @@ -411,6 +417,7 @@ Lagre Lagret Del + Denne artikkelen er en spire, hvilket betyr at det ikke er nok innhold i artikkelen til å generere en forhåndsvisning. Du kan endre på det. Siden eksisterer ikke Wikipedia har ikke en <a href=\"%1$s\">brukerside</a> med dette navnet. Denne siden bør kun opprettes og redigeres av <b>%2$s</b>. Hvis du er i tvil, sjekk om «%3$s» eksisterer. Kan ikke koble til internett @@ -433,6 +440,25 @@ Du kan kontakte <a href=\"%2$s\">%1$s</a> eller en annen <a href=\"https://no.wikipedia.org/wiki/Wikipedia:Administratorer\">administrator</a> for å diskutere blokkeringen. Tilpass verktøylinje Du kan kontakte en <a href=\"https://no.wikipedia.org/wiki/Wikipedia:Administratorer\">administrator</a> for å diskutere blokkeringen. + Du er ikke logget inn + Når du gjør en redigering blir en <b>midlertidig konto</b> opprettet for å beskytte personvernet ditt. <a href=\"%1$s\">Lær mer</a>.<br /><br /><a href=\"https://#login\">Logg inn</a> eller <a href=\"https://#login\">opprett en konto</a> for å få kreditering for framtidige redigeringer du gjør og få tilgang til andre funksjoner. + Redigeringen din blir tilskrevet %1$s. IP-adressen din vil være synlig for administratorer.<br /><br />Hvis du <a href=\"https://#login\">logger inn</a> eller <a href=\"https://#login\">oppretter en konto</a> blir redigeringene dine tilskrevet et navn du velger, blant andre fordeler. + Skjønner + Du bruker en midlertidig konto + Forkast endringer og logg inn + + Den midlertidige kontoen %1$s ble opprettet etter at redigeringen din ble publisert. Den vil utløpe om %2$d dag. + Den midlertidige kontoen %1$s ble opprettet etter at redigeringen din ble publisert. Den vil utløpe om %2$d dager. + + + Kontoen utløper om %d dag. + Kontoen utløper om %d dager. + + <b>Du er ikke logget inn.</b> Når du gjør en redigering blir en midlertidig konto opprettet for deg for å beskytte personvernet ditt. <a href=\"%1$s\">Lær mer</a> + <b>Du bruker en midlertidig konto.</b> Redigeringen din blir tilskrevet %1$s. <a href=\"%2$s\">Lær mer</a>. + <b>Du bruker for tiden en midlertidig konto.</b> Redigeringer som gjøres med den midlertidige kontoen %1$s overføres ikke til din permanente konto når du logger inn. Logg inn eller opprett en konto for å få kreditering til brukernavnet ditt, blant andre fordeler. + Avslutt økt + Dette vil logge deg ut fra den midlertidige kontoen. Vil du fortsette? Applikasjonsfeil Wikipedia-appen avsluttet på grunn av en feil.\n\nVil du prøve å starte den på nytt eller avslutte? Start på nytt @@ -766,8 +792,8 @@ Fjern merking av alle elementer Wikifilter Filtertype - Alle wikier - Alle typer + Alle wikier + Alle typer %ss diskusjonsside Funksjonen er ikke tilgjengelig offline. Fordi du leste @@ -826,6 +852,12 @@ Avbryt Du har nådd bunnen av utforskersiden. Last inn mer + Velg en regional språkvariant for en forbedret leseopplevelse. + Du bruker en ustøttet generiske kinesisk språkvariant som ditt primære Wikipedia-språk + Lagre + Oppdater sekundærspråkene dine + Du bruker en ustøttet generiske kinesisk språkvariant som sekundærspråk. Gå til innstillingene dine for å velge et nytt sekundærspråk eller bekrefte språklista di. + Gå til innstillingene Mest lest %s Faner Artikkelbeskrivelse @@ -855,8 +887,8 @@ Stemmestyring Lær mer om artikkelbeskrivelser Lær mer om bildetekster - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Article_descriptions - https://www.mediawiki.org/wiki/Wikimedia_Apps/Suggested_edits#Image_captions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions + https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Teksten er for kort. Teksten kan ikke slutte med punktum. Ikke legg til «a» eller «the» i begynnelsen av artikkeltitler. @@ -1078,8 +1110,8 @@ Ja Nei Usikker - Hvorfor ikke? - Svarene dine hjelper til å forbedre framtidige forslag. + Arsåk for avvisning + Avvisningsgrunnen er anonym og vil forbedre framtidige bildeforslag. Bildet er ikke relevant Ikke nok informasjon til å avgjøre Bildet er støtende @@ -1229,6 +1261,15 @@ Høyde px Sett inn + Søk i maler + Sett inn + f.eks. %s + %s (valgfritt) + %s (anbefalt) + Lær mer + Maler er brukergenererte, og kan ha ufullstendige beskrivelser. + Malen «%s» har ingen beskivelse ennå. + Denne malen mangler <a href=\"%1$s\">TemplateData</a>, og parametrene dens har blitt <a href=\"%2$s\">autogenererte</a>. Som et resultat av dette mangler malen og parametrene dens beskrivelser. Hjelp Logg inn / bli med på Wikipedia Hei %s, visste du at hvem som helst kan redigere Wikipedia? @@ -1255,6 +1296,7 @@ Ikke lagre Melding publisert på bidragsyterens brukerdiskusjonsside Melding lagret og publisert på bidragsyterens brukerdiskusjonsside + Lagrede meldinger Denne diskusjonssiden er tom. Samtalen begynner her Diskusjonssider er stedet for å diskutere hvordan Wikipedias innhold kan bli enda bedre. Du kan begynne ved å legge til et nytt emne for å få kontakt og samarbeide med fellesskapet av wikipedianere. @@ -1265,6 +1307,7 @@ Skriv melding Meldingen kan ikke være tom. Emnet kan ikke være tomt. + Emnenavnet finnes allerede. Prøv et annet. Svar postet. Gjør om <b>Sist redigert %1$s</b> av %2$s @@ -1460,7 +1503,7 @@ Hei! Jeg ønsker å dele leselista mi på Wikipedia med deg: Kan du hjelpe oss å forbedre «Del leselister»? «Del leselister» er en testfunksjon, og vi trenger tilbakemelding fra brukerne for å forbedre eller fjerne den. - Du har ingen lagrede advarselsmeldinger. + Opprett dine egne meldinger eller bruk <a href=\"#\">eksempelmeldinger</a> for å komme i gang. Ny melding Emne Skriv melding @@ -1561,6 +1604,8 @@ Ser du en produktiv redigering? Takk en bruker for bidraget. Overvåk Vil du spore artikkelredigeringer? Legg til på overvåkningslisten din. Se den under «Mer». + Diskusjon + Kommuniser med andre bidragsytere. Lagre ofte bruke diskusjonssidemeldinger eller bruk en mal. Omgjør/Tilbakestill Velg «Gjør om» for å omgjøre eller tilbakestille en potensielt ødeleggende redigering. Skade forutsier om en redigering forårsaker skade på en wiki. @@ -1571,10 +1616,22 @@ Nøytral Misfornøyd Hvordan kan vi forbedre funksjonen? + Redigeringshistorikk Tilbakemelding Send Tilbakemelding sendt. Trykk på overflytsmenyen for å sende inn tilbakemeldinger når som helst under «Problem med funksjon». + Advarsel om vandalisme + Nøytralt synspunkt + Maskinoversettelse + Påminnelse om interessekonflikt + Siste advarsel + Advarsel om opphavsrettsbrudd + Legg igjen en redigeringsforklaring + Ikke sensurer + Forslag til forbedring av artikkel + Hei, {{{username}}}. Jeg vil bare si fra om at jeg har tilbakestilt én eller flere av de [{{{diffLink}}}|nyeste bidragene dine]] fordi de ikke virker konstruktive. Hvis du mener at jeg har gjort en feil eller har noen spørsmål kan du legge igjen en melding på [[User talk:{{{senderUserName}}}|diskusjonssiden min]]. Vær oppmerksom på at fortsatt hærverk kan føre til innskrenkinger i tilgangen din. + Rediger Godta Avvis Sideproblemer @@ -1587,6 +1644,21 @@ Takk, kjære giver! Din sjenerøsitet hjelper å blomstre Wikipedia og søsterprosjektene. Tilbake Åpne i systemnettleseren + Donere med Google Pay? + Doner med Google Pay eller velg en annen betalingsmåte. + Doner med Google Pay + Annen betalingsmåte + Velg et beløp + Jeg legger gjerne til %s for å dekke transaksjonsgebyrer, så dere kan beholde 100 %% av gaven min. + Gjør dette til en gjentatt månedlig gave. + Ja, Wikimedia Foundation kan sende meg en e-post i ny og ne. + Velg et beløp (minimum %s) + Vi kan ikke ta imot donasjoner som er større enn %s via appen vår. Kontakt personalet vårt for større gaver på benefactors@wikimedia.org. + <b>Tusen takk!</b> Din gavmildhet betyr veldig mye for oss. + Problemer med å donere? + Andre måter å gi + Ofte stilte spørsmål + Informasjon om skattefradrag Steder Posisjonstillatelse kreves for å se din posisjon på kartet. Prøv igjen. Søk i steder diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c544871539c..8b7ec17d6ab 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -483,7 +483,7 @@ 目次 編輯… 編輯條目說明 - 編輯首節 + 編輯首段 佈景主題 明亮 陰暗 From 17e81e43b25369bddf695399c291aef508386cad Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 17 Jun 2024 15:47:43 +0300 Subject: [PATCH 186/626] Localisation updates from https://translatewiki.net. (#4746) --- app/src/main/res/values-be/strings.xml | 4 +- app/src/main/res/values-es/strings.xml | 11 ++-- app/src/main/res/values-fa/strings.xml | 1 + app/src/main/res/values-fi/strings.xml | 3 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-inh/strings.xml | 4 +- app/src/main/res/values-lb/strings.xml | 59 ++++++++++----------- app/src/main/res/values-nl/strings.xml | 68 +++++++++++++++++++++++++ app/src/main/res/values-tly/strings.xml | 4 +- 9 files changed, 116 insertions(+), 40 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index a2bb4ae8522..f03b08cd8ff 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -139,7 +139,7 @@ Вашыя мовы Вікіпедыі Апублікаваць змены Праўка апублікавана! - Праўка апублікаваная! У хуткім часе змяненні з’явяцца. + Праўка апублікаваная! У хуткім часе з’явяцца змяненні. Праўка не апублікавана! Паўтарыць Скасаваць @@ -188,7 +188,7 @@ Няма нядаўна прагледжаных артыкулаў Сачыць за тым, што вы ўжо прачыталі. Некаторыя артыкулы ў гісторыі могуць быць недаступныя па-за сеткай. - Шукайце і чытайце свабодную энцыклапедыю на сваёй мове + Шукайце і чытайце ў свабоднай энцыклапедыі на сваёй мове Знайсці Вікіпедыю на іншай мове Выдаліць выбраныя элементы <big>В</big>ІКІПЕДЫ<big>Я</big> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a3cb3a555dc..0980bc3c0e6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -440,7 +440,7 @@ No Cerrar pestaña Pestaña cerrada. - %s cerradas. + %s cerrada. Se cerraron todas las pestañas. Añadir a una lista de lectura Toca el icono de marcadores para guardar el artículo en una lista de lectura. @@ -1142,7 +1142,7 @@ Añadiste %d caracteres Imágenes de artículos - Agrega las imágenes sugeridas a los artículos de Wikipedia para mejorar la comprensión + Añade imágenes sugeridas a los artículos para mejorarlos ¿Agregarías esta imagen al artículo? Tutorial @@ -1334,6 +1334,8 @@ Ocultar respuestas (%d) Suscribirse + Marcar como leí­do + Marcar como no leído Compartir Icono de usuario Leer @@ -1343,6 +1345,7 @@ Compartir edición Contribuciones de %s Editar código + Página de usuario %s Buscar en el tema de página de discusión Copiar enlace en el portapapeles Copiar texto @@ -1361,12 +1364,13 @@ Tu \'Gracias\' ha sido enviado a %s 👍 Ver página de usuario Ver página de discusión - Ver las contribuciones de los usuarios + Ver contribuciones del usuario Compara las revisiones Comparar las revisiones: %s De: Para: Línea %d + Líneas %1$d–%2$d Línea añadida Línea eliminada Párrafo añadido @@ -1460,6 +1464,7 @@ Ver página de usuario Ver página de discusión Información de usuario + Información de usuario <b>Cuenta desde: </b> %s <b>Número de ediciones: </b> %s Cerrar diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 26fb80adf36..b68df730c22 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -16,6 +16,7 @@ * Dalba * Darafsh * Dbrant +* Ebrahim * Ebraminio * FarsiNevis * Fatemi127 diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index cfc378229de..1c22cbd8999 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -14,6 +14,7 @@ * Envlh * Jack Phoenix * Joquliina +* Kyykaarme * Laurianttila * MITO * Maantietäjä @@ -429,7 +430,7 @@ Tallenna Tallennettu Jaa - Tämä artikkeli on tynkä, mikä tarkoittaa, että siinä ei ole tarpeeksi sisältöä esikatselun luomiseksi. Kuitenkin voit korjata asian. + Tämä artikkeli on tynkä, mikä tarkoittaa, että siinä ei ole tarpeeksi sisältöä esikatselun luomiseksi. Voit kuitenkin korjata asian. Tätä sivua ei ole olemassa Wikipediassa ei ole tämän nimistä <a href=\"%1$s\">käyttäjäsivua</a>. Useimmiten vain käyttäjän <b>%2$s</b> tulisi luoda tämä sivu ja muokata sitä. Mikäli et ole varma, varmista että käyttäjä \"%3$s\" on olemassa. Ei voitu yhdistää internetiin diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e951563e0eb..d58427ab90b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1603,7 +1603,7 @@ Apprenants Éditeurs inscrits dont l’expérience est entre « Nouveaux arrivants » et « Utilisateurs expérimentés ». Utilisateurs expérimentés - Éditeurs inscrits avec plus de 500 modifications et 30 jours d’activité + Contributeurs inscrits avec plus de 500 modifications et 30 jours d’activité Dernières révisions Dernière révision Pas la dernière révision diff --git a/app/src/main/res/values-inh/strings.xml b/app/src/main/res/values-inh/strings.xml index 0699068857d..1f909ec7db3 100644 --- a/app/src/main/res/values-inh/strings.xml +++ b/app/src/main/res/values-inh/strings.xml @@ -151,9 +151,9 @@ Чувáла Чувáла Системача чувалар... - Система чу чувалар кхоачашдаьд! + Системача чувалар кхоачашдаьд! ДӀаоттае хьай пароль - Цхьан юкъа мара болх беш хургйоаца пароль чуязъяьй Ӏа. Система чу чувалар кхоачашдергдолаш керда пароль дӀаоттае. + Цхьан юкъа мара болх беш хургйоаца пароль чуязъяьй Ӏа. Системача чувалар кхоачашдергдолаш керда пароль дӀаоттае. Керда пароль ДӀа а яздаь чувáла Аравала diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 2c4eeffa50f..a8432d714d8 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -304,9 +304,9 @@ Fichier gëtt erofgelueden… Fichier gespäichert. De Video konnt net gespillt ginn. - Bildbeschreiwung änneren - Bildbeschreiwung derbäisetzen - Bildbeschreiwung derbäisetzen (%s) + Bildbeschrëftung änneren + Bildbeschrëftung derbäisetzen + Bildbeschrëftung derbäisetzen (%s) Fichier kann net gespäichert ginn Tippe fir opzeklappen Creative-Commons-Lizenz @@ -745,17 +745,17 @@ Beschreiwung vum Artikel (%s) Beschreiwung vum Artikel (%s) Beschreiwung vum Bild - Bildbeschreiwung - Bildbeschreiwung (%s) - Bildbeschreiwung (%s) + Bildbeschrëftung + Bildbeschrëftung (%s) + Bildbeschrëftung (%s) Verëffentlechen Liesen Beschreiwung vum Artikel derbäisetzen Artikelbeschreiwung iwwersetzen Beschreiwung vum Artikel änneren - Bildbeschreiwung derbäisetzen - Bildbeschreiwung änneren - Bildbeschreiwung iwwersetzen + Bildbeschrëftung derbäisetzen + Bildbeschrëftung änneren + Bildbeschrëftung iwwersetzen Ofbriechen Info:Artikelbeschreiwungen Iwwer Wikidata @@ -765,7 +765,7 @@ fänkt normalerweis mat engem klenge Buschtaf un Sprooch Input Méi iwwer Artikelbeschreiwunge gewuer ginn - Méi iwwer Bildbeschreiwunge gewuer ginn + Méi iwwer Bildbeschrëftunge gewuer ginn https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Article_descriptions https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits#Image_captions Den Text ass ze kuerz. @@ -779,8 +779,8 @@ Beschreiwung vum Artikel verëffentlecht! Beschreiwung vum Artikel verëffentlecht! Beschreiwung vum Artikel verëffentlecht! (%s) - Bildbeschreiwung verëffentlecht! - Bildbeschreiwung verëffentlecht! (%s) + Bildbeschrëftung verëffentlecht! + Bildbeschrëftung verëffentlecht! (%s) Huet Iech dat Spaass gemaach? Hëlleft eis nach méi derbäizesetzen. Dir hutt elo grad Wikipedia fir jidderee verbessert Fäerdeg @@ -796,26 +796,26 @@ Menü Op de Standard zrécksetzen Artikele beschreiwen - Ënnertitel fir Biller + Biller beschrëften Nokucken Artikel-Beschreiwung iwwerliesen Beschreiwung derbäisetzen Beschreiwung änneren Iwwersetzung derbäisetzen Iwwersetzung änneren - Beschreiwung derbäisetzen - Beschreiwungen änneren - Bildbeschreiwung nokucken + Beschrëftung derbäisetzen + Beschrëftung änneren + Bildbeschrëftung nokucken Meng Kontributiounen Dëse Fichier huet keng Beschreiwung Informatioun Artikel-Beschreiwungen derbäisetzen - Bildbeschreiwungen derbäisetzen - Bildbeschreiwungen iwwersetzen - Beschreiwungen op aner Sproochen iwwersetzen + Bildbeschrëftungen derbäisetzen + Bildbeschrëftungen iwwersetzen + Beschrëftungen op aner Sproochen iwwersetzen Méi Aufgabe fir méisproocheg Auteuren Iwwersetzungsaufgabe sinn disponibel, wann Dir a méi wéi enger Wikipedia-Sprooch liest a schreift. - Gespaart, bis Dir %d Bildbeschreiwunge geännert hutt + Gespaart, bis Dir %d Bildbeschrëftunge geännert hutt Gespaart, bis Dir %d Bildbeschreiwunge geännert hutt (verifizéiert) Net fir mech Sproochen derbäisetzen @@ -833,7 +833,7 @@ Artikelbeschreiwungen derbäisetzen Artikelbeschreiwungen derbäisetzen (%s) Fir unzefänken - Bildbeschreiwung (%s) + Bildbeschrëftung (%s) Fichier Fichier vu Wikimedia Commons Kënschtler @@ -843,14 +843,15 @@ Méi Informatiounen Säit vum Fichier op Wikimedia Commons Säit vum Fichier op Wikipedia - Bildbeschreiwung derbäisetzen - Bildbeschreiwung derbäisetzen (%s) + Bildbeschrëftung derbäisetzen + Bildbeschrëftung derbäisetzen (%s) Weisen - Bildbeschreiwung derbäisetzen - Bildbeschreiwung derbäisetzen (%s) + Bildbeschrëftung derbäisetzen + Bildbeschrëftung derbäisetzen (%s) Bei der Ëmfro matmaachen Derbäisetzen Iwwersetzen + Bildbeschrëftungen Verëffentlechen Verëffentlecht D\'Markéiere vu Biller mécht et méi einfach fir se erëmzefannen. @@ -934,11 +935,11 @@ Biller hëllefen de Leit beim Verstoen, mee vill Artikelen hunn der keng. Nächst Bild derbäigesat - Beschreiwung derbäigesat - Bild a Beschreiwung derbäigesat + Beschrëftung derbäigesat + Bild a Beschrëftung derbäigesat Weisen Dateisäit - Bildbeschreiwung derbäisetzen + Bildbeschrëftung derbäisetzen %s änneren Merci fir d\'Änneren op Wikipedia! Är Kontributioun gesäit aus wéi en Experiment oder Vandalismus. @@ -1023,7 +1024,7 @@ Medie sichen Bilddetailer derbäisetzen Eropgeluedent Bild - Bildbeschreiwung + Bildbeschrëftung Alternativen Text Beschreiwung fir visuell behënnert Lieser Erweidert Astellungen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b7c311e552a..1fc08e9a976 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -315,6 +315,8 @@ Koppelingen toegevoegd Overige Andere manieren waarop u de pagina hebt verbeterd + Korte beschrijving toegevoegd + Korte beschrijving bijgewerkt Bewerkingsconflict Deze pagina is al door een andere gebruiker aangepast en conflicteert met uw bewerking. Kopieer uw wijzigingen, ga terug, ververs de pagina en probeer opnieuw te bewerken. Bewerkingsmeldingen @@ -462,6 +464,24 @@ Werkbalk aanpassen U kunt contact opnemen met een <a href=\"https://nl.wikipedia.org/wiki/Wikipedia:Moderator\">moderator</a> voor meer informatie over de blokkering. U bent niet aangemeld + Nadat je een wijziging hebt aangebracht, wordt er een <b>tijdelijk account</b> voor je aangemaakt om je privacy te beschermen. <a href=\"%1$s\">Meer informatie</a>.<br /><br /><a href=\"https://#login\">Log in</a> of <a href=\"https://#login\">maak een account aan</a> om onder een zelf gekozen naam bij te dragen en om toegang te krijgen tot andere functies. + Je bewerking wordt toegeschreven aan %1$s. Je IP-adres is zichtbaar voor beheerders.<br /><br /> Als je <a href=\"https://#login\">inlogt</a> of <a href=\"https://#login\">een account aanmaakt</a>, worden je bewerkingen toegeschreven aan een door jou gekozen naam en zijn er andere voordelen. + Begrepen + Je gebruikt een tijdelijk account + Wijzigingen negeren en inloggen + + Tijdelijke account %1$s is aangemaakt nadat je bewerking werd gepubliceerd. Het verloopt over %2$d dag. + Tijdelijk account %1$s is aangemaakt nadat je bewerking werd gepubliceerd. Het verloopt over %2$d dagen. + + + Account verloopt over %d dag. + Account verloopt over %d dagen. + + <b>Je bent niet ingelogd.</b> Nadat je een wijziging hebt aangebracht, wordt er een tijdelijk account voor je aangemaakt om je privacy te beschermen. <a href=\"%1$s\">Meer informatie</a> + <b>Je gebruikt een tijdelijk account.</b> Je bewerking wordt toegeschreven aan %1$s. <a href=\"%2$s\">meer informatie</a>. + <b>Je gebruikt momenteel een tijdelijk account.</b> Bewerkingen gemaakt met het tijdelijke account %1$s worden niet overgedragen naar je permanente account wanneer je inlogt. Log in of maak een account aan om met je eigen gebruikersnaam te bewerken. + Sessie beëindigen + Hiermee word je uitgelogd bij je tijdelijke account. Wil je doorgaan? Programmafout Er is helaas een fout opgetreden in de Wikipedia-app en de app is beëindigd.\n\nWilt u opnieuw beginnen of stoppen? Opnieuw beginnen @@ -854,6 +874,12 @@ Annuleren U bent bij het einde aangekomen. Meer laden + Selecteer een regionale taalvariant voor een verbeterde leeservaring + Je gebruikt momenteel een niet-ondersteunde generieke Chinese taalvariant als uw primaire Wikipedia-taal + Opslaan + Update je secundaire talen + Je gebruikt momenteel een niet-ondersteunde generieke Chinese taalvariant als secundaire taal. Ga naar je instellingen om een nieuwe secundaire taal te selecteren of om je talenlijst te bevestigen. + Ga naar Instellingen Meest gelezen op %s Tabbladen Artikelbeschrijving @@ -1153,6 +1179,7 @@ Stap in de wereld van Wikipedia met een steeds bijgewerkt overzicht op Verkennen. <br/> Pas het overzicht aan <b>uw interesses</b> aan – of u nu geïnteresseerd bent in historische gebeurtenissen <b>op deze dag</b> of het gooien met de dobbelsteen voor een <b>willekeurige pagina</b>. Leeslijsten met synchronisatie U kunt leeslijsten maken van artikelen die u later wilt lezen, ook als u offline bent. <br/>Meld u aan bij uw Wikipedia-account om uw leeslijsten te synchroniseren. <a href=\"#login\">Bij Wikipedia aanmelden</a> + Gegevens & privacy Wij zijn van mening dat u geen persoonlijke informatie hoeft te verstrekken om deel te nemen aan de vrije kennisbeweging. De gebruiksgegevens die voor deze app worden verzameld, zijn anoniem. Lees meer over ons <a href=\"#privacy\">privacybeleid</a> en <a href=\"#termsOfUse\">onze gebruiksvoorwaarden</a> . Uw gebruiksgegevens verzenden Begrepen @@ -1263,6 +1290,7 @@ Meer lezen Sjablonen worden door de gebruiker gegenereerd en bevatten mogelijk geen volledige beschrijving. De \"%s\"-sjabloon heeft nog geen beschrijving. + Dit sjabloon heeft geen <a href=\"%1$s\">TemplateData</a> en de parameters zijn <a href=\"%2$s\">automatisch gegenereerd</a>. Als gevolg hiervan ontbreekt het aan beschrijvingen van het sjabloon en zijn parameters. Hulp Aanmelden/inschrijven bij Wikipedia Hallo %s, wist u dat iedereen Wikipedia kan bewerken? @@ -1300,6 +1328,7 @@ Bericht opstellen Het bericht mag niet leeg zijn. Het onderwerp mag niet leeg zijn. + Onderwerpnaam bestaat al. Probeer een andere. Reactie geplaatst. Ongedaan maken <b>Laatst bewerkt %1$s</b> door %2$s @@ -1596,6 +1625,8 @@ Ziet u een productieve bewerking? Bedank een gebruiker voor diens bijdrage. Volgen Wilt u de bewerkingen van een artikel bijhouden? Voeg het toe aan uw volglijst. Bekijk het onder ‘Meer’. + Overleg + Communiceer met andere redacteuren. Bewaar veelgebruikte overlegpagina-berichten of gebruik een sjabloon. Ongedaan maken/terugdraaien Kies ‘Ongedaan maken’ om een mogelijk schadelijke bewerking ongedaan te maken of terug te draaien. Schade voorspelt of een bewerking schade aan een wiki veroorzaakt. @@ -1611,13 +1642,28 @@ Opslaan Terugkoppeling ingediend. Tik op het overloopmenu om op elk gewenst moment terugkoppeling te geven onder ‘Probleem met functie’. + Waarschuwing voor vandalisme + Bewerktests + Neutraal standpunt Automatische vertaling + Herinnering aan belangenverstrengeling Laatste waarschuwing Waarschuwing voor schending van auteursrecht Voeg een bewerkingssamenvatting toe Niet censureren Suggestie voor artikelverbetering + Hallo {{{username}}}, ik wil je laten weten dat ik een of meer van je [{{{diffLink}}}|recente bijdragen] heb teruggedraaid omdat ze niet constructief lijken. Als je denkt dat ik een fout heb gemaakt of als je vragen hebt, kun je een bericht achterlaten op [[User talk:{{{senderUserName}}}|mijn overlegpagina]]. Houd er rekening mee dat aanhoudend vandalisme tot beperkingen kunnen leiden. + Hallo {{{username}}}, ik ben blij dat Wikipedia je aandacht heeft getrokken en dat je geïnteresseerd bent om te leren hoe je erop aanpassingen kunt doen. De bewerkingstest die je hebt gedaan, heeft gewerkt; Houd er echter rekening mee dat het doel van dit project is om een betrouwbare en volledige encyclopedie te ontwikkelen die iedereen kan raadplegen. Je bewerking heeft invloed gehad op de inhoud en is daarom verwijderd.\nAls je wilt leren hoe je Wikipedia kunt bewerken, staat de [[Wikipedia:Zandbak|zandbak]] tot je beschikking. Als je opmerkingen specifiek betrekking hadden op een artikel, is de overlegpagina van dat artikel de juiste plaats. + Hallo {{{username}}}, sommige bijdragen die je hebt geleverd voldoen niet aan de neutraliteit die vereist is om te voldoen aan het beleid omtrent het [[Wikipedia:NPOV|neutraal standpunt]] van Wikipedia. Om deze reden is bepaalde inhoud aangepast of verwijderd. Wijzig de paragrafen of secties die een eenzijdig standpunt weergeven en vervang ze door een meer neutrale en objectieve tekst, in overeenstemming met wat er in een encyclopedie wordt verwacht. + Hallo {{{username}}}, sommige bijdragen die je hebt geleverd zijn mogelijk machinevertalingen, daarom zijn ze aangepast of gemarkeerd met een sjabloon. Als er geen verbeteringen aan het artikel worden aangebracht, kan het worden verwijderd.\n\nHeb je ondanks al deze informatie toch nog vragen, laat dan gerust een bericht achter op [[User talk:{{{senderUserName} }}|mijn overlegpagina]]. Laat je niet ontmoedigen door dit kleine incident. Jouw bijdragen zijn erg belangrijk voor Wikipedia. + Hallo {{{username}}}, ik waardeer je medewerking aan Wikipedia. Ik heb echter gemerkt dat je je te maken hebt met een [[Wikipedia:Belangenverstrengeling|belangenconflict]]. Een belangenconflict is de onverenigbaarheid tussen de doelstellingen van Wikipedia op het gebied van neutraliteit en betrouwbaarheid enerzijds en de specifieke doelstellingen van bepaalde redacteuren, individuen, entiteiten of bedrijven anderzijds.\n\nAlle bijdragen in de artikelnaamruimte zijn onderworpen aan het beleid van inhoudscriteria van deze Wikipedia ([[Wikipedia:Wat Wikipedia niet is|wat Wikipedia niet is]]]), encyclopedische kwaliteit ([[Wikipedia:Verifieerbaarheid|verifieerbaarheid]] en [[Wikipedia:Geen origineel onderzoek|geen origineel onderzoek]]), redactionele methode ([[Wikipedia:NPOV|neutraal standpunt]]) en legitimiteit van de inhoud ([[Wikipedia:Copyrights|auteursrechten]]). Van alle auteurs wordt verwacht dat zij zich aan dit beleid houden bij het maken en evalueren van inhoud en dat zij de acties van andere auteurs respecteren en te goeder trouw aannemen om ervoor te zorgen dat dit beleid wordt nageleefd.\n\nAls je in geval van belangenverstrengeling aan het bewerken bent, moet je het bijbehorende beleid met bijzondere zorg toepassen. Anders kan je gebruikersaccount worden geblokkeerd. Als je vragen heeft, kun je gerust contact met mij opnemen via mijn overlegpagina. + Omdat je meerdere destructieve bewerkingen hebt aangebracht, zal dit dienen als je laatste waarschuwing. Mocht je Wikipedia opnieuw vernielen, dan mag je niet meer bewerken. + Het lijkt erop dat uw recente bewerking zonder toestemming auteursrechtelijk beschermd materiaal bevat. Zorg ervoor dat alle inhoud voldoet aan het [[Wikipedia:Copyrights|copyright]]-beleid van Wikipedia om verwijdering te voorkomen. Hallo {{{username}}}, het lijkt erop dat je inhoud van Wikipedia hebt verwijderd zonder een bewerkingssamenvatting achter te laten. Laat een bewerkingssamenvatting achter wanneer u inhoud aan Wikipedia toevoegt of verwijdert. + Hallo {{{username}}}, het lijkt erop dat je inhoud hebt verwijderd zonder deze op de overlegpagina van het artikel te bespreken. Houd er rekening mee dat Wikipedia niet wordt gecensureerd en dat de inhoud niet mag worden verwijderd omdat deze controversieel is. Als je denkt dat de informatie onjuist is, kun je overeenstemming bereiken op de overlegpagina van het artikel. + Meer informatie over tijdelijke aanduidingen voor berichten + Gebruik een voorbeeldbericht hieronder om je berichten aan te passen, te verzenden en op te slaan. + Hallo {{{gebruikersnaam}}}. Je artikel is een goed begin! Om het nog beter te maken, kun je overwegen om meer verwijzingen naar betrouwbare bronnen toe te voegen. Dit helpt de informatie te verifiëren en verbetert de kwaliteit van het artikel. Bekijk de richtlijnen van Wikipedia op [[Wikipedia:Betrouwbare_bronnen|betrouwbare bronnen]] voor meer details. Bewerken Aanvaarden Afwijzen @@ -1631,12 +1677,34 @@ Bedankt, beste donateur! Dankzij uw bijdrage kunnen Wikipedia en haar zustersites zich blijven ontwikkelen. Terug Openen in systeembrowser + Doneren met Google Pay? + Doneer met Google Pay of kies een andere betaalmethode. + Doneer met Google Pay + Andere betaalmethode + Selecteer een bedrag + Ik zal graag %s toevoegen om de transactiekosten te dekken zodat jullie 100% van mijn donatie kunnen houden. + Maak dit een maandelijks terugkerende donatie. + Ja, de Wikimedia Foundation mag mij af en toe een e-mail sturen. + Selecteer een bedrag (minimaal %s) + We kunnen via onze app geen donaties groter dan %s accepteren. Neem contact op met onze medewerkers voor grote donaties via benefactors@wikimedia.org. + <b>Bedankt!</b> Je vrijgevigheid voor Wikipedia betekent zoveel voor ons. + Problemen bij het doneren? + Andere manieren om te geven + Veelgestelde vragen + Informatie over fiscale aftrekbaarheid Plaatsen + Locatietoestemming is vereist om uw locatie op de kaart te zien. Probeer het opnieuw. Plaatsen zoeken Filteren op taal Kaart Lijst + Ontdek Wikipedia-artikelen om je heen met Places + Tik op \'Bekijk op kaart\' om de locatie van dit artikel te verkennen Erg tevreden Zeer ontevreden + Help \'Plaatsen\' te verbeteren + Hoe kunnen \'Plaatsen\' worden verbeterd? + Annuleren + Wat wil je dat we veranderen of verbeteren? Dit gebied is leeg. Zoom uit <a href=\"#\">op de kaart</a>. diff --git a/app/src/main/res/values-tly/strings.xml b/app/src/main/res/values-tly/strings.xml index d0979b29655..da87f2679af 100644 --- a/app/src/main/res/values-tly/strings.xml +++ b/app/src/main/res/values-tly/strings.xml @@ -366,7 +366,7 @@ Myndəričot Sərost kardej... Səhifə nom-nyšoni ovaxte - Vəsə sərost kardej + Sərlovhə sərost kardej Myžor Rušin Gyrd tojki @@ -611,7 +611,7 @@ Zyvonon kərti sərost karde Hənijən səbəro Ce Vikimənbə ən cokə šikilon - Vəsə + Sərlovhə Kərti nyšonə Xəbonədə ımruj From 829da9e5e25e273c6a5aafca82e333dd2e974f78 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 18 Jun 2024 06:01:01 -0700 Subject: [PATCH 187/626] Use displayMetrics instead of deprecated methods (#4739) * Use displayMetrics.density instead of deprecated methods * Still need to use scaledDensity * Use proper method and remomve duplicated parameter --------- Co-authored-by: Dmitry Brant --- app/src/main/java/org/wikipedia/WikipediaApp.kt | 10 ++++------ .../java/org/wikipedia/edit/EditSectionActivity.kt | 2 +- app/src/main/java/org/wikipedia/page/PageFragment.kt | 2 +- .../org/wikipedia/theme/ThemeFittingRoomFragment.kt | 2 +- app/src/main/java/org/wikipedia/util/DimenUtil.kt | 8 +++----- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/wikipedia/WikipediaApp.kt b/app/src/main/java/org/wikipedia/WikipediaApp.kt index 50824f50463..66d0f2b7b52 100644 --- a/app/src/main/java/org/wikipedia/WikipediaApp.kt +++ b/app/src/main/java/org/wikipedia/WikipediaApp.kt @@ -6,7 +6,6 @@ import android.content.pm.PackageManager import android.os.Build import android.os.Handler import android.speech.RecognizerIntent -import android.view.Window import android.webkit.WebView import androidx.appcompat.app.AppCompatDelegate import io.reactivex.rxjava3.internal.functions.Functions @@ -37,7 +36,7 @@ import org.wikipedia.theme.Theme import org.wikipedia.util.DimenUtil import org.wikipedia.util.ReleaseUtil import org.wikipedia.util.log.L -import java.util.* +import java.util.UUID class WikipediaApp : Application() { init { @@ -226,12 +225,11 @@ class WikipediaApp : Application() { /** * Gets the current size of the app's font. This is given as a device-specific size (not "sp"), * and can be passed directly to setTextSize() functions. - * @param window The window on which the font will be displayed. * @return Actual current size of the font. */ - fun getFontSize(window: Window, editing: Boolean = false): Float { - return DimenUtil.getFontSizeFromSp(window, - resources.getDimension(R.dimen.textSize)) * (1.0f + (if (editing) Prefs.editingTextSizeMultiplier else Prefs.textSizeMultiplier) * + fun getFontSize(editing: Boolean = false): Float { + return DimenUtil.getFontSizeFromSp(resources.getDimension(R.dimen.textSize)) * + (1.0f + (if (editing) Prefs.editingTextSizeMultiplier else Prefs.textSizeMultiplier) * DimenUtil.getFloat(R.dimen.textSizeMultiplierFactor)) } diff --git a/app/src/main/java/org/wikipedia/edit/EditSectionActivity.kt b/app/src/main/java/org/wikipedia/edit/EditSectionActivity.kt index 45df88692d4..5d41674ce9c 100644 --- a/app/src/main/java/org/wikipedia/edit/EditSectionActivity.kt +++ b/app/src/main/java/org/wikipedia/edit/EditSectionActivity.kt @@ -590,7 +590,7 @@ class EditSectionActivity : BaseActivity(), ThemeChooserDialog.Callback, EditPre } private fun updateTextSize() { - binding.editSectionText.textSize = WikipediaApp.instance.getFontSize(window, editing = true) + binding.editSectionText.textSize = WikipediaApp.instance.getFontSize(editing = true) } private fun resetToStart() { diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 860a8449e49..8dc9f85b83f 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -1023,7 +1023,7 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi } fun updateFontSize() { - webView.settings.defaultFontSize = app.getFontSize(requireActivity().window).toInt() + webView.settings.defaultFontSize = app.getFontSize().toInt() } fun updateQuickActionsAndMenuOptions() { diff --git a/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt b/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt index 91ddc8799a0..cc675f1bec7 100644 --- a/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt +++ b/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt @@ -37,7 +37,7 @@ class ThemeFittingRoomFragment : Fragment() { private fun updateTextSize() { val titleMultiplier = 1.6f - val fontSize = WikipediaApp.instance.getFontSize(requireActivity().window) + val fontSize = WikipediaApp.instance.getFontSize() binding.themeTestText.textSize = fontSize binding.themeTestTitle.textSize = fontSize * titleMultiplier } diff --git a/app/src/main/java/org/wikipedia/util/DimenUtil.kt b/app/src/main/java/org/wikipedia/util/DimenUtil.kt index d910d966640..4c7738b4c0b 100644 --- a/app/src/main/java/org/wikipedia/util/DimenUtil.kt +++ b/app/src/main/java/org/wikipedia/util/DimenUtil.kt @@ -5,9 +5,9 @@ import android.content.res.Configuration import android.content.res.Resources import android.util.DisplayMetrics import android.util.TypedValue -import android.view.Window import androidx.annotation.DimenRes import androidx.core.content.res.use +import androidx.core.util.TypedValueCompat import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.util.log.L @@ -41,10 +41,8 @@ object DimenUtil { return TypedValue.complexToFloat(getValue(id).data) } - fun getFontSizeFromSp(window: Window, fontSp: Float): Float { - val metrics = DisplayMetrics() - window.windowManager.defaultDisplay.getMetrics(metrics) - return fontSp / metrics.scaledDensity + fun getFontSizeFromSp(fontSp: Float): Float { + return TypedValueCompat.deriveDimension(TypedValue.COMPLEX_UNIT_SP, fontSp, displayMetrics) } // TODO: use getResources().getDimensionPixelSize()? Define leadImageWidth with px, not dp? From c36cef205d95993d3cb5382ab820a5f83d93ba1d Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 18 Jun 2024 06:12:24 -0700 Subject: [PATCH 188/626] Hygiene: reduce contructors in FrameLayoutNavMmenuTriggerer (#4744) Co-authored-by: Dmitry Brant --- .../org/wikipedia/views/FrameLayoutNavMenuTriggerer.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/wikipedia/views/FrameLayoutNavMenuTriggerer.kt b/app/src/main/java/org/wikipedia/views/FrameLayoutNavMenuTriggerer.kt index 6d2ff7ed895..f481c627289 100644 --- a/app/src/main/java/org/wikipedia/views/FrameLayoutNavMenuTriggerer.kt +++ b/app/src/main/java/org/wikipedia/views/FrameLayoutNavMenuTriggerer.kt @@ -9,10 +9,7 @@ import org.wikipedia.util.DimenUtil.roundedDpToPx import org.wikipedia.util.L10nUtil import kotlin.math.abs -class FrameLayoutNavMenuTriggerer : FrameLayout { - constructor(context: Context) : super(context) - constructor(context: Context, attrs: AttributeSet? = null) : super(context, attrs) - constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : super(context, attrs, defStyleAttr) +class FrameLayoutNavMenuTriggerer(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) { interface Callback { fun onNavMenuSwipeRequest(gravity: Int) @@ -41,7 +38,7 @@ class FrameLayoutNavMenuTriggerer : FrameLayout { maybeSwiping = false } else if (abs(ev.x - initialX) > SWIPE_SLOP_X) { maybeSwiping = false - if (callback != null) { + callback?.let { // send an explicit event to children to cancel the current gesture that // they thought was occurring. val moveEvent = MotionEvent.obtain(ev) @@ -49,7 +46,7 @@ class FrameLayoutNavMenuTriggerer : FrameLayout { post { super.dispatchTouchEvent(moveEvent) } // and trigger our custom swipe request! - callback!!.onNavMenuSwipeRequest(if (L10nUtil.isDeviceRTL) + it.onNavMenuSwipeRequest(if (L10nUtil.isDeviceRTL) if (ev.x > initialX) Gravity.END else Gravity.START else if (ev.x > initialX) Gravity.START else Gravity.END) } } From 4da818dbf5690115fa811029fd3723ade9c11058 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 20 Jun 2024 18:14:37 +0300 Subject: [PATCH 189/626] Localisation updates from https://translatewiki.net. (#4749) --- app/src/main/res/values-br/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 5 +++-- app/src/main/res/values-krc/strings.xml | 2 +- app/src/main/res/values-lb/strings.xml | 10 ++++++++-- app/src/main/res/values-vi/strings.xml | 6 ++++++ 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 9c9e407d0c5..16fcacb7762 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -724,7 +724,7 @@ Maen-bonn Un toullad mat a gemmoù zo bet tizhet Trugarez - Unan bennak en deus trugarekaet ac\'hanoc\'h evit ur c\'hemenn + Unan bennak en deus trugarekaet ac\'hanoc\'h eus ur c\'hemenn Disteurel Kevreañ Meneg diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0980bc3c0e6..d3c4e8e1a07 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1323,8 +1323,9 @@ Gracias por usar las páginas de discusión. ¿Podrías ayudarnos a mejorar la aplicación participando en una encuesta? Empezar Wikipedia - discusiones en página de discusión - Temas de búsqueda + Buscar temas Buscar en el tema de página de discusión + Ordenar por Mostrar respuesta Mostrar respuestas (%d) @@ -1368,7 +1369,7 @@ Compara las revisiones Comparar las revisiones: %s De: - Para: + A: Línea %d Líneas %1$d–%2$d Línea añadida diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml index 7c589ca9794..37e5023ae7b 100644 --- a/app/src/main/res/values-krc/strings.xml +++ b/app/src/main/res/values-krc/strings.xml @@ -1198,7 +1198,7 @@ Бичимлендириу Башлыкъла Медианы сал - Ышанлы тизим + Ышанлы тизме Номерленнген тизме Шаблон Белгилеу diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index a8432d714d8..9539b51906b 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -215,11 +215,12 @@ Dateschutzrichtlinnen Benotzungs-Bedingungen https://lb.wikipedia.org/wiki/Wikipedia:Iwwer_d\'Wikipedia - https://foundation.m.wikimedia.org/wiki/Privacy_policy - https://foundation.m.wikimedia.org/wiki/Terms_of_Use + https://foundation.wikimedia.org/wiki/Policy:Privacy_policy + https://foundation.wikimedia.org/wiki/Policy:Terms_of_Use https://m.mediawiki.org/wiki/Wikimedia_Apps/Android_Suggested_edits Benotzt Bibliothéiken Auteuren + <a href=\"https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android\">Team-Säit</a> Iwwersetzer Dës App gouf vun de fräiwëllegen Iwwersetzer op <a href=\"https://translatewiki.net\">translatewiki.net</a> iwwersat. Lizenz @@ -253,6 +254,8 @@ Linken derbäigesat Anerer Aner Manéier wéi Dir d\'Säit verbessert hutt + Kuerzbeschreiwung derbäigesat + Kuerzbeschreiwung aktualiséiert Ännerungskonflikt Liest wgl. virum Änneren Den nächste fannen @@ -407,6 +410,7 @@ Schrëftaart Liesen Änneren + Liesfokus-Modus Ervirhiewe vun der Syntax Zeilennummere weisen Monospace-Schrëftaart benotzen @@ -477,6 +481,8 @@ D\'Standardlëscht (%s) kann net geläscht ginn %1$s geläscht. D\'Standardlëscht (%2$s) kann net geläscht ginn. Lëschte geläscht. D\'Standardlëscht (%s) kann net geläscht ginn. + %s (Wikipedia-Lieslëscht).json + Wikipedia-Lieslëschten (%s a méi).json %d Artikele vun der Lëscht erofgeholl %s vun de Lëschten erofgeholl Réckgängeg maachen diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 46409964ae7..217e59396b0 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -747,6 +747,7 @@ Hủy bỏ Bạn đã đến cuối nguồn cấp dữ liệu. Tải thêm + Lưu Đọc nhiều nhất trên %s Các tab Miêu tả bài viết @@ -1155,6 +1156,7 @@ Đã di chuyển Đã khóa Đã xóa + Wiki Tất cả Bot Con người (không phải bot) @@ -1174,6 +1176,10 @@ Xóa Cảm ơn Thông tin người dùng + Tất cả Bot Con người (không phải bot) + Sửa đổi nhỏ + Cảm ơn + Quyên góp bằng Google Pay? From 3fcf68fee7a9985e127afa48a64685d4b733a2d0 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 21 Jun 2024 12:27:16 -0400 Subject: [PATCH 190/626] Update gradle and dependencies. (#4747) Co-authored-by: Cooltey Feng --- app/build.gradle | 6 +++--- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8c0ecebb9f0..ded16021954 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -197,7 +197,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.13.1' implementation "androidx.browser:browser:1.8.0" implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.fragment:fragment-ktx:1.7.1' + implementation 'androidx.fragment:fragment-ktx:1.8.0' implementation "androidx.paging:paging-runtime-ktx:3.3.0" implementation "androidx.palette:palette-ktx:1.0.0" implementation "androidx.preference:preference-ktx:1.2.1" @@ -226,7 +226,7 @@ dependencies { implementation 'org.apache.commons:commons-lang3:3.14.0' implementation 'org.jsoup:jsoup:1.17.2' implementation 'com.github.chrisbanes:PhotoView:2.3.0' - implementation 'com.github.skydoves:balloon:1.6.4' + implementation 'com.github.skydoves:balloon:1.6.5' implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0" implementation 'org.maplibre.gl:android-sdk:10.3.0' @@ -264,7 +264,7 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation "org.mockito:mockito-inline:$mockitoVersion" - testImplementation 'org.robolectric:robolectric:4.12.1' + testImplementation 'org.robolectric:robolectric:4.12.2' testImplementation "com.squareup.okhttp3:okhttp:$okHttpVersion" testImplementation "com.squareup.okhttp3:mockwebserver:$okHttpVersion" testImplementation 'org.hamcrest:hamcrest:2.2' diff --git a/build.gradle b/build.gradle index 8dccb9f3c24..cfa1eff1dc7 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:8.4.1' + classpath 'com.android.tools.build:gradle:8.5.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath 'com.google.gms:google-services:4.4.2' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 510e4efae0b..d951fac2bf3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 2abd9917afb6301beb2853e190354ae170e90f65 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 21 Jun 2024 17:26:09 -0400 Subject: [PATCH 191/626] Use Flow instead of RxJava for Bus functionality. (#4716) * Use Flow instead of RxJava for Bus functionality. * Make it a singleton. --------- Co-authored-by: Cooltey Feng --- .../main/java/org/wikipedia/WikipediaApp.kt | 9 +- .../org/wikipedia/activity/BaseActivity.kt | 113 +++++++----------- .../analytics/InstallReferrerListener.kt | 3 +- .../org/wikipedia/concurrency/FlowEventBus.kt | 18 +++ .../java/org/wikipedia/concurrency/RxBus.kt | 21 ---- .../org/wikipedia/csrf/CsrfTokenClient.kt | 3 +- .../java/org/wikipedia/main/MainFragment.kt | 31 ++--- .../NotificationPollBroadcastReceiver.kt | 3 +- .../java/org/wikipedia/page/PageActivity.kt | 50 ++++---- .../org/wikipedia/random/RandomFragment.kt | 36 +++--- .../readinglist/ReadingListFragment.kt | 40 +++---- .../ReadingListSyncBehaviorDialogs.kt | 4 +- .../readinglist/ReadingListsFragment.kt | 52 ++++---- .../readinglist/db/ReadingListPageDao.kt | 10 +- .../sync/ReadingListSyncAdapter.kt | 7 +- .../savedpages/SavedPageSyncService.kt | 12 +- .../wikipedia/settings/SettingsFragment.kt | 49 ++++---- .../org/wikipedia/theme/ThemeChooserDialog.kt | 30 ++--- .../theme/ThemeFittingRoomFragment.kt | 32 ++--- .../org/wikipedia/views/ObservableWebView.kt | 4 +- 20 files changed, 255 insertions(+), 272 deletions(-) create mode 100644 app/src/main/java/org/wikipedia/concurrency/FlowEventBus.kt delete mode 100644 app/src/main/java/org/wikipedia/concurrency/RxBus.kt diff --git a/app/src/main/java/org/wikipedia/WikipediaApp.kt b/app/src/main/java/org/wikipedia/WikipediaApp.kt index 66d0f2b7b52..9ee27fcf055 100644 --- a/app/src/main/java/org/wikipedia/WikipediaApp.kt +++ b/app/src/main/java/org/wikipedia/WikipediaApp.kt @@ -18,7 +18,7 @@ import org.wikipedia.analytics.eventplatform.AppSessionEvent import org.wikipedia.analytics.eventplatform.EventPlatformClient import org.wikipedia.appshortcuts.AppShortcuts import org.wikipedia.auth.AccountUtil -import org.wikipedia.concurrency.RxBus +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.connectivity.ConnectionStateMonitor import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.SharedPreferenceCookieManager @@ -64,7 +64,6 @@ class WikipediaApp : Application() { private var defaultWikiSite: WikiSite? = null val connectionStateMonitor = ConnectionStateMonitor() - val bus = RxBus() val tabList = mutableListOf() var currentTheme = Theme.fallback @@ -72,7 +71,7 @@ class WikipediaApp : Application() { if (value !== field) { field = value Prefs.currentThemeId = currentTheme.marshallingId - bus.post(ThemeFontChangeEvent()) + FlowEventBus.post(ThemeFontChangeEvent()) } } @@ -191,7 +190,7 @@ class WikipediaApp : Application() { val multiplier = constrainFontSizeMultiplier(mult) if (multiplier != Prefs.textSizeMultiplier) { Prefs.textSizeMultiplier = multiplier - bus.post(ChangeTextSizeEvent()) + FlowEventBus.post(ChangeTextSizeEvent()) return true } return false @@ -200,7 +199,7 @@ class WikipediaApp : Application() { fun setFontFamily(fontFamily: String) { if (fontFamily != Prefs.fontFamily) { Prefs.fontFamily = fontFamily - bus.post(ThemeFontChangeEvent()) + FlowEventBus.post(ThemeFontChangeEvent()) } } diff --git a/app/src/main/java/org/wikipedia/activity/BaseActivity.kt b/app/src/main/java/org/wikipedia/activity/BaseActivity.kt index 21b859c558a..bfe6a10e368 100644 --- a/app/src/main/java/org/wikipedia/activity/BaseActivity.kt +++ b/app/src/main/java/org/wikipedia/activity/BaseActivity.kt @@ -11,11 +11,13 @@ import androidx.annotation.ColorInt import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.pm.ShortcutManagerCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.skydoves.balloon.Balloon -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.disposables.Disposable -import io.reactivex.rxjava3.functions.Consumer +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.WikipediaApp @@ -26,6 +28,7 @@ import org.wikipedia.analytics.eventplatform.NotificationInteractionEvent import org.wikipedia.analytics.metricsplatform.MetricsPlatform import org.wikipedia.appshortcuts.AppShortcuts import org.wikipedia.auth.AccountUtil +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.connectivity.ConnectionStateMonitor import org.wikipedia.donate.DonateDialog import org.wikipedia.events.* @@ -50,8 +53,6 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba interface Callback { fun onPermissionResult(activity: BaseActivity, isGranted: Boolean) } - private lateinit var exclusiveBusMethods: ExclusiveBusConsumer - private val disposables = CompositeDisposable() private var currentTooltip: Balloon? = null private var imageZoomHelper: ImageZoomHelper? = null var callback: Callback? = null @@ -69,8 +70,6 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - exclusiveBusMethods = ExclusiveBusConsumer() - disposables.add(WikipediaApp.instance.bus.subscribe(NonExclusiveBusConsumer())) setTheme() removeSplashBackground() @@ -109,14 +108,49 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba } Prefs.localClassName = localClassName + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + if (event is ThemeFontChangeEvent) { + ActivityCompat.recreate(this@BaseActivity) + } + } + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.RESUMED) { + FlowEventBus.events.collectLatest { event -> + if (event is SplitLargeListsEvent) { + MaterialAlertDialogBuilder(this@BaseActivity) + .setMessage(getString(R.string.split_reading_list_message, Constants.MAX_READING_LIST_ARTICLE_LIMIT)) + .setPositiveButton(R.string.reading_list_split_dialog_ok_button_text, null) + .show() + } else if (event is ReadingListsNoLongerSyncedEvent) { + ReadingListSyncBehaviorDialogs.detectedRemoteTornDownDialog(this@BaseActivity) + } else if (event is ReadingListsEnableDialogEvent && this@BaseActivity is MainActivity) { + ReadingListSyncBehaviorDialogs.promptEnableSyncDialog(this@BaseActivity) + } else if (event is LoggedOutInBackgroundEvent) { + maybeShowLoggedOutInBackgroundDialog() + } else if (event is ReadingListSyncEvent) { + if (event.showMessage && !Prefs.isSuggestedEditsHighestPriorityEnabled) { + FeedbackUtil.makeSnackbar(this@BaseActivity, getString(R.string.reading_list_toast_last_sync)).show() + } + } else if (event is UnreadNotificationsEvent) { + runOnUiThread { + if (!isDestroyed) { + onUnreadNotification() + } + } + } + } + } + } } override fun onDestroy() { WikipediaApp.instance.connectionStateMonitor.unregisterCallback(this) - disposables.dispose() - if (EXCLUSIVE_BUS_METHODS === exclusiveBusMethods) { - unregisterExclusiveBusMethods() - } CustomHtmlParser.pruneBitmaps(this) super.onDestroy() } @@ -133,11 +167,6 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba WikipediaApp.instance.appSessionEvent.touchSession() MetricsPlatform.client.onAppResume() BreadCrumbLogEvent.logScreenShown(this) - - // allow this activity's exclusive bus methods to override any existing ones. - unregisterExclusiveBusMethods() - EXCLUSIVE_BUS_METHODS = exclusiveBusMethods - EXCLUSIVE_DISPOSABLE = WikipediaApp.instance.bus.subscribe(EXCLUSIVE_BUS_METHODS!!) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -201,12 +230,6 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba window.setBackgroundDrawable(ColorDrawable(ResourceUtil.getThemedColor(this, R.attr.paper_color))) } - private fun unregisterExclusiveBusMethods() { - EXCLUSIVE_DISPOSABLE?.dispose() - EXCLUSIVE_DISPOSABLE = null - EXCLUSIVE_BUS_METHODS = null - } - private fun maybeShowLoggedOutInBackgroundDialog() { if (Prefs.loggedOutInBackground) { Prefs.loggedOutInBackground = false @@ -235,50 +258,4 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba } open fun onUnreadNotification() { } - - /** - * Bus consumer that should be registered by all created activities. - */ - private inner class NonExclusiveBusConsumer : Consumer { - override fun accept(event: Any) { - if (event is ThemeFontChangeEvent) { - ActivityCompat.recreate(this@BaseActivity) - } - } - } - - /** - * Bus methods that should be caught only by the topmost activity. - */ - private inner class ExclusiveBusConsumer : Consumer { - override fun accept(event: Any) { - if (event is SplitLargeListsEvent) { - MaterialAlertDialogBuilder(this@BaseActivity) - .setMessage(getString(R.string.split_reading_list_message, Constants.MAX_READING_LIST_ARTICLE_LIMIT)) - .setPositiveButton(R.string.reading_list_split_dialog_ok_button_text, null) - .show() - } else if (event is ReadingListsNoLongerSyncedEvent) { - ReadingListSyncBehaviorDialogs.detectedRemoteTornDownDialog(this@BaseActivity) - } else if (event is ReadingListsEnableDialogEvent && this@BaseActivity is MainActivity) { - ReadingListSyncBehaviorDialogs.promptEnableSyncDialog(this@BaseActivity) - } else if (event is LoggedOutInBackgroundEvent) { - maybeShowLoggedOutInBackgroundDialog() - } else if (event is ReadingListSyncEvent) { - if (event.showMessage && !Prefs.isSuggestedEditsHighestPriorityEnabled) { - FeedbackUtil.makeSnackbar(this@BaseActivity, getString(R.string.reading_list_toast_last_sync)).show() - } - } else if (event is UnreadNotificationsEvent) { - runOnUiThread { - if (!isDestroyed) { - onUnreadNotification() - } - } - } - } - } - - companion object { - private var EXCLUSIVE_BUS_METHODS: ExclusiveBusConsumer? = null - private var EXCLUSIVE_DISPOSABLE: Disposable? = null - } } diff --git a/app/src/main/java/org/wikipedia/analytics/InstallReferrerListener.kt b/app/src/main/java/org/wikipedia/analytics/InstallReferrerListener.kt index a093df8006c..c727f19c053 100644 --- a/app/src/main/java/org/wikipedia/analytics/InstallReferrerListener.kt +++ b/app/src/main/java/org/wikipedia/analytics/InstallReferrerListener.kt @@ -7,6 +7,7 @@ import com.android.installreferrer.api.InstallReferrerClient import com.android.installreferrer.api.InstallReferrerStateListener import org.wikipedia.WikipediaApp import org.wikipedia.analytics.eventplatform.InstallReferrerEvent +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.events.ImportReadingListsEvent import org.wikipedia.page.PageActivity import org.wikipedia.settings.Prefs @@ -130,7 +131,7 @@ class InstallReferrerListener : InstallReferrerStateListener { if (refUtmSource.orEmpty() == "readingLists") { Prefs.importReadingListsNewInstallDialogShown = false - WikipediaApp.instance.bus.post(ImportReadingListsEvent()) + FlowEventBus.post(ImportReadingListsEvent()) } } diff --git a/app/src/main/java/org/wikipedia/concurrency/FlowEventBus.kt b/app/src/main/java/org/wikipedia/concurrency/FlowEventBus.kt new file mode 100644 index 00000000000..1695f432e95 --- /dev/null +++ b/app/src/main/java/org/wikipedia/concurrency/FlowEventBus.kt @@ -0,0 +1,18 @@ +package org.wikipedia.concurrency + +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import org.wikipedia.util.log.L + +object FlowEventBus { + + private val _events = MutableSharedFlow(extraBufferCapacity = 8, onBufferOverflow = BufferOverflow.DROP_OLDEST) + val events = _events.asSharedFlow() + + fun post(event: Any) { + if (!_events.tryEmit(event)) { + L.e("Unable to emit event") + } + } +} diff --git a/app/src/main/java/org/wikipedia/concurrency/RxBus.kt b/app/src/main/java/org/wikipedia/concurrency/RxBus.kt deleted file mode 100644 index 97a573f92ad..00000000000 --- a/app/src/main/java/org/wikipedia/concurrency/RxBus.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.wikipedia.concurrency - -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.annotations.CheckReturnValue -import io.reactivex.rxjava3.disposables.Disposable -import io.reactivex.rxjava3.functions.Consumer -import io.reactivex.rxjava3.subjects.PublishSubject - -class RxBus { - private val bus = PublishSubject.create().toSerialized() - private val observable = bus.observeOn(AndroidSchedulers.mainThread()) - - fun post(o: Any) { - bus.onNext(o) - } - - @CheckReturnValue - fun subscribe(consumer: Consumer): Disposable { - return observable.subscribe(consumer) - } -} diff --git a/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt b/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt index d106e1e6402..1df081287c0 100644 --- a/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt +++ b/app/src/main/java/org/wikipedia/csrf/CsrfTokenClient.kt @@ -5,6 +5,7 @@ import io.reactivex.rxjava3.schedulers.Schedulers import kotlinx.coroutines.runBlocking import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.dataclient.Service import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite @@ -92,6 +93,6 @@ object CsrfTokenClient { // Signal to the rest of the app that we're explicitly logging out in the background. WikipediaApp.instance.logOut() Prefs.loggedOutInBackground = true - WikipediaApp.instance.bus.post(LoggedOutInBackgroundEvent()) + FlowEventBus.post(LoggedOutInBackgroundEvent()) } } diff --git a/app/src/main/java/org/wikipedia/main/MainFragment.kt b/app/src/main/java/org/wikipedia/main/MainFragment.kt index 0acd1902afd..75e901963a6 100644 --- a/app/src/main/java/org/wikipedia/main/MainFragment.kt +++ b/app/src/main/java/org/wikipedia/main/MainFragment.kt @@ -25,10 +25,11 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.dialog.MaterialAlertDialogBuilder -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.functions.Consumer +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.wikipedia.BackPressedHandler import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource @@ -40,6 +41,7 @@ import org.wikipedia.analytics.eventplatform.PlacesEvent import org.wikipedia.analytics.eventplatform.ReadingListsAnalyticsHelper import org.wikipedia.auth.AccountUtil import org.wikipedia.commons.FilePageActivity +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.databinding.FragmentMainBinding import org.wikipedia.dataclient.WikiSite import org.wikipedia.events.ImportReadingListsEvent @@ -102,7 +104,6 @@ class MainFragment : Fragment(), BackPressedHandler, MenuProvider, FeedFragment. private val downloadReceiver = MediaDownloadReceiver() private val downloadReceiverCallback = MediaDownloadReceiverCallback() private val pageChangeCallback = PageChangeCallback() - private val disposables = CompositeDisposable() private var exclusiveTooltipRunnable: Runnable? = null // The permissions request API doesn't take a callback, so in the event we have to @@ -125,7 +126,18 @@ class MainFragment : Fragment(), BackPressedHandler, MenuProvider, FeedFragment. _binding = FragmentMainBinding.inflate(inflater, container, false) requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) - disposables.add(WikipediaApp.instance.bus.subscribe(EventBusConsumer())) + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + if (event is LoggedOutInBackgroundEvent) { + refreshContents() + } else if (event is ImportReadingListsEvent) { + maybeShowImportReadingListsNewInstallDialog() + } + } + } + } + binding.mainViewPager.isUserInputEnabled = false binding.mainViewPager.adapter = NavTabFragmentPagerAdapter(this) binding.mainViewPager.registerOnPageChangeCallback(pageChangeCallback) @@ -179,7 +191,6 @@ class MainFragment : Fragment(), BackPressedHandler, MenuProvider, FeedFragment. binding.mainViewPager.adapter = null binding.mainViewPager.unregisterOnPageChangeCallback(pageChangeCallback) _binding = null - disposables.dispose() super.onDestroyView() } @@ -581,16 +592,6 @@ class MainFragment : Fragment(), BackPressedHandler, MenuProvider, FeedFragment. } } - private inner class EventBusConsumer : Consumer { - override fun accept(event: Any) { - if (event is LoggedOutInBackgroundEvent) { - refreshContents() - } else if (event is ImportReadingListsEvent) { - maybeShowImportReadingListsNewInstallDialog() - } - } - } - private fun enqueueTooltip(runnable: Runnable) { if (exclusiveTooltipRunnable != null) { return diff --git a/app/src/main/java/org/wikipedia/notifications/NotificationPollBroadcastReceiver.kt b/app/src/main/java/org/wikipedia/notifications/NotificationPollBroadcastReceiver.kt index e8314a8073a..cce1781d314 100644 --- a/app/src/main/java/org/wikipedia/notifications/NotificationPollBroadcastReceiver.kt +++ b/app/src/main/java/org/wikipedia/notifications/NotificationPollBroadcastReceiver.kt @@ -16,6 +16,7 @@ import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.analytics.eventplatform.NotificationInteractionEvent import org.wikipedia.auth.AccountUtil +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.csrf.CsrfTokenClient import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.ServiceFactory @@ -138,7 +139,7 @@ class NotificationPollBroadcastReceiver : BroadcastReceiver() { if (notificationsToDisplay.isNotEmpty()) { Prefs.notificationUnreadCount = notificationsToDisplay.size - WikipediaApp.instance.bus.post(UnreadNotificationsEvent()) + FlowEventBus.post(UnreadNotificationsEvent()) } if (notificationsToDisplay.size > 2) { diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.kt b/app/src/main/java/org/wikipedia/page/PageActivity.kt index ca015bd013a..cb9b748448f 100644 --- a/app/src/main/java/org/wikipedia/page/PageActivity.kt +++ b/app/src/main/java/org/wikipedia/page/PageActivity.kt @@ -20,10 +20,13 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.children import androidx.core.view.isVisible import androidx.core.view.updatePadding +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.preference.PreferenceManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.functions.Consumer +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.R @@ -37,6 +40,7 @@ import org.wikipedia.analytics.eventplatform.PlacesEvent import org.wikipedia.analytics.metricsplatform.ArticleLinkPreviewInteraction import org.wikipedia.auth.AccountUtil import org.wikipedia.commons.FilePageActivity +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.databinding.ActivityPageBinding import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.mwapi.MwQueryPage @@ -92,7 +96,6 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo private var hasTransitionAnimation = false private var wasTransitionShown = false private val currentActionModes = mutableSetOf() - private val disposables = CompositeDisposable() private val isCabOpen get() = currentActionModes.isNotEmpty() private var exclusiveTooltipRunnable: Runnable? = null private var isTooltipShowing = false @@ -169,7 +172,25 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo binding = ActivityPageBinding.inflate(layoutInflater) setContentView(binding.root) - disposables.add(app.bus.subscribe(EventBusConsumer())) + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + when (event) { + is ChangeTextSizeEvent -> { + pageFragment.updateFontSize() + } + is ArticleSavedOrDeletedEvent -> { + pageFragment.title?.run { + if (event.pages.any { it.apiTitle == prefixedText && it.wiki.languageCode == wikiSite.languageCode }) { + pageFragment.updateBookmarkAndMenuOptionsFromDao() + } + } + } + } + } + } + } + updateProgressBar(false) pageFragment = supportFragmentManager.findFragmentById(R.id.page_fragment) as PageFragment @@ -314,7 +335,6 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo } override fun onDestroy() { - disposables.clear() Prefs.hasVisitedArticlePage = true super.onDestroy() } @@ -780,26 +800,6 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo updateNotificationsButton(true) } - private inner class EventBusConsumer : Consumer { - override fun accept(event: Any) { - when (event) { - is ChangeTextSizeEvent -> { - pageFragment.updateFontSize() - } - is ArticleSavedOrDeletedEvent -> { - if (!pageFragment.isAdded) { - return - } - pageFragment.title?.run { - if (event.pages.any { it.apiTitle == prefixedText && it.wiki.languageCode == wikiSite.languageCode }) { - pageFragment.updateBookmarkAndMenuOptionsFromDao() - } - } - } - } - } - } - companion object { private const val LANGUAGE_CODE_BUNDLE_KEY = "language" private const val EXCEPTION_MESSAGE_WEBVIEW = "webview" diff --git a/app/src/main/java/org/wikipedia/random/RandomFragment.kt b/app/src/main/java/org/wikipedia/random/RandomFragment.kt index e896102e8cf..2cd45dfd740 100644 --- a/app/src/main/java/org/wikipedia/random/RandomFragment.kt +++ b/app/src/main/java/org/wikipedia/random/RandomFragment.kt @@ -14,12 +14,12 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback -import io.reactivex.rxjava3.functions.Consumer +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.R -import org.wikipedia.WikipediaApp +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.databinding.FragmentRandomBinding import org.wikipedia.dataclient.WikiSite import org.wikipedia.events.ArticleSavedOrDeletedEvent @@ -62,7 +62,6 @@ class RandomFragment : Fragment() { viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { - val eventBus = WikipediaApp.instance.bus.subscribe(EventBusConsumer()) viewModel.uiState.collect { when (it) { is Resource.Success -> setSaveButton() @@ -72,6 +71,22 @@ class RandomFragment : Fragment() { } } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + if (event is ArticleSavedOrDeletedEvent) { + if (topTitle != null) { + for (page in event.pages) { + if (page.apiTitle == topTitle?.prefixedText && page.wiki.languageCode == topTitle?.wikiSite?.languageCode) { + updateSaveButton(topTitle) + } + } + } + } + } + } + } + updateSaveButton() updateBackButton(DEFAULT_PAGER_TAB) @@ -217,21 +232,6 @@ class RandomFragment : Fragment() { } } - private inner class EventBusConsumer : Consumer { - override fun accept(event: Any) { - if (event is ArticleSavedOrDeletedEvent) { - if (!isAdded || topTitle == null) { - return - } - for (page in event.pages) { - if (page.apiTitle == topTitle?.prefixedText && page.wiki.languageCode == topTitle?.wikiSite?.languageCode) { - updateSaveButton(topTitle) - } - } - } - } - } - companion object { const val DEFAULT_PAGER_TAB = 0 const val ENABLED_BACK_BUTTON_ALPHA = 1f diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt index 7089529279c..0ba9b44a7f0 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt @@ -23,6 +23,7 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -31,18 +32,17 @@ import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.core.Completable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.schedulers.Schedulers import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.Runnable +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.R -import org.wikipedia.WikipediaApp import org.wikipedia.activity.BaseActivity import org.wikipedia.analytics.eventplatform.ReadingListsAnalyticsHelper +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.database.AppDatabase import org.wikipedia.databinding.FragmentReadingListBinding import org.wikipedia.events.PageDownloadEvent @@ -79,7 +79,6 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial private lateinit var touchCallback: SwipeableItemTouchHelperCallback private lateinit var headerView: ReadingListItemView private var previewSaveDialog: AlertDialog? = null - private val disposables = CompositeDisposable() private var isPreview: Boolean = false private var readingListId: Long = 0 private val adapter = ReadingListPageItemAdapter() @@ -113,7 +112,23 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial setHeaderView() setRecyclerView() setSwipeRefreshView() - disposables.add(WikipediaApp.instance.bus.subscribe(EventBusConsumer())) + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + if (event is ReadingListSyncEvent) { + updateReadingListData() + } else if (event is PageDownloadEvent) { + val pagePosition = getPagePositionInList(event.page) + if (pagePosition != -1 && displayedLists[pagePosition] is ReadingListPage) { + (displayedLists[pagePosition] as ReadingListPage).downloadProgress = event.page.downloadProgress + adapter.notifyItemChanged(pagePosition + 1) + } + } + } + } + } + return binding.root } @@ -125,7 +140,6 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial } override fun onDestroyView() { - disposables.clear() previewSaveDialog?.dismiss() binding.readingListRecyclerView.adapter = null binding.readingListAppBar.removeOnOffsetChangedListener(appBarListener) @@ -949,20 +963,6 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial } } - private inner class EventBusConsumer : Consumer { - override fun accept(event: Any) { - if (event is ReadingListSyncEvent) { - updateReadingListData() - } else if (event is PageDownloadEvent) { - val pagePosition = getPagePositionInList(event.page) - if (pagePosition != -1 && displayedLists[pagePosition] is ReadingListPage) { - (displayedLists[pagePosition] as ReadingListPage).downloadProgress = event.page.downloadProgress - adapter.notifyItemChanged(pagePosition + 1) - } - } - } - } - private fun getPagePositionInList(page: ReadingListPage): Int { return displayedLists.indexOfFirst { it is ReadingListPage && it.id == page.id } } diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListSyncBehaviorDialogs.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListSyncBehaviorDialogs.kt index bbfc9d70edb..c2a09320ea4 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListSyncBehaviorDialogs.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListSyncBehaviorDialogs.kt @@ -3,7 +3,7 @@ package org.wikipedia.readinglist import android.app.Activity import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.wikipedia.R -import org.wikipedia.WikipediaApp +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.databinding.DialogWithCheckboxBinding import org.wikipedia.events.ReadingListsEnableSyncStatusEvent import org.wikipedia.login.LoginActivity @@ -42,7 +42,7 @@ object ReadingListSyncBehaviorDialogs { .setNegativeButton(R.string.reading_list_prompt_turned_sync_on_dialog_no_thanks, null) .setOnDismissListener { Prefs.showReadingListSyncEnablePrompt = !binding.dialogCheckbox.isChecked - WikipediaApp.instance.bus.post(ReadingListsEnableSyncStatusEvent()) + FlowEventBus.post(ReadingListsEnableSyncStatusEvent()) } .show() } diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt index 7969f3bfb55..b343367977c 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt @@ -21,23 +21,25 @@ import androidx.core.text.color import androidx.core.view.MenuItemCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.snackbar.Snackbar import io.reactivex.rxjava3.core.Completable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.R -import org.wikipedia.WikipediaApp import org.wikipedia.activity.BaseActivity import org.wikipedia.analytics.eventplatform.ReadingListsAnalyticsHelper import org.wikipedia.auth.AccountUtil +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.database.AppDatabase import org.wikipedia.databinding.FragmentReadingListsBinding import org.wikipedia.events.ArticleSavedOrDeletedEvent @@ -74,7 +76,6 @@ class ReadingListsFragment : Fragment(), SortReadingListsDialog.Callback, Readin private var _binding: FragmentReadingListsBinding? = null private val binding get() = _binding!! private var displayedLists = listOf() - private val disposables = CompositeDisposable() private val adapter = ReadingListAdapter() private val readingListItemCallback = ReadingListItemCallback() private val readingListPageItemCallback = ReadingListPageItemCallback() @@ -108,7 +109,6 @@ class ReadingListsFragment : Fragment(), SortReadingListsDialog.Callback, Readin binding.recyclerView.adapter = adapter binding.recyclerView.addItemDecoration(DrawableItemDecoration(requireContext(), R.attr.list_divider)) setUpScrollListener() - disposables.add(WikipediaApp.instance.bus.subscribe(EventBusConsumer())) binding.swipeRefreshLayout.setColorSchemeResources(ResourceUtil.getThemedAttributeId(requireContext(), R.attr.progressive_color)) binding.swipeRefreshLayout.setOnRefreshListener { refreshSync(this, binding.swipeRefreshLayout) } if (RemoteConfig.config.disableReadingListSync) { @@ -116,6 +116,28 @@ class ReadingListsFragment : Fragment(), SortReadingListsDialog.Callback, Readin } binding.searchEmptyView.visibility = View.GONE enableLayoutTransition(true) + + viewLifecycleOwner.lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + if (event is ReadingListSyncEvent) { + binding.recyclerView.post { + if (isAdded) { + updateLists(currentSearchQuery, !currentSearchQuery.isNullOrEmpty() || recentPreviewSavedReadingList != null) + } + } + } else if (event is ArticleSavedOrDeletedEvent) { + if (event.isAdded) { + if (Prefs.readingListsPageSaveCount < SAVE_COUNT_LIMIT) { + showReadingListsSyncDialog() + Prefs.readingListsPageSaveCount = Prefs.readingListsPageSaveCount + 1 + } + } + } + } + } + } + return binding.root } @@ -129,7 +151,6 @@ class ReadingListsFragment : Fragment(), SortReadingListsDialog.Callback, Readin } override fun onDestroyView() { - disposables.clear() binding.recyclerView.adapter = null binding.recyclerView.clearOnScrollListeners() _binding = null @@ -736,25 +757,6 @@ class ReadingListsFragment : Fragment(), SortReadingListsDialog.Callback, Readin } } - private inner class EventBusConsumer : Consumer { - override fun accept(event: Any) { - if (event is ReadingListSyncEvent) { - binding.recyclerView.post { - if (isAdded) { - updateLists(currentSearchQuery, !currentSearchQuery.isNullOrEmpty() || recentPreviewSavedReadingList != null) - } - } - } else if (event is ArticleSavedOrDeletedEvent) { - if (event.isAdded) { - if (Prefs.readingListsPageSaveCount < SAVE_COUNT_LIMIT) { - showReadingListsSyncDialog() - Prefs.readingListsPageSaveCount = Prefs.readingListsPageSaveCount + 1 - } - } - } - } - } - private fun showReadingListsSyncDialog() { if (!Prefs.isReadingListSyncEnabled) { if (AccountUtil.isLoggedIn) { diff --git a/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt b/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt index 287f163f509..9a5fe6c7644 100644 --- a/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt +++ b/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt @@ -8,7 +8,7 @@ import androidx.room.Query import androidx.room.Transaction import androidx.room.Update import org.apache.commons.lang3.StringUtils -import org.wikipedia.WikipediaApp +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.dataclient.WikiSite import org.wikipedia.events.ArticleSavedOrDeletedEvent import org.wikipedia.page.Namespace @@ -104,7 +104,7 @@ interface ReadingListPageDao { for (page in pages) { insertPageIntoDb(list, page) } - WikipediaApp.instance.bus.post(ArticleSavedOrDeletedEvent(true, *pages.toTypedArray())) + FlowEventBus.post(ArticleSavedOrDeletedEvent(true, *pages.toTypedArray())) SavedPageSyncService.enqueue() } @@ -177,7 +177,7 @@ interface ReadingListPageDao { if (queueForSync) { ReadingListSyncAdapter.manualSyncWithDeletePages(list, pages) } - WikipediaApp.instance.bus.post(ArticleSavedOrDeletedEvent(false, *pages.toTypedArray())) + FlowEventBus.post(ArticleSavedOrDeletedEvent(false, *pages.toTypedArray())) SavedPageSyncService.enqueue() } @@ -257,7 +257,7 @@ interface ReadingListPageDao { page.status = ReadingListPage.STATUS_QUEUE_FOR_SAVE insertPageIntoDb(list, page) } - WikipediaApp.instance.bus.post(ArticleSavedOrDeletedEvent(true, page)) + FlowEventBus.post(ArticleSavedOrDeletedEvent(true, page)) SavedPageSyncService.enqueue() if (queueForSync) { @@ -275,7 +275,7 @@ interface ReadingListPageDao { private fun addPageToList(list: ReadingList, title: PageTitle) { val protoPage = ReadingListPage(title) insertPageIntoDb(list, protoPage) - WikipediaApp.instance.bus.post(ArticleSavedOrDeletedEvent(true, protoPage)) + FlowEventBus.post(ArticleSavedOrDeletedEvent(true, protoPage)) } private fun insertPageIntoDb(list: ReadingList, page: ReadingListPage) { diff --git a/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.kt b/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.kt index d239afbc1a8..82d34e004d4 100644 --- a/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.kt +++ b/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.kt @@ -6,6 +6,7 @@ import androidx.core.app.JobIntentService import androidx.core.os.bundleOf import org.wikipedia.WikipediaApp import org.wikipedia.auth.AccountUtil +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.csrf.CsrfTokenClient import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.WikiSite @@ -130,7 +131,7 @@ class ReadingListSyncAdapter : JobIntentService() { } // Notify any event consumers that reading lists are, in fact, enabled. - WikipediaApp.instance.bus.post(ReadingListsEnabledStatusEvent()) + FlowEventBus.post(ReadingListsEnabledStatusEvent()) // setup syncing indicator for remote to local val remoteItemsTotal = remoteListsModified.size @@ -384,11 +385,11 @@ class ReadingListSyncAdapter : JobIntentService() { if (lastSyncTime.isEmpty()) { // This means that it's our first time attempting to sync, and we see that // syncing isn't enabled on the server. So, let's prompt the user to enable it: - WikipediaApp.instance.bus.post(ReadingListsEnableDialogEvent()) + FlowEventBus.post(ReadingListsEnableDialogEvent()) } else { // This can only mean that our reading lists have been torn down (disabled) by // another client, so we need to notify the user of this development. - WikipediaApp.instance.bus.post(ReadingListsNoLongerSyncedEvent()) + FlowEventBus.post(ReadingListsNoLongerSyncedEvent()) } } if (client.isErrorType(t, "notloggedin")) { diff --git a/app/src/main/java/org/wikipedia/savedpages/SavedPageSyncService.kt b/app/src/main/java/org/wikipedia/savedpages/SavedPageSyncService.kt index da5072c4541..f9f8b24c57d 100644 --- a/app/src/main/java/org/wikipedia/savedpages/SavedPageSyncService.kt +++ b/app/src/main/java/org/wikipedia/savedpages/SavedPageSyncService.kt @@ -11,6 +11,7 @@ import okio.Buffer import okio.Sink import okio.Timeout import org.wikipedia.WikipediaApp +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.RestService import org.wikipedia.dataclient.ServiceFactory @@ -36,7 +37,6 @@ import java.io.IOException class SavedPageSyncService : JobIntentService() { private val savedPageSyncNotification = SavedPageSyncNotification.instance - val app: WikipediaApp = WikipediaApp.instance override fun onHandleWork(intent: Intent) { if (ReadingListSyncAdapter.inProgress()) { @@ -165,7 +165,7 @@ class SavedPageSyncService : JobIntentService() { reqMediaList(pageTitle, revision), reqMobileHTML(pageTitle)) { summaryRsp, mediaListRsp, mobileHTMLRsp -> page.downloadProgress = MEDIA_LIST_PROGRESS - app.bus.post(PageDownloadEvent(page)) + FlowEventBus.post(PageDownloadEvent(page)) val fileUrls = mutableSetOf() // download css and javascript assets @@ -254,7 +254,7 @@ class SavedPageSyncService : JobIntentService() { reqSaveUrl(pageTitle, page.wiki, url) percentage += updateRate page.downloadProgress = percentage.toInt() - app.bus.post(PageDownloadEvent(page)) + FlowEventBus.post(PageDownloadEvent(page)) } catch (e: Exception) { if (isRetryable(e)) { throw e @@ -262,7 +262,7 @@ class SavedPageSyncService : JobIntentService() { } } page.downloadProgress = CircularProgressBar.MAX_PROGRESS - app.bus.post(PageDownloadEvent(page)) + FlowEventBus.post(PageDownloadEvent(page)) } @Throws(IOException::class) @@ -285,7 +285,7 @@ class SavedPageSyncService : JobIntentService() { private fun makeUrlRequest(wiki: WikiSite, url: String, pageTitle: PageTitle): Request.Builder { return Request.Builder().cacheControl(CACHE_CONTROL_FORCE_NETWORK).url(UriUtil.resolveProtocolRelativeUrl(wiki, url)) - .addHeader("Accept-Language", app.getAcceptLanguage(pageTitle.wikiSite)) + .addHeader("Accept-Language", WikipediaApp.instance.getAcceptLanguage(pageTitle.wikiSite)) .addHeader(OfflineCacheInterceptor.SAVE_HEADER, OfflineCacheInterceptor.SAVE_HEADER_SAVE) .addHeader(OfflineCacheInterceptor.LANG_HEADER, pageTitle.wikiSite.languageCode) .addHeader(OfflineCacheInterceptor.TITLE_HEADER, UriUtil.encodeURL(pageTitle.prefixedText)) @@ -328,7 +328,7 @@ class SavedPageSyncService : JobIntentService() { fun sendSyncEvent(showMessage: Boolean = false) { // Note: this method posts from a background thread but subscribers expect events to be // received on the main thread. - WikipediaApp.instance.bus.post(ReadingListSyncEvent(showMessage)) + FlowEventBus.post(ReadingListSyncEvent(showMessage)) } } } diff --git a/app/src/main/java/org/wikipedia/settings/SettingsFragment.kt b/app/src/main/java/org/wikipedia/settings/SettingsFragment.kt index 4657f7616ca..da129a86650 100644 --- a/app/src/main/java/org/wikipedia/settings/SettingsFragment.kt +++ b/app/src/main/java/org/wikipedia/settings/SettingsFragment.kt @@ -7,11 +7,13 @@ import android.view.MenuItem import android.view.View import androidx.core.view.MenuProvider import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.preference.SwitchPreferenceCompat -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.functions.Consumer +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.wikipedia.R -import org.wikipedia.WikipediaApp +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.events.ReadingListsEnableSyncStatusEvent import org.wikipedia.events.ReadingListsEnabledStatusEvent import org.wikipedia.events.ReadingListsNoLongerSyncedEvent @@ -19,22 +21,33 @@ import org.wikipedia.settings.DeveloperSettingsActivity.Companion.newIntent class SettingsFragment : PreferenceLoaderFragment(), MenuProvider { private lateinit var preferenceLoader: SettingsPreferenceLoader - private val disposables = CompositeDisposable() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - disposables.add(WikipediaApp.instance.bus.subscribe(EventBusConsumer())) requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + when (event) { + is ReadingListsEnabledStatusEvent -> { + setReadingListSyncPref(true) + } + is ReadingListsNoLongerSyncedEvent -> { + setReadingListSyncPref(false) + } + is ReadingListsEnableSyncStatusEvent -> { + setReadingListSyncPref(Prefs.isReadingListSyncEnabled) + } + } + } + } + } + // TODO: Kick off a sync of reading lists, which will call back to us whether lists // are enabled or not. (Not sure if this is necessary yet.) } - override fun onDestroyView() { - super.onDestroyView() - disposables.clear() - } - override fun loadPreferences() { preferenceLoader = SettingsPreferenceLoader(this) preferenceLoader.loadPreferences() @@ -82,22 +95,6 @@ class SettingsFragment : PreferenceLoaderFragment(), MenuProvider { (preferenceLoader.findPreference(R.string.preference_key_sync_reading_lists) as SwitchPreferenceCompat).isChecked = checked } - private inner class EventBusConsumer : Consumer { - override fun accept(event: Any) { - when (event) { - is ReadingListsEnabledStatusEvent -> { - setReadingListSyncPref(true) - } - is ReadingListsNoLongerSyncedEvent -> { - setReadingListSyncPref(false) - } - is ReadingListsEnableSyncStatusEvent -> { - setReadingListSyncPref(Prefs.isReadingListSyncEnabled) - } - } - } - } - companion object { fun newInstance(): SettingsFragment { return SettingsFragment() diff --git a/app/src/main/java/org/wikipedia/theme/ThemeChooserDialog.kt b/app/src/main/java/org/wikipedia/theme/ThemeChooserDialog.kt index 62ae9952615..2da241fc647 100644 --- a/app/src/main/java/org/wikipedia/theme/ThemeChooserDialog.kt +++ b/app/src/main/java/org/wikipedia/theme/ThemeChooserDialog.kt @@ -12,16 +12,20 @@ import android.widget.SeekBar import android.widget.SeekBar.OnSeekBarChangeListener import androidx.core.os.bundleOf import androidx.core.view.isVisible +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.button.MaterialButton -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.functions.Consumer +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.Constants.InvokeSource import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.activity.FragmentUtil import org.wikipedia.analytics.eventplatform.AppearanceSettingInteractionEvent +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.databinding.DialogThemeChooserBinding import org.wikipedia.events.WebViewInvalidateEvent import org.wikipedia.page.ExtendedBottomSheetDialogFragment @@ -48,7 +52,6 @@ class ThemeChooserDialog : ExtendedBottomSheetDialogFragment() { private var app = WikipediaApp.instance private lateinit var appearanceSettingInteractionEvent: AppearanceSettingInteractionEvent private lateinit var invokeSource: InvokeSource - private val disposables = CompositeDisposable() private var updatingFont = false private var isEditing = false @@ -115,7 +118,16 @@ class ThemeChooserDialog : ExtendedBottomSheetDialogFragment() { callback()?.onEditingPrefsChanged() } - disposables.add(WikipediaApp.instance.bus.subscribe(EventBusConsumer())) + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + if (event is WebViewInvalidateEvent) { + updatingFont = false + updateComponents() + } + } + } + } return binding.root } @@ -133,7 +145,6 @@ class ThemeChooserDialog : ExtendedBottomSheetDialogFragment() { override fun onDestroyView() { super.onDestroyView() - disposables.clear() _binding = null } @@ -324,15 +335,6 @@ class ThemeChooserDialog : ExtendedBottomSheetDialogFragment() { } } - private inner class EventBusConsumer : Consumer { - override fun accept(event: Any) { - if (event is WebViewInvalidateEvent) { - updatingFont = false - updateComponents() - } - } - } - fun callback(): Callback? { return FragmentUtil.getCallback(this, Callback::class.java) } diff --git a/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt b/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt index cc675f1bec7..458b1e7fd9b 100644 --- a/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt +++ b/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt @@ -6,10 +6,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.functions.Consumer +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.wikipedia.R import org.wikipedia.WikipediaApp +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.databinding.FragmentThemeFittingRoomBinding import org.wikipedia.events.ChangeTextSizeEvent import org.wikipedia.events.WebViewInvalidateEvent @@ -18,19 +22,28 @@ import org.wikipedia.settings.Prefs class ThemeFittingRoomFragment : Fragment() { private var _binding: FragmentThemeFittingRoomBinding? = null private val binding get() = _binding!! - private val disposables = CompositeDisposable() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = FragmentThemeFittingRoomBinding.inflate(inflater, container, false) - disposables.add(WikipediaApp.instance.bus.subscribe(EventBusConsumer())) binding.themeTestImage.loadImage(R.drawable.w_nav_mark) updateTextSize() updateFontFamily() + + viewLifecycleOwner.lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + FlowEventBus.events.collectLatest { event -> + if (event is ChangeTextSizeEvent) { + updateTextSize() + binding.themeTestText.post { FlowEventBus.post(WebViewInvalidateEvent()) } + } + } + } + } + return binding.root } override fun onDestroyView() { - disposables.clear() _binding = null super.onDestroyView() } @@ -48,15 +61,6 @@ class ThemeFittingRoomFragment : Fragment() { binding.themeTestText.typeface = currentTypeface } - private inner class EventBusConsumer : Consumer { - override fun accept(event: Any) { - if (event is ChangeTextSizeEvent) { - updateTextSize() - binding.themeTestText.post { WikipediaApp.instance.bus.post(WebViewInvalidateEvent()) } - } - } - } - companion object { fun newInstance(): ThemeFittingRoomFragment { return ThemeFittingRoomFragment() diff --git a/app/src/main/java/org/wikipedia/views/ObservableWebView.kt b/app/src/main/java/org/wikipedia/views/ObservableWebView.kt index da5437a18f8..791a6b447fc 100644 --- a/app/src/main/java/org/wikipedia/views/ObservableWebView.kt +++ b/app/src/main/java/org/wikipedia/views/ObservableWebView.kt @@ -8,7 +8,7 @@ import android.util.AttributeSet import android.view.MotionEvent import android.view.ViewConfiguration import android.webkit.WebView -import org.wikipedia.WikipediaApp +import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.events.WebViewInvalidateEvent import org.wikipedia.util.DimenUtil.densityScalar import org.wikipedia.views.FrameLayoutNavMenuTriggerer.Companion.setChildViewScrolled @@ -189,7 +189,7 @@ class ObservableWebView : WebView { it.onContentHeightChanged(currentContentHeight) } } - WikipediaApp.instance.bus.post(INVALIDATE_EVENT) + FlowEventBus.post(INVALIDATE_EVENT) } companion object { From 32b9315d26af6cab3f5bfde990ab8b6ee5444786 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 21 Jun 2024 18:01:40 -0400 Subject: [PATCH 192/626] Use LiftWing service for machine-generated description suggestions. (#4710) * Use LiftWing service for machine-generated description suggestions. * Syntax. * Syntax. --------- Co-authored-by: Cooltey Feng --- .../liftwing/DescriptionSuggestion.kt | 20 +++++++++++++++++++ .../liftwing/LiftWingModelService.kt | 16 +++++++++++++++ .../descriptions/DescriptionEditFragment.kt | 7 +++++-- .../DescriptionSuggestionResponse.kt | 9 --------- .../DescriptionSuggestionService.kt | 17 ---------------- 5 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/org/wikipedia/dataclient/liftwing/DescriptionSuggestion.kt create mode 100644 app/src/main/java/org/wikipedia/dataclient/liftwing/LiftWingModelService.kt delete mode 100644 app/src/main/java/org/wikipedia/descriptions/DescriptionSuggestionResponse.kt delete mode 100644 app/src/main/java/org/wikipedia/descriptions/DescriptionSuggestionService.kt diff --git a/app/src/main/java/org/wikipedia/dataclient/liftwing/DescriptionSuggestion.kt b/app/src/main/java/org/wikipedia/dataclient/liftwing/DescriptionSuggestion.kt new file mode 100644 index 00000000000..7cd63291eb3 --- /dev/null +++ b/app/src/main/java/org/wikipedia/dataclient/liftwing/DescriptionSuggestion.kt @@ -0,0 +1,20 @@ +package org.wikipedia.dataclient.liftwing + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +class DescriptionSuggestion { + + @Serializable + class Request( + val lang: String, + val title: String, + @SerialName("num_beams") val count: Int = 1 + ) + + @Serializable + class Response { + val prediction: List = emptyList() + val blp = false + } +} diff --git a/app/src/main/java/org/wikipedia/dataclient/liftwing/LiftWingModelService.kt b/app/src/main/java/org/wikipedia/dataclient/liftwing/LiftWingModelService.kt new file mode 100644 index 00000000000..56f34b838e7 --- /dev/null +++ b/app/src/main/java/org/wikipedia/dataclient/liftwing/LiftWingModelService.kt @@ -0,0 +1,16 @@ +package org.wikipedia.dataclient.liftwing + +import retrofit2.http.Body +import retrofit2.http.POST + +interface LiftWingModelService { + + @POST("models/article-descriptions:predict") + suspend fun getDescriptionSuggestion( + @Body body: DescriptionSuggestion.Request, + ): DescriptionSuggestion.Response + + companion object { + const val API_URL = "https://api.wikimedia.org/service/lw/inference/v1/" + } +} diff --git a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt index 894c4096a70..d5a844548b3 100644 --- a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt +++ b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt @@ -35,6 +35,8 @@ import org.wikipedia.csrf.CsrfTokenClient import org.wikipedia.databinding.FragmentDescriptionEditBinding import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite +import org.wikipedia.dataclient.liftwing.DescriptionSuggestion +import org.wikipedia.dataclient.liftwing.LiftWingModelService import org.wikipedia.dataclient.mwapi.MwException import org.wikipedia.dataclient.mwapi.MwServiceError import org.wikipedia.dataclient.okhttp.OkHttpConnectionFactory @@ -243,8 +245,9 @@ class DescriptionEditFragment : Fragment() { L.e(throwable) analyticsHelper.logApiFailed(requireContext(), throwable, pageTitle) }) { - val response = ServiceFactory[pageTitle.wikiSite, DescriptionSuggestionService.API_URL, DescriptionSuggestionService::class.java] - .getSuggestion(pageTitle.wikiSite.languageCode, pageTitle.prefixedText, 2) + + val response = ServiceFactory[pageTitle.wikiSite, LiftWingModelService.API_URL, LiftWingModelService::class.java] + .getDescriptionSuggestion(DescriptionSuggestion.Request(pageTitle.wikiSite.languageCode, pageTitle.prefixedText, 2)) // Perform some post-processing on the predictions. // 1) Capitalize them, if we're dealing with enwiki. diff --git a/app/src/main/java/org/wikipedia/descriptions/DescriptionSuggestionResponse.kt b/app/src/main/java/org/wikipedia/descriptions/DescriptionSuggestionResponse.kt deleted file mode 100644 index 7eb1fbfc64d..00000000000 --- a/app/src/main/java/org/wikipedia/descriptions/DescriptionSuggestionResponse.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.wikipedia.descriptions - -import kotlinx.serialization.Serializable - -@Serializable -class DescriptionSuggestionResponse { - val prediction: List = emptyList() - val blp = false -} diff --git a/app/src/main/java/org/wikipedia/descriptions/DescriptionSuggestionService.kt b/app/src/main/java/org/wikipedia/descriptions/DescriptionSuggestionService.kt deleted file mode 100644 index a0e0699839d..00000000000 --- a/app/src/main/java/org/wikipedia/descriptions/DescriptionSuggestionService.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.wikipedia.descriptions - -import retrofit2.http.GET -import retrofit2.http.Query - -interface DescriptionSuggestionService { - @GET("article") - suspend fun getSuggestion( - @Query("lang") lang: String, - @Query("title") title: String, - @Query("num_beams") count: Int - ): DescriptionSuggestionResponse - - companion object { - const val API_URL = "https://ml-article-description-api.wmcloud.org/" - } -} From 5999270da7c55f44cb20ec4637dd30c0c2a7fe91 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 24 Jun 2024 15:42:12 +0300 Subject: [PATCH 193/626] Localisation updates from https://translatewiki.net. (#4752) --- app/src/main/res/values-ba/strings.xml | 54 ++++++++++++++++++++++++-- app/src/main/res/values-ce/strings.xml | 2 +- app/src/main/res/values-da/strings.xml | 13 +++++++ app/src/main/res/values-es/strings.xml | 13 +++++++ app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-te/strings.xml | 2 +- 6 files changed, 80 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-ba/strings.xml b/app/src/main/res/values-ba/strings.xml index a43e54fe69b..6b1f03ddb96 100644 --- a/app/src/main/res/values-ba/strings.xml +++ b/app/src/main/res/values-ba/strings.xml @@ -131,6 +131,7 @@ Һеҙҙең Википедия телдәре Үҙгәртеүҙәрҙе баҫтырыу Төҙәтеү һаҡланды! + Үҙгәртеүҙәр баҫылды! Үҙгәрештәрҙе күрһәтеү өсөн ваҡыт талап ителә. Мөхәррирләү хатаһы! Ҡабатларға Кире алырға @@ -173,6 +174,8 @@ Һеҙ Википедиянан сыҡтығыҙ. Ҡабат инергә теләйһегеҙме? Танылыу Кире алырға + Иҫәп яҙмаһын юйыу + Иҫәп яҙмаһын юйыу тураһында иҫкәртеү Яңыраҡ ҡаралған биттәр юҡ Уҡылған мәҡәләләрҙе бында күҙәтеп барығыҙ. Тарихтағы ҡайһы бер биттәр оффлайнда булмаҫҡа мөмкин. @@ -282,6 +285,8 @@ Һылтанмалар өҫтәлгән Башҡа Битте яҡшыртҡан башҡа ысулдар + Ҡыҫҡаса тасуирлама өҫтәлгән + Ҡыҫҡаса тасуирламаһы яңыртылған Мөхәррирләү конфликты Мөхәррирләү конфликты килеп сыҡты, сөнки битте бер үк ваҡытта башҡа ҡулланыусы ла мөхәррирләй. Үҙгәрештәрегеҙҙе күсереп алығыҙ ҙа, кире ҡайтып, битте яңыртығыҙ, ә һуңынан күсереп алынған үҙгәртеүҙәрегеҙҙҙе ҡабат ҡуйып ҡарағыҙ. Төҙәтеүҙәр тураһында хәбәр итеү @@ -316,6 +321,8 @@ Википедияның һайланған бите Бөгөнгө һайланған бит: Википедия буйынса эҙләү + Википедияла эҙләүҙең иң тиҙ ысулы + Википедия тәҡдим итә алған иң яҡшы мәҡәләләр Бер ниндәй аңлатма табылманы. Альфа-версияның яңы яңыртылыуы асыҡ Йөкләү өсөн баҫығыҙ @@ -401,6 +408,11 @@ %d һайланды Хата килеп сыҡты Ябырға + Уҡыу + Һаҡлау + Һаҡланған + Уртаҡлашыу + Был мәҡәлә тамамланмаған, тимәк, унда алдан ҡарау өсөн етерлек йөкмәтке юҡ. Әммә һеҙ быны үҙгәртә алаһығыҙ. Был бит юҡ Википедияла<a href=\"%1$s\">исемле ҡатнашыусы бите</a> юҡ. Был бит <b>%2$s</b> тарафынан булдырылған булырға тейеш. Шикләнһәгеҙ, \"%3$s\" бармы икәнен тикшереп ҡарағыҙ. Интернет бәйләнеше юҡ. @@ -423,6 +435,12 @@ Һеҙ <a href=\"%2$s\">%1$s</a> йәки башҡа <a href=\"https://ru.wikipedia.org/wiki/Википедия:Администраторы\">хаким</a> менән бикләү тураһында һөйләшә алаһығыҙ. Ҡоралдар панелын көйләгеҙ Һеҙ <a href=\"https://ru.wikipedia.org/wiki/Википедия:Администраторы\">хаким</a> менән бикләү сәбәптәре тураһында һөйләшә алаһығыҙ + Һеҙ системаға инмәнегеҙ + Аңланым + Һеҙ ваҡытлыса иҫәп яҙмаһын ҡулланаһығыҙ + Үҙгәрештәрҙе кире алырға һәм системаға инергә + Сеансты тамамлау + Был һеҙҙең ваҡытлыса иҫәп яҙмаһынан сығыуға килтерә. Артабан дауам итергә теләйһегеҙме? Ҡушымта хатаһы Үкенескә күрә, Википедия ҡушымтаһы килеп сыҡҡан хата һөҙөмтәһендә ябылды. \nҺеҙ яңынан башларға йәки сығырға теләйһегеҙме? Яңынан башларға @@ -750,8 +768,8 @@ Барлыҡ элементтарҙан билдәне алырға Вики-фильтр Фильтр төрө - Барлыҡ \"вики\" - Барлыҡ \"төрҙәр\" + Бөтә викилар + Бөтә төрҙәр %s фекер алышыу бите Был функцияны офлайн режимда ҡулланып булмай. Уҡылғандар нигеҙендә @@ -810,6 +828,9 @@ Кире алырға Һеҙ теҙмәнең аҫҡы өлөшөнә барып еттегеҙ. Күберәк йөкләргә + Уҡыу сифатын яҡшыртыу өсөн төбәк тел вариантын һайлағыҙ + Һаҡлау + Зинһар, өҫтәмә телдәрегеҙҙе яңыртығыҙ %s иң күп уҡылғандар Ҡушымта Мәҡәлә тасуирламаһы @@ -1057,7 +1078,7 @@ Эйе Юҡ Яуап бирергә ҡыйынһынам - Ни өсөн юҡ? + Кире ҡағыу сәбәбе Һеҙҙең яуаптарығыҙ кәңәштәрҙең сифатын яҡшыртасаҡ. Рәсем көнүҙәк түгел Ҡарар сығарыу өсөн мәғлүмәт етешмәй @@ -1105,6 +1126,7 @@ Википедия лабиринтында даими яңыртылып торған теҙмә ярҙамында сәйәхәт итегеҙ. <br/> Теҙмәне үҙегеҙҙе ҡыҙыҡһындырған темаға тура килерлек итеп <b>көйләгеҙ</b> — ул <b>был көндә булған тарихи ваҡиғалар</b> йәки </b>осраҡлы һайланған</b> тема булыуы мөмкин. Синхронлаштырылған уҡыу исемлектәре Һеҙ һуңыраҡ, хатта офлайн режимда булғанда ла, уҡырға теләгән мәҡәләләр исемлеген төҙөй алаһығыҙ. Уҡыу исемлектәрен синхронлаштырыу өсөн Википедиялағы иҫәп яҙмағыҙға инегеҙ. <a href=\"#login\">Википедияға ҡушылығыҙ</a><br> + Мәғлүмәттәр һәм конфиденциаллек Ҡулланыу мәғлүмәттәрен ебәрергә Аңлашылды Һеҙҙең ҡоролмала түбәндәге телдәрҙе таптыҡ: @@ -1206,6 +1228,13 @@ Бейеклеге пкс Ҡуйырға + Эҙләү ҡалыптары + Ҡуйыу + мәҫәлән, %s + %s (мотлаҡ түгел) + %s (тәҡдим ителә) + Ентеклерәк + Ҡалыптарҙы ҡулланыусылар төҙөй һәм тулы тасуирламалар булмауы мөмкин. Белешмә Танылығыҙ / Википедияға ҡушылығыҙ Сәләм %s, Википедияны һәр кем мөхәррирләй алғанын беләһегеҙме? @@ -1229,8 +1258,10 @@ Хәбәрҙең атамаһы Яҙҙырырға Кире алырға + Һаҡламаҫҡа Хәбәр мөхәррирҙең фекер алышыу битенә яҙылды Хәбәр мөхәррирҙең фекер алышыу битендә яҙҙырылды һәм һаҡланды + Һаҡланған хәбәрҙәр Был фекер алышыу бите буш. Фекер алышыу ошонда башлана Фекер алышыу биттәрендә кешеләр Википедия йөкмәткеһен мөмкин тиклем сифатлы итеү тураһында фекер алыша. Википедиясылар берләшмәһе менән аралашыу һәм хеҙмәттәшлек итеү өсөн фекер алышыу битендә яңы тема өҫтәүҙән башлағыҙ. @@ -1241,6 +1272,7 @@ Хәбәр яҙырға Хәбәр буш була алмай. Тема буш була алмай. + Теманың исеме инде бар. Икенсеһен һайларға тырышығыҙ. Яуап ебәрелгән. Кире алырға <b>%1$s һуңғы мөхәррирләүҙе</b> %2$s эшләгән @@ -1422,6 +1454,8 @@ Медиафайлды уйнатыу хатаһы Ҡатнашыусы өлөшө Индергән өлөштө фильтрларға + Картала ҡарау + Географик координаталар был бит өсөн асыҡ түгел. Дөйөм уҡыу исемлеген импортлау Һеҙҙең менән уртаҡлашҡан исемлекте нисек атарға теләр инегеҙ? *яңы* @@ -1456,6 +1490,8 @@ Хәбәрҙәр юйылған Атама буш була алмай. + Һеҙҙең хәбәрҙәрегеҙ + Хәбәрҙәр миҫалы Төҙәтеүҙәрҙе табырға йәки фильтрларға Тамғалар: %s Бер кем дә @@ -1526,6 +1562,8 @@ Һөҙөмтәле үҙгәртеү күрәһегеҙме? Индергән өлөшө өсөн ҡатнашыусыға рәхмәт әйтегеҙ. Күҙәтергә Мәҡәләләрҙәге үҙгәртеүҙәрҙе күҙәтеп барырға теләйһегеҙме? Күҙәтеү исемлегегеҙгә өҫтәгеҙ. Уны \"Ентеклерәк\" тип аталған бүлектә ҡарағыҙ. + Фекер алышыу + Башҡа мөхәррирҙәр менән аралашығыҙ. Йыш ҡулланылған хәбәрҙәрҙе фекер алышыу битендә һаҡлағыҙ йәки ҡалыпты ҡулланығыҙ. Кире алырға Зыянлы үҙгәртеүҙе кире алыу өсөн \"Кире алырға\" ғәмәлен һайлағыҙ. Мөхәррирләү викиҙың боҙолоуына килтерәме икәнен күҙаллай. @@ -1536,10 +1574,20 @@ Нейтраль Ҡәнәғәт түгел Был функцияны нисек яҡшырта алабыҙ? + Мәҡәләне мөхәррирләү тарихы Бәйләнеш Тәҡдим итергә Фекер ебәрелде. «Функция проблемалары» бүлегендә теләгән ваҡытта баһалама яҙыу өсөн өҫтәмә менюға баҫығыҙ. + Вандализм тураһында иҫкәртеү + Нейтраль ҡараш + Автоматик тәржемә + Мәнфәғәттәр конфликты тураһында иҫкәртеү + Һуңғы иҫкәртеү + Авторлыҡ хоҡуғын боҙоу тураһында иҫкәртеү + Төҙәтмәнең тасуирламаһын ҡалдырыу + Цензураға дусар итмәгеҙ + Мәҡәләне яҡшыртыу буйынса тәҡдим Ҡабул итергә Кире ҡағырға Бит проблемалары diff --git a/app/src/main/res/values-ce/strings.xml b/app/src/main/res/values-ce/strings.xml index bd2982677de..6f497f3f2a7 100644 --- a/app/src/main/res/values-ce/strings.xml +++ b/app/src/main/res/values-ce/strings.xml @@ -72,7 +72,7 @@ Меттанаш цакарий Кхин меттанаш Википедин хьан меттанаш - Ӏалашбе хийцамаш + Хийцамаш дӀаӀалашбан Нисдар Ӏалашдина! ГӀалат тадина! ЙухагӀорта diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 1a51bb24c9c..705d64f3df9 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -291,6 +291,8 @@ Tilføjet links Andet Andre måder du forbedrede siden + Tilføjede kort beskrivelse + Opdaterede kort beskrivelse Redigeringskonflikt Siden er allerede blevet redigeret af en anden bruger, og er i konflikt med din redigering. Kopier venligst dine ændringer, gå tilbage og opdater siden, og forsøg så at redigere igen. Redigeringsbemærkninger @@ -848,6 +850,12 @@ Annullér Du har nået bunden af feedet. Indlæs mere + Vælg en regional sprogvariant for at forbedre læseoplevelsen + Du bruger i øjeblikket en ikke-understøttet generisk kinesisk sprogvariant som dit primære Wikipedia-sprog + Gem + Opdater venligst dine sekundære sprog + Du bruger i øjeblikket en ikke-understøttet generisk kinesisk sprogvariant som et sekundært sprog. Gå til dine indstillinger for at vælge et nyt sekundært sprog eller for at bekræfte din sprogliste. + Gå til Indstillinger Mest læste den %s Faner Artikelbeskrivelse @@ -1335,6 +1343,7 @@ Læst Ulæst Log ind for at abonnere på emner + Emneabonnementer giver dig mulighed for at modtage meddelelser om nye kommentarer i dette emne. Opret venligst en konto eller log ind på din Wikipedia-konto for at abonnere på et emne. Diskussionsarkiv: %s Del diskussion Del diskussionsside @@ -1544,6 +1553,10 @@ Meget nøjagtig til at finde de mest åbenlyst fejlbehæftede eller skadelige redigeringer. Forudsigelser om brugerens hensigter Højst sandsynligt gjort med gode hensigter + Kan være i ond tro + Finder de fleste ondsindede redigeringer, men har også en lavere nøjagtighed. + Sandsynligvis ond tro + Med middel nøjagtighed, finder en del af problemredigeringerne. %d filter %d filtre diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d3c4e8e1a07..c2778b616a7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1245,14 +1245,22 @@ Página %1$d de %2$d Negrita Cursiva + Subrayado + Tachado + Superíndice + Subíndice + Texto grande + Texto pequeño Código Enlace + Formato Insertar multimedia Lista con viñetas Lista numerada Plantilla Referencia Previsualizar enlace + Mencionar a un usuario Insertar multimedia Seleccionar un archivo de Wikimedia Commons Busce media @@ -1326,6 +1334,11 @@ Buscar temas Buscar en el tema de página de discusión Ordenar por + Fecha de publicación + Fecha de actualización + Nombre de tema + ¿Estás seguro de que quieres salir? + El asunto y el texto del contenido no se guardarán. Mostrar respuesta Mostrar respuestas (%d) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 1c22cbd8999..9f53f1991c8 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1610,6 +1610,7 @@ Muistutamme sinua jälleen huomenna. Palaa takaisin Avaa järjestelmäselaimessa + Valitse summa Paikat Hae paikkoja Suodata kielen perusteella diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 32d9b1ae5b0..1496c735542 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -648,7 +648,7 @@ పంపించే గమనింపులను కస్టమైజు చెయ్యండి ప్రదర్శన అమరికలు చదివే గమనింపులను దాచు - వికీపీడీయా + వికీపీడియా వికీపీడియా నుండి గమనింపులు ఇతర యాప్ నుండి ఇతర గమనింపులు From 284b8b2623a93a48de6b1c57203bd787ebf48e20 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 24 Jun 2024 06:16:57 -0700 Subject: [PATCH 194/626] Follow up: use when() in FlowEvent conditions (#4750) * Follow up: use when() in FlowEvent conditions * Lint fix --------- Co-authored-by: Dmitry Brant --- .../org/wikipedia/activity/BaseActivity.kt | 50 ++++++++++++------- .../java/org/wikipedia/main/MainFragment.kt | 11 ++-- .../org/wikipedia/random/RandomFragment.kt | 10 ++-- .../readinglist/ReadingListFragment.kt | 17 ++++--- .../readinglist/ReadingListsFragment.kt | 21 ++++---- .../org/wikipedia/theme/ThemeChooserDialog.kt | 8 +-- .../theme/ThemeFittingRoomFragment.kt | 8 +-- 7 files changed, 75 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/org/wikipedia/activity/BaseActivity.kt b/app/src/main/java/org/wikipedia/activity/BaseActivity.kt index bfe6a10e368..6435e9313de 100644 --- a/app/src/main/java/org/wikipedia/activity/BaseActivity.kt +++ b/app/src/main/java/org/wikipedia/activity/BaseActivity.kt @@ -31,7 +31,12 @@ import org.wikipedia.auth.AccountUtil import org.wikipedia.concurrency.FlowEventBus import org.wikipedia.connectivity.ConnectionStateMonitor import org.wikipedia.donate.DonateDialog -import org.wikipedia.events.* +import org.wikipedia.events.LoggedOutInBackgroundEvent +import org.wikipedia.events.ReadingListsEnableDialogEvent +import org.wikipedia.events.ReadingListsNoLongerSyncedEvent +import org.wikipedia.events.SplitLargeListsEvent +import org.wikipedia.events.ThemeFontChangeEvent +import org.wikipedia.events.UnreadNotificationsEvent import org.wikipedia.login.LoginActivity import org.wikipedia.main.MainActivity import org.wikipedia.page.ExclusiveBottomSheetPresenter @@ -122,25 +127,32 @@ abstract class BaseActivity : AppCompatActivity(), ConnectionStateMonitor.Callba lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.RESUMED) { FlowEventBus.events.collectLatest { event -> - if (event is SplitLargeListsEvent) { - MaterialAlertDialogBuilder(this@BaseActivity) - .setMessage(getString(R.string.split_reading_list_message, Constants.MAX_READING_LIST_ARTICLE_LIMIT)) - .setPositiveButton(R.string.reading_list_split_dialog_ok_button_text, null) - .show() - } else if (event is ReadingListsNoLongerSyncedEvent) { - ReadingListSyncBehaviorDialogs.detectedRemoteTornDownDialog(this@BaseActivity) - } else if (event is ReadingListsEnableDialogEvent && this@BaseActivity is MainActivity) { - ReadingListSyncBehaviorDialogs.promptEnableSyncDialog(this@BaseActivity) - } else if (event is LoggedOutInBackgroundEvent) { - maybeShowLoggedOutInBackgroundDialog() - } else if (event is ReadingListSyncEvent) { - if (event.showMessage && !Prefs.isSuggestedEditsHighestPriorityEnabled) { - FeedbackUtil.makeSnackbar(this@BaseActivity, getString(R.string.reading_list_toast_last_sync)).show() + when (event) { + is SplitLargeListsEvent -> { + MaterialAlertDialogBuilder(this@BaseActivity) + .setMessage(getString(R.string.split_reading_list_message, Constants.MAX_READING_LIST_ARTICLE_LIMIT)) + .setPositiveButton(R.string.reading_list_split_dialog_ok_button_text, null) + .show() } - } else if (event is UnreadNotificationsEvent) { - runOnUiThread { - if (!isDestroyed) { - onUnreadNotification() + is ReadingListsNoLongerSyncedEvent -> { + ReadingListSyncBehaviorDialogs.detectedRemoteTornDownDialog(this@BaseActivity) + } + is ReadingListsEnableDialogEvent, (this@BaseActivity is MainActivity) -> { + ReadingListSyncBehaviorDialogs.promptEnableSyncDialog(this@BaseActivity) + } + is LoggedOutInBackgroundEvent -> { + maybeShowLoggedOutInBackgroundDialog() + } + is ReadingListSyncEvent -> { + if (event.showMessage && !Prefs.isSuggestedEditsHighestPriorityEnabled) { + FeedbackUtil.makeSnackbar(this@BaseActivity, getString(R.string.reading_list_toast_last_sync)).show() + } + } + is UnreadNotificationsEvent -> { + runOnUiThread { + if (!isDestroyed) { + onUnreadNotification() + } } } } diff --git a/app/src/main/java/org/wikipedia/main/MainFragment.kt b/app/src/main/java/org/wikipedia/main/MainFragment.kt index 75e901963a6..d092eb745b7 100644 --- a/app/src/main/java/org/wikipedia/main/MainFragment.kt +++ b/app/src/main/java/org/wikipedia/main/MainFragment.kt @@ -129,10 +129,13 @@ class MainFragment : Fragment(), BackPressedHandler, MenuProvider, FeedFragment. lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { FlowEventBus.events.collectLatest { event -> - if (event is LoggedOutInBackgroundEvent) { - refreshContents() - } else if (event is ImportReadingListsEvent) { - maybeShowImportReadingListsNewInstallDialog() + when (event) { + is LoggedOutInBackgroundEvent -> { + refreshContents() + } + is ImportReadingListsEvent -> { + maybeShowImportReadingListsNewInstallDialog() + } } } } diff --git a/app/src/main/java/org/wikipedia/random/RandomFragment.kt b/app/src/main/java/org/wikipedia/random/RandomFragment.kt index 2cd45dfd740..0f885c3664c 100644 --- a/app/src/main/java/org/wikipedia/random/RandomFragment.kt +++ b/app/src/main/java/org/wikipedia/random/RandomFragment.kt @@ -74,11 +74,11 @@ class RandomFragment : Fragment() { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { FlowEventBus.events.collectLatest { event -> - if (event is ArticleSavedOrDeletedEvent) { - if (topTitle != null) { - for (page in event.pages) { - if (page.apiTitle == topTitle?.prefixedText && page.wiki.languageCode == topTitle?.wikiSite?.languageCode) { - updateSaveButton(topTitle) + when (event) { + is ArticleSavedOrDeletedEvent -> { + topTitle?.let { title -> + event.pages.firstOrNull { it.apiTitle == title.prefixedText && it.wiki.languageCode == title.wikiSite.languageCode }.let { + updateSaveButton(title) } } } diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt index 0ba9b44a7f0..d3ca221a530 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt @@ -116,13 +116,16 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { FlowEventBus.events.collectLatest { event -> - if (event is ReadingListSyncEvent) { - updateReadingListData() - } else if (event is PageDownloadEvent) { - val pagePosition = getPagePositionInList(event.page) - if (pagePosition != -1 && displayedLists[pagePosition] is ReadingListPage) { - (displayedLists[pagePosition] as ReadingListPage).downloadProgress = event.page.downloadProgress - adapter.notifyItemChanged(pagePosition + 1) + when (event) { + is ReadingListSyncEvent -> { + updateReadingListData() + } + is PageDownloadEvent -> { + val pagePosition = getPagePositionInList(event.page) + if (pagePosition != -1 && displayedLists[pagePosition] is ReadingListPage) { + (displayedLists[pagePosition] as ReadingListPage).downloadProgress = event.page.downloadProgress + adapter.notifyItemChanged(pagePosition + 1) + } } } } diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt index b343367977c..dd00b48f115 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.kt @@ -120,17 +120,20 @@ class ReadingListsFragment : Fragment(), SortReadingListsDialog.Callback, Readin viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { FlowEventBus.events.collectLatest { event -> - if (event is ReadingListSyncEvent) { - binding.recyclerView.post { - if (isAdded) { - updateLists(currentSearchQuery, !currentSearchQuery.isNullOrEmpty() || recentPreviewSavedReadingList != null) + when (event) { + is ReadingListSyncEvent -> { + binding.recyclerView.post { + if (isAdded) { + updateLists(currentSearchQuery, !currentSearchQuery.isNullOrEmpty() || recentPreviewSavedReadingList != null) + } } } - } else if (event is ArticleSavedOrDeletedEvent) { - if (event.isAdded) { - if (Prefs.readingListsPageSaveCount < SAVE_COUNT_LIMIT) { - showReadingListsSyncDialog() - Prefs.readingListsPageSaveCount = Prefs.readingListsPageSaveCount + 1 + is ArticleSavedOrDeletedEvent -> { + if (event.isAdded) { + if (Prefs.readingListsPageSaveCount < SAVE_COUNT_LIMIT) { + showReadingListsSyncDialog() + Prefs.readingListsPageSaveCount += 1 + } } } } diff --git a/app/src/main/java/org/wikipedia/theme/ThemeChooserDialog.kt b/app/src/main/java/org/wikipedia/theme/ThemeChooserDialog.kt index 2da241fc647..60a791929bb 100644 --- a/app/src/main/java/org/wikipedia/theme/ThemeChooserDialog.kt +++ b/app/src/main/java/org/wikipedia/theme/ThemeChooserDialog.kt @@ -121,9 +121,11 @@ class ThemeChooserDialog : ExtendedBottomSheetDialogFragment() { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { FlowEventBus.events.collectLatest { event -> - if (event is WebViewInvalidateEvent) { - updatingFont = false - updateComponents() + when (event) { + is WebViewInvalidateEvent -> { + updatingFont = false + updateComponents() + } } } } diff --git a/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt b/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt index 458b1e7fd9b..24178fb7cd4 100644 --- a/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt +++ b/app/src/main/java/org/wikipedia/theme/ThemeFittingRoomFragment.kt @@ -32,9 +32,11 @@ class ThemeFittingRoomFragment : Fragment() { viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.CREATED) { FlowEventBus.events.collectLatest { event -> - if (event is ChangeTextSizeEvent) { - updateTextSize() - binding.themeTestText.post { FlowEventBus.post(WebViewInvalidateEvent()) } + when (event) { + is ChangeTextSizeEvent -> { + updateTextSize() + binding.themeTestText.post { FlowEventBus.post(WebViewInvalidateEvent()) } + } } } } From 0923997396c3b394204e957d3dd61bea5776fd8f Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 24 Jun 2024 07:43:19 -0700 Subject: [PATCH 195/626] Use Coroutine in PageFramgent instead of RxJava (#4751) * Use Coroutine in PageFramgent instead of RxJava * Add CoroutineException * Lint fix --------- Co-authored-by: Dmitry Brant --- .../java/org/wikipedia/dataclient/Service.kt | 14 ------ .../java/org/wikipedia/page/PageFragment.kt | 49 +++++++------------ .../readinglist/db/ReadingListPageDao.kt | 2 +- 3 files changed, 20 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/wikipedia/dataclient/Service.kt b/app/src/main/java/org/wikipedia/dataclient/Service.kt index a82b097cfeb..1359845cd8a 100644 --- a/app/src/main/java/org/wikipedia/dataclient/Service.kt +++ b/app/src/main/java/org/wikipedia/dataclient/Service.kt @@ -646,16 +646,6 @@ interface Service { @Field("token") token: String ): EntityPostResponse - @POST(MW_API_PREFIX + "action=watch&converttitles=&redirects=") - @FormUrlEncoded - fun postWatch( - @Field("unwatch") unwatch: Int?, - @Field("pageids") pageIds: String?, - @Field("titles") titles: String?, - @Field("expiry") expiry: String?, - @Field("token") token: String - ): Observable - @POST(MW_API_PREFIX + "action=watch&converttitles=&redirects=") @FormUrlEncoded suspend fun watch( @@ -666,10 +656,6 @@ interface Service { @Field("token") token: String ): WatchPostResponse - @get:GET(MW_API_PREFIX + "action=query&meta=tokens&type=watch") - @get:Headers("Cache-Control: no-cache") - val watchToken: Observable - @GET(MW_API_PREFIX + "action=query&meta=tokens&type=watch") @Headers("Cache-Control: no-cache") suspend fun getWatchToken(): MwQueryResponse diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 8dc9f85b83f..c0e2fc23269 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -34,10 +34,6 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.google.android.material.textview.MaterialTextView -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Completable -import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.schedulers.Schedulers import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.launch import kotlinx.serialization.json.float @@ -149,7 +145,6 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi val binding get() = _binding!! private val activeTimer = ActiveTimer() - private val disposables = CompositeDisposable() private val scrollTriggerListener = WebViewScrollTriggerListener() private val pageRefreshListener = OnRefreshListener { refreshPage() } private val pageActionItemCallback = PageActionItemCallback() @@ -271,7 +266,6 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi bridge.cleanup() sidePanelHandler.log() leadImagesHandler.dispose() - disposables.clear() webView.clearAllListeners() (webView.parent as ViewGroup).removeView(webView) Prefs.isSuggestedEditsHighestPriorityEnabled = false @@ -920,12 +914,13 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi } model.readingListPage?.let { page -> model.title?.let { title -> - disposables.add(Completable.fromAction { - page.thumbUrl.equals(title.thumbUrl, true) + lifecycleScope.launch(CoroutineExceptionHandler { _, t -> + L.e(t) + }) { if (!page.thumbUrl.equals(title.thumbUrl, true) || !page.description.equals(title.description, true)) { AppDatabase.instance.readingListPageDao().updateMetadataByTitle(page, title.description, title.thumbUrl) } - }.subscribeOn(Schedulers.io()).subscribe()) + } } } if (!errorState) { @@ -1235,29 +1230,23 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi fun updateWatchlist() { title?.let { - disposables.add(ServiceFactory.get(it.wikiSite).watchToken - .subscribeOn(Schedulers.io()) - .flatMap { response -> - val watchToken = response.query?.watchToken() - if (watchToken.isNullOrEmpty()) { - throw RuntimeException("Received empty watch token.") + lifecycleScope.launch(CoroutineExceptionHandler { _, throwable -> + L.d(throwable) + }) { + val token = ServiceFactory.get(it.wikiSite).getWatchToken().query?.watchToken() ?: throw RuntimeException("Received empty watch token.") + val watch = ServiceFactory.get(it.wikiSite).watch(if (model.isWatched) 1 else null, null, it.prefixedText, WatchlistExpiry.NEVER.expiry, token) + watch.getFirst()?.let { firstWatch -> + if (model.isWatched) { + WatchlistAnalyticsHelper.logRemovedFromWatchlistSuccess(it, requireContext()) + } else { + WatchlistAnalyticsHelper.logAddedToWatchlistSuccess(it, requireContext()) } - ServiceFactory.get(it.wikiSite).postWatch(if (model.isWatched) 1 else null, null, it.prefixedText, WatchlistExpiry.NEVER.expiry, watchToken) + model.isWatched = firstWatch.watched + updateWatchlistExpiry(WatchlistExpiry.NEVER) + showWatchlistSnackbar() } - .observeOn(AndroidSchedulers.mainThread()) - .doAfterTerminate { updateQuickActionsAndMenuOptions() } - .subscribe({ watchPostResponse -> - watchPostResponse.getFirst()?.let { watch -> - if (model.isWatched) { - WatchlistAnalyticsHelper.logRemovedFromWatchlistSuccess(it, requireContext()) - } else { - WatchlistAnalyticsHelper.logAddedToWatchlistSuccess(it, requireContext()) - } - model.isWatched = watch.watched - updateWatchlistExpiry(WatchlistExpiry.NEVER) - showWatchlistSnackbar() - } - }) { caught -> L.d(caught) }) + updateQuickActionsAndMenuOptions() + } } } diff --git a/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt b/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt index 9a5fe6c7644..a29e506d2d4 100644 --- a/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt +++ b/app/src/main/java/org/wikipedia/readinglist/db/ReadingListPageDao.kt @@ -132,7 +132,7 @@ interface ReadingListPageDao { } } - fun updateMetadataByTitle(pageProto: ReadingListPage, description: String?, thumbUrl: String?) { + suspend fun updateMetadataByTitle(pageProto: ReadingListPage, description: String?, thumbUrl: String?) { updateThumbAndDescriptionByName(pageProto.lang, pageProto.apiTitle, thumbUrl, description) } From 36a8e872f33ea6f1667f3850bd7ac7277e0dee62 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 24 Jun 2024 14:11:38 -0400 Subject: [PATCH 196/626] Upgrade to Kotlin 2. (#4748) * Update gradle and dependencies. * Upgrade to Kotlin 2. --- app/build.gradle | 2 +- .../org/wikipedia/search/RecentSearchesFragment.kt | 12 +++++++----- build.gradle | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ded16021954..3343791eea2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -182,7 +182,7 @@ dependencies { String googlePayVersion = '19.4.0' String roomVersion = "2.6.1" String espressoVersion = '3.5.1' - String serialization_version = '1.6.3' + String serialization_version = '1.7.0' String metricsVersion = '2.7' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' diff --git a/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.kt b/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.kt index 099bcc73316..79fb42346c3 100644 --- a/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.kt +++ b/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.kt @@ -173,13 +173,15 @@ class RecentSearchesFragment : Fragment() { } } - private inner class NamespaceItemViewHolder constructor(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { + private inner class NamespaceItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { fun bindItem(ns: Namespace?) { val isHeader = ns == null - itemView.setOnClickListener(this) - (itemView as TextView).text = if (isHeader) getString(R.string.search_namespaces) else namespaceMap[callback?.getLangCode()]?.get(ns).orEmpty() + ":" - itemView.isEnabled = !isHeader - itemView.setTextColor(ResourceUtil.getThemedColor(requireContext(), if (isHeader) R.attr.primary_color else R.attr.progressive_color)) + (itemView as TextView).apply { + setOnClickListener(this@NamespaceItemViewHolder) + text = if (isHeader) getString(R.string.search_namespaces) else namespaceMap[callback?.getLangCode()]?.get(ns).orEmpty() + ":" + isEnabled = !isHeader + setTextColor(ResourceUtil.getThemedColor(requireContext(), if (isHeader) R.attr.primary_color else R.attr.progressive_color)) + } } override fun onClick(v: View) { diff --git a/build.gradle b/build.gradle index cfa1eff1dc7..b45277fac0b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.9.24' + ext.kotlin_version = '2.0.0' repositories { google() mavenCentral() @@ -14,7 +14,7 @@ buildscript { } plugins { - id 'com.google.devtools.ksp' version '1.9.24-1.0.20' apply false + id 'com.google.devtools.ksp' version '2.0.0-1.0.22' apply false } allprojects { From 2fb12cb134a4c4199eb32f7ec01e34fd2966da74 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 24 Jun 2024 17:28:56 -0400 Subject: [PATCH 197/626] Refactor and simplify Edit Activity xml. (#4753) --- .../edit/richtext/SyntaxHighlighter.kt | 4 +- .../main/res/layout/activity_edit_section.xml | 197 ++++++++++-------- app/src/main/res/values/styles.xml | 5 - 3 files changed, 107 insertions(+), 99 deletions(-) diff --git a/app/src/main/java/org/wikipedia/edit/richtext/SyntaxHighlighter.kt b/app/src/main/java/org/wikipedia/edit/richtext/SyntaxHighlighter.kt index a67cb70bae0..28c65c5151d 100644 --- a/app/src/main/java/org/wikipedia/edit/richtext/SyntaxHighlighter.kt +++ b/app/src/main/java/org/wikipedia/edit/richtext/SyntaxHighlighter.kt @@ -2,9 +2,9 @@ package org.wikipedia.edit.richtext import android.os.Build import android.text.Spanned +import android.widget.ScrollView import androidx.activity.ComponentActivity import androidx.core.text.getSpans -import androidx.core.widget.NestedScrollView import androidx.core.widget.doAfterTextChanged import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.* @@ -15,7 +15,7 @@ import java.util.* class SyntaxHighlighter( private val activity: ComponentActivity, private val textBox: SyntaxHighlightableEditText, - private val scrollView: NestedScrollView?, + private val scrollView: ScrollView?, private val highlightDelayMillis: Long = HIGHLIGHT_DELAY_MILLIS, ) { private val syntaxRules = listOf( diff --git a/app/src/main/res/layout/activity_edit_section.xml b/app/src/main/res/layout/activity_edit_section.xml index 3a29f66f347..b76bfa01e72 100644 --- a/app/src/main/res/layout/activity_edit_section.xml +++ b/app/src/main/res/layout/activity_edit_section.xml @@ -1,6 +1,6 @@ - + style="@style/ToolbarStyle.Small" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent"/> - - - - - + + - - - - - - - - + style="@style/P" + android:lineHeight="24dp" + android:layout_marginEnd="8dp" + android:textColorHighlight="?attr/focus_color" + android:imeOptions="actionNone|flagNoExtractUi" + android:inputType="textMultiLine" + tools:targetApi="p" /> - - - - - - - - + - + + + + + - - + + + + + @@ -108,24 +115,30 @@ + + - - - - + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b0e6379f618..ac312fc3494 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -488,11 +488,6 @@ @style/TextInputLayoutErrorTextAppearance - - + + @@ -363,18 +369,21 @@ true - + + + + diff --git a/app/src/main/res/xml/developer_preferences.xml b/app/src/main/res/xml/developer_preferences.xml index 189c7aa5bdb..14c393684cc 100644 --- a/app/src/main/res/xml/developer_preferences.xml +++ b/app/src/main/res/xml/developer_preferences.xml @@ -429,6 +429,15 @@ android:key="@string/preference_key_donation_test_env" android:title="Donation test environment" /> + + + + From 6c1fc6ab1e9cd44d7d277d814191fa38b9b6087b Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Thu, 5 Sep 2024 14:09:01 -0400 Subject: [PATCH 360/626] Tiny follow-up to recommended content. (#4925) --- .../RecommendedContentViewModel.kt | 37 +++++++------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentViewModel.kt b/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentViewModel.kt index fc15ce1b6a8..44d39730700 100644 --- a/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentViewModel.kt +++ b/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentViewModel.kt @@ -39,7 +39,7 @@ class RecommendedContentViewModel(bundle: Bundle) : ViewModel() { var wikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! private val isGeneralized = bundle.getBoolean(Constants.ARG_BOOLEAN) - private var exploreTerm: String? = null + private var moreLikeTerm: String? = null private var feedContent = mutableMapOf() private val _recentSearchesState = MutableStateFlow(Resource>()) @@ -82,7 +82,7 @@ class RecommendedContentViewModel(bundle: Bundle) : ViewModel() { } } - private suspend fun getExploreSearchTerm(): String { + private suspend fun getMoreLikeSearchTerm(): String { return withContext(Dispatchers.IO) { // Get term from last opened article var term = WikipediaApp.instance.tabList.lastOrNull { @@ -168,42 +168,31 @@ class RecommendedContentViewModel(bundle: Bundle) : ViewModel() { } } - private suspend fun loadTopRead(): List { - return withContext(Dispatchers.IO) { - loadFeed().topRead?.articles ?: emptyList() - } - } - - private suspend fun loadInTheNews(): List { - return withContext(Dispatchers.IO) { - loadFeed().news?.mapNotNull { it.links.firstOrNull() } ?: emptyList() - } - } - private suspend fun loadGeneralizedContent(): List { return withContext(Dispatchers.IO) { - val news = async { loadInTheNews() } - val topRead = async { loadTopRead() } + val content = loadFeed() + val news = content.news?.mapNotNull { it.links.firstOrNull() } ?: emptyList() + val topRead = content.topRead?.articles ?: emptyList() // Take most news items and fill the rest with top read items - (news.await() + topRead.await()).distinct().take(RECOMMENDED_CONTENT_ITEMS).shuffled() + (news + topRead).distinct().take(RECOMMENDED_CONTENT_ITEMS).shuffled() } } private suspend fun loadPersonalizedContent(): List { return withContext(Dispatchers.IO) { val places = async { loadPlaces() } - val explore = async { - exploreTerm = getExploreSearchTerm() - exploreTerm?.let { - loadExplore(it) + val moreLike = async { + moreLikeTerm = getMoreLikeSearchTerm() + moreLikeTerm?.let { + loadMoreLike(it) } ?: emptyList() } - // Take at most 5 places and fill the rest with explore items - (places.await().take(5) + explore.await()).distinct().take(RECOMMENDED_CONTENT_ITEMS).shuffled() + // Take at most 5 places and fill the rest with moreLike items + (places.await().take(5) + moreLike.await()).distinct().take(RECOMMENDED_CONTENT_ITEMS).shuffled() } } - private suspend fun loadExplore(searchTerm: String): List { + private suspend fun loadMoreLike(searchTerm: String): List { return withContext(Dispatchers.IO) { val moreLikeResponse = ServiceFactory.get(wikiSite).searchMoreLike("morelike:$searchTerm", Constants.SUGGESTION_REQUEST_ITEMS, Constants.SUGGESTION_REQUEST_ITEMS) val hasParentLanguageCode = !WikipediaApp.instance.languageState.getDefaultLanguageCode(wikiSite.languageCode).isNullOrEmpty() From 344165ddc1c7292fef36f598c50e0e24ce12ea07 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Thu, 5 Sep 2024 14:42:44 -0400 Subject: [PATCH 361/626] Bump versionCode. (#4926) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a05c7a397af..9a89f2633b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50498 + versionCode 50499 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From e9adb7fd4daff4f21414f6fdc34febd72fb995fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 14:41:28 -0700 Subject: [PATCH 362/626] Bump androidx.fragment:fragment-ktx from 1.8.2 to 1.8.3 (#4924) Bumps androidx.fragment:fragment-ktx from 1.8.2 to 1.8.3. --- updated-dependencies: - dependency-name: androidx.fragment:fragment-ktx dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8f56ef7bb41..2c9ab015f51 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ drawerlayout = "1.2.0" espressoVersion = "3.6.1" firebaseMessagingVersion = "24.0.1" flexbox = "3.0.0" -fragmentKtx = "1.8.2" +fragmentKtx = "1.8.3" glideVersion = "4.16.0" googlePayVersion = "19.4.0" googleServices = "4.4.2" From 82cec13dae56178dd0e990c10abbc7bfe05050df Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Fri, 6 Sep 2024 12:11:54 -0400 Subject: [PATCH 363/626] Fix potential crash in recommended content. (#4928) --- .../RecommendedContentFragment.kt | 2 -- .../org/wikipedia/views/LanguageScrollView.kt | 16 +++++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentFragment.kt b/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentFragment.kt index 47b6180b40c..c071f8c079a 100644 --- a/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentFragment.kt +++ b/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentFragment.kt @@ -23,7 +23,6 @@ import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.history.HistoryEntry import org.wikipedia.page.PageTitle import org.wikipedia.search.SearchFragment -import org.wikipedia.settings.Prefs import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L @@ -95,7 +94,6 @@ class RecommendedContentFragment : Fragment() { override fun onResume() { super.onResume() viewModel.loadSearchHistory() - parentSearchFragment.setUpLanguageScroll(Prefs.selectedLanguagePositionInSearch) } override fun onDestroyView() { diff --git a/app/src/main/java/org/wikipedia/views/LanguageScrollView.kt b/app/src/main/java/org/wikipedia/views/LanguageScrollView.kt index 3986da34fc5..29fb9a24945 100644 --- a/app/src/main/java/org/wikipedia/views/LanguageScrollView.kt +++ b/app/src/main/java/org/wikipedia/views/LanguageScrollView.kt @@ -24,6 +24,7 @@ class LanguageScrollView(context: Context, attrs: AttributeSet? = null) : Constr private val binding = ViewLanguageScrollBinding.inflate(LayoutInflater.from(context), this) private var callback: Callback? = null private var languageCodes: List = mutableListOf() + private var allowSelect = false val selectedPosition: Int get() = binding.horizontalScrollLanguages.selectedTabPosition @@ -55,7 +56,9 @@ class LanguageScrollView(context: Context, attrs: AttributeSet? = null) : Constr updateTabLanguageCode(it, textColor = paperColor, backgroundColorTint = color, fillBackground = true) updateTabLanguageLabel(it, textColor = color) } - callback?.onLanguageTabSelected(languageCodes[tab.position]) + if (allowSelect) { + callback?.onLanguageTabSelected(languageCodes[tab.position]) + } } else { view?.let { @ColorInt val color = ResourceUtil.getThemedColor(context, R.attr.placeholder_color) @@ -68,6 +71,7 @@ class LanguageScrollView(context: Context, attrs: AttributeSet? = null) : Constr fun setUpLanguageScrollTabData(languageCodes: List, position: Int, callback: Callback?) { this.callback = callback this.languageCodes = languageCodes + allowSelect = false if (binding.horizontalScrollLanguages.childCount > 0) { binding.horizontalScrollLanguages.removeAllTabs() } @@ -77,12 +81,10 @@ class LanguageScrollView(context: Context, attrs: AttributeSet? = null) : Constr binding.horizontalScrollLanguages.addTab(tab) updateTabView(false, tab) } - binding.horizontalScrollLanguages.getTabAt(position)?.let { - binding.horizontalScrollLanguages.post { - if (!isAttachedToWindow) { - return@post - } - binding.horizontalScrollLanguages.getTabAt(position)!!.select() + allowSelect = true + binding.horizontalScrollLanguages.post { + if (isAttachedToWindow) { + binding.horizontalScrollLanguages.getTabAt(position)?.select() } } } From 28f0f8b89db964adf25f49a59a4f81fb50f65a4c Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Fri, 6 Sep 2024 09:27:33 -0700 Subject: [PATCH 364/626] Fix: apply start and end paddings to the OverFlowMenuItem style (#4929) --- app/src/main/res/values/styles.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d6e91701270..24a80f2b278 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -382,6 +382,8 @@ + + diff --git a/app/src/main/res/xml/developer_preferences.xml b/app/src/main/res/xml/developer_preferences.xml index 09deffcfd61..e61a85d315d 100644 --- a/app/src/main/res/xml/developer_preferences.xml +++ b/app/src/main/res/xml/developer_preferences.xml @@ -306,6 +306,14 @@ android:key="@string/preference_key_show_sequential_recent_edits_diff_tooltip" android:title="@string/preference_key_show_sequential_recent_edits_diff_tooltip" /> + + + + From 52d9272ab5c565ec89b28e097a59619c4275d62f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:09:01 -0400 Subject: [PATCH 469/626] Bump gradle from 8.7.0 to 8.7.1 (#5036) Bumps `gradle` from 8.7.0 to 8.7.1. Updates `com.android.tools.build:gradle` from 8.7.0 to 8.7.1 Updates `com.android.application` from 8.7.0 to 8.7.1 --- updated-dependencies: - dependency-name: com.android.tools.build:gradle dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.android.application dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c33065af5a4..e8897ec0c63 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ fragmentKtx = "1.8.4" glideVersion = "4.16.0" googlePayVersion = "19.4.0" googleServices = "4.4.2" -gradle = "8.7.0" +gradle = "8.7.1" hamcrest = "3.0" installreferrer = "2.2" jsoup = "1.18.1" From 03ee3c0744b53c6fa1ec6cacc07edcbafad5c88f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 13:39:06 -0700 Subject: [PATCH 470/626] Bump androidx.test:orchestrator from 1.5.0 to 1.5.1 (#5038) Bumps androidx.test:orchestrator from 1.5.0 to 1.5.1. --- updated-dependencies: - dependency-name: androidx.test:orchestrator dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e8897ec0c63..ab794929dc5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,7 +32,7 @@ metricsVersion = "2.9" mlKitVersion = "17.0.6" mockitoVersion = "5.2.0" okHttpVersion = "4.12.0" -orchestrator = "1.5.0" +orchestrator = "1.5.1" pagingRuntimeKtx = "3.3.2" paletteKtx = "1.0.0" photoview = "1.0.2" From d6b3ce345266c700feb568b438b4dd863a6cc841 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Wed, 16 Oct 2024 16:47:49 -0400 Subject: [PATCH 471/626] API underpinnings for integrating with Growth Impact module. (#5037) * API underpinnings for integrating with Growth Impact module. * Add comments. --------- Co-authored-by: Cooltey Feng --- .../wikipedia/dataclient/CoreRestService.kt | 6 ++ .../growthtasks/GrowthUserImpact.kt | 64 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 app/src/main/java/org/wikipedia/dataclient/growthtasks/GrowthUserImpact.kt diff --git a/app/src/main/java/org/wikipedia/dataclient/CoreRestService.kt b/app/src/main/java/org/wikipedia/dataclient/CoreRestService.kt index 5e4f1f37a7d..5ea4c391362 100644 --- a/app/src/main/java/org/wikipedia/dataclient/CoreRestService.kt +++ b/app/src/main/java/org/wikipedia/dataclient/CoreRestService.kt @@ -1,6 +1,7 @@ package org.wikipedia.dataclient import org.wikipedia.dataclient.growthtasks.GrowthImageSuggestion +import org.wikipedia.dataclient.growthtasks.GrowthUserImpact import org.wikipedia.dataclient.restbase.DiffResponse import org.wikipedia.dataclient.restbase.EditCount import org.wikipedia.dataclient.restbase.Revision @@ -34,6 +35,11 @@ interface CoreRestService { @Body body: GrowthImageSuggestion.AddImageFeedbackBody ) + @GET("growthexperiments/v0/user-impact/%23{userId}") + suspend fun getUserImpact( + @Path("userId") userId: Int + ): GrowthUserImpact + companion object { const val CORE_REST_API_PREFIX = "w/rest.php/" } diff --git a/app/src/main/java/org/wikipedia/dataclient/growthtasks/GrowthUserImpact.kt b/app/src/main/java/org/wikipedia/dataclient/growthtasks/GrowthUserImpact.kt new file mode 100644 index 00000000000..690c9107dd4 --- /dev/null +++ b/app/src/main/java/org/wikipedia/dataclient/growthtasks/GrowthUserImpact.kt @@ -0,0 +1,64 @@ +package org.wikipedia.dataclient.growthtasks + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.decodeFromJsonElement +import org.wikipedia.json.JsonUtil + +@Suppress("unused") +@Serializable +class GrowthUserImpact( + @SerialName("@version") val version: Int = 0, + val userId: Int = 0, + val userName: String = "", + val receivedThanksCount: Int = 0, + @SerialName("editCountByNamespace") private val mEditCountByNamespace: JsonElement? = null, + @SerialName("editCountByDay") private val mEditCountByDay: JsonElement? = null, + @SerialName("editCountByTaskType") private val mEditCountByTaskType: JsonElement? = null, + val totalUserEditCount: Int = 0, + val totalEditsCount: Int = 0, + val newcomerTaskEditCount: Int = 0, + val revertedEditCount: Int = 0, + val lastEditTimestamp: Long = 0, + @SerialName("longestEditingStreak") private val mLongestEditingStreak: JsonElement? = null, + @SerialName("dailyTotalViews") private val mDailyTotalViews: JsonElement? = null, + val totalPageviewsCount: Long = 0, + @SerialName("topViewedArticles") private val mTopViewedArticles: JsonElement? = null, +) { + // All of these properties need to be lazily initialized from a generic JsonElement because + // of an annoying quirk in the way PHP serializes JSON objects. If the object is empty, it + // serializes as an empty array, not an empty object, which causes kotlinx.serialization to + // fail. Therefore we need to conditionally deserialize these items at runtime. + val editCountByNamespace: Map by lazy { if (mEditCountByNamespace is JsonObject) { JsonUtil.json.decodeFromJsonElement(mEditCountByNamespace) } else { emptyMap() } } + val editCountByDay: Map by lazy { if (mEditCountByDay is JsonObject) { JsonUtil.json.decodeFromJsonElement(mEditCountByDay) } else { emptyMap() } } + val editCountByTaskType: Map by lazy { if (mEditCountByTaskType is JsonObject) { JsonUtil.json.decodeFromJsonElement(mEditCountByTaskType) } else { emptyMap() } } + val dailyTotalViews: Map by lazy { if (mDailyTotalViews is JsonObject) { JsonUtil.json.decodeFromJsonElement(mDailyTotalViews) } else { emptyMap() } } + val topViewedArticles: Map by lazy { if (mTopViewedArticles is JsonObject) { JsonUtil.json.decodeFromJsonElement(mTopViewedArticles) } else { emptyMap() } } + val longestEditingStreak: EditStreak? by lazy { if (mLongestEditingStreak is JsonObject) { JsonUtil.json.decodeFromJsonElement(mLongestEditingStreak) } else { null } } + + @Serializable + class ArticleViews( + val firstEditDate: String = "", + val newestEdit: String = "", + val imageUrl: String = "", + val viewsCount: Long = 0, + private val views: JsonElement? = null + ) { + val viewsByDay: Map by lazy { if (views is JsonObject) { JsonUtil.json.decodeFromJsonElement(views) } else { emptyMap() } } + } + + @Serializable + class EditStreak( + val datePeriod: EditDateRange? = null, + val totalEditCountForPeriod: Int = 0 + ) + + @Serializable + class EditDateRange( + val start: String = "", + val end: String = "", + val days: Int = 0, + ) +} From 868310a732a2cd52d374a80028a787edc25fa232 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 16:21:16 -0700 Subject: [PATCH 472/626] Bump kotlinCoroutinesVersion from 1.8.1 to 1.9.0 (#4957) Bumps `kotlinCoroutinesVersion` from 1.8.1 to 1.9.0. Updates `org.jetbrains.kotlinx:kotlinx-coroutines-android` from 1.8.1 to 1.9.0 - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.8.1...1.9.0) Updates `org.jetbrains.kotlinx:kotlinx-coroutines-core` from 1.8.1 to 1.9.0 - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.8.1...1.9.0) --- updated-dependencies: - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-android dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Cooltey Feng --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ab794929dc5..3f4e81c95c1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,7 +22,7 @@ installreferrer = "2.2" jsoup = "1.18.1" junit = "4.13.2" junitVersion = "1.2.1" -kotlinCoroutinesVersion = "1.8.1" +kotlinCoroutinesVersion = "1.9.0" kotlinStdlibJdk8 = "2.0.21" kotlinxSerializationJson = "1.7.3" kspPlugin = "2.0.21-1.0.25" From 542765b99c67ab94c2a61dc106045c8019386b08 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 17 Oct 2024 14:25:56 +0200 Subject: [PATCH 473/626] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-anp/strings.xml | 2 +- app/src/main/res/values-ar/strings.xml | 4 +- app/src/main/res/values-ary/strings.xml | 2 +- app/src/main/res/values-az/strings.xml | 6 +- .../main/res/values-b+be+x+old/strings.xml | 2 +- app/src/main/res/values-b+kk+Cyrl/strings.xml | 2 +- app/src/main/res/values-b+sr+Latn/strings.xml | 2 +- app/src/main/res/values-b+tt+Cyrl/strings.xml | 2 +- app/src/main/res/values-ba/strings.xml | 6 +- app/src/main/res/values-ban/strings.xml | 2 +- app/src/main/res/values-be/strings.xml | 6 +- app/src/main/res/values-bew/strings.xml | 2 +- app/src/main/res/values-bg/strings.xml | 2 +- app/src/main/res/values-blk/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-br/strings.xml | 2 +- app/src/main/res/values-bs/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-ckb/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-cv/strings.xml | 2 +- app/src/main/res/values-da/strings.xml | 6 +- app/src/main/res/values-dag/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 6 +- app/src/main/res/values-dga/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 6 +- app/src/main/res/values-eu/strings.xml | 2 +- app/src/main/res/values-fa/strings.xml | 6 +- app/src/main/res/values-fi/strings.xml | 15 +- app/src/main/res/values-fr/strings.xml | 6 +- app/src/main/res/values-gl/strings.xml | 2 +- app/src/main/res/values-gn/strings.xml | 2 +- app/src/main/res/values-gu/strings.xml | 2 +- app/src/main/res/values-ha/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 4 +- app/src/main/res/values-hy/strings.xml | 2 +- app/src/main/res/values-ia/strings.xml | 39 ++- app/src/main/res/values-in/strings.xml | 2 +- app/src/main/res/values-inh/strings.xml | 2 +- app/src/main/res/values-io/strings.xml | 2 +- app/src/main/res/values-is/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 4 +- app/src/main/res/values-iw/strings.xml | 6 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-kn/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 20 +- app/src/main/res/values-krc/strings.xml | 6 +- app/src/main/res/values-ks/strings.xml | 2 +- app/src/main/res/values-ku/strings.xml | 2 +- app/src/main/res/values-kus/strings.xml | 2 +- app/src/main/res/values-lb/strings.xml | 2 +- app/src/main/res/values-lmo/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-mhr/strings.xml | 2 +- app/src/main/res/values-mk/strings.xml | 8 +- app/src/main/res/values-ml/strings.xml | 2 +- app/src/main/res/values-mn/strings.xml | 2 +- app/src/main/res/values-mnw/strings.xml | 2 +- app/src/main/res/values-ms/strings.xml | 2 +- app/src/main/res/values-my/strings.xml | 2 +- app/src/main/res/values-nb/strings.xml | 6 +- app/src/main/res/values-ne/strings.xml | 1 + app/src/main/res/values-nia/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 6 +- app/src/main/res/values-nqo/strings.xml | 2 +- app/src/main/res/values-pa/strings.xml | 9 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pnb/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-qq/strings.xml | 4 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 21 +- app/src/main/res/values-scn/strings.xml | 2 +- app/src/main/res/values-sd/strings.xml | 2 +- app/src/main/res/values-sdc/strings.xml | 2 +- app/src/main/res/values-se/strings.xml | 6 +- app/src/main/res/values-sh/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 2 +- app/src/main/res/values-smn/strings.xml | 2 +- app/src/main/res/values-sr/strings.xml | 6 +- app/src/main/res/values-sro/strings.xml | 2 +- app/src/main/res/values-su/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 6 +- app/src/main/res/values-tcy/strings.xml | 13 +- app/src/main/res/values-te/strings.xml | 2 +- app/src/main/res/values-th/strings.xml | 2 +- app/src/main/res/values-tl/strings.xml | 2 +- app/src/main/res/values-tly/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 6 +- app/src/main/res/values-uz/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 228 ++++++++++++++++++ app/src/main/res/values-yrl/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 7 +- app/src/main/res/values-zh/strings.xml | 6 +- 98 files changed, 467 insertions(+), 148 deletions(-) diff --git a/app/src/main/res/values-anp/strings.xml b/app/src/main/res/values-anp/strings.xml index 45e4e73eaba..6f96226be63 100644 --- a/app/src/main/res/values-anp/strings.xml +++ b/app/src/main/res/values-anp/strings.xml @@ -53,7 +53,7 @@ द्वारा छनित सब्भे संपादन (%s) सदस्य द्वारा संपादन (%s) - गुमनाम संपादन (%s) + गुमनाम संपादन (%s) बॉट्स द्वारा संपादन (%s) %1$s सँ %2$s तलक मेट्रिक्स टैब देखाबौ diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index dd02fb5d686..db6e637b9f5 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -103,7 +103,7 @@ الفرز حسب جميع التعديلات (%s) تعديلات المستخدمين (%s) - تعديلات المجهولين (%s) + تعديلات المجهولين (%s) تعديلات البوت (%s) المصفوفات من %1$s إلى %2$s @@ -491,7 +491,7 @@ تخصيص شريط الأدوات الخاص بك يمكنك التواصل مع أحد <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">الإداريين</a> لمناقشة المنع. أنت غير مسجل الدخول - سيُنسب تعديلك إلى %1$s. سيكون عنوان الآي بي الخاص بك مرئيًا للإداريين.<br /><br /> إذا قمت <a href=\"https://#login\">بتسجيل الدخول</a> أو <a href=\"https://#login\">إنشاء حساب</a> ، فستُنسب تعديلاتك إلى الاسم الذي تختاره، من بين مزايا أخرى. + سيُنسب تعديلك إلى %1$s. سيكون عنوان الآي بي الخاص بك مرئيًا للإداريين.<br /><br /> إذا قمت <a href=\"https://#login\">بتسجيل الدخول</a> أو <a href=\"https://#login\">إنشاء حساب</a> ، فستُنسب تعديلاتك إلى الاسم الذي تختاره، من بين مزايا أخرى. عُلِم أنت تستخدم حساباً مؤقتاً أنه الجلسة diff --git a/app/src/main/res/values-ary/strings.xml b/app/src/main/res/values-ary/strings.xml index fb0c3967002..5f2a3ac83d6 100644 --- a/app/src/main/res/values-ary/strings.xml +++ b/app/src/main/res/values-ary/strings.xml @@ -56,7 +56,7 @@ فيلتري ب جميع تّبديلات (%s) تّبديلات د لخدايمي (%s) - تبديلات لمجهولين (%s) + تبديلات لمجهولين (%s) تبديلات لبوتات (%s) ورّي التبويبات بدّل اللغة diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 145602a321e..3f1576be345 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -62,7 +62,7 @@ Filtrləşdir Bütün redaktələr (%s) İstifadəçi redaktələri (%s) - Anonim redaktələr (%s) + Anonim redaktələr (%s) Bütün redaktələr (%s) %1$s ilə %2$s arasında olan ölçülər @@ -426,8 +426,8 @@ Alətlər panelinizi fərdiləşdirin Digər <a href=\"https://az.wikipedia.org/wiki/Vikipediya:İdarəçilər\">idarəçilərlə</a> bloku müzakirə edə bilərsiniz. Siz daxil olmamısınız - Redaktə etdikdən sonra məxfiliyinizi qorumaq üçün sizin üçün <b>müvəqqəti hesab</b> yaradılacaq. <a href=\"%1$s\">Ətraflı öyrənin</a>.<br /><br />Gələcəkdə adınıza istinad verilməsi üçün və digər funksiyaları istifadə edə bilmək üçün <a href=\"https://#login\">daxil olun</a> və ya <a href=\"https://#login\">hesab yaradın.</a> - Redaktəniz %1$s ilə əlaqələndiriləcək. IP ünvanınız administratorlara görünəcək.<br /><br /> < href=\"https://#login\">Daxil olsanız</a> və ya <a href=\"https://#login\">hesab yaratsanız</a>, redaktələriniz digər üstünlüklərlə birlikdə seçdiyiniz ada aid ediləcək. + Redaktə etdikdən sonra məxfiliyinizi qorumaq üçün sizin üçün <b>müvəqqəti hesab</b> yaradılacaq. <a href=\"%1$s\">Ətraflı öyrənin</a>.<br /><br />Gələcəkdə adınıza istinad verilməsi üçün və digər funksiyaları istifadə edə bilmək üçün <a href=\"https://#login\">daxil olun</a> və ya <a href=\"https://#login\">hesab yaradın.</a> + Redaktəniz %1$s ilə əlaqələndiriləcək. IP ünvanınız administratorlara görünəcək.<br /><br /> < href=\"https://#login\">Daxil olsanız</a> və ya <a href=\"https://#login\">hesab yaratsanız</a>, redaktələriniz digər üstünlüklərlə birlikdə seçdiyiniz ada aid ediləcək. Başa düşdüm Siz müvəqqəti hesabdan istifadə edirsiniz Dəyişiklikləri ləğv edin və daxil olun diff --git a/app/src/main/res/values-b+be+x+old/strings.xml b/app/src/main/res/values-b+be+x+old/strings.xml index 780f8e9ffba..361a817564a 100644 --- a/app/src/main/res/values-b+be+x+old/strings.xml +++ b/app/src/main/res/values-b+be+x+old/strings.xml @@ -56,7 +56,7 @@ Фільтраваць паводле Усе рэдагаваньні (%s) Рэдагаваньні ўдзельніка (%s) - Ананімныя рэдагаваньні (%s) + Ананімныя рэдагаваньні (%s) Рэдагаваньні робатаў (%s) Мэтрыкі ад %1$s да %2$s Паказаць укладкі diff --git a/app/src/main/res/values-b+kk+Cyrl/strings.xml b/app/src/main/res/values-b+kk+Cyrl/strings.xml index 5c33fc2a4f4..d41f3ff3236 100644 --- a/app/src/main/res/values-b+kk+Cyrl/strings.xml +++ b/app/src/main/res/values-b+kk+Cyrl/strings.xml @@ -57,7 +57,7 @@ Сүзгі Барлық өңдеме (%s) Қатысушы өңдемелері (%s) - Аноним өңдемелері (%s) + Аноним өңдемелері (%s) Бот өңдемелері (%s) Тіл ауыстыру Мақала ішінен табу diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 2bdf43d2def..76004e12ba8 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -54,7 +54,7 @@ Filtriraj po Sve izmene (%s) Korisničke izmene (%s) - Anonimne izmene (%s) + Anonimne izmene (%s) Botovske izmene (%s) Od %1$s do %2$s diff --git a/app/src/main/res/values-b+tt+Cyrl/strings.xml b/app/src/main/res/values-b+tt+Cyrl/strings.xml index 01e344b664d..5c65bf82703 100644 --- a/app/src/main/res/values-b+tt+Cyrl/strings.xml +++ b/app/src/main/res/values-b+tt+Cyrl/strings.xml @@ -60,7 +60,7 @@ ... буенча фильтрлау: Барлык төзәтмәләр (%s) Кулланучылар төзәтмәләр (%s) - Аноним төзәтмәләр (%s) + Аноним төзәтмәләр (%s) Бот төзәтмәләре (%s) %1$s-%2$s кадәрге күрсәткечләр diff --git a/app/src/main/res/values-ba/strings.xml b/app/src/main/res/values-ba/strings.xml index c7d04230a2b..20517e93401 100644 --- a/app/src/main/res/values-ba/strings.xml +++ b/app/src/main/res/values-ba/strings.xml @@ -72,7 +72,7 @@ ... буйынса фильтрларға Бөтә төҙәтеүҙәр (%s) Ҡатнашыусылар төҙәтеүҙәре (%s) - Аноним төҙәтеүҙәр (%s) + Аноним төҙәтеүҙәр (%s) Роботтарҙың төҙәтеүҙәре (%s) %1$s алып %2$s тиклем күләм {{PLURAL\n|one=%2$s алып %1$d төҙәтеү|%2$s алып %1$d төҙәтеү}} @@ -438,8 +438,8 @@ Ҡоралдар панелын көйләгеҙ Һеҙ <a href=\"https://ru.wikipedia.org/wiki/Википедия:Администраторы\">хаким</a> менән бикләү сәбәптәре тураһында һөйләшә алаһығыҙ Һеҙ системаға инмәнегеҙ - Бер үҙгәртеү индергәс, һеҙҙең өсөн шәхси мәғлүмәтегеҙҙе яҡлау маҡсатында <b>ваҡытлыса аккаунт</b> булдырыласаҡ. [Тулыраҡ мәғлүмәт](%1$s).<br /><br />Киләсәктәге үҙгәртеүҙәр өсөн кредит алыу һәм башҡа мөмкинлектәргә инеү өсөн [Системаға инегеҙ](https://#login) йәки [Аккаунт булдырығыҙ](https://#login). - Һеҙҙең үҙгәртеү %1$s исеме аҫтында күрһәтеләсәк. Һеҙҙең IP-адресығыҙ администраторҙар өсөн күренерлек буласаҡ.<br /><br />Әгәр һеҙ <a href=\"https://#login\">инеп</a> йәки <a href=\"https://#login\">яңы аккаунт булдырһағыҙ</a>, һеҙҙең үҙгәртеүҙәрегеҙ һеҙ һайлаған исем аҫтында күрһәтеләсәк, башҡа өҫтөнлөктәр менән бер рәттән. + Бер үҙгәртеү индергәс, һеҙҙең өсөн шәхси мәғлүмәтегеҙҙе яҡлау маҡсатында <b>ваҡытлыса аккаунт</b> булдырыласаҡ. [Тулыраҡ мәғлүмәт](%1$s).<br /><br />Киләсәктәге үҙгәртеүҙәр өсөн кредит алыу һәм башҡа мөмкинлектәргә инеү өсөн [Системаға инегеҙ](https://#login) йәки [Аккаунт булдырығыҙ](https://#login). + Һеҙҙең үҙгәртеү %1$s исеме аҫтында күрһәтеләсәк. Һеҙҙең IP-адресығыҙ администраторҙар өсөн күренерлек буласаҡ.<br /><br />Әгәр һеҙ <a href=\"https://#login\">инеп</a> йәки <a href=\"https://#login\">яңы аккаунт булдырһағыҙ</a>, һеҙҙең үҙгәртеүҙәрегеҙ һеҙ һайлаған исем аҫтында күрһәтеләсәк, башҡа өҫтөнлөктәр менән бер рәттән. Аңланым Һеҙ ваҡытлыса иҫәп яҙмаһын ҡулланаһығыҙ Үҙгәрештәрҙе кире алырға һәм системаға инергә diff --git a/app/src/main/res/values-ban/strings.xml b/app/src/main/res/values-ban/strings.xml index c00ac092fa5..dfc30cc6ed6 100644 --- a/app/src/main/res/values-ban/strings.xml +++ b/app/src/main/res/values-ban/strings.xml @@ -53,7 +53,7 @@ Saring mawit Samian uahan (%s) Uahan anganggé (%s) - Uahan anonim (%s) + Uahan anonim (%s) Uahan bot (%s) Métrik saking %1$s nganti %2$s diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index e980150cc25..526630b934b 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -73,7 +73,7 @@ Адфільтраваць па Усе праўкі (%s) Праўкі ўдзельніка (%s) - Ананімныя праўкі (%s) + Ананімныя праўкі (%s) Праўкі ботаў (%s) Метрыкі ад %1$s да %2$s @@ -450,8 +450,8 @@ Наладзьце панэль інструментаў Вы можаце звязацца з <a href=\"https://be.wikipedia.org/wiki/Вікіпедыя: Адміністратары\">адміністратарам</a>, каб абмеркаваць блакаванне. Вы не ўвайшлі ў сістэму - Пасля ўнясення змяненняў для вас будзе створаны <b>часовы ўліковы запіс</b> для абароны вашай канфідэнцыяльнасці. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Даведайцеся больш</a> .<br /><br /> <a href=\"https://#login\">Увайдзіце ў сістэму</a> або <a href=\"https://#login\">стварыце ўліковы запіс</a>, каб вашыя будучыя праўкі былі ўлічаныя і атрымаць доступ да іншых функцый. - Вашае змяненне будзе аднесена да %1$s . Ваш IP-адрас будзе бачным для адміністратараў.<br /><br /> Калі вы <a href=\"https://#login\">ўвойдзеце ў сістэму/a> або <a href=\"https://#login\">створыце ўліковы запіс</a>, вашыя змяненні будуць спалучынімі з абраным вамі імем, апроч іншых пераваг. + Пасля ўнясення змяненняў для вас будзе створаны <b>часовы ўліковы запіс</b> для абароны вашай канфідэнцыяльнасці. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Даведайцеся больш</a> .<br /><br /> <a href=\"https://#login\">Увайдзіце ў сістэму</a> або <a href=\"https://#login\">стварыце ўліковы запіс</a>, каб вашыя будучыя праўкі былі ўлічаныя і атрымаць доступ да іншых функцый. + Вашае змяненне будзе аднесена да %1$s . Ваш IP-адрас будзе бачным для адміністратараў.<br /><br /> Калі вы <a href=\"https://#login\">ўвойдзеце ў сістэму/a> або <a href=\"https://#login\">створыце ўліковы запіс</a>, вашыя змяненні будуць спалучынімі з абраным вамі імем, апроч іншых пераваг. Зразумела Вы выкарыстоўваеце часовы ўліковы запіс Скасаваць змяненні і ўвайсці ў сістэму diff --git a/app/src/main/res/values-bew/strings.xml b/app/src/main/res/values-bew/strings.xml index 88bf106758c..71020a80388 100644 --- a/app/src/main/res/values-bew/strings.xml +++ b/app/src/main/res/values-bew/strings.xml @@ -53,7 +53,7 @@ Saring berales Semua permakan (%s) Permakan pemaké (%s) - Permakan sondernama (%s) + Permakan sondernama (%s) Permakan bot (%s) Penakeran deri %1$s ampé %2$s diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index abce9673ff6..92215a8d598 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -62,7 +62,7 @@ Филтриране по Всички редакции (%s) Редакции от потребители (%s) - Редакции от анонимни (%s) + Редакции от анонимни (%s) Редакции на бот (%s) Показатели от %1$s до %2$s diff --git a/app/src/main/res/values-blk/strings.xml b/app/src/main/res/values-blk/strings.xml index 35d37591120..ff3372306ca 100644 --- a/app/src/main/res/values-blk/strings.xml +++ b/app/src/main/res/values-blk/strings.xml @@ -55,7 +55,7 @@ <b>m</b> %s ခြပ်ချော်ꩻမုꩻကားကအဝ်ႏ (%s) ကေားသုင်ꩻသား မွဉ်းဖျင်ခြပ်ချော်ꩻဖိုင်ႏ (%s) - သေတဝ်းအမိဉ်ꩻ မွဉ်းဖျင်ခြပ်ချော်ꩻဖိုင်ႏ (%s) + သေတဝ်းအမိဉ်ꩻ မွဉ်းဖျင်ခြပ်ချော်ꩻဖိုင်ႏ (%s) ဗော့ မွဉ်းဖျင်ခြပ်ချော်ꩻဖိုင်ႏ (%s) အွောန်ႏနယ် tab ဖိုင်ႏ ပြောင်ꩻလုဲင်ႏ ဘာႏသာႏငဝ်းငွါ diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 0f997d4d194..710b6b9a568 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -89,7 +89,7 @@ ছাঁকুন সমস্ত সম্পাদনা (%s) ব্যবহারকারীর সম্পাদনা (%s) - বেনামি সম্পাদনা (%s) + বেনামি সম্পাদনা (%s) বট সম্পাদনা (%s) %2$s থেকে %1$dটি সম্পাদনা diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 8be48f1f4ee..dafc1de7272 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -62,7 +62,7 @@ Silañ dre An holl kemmoù (%s) Kemmoù implijerien (%s) - Kemmoù tud dizanv (%s) + Kemmoù tud dizanv (%s) Kemmoù robotoù (%s) %1$d c\'hemm abaoe %2$s diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 5eb9fe91653..e84cab218ac 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -54,7 +54,7 @@ Filtriraj po Sve izmjene (%s) Korisničke izmjene (%s) - Anonimne izmjene (%s) + Anonimne izmjene (%s) Izmjene botova (%s) Metrika od %1$s do %2$s diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index b02eb6e780c..3b738e57be8 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -80,7 +80,7 @@ Filtra per Totes les edicions (%s) Edicions de l\'usuari (%s) - Edicions anònimes (%s) + Edicions anònimes (%s) Edicions de bots (%s) Mètriques de %1$s a %2$s diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 580f088b261..279abae91fa 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -64,7 +64,7 @@ بیپاڵێوە بە ھەموو دەستکارییەکان (%s) دەستکارییەکانی یەکارھێنەر (%s) - دەستکارییەکانی بەکارھێنەری نەزانراو (%s) + دەستکارییەکانی بەکارھێنەری نەزانراو (%s) دەستکارییەکانی بۆت (%s) پێوانەکان لە %1$s بۆ %2$s diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index b485cd35074..b1b49070cf2 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -86,7 +86,7 @@ Filtrovat podle Všechny úpravy (%s) Uživatelské úpravy (%s) - Anonymní úpravy ( %s ) + Anonymní úpravy ( %s ) Úpravy robota (%s) Metriky od %1$s do %2$s diff --git a/app/src/main/res/values-cv/strings.xml b/app/src/main/res/values-cv/strings.xml index 869dad85ae4..ab1cdd1a9ee 100644 --- a/app/src/main/res/values-cv/strings.xml +++ b/app/src/main/res/values-cv/strings.xml @@ -55,7 +55,7 @@ Фильтрла Пур тӳрлетӳсем те (%s) Хутшӑнакансен тӳрлетӗвӗсем (%s) - Анонимлӑ тӳрлетнисем (%s) + Анонимлӑ тӳрлетнисем (%s) Ботсен тӳрлетӗвӗсем (%s) %1$s пуҫласа %2$s таран метрикӑсем diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 37b6e072b25..2166047d6f6 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -72,7 +72,7 @@ Filtrer efter Alle redigeringer (%s) Brugerredigeringer (%s) - Anonyme redigeringer (%s) + Anonyme redigeringer (%s) Bot redigeringer (%s) Målinger fra %1$s til %2$s @@ -440,8 +440,8 @@ Tilpas din værktøjslinje Du kan kontakte en <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administrator</a> for at diskutere blokeringen. Du er ikke logget ind - Når du har foretaget en redigering, vil der blive oprettet en <b>midlertidig konto</b> til dig for at beskytte dit privatliv. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Lær mere</a> .<br /><br /> <a href=\"https://#login\">Log ind</a> eller <a href=\"https://#login\">opret en konto</a> for at få kredit for fremtidige redigeringer og for at få adgang til andre funktioner. - Din redigering vil blive tilskrevet %1$s. Din IP-adresse vil være synlig for administratorer.<br /><br />Hvis du <a href=\"https://#login\">logger ind</a> eller <a href=\"https://#login\">opretter en konto</a>, vil dine redigeringer blive tilskrevet et navn, du vælger, blandt andre fordele. + Når du har foretaget en redigering, vil der blive oprettet en <b>midlertidig konto</b> til dig for at beskytte dit privatliv. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Lær mere</a> .<br /><br /> <a href=\"https://#login\">Log ind</a> eller <a href=\"https://#login\">opret en konto</a> for at få kredit for fremtidige redigeringer og for at få adgang til andre funktioner. + Din redigering vil blive tilskrevet %1$s. Din IP-adresse vil være synlig for administratorer.<br /><br />Hvis du <a href=\"https://#login\">logger ind</a> eller <a href=\"https://#login\">opretter en konto</a>, vil dine redigeringer blive tilskrevet et navn, du vælger, blandt andre fordele. Forstået Du bruger en midlertidig konto Kassér ændringer og log ind diff --git a/app/src/main/res/values-dag/strings.xml b/app/src/main/res/values-dag/strings.xml index d9accea13e5..0502aabc2c9 100644 --- a/app/src/main/res/values-dag/strings.xml +++ b/app/src/main/res/values-dag/strings.xml @@ -58,7 +58,7 @@ doli jɛhi Maliniŋ nima zaa (%s) ŋun su maliniŋ nima (%s) - Anon mali niŋ (%s) + Anon mali niŋ (%s) Bot mali niŋ nima (%s) Metrics din gbaai %1$s zaŋ chaŋ %2$s @@ -422,7 +422,7 @@ Malimi a tuulbaa zali a ni borili shɛm A ni tooi nya <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administrator</a> ka yi tɔɣisi a kparibu maa yɛltɔɣa. A bi kpɛ - Di yi niŋ ka a niŋ maliniŋ, <b>saha bela akaunti</b> nyɛla din yɛn nam n zaŋ ti a ka di gbubi a daashili. <a href=\"%1$s\">Bɔhimi m pahi</a>. <br /><br /><a href=\"https://#login\">Log in</a> or <a href=\"https://#login\">Nammi akaunti</a> zaŋ n-ti sɔhi biɛɣu ni mali niŋ ni din yɛn che ka a tooi nya nahingbaŋ shɛŋa. + Di yi niŋ ka a niŋ maliniŋ, <b>saha bela akaunti</b> nyɛla din yɛn nam n zaŋ ti a ka di gbubi a daashili. <a href=\"%1$s\">Bɔhimi m pahi</a>. <br /><br /><a href=\"https://#login\">Log in</a> or <a href=\"https://#login\">Nammi akaunti</a> zaŋ n-ti sɔhi biɛɣu ni mali niŋ ni din yɛn che ka a tooi nya nahingbaŋ shɛŋa. Nya li A mali la saha bela akaunt Kpihimi taɣibunima ka kpɛ diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6feda24e271..c755d6a6c40 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -99,7 +99,7 @@ Filtern nach Alle Bearbeitungen (%s) Benutzer-Bearbeitungen (%s) - Anonyme Bearbeitungen (%s) + Anonyme Bearbeitungen (%s) Bot-Bearbeitungen (%s) Metriken vom %1$s bis %2$s @@ -468,8 +468,8 @@ Werkzeugleiste anpassen Du kannst einen <a href=\"https://de.wikipedia.org/wiki/Wikipedia:Administratoren\">Administrator</a> kontaktieren, um die Sperre zu besprechen. Du bist nicht angemeldet - Sobald du eine Bearbeitung tätigst, wird ein <b>Temporäres Konto</b> erstellt, um deinen Datenschutz zu gewährleisten. <a href=\"%1$s\">Mehr erfahren</a>.<br /><br /><a href=\"https://#login\">Melde dich an</a> oder <a href=\"https://#login\">erstelle ein Konto</a>, damit zukünftige Bearbeitungen dir zugeschrieben werden können und du auf andere Funktionen zugreifen kannst. - Deine Bearbeitung wird %1$s zugeschrieben. Deine IP-Adresse ist für Administratoren sichtbar.<br /><br />Wenn du dich <a href=\"https://#login\">anmeldest</a> oder <a href=\"https://#login\">ein Konto erstellst</a>, erhältst du einen von dir gewählten Namen sowie weitere Vorteile. + Sobald du eine Bearbeitung tätigst, wird ein <b>Temporäres Konto</b> erstellt, um deinen Datenschutz zu gewährleisten. <a href=\"%1$s\">Mehr erfahren</a>.<br /><br /><a href=\"https://#login\">Melde dich an</a> oder <a href=\"https://#login\">erstelle ein Konto</a>, damit zukünftige Bearbeitungen dir zugeschrieben werden können und du auf andere Funktionen zugreifen kannst. + Deine Bearbeitung wird %1$s zugeschrieben. Deine IP-Adresse ist für Administratoren sichtbar.<br /><br />Wenn du dich <a href=\"https://#login\">anmeldest</a> oder <a href=\"https://#login\">ein Konto erstellst</a>, erhältst du einen von dir gewählten Namen sowie weitere Vorteile. Verstanden Du verwendest ein vorläufiges Konto Änderungen verwerfen und anmelden diff --git a/app/src/main/res/values-dga/strings.xml b/app/src/main/res/values-dga/strings.xml index adb0f9585b0..2b28fff3af8 100644 --- a/app/src/main/res/values-dga/strings.xml +++ b/app/src/main/res/values-dga/strings.xml @@ -56,7 +56,7 @@ Gyɛ ne Maale emmo zaa (%s) Tontona maale emmo (%s) - Anon maale emmo (%s) + Anon maale emmo (%s) Bot Maale emmo (%s) Metrics a yi %1$s wa tɔ %2$s diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6edd56fd817..d61bfad53f8 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -144,7 +144,7 @@ Filtrar por: Todas las ediciones (%s) Ediciones de usuario (%s) - Ediciones anónimas (%s) + Ediciones anónimas (%s) Ediciones de bot (%s) Métrica de %1$s a %2$s @@ -512,8 +512,8 @@ Personalice su barra de herramientas Puedes contactar un <a href=\"https://es.wikipedia.org/wiki/Wikipedia:Bibliotecarios\">bibliotecario</a> para hablar del bloqueo. No has iniciado sesión - Una vez que realice una edición, se creará una <b>cuenta temporal</b> para proteger su privacidad. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Learn more</a> .<br /><br /> <a href=\"https://#login\">Inicie sesión</a> o <a href=\"https://#login\">cree una cuenta</a> para obtener crédito para futuras ediciones y acceder a otras funciones. - Tu edición se atribuirá a %1$s . Su dirección IP será visible para los administradores.<br /><br /> Si <a href=\"https://#login\">inicias sesión</a> o <a href=\"https://#login\">creas una cuenta</a> , tus ediciones se atribuirán al nombre que elijas, entre otros beneficios. + Una vez que realice una edición, se creará una <b>cuenta temporal</b> para proteger su privacidad. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Learn more</a> .<br /><br /> <a href=\"https://#login\">Inicie sesión</a> o <a href=\"https://#login\">cree una cuenta</a> para obtener crédito para futuras ediciones y acceder a otras funciones. + Tu edición se atribuirá a %1$s . Su dirección IP será visible para los administradores.<br /><br /> Si <a href=\"https://#login\">inicias sesión</a> o <a href=\"https://#login\">creas una cuenta</a> , tus ediciones se atribuirán al nombre que elijas, entre otros beneficios. Conseguido Estás usando una cuenta temporal Descartar cambios e iniciar sesión diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 59d86ba9d1b..2a08a46e00b 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -71,7 +71,7 @@ Honen arabera iragazi Aldaketa guztiak (%s) Erabiltzaileen aldaketak (%s) - Anonimoen aldaketak (%s) + Anonimoen aldaketak (%s) Bot-en aldaketak (%s) %1$stik %2$sra bitarteko metrikak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 59d64be2115..3a5b8f58108 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -101,7 +101,7 @@ پالایش بر اساس تمام ویرایش‌ها (%s) ویرایش‌های کاربر (%s) - ویرایش‌های ناشناس (%s) + ویرایش‌های ناشناس (%s) ویرایش‌های ربات (%s) معیارها از %1$s تا %2$s @@ -459,8 +459,8 @@ نوار ابزار خود را سفارشی‌سازی کنید برای گفتگو پیرامون قطع دسترسی می‌توانید با یک <a href=\"https://fa.wikipedia.org/wiki/ویکی‌پدیا:مدیران\">مدیر</a> تماس بگیرید. شما به سامانه وارد نشده‌اید - هرگاه ویرایشی انجام دهید، یک <b>حساب موقت</b> برای شما ایجاد خواهد شد تا از حریم خصوصی شما حفاظت شود. <a href=\"%1$s\">بیشتر بدانید</a>.<br /><br />برای این که ویرایش‌های آتی به خودتان منتسب شوند و به سایر ویژگی‌ها دسترسی داشته باشید، <a href=\"https://#login\">وارد سامانه شوید</a> یا <a href=\"https://#login\">یک حساب کاربری بسازید</a>. - ویرایش شما به %1$s منتسب خواهد شد. نشانی آی‌پی شما برای مدیران قابل مشاهده خواهد بود.<br /><br />اگر <a href=\"https://#login\">وارد سامانه شوید</a> یا <a href=\"https://#login\">حساب بسازید</a>، ویرایش‌های شما به نامی که خودتان انتخاب می‌کنید منتسب خواهند شد و از مزایای دیگری نیز بهره‌مند خواهید شد. + هرگاه ویرایشی انجام دهید، یک <b>حساب موقت</b> برای شما ایجاد خواهد شد تا از حریم خصوصی شما حفاظت شود. <a href=\"%1$s\">بیشتر بدانید</a>.<br /><br />برای این که ویرایش‌های آتی به خودتان منتسب شوند و به سایر ویژگی‌ها دسترسی داشته باشید، <a href=\"https://#login\">وارد سامانه شوید</a> یا <a href=\"https://#login\">یک حساب کاربری بسازید</a>. + ویرایش شما به %1$s منتسب خواهد شد. نشانی آی‌پی شما برای مدیران قابل مشاهده خواهد بود.<br /><br />اگر <a href=\"https://#login\">وارد سامانه شوید</a> یا <a href=\"https://#login\">حساب بسازید</a>، ویرایش‌های شما به نامی که خودتان انتخاب می‌کنید منتسب خواهند شد و از مزایای دیگری نیز بهره‌مند خواهید شد. متوجه شدم شما در حال استفاده از یک حساب موقت هستید دور ریختن تغییرات و ورود به حساب diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 5acdbbe0236..1fba3978903 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -87,7 +87,7 @@ Suodata Kaikki muokkaukset (%s) Käyttäjät (%s) - Anonyymit (%s) + Anonyymit (%s) Botit (%s) Mittarit välillä %1$s %2$s @@ -455,8 +455,8 @@ Mukauta työkalupalkkia Voit olla yhteydessä <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">ylläpitäjään</a> keskustellaksesi estosta. Et ole kirjautunut sisään - Kun teet muokkauksen, sinulle luodaan <b>väliaikainen tunnus</b> yksityisyytesi suojelemiseksi. <a href=\"%1$s\">Lisätietoja</a>.<br /><br /><a href=\"https://#login\">Kirjaudu sisään</a> tai <a href=\"https://#login\">Luo tunnus</a> saadaksesi tulevat muokkauksesi omiin nimiisi sekä saadaksesi muita etuja. - Muokkauksesi merkitään nimellä %1$s. IP-osoitteesi tulee näkymään ylläpitäjille.<br /><br />Jos <a href=\"https://#login\">kirjaudut sisään</a> tai <a href=\"https://#login\">luot tunnuksen</a>, muokkauksesi merkitään valitsemallesi nimelle, ja saat muita etuja. + Kun teet muokkauksen, sinulle luodaan <b>väliaikainen tunnus</b> yksityisyytesi suojelemiseksi. <a href=\"%1$s\">Lisätietoja</a>.<br /><br /><a href=\"https://#login\">Kirjaudu sisään</a> tai <a href=\"https://#login\">Luo tunnus</a> saadaksesi tulevat muokkauksesi omiin nimiisi sekä saadaksesi muita etuja. + Muokkauksesi merkitään nimellä %1$s. IP-osoitteesi tulee näkymään ylläpitäjille.<br /><br />Jos <a href=\"https://#login\">kirjaudut sisään</a> tai <a href=\"https://#login\">luot tunnuksen</a>, muokkauksesi merkitään valitsemallesi nimelle, ja saat muita etuja. Selvä Käytät väliaikaista käyttäjätunnusta Hylkää muutokset ja kirjaudu sisään @@ -1675,4 +1675,13 @@ Oletko tyytyväinen tähän suositeltuun hakutulokseen? Lisää palautetta Palaute lähetetty. Kiitos! + Tallenna + Valitse päivämäärä + Lahjoita Wikimedia Foundationille + Ei kiitos + Kyllä, vie minut sinne + Ei kiitos + Kyllä, vie minut sinne + Ryhdy lahjoittajaksi + Uloskirjautunut käyttäjä diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 99a5e10f9b6..2fe155de849 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -119,7 +119,7 @@ Filtrer par Toutes les modifications (%s) Modifications par utilisateur (%s) - Modifications anonyme (%s) + Modifications anonyme (%s) Modifications par robot (%s) Mesures de %1$s à %2$s @@ -487,8 +487,8 @@ Personnaliser votre barre d’outils Vous pouvez contacter un <a href=\"https://fr.wikipedia.org/wiki/Wikipédia:Administrateur\">administrateur</a> pour discuter du blocage. Vous n’êtes pas connecté(e) - Une fois que vous aurez effectué une modification, un <b>compte temporaire</b> sera créé pour vous permettre de protéger votre vie privée. <a href=\"%1$s\">En savoir plus</a>.<br /><br /><a href=\"https://#login\">Connectez-vous</a> ou <a href=\"https://#login\">créez un compte</a> pour obtenir un crédit pour les modifications futures et accéder à d\'autres fonctionnalités. - Votre modification sera attribuée à %1$s. Votre adresse IP sera visible par les administrateurs.<br /><br />Si vous <a href=\"https://#login\">vous connectez</a> ou <a href=\"https://#login\">créez un compte</a>, vos modifications seront attribuées à un pseudonyme que vous choisirez, parmi d\'autres avantages. + Une fois que vous aurez effectué une modification, un <b>compte temporaire</b> sera créé pour vous permettre de protéger votre vie privée. <a href=\"%1$s\">En savoir plus</a>.<br /><br /><a href=\"https://#login\">Connectez-vous</a> ou <a href=\"https://#login\">créez un compte</a> pour obtenir un crédit pour les modifications futures et accéder à d\'autres fonctionnalités. + Votre modification sera attribuée à %1$s. Votre adresse IP sera visible par les administrateurs.<br /><br />Si vous <a href=\"https://#login\">vous connectez</a> ou <a href=\"https://#login\">créez un compte</a>, vos modifications seront attribuées à un pseudonyme que vous choisirez, parmi d\'autres avantages. Compris ! Vous utilisez un compte temporaire Annuler les modifications et se connecter diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 74ef5084894..5f2738d67b3 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -68,7 +68,7 @@ Filtrar por Todas as edicións (%s) Edicións do usuario (%s) - Edicións de anónimos (%s) + Edicións de anónimos (%s) Amosar as lapelas Cambiar a lingua Atopar no artigo diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index 0405eaf7849..00846a414aa 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -53,7 +53,7 @@ Embogua: Opaite ñemoambue (%s) Puruhára ñemoambuekuéra (%s) - Ñemoambue ijapohára rera\'ỹva (%s) + Ñemoambue ijapohára rera\'ỹva (%s) Bot ñemoambuekuéra (%s) Ojeipapa %1$s guive %2$s peve diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index 5f542be4ff2..c44eb7a6fc1 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -26,7 +26,7 @@ આના માધ્યમથી વહેંચો બધા સંપાદનો (%s) સભ્ય સંપાદનો (%s) - અજ્ઞાત સંપાદનો (%s) + અજ્ઞાત સંપાદનો (%s) ભાષા બદલો પાનામાં શોધો ચર્ચા પાનું diff --git a/app/src/main/res/values-ha/strings.xml b/app/src/main/res/values-ha/strings.xml index 3becebd4ee2..15248740737 100644 --- a/app/src/main/res/values-ha/strings.xml +++ b/app/src/main/res/values-ha/strings.xml @@ -61,7 +61,7 @@ Wanda ya tace Dukkanin gyararrakin (%s) Gyare-gyaren edita (%s) - Gyare-gyaren wanda bai yi rijista ba (%s) + Gyare-gyaren wanda bai yi rijista ba (%s) Gyare-gyaren saƙaƙo (%s) Tebura daga %1$s zuwa %2$s diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index b7a0669fa5b..855ee749040 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -87,7 +87,7 @@ छाँटने के मानदंड सभी संपादन (%s) सदस्य द्वारा संपादन (%s) - गुमनाम संपादन (%s) + गुमनाम संपादन (%s) बॉट्स द्वारा संपादन (%s) %1$s से %2$s तक मेट्रिक्स diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 5865c65f85f..2266f560af9 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -73,7 +73,7 @@ Szűrés Minden szerkesztés (%s) Bejelentkezett szerkesztők (%s) - Anonim szerkesztők (%s) + Anonim szerkesztők (%s) Botszerkesztések (%s) Metrikák %1$s és %2$s között @@ -441,7 +441,7 @@ Eszköztár testreszabása Kapcsolatba léphetsz egy <a href=\"https://hu.wikipedia.org/wiki/Wikipédia:Adminisztrátorok\">adminisztrátorral</a>, és megbeszélheted vele a blokkot. Nem vagy bejelentkezve - Amikor először szerkesztesz, a személyes adataid védelme érdekében egy <b>ideiglenes fiók</b> jön létre neked (<a href=\"%1$s\">további információk</a>).<br /><br />Ha <a href=\"https://#login\">bejelentkezel</a> vagy <a href=\"https://#login\">regisztrálsz</a><strong>[$1 bejelentkezel]</strong> vagy <strong>[$2 felhasználói fiókot hozol létre]</strong> akkor a szerkesztéseid a felhasználónevedhez lesznek társítva, egyéb hasznos funkciók mellett. + Amikor először szerkesztesz, a személyes adataid védelme érdekében egy <b>ideiglenes fiók</b> jön létre neked (<a href=\"%1$s\">további információk</a>).<br /><br />Ha <a href=\"https://#login\">bejelentkezel</a> vagy <a href=\"https://#login\">regisztrálsz</a><strong>[$1 bejelentkezel]</strong> vagy <strong>[$2 felhasználói fiókot hozol létre]</strong> akkor a szerkesztéseid a felhasználónevedhez lesznek társítva, egyéb hasznos funkciók mellett. Értem Ideiglenes fiókot használsz Változtatások elvetése és bejelentkezés diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 15c2e90a845..c4b455d3370 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -55,7 +55,7 @@ Զտել ըստ Բոլոր խմբագրումները (%s) Մասնակիցների խմբագրումները (%s) - Անանուն խմբագրումներ (%s) + Անանուն խմբագրումներ (%s) Բոտերի խմբագրումները (%s) %1$d խմբագրում սկսած %2$s-ից diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index d0823a13be1..ccab69c85dd 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -58,7 +58,7 @@ Filtrar per Tote le modificationes (%s) Modificationes de usatores (%s) - Modificationes anonyme (%s) + Modificationes non registrate (%s) Modificationes de robots (%s) Statisticas desde le %1$s usque al %2$s @@ -425,8 +425,9 @@ Personalisar tu barra de utensiles Tu pote contactar un <a href=\"https://ia.wikipedia.org/wiki/Wikipedia:Administratores\">administrator</a> pro discuter le blocada. Tu non ha aperite session - Quando tu face un modification, un <b>conto temporari</b> te essera create pro proteger tu vita private. <a href=\"%1$s\">Lege plus</a>.<br /><br /><a href=\"https://#login\">Aperi session</a> o <a href=\"https://#login\">crea un conto</a> pro reciper credito pro futur modificationes e acceder a altere functiones. - Tu modification essera attribuite a %1$s. Tu adresse IP essera visibile al administratores.<br /><br />Si tu <a href=\"https://#login\">aperi session</a> oor <a href=\"https://#login\">crea un conto</a>, tu modificationes essera attribuite a un nomine que tu elige, inter altere beneficios. + Quando tu face un modification, tu adresse IP essera associate a tu modificationes.<br /><br /><a href=\"https://#login\">Aperi session</a> o <a href=\"https://#createaccount\">crea un conto</a> pro reciper attribution pro futur modificationes e pro acceder a altere functionalitate. + Quando tu face un modification, un <b>conto temporari</b> te essera create pro proteger tu vita private. <a href=\"%1$s\">Lege plus</a>.<br /><br /><a href=\"https://#login\">Aperi session</a> o <a href=\"https://#createaccount\">crea un conto</a> pro reciper credito pro futur modificationes e acceder a altere functiones. + Tu modification essera attribuite a %1$s. Tu adresse IP essera visibile al administratores.<br /><br />Si tu <a href=\"https://#login\">aperi session</a> o <a href=\"https://#createaccount\">crea un conto</a>, tu modificationes essera attribuite a un nomine que tu elige, inter altere beneficios. Comprendite Tu usa un conto temporari Abandonar cambiamentos e aperir session @@ -438,6 +439,7 @@ Le conto expirara in %d die. Le conto expirara in %d dies. + <b>Tu non ha aperite session.</b> Quando tu face un modification, tu adresse IP essera associate a tu modificaiontes. <b>Tu non ha aperite session.</b> Un vice que tu apporta un modification, un conto temporari essera create pro te pro proteger tu vita private. <a href=\"%1$s\">Leger plus</a> <b>Tu usa un conto temporari.</b> Tu modification essera attribuite a %1$s. <a href=\"%2$s\">Leger plus</a>. <b>Tu usa in iste momento un conto temporari.</b> Le modificationes apportate con le conto temporari %1$s non essera transferite a tu conto permanente quando tu aperi session. Aperi session o crea un conto pro reciper attribution a tu nomine de usator, inter altere beneficios. @@ -1677,4 +1679,35 @@ Es tu satisfacite con iste resultato de recerca recommendate? Retroaction additional Retroaction inviate. Gratias! + Historia del donator + Salveguardar + Actualisar stato de donator + Donator + Non donator + Ultime donation + Adder le data del ultime donation + Selige un data + Insere data + Donator recurrente + Donar al Fundation Wikimedia + A proposito de iste experimento + Historia del donator actualisate + Adjuta a meliorar le tabuliero de contributiones + Iste actualisation al tabuliero de instrumentos es un function experimental. Vole tu que iste function es meliorate o removite? + Necun opinion + Dar tu opinion + Gratias pro appoiar le cognoscentia libere + Tu face parte del 2%% que ha eligite a appoiar le ressource al qual milliones se fide. Pro demonstrar nostre gratitude, tu tabuliero de contributiones ha essite actualisate pro recognoscer tu stato de donator. Vole tu vider le actualisation? + No, gratias + Si, porta me la + Tu tabuliero de contributiones ha essite actualisate + Le tabuliero de contributiones ora monstra detalios sur tu stato de donator. Vole tu revider iste function experimental? + No, gratias + Si, porta me la + Donator + Devenir donator + Actualisar stato de donator + Icone del app + Beneficio de donator + Usator sin session diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 90c8095e021..3ba090cdf50 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -92,7 +92,7 @@ Saring berdasarkan Semua suntingan (%s) Suntingan pengguna (%s) - Suntingan anonim (%s) + Suntingan anonim (%s) Suntingan bot (%s) Metrik dari %1$s hingga %2$s diff --git a/app/src/main/res/values-inh/strings.xml b/app/src/main/res/values-inh/strings.xml index 6b91984facc..6990bbe64fd 100644 --- a/app/src/main/res/values-inh/strings.xml +++ b/app/src/main/res/values-inh/strings.xml @@ -57,7 +57,7 @@ ДӀанийсде Деррига хувцамаш (%s) Доакъашхой хувцамаш (%s) - Анонимаша даь хувцамаш (%s) + Анонимаша даь хувцамаш (%s) Боташа даь хувцамаш (%s) Гойтаргаш: %1$s — %2$s diff --git a/app/src/main/res/values-io/strings.xml b/app/src/main/res/values-io/strings.xml index fcebc45bf0d..02c3d06ee8f 100644 --- a/app/src/main/res/values-io/strings.xml +++ b/app/src/main/res/values-io/strings.xml @@ -58,7 +58,7 @@ Filtrar segun Omna redakturi (%s) Redakturi dal uzero (%s) - Anonima redakturi (%s) + Anonima redakturi (%s) Redakturi da \'\'bot\'\'-i (%s) Statistiki de %1$s til %2$s diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index df132d7968a..c5982ea6083 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -58,7 +58,7 @@ Sía eftir: Allar breytingar (%s) Breytingar notanda (%s) - Nafnlausar breytingar (%s) + Nafnlausar breytingar (%s) Breytingar vélmenna (%s) Mælingar frá %1$s til %2$s diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 80b7b9b5b82..f3d7824bef7 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -103,7 +103,7 @@ Filtra per Tutte le modifiche (%s) Modifiche dell\'utente (%s) - Modifiche anonime (%s) + Modifiche non registrate (%s) Modifiche di bot (%s) Statistiche dal %1$s al %2$s @@ -470,7 +470,7 @@ Personalizza la barra degli strumenti Puoi contattare un\'<a href=\"https://it.wikipedia.org/wiki/Wikipedia:Amministratori\">amministratore</a> per discutere del blocco. Non hai effettuato l\'accesso - Una volta che hai apportato una modifica, verrà <a href=\'https://#login\'>creato un account</a> temporaneo per proteggere la tua privacy. <a href=\'%1$s\'>Scopri di più</a>. Accedi o crea un account per ricevere riconoscimento per le tue modifiche future e per accedere ad altre funzionalità. + Una volta che hai apportato una modifica, verrà <a href=\'https://#login\'>creata un\'utenza</a> temporanea per proteggere la tua privacy. <a href=\'%1$s\'>Scopri di più</a>. <br /><a href=\"https://#login\">Accedi</a> o <a href=\"https://#createaccount\">crea un\'utenza</a> per ricevere riconoscimento per le tue modifiche future e per accedere ad altre funzionalità. Capito Stai utilizzando un\'utenza temporanea Ignora le modifiche ed accedi diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index bd653338a98..bceb302d92c 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -78,7 +78,7 @@ לסנן לפי כל העריכות (%s) עריכות משתמש (%s) - עריכות אלמוניות (%s) + עריכות אלמוניות (%s) עריכות בוט (%s) מדדים מאז %1$s עד %2$s @@ -457,8 +457,8 @@ התאמת סרגל הכלים שלך באפשרותך ליצור קשר עם <a href=\"https://he.wikipedia.org/wiki/WP:SYSOP\">מפעיל</a> כדי לדון בחסימה. לא נכנסת לחשבון - לאחר ביצוע עריכה, ייווצר בשבילך חשבון חולף כדי להגן על פרטיותך. <a href=\"%1$s\">מידע נוסף</a>.<br /><br /><a href=\"https://#login\">כניסה</a> או <a href=\"https://#login\">יצירת חשבון</a> תאפשר לך לקבל קרדיט על עריכות עתידיות ולגשת לאפשרויות אחרות. - העריכה שלך תיוחס לשם המשתמש %1$s. כתובת ה־IP שלך תהיה גלויה למפעילים.<br /><br /> <a href=\"https://#login\">כניסה</a> או <a href=\"https://#login\">יצירת חשבון</a> תגרום לכך שהעריכות שלך תיוחסנה לשם הנבחר שלך, ויש לזה גם יתרונות נוספים. + לאחר ביצוע עריכה, ייווצר בשבילך חשבון חולף כדי להגן על פרטיותך. <a href=\"%1$s\">מידע נוסף</a>.<br /><br /><a href=\"https://#login\">כניסה</a> או <a href=\"https://#login\">יצירת חשבון</a> תאפשר לך לקבל קרדיט על עריכות עתידיות ולגשת לאפשרויות אחרות. + העריכה שלך תיוחס לשם המשתמש %1$s. כתובת ה־IP שלך תהיה גלויה למפעילים.<br /><br /> <a href=\"https://#login\">כניסה</a> או <a href=\"https://#login\">יצירת חשבון</a> תגרום לכך שהעריכות שלך תיוחסנה לשם הנבחר שלך, ויש לזה גם יתרונות נוספים. הבנתי זהו חשבון חולף לזרוק את השינויים ולהיכנס לחשבון diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d645f3034bc..567f5247eda 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -114,7 +114,7 @@ 絞り込みの条件: すべての編集 (%s) 利用者編集 (%s) - 匿名編集 (%s) + 匿名編集 (%s) ボットの編集 (%s) %1$s から %2$s までの指標。 diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index b3fff062ef6..de6c45d79b6 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -66,7 +66,7 @@ ಆರಿಸಿ ಎಲ್ಲಾ ಸಂಪಾದನೆಗಳು (%s) ಬಳಕೆದಾರರ ಸಂಪಾದನೆಗಳು (%s) - ಅನಾಮಧೇಯ ಸಂಪಾದನೆಗಳು (%s) + ಅನಾಮಧೇಯ ಸಂಪಾದನೆಗಳು (%s) ಬಾಟ್ ಸಂಪಾದನೆಗಳು (%s) %1$sರಿಂದ %2$sರವರೆಗಿನ ಸಂಪಾದನೆ <a href=\"#\">ವನ್ನು ಆರಿಸಿ</a> ಹೆಚ್ಚಿನ ಇತಿಹಾಸವನ್ನು ನೋಡಿ diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index cc6b365cd30..ea1dab68f0b 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -49,6 +49,7 @@ 편집 더 보기 검색 + 기여 인터넷에 연결할 수 없습니다. 다시 시도 다시 시도 @@ -84,7 +85,7 @@ 필터 기준 모든 편집 (%s) 유저 편집 (%s) - 익명 편집 (%s) + 익명 편집 (%s) 봇 편집 (%s) %1$s부터 %2$s까지의 메트릭스 @@ -121,6 +122,7 @@ 최근에 읽음 보존 열기 + 장소에서 열기 새 탭에 링크 열기 링크 주소 복사 정의 @@ -980,6 +982,7 @@ 이미지 설명은 독자가 그림의 의미나 맥락을 파악하는 데 도움을 줍니다. 문서 설명은 독자들이 한눈에 주제를 파악할 수 있도록 글을 요약합니다. 지금까지의 당신의 총 기여 수입니다. + 지금까지의 당신의 총 편집 수입니다. 지금까지 기여한 일수입니다. 한동안 기여가 없는 경우, 최근 기여 날짜를 표시합니다. 최근 30일 동안 기여한 항목들의 총 조회수입니다. 당신의 편집이 (다른 편집자에 의하여) 몇 번 되돌려졌는지를 기반으로 합니다.\n되돌려진 편집: %d건. @@ -1005,6 +1008,9 @@ 기여 기여 + + 편집 + %d일 %d일 @@ -1120,6 +1126,7 @@ 임의 문서 계속 읽기 검색 + 장소 오늘의 역사 이 날에 있었던 더 많은 사건 %2$s~%3$d년 사이의 이벤트 %1$s개 @@ -1597,4 +1604,15 @@ 추천 검색 결과에 만족하시나요? 추가 피드백 피드백을 제출했습니다. 감사합니다! + 저장 + 마지막 기부일 추가 + 날짜 선택 + 날짜 입력 + 이 실험 정보 + 의견 없음 + 자유의 지식을 지원해 주셔서 고맙습니다 + 아니요, 괜찮습니다 + 아니요, 괜찮습니다 + 앱 아이콘 + 로그아웃된 사용자 diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml index 45593fce294..bdab9218a43 100644 --- a/app/src/main/res/values-krc/strings.xml +++ b/app/src/main/res/values-krc/strings.xml @@ -54,7 +54,7 @@ Буну фильтр эт: Бютеу тюзетиуле (%s) Хайрланыучу тюзетиуле (%s) - Аноним тюзетиуле (%s) + Аноним тюзетиуле (%s) Бот тюзетиуле (%s) %1$s бла %2$s арасындагъы ёлчемле @@ -421,8 +421,8 @@ Адыр панелигизни джарашдырыгъыз Блокну сюзер ючюн <a href=\"https://krc.wikipedia.org/wiki/Википедия:Администраторла\">администратор</a> бла байлам къурургъа боллукъсуз. Системагъа кирмегенсиз - Ташалыгъызны къоруулар ючюн, тюзетиу этгенлей <b>болджаллы хыйсаб</b> къураллыкъды. <a href=\"%1$s\">Аслам бил</a>.Келликде тюзетиуде эмда башха онгчулукъла бла хайырланырча <br /><br /><a href=\"https://#login\">Кир</a> неда <a href=\"https://#login\">Хыйсаб къура</a>. - Тюзетиуюгюз %1$s джаздырыллыкъды. IP-адресигиз администраторлагъа кёрюнюрча боллукъду.<br /><br />Сиз <a href=\"https://#login\">кирсегиз</a> неда <a href=\"https://#login \">хыйысаб къурасагъыз</a>, башха онгчулукъла бла бирге, тюзетиулеригиз, сайлагъан атыгъызгъа джаздырыллыкъды. + Ташалыгъызны къоруулар ючюн, тюзетиу этгенлей <b>болджаллы хыйсаб</b> къураллыкъды. <a href=\"%1$s\">Аслам бил</a>.Келликде тюзетиуде эмда башха онгчулукъла бла хайырланырча <br /><br /><a href=\"https://#login\">Кир</a> неда <a href=\"https://#login\">Хыйсаб къура</a>. + Тюзетиуюгюз %1$s джаздырыллыкъды. IP-адресигиз администраторлагъа кёрюнюрча боллукъду.<br /><br />Сиз <a href=\"https://#login\">кирсегиз</a> неда <a href=\"https://#login \">хыйысаб къурасагъыз</a>, башха онгчулукъла бла бирге, тюзетиулеригиз, сайлагъан атыгъызгъа джаздырыллыкъды. Англашынды Сиз заманлы хыйсабны хайырланасыз Тюрлениулени кери ал эмда системагъа кир diff --git a/app/src/main/res/values-ks/strings.xml b/app/src/main/res/values-ks/strings.xml index 465900dde79..a930138e3d1 100644 --- a/app/src/main/res/values-ks/strings.xml +++ b/app/src/main/res/values-ks/strings.xml @@ -55,7 +55,7 @@ سٕنٛدی طرفہٕ فِلٹر تمام ایٚڈِٹٕز %s رُکُن ایٚڈِٹٕز %s - اؠنان اؠڑِٹٕز (%s) + اؠنان اؠڑِٹٕز (%s) باٹ ایٚڈِٹٕز %s حساب %1$s پؠٹھہٕ تس %2$s تسم diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 4333f69707f..35a4da81154 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -61,7 +61,7 @@ Biparzîne bi Temamê guhartinan (%s) Guhartinên bikarhêner (%s) - Guhartinên anonîm (%s) + Guhartinên anonîm (%s) Guherandinên botan (%s) Metrîkên ji %1$s heya %2$s diff --git a/app/src/main/res/values-kus/strings.xml b/app/src/main/res/values-kus/strings.xml index 52725f3d492..565076cf782 100644 --- a/app/src/main/res/values-kus/strings.xml +++ b/app/src/main/res/values-kus/strings.xml @@ -57,7 +57,7 @@ Maalim dɔlis Dɛmisa wʋsa (%s) tʋntʋn dɛmisa (%s) - Anon dɛmisa (%s) + Anon dɛmisa (%s) Bot dɛmisa (%s) Makim yi %1$s paae %2$s diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index f59551c148b..83f7bb9e878 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -55,7 +55,7 @@ Filteren no All Ännerungen (%s) Benotzer-Ännerungen (%s) - Anonym Ännerungen (%s) + Anonym Ännerungen (%s) Bot-Ännerungen (%s) Metrike vum %1$s bis de(n) %2$s diff --git a/app/src/main/res/values-lmo/strings.xml b/app/src/main/res/values-lmo/strings.xml index ab96a6c4c3b..dcc2d7defba 100644 --- a/app/src/main/res/values-lmo/strings.xml +++ b/app/src/main/res/values-lmo/strings.xml @@ -53,7 +53,7 @@ Filtra per Tute i modifeghe (%s) Modifiche de l\'utent (%s) - Modifeghe che se sa nò el nome de quell ch\'je ha fade (%s) + Modifeghe che se sa nò el nome de quell ch\'je ha fade (%s) Modifiche di bot (%s) Statisteghe dal %1$s al %2$s diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 839f8ff43fc..950e8cbafde 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -65,7 +65,7 @@ Filtruoti pagal Visi pakeitimai (%s) Naudotojo pakeitimai (%s) - Anoniniai pakeitimai (%s) + Anoniniai pakeitimai (%s) Robotų pakeitimai (%s) Metrika nuo %1$s iki %2$s Pabandykite pakeisti <a href=\"#\">filtrus</a>, kad matytumėte daugiau keitimų diff --git a/app/src/main/res/values-mhr/strings.xml b/app/src/main/res/values-mhr/strings.xml index 6e2335e402f..0b6530c29ea 100644 --- a/app/src/main/res/values-mhr/strings.xml +++ b/app/src/main/res/values-mhr/strings.xml @@ -54,7 +54,7 @@ Фильтроватлаш (мо дене): Чыла тӧрлымаш (%s) Ушнышо-влакын тӧрлымашышт (%s) - Лӱмдымӧ-влакын тӧрлымашышт (%s) + Лӱмдымӧ-влакын тӧрлымашышт (%s) Бот-влакын тӧрлымашышт (%s) %1$s гыч %2$s марте метрике-влак diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 4ad4fc04a38..bbf9da12e7c 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -58,7 +58,7 @@ Филтрирај по Сите уредувања (%s) Кориснички уредувања (%s) - Анонимни уредувања (%s) + Уредувања на непријавени (%s) Ботовски уредувања (%s) Мерила од %1$s до %2$s @@ -427,8 +427,9 @@ Прилагодете си го алатникот Можете да се обратите кај <a href=\"https://https://mk.wikipedia.org/wiki/Википедија:Администратори\">администратор</a> за да поразговарате за блокот. Не сте најавени - Откако ќе направите уредување, ќе ви биде создадена <b>привремена сметка</b> за да ви се заштити приватноста. <a href=\"%1$s\">Дознајте повеќе</a>.<br /><br /><a href=\"https://#login\">Најавете се</a> или <a href=\"https://#login\">Создајте сметка</a> за да добивате заслуги за сите идни уредувања и други можности. - Вашето уредување ќе му се припише на %1$s. Вашата IP-адреса ќе биде видлива за администратори.<br /><br />Ако <a href=\"https://#login\">се најавите</a> или <a href=\"https://#login\">создадете сметка</a>, вашите уредувања ќе му се припишуваат на име што вие ќе го одберете, меѓу други поволности. + Штом ќе направите уредување, вашата IP-адреса ќе биде поврзана со уредувањата што ги правите.<br /><br /><a href=\"https://#login\">Најавете се</a> или <a href=\"https://#createaccount\">направете сметка</a> за да добивате заслуги за сите идни уредувања и други можности. + Откако ќе направите уредување, ќе ви биде создадена <b>привремена сметка</b> за да ви се заштити приватноста. <a href=\"%1$s\">Дознајте повеќе</a>.<br /><br /><a href=\"https://#login\">Најавете се</a> или <a href=\"https://#createaccount\n\">направете сметка</a> за да добивате заслуги за сите идни уредувања и други можности. + Вашето уредување ќе му се припише на %1$s. Вашата IP-адреса ќе биде видлива за администратори.<br /><br />Ако <a href=\"https://#login\">се најавите</a> или <a href=\"https://#createaccount\">создадете сметка</a>, вашите уредувања ќе му се припишуваат на име што вие ќе го одберете, меѓу други поволности. Јасно Користите привремена сметка Отфрли промени и најави ме @@ -440,6 +441,7 @@ Сметката ќе истече за %d ден. Сметката ќе истече за %d дена. + <b>Не сте најавени.</b> Штом ќе направите уредување, вашата IP-адреса ќе биде поврзана со уредувања што ги правите. <b>Не сте најавени.</b> Откако ќе направите уредување, ќе ви биде создадена привремена сметка за да ви се заштити приватноста. <a href=\"%1$s\">Дознајте повеќе</a> <b>Користите привремена сметка.</b> Вашето уредување му е припишано на %1$s. <a href=\"%2$s\">Дознајте повеќе</a>. <b>Моменталално користите приврмена сметка.</b> Уредувањата направени од привремената сметка %1$s нема да се префрлат во трајната сметка кога ќе се најавите. Најавете се или направете сметка за уредувањата да му се припишуваат на вашето корисничко име, меѓу други поволности. diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 8c2c63a0442..702443deb4d 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -58,7 +58,7 @@ ഇതനുസരിച്ച് ഫിൽട്ടർ ചെയ്യുക എല്ലാ എഡിറ്റുകളും ( %s ) ഉപയോക്തൃ എഡിറ്റുകൾ ( %s ) - അനോൺ എഡിറ്റുകൾ ( %s ) + അനോൺ എഡിറ്റുകൾ ( %s ) ബോട്ട് എഡിറ്റുകൾ ( %s ) %1$s മുതൽ %2$s s വരെയുള്ള മെട്രിക്കുകൾ ടാബുകൾ പ്രദർശിപ്പിക്കുക diff --git a/app/src/main/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml index feb12226b51..45d8e521261 100644 --- a/app/src/main/res/values-mn/strings.xml +++ b/app/src/main/res/values-mn/strings.xml @@ -57,7 +57,7 @@ Засваруудыг хайх эсвэл шүүх Бүх засвар ( %s ) Хэрэглэгчийн засвар ( %s ) - Анон засвар ( %s ) + Анон засвар ( %s ) Цонхнуудыг харуулах Хэл солих Өгүүллээс хайх diff --git a/app/src/main/res/values-mnw/strings.xml b/app/src/main/res/values-mnw/strings.xml index ef06d2e4afa..859a24678d3 100644 --- a/app/src/main/res/values-mnw/strings.xml +++ b/app/src/main/res/values-mnw/strings.xml @@ -58,7 +58,7 @@ ဖဍိုဟ် နကဵု ပလေဝ်ဒါန်လဝ် သီုဖအိုတ် (%s) ညးလွပ် မပလေဝ်ဒါန်ဂမၠိုင် (%s) - သက္ကုယၟု မပလေဝ်ဒါန်လဝ်ဂမၠိုင် (%s) + သက္ကုယၟု မပလေဝ်ဒါန်လဝ်ဂမၠိုင် (%s) စဗောတ် မပလေဝ်ဒါန်လဝ်ဂမၠိုင် (%s) လၟိဟ် နူကဵု %1$s စဵုကဵု %2$s diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 21cb8872881..783f99f9d03 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -68,7 +68,7 @@ Tapis mengikut Semua suntingan (%s) Suntingan pengguna (%s) - Suntingan awanama (%s) + Suntingan awanama (%s) Suntingan bot (%s) Metrik daripada %1$s hingga %2$s diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 1eda197ab1e..2c475ff1b52 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -60,7 +60,7 @@ တည်းဖြတ်မှု အကျဉ်းချုပ်ကို ဗလာပြုလုပ်ရန် တည်းဖြတ်မှုများအားလုံး (%s) အသုံးပြုသူ တည်းဖြတ်မှုများ (%s) - အမည်မသိ တည်းဖြတ်မှုများ (%s) + အမည်မသိ တည်းဖြတ်မှုများ (%s) ဘော့ တည်ဖြတ်မှုများ (%s) tab များကို ပြရန် ဘာသာစကား ပြောင်းလဲရန် diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 488ed75255e..8f71a786085 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -74,7 +74,7 @@ Filtrer etter Alle redigeringer (%s) Brukerredigeringer (%s) - Anonyme redigeringer (%s) + Anonyme redigeringer (%s) Botredigeringer (%s) Målinger fra %1$s til %2$s @@ -440,8 +440,8 @@ Tilpass verktøylinje Du kan kontakte en <a href=\"https://no.wikipedia.org/wiki/Wikipedia:Administratorer\">administrator</a> for å diskutere blokkeringen. Du er ikke logget inn - Når du gjør en redigering blir en <b>midlertidig konto</b> opprettet for å beskytte personvernet ditt. <a href=\"%1$s\">Lær mer</a>.<br /><br /><a href=\"https://#login\">Logg inn</a> eller <a href=\"https://#login\">opprett en konto</a> for å få kreditering for framtidige redigeringer du gjør og få tilgang til andre funksjoner. - Redigeringen din blir tilskrevet %1$s. IP-adressen din vil være synlig for administratorer.<br /><br />Hvis du <a href=\"https://#login\">logger inn</a> eller <a href=\"https://#login\">oppretter en konto</a> blir redigeringene dine tilskrevet et navn du velger, blant andre fordeler. + Når du gjør en redigering blir en <b>midlertidig konto</b> opprettet for å beskytte personvernet ditt. <a href=\"%1$s\">Lær mer</a>.<br /><br /><a href=\"https://#login\">Logg inn</a> eller <a href=\"https://#login\">opprett en konto</a> for å få kreditering for framtidige redigeringer du gjør og få tilgang til andre funksjoner. + Redigeringen din blir tilskrevet %1$s. IP-adressen din vil være synlig for administratorer.<br /><br />Hvis du <a href=\"https://#login\">logger inn</a> eller <a href=\"https://#login\">oppretter en konto</a> blir redigeringene dine tilskrevet et navn du velger, blant andre fordeler. Skjønner Du bruker en midlertidig konto Forkast endringer og logg inn diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 161bf67b9c9..a98a8e5815d 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -2,6 +2,7 @@ ವಿಕಿಪೀಡಿಯ @@ -66,7 +68,7 @@ ಬಾಟ್ ಸಂಪಾದಿಲು (%s) %1$sಡ್ದ್ %2$s ಮುಟ್ಟದ ಸಂಪಾದಿ ಇತಿಹಾಸೊ - ಒಂಜಿ= %2$s ಡ್ದ್ %1$d ಸಂಪಾದನೆ + ಒಂಜಿ= %2$s ಡ್ದ್ %1$d ಸಂಪಾದನೆ ಒಂಜಿ= %1$d %2$s ( %3$s) ಡ್ದ್ ಬೊಕ್ಕ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ @@ -218,7 +220,7 @@ ಬೊಡ್ಚಂತಿನ ವರದಿ ಕಡಪ‍್ಡುಕಾ ಇತಿಹಾಸೊನು ಅರಿಪುಲೆ ಈ ಕೊಂಡಿತಾ ಪುಟೋ ತೋಜೊಂತಿಜ್ಜಿ - ಈ ಪುಟೊನು ಪೂರ್ತಿ ರಕ್ಷಣೆ ಮಲ್ತ್ ದ್ ದೀತೆರ್. + ಈ ಪುಟೊನು ಪೂರ್ತಿ ರಕ್ಷಣೆ ಮಲ್ತ್‌ದ್ ದೀತೆರ್. ಈ ಪುಟನ್ ಜಾಗ್ರತೆಡ್ ಡಿತುಂಡು ತೂಪಿಪಟ್ಟಿಗ್ ಸೇರಾಲೆ ಸಂಯೋಜನೆಲು diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1b3c5442f96..40f8abec04b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -471,6 +471,7 @@ 帳號會在 %d 天後失效。 帳號會在 %d 天後失效。 + <b>您還沒有登入。</b>一旦您進行編輯,做過的編輯內容會歸在您的 IP 位址名義下。 <b>您尚未登入。</b>一旦您做出編輯,會為您建立臨時帳號以保護您的隱私。<a href=\"%1$s\">了解更多</a> <b>您正在使用臨時帳號。</b>您做出的編輯內容會歸在%1$s名下。<a href=\"%2$s\">了解更多</a>。 <b>您目前使用的是臨時帳號。</b>當您登入時,使用臨時帳號「%1$s」所做過的編輯不會轉移到您的永久帳號。登入或建立帳號,可讓編輯記錄在您使用者名稱的名下,以及其他好處。 From 9fb51b2b8110c9488bcfed9523ea3b24c730d87a Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Mon, 21 Oct 2024 13:04:00 -0700 Subject: [PATCH 479/626] Bump versionCode. (#5051) --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 98a2451b8d3..0ba4be16638 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId 'org.wikipedia' minSdk 21 targetSdk 34 - versionCode 50506 + versionCode 50507 testApplicationId 'org.wikipedia.test' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' From e706015d7cdf8fd048741feea6cb9bd018d0c826 Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Tue, 22 Oct 2024 05:30:14 -0700 Subject: [PATCH 480/626] Send a LoggedOutEvent to the FlowEventBus for refreshing screen purpose (#5052) --- app/src/main/java/org/wikipedia/WikipediaApp.kt | 2 ++ app/src/main/java/org/wikipedia/events/LoggedOutEvent.kt | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 app/src/main/java/org/wikipedia/events/LoggedOutEvent.kt diff --git a/app/src/main/java/org/wikipedia/WikipediaApp.kt b/app/src/main/java/org/wikipedia/WikipediaApp.kt index caba243237c..6c969fdd9c6 100644 --- a/app/src/main/java/org/wikipedia/WikipediaApp.kt +++ b/app/src/main/java/org/wikipedia/WikipediaApp.kt @@ -22,6 +22,7 @@ import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.SharedPreferenceCookieManager import org.wikipedia.dataclient.WikiSite import org.wikipedia.events.ChangeTextSizeEvent +import org.wikipedia.events.LoggedOutEvent import org.wikipedia.events.ThemeFontChangeEvent import org.wikipedia.installreferrer.InstallReferrerListener import org.wikipedia.language.AcceptLanguageUtil @@ -248,6 +249,7 @@ class WikipediaApp : Application() { }.invokeOnCompletion { SharedPreferenceCookieManager.instance.clearAllCookies() AppDatabase.instance.notificationDao().deleteAll() + FlowEventBus.post(LoggedOutEvent()) L.d("Logout complete.") } } diff --git a/app/src/main/java/org/wikipedia/events/LoggedOutEvent.kt b/app/src/main/java/org/wikipedia/events/LoggedOutEvent.kt new file mode 100644 index 00000000000..75dcd651660 --- /dev/null +++ b/app/src/main/java/org/wikipedia/events/LoggedOutEvent.kt @@ -0,0 +1,3 @@ +package org.wikipedia.events + +class LoggedOutEvent From 08a661524e312d6e86b8ef4844ba38bd92353921 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 08:39:02 -0400 Subject: [PATCH 481/626] Bump com.github.skydoves:balloon from 1.6.8 to 1.6.9 (#5050) Bumps [com.github.skydoves:balloon](https://github.com/skydoves/balloon) from 1.6.8 to 1.6.9. - [Release notes](https://github.com/skydoves/balloon/releases) - [Commits](https://github.com/skydoves/balloon/compare/1.6.8...1.6.9) --- updated-dependencies: - dependency-name: com.github.skydoves:balloon dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Dmitry Brant --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 20ce9fdcf8d..ab35693a85d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ androidPluginAnnotationV9 = "3.0.2" androidSdk = "11.5.1" appcompat = "1.7.0" -balloon = "1.6.8" +balloon = "1.6.9" browser = "1.8.0" commonsLang3 = "3.17.0" constraintlayout = "2.1.4" From ddf3c07f2cfdc54a116db5e2a0e9396435cf732c Mon Sep 17 00:00:00 2001 From: Isira Seneviratne <31027858+Isira-Seneviratne@users.noreply.github.com> Date: Tue, 22 Oct 2024 21:26:57 +0530 Subject: [PATCH 482/626] Use SavedStateHandle in view models (#4875) * Use SavedStateHandle in view models * Fix names * Address code review comments * Update new view models * Added more uses of SavedStateHandle --------- Co-authored-by: Dmitry Brant --- .../wikipedia/categories/CategoryActivity.kt | 2 +- .../categories/CategoryActivityViewModel.kt | 24 ++++-------- .../wikipedia/categories/CategoryDialog.kt | 2 +- .../categories/CategoryDialogViewModel.kt | 15 ++----- .../org/wikipedia/commons/FilePageFragment.kt | 2 +- .../wikipedia/commons/FilePageViewModel.kt | 18 ++------- .../wikipedia/commons/ImagePreviewDialog.kt | 2 +- .../commons/ImagePreviewViewModel.kt | 18 ++------- .../diff/ArticleEditDetailsFragment.kt | 2 +- .../diff/ArticleEditDetailsViewModel.kt | 24 ++++-------- .../org/wikipedia/edit/EditSectionActivity.kt | 2 +- .../wikipedia/edit/EditSectionViewModel.kt | 23 ++++------- .../edit/insertmedia/InsertMediaActivity.kt | 2 +- .../edit/insertmedia/InsertMediaViewModel.kt | 39 +++++++------------ .../edit/templates/TemplatesSearchActivity.kt | 2 +- .../templates/TemplatesSearchViewModel.kt | 26 +++---------- .../org/wikipedia/feed/news/NewsFragment.kt | 2 +- .../org/wikipedia/feed/news/NewsViewModel.kt | 17 ++------ .../feed/onthisday/OnThisDayFragment.kt | 2 +- .../feed/onthisday/OnThisDayViewModel.kt | 22 +++-------- .../SuggestedEditsCardItemFragment.kt | 2 +- .../SuggestedEditsCardItemViewModel.kt | 17 ++------ .../wikipedia/feed/topread/TopReadFragment.kt | 2 +- .../feed/topread/TopReadViewModel.kt | 16 ++------ .../org/wikipedia/gallery/GalleryActivity.kt | 2 +- .../wikipedia/gallery/GalleryItemFragment.kt | 2 +- .../wikipedia/gallery/GalleryItemViewModel.kt | 18 ++------- .../org/wikipedia/gallery/GalleryViewModel.kt | 22 +++-------- .../wikipedia/language/LangLinksActivity.kt | 2 +- .../wikipedia/language/LangLinksViewModel.kt | 15 ++----- .../edithistory/EditHistoryListActivity.kt | 2 +- .../edithistory/EditHistoryListViewModel.kt | 17 ++------ .../page/linkpreview/LinkPreviewDialog.kt | 2 +- .../page/linkpreview/LinkPreviewViewModel.kt | 19 +++------ .../org/wikipedia/places/PlacesFragment.kt | 2 +- .../places/PlacesFragmentViewModel.kt | 18 ++------- .../org/wikipedia/random/RandomFragment.kt | 2 +- .../wikipedia/random/RandomItemFragment.kt | 2 +- .../wikipedia/random/RandomItemViewModel.kt | 16 ++------ .../org/wikipedia/random/RandomViewModel.kt | 16 ++------ .../RecommendedContentFragment.kt | 2 +- .../RecommendedContentViewModel.kt | 18 ++------- .../SuggestedEditsCardsFragment.kt | 2 +- .../SuggestedEditsCardsViewModel.kt | 15 ++----- .../SuggestedEditsImageRecsFragment.kt | 7 ++-- ...uggestedEditsImageRecsFragmentViewModel.kt | 15 ++----- .../talk/ArchivedTalkPagesActivity.kt | 5 ++- .../talk/ArchivedTalkPagesViewModel.kt | 15 ++----- .../org/wikipedia/talk/TalkReplyActivity.kt | 2 +- .../org/wikipedia/talk/TalkReplyViewModel.kt | 29 +++++--------- .../org/wikipedia/talk/TalkTopicActivity.kt | 2 +- .../org/wikipedia/talk/TalkTopicViewModel.kt | 23 ++++------- .../talk/template/TalkTemplatesFragment.kt | 2 +- .../talk/template/TalkTemplatesViewModel.kt | 22 +++-------- .../usercontrib/UserContribListActivity.kt | 2 +- .../usercontrib/UserContribListViewModel.kt | 26 +++---------- .../usercontrib/UserInformationDialog.kt | 2 +- .../UserInformationDialogViewModel.kt | 20 +++------- .../watchlist/WatchlistExpiryDialog.kt | 2 +- .../WatchlistExpiryDialogViewModel.kt | 17 ++------ .../wikipedia/wiktionary/WiktionaryDialog.kt | 2 +- .../wiktionary/WiktionaryViewModel.kt | 18 ++------- 62 files changed, 191 insertions(+), 497 deletions(-) diff --git a/app/src/main/java/org/wikipedia/categories/CategoryActivity.kt b/app/src/main/java/org/wikipedia/categories/CategoryActivity.kt index e4043e88a1a..9883415877f 100644 --- a/app/src/main/java/org/wikipedia/categories/CategoryActivity.kt +++ b/app/src/main/java/org/wikipedia/categories/CategoryActivity.kt @@ -52,7 +52,7 @@ class CategoryActivity : BaseActivity() { private val subcategoriesConcatAdapter = subcategoriesAdapter.withLoadStateHeaderAndFooter(subcategoriesLoadHeader, subcategoriesLoadFooter) private val itemCallback = ItemCallback() - private val viewModel: CategoryActivityViewModel by viewModels { CategoryActivityViewModel.Factory(intent.extras!!) } + private val viewModel: CategoryActivityViewModel by viewModels() public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/org/wikipedia/categories/CategoryActivityViewModel.kt b/app/src/main/java/org/wikipedia/categories/CategoryActivityViewModel.kt index e0a536d7f51..8420615dadb 100644 --- a/app/src/main/java/org/wikipedia/categories/CategoryActivityViewModel.kt +++ b/app/src/main/java/org/wikipedia/categories/CategoryActivityViewModel.kt @@ -1,31 +1,28 @@ package org.wikipedia.categories -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.paging.* import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle -class CategoryActivityViewModel(bundle: Bundle) : ViewModel() { - val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! +class CategoryActivityViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! var showSubcategories = false val categoryMembersFlow = Pager(PagingConfig(pageSize = 10)) { - CategoryMembersPagingSource(pageTitle, "page") + CategoryMembersPagingSource("page") }.flow.cachedIn(viewModelScope) val subcategoriesFlow = Pager(PagingConfig(pageSize = 10)) { - CategoryMembersPagingSource(pageTitle, "subcat") + CategoryMembersPagingSource("subcat") }.flow.cachedIn(viewModelScope) - class CategoryMembersPagingSource( - val pageTitle: PageTitle, - private val resultType: String + inner class CategoryMembersPagingSource( + private val resultType: String ) : PagingSource() { override suspend fun load(params: LoadParams): LoadResult { return try { @@ -51,11 +48,4 @@ class CategoryActivityViewModel(bundle: Bundle) : ViewModel() { return null } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return CategoryActivityViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/categories/CategoryDialog.kt b/app/src/main/java/org/wikipedia/categories/CategoryDialog.kt index 490c139c4c6..ab897a715d2 100644 --- a/app/src/main/java/org/wikipedia/categories/CategoryDialog.kt +++ b/app/src/main/java/org/wikipedia/categories/CategoryDialog.kt @@ -28,7 +28,7 @@ class CategoryDialog : ExtendedBottomSheetDialogFragment() { private val binding get() = _binding!! private val itemCallback = ItemCallback() - private val viewModel: CategoryDialogViewModel by viewModels { CategoryDialogViewModel.Factory(requireArguments()) } + private val viewModel: CategoryDialogViewModel by viewModels() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = DialogCategoriesBinding.inflate(inflater, container, false) diff --git a/app/src/main/java/org/wikipedia/categories/CategoryDialogViewModel.kt b/app/src/main/java/org/wikipedia/categories/CategoryDialogViewModel.kt index 25303d2c261..63df70681ec 100644 --- a/app/src/main/java/org/wikipedia/categories/CategoryDialogViewModel.kt +++ b/app/src/main/java/org/wikipedia/categories/CategoryDialogViewModel.kt @@ -1,20 +1,18 @@ package org.wikipedia.categories -import android.os.Bundle import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.Resource -class CategoryDialogViewModel(bundle: Bundle) : ViewModel() { - val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! +class CategoryDialogViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! val categoriesData = MutableLiveData>>() init { @@ -34,11 +32,4 @@ class CategoryDialogViewModel(bundle: Bundle) : ViewModel() { categoriesData.postValue(Resource.Success(titles)) } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return CategoryDialogViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/commons/FilePageFragment.kt b/app/src/main/java/org/wikipedia/commons/FilePageFragment.kt index 561319c5a0e..b77ce295cd3 100644 --- a/app/src/main/java/org/wikipedia/commons/FilePageFragment.kt +++ b/app/src/main/java/org/wikipedia/commons/FilePageFragment.kt @@ -30,7 +30,7 @@ import org.wikipedia.util.Resource class FilePageFragment : Fragment(), FilePageView.Callback { private var _binding: FragmentFilePageBinding? = null private val binding get() = _binding!! - private val viewModel: FilePageViewModel by viewModels { FilePageViewModel.Factory(requireArguments()) } + private val viewModel: FilePageViewModel by viewModels() private val addImageCaptionLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == RESULT_OK) { diff --git a/app/src/main/java/org/wikipedia/commons/FilePageViewModel.kt b/app/src/main/java/org/wikipedia/commons/FilePageViewModel.kt index 03edabbe6b7..bd35a026b9a 100644 --- a/app/src/main/java/org/wikipedia/commons/FilePageViewModel.kt +++ b/app/src/main/java/org/wikipedia/commons/FilePageViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.commons -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.async @@ -11,20 +10,18 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory -import org.wikipedia.extensions.parcelable import org.wikipedia.language.LanguageUtil import org.wikipedia.page.PageTitle import org.wikipedia.suggestededits.PageSummaryForEdit import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil -class FilePageViewModel(bundle: Bundle) : ViewModel() { - +class FilePageViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) } - private val allowEdit = bundle.getBoolean(FilePageActivity.INTENT_EXTRA_ALLOW_EDIT, true) - val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! + private val allowEdit = savedStateHandle[FilePageActivity.INTENT_EXTRA_ALLOW_EDIT] ?: true + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! var pageSummaryForEdit: PageSummaryForEdit? = null private val _uiState = MutableStateFlow(Resource()) @@ -102,11 +99,4 @@ class FilePageViewModel(bundle: Bundle) : ViewModel() { } } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return FilePageViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/commons/ImagePreviewDialog.kt b/app/src/main/java/org/wikipedia/commons/ImagePreviewDialog.kt index 1cd74f3c832..f87b38001b3 100644 --- a/app/src/main/java/org/wikipedia/commons/ImagePreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/commons/ImagePreviewDialog.kt @@ -26,7 +26,7 @@ class ImagePreviewDialog : ExtendedBottomSheetDialogFragment(), DialogInterface. private var _binding: DialogImagePreviewBinding? = null private val binding get() = _binding!! - private val viewModel: ImagePreviewViewModel by viewModels { ImagePreviewViewModel.Factory(requireArguments()) } + private val viewModel: ImagePreviewViewModel by viewModels() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = DialogImagePreviewBinding.inflate(inflater, container, false) diff --git a/app/src/main/java/org/wikipedia/commons/ImagePreviewViewModel.kt b/app/src/main/java/org/wikipedia/commons/ImagePreviewViewModel.kt index 673f2a6763c..d7bfbd6f89f 100644 --- a/app/src/main/java/org/wikipedia/commons/ImagePreviewViewModel.kt +++ b/app/src/main/java/org/wikipedia/commons/ImagePreviewViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.commons -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.async @@ -12,17 +11,15 @@ import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.descriptions.DescriptionEditActivity -import org.wikipedia.extensions.parcelable import org.wikipedia.suggestededits.PageSummaryForEdit import org.wikipedia.util.Resource -class ImagePreviewViewModel(bundle: Bundle) : ViewModel() { - +class ImagePreviewViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) } - var pageSummaryForEdit = bundle.parcelable(ImagePreviewDialog.ARG_SUMMARY)!! - var action = bundle.getSerializable(ImagePreviewDialog.ARG_ACTION) as DescriptionEditActivity.Action? + var pageSummaryForEdit = savedStateHandle.get(ImagePreviewDialog.ARG_SUMMARY)!! + var action = savedStateHandle.get(ImagePreviewDialog.ARG_ACTION) private val _uiState = MutableStateFlow(Resource()) val uiState = _uiState.asStateFlow() @@ -68,11 +65,4 @@ class ImagePreviewViewModel(bundle: Bundle) : ViewModel() { } } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return ImagePreviewViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt index 19f3c0a1578..8c6d0cb2389 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt @@ -77,7 +77,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M private var _binding: FragmentArticleEditDetailsBinding? = null private val binding get() = _binding!! - private val viewModel: ArticleEditDetailsViewModel by viewModels { ArticleEditDetailsViewModel.Factory(requireArguments()) } + private val viewModel: ArticleEditDetailsViewModel by viewModels() private var editHistoryInteractionEvent: EditHistoryInteractionEvent? = null private val actionBarOffsetChangedListener = diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt index 760b843142e..61802aec468 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt @@ -1,10 +1,9 @@ package org.wikipedia.diff import android.net.Uri -import android.os.Bundle import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.async @@ -23,16 +22,14 @@ import org.wikipedia.dataclient.watch.WatchPostResponse import org.wikipedia.dataclient.wikidata.EntityPostResponse import org.wikipedia.edit.Edit import org.wikipedia.edit.EditTags -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.suggestededits.provider.EditingSuggestionsProvider import org.wikipedia.util.Resource import org.wikipedia.util.SingleLiveData import org.wikipedia.watchlist.WatchlistExpiry -class ArticleEditDetailsViewModel(bundle: Bundle) : ViewModel() { - - private val invokeSource = bundle.getSerializable(Constants.INTENT_EXTRA_INVOKE_SOURCE) as InvokeSource +class ArticleEditDetailsViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + private val invokeSource = savedStateHandle.get(Constants.INTENT_EXTRA_INVOKE_SOURCE) val watchedStatus = MutableLiveData>() val rollbackRights = MutableLiveData>() @@ -46,13 +43,13 @@ class ArticleEditDetailsViewModel(bundle: Bundle) : ViewModel() { val fromRecentEdits = invokeSource == InvokeSource.SUGGESTED_EDITS_RECENT_EDITS - var pageTitle = bundle.parcelable(ArticleEditDetailsActivity.EXTRA_ARTICLE_TITLE)!! + var pageTitle = savedStateHandle.get(ArticleEditDetailsActivity.EXTRA_ARTICLE_TITLE)!! private set - var pageId = bundle.getInt(ArticleEditDetailsActivity.EXTRA_PAGE_ID, -1) + var pageId = savedStateHandle[ArticleEditDetailsActivity.EXTRA_PAGE_ID] ?: -1 private set - var revisionToId = bundle.getLong(ArticleEditDetailsActivity.EXTRA_EDIT_REVISION_TO, -1) + var revisionToId = savedStateHandle[ArticleEditDetailsActivity.EXTRA_EDIT_REVISION_TO] ?: -1L var revisionTo: MwQueryPage.Revision? = null - var revisionFromId = bundle.getLong(ArticleEditDetailsActivity.EXTRA_EDIT_REVISION_FROM, -1) + var revisionFromId = savedStateHandle[ArticleEditDetailsActivity.EXTRA_EDIT_REVISION_FROM] ?: -1L var revisionFrom: MwQueryPage.Revision? = null var canGoForward = false var hasRollbackRights = false @@ -255,11 +252,4 @@ class ArticleEditDetailsViewModel(bundle: Bundle) : ViewModel() { tags.add(tag) return tags.joinToString(",") } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return ArticleEditDetailsViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/edit/EditSectionActivity.kt b/app/src/main/java/org/wikipedia/edit/EditSectionActivity.kt index 69ab6b184a3..3049527dbcd 100644 --- a/app/src/main/java/org/wikipedia/edit/EditSectionActivity.kt +++ b/app/src/main/java/org/wikipedia/edit/EditSectionActivity.kt @@ -77,7 +77,7 @@ import java.io.IOException import java.util.concurrent.TimeUnit class EditSectionActivity : BaseActivity(), ThemeChooserDialog.Callback, EditPreviewFragment.Callback, LinkPreviewDialog.LoadPageCallback, LinkPreviewDialog.DismissCallback { - private val viewModel: EditSectionViewModel by viewModels { EditSectionViewModel.Factory(intent.extras!!) } + private val viewModel: EditSectionViewModel by viewModels() private lateinit var binding: ActivityEditSectionBinding private lateinit var textWatcher: TextWatcher diff --git a/app/src/main/java/org/wikipedia/edit/EditSectionViewModel.kt b/app/src/main/java/org/wikipedia/edit/EditSectionViewModel.kt index 6fcac52c1db..2bc5eee3f45 100644 --- a/app/src/main/java/org/wikipedia/edit/EditSectionViewModel.kt +++ b/app/src/main/java/org/wikipedia/edit/EditSectionViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.edit -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.Job @@ -16,19 +15,18 @@ import org.wikipedia.csrf.CsrfTokenClient import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.mwapi.MwServiceError import org.wikipedia.dataclient.okhttp.OkHttpConnectionFactory -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L -class EditSectionViewModel(bundle: Bundle) : ViewModel() { +class EditSectionViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { - var pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! - var invokeSource = bundle.getSerializable(Constants.INTENT_EXTRA_INVOKE_SOURCE) as Constants.InvokeSource - var sectionID = bundle.getInt(EditSectionActivity.EXTRA_SECTION_ID, -1) - var sectionAnchor = bundle.getString(EditSectionActivity.EXTRA_SECTION_ANCHOR) - var textToHighlight = bundle.getString(EditSectionActivity.EXTRA_HIGHLIGHT_TEXT) + var pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! + var invokeSource = savedStateHandle.get(Constants.INTENT_EXTRA_INVOKE_SOURCE)!! + var sectionID = savedStateHandle[EditSectionActivity.EXTRA_SECTION_ID] ?: -1 + var sectionAnchor = savedStateHandle.get(EditSectionActivity.EXTRA_SECTION_ANCHOR) + var textToHighlight = savedStateHandle.get(EditSectionActivity.EXTRA_HIGHLIGHT_TEXT) var sectionWikitext: String? = null var sectionWikitextOriginal: String? = null var tempAccountsEnabled = true @@ -144,11 +142,4 @@ class EditSectionViewModel(bundle: Bundle) : ViewModel() { _waitForRevisionState.value = Resource.Success(revision) } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return EditSectionViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaActivity.kt b/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaActivity.kt index f373374c378..535969f18d7 100644 --- a/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaActivity.kt +++ b/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaActivity.kt @@ -56,7 +56,7 @@ class InsertMediaActivity : BaseActivity() { private var actionMode: ActionMode? = null private val searchActionModeCallback = SearchCallback() - val viewModel: InsertMediaViewModel by viewModels { InsertMediaViewModel.Factory(intent.extras!!) } + val viewModel: InsertMediaViewModel by viewModels() public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt b/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt index 1c136e20920..64d5de40ff8 100644 --- a/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt +++ b/app/src/main/java/org/wikipedia/edit/insertmedia/InsertMediaViewModel.kt @@ -1,39 +1,33 @@ package org.wikipedia.edit.insertmedia -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import androidx.paging.Pager -import androidx.paging.PagingConfig -import androidx.paging.PagingSource -import androidx.paging.PagingState -import androidx.paging.cachedIn +import androidx.paging.* import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.dataclient.Service import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.staticdata.FileAliasData import org.wikipedia.util.L10nUtil import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L -class InsertMediaViewModel(bundle: Bundle) : ViewModel() { - - val invokeSource = bundle.getSerializable(Constants.INTENT_EXTRA_INVOKE_SOURCE) as Constants.InvokeSource - val wikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! - var searchQuery = StringUtil.removeHTMLTags(StringUtil.removeUnderscores(bundle.getString(InsertMediaActivity.EXTRA_SEARCH_QUERY)!!)) +class InsertMediaViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val invokeSource = savedStateHandle.get(Constants.INTENT_EXTRA_INVOKE_SOURCE)!! + val wikiSite = savedStateHandle.get(Constants.ARG_WIKISITE)!! + var searchQuery = StringUtil.removeHTMLTags(StringUtil.removeUnderscores(savedStateHandle[InsertMediaActivity.EXTRA_SEARCH_QUERY]!!)) val originalSearchQuery = searchQuery - var selectedImage = bundle.parcelable(InsertMediaActivity.EXTRA_IMAGE_TITLE) - var selectedImageSource = bundle.getString(InsertMediaActivity.EXTRA_IMAGE_SOURCE).orEmpty() - var selectedImageSourceProjects = bundle.getString(InsertMediaActivity.EXTRA_IMAGE_SOURCE_PROJECTS).orEmpty() - var imagePosition: String = bundle.getString(InsertMediaActivity.RESULT_IMAGE_POS, defaultImagePositionForLang(wikiSite.languageCode)) - var imageType: String = bundle.getString(InsertMediaActivity.RESULT_IMAGE_TYPE, IMAGE_TYPE_THUMBNAIL) - var imageSize: String = bundle.getString(InsertMediaActivity.RESULT_IMAGE_SIZE, IMAGE_SIZE_DEFAULT) + var selectedImage = savedStateHandle.get(InsertMediaActivity.EXTRA_IMAGE_TITLE) + var selectedImageSource = savedStateHandle[InsertMediaActivity.EXTRA_IMAGE_SOURCE] ?: "" + var selectedImageSourceProjects = savedStateHandle[InsertMediaActivity.EXTRA_IMAGE_SOURCE_PROJECTS] ?: "" + var imagePosition = savedStateHandle[InsertMediaActivity.RESULT_IMAGE_POS] + ?: defaultImagePositionForLang(wikiSite.languageCode) + var imageType = savedStateHandle[InsertMediaActivity.RESULT_IMAGE_TYPE] ?: IMAGE_TYPE_THUMBNAIL + var imageSize = savedStateHandle[InsertMediaActivity.RESULT_IMAGE_SIZE] ?: IMAGE_SIZE_DEFAULT val insertMediaFlow = Pager(PagingConfig(pageSize = 10)) { InsertMediaPagingSource(searchQuery) @@ -102,13 +96,6 @@ class InsertMediaViewModel(bundle: Bundle) : ViewModel() { } } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return InsertMediaViewModel(bundle) as T - } - } - class InfoboxVars( val templateNameContains: String, val imageParamName: String, diff --git a/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchActivity.kt b/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchActivity.kt index 7962a467eb2..e1067c3098d 100644 --- a/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchActivity.kt +++ b/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchActivity.kt @@ -42,7 +42,7 @@ class TemplatesSearchActivity : BaseActivity() { private var templatesSearchAdapter: TemplatesSearchAdapter? = null - val viewModel: TemplatesSearchViewModel by viewModels { TemplatesSearchViewModel.Factory(intent.extras!!) } + val viewModel: TemplatesSearchViewModel by viewModels() private val searchCloseListener = SearchView.OnCloseListener { closeSearch() diff --git a/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchViewModel.kt b/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchViewModel.kt index c977c6fa8e3..4f85e746a3e 100644 --- a/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchViewModel.kt +++ b/app/src/main/java/org/wikipedia/edit/templates/TemplatesSearchViewModel.kt @@ -1,14 +1,9 @@ package org.wikipedia.edit.templates -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import androidx.paging.Pager -import androidx.paging.PagingConfig -import androidx.paging.PagingSource -import androidx.paging.PagingState -import androidx.paging.cachedIn +import androidx.paging.* import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch @@ -16,16 +11,14 @@ import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.mwapi.TemplateDataResponse -import org.wikipedia.extensions.parcelable import org.wikipedia.page.Namespace import org.wikipedia.page.PageTitle import org.wikipedia.settings.Prefs -class TemplatesSearchViewModel(bundle: Bundle) : ViewModel() { - - val invokeSource = bundle.getSerializable(Constants.INTENT_EXTRA_INVOKE_SOURCE) as Constants.InvokeSource - val wikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! - val isFromDiff = bundle.getBoolean(TemplatesSearchActivity.EXTRA_FROM_DIFF, false) +class TemplatesSearchViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val invokeSource = savedStateHandle.get(Constants.INTENT_EXTRA_INVOKE_SOURCE)!! + val wikiSite = savedStateHandle.get(Constants.ARG_WIKISITE)!! + val isFromDiff = savedStateHandle[TemplatesSearchActivity.EXTRA_FROM_DIFF] ?: false var searchQuery: String? = null var selectedPageTitle: PageTitle? = null val searchTemplatesFlow = Pager(PagingConfig(pageSize = 10)) { @@ -77,13 +70,6 @@ class TemplatesSearchViewModel(bundle: Bundle) : ViewModel() { } } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return TemplatesSearchViewModel(bundle) as T - } - } - open class UiState { data class LoadTemplateData(val pageTitle: PageTitle, val templateData: TemplateDataResponse.TemplateData) : UiState() data class LoadError(val throwable: Throwable) : UiState() diff --git a/app/src/main/java/org/wikipedia/feed/news/NewsFragment.kt b/app/src/main/java/org/wikipedia/feed/news/NewsFragment.kt index 149b9cb09b7..b825e0a7efc 100644 --- a/app/src/main/java/org/wikipedia/feed/news/NewsFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/news/NewsFragment.kt @@ -40,7 +40,7 @@ class NewsFragment : Fragment() { private var _binding: FragmentNewsBinding? = null private val binding get() = _binding!! - private val viewModel: NewsViewModel by viewModels { NewsViewModel.Factory(requireArguments()) } + private val viewModel: NewsViewModel by viewModels() private val offsetChangedListener = AppBarLayout.OnOffsetChangedListener { layout: AppBarLayout, offset: Int -> diff --git a/app/src/main/java/org/wikipedia/feed/news/NewsViewModel.kt b/app/src/main/java/org/wikipedia/feed/news/NewsViewModel.kt index 27536bd91ce..1cbeac16780 100644 --- a/app/src/main/java/org/wikipedia/feed/news/NewsViewModel.kt +++ b/app/src/main/java/org/wikipedia/feed/news/NewsViewModel.kt @@ -1,20 +1,11 @@ package org.wikipedia.feed.news -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import org.wikipedia.Constants import org.wikipedia.dataclient.WikiSite -import org.wikipedia.extensions.parcelable -class NewsViewModel(bundle: Bundle) : ViewModel() { - val item = bundle.parcelable(NewsActivity.EXTRA_NEWS_ITEM)!! - val wiki = bundle.parcelable(Constants.ARG_WIKISITE)!! - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return NewsViewModel(bundle) as T - } - } +class NewsViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val item = savedStateHandle.get(NewsActivity.EXTRA_NEWS_ITEM)!! + val wiki = savedStateHandle.get(Constants.ARG_WIKISITE)!! } diff --git a/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayFragment.kt b/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayFragment.kt index 703dd17d6cb..f2a33d3d4e3 100644 --- a/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayFragment.kt @@ -40,7 +40,7 @@ class OnThisDayFragment : Fragment(), CustomDatePicker.Callback { private var _binding: FragmentOnThisDayBinding? = null private val binding get() = _binding!! - private val viewModel: OnThisDayViewModel by viewModels { OnThisDayViewModel.Factory(requireArguments()) } + private val viewModel: OnThisDayViewModel by viewModels() private val offsetChangedListener = AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> diff --git a/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayViewModel.kt b/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayViewModel.kt index e8b41e46b5e..abf07f6ad0a 100644 --- a/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayViewModel.kt +++ b/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.feed.onthisday -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -11,21 +10,19 @@ import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite -import org.wikipedia.extensions.parcelable import org.wikipedia.util.DateUtil import org.wikipedia.util.Resource import java.util.Calendar -class OnThisDayViewModel(bundle: Bundle) : ViewModel() { - +class OnThisDayViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) } - val wikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! - val age = bundle.getInt(OnThisDayActivity.EXTRA_AGE, 0) - val year = bundle.getInt(OnThisDayActivity.EXTRA_YEAR, 0) - val invokeSource = bundle.getSerializable(Constants.INTENT_EXTRA_INVOKE_SOURCE) as Constants.InvokeSource + val wikiSite = savedStateHandle.get(Constants.ARG_WIKISITE)!! + val age = savedStateHandle[OnThisDayActivity.EXTRA_AGE] ?: 0 + val year = savedStateHandle[OnThisDayActivity.EXTRA_YEAR] ?: 0 + val invokeSource = savedStateHandle.get(Constants.INTENT_EXTRA_INVOKE_SOURCE)!! val date = DateUtil.getDefaultDateFor(age) private val _uiState = MutableStateFlow(Resource>()) @@ -38,11 +35,4 @@ class OnThisDayViewModel(bundle: Bundle) : ViewModel() { _uiState.value = Resource.Success(response.allEvents()) } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return OnThisDayViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemFragment.kt b/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemFragment.kt index 9147d44f0a3..9031fe25e43 100644 --- a/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemFragment.kt @@ -46,7 +46,7 @@ import org.wikipedia.util.StringUtil class SuggestedEditsCardItemFragment : Fragment() { private var _binding: FragmentSuggestedEditsCardItemBinding? = null private val binding get() = _binding!! - private val viewModel: SuggestedEditsCardItemViewModel by viewModels { SuggestedEditsCardItemViewModel.Factory(requireArguments()) } + private val viewModel: SuggestedEditsCardItemViewModel by viewModels() private var itemClickable = false diff --git a/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemViewModel.kt b/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemViewModel.kt index 544d971b133..6adc4ee8dbe 100644 --- a/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemViewModel.kt +++ b/app/src/main/java/org/wikipedia/feed/suggestededits/SuggestedEditsCardItemViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.feed.suggestededits -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -21,10 +20,9 @@ import org.wikipedia.suggestededits.provider.EditingSuggestionsProvider import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil -class SuggestedEditsCardItemViewModel(bundle: Bundle) : ViewModel() { - - val age = bundle.getInt(SuggestedEditsCardItemFragment.EXTRA_AGE) - var cardActionType = bundle.getSerializable(SuggestedEditsCardItemFragment.EXTRA_ACTION_TYPE) as DescriptionEditActivity.Action +class SuggestedEditsCardItemViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val age = savedStateHandle[SuggestedEditsCardItemFragment.EXTRA_AGE] ?: 0 + var cardActionType = savedStateHandle.get(SuggestedEditsCardItemFragment.EXTRA_ACTION_TYPE)!! var sourceSummaryForEdit: PageSummaryForEdit? = null var targetSummaryForEdit: PageSummaryForEdit? = null var imageTagPage: MwQueryPage? = null @@ -198,11 +196,4 @@ class SuggestedEditsCardItemViewModel(bundle: Bundle) : ViewModel() { return EditingSuggestionsProvider .getNextImageWithMissingTags(SuggestedEditsCardItemFragment.MAX_RETRY_LIMIT) } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return SuggestedEditsCardItemViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/feed/topread/TopReadFragment.kt b/app/src/main/java/org/wikipedia/feed/topread/TopReadFragment.kt index 4159e238a15..90f17ddc914 100644 --- a/app/src/main/java/org/wikipedia/feed/topread/TopReadFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/topread/TopReadFragment.kt @@ -32,7 +32,7 @@ class TopReadFragment : Fragment() { private var _binding: FragmentMostReadBinding? = null private val binding get() = _binding!! - private val viewModel: TopReadViewModel by viewModels { TopReadViewModel.Factory(requireActivity().intent.extras!!) } + private val viewModel: TopReadViewModel by viewModels() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) diff --git a/app/src/main/java/org/wikipedia/feed/topread/TopReadViewModel.kt b/app/src/main/java/org/wikipedia/feed/topread/TopReadViewModel.kt index aeedb8659cb..2fcd93742af 100644 --- a/app/src/main/java/org/wikipedia/feed/topread/TopReadViewModel.kt +++ b/app/src/main/java/org/wikipedia/feed/topread/TopReadViewModel.kt @@ -1,18 +1,8 @@ package org.wikipedia.feed.topread -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import org.wikipedia.extensions.parcelable -class TopReadViewModel(bundle: Bundle) : ViewModel() { - val card = bundle.parcelable(TopReadArticlesActivity.TOP_READ_CARD)!! - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return TopReadViewModel(bundle) as T - } - } +class TopReadViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val card = savedStateHandle.get(TopReadArticlesActivity.TOP_READ_CARD)!! } diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt index 45e55ea38a3..9e67f4a1f4b 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.kt @@ -68,7 +68,7 @@ class GalleryActivity : BaseActivity(), LinkPreviewDialog.LoadPageCallback, Gall private lateinit var binding: ActivityGalleryBinding private lateinit var galleryAdapter: GalleryItemAdapter - private val viewModel: GalleryViewModel by viewModels { GalleryViewModel.Factory(intent.extras!!) } + private val viewModel: GalleryViewModel by viewModels() private var pageChangeListener = GalleryPageChangeListener() private var imageEditType: ImageEditType? = null private var controlsShowing = true diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt b/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt index b107f52712e..7ac9a6ddfc6 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryItemFragment.kt @@ -55,7 +55,7 @@ class GalleryItemFragment : Fragment(), MenuProvider, RequestListener private var _binding: FragmentGalleryItemBinding? = null private val binding get() = _binding!! - private val viewModel: GalleryItemViewModel by viewModels { GalleryItemViewModel.Factory(requireArguments()) } + private val viewModel: GalleryItemViewModel by viewModels() private var mediaController: MediaController? = null diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryItemViewModel.kt b/app/src/main/java/org/wikipedia/gallery/GalleryItemViewModel.kt index b9fca7ebf5f..cfed177d766 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryItemViewModel.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryItemViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.gallery -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -12,16 +11,14 @@ import org.wikipedia.Constants import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.mwapi.MwQueryPage -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.FileUtil import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil -class GalleryItemViewModel(bundle: Bundle) : ViewModel() { - - private var mediaListItem = bundle.parcelable(GalleryItemFragment.ARG_GALLERY_ITEM)!! - private val pageTitle = bundle.parcelable(Constants.ARG_TITLE) ?: PageTitle(mediaListItem.title, Constants.commonsWikiSite) +class GalleryItemViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + private var mediaListItem = savedStateHandle.get(GalleryItemFragment.ARG_GALLERY_ITEM)!! + private val pageTitle = savedStateHandle[Constants.ARG_TITLE] ?: PageTitle(mediaListItem.title, Constants.commonsWikiSite) var imageTitle = PageTitle("File:${StringUtil.removeNamespace(mediaListItem.title)}", pageTitle.wikiSite) var mediaPage: MwQueryPage? = null @@ -47,11 +44,4 @@ class GalleryItemViewModel(bundle: Bundle) : ViewModel() { _uiState.value = Resource.Success(FileUtil.isVideo(mediaPage?.imageInfo()?.mime.orEmpty())) } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return GalleryItemViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryViewModel.kt b/app/src/main/java/org/wikipedia/gallery/GalleryViewModel.kt index 4dd27afb27c..c6c0db77f64 100644 --- a/app/src/main/java/org/wikipedia/gallery/GalleryViewModel.kt +++ b/app/src/main/java/org/wikipedia/gallery/GalleryViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.gallery -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.async @@ -14,16 +13,14 @@ import org.wikipedia.commons.ImageTagsProvider import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.wikidata.Entities -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.Resource -class GalleryViewModel(bundle: Bundle) : ViewModel() { - - val pageTitle = bundle.parcelable(Constants.ARG_TITLE) - val wikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! - val revision = bundle.getLong(GalleryActivity.EXTRA_REVISION, 0) - var initialFilename = bundle.getString(GalleryActivity.EXTRA_FILENAME) +class GalleryViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE) + val wikiSite = savedStateHandle.get(Constants.ARG_WIKISITE)!! + val revision = savedStateHandle[GalleryActivity.EXTRA_REVISION] ?: 0L + var initialFilename = savedStateHandle.get(GalleryActivity.EXTRA_FILENAME) private val _uiState = MutableStateFlow(Resource()) val uiState = _uiState.asStateFlow() @@ -62,11 +59,4 @@ class GalleryViewModel(bundle: Bundle) : ViewModel() { fun getDepicts(entity: Entities.Entity?): List { return ImageTagsProvider.getDepictsClaims(entity?.getStatements().orEmpty()) } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return GalleryViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/language/LangLinksActivity.kt b/app/src/main/java/org/wikipedia/language/LangLinksActivity.kt index ee435d174f2..a39ce192cfb 100644 --- a/app/src/main/java/org/wikipedia/language/LangLinksActivity.kt +++ b/app/src/main/java/org/wikipedia/language/LangLinksActivity.kt @@ -34,7 +34,7 @@ class LangLinksActivity : BaseActivity() { private var currentSearchQuery: String? = null private var actionMode: ActionMode? = null - private val viewModel: LangLinksViewModel by viewModels { LangLinksViewModel.Factory(intent.extras!!) } + private val viewModel: LangLinksViewModel by viewModels() public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt b/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt index 74e6199f30c..d8857f47f5f 100644 --- a/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt +++ b/app/src/main/java/org/wikipedia/language/LangLinksViewModel.kt @@ -1,9 +1,8 @@ package org.wikipedia.language -import android.os.Bundle import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.launch @@ -12,15 +11,14 @@ import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.mwapi.SiteMatrix -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.staticdata.MainPageNameData import org.wikipedia.util.Resource import org.wikipedia.util.SingleLiveData import org.wikipedia.util.log.L -class LangLinksViewModel(bundle: Bundle) : ViewModel() { - var pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! +class LangLinksViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + private val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! val languageEntries = MutableLiveData>>() val languageEntryVariantUpdate = SingleLiveData>() @@ -114,13 +112,6 @@ class LangLinksViewModel(bundle: Bundle) : ViewModel() { .ifEmpty { WikipediaApp.instance.languageState.getAppLanguageCanonicalName(code) } } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return LangLinksViewModel(bundle) as T - } - } - companion object { fun addVariantEntriesIfNeeded(language: AppLanguageState, title: PageTitle, languageEntries: MutableList) { val parentLanguageCode = language.getDefaultLanguageCode(title.wikiSite.languageCode) diff --git a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt index 1e1e34c185a..f8bed60842d 100644 --- a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt +++ b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt @@ -65,7 +65,7 @@ class EditHistoryListActivity : BaseActivity() { private val editHistoryEmptyMessagesAdapter = EmptyMessagesAdapter() private val loadHeader = LoadingItemAdapter { editHistoryListAdapter.retry() } private val loadFooter = LoadingItemAdapter { editHistoryListAdapter.retry() } - private val viewModel: EditHistoryListViewModel by viewModels { EditHistoryListViewModel.Factory(intent.extras!!) } + private val viewModel: EditHistoryListViewModel by viewModels() private var actionMode: ActionMode? = null private val searchActionModeCallback = SearchCallback() private var editHistoryInteractionEvent: EditHistoryInteractionEvent? = null diff --git a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListViewModel.kt b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListViewModel.kt index c2b4633c7e2..78ada8aa7aa 100644 --- a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListViewModel.kt +++ b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListViewModel.kt @@ -1,9 +1,8 @@ package org.wikipedia.page.edithistory -import android.os.Bundle import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.paging.* import kotlinx.coroutines.* @@ -14,7 +13,6 @@ import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.mwapi.MwQueryPage import org.wikipedia.dataclient.restbase.EditCount import org.wikipedia.dataclient.restbase.Metrics -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.settings.Prefs import org.wikipedia.util.DateUtil @@ -22,12 +20,12 @@ import org.wikipedia.util.Resource import org.wikipedia.util.log.L import retrofit2.HttpException import java.io.IOException -import java.util.* +import java.util.Calendar -class EditHistoryListViewModel(bundle: Bundle) : ViewModel() { +class EditHistoryListViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { val editHistoryStatsData = MutableLiveData>() - var pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! var pageId = -1 private set var comparing = false @@ -192,13 +190,6 @@ class EditHistoryListViewModel(bundle: Bundle) : ViewModel() { class EditHistoryStats(val revision: MwQueryPage.Revision, val metrics: List, val allEdits: EditCount, val userEdits: EditCount, val anonEdits: EditCount, val botEdits: EditCount) : EditHistoryItemModel() - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return EditHistoryListViewModel(bundle) as T - } - } - companion object { const val SELECT_INACTIVE = 0 const val SELECT_NONE = 1 diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt index 44221f34db5..e7d82ca5741 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.kt @@ -76,7 +76,7 @@ class LinkPreviewDialog : ExtendedBottomSheetDialogFragment(), LinkPreviewErrorV private var overlayView: LinkPreviewOverlayView? = null private var navigateSuccess = false private var revision: Long = 0 - private val viewModel: LinkPreviewViewModel by viewModels { LinkPreviewViewModel.Factory(requireArguments()) } + private val viewModel: LinkPreviewViewModel by viewModels() private val menuListener = PopupMenu.OnMenuItemClickListener { item -> return@OnMenuItemClickListener when (item.itemId) { diff --git a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewViewModel.kt b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewViewModel.kt index 440d09521f2..e43e164c3a7 100644 --- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewViewModel.kt +++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewViewModel.kt @@ -1,9 +1,8 @@ package org.wikipedia.page.linkpreview import android.location.Location -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.async @@ -14,21 +13,20 @@ import org.wikipedia.analytics.eventplatform.WatchlistAnalyticsHelper import org.wikipedia.auth.AccountUtil import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.ServiceFactory -import org.wikipedia.extensions.parcelable import org.wikipedia.history.HistoryEntry import org.wikipedia.page.PageTitle import org.wikipedia.settings.Prefs import org.wikipedia.util.log.L import org.wikipedia.watchlist.WatchlistExpiry -class LinkPreviewViewModel(bundle: Bundle) : ViewModel() { +class LinkPreviewViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val _uiState = MutableStateFlow(LinkPreviewViewState.Loading) val uiState = _uiState.asStateFlow() - val historyEntry = bundle.parcelable(LinkPreviewDialog.ARG_ENTRY)!! + val historyEntry = savedStateHandle.get(LinkPreviewDialog.ARG_ENTRY)!! var pageTitle = historyEntry.title - var location = bundle.parcelable(LinkPreviewDialog.ARG_LOCATION) + var location = savedStateHandle.get(LinkPreviewDialog.ARG_LOCATION) val fromPlaces = historyEntry.source == HistoryEntry.SOURCE_PLACES - val lastKnownLocation = bundle.parcelable(LinkPreviewDialog.ARG_LAST_KNOWN_LOCATION) + val lastKnownLocation = savedStateHandle.get(LinkPreviewDialog.ARG_LAST_KNOWN_LOCATION) var isInReadingList = false var isWatched = false @@ -131,11 +129,4 @@ class LinkPreviewViewModel(bundle: Bundle) : ViewModel() { } } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return LinkPreviewViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/places/PlacesFragment.kt b/app/src/main/java/org/wikipedia/places/PlacesFragment.kt index 6854b0bee19..944f612f31f 100644 --- a/app/src/main/java/org/wikipedia/places/PlacesFragment.kt +++ b/app/src/main/java/org/wikipedia/places/PlacesFragment.kt @@ -107,7 +107,7 @@ class PlacesFragment : Fragment(), LinkPreviewDialog.LoadPageCallback, LinkPrevi private var statusBarInsets: Insets? = null private var navBarInsets: Insets? = null - private val viewModel: PlacesFragmentViewModel by viewModels { PlacesFragmentViewModel.Factory(requireArguments()) } + private val viewModel: PlacesFragmentViewModel by viewModels() private var mapboxMap: MapLibreMap? = null private var symbolManager: SymbolManager? = null diff --git a/app/src/main/java/org/wikipedia/places/PlacesFragmentViewModel.kt b/app/src/main/java/org/wikipedia/places/PlacesFragmentViewModel.kt index c62f7f8b3fc..46a0f287ceb 100644 --- a/app/src/main/java/org/wikipedia/places/PlacesFragmentViewModel.kt +++ b/app/src/main/java/org/wikipedia/places/PlacesFragmentViewModel.kt @@ -1,10 +1,9 @@ package org.wikipedia.places import android.location.Location -import android.os.Bundle import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.launch @@ -12,17 +11,15 @@ import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.NearbyPage -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.settings.Prefs import org.wikipedia.util.ImageUrlUtil import org.wikipedia.util.Resource -class PlacesFragmentViewModel(bundle: Bundle) : ViewModel() { - +class PlacesFragmentViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { val wikiSite: WikiSite get() = WikiSite.forLanguageCode(Prefs.placesWikiCode) - var location: Location? = bundle.parcelable(PlacesActivity.EXTRA_LOCATION) - var highlightedPageTitle: PageTitle? = bundle.parcelable(Constants.ARG_TITLE) + var location: Location? = savedStateHandle[PlacesActivity.EXTRA_LOCATION] + var highlightedPageTitle: PageTitle? = savedStateHandle[Constants.ARG_TITLE] var lastKnownLocation: Location? = null val nearbyPagesLiveData = MutableLiveData>>() @@ -47,11 +44,4 @@ class PlacesFragmentViewModel(bundle: Bundle) : ViewModel() { nearbyPagesLiveData.postValue(Resource.Success(pages)) } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return PlacesFragmentViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/random/RandomFragment.kt b/app/src/main/java/org/wikipedia/random/RandomFragment.kt index 0f885c3664c..2a370e62452 100644 --- a/app/src/main/java/org/wikipedia/random/RandomFragment.kt +++ b/app/src/main/java/org/wikipedia/random/RandomFragment.kt @@ -39,7 +39,7 @@ class RandomFragment : Fragment() { private var _binding: FragmentRandomBinding? = null private val binding get() = _binding!! - private val viewModel: RandomViewModel by viewModels { RandomViewModel.Factory(requireArguments()) } + private val viewModel: RandomViewModel by viewModels() private val viewPagerListener = ViewPagerListener() private val topTitle get() = getTopChild()?.title diff --git a/app/src/main/java/org/wikipedia/random/RandomItemFragment.kt b/app/src/main/java/org/wikipedia/random/RandomItemFragment.kt index e97c0b3d1db..fcb91d03048 100644 --- a/app/src/main/java/org/wikipedia/random/RandomItemFragment.kt +++ b/app/src/main/java/org/wikipedia/random/RandomItemFragment.kt @@ -27,7 +27,7 @@ class RandomItemFragment : Fragment() { private var _binding: FragmentRandomItemBinding? = null private val binding get() = _binding!! - private val viewModel: RandomItemViewModel by viewModels { RandomItemViewModel.Factory(requireArguments()) } + private val viewModel: RandomItemViewModel by viewModels() val isLoadComplete: Boolean get() = viewModel.summary != null val title: PageTitle? get() = viewModel.summary?.getPageTitle(viewModel.wikiSite) diff --git a/app/src/main/java/org/wikipedia/random/RandomItemViewModel.kt b/app/src/main/java/org/wikipedia/random/RandomItemViewModel.kt index be1ab2caf55..4236c83b545 100644 --- a/app/src/main/java/org/wikipedia/random/RandomItemViewModel.kt +++ b/app/src/main/java/org/wikipedia/random/RandomItemViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.random -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -12,15 +11,13 @@ import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary -import org.wikipedia.extensions.parcelable import org.wikipedia.util.Resource -class RandomItemViewModel(bundle: Bundle) : ViewModel() { - +class RandomItemViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) } - val wikiSite: WikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! + val wikiSite = savedStateHandle.get(Constants.ARG_WIKISITE)!! var summary: PageSummary? = null private val _uiState = MutableStateFlow(Resource()) @@ -37,11 +34,4 @@ class RandomItemViewModel(bundle: Bundle) : ViewModel() { _uiState.value = Resource.Success(summary) } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return RandomItemViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/random/RandomViewModel.kt b/app/src/main/java/org/wikipedia/random/RandomViewModel.kt index 8e43d5b6cf3..e418c29bff2 100644 --- a/app/src/main/java/org/wikipedia/random/RandomViewModel.kt +++ b/app/src/main/java/org/wikipedia/random/RandomViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.random -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -11,16 +10,14 @@ import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.WikiSite -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.Resource -class RandomViewModel(bundle: Bundle) : ViewModel() { - +class RandomViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) } - val wikiSite: WikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! + val wikiSite = savedStateHandle.get(Constants.ARG_WIKISITE)!! var saveButtonState = false private val _uiState = MutableStateFlow(Resource()) @@ -33,11 +30,4 @@ class RandomViewModel(bundle: Bundle) : ViewModel() { _uiState.value = Resource.Success(inAnyList) } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return RandomViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentFragment.kt b/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentFragment.kt index 40872f532c4..32dcf8af23e 100644 --- a/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentFragment.kt +++ b/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentFragment.kt @@ -31,7 +31,7 @@ import org.wikipedia.util.log.L class RecommendedContentFragment : Fragment() { private var _binding: FragmentRecommendedContentBinding? = null private val binding get() = _binding!! - private val viewModel: RecommendedContentViewModel by viewModels { RecommendedContentViewModel.Factory(requireArguments()) } + private val viewModel: RecommendedContentViewModel by viewModels() private val parentSearchFragment get() = requireParentFragment().requireParentFragment() as SearchFragment diff --git a/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentViewModel.kt b/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentViewModel.kt index 9741590abe3..b645f49f525 100644 --- a/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentViewModel.kt +++ b/app/src/main/java/org/wikipedia/recommendedcontent/RecommendedContentViewModel.kt @@ -1,9 +1,8 @@ package org.wikipedia.recommendedcontent import android.location.Location -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.Dispatchers @@ -21,7 +20,6 @@ import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary -import org.wikipedia.extensions.parcelable import org.wikipedia.feed.aggregated.AggregatedFeedContent import org.wikipedia.feed.topread.TopRead import org.wikipedia.page.PageTitle @@ -34,10 +32,9 @@ import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil import java.util.Date -class RecommendedContentViewModel(bundle: Bundle) : ViewModel() { - - var wikiSite = bundle.parcelable(Constants.ARG_WIKISITE)!! - private val isGeneralized = bundle.getBoolean(Constants.ARG_BOOLEAN) +class RecommendedContentViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + var wikiSite = savedStateHandle.get(Constants.ARG_WIKISITE)!! + private val isGeneralized = savedStateHandle[Constants.ARG_BOOLEAN] ?: false private var moreLikeTerm: String? = null private var feedContent = mutableMapOf() @@ -232,13 +229,6 @@ class RecommendedContentViewModel(bundle: Bundle) : ViewModel() { } } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return RecommendedContentViewModel(bundle) as T - } - } - companion object { const val RECOMMENDED_CONTENT_ITEMS = 10 const val RECENT_SEARCHES_ITEMS = 3 diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt index 48aa12d3eb2..810606febdc 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt @@ -50,7 +50,7 @@ class SuggestedEditsCardsFragment : Fragment(), MenuProvider, SuggestedEditsItem private var _binding: FragmentSuggestedEditsCardsBinding? = null private val binding get() = _binding!! - private val viewModel: SuggestedEditsCardsViewModel by viewModels { SuggestedEditsCardsViewModel.Factory(requireArguments()) } + private val viewModel: SuggestedEditsCardsViewModel by viewModels() private val viewPagerListener = ViewPagerListener() private val app = WikipediaApp.instance private var swappingLanguageSpinners: Boolean = false diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsViewModel.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsViewModel.kt index e92cf3b0d4f..439af50afed 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsViewModel.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.suggestededits -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -15,11 +14,10 @@ import org.wikipedia.dataclient.mwapi.SiteMatrix import org.wikipedia.descriptions.DescriptionEditActivity import org.wikipedia.util.Resource -class SuggestedEditsCardsViewModel(bundle: Bundle) : ViewModel() { - +class SuggestedEditsCardsViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { var langFromCode = WikipediaApp.instance.languageState.appLanguageCode var langToCode = WikipediaApp.instance.languageState.appLanguageCodes.getOrElse(1) { "" } - var action = bundle.getSerializable(Constants.INTENT_EXTRA_ACTION) as DescriptionEditActivity.Action + var action = savedStateHandle.get(Constants.INTENT_EXTRA_ACTION)!! private val _uiState = MutableStateFlow(Resource>()) val uiState = _uiState.asStateFlow() @@ -46,11 +44,4 @@ class SuggestedEditsCardsViewModel(bundle: Bundle) : ViewModel() { _uiState.value = Resource.Success(list) } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return SuggestedEditsCardsViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragment.kt index e832aaa0c61..a7a7332975e 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragment.kt @@ -61,8 +61,7 @@ class SuggestedEditsImageRecsFragment : SuggestedEditsItemFragment(), MenuProvid private var _binding: FragmentSuggestedEditsImageRecsItemBinding? = null private val binding get() = _binding!! - private val viewModel: SuggestedEditsImageRecsFragmentViewModel by viewModels { SuggestedEditsImageRecsFragmentViewModel.Factory( - bundleOf(ARG_LANG to WikipediaApp.instance.appOrSystemLanguageCode)) } + private val viewModel: SuggestedEditsImageRecsFragmentViewModel by viewModels() private var infoClicked = false private var scrolled = false @@ -464,7 +463,9 @@ class SuggestedEditsImageRecsFragment : SuggestedEditsItemFragment(), MenuProvid const val MIN_TIME_WARNING_MILLIS = 5000 fun newInstance(): SuggestedEditsItemFragment { - return SuggestedEditsImageRecsFragment() + return SuggestedEditsImageRecsFragment().apply { + arguments = bundleOf(ARG_LANG to WikipediaApp.instance.appOrSystemLanguageCode) + } } } } diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt index 0d524c48863..69b0cadec29 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsImageRecsFragmentViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.suggestededits -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.Dispatchers @@ -32,8 +31,7 @@ import org.wikipedia.util.UriUtil import org.wikipedia.util.log.L import java.io.IOException -class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { - +class SuggestedEditsImageRecsFragmentViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) } @@ -44,7 +42,7 @@ class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { lateinit var recommendedImageTitle: PageTitle var attemptInsertInfobox = false - val langCode = bundle.getString(SuggestedEditsImageRecsFragment.ARG_LANG)!! + val langCode = savedStateHandle.get(SuggestedEditsImageRecsFragment.ARG_LANG)!! private val _uiState = MutableStateFlow(Resource()) val uiState = _uiState.asStateFlow() @@ -151,12 +149,5 @@ class SuggestedEditsImageRecsFragmentViewModel(bundle: Bundle) : ViewModel() { } } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return SuggestedEditsImageRecsFragmentViewModel(bundle) as T - } - } - class Depleted : Resource() } diff --git a/app/src/main/java/org/wikipedia/talk/ArchivedTalkPagesActivity.kt b/app/src/main/java/org/wikipedia/talk/ArchivedTalkPagesActivity.kt index ef4c2aa3da1..5a9466fb72c 100644 --- a/app/src/main/java/org/wikipedia/talk/ArchivedTalkPagesActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/ArchivedTalkPagesActivity.kt @@ -30,7 +30,8 @@ import org.wikipedia.page.LinkMovementMethodExt import org.wikipedia.page.PageActivity import org.wikipedia.page.PageTitle import org.wikipedia.readinglist.database.ReadingList -import org.wikipedia.util.* +import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.StringUtil import org.wikipedia.views.DrawableItemDecoration import org.wikipedia.views.PageItemView import org.wikipedia.views.ViewUtil @@ -45,7 +46,7 @@ class ArchivedTalkPagesActivity : BaseActivity() { private val archivedTalkPagesConcatAdapter = archivedTalkPagesAdapter.withLoadStateHeaderAndFooter(archivedTalkPagesLoadHeader, archivedTalkPagesLoadFooter) private val itemCallback = ItemCallback() - private val viewModel: ArchivedTalkPagesViewModel by viewModels { ArchivedTalkPagesViewModel.Factory(intent.extras!!) } + private val viewModel: ArchivedTalkPagesViewModel by viewModels() public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/org/wikipedia/talk/ArchivedTalkPagesViewModel.kt b/app/src/main/java/org/wikipedia/talk/ArchivedTalkPagesViewModel.kt index f92f7976a59..31bd7b24acc 100644 --- a/app/src/main/java/org/wikipedia/talk/ArchivedTalkPagesViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/ArchivedTalkPagesViewModel.kt @@ -1,18 +1,16 @@ package org.wikipedia.talk -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.paging.* import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle -class ArchivedTalkPagesViewModel(bundle: Bundle) : ViewModel() { - val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! +class ArchivedTalkPagesViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! val archivedTalkPagesFlow = Pager(PagingConfig(pageSize = 10)) { ArchivedTalkPagesPagingSource(pageTitle) }.flow.cachedIn(viewModelScope) @@ -46,11 +44,4 @@ class ArchivedTalkPagesViewModel(bundle: Bundle) : ViewModel() { return null } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return ArchivedTalkPagesViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt index 0d31e6e7506..b679414e0b5 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyActivity.kt @@ -57,7 +57,7 @@ class TalkReplyActivity : BaseActivity(), UserMentionInputView.Listener, EditPre private lateinit var textWatcher: TextWatcher private lateinit var messagePreviewFragment: EditPreviewFragment - val viewModel: TalkReplyViewModel by viewModels { TalkReplyViewModel.Factory(intent.extras!!) } + val viewModel: TalkReplyViewModel by viewModels() private var userMentionScrolled = false private var shouldWatchText = true private var subjectOrBodyModified = false diff --git a/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt b/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt index 7270da76c0a..c24dfa095ab 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkReplyViewModel.kt @@ -1,9 +1,8 @@ package org.wikipedia.talk -import android.os.Bundle import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.launch @@ -12,7 +11,6 @@ import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.discussiontools.ThreadItem import org.wikipedia.edit.EditTags -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.talk.db.TalkTemplate import org.wikipedia.talk.template.TalkTemplatesRepository @@ -20,20 +18,20 @@ import org.wikipedia.util.Resource import org.wikipedia.util.SingleLiveData import org.wikipedia.util.log.L -class TalkReplyViewModel(bundle: Bundle) : ViewModel() { +class TalkReplyViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val talkTemplatesRepository = TalkTemplatesRepository(AppDatabase.instance.talkTemplateDao()) var talkTemplateSaved = false val talkTemplatesList = mutableListOf() - val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! - val topic = bundle.parcelable(TalkReplyActivity.EXTRA_TOPIC) - val isFromDiff = bundle.getBoolean(TalkReplyActivity.EXTRA_FROM_DIFF, false) - val selectedTemplate = bundle.parcelable(TalkReplyActivity.EXTRA_SELECTED_TEMPLATE) - val isExampleTemplate = bundle.getBoolean(TalkReplyActivity.EXTRA_EXAMPLE_TEMPLATE, false) - val templateManagementMode = bundle.getBoolean(TalkReplyActivity.EXTRA_TEMPLATE_MANAGEMENT, false) - val fromRevisionId = bundle.getLong(TalkReplyActivity.FROM_REVISION_ID, -1) - val toRevisionId = bundle.getLong(TalkReplyActivity.TO_REVISION_ID, -1) + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! + val topic = savedStateHandle.get(TalkReplyActivity.EXTRA_TOPIC) + val isFromDiff = savedStateHandle[TalkReplyActivity.EXTRA_FROM_DIFF] ?: false + val selectedTemplate = savedStateHandle.get(TalkReplyActivity.EXTRA_SELECTED_TEMPLATE) + val isExampleTemplate = savedStateHandle[TalkReplyActivity.EXTRA_EXAMPLE_TEMPLATE] ?: false + val templateManagementMode = savedStateHandle[TalkReplyActivity.EXTRA_TEMPLATE_MANAGEMENT] ?: false + val fromRevisionId = savedStateHandle[TalkReplyActivity.FROM_REVISION_ID] ?: -1L + val toRevisionId = savedStateHandle[TalkReplyActivity.TO_REVISION_ID] ?: -1L val isNewTopic = topic == null && !isFromDiff val postReplyData = SingleLiveData>() @@ -114,11 +112,4 @@ class TalkReplyViewModel(bundle: Bundle) : ViewModel() { saveTemplateData.postValue(Resource.Success(talkTemplate)) } } - - class Factory(val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return TalkReplyViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt b/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt index ee37c21c46e..029a1a4b667 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkTopicActivity.kt @@ -51,7 +51,7 @@ class TalkTopicActivity : BaseActivity() { private lateinit var binding: ActivityTalkTopicBinding private lateinit var linkHandler: TalkLinkHandler - private val viewModel: TalkTopicViewModel by viewModels { TalkTopicViewModel.Factory(intent.extras!!) } + private val viewModel: TalkTopicViewModel by viewModels() private val threadAdapter = TalkReplyItemAdapter() private val headerAdapter = HeaderItemAdapter() private var actionMode: ActionMode? = null diff --git a/app/src/main/java/org/wikipedia/talk/TalkTopicViewModel.kt b/app/src/main/java/org/wikipedia/talk/TalkTopicViewModel.kt index 88fdbef210f..9561bba6174 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkTopicViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkTopicViewModel.kt @@ -1,9 +1,8 @@ package org.wikipedia.talk -import android.os.Bundle import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.recyclerview.widget.DiffUtil import kotlinx.coroutines.CoroutineExceptionHandler @@ -15,7 +14,6 @@ import org.wikipedia.database.AppDatabase import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.discussiontools.ThreadItem import org.wikipedia.dataclient.okhttp.OfflineCacheInterceptor -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.settings.Prefs import org.wikipedia.talk.db.TalkPageSeen @@ -23,12 +21,12 @@ import org.wikipedia.util.Resource import org.wikipedia.util.SingleLiveData import org.wikipedia.util.UriUtil -class TalkTopicViewModel(bundle: Bundle) : ViewModel() { - private val topicName = bundle.getString(TalkTopicActivity.EXTRA_TOPIC_NAME)!! - private val topicId = bundle.getString(TalkTopicActivity.EXTRA_TOPIC_ID)!! - val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! - var currentSearchQuery = bundle.getString(TalkTopicActivity.EXTRA_SEARCH_QUERY) - var scrollTargetId = bundle.getString(TalkTopicActivity.EXTRA_REPLY_ID) +class TalkTopicViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + private val topicName = savedStateHandle.get(TalkTopicActivity.EXTRA_TOPIC_NAME)!! + private val topicId = savedStateHandle.get(TalkTopicActivity.EXTRA_TOPIC_ID)!! + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! + var currentSearchQuery = savedStateHandle.get(TalkTopicActivity.EXTRA_SEARCH_QUERY) + var scrollTargetId = savedStateHandle.get(TalkTopicActivity.EXTRA_REPLY_ID) private val threadItems = mutableListOf() var topic: ThreadItem? = null @@ -187,11 +185,4 @@ class TalkTopicViewModel(bundle: Bundle) : ViewModel() { } } } - - class Factory(val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return TalkTopicViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt index 8b81c346f29..eb68affb5e0 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesFragment.kt @@ -51,7 +51,7 @@ import org.wikipedia.views.ViewUtil class TalkTemplatesFragment : Fragment() { private var _binding: FragmentTalkTemplatesBinding? = null - private val viewModel: TalkTemplatesViewModel by viewModels { TalkTemplatesViewModel.Factory(requireArguments()) } + private val viewModel: TalkTemplatesViewModel by viewModels() private val binding get() = _binding!! private lateinit var itemTouchHelper: ItemTouchHelper diff --git a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt index d08911aa28d..e553de39a4c 100644 --- a/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt +++ b/app/src/main/java/org/wikipedia/talk/template/TalkTemplatesViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.talk.template -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -11,7 +10,6 @@ import kotlinx.coroutines.launch import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.database.AppDatabase -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.talk.TalkReplyActivity import org.wikipedia.talk.TalkReplyActivity.Companion.EXTRA_TEMPLATE_MANAGEMENT @@ -20,8 +18,7 @@ import org.wikipedia.util.L10nUtil import org.wikipedia.util.Resource import java.util.Collections -class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { - +class TalkTemplatesViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val talkTemplatesRepository = TalkTemplatesRepository(AppDatabase.instance.talkTemplateDao()) private val exceptionHandler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) @@ -38,10 +35,10 @@ class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { private val _actionState = MutableStateFlow(ActionState()) val actionState = _actionState.asStateFlow() - val templateManagementMode = bundle.getBoolean(EXTRA_TEMPLATE_MANAGEMENT, false) - val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! - val fromRevisionId = bundle.getLong(TalkReplyActivity.FROM_REVISION_ID) - val toRevisionId = bundle.getLong(TalkReplyActivity.TO_REVISION_ID) + val templateManagementMode = savedStateHandle[EXTRA_TEMPLATE_MANAGEMENT] ?: false + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! + val fromRevisionId = savedStateHandle[TalkReplyActivity.FROM_REVISION_ID] ?: 0L + val toRevisionId = savedStateHandle[TalkReplyActivity.TO_REVISION_ID] ?: 0L init { loadTalkTemplates() @@ -108,13 +105,6 @@ class TalkTemplatesViewModel(bundle: Bundle) : ViewModel() { class Error(val throwable: Throwable) : ActionState() } - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return TalkTemplatesViewModel(bundle) as T - } - } - companion object { // This is for data analytics only private val savedMessagesTitleList = listOf("", "vandalism", "edit_tests", "neutral", "translation", "conflict_interest", "final", "copyright", "leave_summary", "no_censor", "improvement") diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserContribListActivity.kt b/app/src/main/java/org/wikipedia/usercontrib/UserContribListActivity.kt index 81b02825774..e7e43d6a37d 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserContribListActivity.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserContribListActivity.kt @@ -63,7 +63,7 @@ class UserContribListActivity : BaseActivity() { private val userContribEmptyMessagesAdapter = EmptyMessagesAdapter() private val loadHeader = LoadingItemAdapter { userContribListAdapter.retry() } private val loadFooter = LoadingItemAdapter { userContribListAdapter.retry() } - private val viewModel: UserContribListViewModel by viewModels { UserContribListViewModel.Factory(intent.extras!!) } + private val viewModel: UserContribListViewModel by viewModels() private var actionMode: ActionMode? = null private val searchActionModeCallback = SearchCallback() diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt b/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt index 6289ee4c672..38a9a23051a 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt @@ -1,18 +1,10 @@ package org.wikipedia.usercontrib -import android.os.Bundle import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import androidx.paging.Pager -import androidx.paging.PagingConfig -import androidx.paging.PagingSource -import androidx.paging.PagingState -import androidx.paging.cachedIn -import androidx.paging.filter -import androidx.paging.insertSeparators -import androidx.paging.map +import androidx.paging.* import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch @@ -29,12 +21,11 @@ import retrofit2.HttpException import java.io.IOException import java.util.Date -class UserContribListViewModel(bundle: Bundle) : ViewModel() { - +class UserContribListViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { val userContribStatsData = MutableLiveData>() - var userName: String = bundle.getString(UserContribListActivity.INTENT_EXTRA_USER_NAME)!! - var langCode: String = Prefs.userContribFilterLangCode + var userName = savedStateHandle.get(UserContribListActivity.INTENT_EXTRA_USER_NAME)!! + var langCode = Prefs.userContribFilterLangCode val wikiSite get(): WikiSite { return when (langCode) { @@ -135,11 +126,4 @@ class UserContribListViewModel(bundle: Bundle) : ViewModel() { class UserContribItem(val item: UserContribution) : UserContribItemModel() class UserContribSeparator(val date: String) : UserContribItemModel() class UserContribStats(val totalEdits: Int, val registrationDate: Date, val projectName: String) : UserContribItemModel() - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return UserContribListViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt index 0be41881d52..9950e005757 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt @@ -26,7 +26,7 @@ import java.util.Date class UserInformationDialog : DialogFragment() { - private val viewModel: UserInformationDialogViewModel by viewModels { UserInformationDialogViewModel.Factory(requireArguments()) } + private val viewModel: UserInformationDialogViewModel by viewModels() private var _binding: DialogUserInformationBinding? = null private val binding get() = _binding!! diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt index e014919be9e..b9aecd1e59f 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt @@ -1,21 +1,20 @@ package org.wikipedia.usercontrib -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.util.Resource -import java.util.* +import java.util.Date -class UserInformationDialogViewModel(bundle: Bundle) : ViewModel() { - - var userName: String = bundle.getString(UserInformationDialog.USERNAME_ARG)!! +class UserInformationDialogViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + var userName = savedStateHandle.get(UserInformationDialog.USERNAME_ARG)!! private val _uiState = MutableStateFlow(Resource>()) val uiState = _uiState.asStateFlow() @@ -38,11 +37,4 @@ class UserInformationDialogViewModel(bundle: Bundle) : ViewModel() { } } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return UserInformationDialogViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/watchlist/WatchlistExpiryDialog.kt b/app/src/main/java/org/wikipedia/watchlist/WatchlistExpiryDialog.kt index 4fccd219841..8a5b4645786 100644 --- a/app/src/main/java/org/wikipedia/watchlist/WatchlistExpiryDialog.kt +++ b/app/src/main/java/org/wikipedia/watchlist/WatchlistExpiryDialog.kt @@ -29,7 +29,7 @@ class WatchlistExpiryDialog : ExtendedBottomSheetDialogFragment() { fun onExpiryChanged(expiry: WatchlistExpiry) } - private val viewModel: WatchlistExpiryDialogViewModel by viewModels { WatchlistExpiryDialogViewModel.Factory(requireArguments()) } + private val viewModel: WatchlistExpiryDialogViewModel by viewModels() private var _binding: DialogWatchlistExpiryBinding? = null private val binding get() = _binding!! private lateinit var expiryOptions: Array diff --git a/app/src/main/java/org/wikipedia/watchlist/WatchlistExpiryDialogViewModel.kt b/app/src/main/java/org/wikipedia/watchlist/WatchlistExpiryDialogViewModel.kt index c15f89c0f7d..faf64f9a541 100644 --- a/app/src/main/java/org/wikipedia/watchlist/WatchlistExpiryDialogViewModel.kt +++ b/app/src/main/java/org/wikipedia/watchlist/WatchlistExpiryDialogViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.watchlist -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -10,17 +9,16 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.wikipedia.analytics.eventplatform.WatchlistAnalyticsHelper import org.wikipedia.dataclient.ServiceFactory -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.Resource -class WatchlistExpiryDialogViewModel(bundle: Bundle) : ViewModel() { +class WatchlistExpiryDialogViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) } - var pageTitle = bundle.parcelable(WatchlistExpiryDialog.ARG_PAGE_TITLE)!! - var expiry = bundle.getSerializable(WatchlistExpiryDialog.ARG_EXPIRY) as WatchlistExpiry + var pageTitle = savedStateHandle.get(WatchlistExpiryDialog.ARG_PAGE_TITLE)!! + var expiry = savedStateHandle.get(WatchlistExpiryDialog.ARG_EXPIRY)!! private val _uiState = MutableStateFlow(Resource()) val uiState = _uiState.asStateFlow() @@ -37,11 +35,4 @@ class WatchlistExpiryDialogViewModel(bundle: Bundle) : ViewModel() { } } } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return WatchlistExpiryDialogViewModel(bundle) as T - } - } } diff --git a/app/src/main/java/org/wikipedia/wiktionary/WiktionaryDialog.kt b/app/src/main/java/org/wikipedia/wiktionary/WiktionaryDialog.kt index 6ca79e11a98..deb49c7b25d 100644 --- a/app/src/main/java/org/wikipedia/wiktionary/WiktionaryDialog.kt +++ b/app/src/main/java/org/wikipedia/wiktionary/WiktionaryDialog.kt @@ -32,7 +32,7 @@ class WiktionaryDialog : ExtendedBottomSheetDialogFragment() { private var _binding: DialogWiktionaryBinding? = null private val binding get() = _binding!! - private val viewModel: WiktionaryViewModel by viewModels { WiktionaryViewModel.Factory(requireArguments()) } + private val viewModel: WiktionaryViewModel by viewModels() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { diff --git a/app/src/main/java/org/wikipedia/wiktionary/WiktionaryViewModel.kt b/app/src/main/java/org/wikipedia/wiktionary/WiktionaryViewModel.kt index 7ce4a2ed282..bfcc792851d 100644 --- a/app/src/main/java/org/wikipedia/wiktionary/WiktionaryViewModel.kt +++ b/app/src/main/java/org/wikipedia/wiktionary/WiktionaryViewModel.kt @@ -1,8 +1,7 @@ package org.wikipedia.wiktionary -import android.os.Bundle +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow @@ -12,21 +11,19 @@ import org.wikipedia.Constants import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.restbase.RbDefinition -import org.wikipedia.extensions.parcelable import org.wikipedia.page.PageTitle import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil import org.wikipedia.util.log.L import java.util.Locale -class WiktionaryViewModel(bundle: Bundle) : ViewModel() { - +class WiktionaryViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { private val handler = CoroutineExceptionHandler { _, throwable -> _uiState.value = Resource.Error(throwable) } - val pageTitle = bundle.parcelable(Constants.ARG_TITLE)!! - var selectedText = bundle.getString(Constants.ARG_TEXT) + val pageTitle = savedStateHandle.get(Constants.ARG_TITLE)!! + var selectedText = savedStateHandle.get(Constants.ARG_TEXT) private val _uiState = MutableStateFlow(Resource>()) val uiState = _uiState.asStateFlow() @@ -67,11 +64,4 @@ class WiktionaryViewModel(bundle: Bundle) : ViewModel() { private fun definitionsNotFound() { _uiState.value = Resource.Error(Throwable("Definitions not found.")) } - - class Factory(private val bundle: Bundle) : ViewModelProvider.Factory { - @Suppress("unchecked_cast") - override fun create(modelClass: Class): T { - return WiktionaryViewModel(bundle) as T - } - } } From 60ba90f8b1db876a7eb8c0130e48749e0cc1b679 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:07:51 -0700 Subject: [PATCH 483/626] Bump com.google.firebase:firebase-messaging-ktx from 24.0.2 to 24.0.3 (#5053) Bumps [com.google.firebase:firebase-messaging-ktx](https://github.com/firebase/firebase-android-sdk) from 24.0.2 to 24.0.3. - [Commits](https://github.com/firebase/firebase-android-sdk/commits) --- updated-dependencies: - dependency-name: com.google.firebase:firebase-messaging-ktx dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ab35693a85d..5de01eb8cd6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ coreKtx = "1.13.1" desugar_jdk_libs = "2.1.2" drawerlayout = "1.2.0" espressoVersion = "3.6.1" -firebaseMessagingVersion = "24.0.2" +firebaseMessagingVersion = "24.0.3" flexbox = "3.0.0" fragmentKtx = "1.8.4" glideVersion = "4.16.0" From a5c49fa559c9cde4107a27dad879e464c3315b25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 13:15:21 -0700 Subject: [PATCH 484/626] Bump org.maplibre.gl:android-sdk from 11.5.1 to 11.5.2 (#5057) Bumps [org.maplibre.gl:android-sdk](https://github.com/maplibre/maplibre-native) from 11.5.1 to 11.5.2. - [Release notes](https://github.com/maplibre/maplibre-native/releases) - [Changelog](https://github.com/maplibre/maplibre-native/blob/main/CHANGELOG.md) - [Commits](https://github.com/maplibre/maplibre-native/compare/android-v11.5.1...android-v11.5.2) --- updated-dependencies: - dependency-name: org.maplibre.gl:android-sdk dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5de01eb8cd6..bcae58beedf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] androidPluginAnnotationV9 = "3.0.2" -androidSdk = "11.5.1" +androidSdk = "11.5.2" appcompat = "1.7.0" balloon = "1.6.9" browser = "1.8.0" From 6f3c6694d9ea6daef7492027ce88a8990bcf79f6 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 24 Oct 2024 18:40:38 +0530 Subject: [PATCH 485/626] Localisation updates from https://translatewiki.net. (#5059) --- app/src/main/res/values-af/strings.xml | 1 - app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-b+sr+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 57 ++++++++- app/src/main/res/values-bn/strings.xml | 11 +- app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - 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-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-fy/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-ha/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-ia/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 3 +- app/src/main/res/values-krc/strings.xml | 3 +- app/src/main/res/values-kus/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mhr/strings.xml | 1 - app/src/main/res/values-nb/strings.xml | 1 - app/src/main/res/values-nl/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-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-se/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 10 +- app/src/main/res/values-sr/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-uk/strings.xml | 48 ++++++- app/src/main/res/values-uz/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 118 +++++++++++++++++- app/src/main/res/values-xmf/strings.xml | 1 - app/src/main/res/values-yrl/strings.xml | 1 - 46 files changed, 235 insertions(+), 55 deletions(-) diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index e285b536a6e..c923348725e 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -1,6 +1,5 @@ diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 526630b934b..ca2a830c625 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,6 +1,5 @@ diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 8f71a786085..6801c7e3daf 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1,6 +1,5 @@ From db6e552bf1a59ff082f1057c8505b6cf3542398f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 14:55:13 -0400 Subject: [PATCH 487/626] Bump com.google.devtools.ksp in the kotlin-ksp group (#5061) Bumps the kotlin-ksp group with 1 update: [com.google.devtools.ksp](https://github.com/google/ksp). Updates `com.google.devtools.ksp` from 2.0.21-1.0.25 to 2.0.21-1.0.26 - [Release notes](https://github.com/google/ksp/releases) - [Commits](https://github.com/google/ksp/compare/2.0.21-1.0.25...2.0.21-1.0.26) --- updated-dependencies: - dependency-name: com.google.devtools.ksp dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kotlin-ksp ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bcae58beedf..ed7ce240cbd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,7 +25,7 @@ junitVersion = "1.2.1" kotlinCoroutinesVersion = "1.9.0" kotlinStdlibJdk8 = "2.0.21" kotlinxSerializationJson = "1.7.3" -kspPlugin = "2.0.21-1.0.25" +kspPlugin = "2.0.21-1.0.26" leakCanaryVersion = "2.14" material = "1.12.0" metricsVersion = "2.9" From 89412c1ebc52e1f1b7fceb9db38dc8db8cde0409 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Thu, 24 Oct 2024 16:42:48 -0400 Subject: [PATCH 488/626] Fix display of multiline usernames in TalkTopics. (#5060) --- app/src/main/res/layout/item_talk_topic.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/item_talk_topic.xml b/app/src/main/res/layout/item_talk_topic.xml index c87e39eea1c..028fe2e4c6b 100644 --- a/app/src/main/res/layout/item_talk_topic.xml +++ b/app/src/main/res/layout/item_talk_topic.xml @@ -52,6 +52,7 @@ android:layout_marginVertical="8dp" app:tint="?attr/progressive_color" app:layout_constraintTop_toBottomOf="@id/topicTitleText" + app:layout_constraintBottom_toTopOf="@id/topicContentText" app:layout_constraintStart_toStartOf="parent" app:srcCompat="@drawable/ic_user_avatar" /> @@ -65,8 +66,8 @@ android:lineSpacingExtra="8sp" android:layout_marginVertical="8dp" android:layout_marginStart="8dp" - app:layout_constraintTop_toTopOf="@id/topicUserIcon" - app:layout_constraintBottom_toBottomOf="@id/topicUserIcon" + app:layout_constraintTop_toBottomOf="@id/topicTitleText" + app:layout_constraintBottom_toTopOf="@id/topicContentText" app:layout_constraintStart_toEndOf="@id/topicUserIcon" app:layout_constraintEnd_toEndOf="parent" tools:text="Lorem ipsum" /> @@ -81,7 +82,7 @@ android:layout_marginVertical="8dp" android:ellipsize="end" android:maxLines="2" - app:layout_constraintTop_toBottomOf="@id/topicUserIcon" + app:layout_constraintTop_toBottomOf="@id/topicUsername" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" tools:text="Lorem ipsum" /> From 0e36a2e5fbf246f821b95ff3003fe4607ba5bbda Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 28 Oct 2024 18:07:11 +0530 Subject: [PATCH 489/626] Localisation updates from https://translatewiki.net. (#5064) --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 3 +- app/src/main/res/values-ba/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 91 +++++++++++++++++----- app/src/main/res/values-fi/strings.xml | 20 ++++- app/src/main/res/values-fr/strings.xml | 7 +- app/src/main/res/values-ia/strings.xml | 1 - app/src/main/res/values-iw/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 6 +- app/src/main/res/values-krc/strings.xml | 2 +- app/src/main/res/values-lb/strings.xml | 15 +++- app/src/main/res/values-mk/strings.xml | 3 +- app/src/main/res/values-nl/strings.xml | 8 ++ app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-qq/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-se/strings.xml | 2 +- app/src/main/res/values-skr/strings.xml | 1 + app/src/main/res/values-sr/strings.xml | 2 + app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 3 +- app/src/main/res/values-zh/strings.xml | 49 ++++++++++-- 24 files changed, 171 insertions(+), 51 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ac6783f9559..bf9fb8535e8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1085,7 +1085,6 @@ صف صورة لمساعدة القراء على فهم معناها وسياقها. تلخيص مقال لمساعدة القراء على فهم الموضوع في لمحة. إجمالي عدد مساهماتك حتى الآن. - عدد تعديلاتك الكلي حتى الآن. كم يومًا متتابعًا ساهمت فيها بتعديلاتٍ، إن لم تكن قد ساهمت لفترةٍ من الوقت، فسيُعرض تاريخ آخر مساهمة لك. إجمالي مشاهدات الصفحة للعناصر التي ساهمت فيها في آخر 30 يومًا. بناءً على عدد المرات التي تم فيها إرجاع إحدى مساهماتك (التراجع عن طريق محرر آخر)، التعديلات التي تم إرجاعها: %d. diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index ead20ff9151..83342b8d315 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -998,7 +998,6 @@ Oxuculara onun mənasını və kontekstini anlamağa kömək etmək üçün şəkli təsvir edin. Oxucuların mövzunu bir baxışda başa düşməsinə kömək etmək üçün məqaləni ümumiləşdirin. İndiyə qədər verdiyiniz töhfələrin ümumi sayı. - İndiyə qədər etdiyiniz redaktələrin ümumi sayı. Ardıcıl olaraq töhfə verdiyiniz gün sayı. Bir müddətdir töhfə verməmisinizsə, o, son töhfə tarixinizi göstərir. Son 30 gündə töhfə verdiyiniz elementlərə gələn ümumi baxış sayı. Töhfələrinizdən birinin neçə dəfə geri qaytarıldığına (başqa redaktor tərəfindən geri qaytarıldığına) əsaslanır. Geri qaytarılan redaktələr: %d . @@ -1706,4 +1705,6 @@ Proqram ikonu Donorlar üçün Çıxış etmiş istifadəçi + Sonuncu ianə + Yenilə diff --git a/app/src/main/res/values-ba/strings.xml b/app/src/main/res/values-ba/strings.xml index 20517e93401..64d757ea331 100644 --- a/app/src/main/res/values-ba/strings.xml +++ b/app/src/main/res/values-ba/strings.xml @@ -1003,7 +1003,6 @@ Уҡыусыға мәғәнәһе һәм йөкмәткеһе аңлашылырлыҡ итеп рәсемдең аңлатмаһын яҙығыҙ. Мәҡәлә темаһын уҡыусы тиҙ генә аңларлыҡ итеп ҡыҫҡаса яҙығыҙ. Бөгөнгә ҡарата дөйөм өлөшөгөҙ - Һеҙҙең бөтәһе индергән үҙгәртеүҙәрегеҙ һаны. Нисә көн рәттән өлөш индерәһегеҙ. Әгәр күпмелер ваҡыт өлөш индермәһәгеҙ, бында һуңғы өлөш датаһы күрһәтелә. Һуңғы 30 көндә өлөш кереткән биттәрегеҙҙе иҫәпкә алып, ҡаралған элемент биттәренең дөйөм һаны Бер төҙәтеүегеҙ нисә тапҡыр (башҡа мөхәррирҙәр тарафынан) кире ҡайтарылыуға нигеҙләнә. Кире ҡайтарылған төҙәтеүҙер һаны:%d diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index b09fa1093fb..538a4e6a9af 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -839,7 +839,6 @@ আপনার অবদানের জন্য ধন্যবাদ, %s। নিচে উইকিপিডিয়ায় অবদান রাখার আরও মাধ্যম খুঁজে পাবেন। <b>প্রিয় %s</b>, নীচে উইকিপিডিয়াকে সমৃদ্ধ করার জন্য তাড়াতাড়ি করা যায় এমন কিছু সহজ উপায় দেওয়া আছে। শুরু করার পরে আপনি জানতে পারবেন যে এখানে আপনার অবদান কতটা অমূল্য। সম্পাদনা শুভ হোক! এই পর্যন্ত আপনার মোট সম্পাদনার সংখ্যা। - এখন পর্যন্ত আপনার মোট সম্পাদনার সংখ্যা। পরামর্শকৃত সম্পাদনা %1$s অবধি বিরত রাখা হয়েছে। দুঃখিত %2$s, আপনার সাম্প্রতিক সম্পাদনাগুলির কয়েকটি প্রত্যাবর্তন করা হয়েছে। পরামর্শকৃত সম্পাদনা নিষ্ক্রিয় করা হয়েছে। দুঃখিত %s, আপনার সাম্প্রতিক সম্পাদনাগুলির অনেকগুলো প্রত্যাবর্তন করা হয়েছে। মনে হচ্ছে যে আপনার আইপি ঠিকানা (অথবা আইপি ঠিকানার রেঞ্জটি) কে উইকিপিডিয়াতে সম্পাদনা করা থেকে বাধাদান করা হয়েছে। diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e7896abee47..5a00935bcc8 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -18,6 +18,7 @@ * Rho * Saederup92 * Sarrus +* Steenth * Tinamalmgren * Yuvipanda --> @@ -36,6 +37,7 @@ Redigeringer Mere Søg + Bidrag Kan ikke oprette forbindelse til internettet. Prøv igen Prøv igen @@ -71,7 +73,7 @@ Filtrer efter Alle redigeringer (%s) Brugerredigeringer (%s) - Anonyme redigeringer (%s) + Uregistrede redigeringer (%s) Bot redigeringer (%s) Målinger fra %1$s til %2$s @@ -163,8 +165,8 @@ Log på Log på Log på - Log ind - Logger dig på… + Log på + Logger dig på... Du er nu logget ind! Sæt din adgangskode Du loggede på med en midlertidig kode. For at afslutte indlogning, angiv venligst din nye adgangskode her. @@ -230,7 +232,7 @@ Dette vil fuldstændig slette alle tidligere synkroniserede læselister fra eksternt lager. Fjern alle synkroniserede lister fra din konto »%s«? Send rapporter om nedbrud Tillad appen at sende rapporter om nedbrud til en tredjepartstjeneste automatisk, så vi kan gennemgå nedbruddet og rette fejlen hurtigere og nemmere. - Links til blokerede domæner (%s) fundet. Fjern dem, og prøv igen. + Henvisninger til blokerede domæner (%s) fundet. Fjern dem, og prøv igen. Filtrer historik Kunne ikke vise dette link Denne side er delvis beskyttet. @@ -282,13 +284,13 @@ Hensigt %s %s byte - %s bytes + %s bytes Zoom in Zoom ud Rettet stavefejl Rettet grammatik - Tilføjet links + Tilføjet henvisninger Andet Andre måder du forbedrede siden Tilføjede kort beskrivelse @@ -330,7 +332,7 @@ Den hurtigste måde at søge på Wikipedia De bedste artikler, Wikipedia har at tilbyde Ingen definitioner fundet. - Ny alpha opdatering tilgængelig + Ny alfa opdatering tilgængelig Tryk for at hente Luk Vis billeder @@ -439,8 +441,9 @@ Tilpas din værktøjslinje Du kan kontakte en <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">administrator</a> for at diskutere blokeringen. Du er ikke logget ind - Når du har foretaget en redigering, vil der blive oprettet en <b>midlertidig konto</b> til dig for at beskytte dit privatliv. <a href=\"<span class=\"notranslate\" translate=\"no\">%1$s \">Lær mere</a> .<br /><br /> <a href=\"https://#login\">Log ind</a> eller <a href=\"https://#login\">opret en konto</a> for at få kredit for fremtidige redigeringer og for at få adgang til andre funktioner. - Din redigering vil blive tilskrevet %1$s. Din IP-adresse vil være synlig for administratorer.<br /><br />Hvis du <a href=\"https://#login\">logger ind</a> eller <a href=\"https://#login\">opretter en konto</a>, vil dine redigeringer blive tilskrevet et navn, du vælger, blandt andre fordele. + Når du laver en redigering, vil din IP-adresse blive knyttet til dine redigeringer.<br /><br /> <a href=\"https://#login\">Log ind</a> eller <a href=\"https://#createaccount\">opret en konto</a> for at få tilskrivning for fremtidige redigeringer og for at få adgang til andre funktioner. + Når du har lavet en redigering, oprettes en <b>midlertidig konto</b> til dig for at beskytte dit privatliv. <a href=\"%1$s\">Lær mere</a>.<br /><br /> <a href=\"https://#login\">Log ind</a> eller <a href=\"https://#createaccount\">opret en konto</a> for at få tilskrivning for fremtidige redigeringer og for at få adgang til andre funktioner. + Din redigering vil blive tilskrevet %1$s. Din IP-adresse vil være synlig for administratorer.<br /><br /> Hvis du <a href=\"https://#login\">logger ind</a> eller <a href=\"https://#createaccount\">opretter en konto</a> , vil dine redigeringer blive tilskrevet et navn, du vælger, blandt andre fordele. Forstået Du bruger en midlertidig konto Kassér ændringer og log ind @@ -452,6 +455,7 @@ Konto udløber om %d dag. Konto udløber om %d dage. + <b>Du er ikke logget ind.</b> Når du har foretaget en redigering, vil din IP-adresse blive knyttet til dine redigeringer. <b>Du er ikke logget ind.</b> Når du har foretaget en redigering, oprettes en midlertidig konto til dig for at beskytte dit privatliv. <a href=\"%1$s\">Lær mere</a> <b>Du bruger en midlertidig konto.</b> Din redigering vil blive tilskrevet til %1$s. <a href=\"%2$s\">Lær mere</a>. <b>Du bruger i øjeblikket en midlertidig konto.</b> Redigeringer foretaget med den midlertidige konto %1$s vil ikke blive overført til din permanente konto, når du logger ind. Log ind eller opret en konto for at få kredittering til dit brugernavn, blandt andre fordele. @@ -556,10 +560,10 @@ %d lister slettet Standardlisten ( %s ) kan ikke slettes - %1$s slettet. Standardlisten ( %2$s ) kan ikke slettes. + %1$s slettet. Standardlisten (%2$s) kan ikke slettes. Lister slettet. Standardlisten ( %s ) kan ikke slettes. %s (Wikipedia læseliste).json - Wikipedia læselister ( %s og mere).json + Wikipedia læselister (%s og mere).json %d artikler fjernet fra liste %s fjernet fra lister Fortryd @@ -623,7 +627,7 @@ Importer liste Sorter efter Opdater synkronisering - Log ind/tilmeld dig + Log på/tilmeld dig Denne artikel vil nu være tilgængelig lokalt. Disse artikler vil nu være tilgængelige lokalt. @@ -1006,16 +1010,16 @@ De ikke-publicerede tags vil ikke blive gemt Knib for at zoome på dette billede. %s , tak for dine redigeringer. Nedenfor kan du finde flere måder at bidrage til Wikipedia. - <b>Hej %s</b> , herunder kan du finde nogle hurtige og nemme måder at hjælpe med at forbedre Wikipedia. Du vil se den forskel, du gør, så snart du går i gang. God redigering! + <b>Hej %s</b>, herunder kan du finde nogle hurtige og nemme måder at hjælpe med at forbedre Wikipedia. Du vil se den forskel, du gør, så snart du går i gang. God redigering! Beskriv et billede for at hjælpe læsere med at forstå dets betydning og kontekst. Opsummér en artikel for at hjælpe læsere med at forstå emnet på et øjeblik. Dit samlede antal bidrag indtil videre. Viser hvor mange dage i træk du har bidraget. Hvis du ikke har bidraget i et stykke tid, vises din sidste bidragsdato. Samlet antal sidevisninger af emner, som du har bidraget til inden for de sidste 30 dage. Baseret på, hvor mange gange et af dine bidrag blev tilbageført (tilbageført af en anden redaktør). Tilbageførte redigeringer: %d. - Foreslåede redigeringer er sat på pause indtil %1$s . Beklager %2$s, men nogle af dine seneste bidrag er blevet tilbageført. + Foreslåede redigeringer er sat på pause indtil %1$s. Beklager %2$s, men nogle af dine seneste bidrag er blevet tilbageført. Foreslåede redigeringer er deaktiveret. Beklager %s, for mange af dine seneste bidrag er blevet tilbageført. - Det ser ud til, at din IP-adresse (eller række af IP-adresser) i øjeblikket er blokeret fra at redigere Wikipedia. + Det ser ud til, at din IP-adresse (eller interval af IP-adresser) i øjeblikket er blokeret fra at redigere Wikipedia. Beklager %s, du skal foretage mindst tre redigeringer direkte i en artikel for at bruge denne funktion. Tips og tricks til redigering Hjælpeside for foreslåede redigeringer @@ -1035,6 +1039,10 @@ Bidrag Bidrag + + Redigering + Redigeringer + %d dag %d dage @@ -1127,7 +1135,7 @@ Gennemgå venligst artiklen for bedre at forstå emnet og inspicere billedet Beklager, der er ikke flere foreslåede billeder tilgængelige på nuværende tidspunkt. Udforsk venligst andre <a href=\"#\">foreslåede redigeringer</a> eller vend tilbage senere. Problem med funktionen - Problem med Foreslåede redigeringer + Problem med foreslåede redigeringer Tilføjede billede Tilføjede billedtekst Tilføjede billede og billedtekst @@ -1161,9 +1169,10 @@ Vi har fundet følgende på din enhed: Tilføj eller rediger sprog Den frie encyklopædi\n…på mere end 300 sprog - Vilkårlig + Tilfældig Fortsæt læsning Søg + Steder På denne dag Mere om denne dag %1$s hændelser fra %2$s – %3$d @@ -1283,7 +1292,7 @@ Gem som en ny besked på listen Opdater eksisterende besked Beskedens titel - Udgiv + Offentliggør Annullér Gem ikke Besked offentliggjort på brugerens brugerdiskussionsside @@ -1291,7 +1300,7 @@ Gemte beskeder Diskussionssiden er tom. Samtalen begynder her - Talesider er, hvor folk diskuterer, hvordan man gør Wikipedia-indhold bedst muligt. Start med at tilføje et nyt diskussionsemne for at forbinde og samarbejde med et fællesskab af Wikipedianere. + Diskussionssider er, hvor folk diskuterer, hvordan man gør Wikipedia-indhold bedst muligt. Start med at tilføje et nyt diskussionsemne for at forbinde og samarbejde med et fællesskab af Wikipedianere. Svar (Intet emne) Emne @@ -1346,6 +1355,7 @@ %s\'s bidrag Rediger kilde %s brugerside + Find i diskussionsside-emne Kopier link til udklipsholder Kopier tekst Udvid tråde @@ -1429,8 +1439,10 @@ Nybegyndere Let øvede Erfarne brugere + Bidragets forfatter Ændringer foretaget af dig Ændringer foretaget af andre + Automatiserede bidrag Bot Menneske (ikke bot) Betydning @@ -1438,6 +1450,7 @@ Ikke-mindre ændringer Seneste revisioner Seneste revidering + Ikke den seneste revision Ændringstype Sideredigeringer Sideoprettelser @@ -1465,13 +1478,18 @@ Underkategorier Ingen artikler fundet i denne kategori Ingen underkategorier fundet i denne kategori. + Navnerum Ingen (dette er den første revision) Bidrag af %s Ingen arkiverede sider fundet. + Filtrer efter navneområde + Alle navnerum + Navnerumfilter Artikel nuværende Fejl ved afspilning af medie. Bidrag + Filtrer bidrag Vis på et kort Geografiske koordinater er ikke tilgængelige for denne side Importér delt læseliste @@ -1570,6 +1588,10 @@ Tak Ser du en produktiv redigering? Tak en bruger for bidraget. Overvåg + Fortryd/Rul tilbage + Vælg \'Fortryd\' for at fortryde eller rulle en potentielt ødelæggende redigering tilbage. + Skader forudsiger, om en redigering forårsager skade på en wiki. + Hjælp os med at forbedre denne funktion Er du tilfreds med denne funktion? Tilfreds Neutral @@ -1631,4 +1653,35 @@ Annullér Hvad vil du gerne have, at vi ændrer eller forbedrer? Dette område er tomt. Zoom ud <a href=\"#\">på kortet</a>. + Steder i nærheden + Flere steder i nærheden + Steder er en kortbaseret måde at udforske Wikipedia på + Aktivér placering + %s væk + ukendt afstand + Der er ingen artikler i nærheden. Prøv at zoome ud og flytte kortet. + Du kan måske lide + Gem + Opdater donorstatus + Donor + Ikke en donor + Sidst doneret + Tilføj dato for sidste donation + Vælg en dato + Indtast dato + Tilbagevendende donor + Donèr til Wikimedia Foundation + Om dette eksperiment + Donorhistorik opdateret + Nej tak + Ja, tag mig derhen + Dit dashboard for bidrag er blevet opdateret + Nej tak + Ja, tag mig derhen + Donor + Bliv donor + Opdater donorstatus + App-ikon + Donor fordel + Opdatér diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 680820356a0..fa3bd08b278 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -51,6 +51,7 @@ Muokkaukset Lisää Hae + Muokkaa Internet-yhteyden muodostaminen epäonnistui. Yritä uudelleen Yritä uudelleen @@ -86,7 +87,7 @@ Suodata Kaikki muokkaukset (%s) Käyttäjät (%s) - Anonyymit (%s) + Rekisteröitymättömien muokkaukset (%s) Botit (%s) Mittarit välillä %1$s %2$s @@ -454,12 +455,22 @@ Mukauta työkalupalkkia Voit olla yhteydessä <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">ylläpitäjään</a> keskustellaksesi estosta. Et ole kirjautunut sisään - Kun teet muokkauksen, sinulle luodaan <b>väliaikainen tunnus</b> yksityisyytesi suojelemiseksi. <a href=\"%1$s\">Lisätietoja</a>.<br /><br /><a href=\"https://#login\">Kirjaudu sisään</a> tai <a href=\"https://#login\">Luo tunnus</a> saadaksesi tulevat muokkauksesi omiin nimiisi sekä saadaksesi muita etuja. - Muokkauksesi merkitään nimellä %1$s. IP-osoitteesi tulee näkymään ylläpitäjille.<br /><br />Jos <a href=\"https://#login\">kirjaudut sisään</a> tai <a href=\"https://#login\">luot tunnuksen</a>, muokkauksesi merkitään valitsemallesi nimelle, ja saat muita etuja. + Kun teet muokkauksen, IP-osoitteesi liitetään muokkauksiisi.<br /><br /><a href=\"https://#login\">Kirjaudu sisään</a> tai <a href=\"https://#createaccount\">Luo tunnus</a> saadaksesi tulevat muokkauksesi omiin nimiisi sekä saadaksesi muita etuja. + Kun teet muokkauksen, sinulle luodaan <b>tilapäinen tunnus</b> yksityisyytesi suojelemiseksi. <a href=\"%1$s\">Lisätietoja</a>.<br /><br /><a href=\"https://#login\">Kirjaudu sisään</a> tai <a href=\"https://#createaccount\">Luo tunnus</a> saadaksesi tulevat muokkauksesi omiin nimiisi sekä saadaksesi muita etuja. + Muokkauksesi merkitään nimellä %1$s. IP-osoitteesi tulee näkymään ylläpitäjille.<br /><br />Jos <a href=\"https://#login\">kirjaudut sisään</a> tai <a href=\"https://#createaccount\">luot tunnuksen</a>, muokkauksesi merkitään valitsemallesi nimelle, ja saat muita etuja. Selvä Käytät väliaikaista käyttäjätunnusta Hylkää muutokset ja kirjaudu sisään - <b>Et ole kirjautunut sisään.</b> Kun teet muokkauksen, sinulle luodaan <b>väliaikainen tunnus</b> yksityisyytesi suojelemiseksi. <a href=\"%1$s\">Lisätietoja</a> + + Tilapäinen tunnus %1$s luotiin muokkauksesi julkaisun yhteydessä. Se vanhene %2$d päivän päästästä. + Tilapäinen tunnus %1$s luotiin muokkauksesi julkaisun yhteydessä. Se vanhenee %2$d päivän päästä. + + + Tunnus vanhenee %d päivän päästä. + Tunnus vanhenee %d päivän päästä. + + <b>Et ole kirjautunut sisään.</b> Kun teet muokkauksen, IP-osoitteesi liitetään muokkauksiisi. + <b>Et ole kirjautunut sisään.</b> Kun teet muokkauksen, sinulle luodaan <b>tilapäinen tunnus</b> yksityisyytesi suojelemiseksi. <a href=\"%1$s\">Lisätietoja</a> <b>Käytät väliaikaista tunnusta.</b> Muokkauksesi merkitään nimelle %1$s. <a href=\"%2$s\">Lisätietoja</a>. <b>Käytät tällä hetkellä väliaikaista tunnusta</b>. Väliaikaisella tunnuksella %1$s tehtyjä muokkauksia ei siirretä pysyvälle tunnukselle, kun kirjaudut sisään. Kirjaudu sisään tai luo tunnus saadaksesi muokkauksesi omalle käyttäjänimelle sekä muita etuja. Lopeta istunto @@ -1683,4 +1694,5 @@ Kyllä, vie minut sinne Ryhdy lahjoittajaksi Uloskirjautunut käyttäjä + Päivitä diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 011f77c6795..093a211ebb5 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -42,6 +42,7 @@ * Léon973 * MSClaudiu * Macofe +* Mahabarata * Mazighafalkun * McDutchie * Melimeli @@ -119,7 +120,7 @@ Filtrer par Toutes les modifications (%s) Modifications par utilisateur (%s) - Modifications anonyme (%s) + Modifications anonymes (%s) Modifications par robot (%s) Mesures de %1$s à %2$s @@ -487,8 +488,8 @@ Personnaliser votre barre d’outils Vous pouvez contacter un <a href=\"https://fr.wikipedia.org/wiki/Wikipédia:Administrateur\">administrateur</a> pour discuter du blocage. Vous n’êtes pas connecté(e) - Une fois que vous aurez effectué une modification, un <b>compte temporaire</b> sera créé pour vous permettre de protéger votre vie privée. <a href=\"%1$s\">En savoir plus</a>.<br /><br /><a href=\"https://#login\">Connectez-vous</a> ou <a href=\"https://#login\">créez un compte</a> pour obtenir un crédit pour les modifications futures et accéder à d\'autres fonctionnalités. - Votre modification sera attribuée à %1$s. Votre adresse IP sera visible par les administrateurs.<br /><br />Si vous <a href=\"https://#login\">vous connectez</a> ou <a href=\"https://#login\">créez un compte</a>, vos modifications seront attribuées à un pseudonyme que vous choisirez, parmi d\'autres avantages. + Une fois que vous aurez effectué une modification, un <b>compte temporaire</b> sera créé pour vous permettre de protéger votre vie privée. <a href=\"%1$s\">En savoir plus</a>.<br /><br /><a href=\"https://#login\">Connectez-vous</a> ou <a href=\"https://#createaccount\">créez un compte</a> pour obtenir un crédit pour les modifications futures et accéder à d\'autres fonctionnalités. + Votre modification sera attribuée à %1$s. Votre adresse IP sera visible par les administrateurs.<br /><br />Si vous <a href=\"https://#login\">vous connectez</a> ou <a href=\"https://#createaccount\">créez un compte</a>, vos modifications seront attribuées à un pseudonyme que vous choisirez, parmi d\'autres avantages. Compris ! Vous utilisez un compte temporaire Annuler les modifications et se connecter diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index cfe195d7d9e..e378a3f3cb2 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -996,7 +996,6 @@ Describe un imagine pro adjutar le lectores a comprender su significato e contexto. Summarisa un articulo pro adjutar le lectores a comprender rapidemente le subjecto. Le numero total de tu contributiones usque al presente. - Le numero total de tu modificationes usque al presente. Le numero de dies consecutive durante que tu ha contribuite. Si tu non ha contribuite desde alcun tempore, illo monstra le data de tu ultime contribution. Total de visitas de paginas al quales tu ha contribuite in le ultime 30 dies. Basate sur le numero de vices que un de tu contributiones ha essite revertite (i.e. disfacite per un altere editor). Modificationes revertite: %d. diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index bceb302d92c..9a5620a55bb 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -1081,7 +1081,6 @@ תארו את התמונה כדי לסייע לקוראים להבין את המשמעות וההקשר. סַכמו את הערך כדי לעזור לקוראים להבין את הנושא במבט אחד. המספר הכולל של התרומות שלך עד עכשיו. - המספר הכולל של העריכות שלך עד עכשיו. כמה ימים ברצף תרמת. אם לא תרמת במשך זמן־מה, זה מראה את תאריך התרומה האחרונה שלך. סך הצגות הדפים שתרמת להם ב־30 הימים האחרונים. מסתמך על מספר הפעמים שהתרומות שלך בוטלו. תרומות שבוטלו: %d. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index aa9962afb14..bd48d4946b3 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -826,6 +826,7 @@ 피드의 끝에 도달했습니다. 더 불러오기 저장 + 2차 언어를 업데이트해 주십시오 설정으로 이동 %s의 가장 많이 읽은 글 @@ -981,7 +982,6 @@ 이미지 설명은 독자가 그림의 의미나 맥락을 파악하는 데 도움을 줍니다. 문서 설명은 독자들이 한눈에 주제를 파악할 수 있도록 글을 요약합니다. 지금까지의 당신의 총 기여 수입니다. - 지금까지의 당신의 총 편집 수입니다. 지금까지 기여한 일수입니다. 한동안 기여가 없는 경우, 최근 기여 날짜를 표시합니다. 최근 30일 동안 기여한 항목들의 총 조회수입니다. 당신의 편집이 (다른 편집자에 의하여) 몇 번 되돌려졌는지를 기반으로 합니다.\n되돌려진 편집: %d건. @@ -1566,6 +1566,7 @@ 문서 이슈 사소한 버그 수정 및 개선 문제 보고 - 이미지 추천 기능 + 문제 보고 - 편집 점검 기능 편집 순찰 기능에 문제가 발생했습니다:\n- [문제를 자세히 설명]\n\n원하던 동작은 다음과 같습니다.\n- [해결책 제안 설명]\n\n [스크린샷 또는 링크] 내일 다시 알려드리겠습니다. 기부해 주셔서 감사합니다! 당신의 관대한 선택으로 위키백과와 자매 사이트의 발전에 큰 힘이 되었습니다. @@ -1595,6 +1596,7 @@ \"장소\"를 어떻게 개선할 수 있나요? 취소 무엇을 바꾸거나 개선하기를 원하시나요? + 이 지역은 비어 있습니다. <a href=\"#\">지도를</a> 확대해 보세요. 주변 장소 더 많은 주변 장소 위치 활성화 @@ -1609,9 +1611,11 @@ 날짜 입력 이 실험 정보 의견 없음 + 피드백 공유 자유의 지식을 지원해 주셔서 고맙습니다 아니요, 괜찮습니다 아니요, 괜찮습니다 앱 아이콘 로그아웃된 사용자 + 업데이트 diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml index 36585889de1..66e92078b65 100644 --- a/app/src/main/res/values-krc/strings.xml +++ b/app/src/main/res/values-krc/strings.xml @@ -796,7 +796,7 @@ Аслам сайлам Викигёзенни сайланнган суратлары Аула - Баш бет + Тамал бет Картчыкъны белгичиги Джангылыкълада diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 83f7bb9e878..89894b39568 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -21,6 +21,7 @@ Ännerungen Méi Sichen + Bäidroen Kann net mam Internet verbannen. Nach eng Kéier probéieren Nach eng Kéier probéieren @@ -55,7 +56,7 @@ Filteren no All Ännerungen (%s) Benotzer-Ännerungen (%s) - Anonym Ännerungen (%s) + Net-ugemellten Ännerungen (%s) Bot-Ännerungen (%s) Metrike vum %1$s bis de(n) %2$s @@ -154,6 +155,8 @@ Dir gouft aus der Wikipedia ausgeloggt. Wëllt Dir Iech erëm aloggen? Aloggen Ofbriechen + Kont opléisen + Kontoopléisungswarnung Keng Artikele rezent gekuckt Markéiert dat wat Dir hei gelies hutt. An der fräier Enzyklopedie an Ärer Sprooch sichen a liesen @@ -934,8 +937,8 @@ Jo Neen Net sécher - Firwat net? - Är Äntwerte wäerten zukünfteg Virschléi besser maachen. + Ofleenungsgrond + Den Ofleenungsgrond ass anonym a wäert zukünfteg Bildvirschléi besser maachen. D\'Bild ass net relevant Net genuch Informatioune fir ze decidéieren Bild huet eng niddreg Qualitéit @@ -1012,7 +1015,7 @@ Kursiv Ënnersträichen Duerchsträichen - Exposant + Héichgestallt Groussen Text Klengen Text Code @@ -1055,6 +1058,7 @@ Drasetzen z.&nbsp;B %s %s (Fakultativ) + Méi gewuer ginn Hëllef Aloggen / bei Wikipedia matmaachen Salut %s, wousst Dir, datt jiddwereen op Wikipedia Ännerunge maache kann? @@ -1076,6 +1080,7 @@ Verëffentlechen Ofbriechen Net späicheren + Gespäichert Messagen Dës Diskussiouns-Säit ass eidel. D\'Konversatioun fänkt hei un Äntweren @@ -1332,6 +1337,7 @@ Vandalismuswarnung Automatesch Iwwersetzung Lescht Warnung + Änneren Akzeptéieren Refuséieren Problemer mat der Säit @@ -1366,4 +1372,5 @@ Merci, datt Dir fräit Wëssen ënnerstëtzt Nee, merci Nee, merci + Aktualiséieren diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index bbf9da12e7c..84a4e10d85c 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -1002,7 +1002,6 @@ Дајте ѝ опис на сликата за да му помогнете на читателот да разбере за што се работи и да добие контекст. Ставете караток опис на статија, давајќи им претстава на читателите за што се работи. Вкупно ваши придонеси досега. - Вкупно ваши уредувања досега. Колку дена едноподруго сте учествувале. Ако немате учествувано подолго време, ќе се прикаже последниот ден на учество. Вкупно посети на единиците што ги уредивте во изминатите 30 дена. Според тоа колку пати се отповикани вашите уредувања (поништени од друг корисник). Отповикани уредувања: %d. @@ -1715,4 +1714,6 @@ Икона на прилогот Погодност на дарителот Одјавен корисник + Последен пат дарувал + Поднови diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 5918ade9e18..dd5ec915189 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -59,6 +59,7 @@ Bewerkingen Meer Zoeken + Bijdragen Er is geen verbinding met het internet. Opnieuw proberen Opnieuw proberen @@ -463,6 +464,7 @@ Werkbalk aanpassen U kunt contact opnemen met een <a href=\"https://nl.wikipedia.org/wiki/Wikipedia:Moderator\">moderator</a> voor meer informatie over de blokkering. U bent niet aangemeld + Zodra u een bewerking doorvoert, wordt uw IP-adres aan uw bewerkingen gekoppeld.<br /><br /><a href=\"https://#login\">Meld u aan</a> of <a href=\"https://#createaccount\">maak een account aan</a> om naamsvermelding te krijgen voor toekomstige bewerkingen en om toegang te krijgen tot andere functies. Nadat u een wijziging hebt aangebracht, wordt er een <b>tijdelijk account</b> aangemaakt om uw privacy te beschermen. <a href=\"%1$s\">Meer informatie</a>.<br /><br /><a href=\"https://#login\">Meld u aan</a> of <a href=\"https://#createaccount\">maak een account aan</a> om onder een zelfgekozen naam bij te dragen en om toegang te krijgen tot meer mogelijkheden. Uw bewerking wordt toegeschreven aan %1$s. Uw IP-adres is zichtbaar voor beheerders.<br /><br /> Als u zich <a href=\"https://#login\">aanmeldt</a> of <a href=\"https://#createaccount\">een account aanmaakt</a>, worden uw bewerkingen toegeschreven aan een door u gekozen naam en zijn er andere voordelen. Begrepen @@ -476,6 +478,7 @@ Account verloopt over %d dag. Account verloopt over %d dagen. + <b>U bent niet ingelogd.</b> Zodra u een bewerking doorvoert, wordt up IP-adres aan uw bewerkingen gekoppeld. <b>Je bent niet ingelogd.</b> Nadat je een wijziging hebt opgeslagen, wordt er een tijdelijk account voor je aangemaakt om je privacy te beschermen. <a href=\"%1$s\">Meer informatie</a> <b>Je gebruikt een tijdelijk account.</b> Je bewerking wordt toegeschreven aan %1$s. <a href=\"%2$s\">Meer informatie</a>. <b>Je gebruikt momenteel een tijdelijk account.</b> Bewerkingen gemaakt met het tijdelijke account %1$s zullen niet worden overgedragen naar je permanente account wanneer je inlogt. Log in of maak een account aan om onder een eigen gebruikersnaam te bewerken. @@ -1059,6 +1062,10 @@ Bijdrage Bijdragen + + Bewerking + Bewerkingen + %d dag %d dagen @@ -1188,6 +1195,7 @@ Willekeurig Verder lezen Zoeken + Plaatsen Op deze dag Meer van deze dag %1$s gebeurtenissen van %2$s–%3$d diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 2b43085e359..96336eb99e1 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -626,7 +626,6 @@ ਛਾਪਿਆ ਜਾ ਰਿਹਾ ਹੈ ਟੈਗ ਜੋੜੋ ਤੁਹਾਡੇ ਹੁਣ ਤੱਕ ਦੇ ਯੋਗਦਾਨਾਂ ਦੀ ਕੁੱਲ ਸੰਖਿਆ। - ਤੁਹਾਡੇ ਹੁਣ ਤੱਕ ਦੇ ਸੋਧਾਂ ਦੀ ਕੁੱਲ ਗਿਣਤੀ। ਵੇਖੇ ਗਏ ਸ਼ਾਨਦਾਰ ਬਹੁਤ ਵਧੀਆ diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index fa5627e8b14..9088e21aaaf 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1036,7 +1036,6 @@ Image captions detail text explaining the task of adding image captions.\n\nAppears in a box under {{msg-wm|Wikipedia-android-strings-suggested edits image captions}}\n\nAppears in the same screen as and formatted similarly to:\n* {{msg-wm|Wikipedia-android-strings-suggested edits add descriptions task detail}}\n* {{msg-wm|Wikipedia-android-strings-suggested edits image tags task detail}} Article descriptions detail text explaining the task of adding article descriptions.\n\nAppears in a box under {{msg-wm|Wikipedia-android-strings-description edit tutorial title descriptions}}\n\nAppears in the same screen as and formatted similarly to:\n* {{msg-wm|Wikipedia-android-strings-suggested edits image captions task detail}}\n* {{msg-wm|Wikipedia-android-strings-suggested edits image tags task detail}} Tool tip text explaining the contributions statistics to the user.\n\n\"Suggested edits\" should be translated the same as {{msg-wm|Wikipedia-android-strings-suggested edits tasks activity title}}. - Tool tip text explaining the edit streak statistics to the user.\n\n\"Suggested edits\" should be translated the same as {{msg-wm|Wikipedia-android-strings-suggested edits tasks activity title}}. Tool tip text explaining the page views statistics to the user.\n\n\"Suggested edits\" should be translated the same as {{msg-wm|Wikipedia-android-strings-suggested edits tasks activity title}}. Tool tip text explaining the edit quality statistics to the user. %d represents the number of reverts. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f6aa1a0392e..490acebb32c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1741,4 +1741,5 @@ Стать донором Обновить статус донора Значок приложения + Обновить diff --git a/app/src/main/res/values-se/strings.xml b/app/src/main/res/values-se/strings.xml index a43fbaa6153..ae4647a8280 100644 --- a/app/src/main/res/values-se/strings.xml +++ b/app/src/main/res/values-se/strings.xml @@ -288,7 +288,7 @@ Dát soaitá oalle unnán konstruktiivvalaš rievdadeapmi. Háliidat go duođaid almmuhit dan? Dát rievdadeapmi ii sáhte almmuhuvvot. Mana ruovttoluotta ja geahččal ođđasit. Rievdadeapmi lea automáhtalaš sillis identifiserejuvvon vejolaččat destruktiivvalažžan. Dat sáhttá sisttisdoallat ovtta dahje eanet čuovvovaš áššiin:<br /><br />· Olles sátni čállojuvvon stuora bustávaiguin<br />· Artihkkala gurren dahje ruskaboasta<br />· Olgguldas liŋkkat dahje govat mat eai gula áššái<br />· Geardduheaddji mearka - Rievdadeapmi lea automáhtalaš sillis identifiserejuvvon vejolaččat destruktiivvalažžan, dahje vejolaččat billisteaddjin.<br /><br />Wikipedia lea encyklopediija ja dasa gullá dušše neutrála ja áššáiguoskevaš sisdoallu. + Rievdadeapmi lea automáhtalaš sillis identifiserejuvvon vejolaččat destruktiivvalažžan, dahje vejolaččat billisteaddjin.<br /><br />Wikipedia lea diehtosátnegirji ja dasa gullá dušše neutrála ja áššáiguoskevaš sisdoallu. Sullasaš siiddut Oaivvildit go «%s»? Easká ohcamat: diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 18e29a7162d..5020e3defb2 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -719,4 +719,5 @@ کو، شکریہ کو، شکریہ ایپ آئیکان + اپ ڈیٹ diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 4029b0372fc..8ff6074a8e1 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1644,4 +1644,6 @@ Не, хвала Да, води ме тамо Донатор + Последња донација + Ажурирај diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 81aaaea7170..5017a467824 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1084,7 +1084,6 @@ Опишіть зображення, щоб допомогти читачам зрозуміти його значення та контекст. Підсумуйте вміст статті, щоб допомогти читачам зрозуміти предмет статті з першого погляду. Ваше загальне число редагувань поки що. - Ваше загальне число редагувань на цей момент. Скільки днів поспіль Ви робили внесок. Якщо Ви довго не робили внесок, то показується дата останнього внеску. Кількість переглядів сторінок, які Ви редагували за останні 30 днів. Засновано на тому, скільки разів ваші редагування було скасовано (іншим редактором). Кількість таких редагувань: %d. diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e7fd39dc22f..7da43b2ebb5 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1008,7 +1008,6 @@ Mô tả một hình ảnh để giúp người đọc hiểu ý nghĩa và ngữ cảnh của nó. Tóm lược bài để giúp độc giả dễ dàng hiểu hơn. Tổng số đóng góp của bạn cho đến nay. - Tổng số đóng góp của bạn cho đến nay. Số ngày đóng góp tài nguyên liên tiếp của bạn. Nếu bạn không đóng góp trong một khoảng thời gian, ngày đóng góp mới nhất sẽ được hiển thị. Tổng số lượt tải của trang bạn đã đóng góp trong 30 ngày gần đây Dựa trên số lần một trong những đóng góp của bạn đã được lùi sửa (lùi sửa bởi một người dùng khác). Sửa đổi bị lùi sửa: %d. diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 40f8abec04b..ca643e524e6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1031,7 +1031,6 @@ 描述圖片來幫助讀者了解含意與脈絡。 概括條目來幫助讀者一目瞭然主題內容。 您到目前為止的貢獻總數。 - 您目前為止的貢獻總數。 您有做出貢獻的連續天數。如果您已有一段時間未做出貢獻,則顯示最後的貢獻日期。 您曾做過貢獻的項目在過去 30 天內的頁面總瀏覽次數。 基於您的編輯裡有多少次被回退(被其他編輯者撤銷)。回退編輯數:%d。 @@ -1744,4 +1743,6 @@ 應用程式圖示 捐款者益處 使用者登出 + 上一次捐款 + 更新 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index ace9498f818..3ae4f444746 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -88,6 +88,7 @@ 编辑 更多 搜索 + 贡献 无法连接至互联网。 重试 重试 @@ -123,7 +124,7 @@ 筛选条件 所有编辑(%s) 用户编辑(%s) - 匿名编辑(%s) + 未注册编辑(%s) 机器人编辑(%s) 从%1$s到%2$s的数据 @@ -162,6 +163,7 @@ 近期浏览 存档 打开 + 在地点开放 在新标签页中打开 复制链接地址 定义 @@ -491,8 +493,9 @@ 自定义您的工具栏 您可以联系<a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">管理员</a>来讨论此封禁。 您尚未登录 - 一旦您作出编辑,将会创建<b>临时账号</b>,以保护您的隐私。<a href=\"%1$s\">了解更多信息</a>。<br /><br />请<a href=\"https://#login\">登录</a>或<a href=\"https://#login\">创建账号</a>以将之后的编辑内容署名,并体验其他功能。 - 您的编辑将会以%1$s署名。您的IP地址将对管理员可见。<br /><br />如果您<a href=\"https://#login\">登录</a>或<a href=\"https://#login\">创建账号</a>,您的编辑将以您选择的名称署名,且还可享有其他好处。 + 一旦您作出编辑,您的IP地址将与您的编辑相关联。<br /><br />请<a href=\"https://#login\">登录</a>或<a href=\"https://#createaccount\">创建账号</a>以将之后的编辑内容署名,并体验其他功能。 + 一旦您作出编辑,将会创建<b>临时账号</b>,以保护您的隐私。<a href=\"%1$s\">了解更多信息</a>。<br /><br />请<a href=\"https://#login\">登录</a>或<a href=\"https://#createaccount\">创建账号</a>以将之后的编辑内容署名,并体验其他功能。 + 您的编辑将会以%1$s署名。您的IP地址将对管理员可见。<br /><br />如果您<a href=\"https://#login\">登录</a>或<a href=\"https://#createaccount\">创建账号</a>,您的编辑将以您选择的名称署名,且还可享有其他好处。 明白了 您正在使用临时账号 放弃更改并登录 @@ -502,6 +505,7 @@ 账号将会在%d天后过期。 + <b>您尚未登录。</b>一旦您作出编辑,您的IP地址将与您的编辑相关联。 <b>您尚未登录。</b>一旦您作出编辑,将会创建<b>临时账号</b>,以保护您的隐私。<a href=\"%1$s\">了解更多信息</a> <b>您正在使用临时账号。</b>您的编辑将会以%1$s署名。<a href=\"%2$s\">了解更多信息</a>。 <b>您正在使用临时账号。</b>登录后,在该临时账号“%1$s”下作出的编辑不会转移至您的永久账号。请登录或创建账号,以便以您的用户名署名贡献,并可享有其他好处。 @@ -756,7 +760,7 @@ 搜索通知 查看未读 查看已存档 - 通知参数设置 + 通知设置 标记为已读并存档 通知已存档 @@ -767,7 +771,7 @@ 现在不要 您已阅读所有通知! 查看已存档通知 - 通知参数设置 + 通知设置 标记为未读 标记所有为已读 回复 @@ -886,6 +890,7 @@ 包含每日特色内容的维基百科首页 随机选择条目以便阅读 向维基百科添加内容的建议 + 当前位置附近的条目 您的探索订阅源中没有内容 自定义 确定 @@ -964,7 +969,7 @@ 工具栏 菜单 将您喜欢的项目拖放到这里👋 - 重置到默认 + 重置为默认设置 按住并拖动图标可移动项目 按下并拖拽一个要重新定位的项目 描述条目 @@ -1080,6 +1085,10 @@ 贡献 贡献 + + 编辑 + 编辑 + %d天 %d天 @@ -1208,6 +1217,7 @@ 随机 继续阅读 搜索 + 地点 历史上的今天 今天的更多事件 %2$s–%3$d年间的%1$s个事件 @@ -1716,4 +1726,31 @@ 取消 您希望我们改变或优化什么? 此区域无内容。请缩小<a href=\"#\">地图</a>。 + 附近地点 + 更多附近地点 + 地点功能使用地图来探索维基百科 + 启用位置 + 未知距离 + 附近没有条目。请尝试缩小并移动地图。 + 您可能会喜欢 + 帮助改进推荐内容。 + 您对这个推荐搜索结果满意吗? + 其他反馈 + 已提交反馈。感谢您! + 捐款者历史 + 保存 + 更新捐款者状态 + 捐款者 + 非捐款者 + 上一次捐款 + 添加上次捐款日期 + 选择日期 + 输入日期 + 定期捐款者 + 向维基媒体基金会捐款 + 关于此实验功能 + 已更新捐款者历史 + 帮助改进贡献面板 + 无意见 + 分享反馈 From fe25811cffbe5e0c7119c836224fb11b8986a2b9 Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Mon, 28 Oct 2024 18:44:12 -0400 Subject: [PATCH 490/626] Apply explicit dark mode to pages loaded via Mobile Web. (#5065) --- .../java/org/wikipedia/bridge/JavaScriptActionHandler.kt | 6 ++++++ app/src/main/java/org/wikipedia/page/PageFragment.kt | 5 +++++ app/src/main/res/values/styles_dark.xml | 1 + 3 files changed, 12 insertions(+) diff --git a/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt b/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt index b46d01636a7..2fbcbd4c8ff 100644 --- a/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt +++ b/app/src/main/java/org/wikipedia/bridge/JavaScriptActionHandler.kt @@ -183,6 +183,12 @@ object JavaScriptActionHandler { "})();" } + fun mobileWebSetDarkMode(): String { + return "(function() {" + + "document.documentElement.classList.add('skin-theme-clientpref-night');" + + "})();" + } + fun getElementAtPosition(x: Int, y: Int): String { return "(function() {" + " let element = document.elementFromPoint($x, $y);" + diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.kt b/app/src/main/java/org/wikipedia/page/PageFragment.kt index 47c20deafa6..ce4a5baed65 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragment.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragment.kt @@ -402,6 +402,11 @@ class PageFragment : Fragment(), BackPressedHandler, CommunicationBridge.Communi // tells us the page is finished loading. In such a case, we must infer that the // page has now loaded and trigger the remaining logic ourselves. if ("true" != pcsExists) { + if (WikipediaApp.instance.currentTheme.isDark) { + // TODO: remove when mobile web supports automatic dark mode through + // the `prefers-color-scheme` media query. + bridge.execute(JavaScriptActionHandler.mobileWebSetDarkMode()) + } onPageSetupEvent() bridge.onMetadataReady() bridge.onPcsReady() diff --git a/app/src/main/res/values/styles_dark.xml b/app/src/main/res/values/styles_dark.xml index 6bc8351ca6f..f6fc9deb2f7 100644 --- a/app/src/main/res/values/styles_dark.xml +++ b/app/src/main/res/values/styles_dark.xml @@ -2,6 +2,7 @@ + + + + + + + + From ad8c2086723091c40c39b38ef40ff53169bbaeda Mon Sep 17 00:00:00 2001 From: Cooltey Feng Date: Wed, 13 Nov 2024 08:54:04 -0800 Subject: [PATCH 530/626] Fix: update percent-symbol-encoding test to catch more cases. (#5117) * Fix: replace the %% symbol with the encoded symbol * Fix test and add an explaination to the qq string * Replace with unicode character * Use a single percent * Fix test and add space * Update and refine tests for percent symbol encoding in strings. * Update percent-symbol encoding test. * Put back a couple of params. --------- Co-authored-by: Dmitry Brant --- app/src/main/res/values-uz/strings.xml | 2 +- app/src/test/java/org/wikipedia/language/TranslationTests.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 1cf8adbbbd8..e061dc3b02e 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -968,7 +968,7 @@ Qanday qilib ketma-ket necha kun oʻz hissangizni qoʻshdingiz. Agar Siz bir muncha vaqt oʻz hissangizni qoʻshmagan boʻlsangiz, bu Sizning oxirgi hissangizni koʻrsatadi. Soʻnggi 30 kun ichida Siz qoʻshgan narsalar boʻyicha jami sahifalarni koʻrish. Hissalaringizdan biri necha marta qaytarilganligi (boshqa muharrir tomonidan bekor qilingan) asosida. Qayta tahrir qilingan maqolalar: %d ta - Tavsiya etilgan tahrirlar %1$sgacha toʻxtatildi. Kechirasiz, %2$s%, yaqinda qilgan baʼzi hissalaringiz qaytarildi. + Tavsiya etilgan tahrirlar %1$sgacha toʻxtatildi. Kechirasiz, %2$s, yaqinda qilgan baʼzi hissalaringiz qaytarildi. Tavsiya etilgan tahrirlar faol emas. Kechirasiz, %s, juda koʻp qoʻshgan narsalaringiz bekor qilindi. Sizning IP-manzilingiz (yoki IP-manzillar diapazoningiz) hozirda Vikipediyani tahrirlashga toʻsiq qoʻyilganga oʻxshaydi. Kechirasiz, %s, bu funksiyadan foydalanish uchun to‘g‘ridan-to‘g‘ri maqolaga kamida uchta tahrir qilishingiz lozim. diff --git a/app/src/test/java/org/wikipedia/language/TranslationTests.kt b/app/src/test/java/org/wikipedia/language/TranslationTests.kt index 25abfc6ec83..40352a0a770 100644 --- a/app/src/test/java/org/wikipedia/language/TranslationTests.kt +++ b/app/src/test/java/org/wikipedia/language/TranslationTests.kt @@ -253,7 +253,7 @@ class TranslationTests { "\\[\\[.*?\\]\\]", "\\*\\*.*?\\*\\*", "''.*?''", - "[^%]% " + "[^%]%[ .,;?]" ) private val BAD_NAMES = listOf("ldrtl", "sw360dp", "sw600dp", "sw720dp", "v19", "v21", "v23", "land", "night") From d06776694048f14621f9033636c317576522db5b Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 14 Nov 2024 19:14:20 +0530 Subject: [PATCH 531/626] Localisation updates from https://translatewiki.net. (#5120) * Localisation updates from https://translatewiki.net. * Fix string. --------- Co-authored-by: Dmitry Brant --- app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 40 +++++- app/src/main/res/values-hi/strings.xml | 1 + app/src/main/res/values-hu/strings.xml | 62 +++++++++- app/src/main/res/values-it/strings.xml | 4 + app/src/main/res/values-ko/strings.xml | 42 ++++++- app/src/main/res/values-lb/strings.xml | 4 + app/src/main/res/values-mk/strings.xml | 14 +++ app/src/main/res/values-nl/strings.xml | 38 ++++++ app/src/main/res/values-pa/strings.xml | 136 ++++++++++++++++++++- app/src/main/res/values-skr/strings.xml | 1 + app/src/main/res/values-sr/strings.xml | 7 ++ app/src/main/res/values-sv/strings.xml | 24 +++- app/src/main/res/values-zh-rTW/strings.xml | 1 + 14 files changed, 363 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 417b1f2ead4..10f1d694f4c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -845,6 +845,7 @@ Hlavní strana Wikipedie s každodenním obsahem Vygenerujte si náhodný článek k přečtení Návrhy na přidávání obsahu do Wikipedie + Články v okolí podle aktuální polohy Nic není ve vašem kanále Objevit Přizpůsobit OK diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a490701e7fd..bd28f2d96de 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -159,6 +159,7 @@ Consulté récemment Archiver Ouvrir + Ouvrir dans Lieux Ouvrir dans un nouvel onglet Copier l’adresse du lien Définition @@ -1711,8 +1712,43 @@ Carte Liste Cette zone est vide. Effectuez un zoom arrière <a href=\"#\">sur la carte</a>. - Pas un donateur - Non, merci. + Historique du donateur + Sauvegarder + Mettre à jour le statut de donateur + Donateur + Non donateur + Dernier don + Ajouter la date du dernier don + Jamais + Donateur récurrent + Faire un don à la Fondation Wikimédia + À propos de cette expérimentation + Historique du donateur mis à jour + Aidez-nous à améliorer le tableau de bord des contributions + Cette mise à jour du tableau de bord est une fonctionnalité en cours de test. Souhaitez-vous que cette fonctionnalité soit améliorée ou supprimée ? + Pas d\'avis + Partager votre avis + Merci de soutenir la connaissance libre + Vous faites partie des 2%% de personnes qui ont choisi de soutenir la ressource dont dépendent des millions de personnes. Votre tableau de bord des contributions a été mis à jour et reconnaît désormais votre statut de donateur. Souhaitez-vous voir cette mise à jour expérimentale ? + Non, merci + Oui, je souhaite m\'y rendre + Découvrez les nouveautés du tableau de bord des contributions + Le tableau de bord des contributions affiche désormais le statut des donateurs. Voulez-vous évaluer cette fonctionnalité expérimentale ? + Non, merci + Oui, je souhaite le faire + Donateur + Devenir donateur + Mettre à jour le statut de donateur + Icône de l\'application + Avantage du donateur + Utilisateur déconnecté + Dernier don + Mettre à jour + Merci d\'être un donateur. + Vous avez débloqué une icône personnalisée temporaire. Vous pouvez sélectionner cette icône dans vos paramètres, sous « Icône de l\'application ». Souhaitez-vous mettre à jour votre icône maintenant ? + Non, merci + Oui, aller dans Paramètres + Icône de l\'application mise à jour Aidez-nous à améliorer cette fonctionnalité Etes-vous satisfait de cette fonctionnalité ? Satisfait diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 81c9c1d1bc2..c9572bf5fcf 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1454,6 +1454,7 @@ तिथि चुनें नहीं, धन्यवाद नहीं, धन्यवाद + शायद बाद में क्या आप इस सुविधा से संतुष्ट हैं? संतुष्ट ना संतुष्ट ना असंतुष्ट diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 7af9d7d7de1..cb6e6cbb4c1 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -443,7 +443,9 @@ Eszköztár testreszabása Kapcsolatba léphetsz egy <a href=\"https://hu.wikipedia.org/wiki/Wikipédia:Adminisztrátorok\">adminisztrátorral</a>, és megbeszélheted vele a blokkot. Nem vagy bejelentkezve + A szerkesztéseid az IP-címedhez lesznek társítva.<br /><br />Ha <a href=\"https://#login\">bejelentkezel</a> vagy <a href=\"https://#createaccount\">regisztrálsz</a>, akkor a szerkesztéseid a felhasználónevedhez lesznek társítva, egyéb hasznos funkciók mellett. Amikor először szerkesztesz, a személyes adataid védelme érdekében egy <b>ideiglenes fiók</b> jön létre neked (<a href=\"%1$s\">további információk</a>).<br /><br />Ha <a href=\"https://#login\">bejelentkezel</a> vagy <a href=\"https://#createaccount\">regisztrálsz</a>, akkor a szerkesztéseid a felhasználónevedhez lesznek társítva, egyéb hasznos funkciók mellett. + A szerkesztésed a(z) %1$s felhasználónévhez lesz társítva. Az IP-címed az adminisztrátorok számára látható lesz.<br /><br />Ha <a href=\"https://#login\">bejelentkezel</a> vagy <a href=\"https://#createaccount\">regisztrálsz</a>, akkor a szerkesztéseid egy általad választott felhasználónévhez lesznek társítva, egyéb hasznos funkciók mellett. Értem Ideiglenes fiókot használsz Változtatások elvetése és bejelentkezés @@ -1033,6 +1035,10 @@ Közreműködés Közreműködés + + szerkesztés + szerkesztés + %d nap %d nap @@ -1492,7 +1498,7 @@ Megosztás… Az olvasólista megosztása másokkal Szia! Szeretném megosztani veled a Wikipédia-olvasólistámat: - Nincsenek mentett figyelmeztető üzeneteid. + Hozzál létre saját üzeneteket, vagy használd <a href=\"#\">példaüzeneteket</a> a kezdéshez. Új üzenetek Tárgy Üzenet megfogalmazása @@ -1647,8 +1653,62 @@ Helyek a közelben További helyek a közelben Helymeghatározás engedélyezése + %s távol Ismeretlen távolság Nincsenek közeli cikkek. Próbáld kicsinyíteni és mozgatni a térképet. + Adományozó előzmények + Mentés + Adományozó állapot frissítése + Adományozó + Nem adományozó + Utoljára adományozott + Add hozzá az utolsó adományozás dátumát + Válaszd ki a dátumot + Add meg a dátumot + Soha + Visszatérő adományozó + Adományozz a Wikimedia Alapítványnak + Erről a kísérletről + Az adományozói előzmények frissítve + Segíts javítani a hozzájárulások irányítópultján + Az irányítópult ezen frissítése egy tesztfunkció. Szeretné, ha ezt a funkciót javítanák vagy eltávolítanák? + Nincs vélemény + Visszajelzés megosztása + Köszönjük az ingyenes tudás támogatását + Tagja vagy annak a 2%%-nak, amely a milliók által támasztott erőforrás támogatását választotta. Hálánk bizonyítására a hozzájárulások irányítópultját frissítettük, hogy felismerd adományozói státuszát. Szeretnéd látni a frissítést? + Nem, köszönöm + Igen, vigyél oda + Fedezd fel a hozzájárulások irányítópultjának új kiegészítéseit + A hozzájárulások irányítópultja mostantól megjeleníti az adományozói állapotokat. Szeretnéd áttekinteni ezt a kísérleti funkciót? + Nem, köszönöm + Igen, vigyél oda + Adományozó + Legyél adományozó + Adományozó állapot frissítése + App ikon + Adományozói előnyök + Kijelentkezett felhasználó + Utoljára adományozott + Frissítés + Köszönöm, hogy adományozó vagy. + Feloldottál egy ideiglenes egyéni ikont. Erre az ikonra az Alkalmazás ikon alatti beállításodban válthatsz. Szeretnéd most frissíteni az ikonodat? + Nem, köszönöm + Igen, lépj be a Beállításokba + Az alkalmazás ikonja frissítve + Legutóbbi keresések + Az olvasottakhoz kapcsolódik + Kísérlet + Erről a kísérletről + Segíts javítani a nyúlüregeket + Elégedett ezzel az ajánlott keresési eredménnyel? + Olvasásod alapján + \"%s\" ihlette + Ha később meg szeretnéd tekinteni az olvasási listát, lépj a kezdőképernyőn a Mentett lapra. + Új javasolt olvasmánylistád van. + Ez egy kísérleti funkció. A tartalom az legutóbbi olvasási előzményeiden alapul. Szeretnéd megnézni ezt az új olvasnivalót? + Kipróbálom + Talán később + A javasolt olvasnivalók listáját bármikor megtekintheted a kezdőképernyő Mentve lapján. Segíts a funkció fejlesztésében! Elégedett vagy ezzel a funkcióval? Elégedett diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index af206a779bb..9c4bed4c771 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1600,6 +1600,10 @@ Non ci sono voci nelle vicinanze. Prova a ridurre lo zoom e muovere la mappa. Mai No, grazie + Aiuta a migliorare le tane dei conigli + Ispirato da \"%s\" + Hai un nuovo elenco di letture suggerite. + Forse più tardi Aiutaci a migliorare le pagine di discussione Sei soddisfatto di questa funzionalità? Soddisfatto diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 415ef1f715f..e16eee778ec 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -289,6 +289,7 @@ 다시 실행 일괄 되돌리기 경고 + 문제가 있는 편집 %s 의도 %s %s바이트 @@ -448,6 +449,8 @@ 도구 모음 사용자 지정 <a href=\"https://en.wikipedia.org/wiki/Wikipedia:Administrators\">관리자</a>와 차단에 관해 의논할 수 있습니다. 로그인하고 있지 않습니다 + 편집을 하면 IP 주소가 편집에 연결됩니다.<br /><br />향후 편집에 대한 신뢰를 얻고 다른 기능에 접근하려면 <a href=\"https://#login\">로그인</a>하거나 <a href=\"https://#createaccount\">계정을 만드세요</a>. + 편집을 하면 개인 정보 보호를 위해 <b>임시 계정</b>이 생성됩니다. <a href=\"%1$s\">더 알아보기</a>.<br /><br />향후 편집에 대한 신뢰를 얻고 다른 기능에 접근하려면 <a href=\"https://#login\">로그인</a>하거나 <a href=\"https://#createaccount\">계정을 만드세요</a>. 알겠습니다 임시 계정을 사용하고 있습니다 변경사항을 버리고 로그인 @@ -555,6 +558,7 @@ 목록 %d개 삭제됨 기본 목록(%s)은 삭제할 수 없습니다 + %1$s 목록이 삭제되었습니다. 기본 목록(%2$s)은 삭제할 수 없습니다. 목록이 삭제되었습니다. 기본 목록(%s)은 삭제할 수 없습니다. %s (위키백과 읽기 목록).json 위키백과 읽기 목록 (%s 등).json @@ -641,6 +645,7 @@ 삭제 읽기 목록: %s 읽기 목록을 내보냈습니다 + 읽기 목록 %d개를 \'reading_lists export.json\' 이름으로 다운로드 폴더에 내보냈습니다 읽기 목록을 \'reading_lists_export.json\'으로 내보냈습니다. 내보내기 가져올 파일 선택 @@ -826,6 +831,7 @@ 오늘의 알찬글을 보여주는 위키백과의 대문 읽어볼 임의 문서를 만듭니다 위키백과의 내용 추가 제안 + 현재 위치에 기반한 주변 장소 문서 탐색 피드에서 할 일이 없습니다 사용자 지정 확인 @@ -835,8 +841,10 @@ 취소 피드의 끝에 도달했습니다. 더 불러오기 + 현재 기본 위키백과 언어로 지원되지 않는 일반 중국어 언어 유형을 사용하고 있습니다 저장 2차 언어를 업데이트해 주십시오 + 현재 지원되지 않는 일반 중국어 언어 유형을 보조 언어로 사용하고 있습니다. 설정으로 이동하여 새 보조 언어를 선택하거나 언어 목록을 확인해 주세요. 설정으로 이동 %s의 가장 많이 읽은 글 @@ -1096,7 +1104,11 @@ 제안된 그림을 위키백과 문서에 배치할지 여부를 결정하세요. 제안은 자동 생성되며 당신은 그 제안을 허가할지, 아니면 반려할지를 결정하게 됩니다. 그림은 위키미디어 공용에서 가져옵니다. 위키백과에서 사용하는 자유 라이선스 이미지의 모음집입니다. + 주제를 이해하기 위해 이 문서를 검토합니다 + 이미지와 관련 정보를 점검합니다 + 독자가 이 주제를 더 잘 이해할 수 있을지 결정합니다 다음 + 주제를 이해하고 이미지를 점검하기 위해 문서를 검토해 주십시오 죄송합니다. 현재로서는 더 이상 추천 이미지가 없습니다. 다른 <a href=\"#\">편집 제안</a>을 둘러보거나 나중에 다시 방문해 주세요. 기능에 문제가 있습니다 편집 제안에 문제가 있습니다 @@ -1448,6 +1460,7 @@ 기여 기여 필터 지도에서 보기 + 이 문서에는 지리적 좌표를 사용할 수 없습니다 공유된 읽기 목록 가져오기 나에게 공유된 목록의 이름을 어떻게 지정하시겠습니까? *새 항목* @@ -1458,7 +1471,7 @@ 공유... 이 읽기 목록을 다른 사람과 공유 안녕하세요! 저의 위키백과 읽기 목록을 당신께 공유하고 싶습니다: - 저장된 경고 메시지가 없습니다. + 시작하려면 나만의 메시지를 만들거나 <a href=\"#\">예시 메시지</a>를 사용하십시오. 새 메시지 주제 메시지 쓰기 @@ -1542,6 +1555,7 @@ 기능에 문제가 있습니다 더 알아보기 감사 표현 + 도움이 되는 편집을 보셨나요? 사용자의 기여에 감사를 표하세요. 주시 문서의 편집 내용을 추적하고 싶으신가요? 주시문서 목록에 추가하세요. \'더보기\'에서 확인하세요. 토론 @@ -1552,6 +1566,7 @@ 문서 편집 역사 피드백 문서 훼손 경고 + 편집 테스트 중립적 시각 자동 번역 이해관계의 충돌 알림 @@ -1561,6 +1576,7 @@ 검열하지 마세요 문서 개선 제안 안녕하세요, {{{username}}}님. 귀하의 [{{{diffLink}}}|최근 기여] 중 하나 이상이 건설적이지 않은 것으로 간주되어 되돌렸음을 알려드립니다. 제가 실수했다고 생각되거나 질문이 있으면 [[User talk:{{{senderUserName}}}|제 토론 문서]]에 메시지를 남겨주세요. 계속하여 훼손을 할 경우 제한을 받을 수 있습니다. + 안녕하세요 {{{username}}}님, 귀하가 위키백과에서 편집하는 방법을 배우는 데 관심을 가지게 되어 기쁩니다. 귀하가 한 편집 테스트는 효과가 있었습니다. 하지만 이 프로젝트의 목표는 모든 사람이 참조할 수 있는 신뢰할 수 있고 완전한 백과사전을 만드는 것임을 명심해야 합니다. 귀하의 편집은 콘텐츠에 영향을 미쳤으므로 제거되었습니다.\n위키백과의 편집 방법을 배우고 싶다면, [[위키백과:연습장|연습장]]을 이용하세요. 특정 문서에 대한 의견이 있으시다면, 문서의 토론 문서에서 논의할 수 있습니다. 안녕하세요, {{{username}}}님. 문서 토론 페이지에서 논의 없이 내용을 삭제하신 것 같습니다. 위키백과는 검열을 받지 않으며 논란의 여지가 있다는 이유로 내용을 삭제해서는 안 됩니다. 정보가 부정확하다고 생각되면 문서 토론 페이지에서 총의를 수립해 주세요. 메시지 플레이스홀더에 관해 알아보기 편집 @@ -1597,27 +1613,51 @@ 주변 장소 더 많은 주변 장소 위치 활성화 + %s 떨어져 있음 알 수 없는 거리 주변 장소에 관한 문서가 없습니다. 지도를 확대해서 이동해 보세요. + 기부자 역사 저장 + 기부자 상태 업데이트 + 기부자 + 기부자가 아님 마지막 기부 마지막 기부일 추가 날짜 선택 날짜 입력 + 없음 + 정기 기부자 + 위키미디어 재단에 기부하기 이 실험 정보 + 기부자 역사가 업데이트되었습니다 + 기여 대시보드 개선 지원 의견 없음 피드백 공유 자유의 지식을 지원해 주셔서 고맙습니다 아니요, 괜찮습니다 기여 대시보드에 새로 추가된 기능을 살펴보세요 + 기여 대시보드에 기부자 상태가 표시됩니다. 이 실험 기능을 평가하시겠습니까? 아니요, 괜찮습니다 + 기부자 + 기부자가 되기 + 기부자 상태 업데이트 앱 아이콘 + 기부자 혜택 로그아웃된 사용자 마지막 기부 업데이트 + 기부해 주셔서 고맙습니다. + 임시의 사용자 지정 아이콘의 잠금을 해제했습니다. 앱 아이콘 아래의 설정을 통해 이 아이콘으로 전환할 수 있습니다. 지금 아이콘을 업데이트하시겠습니까? 아니요, 괜찮습니다 예, 설정으로 이동합니다 앱 아이콘이 업데이트되었습니다 + 최근 검색 + 실험 기능 + 이 실험 기능 정보 + 검색 결과 제안에 만족하십니까? + \"%s\"에서 영감을 받음 + 지금 사용해보기 + 나중에 이 기능을 개선할 수 있도록 도와주세요 이 기능에 만족하시나요? 만족 diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 86d784586cf..c9e21fc29ec 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -1362,6 +1362,10 @@ Nee, merci Aktualiséieren Nee, merci + Iwwer dëst Experiment + Inspiréiert vun „%s“ + Probéiert et elo + Vläicht méi spéit Hëlleft eis dës Funktioun ze verbesseren Sidd Dir zefridde mat dëser Funktioun? Zefridden diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 0a582a35421..51615ddf45c 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -1704,6 +1704,20 @@ Не, благодарам Да, донеси ме на Нагодувањата Иконата на прилогот е подновена + Скорешни пребарувања + Поврзано со она што го читате + Пробно + За оваа проба + Помогнете ни да ги подобрием зајачките дупки + Дали сте задоволни со овој предлог во пребараното? + Според тоа што го читате + Поттикнато од „%s“ + Ако сакате да се навратите подоцна на вашиот список за читање, одете на јазичето „Зачувано“ на почетниот екран. + Имате нов список со предложени читања. + Ова е опитна функција. Содржините се засноваат на вашата скорешна историја на читање. Дали сакате да ги погледате овој нов список за читање? + Пробајте го сега + Можеби подоцна + Погледајте го список на предложени читање во секое време во јазичето „Зачувано“ на почетниот екран. Помогнете ни да и подобриме Разговорните страници Дали сте задоволни со оваа функција? Задоволителна е diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 46d4f5b9be6..9b1b376b8f3 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -2,6 +2,7 @@ + - - + android:layout_marginStart="8dp" + android:textColor="?attr/progressive_color" + android:textSize="@dimen/bottom_nav_label_text_size" + android:text="IPBlocked" /> + - - - - - - - - diff --git a/app/src/main/res/layout/item_app_icon.xml b/app/src/main/res/layout/item_app_icon.xml new file mode 100644 index 00000000000..d03d6d68efb --- /dev/null +++ b/app/src/main/res/layout/item_app_icon.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_donor_badge.xml b/app/src/main/res/layout/view_donor_badge.xml new file mode 100644 index 00000000000..0d57baf8bbb --- /dev/null +++ b/app/src/main/res/layout/view_donor_badge.xml @@ -0,0 +1,54 @@ + + + +