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("<", 
"&lt;").collectParameterResources();
+        List<Res> noTagRes = new ResourceCollector("<", 
"&lt;").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, "<", "&lt;");
                 }
-                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, "<", "&lt;");
+                }
+
+                // 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">&lt;span class=\"notranslate\" 
traduir=\"no\"&gt;%d&lt;/span&gt;</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 \"&lt;span 
class=\"notranslate\" traduir=\"no\"&gt;%s&lt;/span&gt;\"?</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 &lt;i&gt;offline&lt;/i&gt; 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

Reply via email to