BearND has uploaded a new change for review. https://gerrit.wikimedia.org/r/173092
Change subject: Fix translations and add more tests for them ...................................................................... Fix translations and add more tests for them Checking now if there are HTML tags iff there are any in en. Better failure output. Change-Id: I3664c56cb6282b3b60b312b1f27e7d26f87f8d01 (cherry picked from commit fdb420ade518b886818381e71d170acc1c76318b) --- M wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java M wikipedia/res/values-br/strings.xml M wikipedia/res/values-ca/strings.xml M wikipedia/res/values-ky/strings.xml M wikipedia/res/values-ms/strings.xml M wikipedia/res/values-tr/strings.xml M wikipedia/res/values-uz/strings.xml 7 files changed, 174 insertions(+), 59 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/92/173092/1 diff --git a/wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java b/wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java index 2f42067..4e794a3 100644 --- a/wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java +++ b/wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java @@ -11,6 +11,9 @@ import org.wikipedia.page.PageActivity; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Locale; /** @@ -25,7 +28,7 @@ public class TranslationTests extends ActivityInstrumentationTestCase2<PageActivity> { public static final String TAG = "TrTest"; private PageActivity activity; - private StringBuilder paramMismatches = new StringBuilder(); + private StringBuilder mismatches = new StringBuilder(); public TranslationTests() { super(PageActivity.class); @@ -42,6 +45,13 @@ } public void testAllTranslations() throws Exception { + setLocale(Locale.ROOT.toString()); + List<Res> tagRes = new ResourceCollector("<", "<").collectParameterResources(); + List<Res> noTagRes = new ResourceCollector("<", "<").not().collectParameterResources(); + List<Res> stringParamRes = new ResourceCollector("%s", "%1$s").collectParameterResources(); + List<Res> decimalParamRes = new ResourceCollector("%d", "%1$d").collectParameterResources(); + List<Res> floatParamRes = new ResourceCollector("%f", "%.2f").collectParameterResources(); + AssetManager assetManager = getInstrumentation().getTargetContext().getResources().getAssets(); for (String lang : assetManager.getLocales()) { Log.i(TAG, "----locale=" + (lang.equals("") ? "DEFAULT" : lang)); @@ -49,21 +59,55 @@ // checkAllStrings(); // might take too long // commented out during the transition from 1 param to 0 -// checkOneStringWith0Parameter(R.string.saved_pages_search_empty_message); -// checkOneStringWith0Parameter(R.string.history_search_empty_message); +// checkTranslationHasNoParameter(R.string.saved_pages_search_empty_message); +// checkTranslationHasNoParameter(R.string.history_search_empty_message); if (!lang.startsWith("qq")) { - checkOneStringWithParameter(R.string.last_updated_text); - if (!lang.startsWith("ak") && !lang.startsWith("el")) { - // taking forever to get those fixed :( - checkOneStringWithParameter(R.string.editing_error_spamblacklist); + // tag (html) parameters + for (Res res : tagRes) { + if (res.id == R.string.wp_stylized + && (lang.startsWith("iw") || lang.startsWith("he"))) { + // exceptions of the rule + continue; + } + expectContains(res, "<", "<"); } - checkOneStringWithParameter(R.string.page_protected_other); - checkOneStringWithParameter(R.string.search_redirect_title); - // TODO: build a list of all parameterized string resources from default strings dynamically first + + for (Res res : noTagRes) { + expectNotContains(res, "<", "<"); + } + + // string parameters + for (Res res : stringParamRes) { + if (res.id == R.string.editing_error_spamblacklist + && (lang.startsWith("ak") || lang.startsWith("el"))) { + // taking forever to get those fixed :( + continue; + } + checkTranslationHasParameter(res, "[stringParam]", null); + } + + if (lang.startsWith("fa") || lang.startsWith("ar") || lang.equals("bn") + || lang.equals("mr") || lang.equals("my") || lang.equals("ps")) { + // don't check the number params since those languages have different string representations for numbers + continue; + } + + // decimal parameters + for (Res res : decimalParamRes) { + final int param1 = 42; + checkTranslationHasParameter(res, param1, null); + } + + // float parameters + for (Res res : floatParamRes) { + final float param1 = .27f; + checkTranslationHasParameter(res, param1, "0,27"); +// // TODO: build a list of all parameterized string resources from default strings dynamically first + } } } - assertTrue(paramMismatches.toString(), paramMismatches.length() == 0); + assertTrue("\n" + mismatches.toString(), mismatches.length() == 0); } private Locale myLocale; @@ -79,62 +123,133 @@ } private void checkAllStrings() { - final R.string stringResources = new R.string(); - final Class<R.string> c = R.string.class; - final Field[] fields = c.getDeclaredFields(); - - for (int i = 0, max = fields.length; i < max; i++) { - final String name; - final int resourceId; - try { - name = fields[i].getName(); - resourceId = fields[i].getInt(stringResources); - } catch (Exception e) { - Log.e(TAG, myLocale + "-" + i + "; failed: " + e.getMessage()); - continue; - } - try { - String value = getInstrumentation().getTargetContext().getResources().getString(resourceId); -// Log.i(TAG, buildLogString(i, name) + " = " + value); - } catch (Resources.NotFoundException e) { - Log.w(TAG, buildLogString(i, name) + "; <not found>"); - } catch (RuntimeException e) { - Log.e(TAG, buildLogString(i, name) + "; --- " + e.getMessage()); - } - } + new ResourceCollector().collectParameterResources(); } private String buildLogString(int i, String name) { return myLocale + "-" + i + "; name = " + name; } - private void checkOneStringWith0Parameter(int resourceId) { + private void expectNotContains(Res res, String... examples) { + String translatedString = getInstrumentation().getTargetContext().getString(res.id); +// Log.i(TAG, myLocale + ":" + translatedString); + for (String example : examples) { + if (translatedString.contains(example)) { + final String msg = myLocale + ":" + res.name + " = " + translatedString + "' contains " + example; + Log.e(TAG, msg); + mismatches.append(msg).append("\n"); + break; + } + } + } + + private void expectContains(Res res, Object... examples) { + String translatedString = getInstrumentation().getTargetContext().getString(res.id); +// Log.i(TAG, myLocale + ":" + translatedString); + boolean found = false; + for (Object example : examples) { + if (translatedString.contains(example.toString())) { + found = true; + break; + } + } + if (!found) { + final String msg = myLocale + ":" + res.name + " = " + translatedString + "' does not contain " + Arrays.toString(examples); + Log.e(TAG, msg); + mismatches.append(msg).append("\n"); + } + } + + private void checkTranslationHasNoParameter(Res res) { final String param1 = "[param1]"; - String translatedString = getInstrumentation().getTargetContext().getString(resourceId, param1); + String translatedString = getInstrumentation().getTargetContext().getString(res.id, param1); // Log.i(TAG, myLocale + ":" + translatedString); if (translatedString.contains(param1)) { - final String msg = myLocale + ":" + translatedString + "' contains " + param1; + final String msg = myLocale + ":" + res.name + " = " + translatedString + "' contains " + param1; Log.e(TAG, msg); - paramMismatches.append(msg).append("\n"); + mismatches.append(msg).append("\n"); } } - public void checkOneStringWithParameter(int resourceId) throws Exception { - final String param1 = "[param1]"; - String translatedString = getInstrumentation().getTargetContext().getString(resourceId, param1); + public void checkTranslationHasParameter(Res res, Object param1, String alternate) throws Exception { + String translatedString = getInstrumentation().getTargetContext().getString(res.id, param1); // Log.i(TAG, myLocale + ":" + translatedString); - if (!translatedString.contains(param1)) { - final String msg = myLocale + ":" + translatedString + "' doesn't contain " + param1; + if (!translatedString.contains(param1.toString()) + && (alternate == null || !translatedString.contains(alternate))) { + final String msg = myLocale + ":" + res.name + " = " + translatedString + "' doesn't contain " + param1; Log.e(TAG, msg); - paramMismatches.append(msg).append("\n"); + mismatches.append(msg).append("\n"); } -// assertTrue(myLocale + ":'" + translatedString + "' doesn't contain " + param1, translatedString.contains(param1)); } -// public void testOneStringWithParameter() throws Exception { -// setLocale("de"); -// assertEquals("Zuletzt aktualisiert foo", getInstrumentation().getTargetContext().getString(R.string.last_updated_text, "foo")); -// setLocale("fa"); -// assertEquals("", getInstrumentation().getTargetContext().getString(R.string.last_updated_text, "foo")); -// } + private class ResourceCollector { + private boolean negate; + private final String[] paramExamples; + + ResourceCollector(String... paramExamples) { + this.paramExamples = paramExamples; + } + + private ResourceCollector not() { + negate = true; + return this; + } + + private List<Res> collectParameterResources() { + final List<Res> resources = new ArrayList<Res>(); + + final R.string stringResources = new R.string(); + final Class<R.string> c = R.string.class; + final Field[] fields = c.getDeclaredFields(); + + for (int i = 0, max = fields.length; i < max; i++) { + final String name; + final int resourceId; + try { + name = fields[i].getName(); + resourceId = fields[i].getInt(stringResources); + } catch (Exception e) { + Log.e(TAG, myLocale + "-" + i + "; failed: " + e.getMessage()); + continue; + } + try { + String value = getInstrumentation().getTargetContext().getResources().getString(resourceId); +// Log.i(TAG, buildLogString(i, name) + " = " + value); + if (!name.startsWith("abc_") && !name.startsWith("preference_")) { + boolean found = false; + if (value.contains("wikimediafoundation.org") && negate) { + System.out.println("found = " + found); + } + for (String paramExample : paramExamples) { + if (value.contains(paramExample)) { + found = true; + if (!negate) { + break; + } + } + } + if ((!negate && found) || (negate && !found)) { + resources.add(new Res(resourceId, name)); + } + } + } catch (Resources.NotFoundException e) { + Log.w(TAG, buildLogString(i, name) + "; <not found>"); + } catch (RuntimeException e) { + Log.e(TAG, buildLogString(i, name) + "; --- " + e.getMessage()); + } + } + + return resources; + } + } + + class Res { + private int id; + private String name; + + public Res(int id, String name) { + this.id = id; + this.name = name; + } + } } diff --git a/wikipedia/res/values-br/strings.xml b/wikipedia/res/values-br/strings.xml index f3caadd..87dbaf8 100644 --- a/wikipedia/res/values-br/strings.xml +++ b/wikipedia/res/values-br/strings.xml @@ -234,7 +234,7 @@ <string name="page_similar_titles">Pajennoù kar</string> <string name="search_within_pages">Klask er pajennoù...</string> <string name="search_no_results">Disoc\'h ebet kavet evit \"%s\".</string> - <string name="search_did_you_mean">\"$\" emezit-c\'hwi ?</string> + <string name="search_did_you_mean">\"%s\" emezit-c\'hwi ?</string> <string name="search_results_title">Klask disoc\'hoù</string> <string name="search_error_retry">Klask en-dro</string> <string name="search_redirect_title">Adkaset war-zu \"%s\"</string> diff --git a/wikipedia/res/values-ca/strings.xml b/wikipedia/res/values-ca/strings.xml index ed45701..a9925a3 100644 --- a/wikipedia/res/values-ca/strings.xml +++ b/wikipedia/res/values-ca/strings.xml @@ -47,7 +47,7 @@ <string name="nearby_empty_message">Quan us mogueu a una ubicació nova, proveu de refrescar la pàgina per saber què hi ha al voltant.</string> <string name="nearby_distance_in_meters">%d m</string> <string name="nearby_distance_in_kilometers">%.2f km</string> - <string name="nearby_distance_in_feet"><span class=\"notranslate\" traduir=\"no\">%d</span></string> + <string name="nearby_distance_in_feet" fuzzy="true">%d ft</string> <string name="nearby_distance_in_miles">%.2f mi</string> <string name="nearby_no_network">No hi ha connexió a la xarxa</string> <string name="nearby_server_error">No s\'ha pogut recuperar la llista de llocs propers.</string> @@ -235,7 +235,7 @@ <string name="page_similar_titles">Pàgines similars</string> <string name="search_within_pages">Cerca dins les pàgines…</string> <string name="search_no_results">No s\'han trobat resultats de «%s».</string> - <string name="search_did_you_mean">Voleu dir \"<span class=\"notranslate\" traduir=\"no\">%s</span>\"?</string> + <string name="search_did_you_mean">Voleu dir \"%s\"?</string> <string name="search_results_title">Resultats de cerca</string> <string name="search_error_retry">Torna a provar</string> <string name="search_redirect_title">Redirecció de «%s».</string> diff --git a/wikipedia/res/values-ky/strings.xml b/wikipedia/res/values-ky/strings.xml index 25e3bf1..987f9c3 100644 --- a/wikipedia/res/values-ky/strings.xml +++ b/wikipedia/res/values-ky/strings.xml @@ -47,7 +47,7 @@ <string name="nearby_empty_message">Сиз башка жерге жылгандан кийин, сиз жакта эмне бар экенин билүү үчүн бул баракты жаңылап көрүңүз.</string> <string name="nearby_distance_in_meters">%d м</string> <string name="nearby_distance_in_kilometers">%.2f км</string> - <string name="nearby_distance_in_feet">%.2f фут</string> + <string name="nearby_distance_in_feet">%d фут</string> <string name="nearby_distance_in_miles">%.2f миль</string> <string name="nearby_no_network">Тармактык туташуу жокко эсе</string> <string name="nearby_server_error">Жакынкы жерлердин тизмесин алууга мүмкүнчүлүк болбоду.</string> diff --git a/wikipedia/res/values-ms/strings.xml b/wikipedia/res/values-ms/strings.xml index 5b233a0..a627da1 100644 --- a/wikipedia/res/values-ms/strings.xml +++ b/wikipedia/res/values-ms/strings.xml @@ -245,13 +245,13 @@ <string name="toc_hint">Leret ke kiri untuk bahagian, atau gunakan butang menu di kanan atas.</string> <string name="toc_know_it">Saya faham</string> <string name="error_browser_not_found">Tidak dapat membuka laman web (tiada aplikasi pelayar ditemui).</string> - <string name="app_store_description">Aplikasi rasmi Wikipedia untuk Android. Wikipedia merupakan ensiklopedia bebas yang mengandungi lebih daripada 32 juta rencana dalam 280 bahasa, bahkan merupakan bahan rujukan paling menyeluruh dan meluas digunakan yang pernah dihimpunkan oleh manusia. Aplikasi ini telah ditulis ganti dari pangkal dan oleh itu lebih baik daripada dahulu. + <string name="app_store_description" fuzzy="true">Aplikasi rasmi Wikipedia untuk Android. Wikipedia merupakan ensiklopedia bebas yang mengandungi lebih daripada 32 juta rencana dalam 280 bahasa, bahkan merupakan bahan rujukan paling menyeluruh dan meluas digunakan yang pernah dihimpunkan oleh manusia. Aplikasi ini telah ditulis ganti dari pangkal dan oleh itu lebih baik daripada dahulu. Ciri-ciri: - Kelajuan: Aplikasi asli baru kami membolehkan anda untuk melayari dan menyunting Wikipedia dengan lebih cepat daripada dahulu. - Penyuntingan: Anda boleh menyunting Wikipedia! Tak kira yang log masuk mahupun keluar, kami amat menghargai sumbangan anda. - Laman terbaru: Kami menyediakan sejarah pembacaan supaya anda boleh mengetik sebanyak mana pautan yang anda mahu tanpa sesekali tersesat jalan. - - Laman simpanan: Anda boleh menyimpan laman-laman terpilih untuk dibaca secara <i>offline</i> dan juga dilayari walaupun tiada sambungan data. + - Laman simpanan: Anda boleh menyimpan laman-laman terpilih untuk dibaca secara offline dan juga dilayari walaupun tiada sambungan data. - Perkongsian: Gunakan aplikasi media sosial sedia anda untuk menyebarkan seluruh ilmu pengetahuan insan. - Sokongan bahasa: Aplikasi ini membolehkan anda untuk menukar bahasa bacaan Wikipedia dengan lancar. - Wikipedia Zero: Caj data dikecualikan untuk pengendali khidmat telekom selular yang mengambil bahagian. diff --git a/wikipedia/res/values-tr/strings.xml b/wikipedia/res/values-tr/strings.xml index c3bb2af..c28237e 100644 --- a/wikipedia/res/values-tr/strings.xml +++ b/wikipedia/res/values-tr/strings.xml @@ -235,7 +235,7 @@ <string name="page_similar_titles">Benzer sayfalar</string> <string name="search_within_pages">Sayfalar içinde ara...</string> <string name="search_no_results">\"%s\" için hiçbir sonuç bulunamadı.</string> - <string name="search_did_you_mean">Bunu mu demek istediniz: \"$1\"?</string> + <string name="search_did_you_mean">Bunu mu demek istediniz: \"%s\"?</string> <string name="search_results_title">Arama sonuçları</string> <string name="search_error_retry">Tekrar dene</string> <string name="search_redirect_title">\"%s\" sayfasından yönlendirme.</string> diff --git a/wikipedia/res/values-uz/strings.xml b/wikipedia/res/values-uz/strings.xml index 5dc5db5..c03d0c1 100644 --- a/wikipedia/res/values-uz/strings.xml +++ b/wikipedia/res/values-uz/strings.xml @@ -45,7 +45,7 @@ <string name="menu_update_nearby">Yaqin atrofni yangilash</string> <string name="nearby_empty_title">Yaqin atrof bilan bog‘liq sahifalar topilmadi!</string> <string name="nearby_empty_message">Ko‘chib o‘tganingizda atrofingiz haqida o‘rganish uchun ushbu sahifani yangilab ko‘ring.</string> - <string name="nearby_distance_in_meters">% m</string> + <string name="nearby_distance_in_meters">%d m</string> <string name="nearby_distance_in_kilometers">%.2f km</string> <string name="nearby_distance_in_feet">%d ft</string> <string name="nearby_distance_in_miles">%.2f mi</string> -- To view, visit https://gerrit.wikimedia.org/r/173092 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I3664c56cb6282b3b60b312b1f27e7d26f87f8d01 Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: BearND <bsitzm...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits