diff --git a/java/res/values-ar/donottranslate-more-keys.xml b/java/res/values-ar/donottranslate-more-keys.xml
index e49677adb..6a14a3c55 100644
--- a/java/res/values-ar/donottranslate-more-keys.xml
+++ b/java/res/values-ar/donottranslate-more-keys.xml
@@ -50,18 +50,18 @@
"٨"
"٩"
"٠"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
- 0,\u066b,\u066c
+ 0,\u066b,\u066c
\u060c
\u060c
\u061f
diff --git a/java/res/values-ca/donottranslate-more-keys.xml b/java/res/values-ca/donottranslate-more-keys.xml
index bd9fb7ccd..512a86110 100644
--- a/java/res/values-ca/donottranslate-more-keys.xml
+++ b/java/res/values-ca/donottranslate-more-keys.xml
@@ -19,10 +19,10 @@
-->
à,á,ä,â,ã,å,ą,æ,ā,ª
- 3,è,é,ë,ê,ę,ė,ē
- 8,í,ï,ì,î,į,ī
- 9,ò,ó,ö,ô,õ,ø,œ,ō,º
- 7,ú,ü,ù,û,ū
+ è,é,ë,ê,ę,ė,ē
+ í,ï,ì,î,į,ī
+ ò,ó,ö,ô,õ,ø,œ,ō,º
+ ú,ü,ù,û,ū
ñ,ń
ç,ć,č
ŀ,ł
diff --git a/java/res/values-cs/donottranslate-more-keys.xml b/java/res/values-cs/donottranslate-more-keys.xml
index 70b3f3ee7..3701adb1b 100644
--- a/java/res/values-cs/donottranslate-more-keys.xml
+++ b/java/res/values-cs/donottranslate-more-keys.xml
@@ -19,16 +19,16 @@
-->
á,à,â,ä,æ,ã,å,ā
- 3,é,ě,è,ê,ë,ę,ė,ē
- 8,í,î,ï,ì,į,ī
- 9,ó,ö,ô,ò,õ,œ,ø,ō
- 7,ú,ů,û,ü,ù,ū
+ é,ě,è,ê,ë,ę,ė,ē
+ í,î,ï,ì,į,ī
+ ó,ö,ô,ò,õ,œ,ø,ō
+ ú,ů,û,ü,ù,ū
š,ß,ś
ň,ñ,ń
č,ç,ć
ý,ÿ
ď
- 4,ř
- 5,ť
- 6,ž,ź,ż
+ ř
+ ť
+ ž,ź,ż
diff --git a/java/res/values-da/donottranslate-more-keys.xml b/java/res/values-da/donottranslate-more-keys.xml
index bed034d40..b1c8d2072 100644
--- a/java/res/values-da/donottranslate-more-keys.xml
+++ b/java/res/values-da/donottranslate-more-keys.xml
@@ -19,13 +19,13 @@
-->
á,ä,à,â,ã,ā
- 3,é,ë
- 8,í,ï
- 9,ó,ô,ò,õ,œ,ō
- 7,ú,ü,û,ù,ū
+ é,ë
+ í,ï
+ ó,ô,ò,õ,œ,ō
+ ú,ü,û,ù,ū
ß,ś,š
ñ,ń
- 6,ý,ÿ
+ ý,ÿ
ð
ł
å
diff --git a/java/res/values-de-rZZ/donottranslate-more-keys.xml b/java/res/values-de-rZZ/donottranslate-more-keys.xml
deleted file mode 100644
index e7ec5e152..000000000
--- a/java/res/values-de-rZZ/donottranslate-more-keys.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- 6
-
-
diff --git a/java/res/values-de/donottranslate-more-keys.xml b/java/res/values-de/donottranslate-more-keys.xml
index 80aa32ae2..48462c59d 100644
--- a/java/res/values-de/donottranslate-more-keys.xml
+++ b/java/res/values-de/donottranslate-more-keys.xml
@@ -19,11 +19,9 @@
-->
ä,â,à,á,æ,ã,å,ā
- 3,ė
- 9,ö,ô,ò,ó,õ,œ,ø,ō
- 7,ü,û,ù,ú,ū
+ ė
+ ö,ô,ò,ó,õ,œ,ø,ō
+ ü,û,ù,ú,ū
ß,ś,š
ñ,ń
-
- 6
diff --git a/java/res/values-en/donottranslate-more-keys.xml b/java/res/values-en/donottranslate-more-keys.xml
index bc26c6aa0..9073d3b4f 100644
--- a/java/res/values-en/donottranslate-more-keys.xml
+++ b/java/res/values-en/donottranslate-more-keys.xml
@@ -19,11 +19,11 @@
-->
à,á,â,ä,æ,ã,å,ā
- 3,è,é,ê,ë,ē
- 8,î,ï,í,ī,ì
- 9,ô,ö,ò,ó,œ,ø,ō,õ
+ è,é,ê,ë,ē
+ î,ï,í,ī,ì
+ ô,ö,ò,ó,œ,ø,ō,õ
ß
- 7,û,ü,ù,ú,ū
+ û,ü,ù,ú,ū
ñ
ç
diff --git a/java/res/values-es/donottranslate-more-keys.xml b/java/res/values-es/donottranslate-more-keys.xml
index d5a8ed19d..429273647 100644
--- a/java/res/values-es/donottranslate-more-keys.xml
+++ b/java/res/values-es/donottranslate-more-keys.xml
@@ -19,10 +19,10 @@
-->
á,à,ä,â,ã,å,ą,æ,ā,ª
- 3,é,è,ë,ê,ę,ė,ē
- 8,í,ï,ì,î,į,ī
- 9,ó,ò,ö,ô,õ,ø,œ,ō,º
- 7,ú,ü,ù,û,ū
+ é,è,ë,ê,ę,ė,ē
+ í,ï,ì,î,į,ī
+ ó,ò,ö,ô,õ,ø,œ,ō,º
+ ú,ü,ù,û,ū
ñ,ń
ç,ć,č
"\\,,\?,!,¿,¡,:,-,\',\",),(,/,;,+,&,\@"
diff --git a/java/res/values-et/donottranslate-more-keys.xml b/java/res/values-et/donottranslate-more-keys.xml
index 1011347cd..bda22fcec 100644
--- a/java/res/values-et/donottranslate-more-keys.xml
+++ b/java/res/values-et/donottranslate-more-keys.xml
@@ -19,17 +19,17 @@
-->
ä,ā,à,á,â,ã,å,æ,ą
- 3,ē,è,ė,é,ê,ë,ę,ě
- 8,ī,ì,į,í,î,ï,ı
- 9,ö,õ,ò,ó,ô,œ,ő,ø
- 7,ü,ū,ų,ù,ú,û,ů,ű
+ ē,è,ė,é,ê,ë,ę,ě
+ ī,ì,į,í,î,ï,ı
+ ö,õ,ò,ó,ô,œ,ő,ø
+ ü,ū,ų,ù,ú,û,ů,ű
š,ß,ś,ş
ņ,ñ,ń,ń
č,ç,ć
- 6,ý,ÿ
+ ý,ÿ
ď
- 4,ŗ,ř,ŕ
- 5,ţ,ť
+ ŗ,ř,ŕ
+ ţ,ť
ž,ż,ź
ķ
ļ,ł,ĺ,ľ
diff --git a/java/res/values-fi/donottranslate-more-keys.xml b/java/res/values-fi/donottranslate-more-keys.xml
index e1dfa2bcf..b922fe21d 100644
--- a/java/res/values-fi/donottranslate-more-keys.xml
+++ b/java/res/values-fi/donottranslate-more-keys.xml
@@ -19,8 +19,8 @@
-->
æ,à,á,â,ã,ā
- 9,ø,ô,ò,ó,õ,œ,ō
- 7,ü
+ ø,ô,ò,ó,õ,œ,ō
+ ü
š,ß,ś
ž,ź,ż
å
diff --git a/java/res/values-fr-rCA/donottranslate-more-keys.xml b/java/res/values-fr-rCA/donottranslate-more-keys.xml
deleted file mode 100644
index 80e9d9346..000000000
--- a/java/res/values-fr-rCA/donottranslate-more-keys.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
- à,â,æ,á,ä,ã,å,ā,ª
- 1
- 2
-
-
diff --git a/java/res/values-fr-rCH/donottranslate-more-keys.xml b/java/res/values-fr-rCH/donottranslate-more-keys.xml
deleted file mode 100644
index 561c5e52f..000000000
--- a/java/res/values-fr-rCH/donottranslate-more-keys.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
- à,â,æ,á,ä,ã,å,ā,ª
- ÿ
- 1
- 2
- 6
-
diff --git a/java/res/values-fr/donottranslate-more-keys.xml b/java/res/values-fr/donottranslate-more-keys.xml
index cd6d49bad..0f78e7cd9 100644
--- a/java/res/values-fr/donottranslate-more-keys.xml
+++ b/java/res/values-fr/donottranslate-more-keys.xml
@@ -18,14 +18,11 @@
*/
-->
- à,â,1,æ,á,ä,ã,å,ā,ª
- é,è,ê,ë,3,ę,ė,ē
- î,8,ï,ì,í,į,ī
- ô,œ,9,ö,ò,ó,õ,ø,ō,º
- ù,û,7,ü,ú,ū
+ à,â,%,æ,á,ä,ã,å,ā,ª
+ é,è,ê,ë,%,ę,ė,ē
+ î,%,ï,ì,í,į,ī
+ ô,œ,%,ö,ò,ó,õ,ø,ō,º
+ ù,û,%,ü,ú,ū
ç,ć,č
- 6,ÿ
-
-
- 2
+ %,ÿ
diff --git a/java/res/values-hr/donottranslate-more-keys.xml b/java/res/values-hr/donottranslate-more-keys.xml
index c34e0e646..112c444c3 100644
--- a/java/res/values-hr/donottranslate-more-keys.xml
+++ b/java/res/values-hr/donottranslate-more-keys.xml
@@ -21,7 +21,7 @@
š,ś,ß
ñ,ń
- 6,ž,ź,ż
+ ž,ź,ż
č,ć,ç
đ
diff --git a/java/res/values-hu/donottranslate-more-keys.xml b/java/res/values-hu/donottranslate-more-keys.xml
index 42b330199..cc23dff48 100644
--- a/java/res/values-hu/donottranslate-more-keys.xml
+++ b/java/res/values-hu/donottranslate-more-keys.xml
@@ -19,10 +19,8 @@
-->
á,à,â,ä,æ,ã,å,ā
- 3,é,è,ê,ë,ę,ė,ē
- 8,í,î,ï,ì,į,ī
- 9,ó,ö,ő,ô,ò,õ,œ,ø,ō
- 7,ú,ü,ű,û,ù,ū
-
- 6
+ é,è,ê,ë,ę,ė,ē
+ í,î,ï,ì,į,ī
+ ó,ö,ő,ô,ò,õ,œ,ø,ō
+ ú,ü,ű,û,ù,ū
diff --git a/java/res/values-it/donottranslate-more-keys.xml b/java/res/values-it/donottranslate-more-keys.xml
index fa1537bec..69659a389 100644
--- a/java/res/values-it/donottranslate-more-keys.xml
+++ b/java/res/values-it/donottranslate-more-keys.xml
@@ -19,8 +19,8 @@
-->
à,á,â,ä,æ,ã,å,ā,ª
- 3,è,é,ê,ë,ę,ė,ē
- 8,ì,í,î,ï,į,ī
- 9,ò,ó,ô,ö,õ,œ,ø,ō,º
- 7,ù,ú,û,ü,ū
+ è,é,ê,ë,ę,ė,ē
+ ì,í,î,ï,į,ī
+ ò,ó,ô,ö,õ,œ,ø,ō,º
+ ù,ú,û,ü,ū
diff --git a/java/res/values-ky/donottranslate-more-keys.xml b/java/res/values-ky/donottranslate-more-keys.xml
index d56cde577..44720aa7f 100644
--- a/java/res/values-ky/donottranslate-more-keys.xml
+++ b/java/res/values-ky/donottranslate-more-keys.xml
@@ -18,7 +18,7 @@
*/
-->
- 3,ү
- 6,ң
+ ү
+ ң
ө
diff --git a/java/res/values-lt/donottranslate-more-keys.xml b/java/res/values-lt/donottranslate-more-keys.xml
index e36ce6a66..fc6c84b2d 100644
--- a/java/res/values-lt/donottranslate-more-keys.xml
+++ b/java/res/values-lt/donottranslate-more-keys.xml
@@ -19,17 +19,17 @@
-->
ą,ä,ā,à,á,â,ã,å,æ
- 3,ė,ę,ē,è,é,ê,ë,ě
- 8,į,ī,ì,í,î,ï,ı
- 9,ö,õ,ò,ó,ô,œ,ő,ø
- 7,ū,ų,ü,ū,ù,ú,û,ů,ű
+ ė,ę,ē,è,é,ê,ë,ě
+ į,ī,ì,í,î,ï,ı
+ ö,õ,ò,ó,ô,œ,ő,ø
+ ū,ų,ü,ū,ù,ú,û,ů,ű
š,ß,ś,ş
ņ,ñ,ń,ń
č,ç,ć
- 6,ý,ÿ
+ ý,ÿ
ď
- 4,ŗ,ř,ŕ
- 5,ţ,ť
+ ŗ,ř,ŕ
+ ţ,ť
ž,ż,ź
ķ
ļ,ł,ĺ,ľ
diff --git a/java/res/values-lv/donottranslate-more-keys.xml b/java/res/values-lv/donottranslate-more-keys.xml
index 8514e738d..3b937dfe3 100644
--- a/java/res/values-lv/donottranslate-more-keys.xml
+++ b/java/res/values-lv/donottranslate-more-keys.xml
@@ -19,17 +19,17 @@
-->
ā,à,á,â,ã,ä,å,æ,ą
- 3,ē,ė,è,é,ê,ë,ę,ě
- 8,ī,į,ì,í,î,ï,ı
- 9,ò,ó,ô,õ,ö,œ,ő,ø
- 7,ū,ų,ù,ú,û,ü,ů,ű
+ ē,ė,è,é,ê,ë,ę,ě
+ ī,į,ì,í,î,ï,ı
+ ò,ó,ô,õ,ö,œ,ő,ø
+ ū,ų,ù,ú,û,ü,ů,ű
š,ß,ś,ş
ņ,ñ,ń,ń
č,ç,ć
- 6,ý,ÿ
+ ý,ÿ
ď
- 4,ŗ,ř,ŕ
- 5,ţ,ť
+ ŗ,ř,ŕ
+ ţ,ť
ž,ż,ź
ķ
ļ,ł,ĺ,ľ
diff --git a/java/res/values-nb/donottranslate-more-keys.xml b/java/res/values-nb/donottranslate-more-keys.xml
index e83d6b768..cf6e4d1ce 100644
--- a/java/res/values-nb/donottranslate-more-keys.xml
+++ b/java/res/values-nb/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
-->
à,ä,á,â,ã,ā
- 3,é,è,ê,ë,ę,ė,ē
- 9,ô,ò,ó,ö,õ,œ,ō
- 7,ü,û,ù,ú,ū
+ é,è,ê,ë,ę,ė,ē
+ ô,ò,ó,ö,õ,œ,ō
+ ü,û,ù,ú,ū
å
ø
æ
diff --git a/java/res/values-nl/donottranslate-more-keys.xml b/java/res/values-nl/donottranslate-more-keys.xml
index 49cc41964..ac03872f3 100644
--- a/java/res/values-nl/donottranslate-more-keys.xml
+++ b/java/res/values-nl/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
-->
á,ä,â,à,æ,ã,å,ā
- 3,é,ë,ê,è,ę,ė,ē
- 8,í,ï,ì,î,į,ī
- 9,ó,ö,ô,ò,õ,œ,ø,ō
- 7,ú,ü,û,ù,ū
+ é,ë,ê,è,ę,ė,ē
+ í,ï,ì,î,į,ī
+ ó,ö,ô,ò,õ,œ,ø,ō
+ ú,ü,û,ù,ū
ñ,ń
diff --git a/java/res/values-pl/donottranslate-more-keys.xml b/java/res/values-pl/donottranslate-more-keys.xml
index 18e149991..84e74e849 100644
--- a/java/res/values-pl/donottranslate-more-keys.xml
+++ b/java/res/values-pl/donottranslate-more-keys.xml
@@ -19,8 +19,8 @@
-->
ą,á,à,â,ä,æ,ã,å,ā
- 3,ę,è,é,ê,ë,ė,ē
- 9,ó,ö,ô,ò,õ,œ,ø,ō
+ ę,è,é,ê,ë,ė,ē
+ ó,ö,ô,ò,õ,œ,ø,ō
ś,ß,š
ń,ñ
ć,ç,č
diff --git a/java/res/values-pt/donottranslate-more-keys.xml b/java/res/values-pt/donottranslate-more-keys.xml
index 31d9417ab..868fe7824 100644
--- a/java/res/values-pt/donottranslate-more-keys.xml
+++ b/java/res/values-pt/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
-->
á,ã,à,â,ä,å,æ,ª
- 3,é,ê,è,ę,ė,ē,ë
- 8,í,î,ì,ï,į,ī
- 9,ó,õ,ô,ò,ö,œ,ø,ō,º
- 7,ú,ü,ù,û,ū
+ é,ê,è,ę,ė,ē,ë
+ í,î,ì,ï,į,ī
+ ó,õ,ô,ò,ö,œ,ø,ō,º
+ ú,ü,ù,û,ū
ç,č,ć
diff --git a/java/res/values-rm/donottranslate-more-keys.xml b/java/res/values-rm/donottranslate-more-keys.xml
index ea9a55944..c40c29b13 100644
--- a/java/res/values-rm/donottranslate-more-keys.xml
+++ b/java/res/values-rm/donottranslate-more-keys.xml
@@ -18,5 +18,5 @@
*/
-->
- 9,ò,ó,ö,ô,õ,œ,ø
+ ò,ó,ö,ô,õ,œ,ø
diff --git a/java/res/values-ro/donottranslate-more-keys.xml b/java/res/values-ro/donottranslate-more-keys.xml
index 51df56099..42fd91336 100644
--- a/java/res/values-ro/donottranslate-more-keys.xml
+++ b/java/res/values-ro/donottranslate-more-keys.xml
@@ -19,7 +19,7 @@
-->
â,ã,ă,à,á,ä,æ,å,ā
- 8,î,ï,ì,í,į,ī
+ î,ï,ì,í,į,ī
ș,ß,ś,š
- 5,ț
+ ț
diff --git a/java/res/values-ru/donottranslate-more-keys.xml b/java/res/values-ru/donottranslate-more-keys.xml
index 7ae9ffbda..b7e74660d 100644
--- a/java/res/values-ru/donottranslate-more-keys.xml
+++ b/java/res/values-ru/donottranslate-more-keys.xml
@@ -18,5 +18,5 @@
*/
-->
- 5,ё
+ ё
diff --git a/java/res/values-sk/donottranslate-more-keys.xml b/java/res/values-sk/donottranslate-more-keys.xml
index b6b35c1a3..574eedb1f 100644
--- a/java/res/values-sk/donottranslate-more-keys.xml
+++ b/java/res/values-sk/donottranslate-more-keys.xml
@@ -19,17 +19,17 @@
-->
á,ä,ā,à,â,ã,å,æ,ą
- 3,é,ě,ē,ė,è,ê,ë,ę
- 8,í,ī,į,ì,î,ï,ı
- 9,ô,ó,ö,ò,õ,œ,ő,ø
- 7,ú,ů,ü,ū,ų,ù,û,ű
+ é,ě,ē,ė,è,ê,ë,ę
+ í,ī,į,ì,î,ï,ı
+ ô,ó,ö,ò,õ,œ,ő,ø
+ ú,ů,ü,ū,ų,ù,û,ű
š,ß,ś,ş
ň,ņ,ñ,ń,ń
č,ç,ć
- 6,ý,ÿ
+ ý,ÿ
ď
- 4,ŕ,ř,ŗ
- 5,ť,ţ
+ ŕ,ř,ŗ
+ ť,ţ
ž,ż,ź
ķ
ľ,ĺ,ļ,ł
diff --git a/java/res/values-sv/donottranslate-more-keys.xml b/java/res/values-sv/donottranslate-more-keys.xml
index d391be5ab..6d9800e57 100644
--- a/java/res/values-sv/donottranslate-more-keys.xml
+++ b/java/res/values-sv/donottranslate-more-keys.xml
@@ -18,9 +18,9 @@
*/
-->
- 3,é,è,ê,ë,ę
- 9,œ,ô,ò,ó,õ,ō
- 7,ü,û,ù,ú,ū
+ é,è,ê,ë,ę
+ œ,ô,ò,ó,õ,ō
+ ü,û,ù,ú,ū
ß,ś,š
å
ö
diff --git a/java/res/values-sw600dp/config.xml b/java/res/values-sw600dp/config.xml
index 35da3009f..40c674190 100644
--- a/java/res/values-sw600dp/config.xml
+++ b/java/res/values-sw600dp/config.xml
@@ -24,7 +24,6 @@
false
false
false
- false
false
true
diff --git a/java/res/values-sw768dp/config.xml b/java/res/values-sw768dp/config.xml
index ddeadaf0f..98d722aba 100644
--- a/java/res/values-sw768dp/config.xml
+++ b/java/res/values-sw768dp/config.xml
@@ -24,7 +24,6 @@
false
false
false
- false
false
true
diff --git a/java/res/values-tr/donottranslate-more-keys.xml b/java/res/values-tr/donottranslate-more-keys.xml
index 6906b3580..227ebf98c 100644
--- a/java/res/values-tr/donottranslate-more-keys.xml
+++ b/java/res/values-tr/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
-->
â
- 8,ı,î,ï,ì,í,į,ī
- 9,ö,ô,œ,ò,ó,õ,ø,ō
- 7,ü,û,ù,ú,ū
+ ı,î,ï,ì,í,į,ī
+ ö,ô,œ,ò,ó,õ,ø,ō
+ ü,û,ù,ú,ū
ş,ß,ś,š
ğ
ç,ć,č
diff --git a/java/res/values-vi/donottranslate-more-keys.xml b/java/res/values-vi/donottranslate-more-keys.xml
index 97a7d79ae..9e2f6b8fd 100644
--- a/java/res/values-vi/donottranslate-more-keys.xml
+++ b/java/res/values-vi/donottranslate-more-keys.xml
@@ -19,10 +19,10 @@
-->
à,á,ả,ã,ạ,ă,ằ,ắ,ẳ,ẵ,ặ,â,ầ,ấ,ẩ,ẫ,ậ
- 3,è,é,ẻ,ẽ,ẹ,ê,ề,ế,ể,ễ,ệ
- 8,ì,í,ỉ,ĩ,ị
- 9,ò,ó,ỏ,õ,ọ,ô,ồ,ố,ổ,ỗ,ộ,ơ,ờ,ớ,ở,ỡ,ợ
- 7,ù,ú,ủ,ũ,ụ,ư,ừ,ứ,ử,ữ,ự
- 6,ỳ,ý,ỷ,ỹ,ỵ
+ è,é,ẻ,ẽ,ẹ,ê,ề,ế,ể,ễ,ệ
+ ì,í,ỉ,ĩ,ị
+ ò,ó,ỏ,õ,ọ,ô,ồ,ố,ổ,ỗ,ộ,ơ,ờ,ớ,ở,ỡ,ợ
+ ù,ú,ủ,ũ,ụ,ư,ừ,ứ,ử,ữ,ự
+ ỳ,ý,ỷ,ỹ,ỵ
đ
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index bd7c550c1..8d00f7aa5 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -227,6 +227,12 @@
+
+
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 32041df74..c3f8edf8a 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -27,7 +27,6 @@
true
true
- true
true
- 3
- 8
- 9
- 7
+
+
+
+
- 6
- 1
- 2
+
- 4
- 5
+
+
- 0
@@ -46,9 +43,9 @@
щ
ы
и
- 3
- 5
- 6
+
+
+
ъ
@@ -74,6 +71,16 @@
8
9
0
+
+
+
+
+
+
+
+
+
+
¹,½,⅓,¼,⅛
²,⅔
³,¾,⅜
diff --git a/java/res/xml-sw600dp/row_qwerty1.xml b/java/res/xml-sw600dp/row_qwerty1.xml
index 07d8e2296..3d3a1a8ff 100644
--- a/java/res/xml-sw600dp/row_qwerty1.xml
+++ b/java/res/xml-sw600dp/row_qwerty1.xml
@@ -25,11 +25,9 @@
latin:keyWidth="9.0%p"
>
+ latin:keyLabel="q" />
+ latin:keyLabel="w" />
@@ -52,8 +50,7 @@
latin:keyLabel="o"
latin:moreKeys="@string/more_keys_for_o" />
+ latin:keyLabel="p" />
+ latin:keyLabel="p" />
+ latin:keyLabel="w" />
+ latin:keyLabel="q" />
+ latin:keyLabel="w" />
@@ -54,8 +52,7 @@
latin:keyLabel="o"
latin:moreKeys="@string/more_keys_for_o" />
+ latin:keyLabel="p" />
+ latin:keyLabel="q" />
+ latin:keyLabel="w" />
@@ -54,8 +52,7 @@
latin:keyLabel="o"
latin:moreKeys="@string/more_keys_for_o" />
+ latin:keyLabel="p" />
+ latin:keyLabel="q" />
+ latin:keyLabel="w" />
@@ -56,8 +54,7 @@
latin:keyLabel="o"
latin:moreKeys="@string/more_keys_for_o" />
+ latin:keyLabel="p" />
+ latin:keyLabel="p" />
+ latin:keyLabel="q" />
@@ -110,8 +108,7 @@
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="13.829%p" />
+ latin:keyLabel="w" />
+ latin:keyLabel="q" />
+ latin:keyLabel="w" />
@@ -58,8 +56,7 @@
latin:keyLabel="o"
latin:moreKeys="@string/more_keys_for_o" />
+ latin:keyLabel="p" />
+ latin:keyLabel="q" />
+ latin:keyLabel="w" />
@@ -58,8 +56,7 @@
latin:keyLabel="o"
latin:moreKeys="@string/more_keys_for_o" />
+ latin:keyLabel="p" />
+ latin:additionalMoreKeys="1" />
+ latin:additionalMoreKeys="2" />
diff --git a/java/res/xml/rows_arabic.xml b/java/res/xml/rows_arabic.xml
index dcee10ef5..2dcd831c2 100644
--- a/java/res/xml/rows_arabic.xml
+++ b/java/res/xml/rows_arabic.xml
@@ -30,18 +30,19 @@
+ latin:additionalMoreKeys="1,١" />
+ latin:additionalMoreKeys="2,٢" />
+ latin:additionalMoreKeys="3,٣"
+ latin:moreKeys="\u06a8" />
+ latin:additionalMoreKeys="5,٥" />
+ latin:additionalMoreKeys="6,٦" />
+ latin:additionalMoreKeys="7,٧"
+ latin:moreKeys="\ufeeb|\u0647\u200D" />
+ latin:additionalMoreKeys="8,٨" />
+ latin:additionalMoreKeys="9,٩" />
+ latin:keyLabel="q" />
@@ -107,8 +115,7 @@
latin:keyWidth="15%p"
latin:visualInsetsRight="1%p" />
+ latin:keyLabel="w" />
+ latin:additionalMoreKeys="1" />
+ latin:additionalMoreKeys="2" />
+ latin:additionalMoreKeys="3" />
+ latin:additionalMoreKeys="4" />
+ latin:additionalMoreKeys="5" />
+ latin:additionalMoreKeys="6" />
+ latin:additionalMoreKeys="7" />
+ latin:additionalMoreKeys="8"
+ latin:moreKeys="ѝ" />
+ latin:additionalMoreKeys="9" />
+ latin:additionalMoreKeys="0" />
diff --git a/java/res/xml/rows_qwertz.xml b/java/res/xml/rows_qwertz.xml
index e578f9aaa..11fd9332c 100644
--- a/java/res/xml/rows_qwertz.xml
+++ b/java/res/xml/rows_qwertz.xml
@@ -29,43 +29,50 @@
+ latin:additionalMoreKeys="1" />
+ latin:additionalMoreKeys="2" />
+ latin:additionalMoreKeys="1" />
+ latin:additionalMoreKeys="2" />
+ latin:additionalMoreKeys="0" />
diff --git a/java/res/xml/rows_serbian.xml b/java/res/xml/rows_serbian.xml
index beb04d524..d2203ce9c 100644
--- a/java/res/xml/rows_serbian.xml
+++ b/java/res/xml/rows_serbian.xml
@@ -29,43 +29,43 @@
+ latin:additionalMoreKeys="1" />
+ latin:additionalMoreKeys="2" />
+ latin:additionalMoreKeys="3" />
+ latin:additionalMoreKeys="4" />
+ latin:additionalMoreKeys="5" />
+ latin:additionalMoreKeys="6" />
+ latin:additionalMoreKeys="7" />
+ latin:additionalMoreKeys="8" />
+ latin:additionalMoreKeys="9" />
+ latin:additionalMoreKeys="0" />
diff --git a/java/res/xml/rows_slavic.xml b/java/res/xml/rows_slavic.xml
index 52f5af4c9..71e442c7c 100644
--- a/java/res/xml/rows_slavic.xml
+++ b/java/res/xml/rows_slavic.xml
@@ -29,43 +29,46 @@
+ latin:additionalMoreKeys="1" />
+ latin:additionalMoreKeys="2" />
+ latin:additionalMoreKeys="4" />
+ latin:additionalMoreKeys="7" />
+ latin:additionalMoreKeys="8" />
+ latin:additionalMoreKeys="9" />
+ latin:additionalMoreKeys="0" />
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index bb90653c1..a2d379643 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -285,22 +285,17 @@ public class Key {
mLabelFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags, 0);
final boolean preserveCase = (mLabelFlags & LABEL_FLAGS_PRESERVE_CASE) != 0;
- final String[] moreKeys = style.getStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
+ final String[] additionalMoreKeys = style.getStringArray(
+ keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys);
+ final String[] moreKeys = MoreKeySpecParser.insertAddtionalMoreKeys(style.getStringArray(
+ keyAttr, R.styleable.Keyboard_Key_moreKeys), additionalMoreKeys);
if (moreKeys != null) {
for (int i = 0; i < moreKeys.length; i++) {
moreKeys[i] = adjustCaseOfStringForKeyboardId(
moreKeys[i], preserveCase, params.mId);
}
}
- // TODO: Add new key label flag to control this.
- // In Arabic symbol layouts, we'd like to keep digits in more keys regardless of
- // config_digit_more_keys_enabled.
- if (params.mId.isAlphabetKeyboard()
- && !res.getBoolean(R.bool.config_digit_more_keys_enabled)) {
- mMoreKeys = MoreKeySpecParser.filterOut(res, moreKeys, MoreKeySpecParser.DIGIT_FILTER);
- } else {
- mMoreKeys = moreKeys;
- }
+ mMoreKeys = moreKeys;
mMaxMoreKeysColumn = style.getInt(keyAttr,
R.styleable.Keyboard_Key_maxMoreKeysColumn, params.mMaxMiniKeyboardColumn);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
index b7215ec1b..1450192b2 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
@@ -173,6 +173,7 @@ public class KeyStyles {
readString(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel);
readStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
+ readStringArray(keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys);
readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags);
readInt(keyAttr, R.styleable.Keyboard_Key_keyIcon);
readInt(keyAttr, R.styleable.Keyboard_Key_keyIconDisabled);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java
index 16777733e..abebfec01 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java
@@ -20,10 +20,12 @@ import android.content.res.Resources;
import android.text.TextUtils;
import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.Utils;
import java.util.ArrayList;
+import java.util.Arrays;
/**
* String parser of moreKeys attribute of Key.
@@ -38,9 +40,11 @@ import java.util.ArrayList;
* See {@link KeyboardIconsSet} about icon_number.
*/
public class MoreKeySpecParser {
+ private static final boolean DEBUG = LatinImeLogger.sDBG;
private static final char LABEL_END = '|';
private static final String PREFIX_ICON = Utils.PREFIX_AT + "icon" + Utils.SUFFIX_SLASH;
private static final String PREFIX_CODE = Utils.PREFIX_AT + "integer" + Utils.SUFFIX_SLASH;
+ private static final String ADDITIONAL_MORE_KEY_MARKER = "%";
private MoreKeySpecParser() {
// Intentional empty constructor for utility class.
@@ -173,51 +177,80 @@ public class MoreKeySpecParser {
return KeyboardIconsSet.ICON_UNDEFINED;
}
+ public static String[] insertAddtionalMoreKeys(String[] moreKeys, String[] additionalMoreKeys) {
+ final int moreKeysCount = (moreKeys != null) ? moreKeys.length : 0;
+ final int additionalCount = (additionalMoreKeys != null) ? additionalMoreKeys.length : 0;
+ ArrayList out = null;
+ int additionalIndex = 0;
+ for (int moreKeyIndex = 0; moreKeyIndex < moreKeysCount; moreKeyIndex++) {
+ final String moreKeySpec = moreKeys[moreKeyIndex];
+ if (moreKeySpec.equals(ADDITIONAL_MORE_KEY_MARKER)) {
+ if (additionalIndex < additionalCount) {
+ // Replace '%' marker with additional more key specification.
+ final String additionalMoreKey = additionalMoreKeys[additionalIndex];
+ if (out != null) {
+ out.add(additionalMoreKey);
+ } else {
+ moreKeys[moreKeyIndex] = additionalMoreKey;
+ }
+ additionalIndex++;
+ } else {
+ // Filter out excessive '%' marker.
+ if (out == null) {
+ out = new ArrayList(moreKeyIndex);
+ for (int i = 0; i < moreKeyIndex; i++) {
+ out.add(moreKeys[i]);
+ }
+ }
+ }
+ } else {
+ if (out != null) {
+ out.add(moreKeySpec);
+ }
+ }
+ }
+ if (additionalCount > 0 && additionalIndex == 0) {
+ // No '%' marker is found in more keys.
+ // Insert all additional more keys to the head of more keys.
+ if (DEBUG && out != null) {
+ throw new RuntimeException("Internal logic error:"
+ + " moreKeys=" + Arrays.toString(moreKeys)
+ + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys));
+ }
+ out = new ArrayList(additionalCount + moreKeysCount);
+ for (int i = additionalIndex; i < additionalCount; i++) {
+ out.add(additionalMoreKeys[i]);
+ }
+ for (int i = 0; i < moreKeysCount; i++) {
+ out.add(moreKeys[i]);
+ }
+ } else if (additionalIndex < additionalCount) {
+ // The number of '%' markers are less than additional more keys.
+ // Append remained additional more keys to the tail of more keys.
+ if (DEBUG && out != null) {
+ throw new RuntimeException("Internal logic error:"
+ + " moreKeys=" + Arrays.toString(moreKeys)
+ + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys));
+ }
+ out = new ArrayList(moreKeysCount);
+ for (int i = 0; i < moreKeysCount; i++) {
+ out.add(moreKeys[i]);
+ }
+ for (int i = additionalIndex; i < additionalCount; i++) {
+ out.add(additionalMoreKeys[additionalIndex]);
+ }
+ }
+ if (out != null) {
+ return out.size() > 0 ? out.toArray(new String[out.size()]) : null;
+ } else {
+ return moreKeys;
+ }
+ }
+
@SuppressWarnings("serial")
public static class MoreKeySpecParserError extends RuntimeException {
public MoreKeySpecParserError(String message) {
super(message);
}
}
-
- public interface CodeFilter {
- public boolean shouldFilterOut(int code);
- }
-
- public static final CodeFilter DIGIT_FILTER = new CodeFilter() {
- @Override
- public boolean shouldFilterOut(int code) {
- return Character.isDigit(code);
- }
- };
-
- public static String[] filterOut(Resources res, String[] moreKeys, CodeFilter filter) {
- if (moreKeys == null || moreKeys.length < 1) {
- return null;
- }
- if (moreKeys.length == 1 && filter.shouldFilterOut(getCode(res, moreKeys[0]))) {
- return null;
- }
- ArrayList filtered = null;
- for (int i = 0; i < moreKeys.length; i++) {
- final String moreKeySpec = moreKeys[i];
- if (filter.shouldFilterOut(getCode(res, moreKeySpec))) {
- if (filtered == null) {
- filtered = new ArrayList();
- for (int j = 0; j < i; j++) {
- filtered.add(moreKeys[j]);
- }
- }
- } else if (filtered != null) {
- filtered.add(moreKeySpec);
- }
- }
- if (filtered == null) {
- return moreKeys;
- }
- if (filtered.size() == 0) {
- return null;
- }
- return filtered.toArray(new String[filtered.size()]);
- }
}
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java
index 74aaf9af8..bc38cc16c 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java
@@ -22,6 +22,8 @@ import android.test.AndroidTestCase;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.R;
+import java.util.Arrays;
+
public class MoreKeySpecParserTests extends AndroidTestCase {
private Resources mRes;
@@ -217,4 +219,212 @@ public class MoreKeySpecParserTests extends AndroidTestCase {
ICON_SETTINGS + "|" + CODE_SETTINGS + "|c",
null, null, ICON_SETTINGS_KEY, mCodeSettings);
}
+
+ private void assertMoreKeys(String message, String[] moreKeys, String[] additionalMoreKeys,
+ String[] expected) {
+ final String[] actual = MoreKeySpecParser.insertAddtionalMoreKeys(
+ moreKeys, additionalMoreKeys);
+ if (expected == null && actual == null) {
+ return;
+ }
+ if (expected == null || actual == null) {
+ assertEquals(message, Arrays.toString(expected), Arrays.toString(actual));
+ } else {
+ if (expected.length != actual.length) {
+ assertEquals(message, Arrays.toString(expected), Arrays.toString(actual));
+ }
+ for (int i = 0; i < expected.length; i++) {
+ if (!actual[i].equals(expected[i])) {
+ assertEquals(message, Arrays.toString(expected), Arrays.toString(actual));
+ }
+ }
+ }
+ }
+
+ public void testInsertAdditionalMoreKeys() {
+ // Escaped marker.
+ assertMoreKeys("escaped marker",
+ new String[] { "\\%", "%-)" },
+ new String[] { "1", "2" },
+ new String[] { "1", "2", "\\%", "%-)" });
+
+ // 0 more key.
+ assertMoreKeys("null & null", null, null, null);
+ assertMoreKeys("null & 1 additional",
+ null,
+ new String[] { "1" },
+ new String[] { "1" });
+ assertMoreKeys("null & 2 additionals",
+ null,
+ new String[] { "1", "2" },
+ new String[] { "1", "2" });
+
+ // 0 additional more key.
+ assertMoreKeys("1 more key & null",
+ new String[] { "A" },
+ null,
+ new String[] { "A" });
+ assertMoreKeys("2 more keys & null",
+ new String[] { "A", "B" },
+ null,
+ new String[] { "A", "B" });
+
+ // No marker.
+ assertMoreKeys("1 more key & 1 addtional & no marker",
+ new String[] { "A" },
+ new String[] { "1" },
+ new String[] { "1", "A" });
+ assertMoreKeys("1 more key & 2 addtionals & no marker",
+ new String[] { "A" },
+ new String[] { "1", "2" },
+ new String[] { "1", "2", "A" });
+ assertMoreKeys("2 more keys & 1 addtional & no marker",
+ new String[] { "A", "B" },
+ new String[] { "1" },
+ new String[] { "1", "A", "B" });
+ assertMoreKeys("2 more keys & 2 addtionals & no marker",
+ new String[] { "A", "B" },
+ new String[] { "1", "2" },
+ new String[] { "1", "2", "A", "B" });
+
+ // 1 marker.
+ assertMoreKeys("1 more key & 1 additional & marker at head",
+ new String[] { "%", "A" },
+ new String[] { "1" },
+ new String[] { "1", "A" });
+ assertMoreKeys("1 more key & 1 additional & marker at tail",
+ new String[] { "A", "%" },
+ new String[] { "1" },
+ new String[] { "A", "1" });
+ assertMoreKeys("2 more keys & 1 additional & marker at middle",
+ new String[] { "A", "%", "B" },
+ new String[] { "1" },
+ new String[] { "A", "1", "B" });
+
+ // 1 marker & excess additional more keys.
+ assertMoreKeys("1 more key & 2 additionals & marker at head",
+ new String[] { "%", "A", "B" },
+ new String[] { "1", "2" },
+ new String[] { "1", "A", "B", "2" });
+ assertMoreKeys("1 more key & 2 additionals & marker at tail",
+ new String[] { "A", "B", "%" },
+ new String[] { "1", "2" },
+ new String[] { "A", "B", "1", "2" });
+ assertMoreKeys("2 more keys & 2 additionals & marker at middle",
+ new String[] { "A", "%", "B" },
+ new String[] { "1", "2" },
+ new String[] { "A", "1", "B", "2" });
+
+ // 2 markers.
+ assertMoreKeys("0 more key & 2 addtional & 2 markers",
+ new String[] { "%", "%" },
+ new String[] { "1", "2" },
+ new String[] { "1", "2" });
+ assertMoreKeys("1 more key & 2 addtional & 2 markers at head",
+ new String[] { "%", "%", "A" },
+ new String[] { "1", "2" },
+ new String[] { "1", "2", "A" });
+ assertMoreKeys("1 more key & 2 addtional & 2 markers at tail",
+ new String[] { "A", "%", "%" },
+ new String[] { "1", "2" },
+ new String[] { "A", "1", "2" });
+ assertMoreKeys("2 more keys & 2 addtional & 2 markers at middle",
+ new String[] { "A", "%", "%", "B" },
+ new String[] { "1", "2" },
+ new String[] { "A", "1", "2", "B" });
+ assertMoreKeys("2 more keys & 2 addtional & 2 markers at head & middle",
+ new String[] { "%", "A", "%", "B" },
+ new String[] { "1", "2" },
+ new String[] { "1", "A", "2", "B" });
+ assertMoreKeys("2 more keys & 2 addtional & 2 markers at head & tail",
+ new String[] { "%", "A", "B", "%" },
+ new String[] { "1", "2" },
+ new String[] { "1", "A", "B", "2" });
+ assertMoreKeys("2 more keys & 2 addtional & 2 markers at middle & tail",
+ new String[] { "A", "%", "B", "%" },
+ new String[] { "1", "2" },
+ new String[] { "A", "1", "B", "2" });
+
+ // 2 markers & excess additional keys.
+ assertMoreKeys("0 more key & 2 addtional & 2 markers",
+ new String[] { "%", "%" },
+ new String[] { "1", "2", "3" },
+ new String[] { "1", "2", "3" });
+ assertMoreKeys("1 more key & 2 addtional & 2 markers at head",
+ new String[] { "%", "%", "A" },
+ new String[] { "1", "2", "3" },
+ new String[] { "1", "2", "A", "3" });
+ assertMoreKeys("1 more key & 2 addtional & 2 markers at tail",
+ new String[] { "A", "%", "%" },
+ new String[] { "1", "2", "3" },
+ new String[] { "A", "1", "2", "3" });
+ assertMoreKeys("2 more keys & 2 addtional & 2 markers at middle",
+ new String[] { "A", "%", "%", "B" },
+ new String[] { "1", "2", "3" },
+ new String[] { "A", "1", "2", "B", "3" });
+ assertMoreKeys("2 more keys & 2 addtional & 2 markers at head & middle",
+ new String[] { "%", "A", "%", "B" },
+ new String[] { "1", "2", "3" },
+ new String[] { "1", "A", "2", "B", "3" });
+ assertMoreKeys("2 more keys & 2 addtional & 2 markers at head & tail",
+ new String[] { "%", "A", "B", "%" },
+ new String[] { "1", "2", "3" },
+ new String[] { "1", "A", "B", "2", "3" });
+ assertMoreKeys("2 more keys & 2 addtional & 2 markers at middle & tail",
+ new String[] { "A", "%", "B", "%" },
+ new String[] { "1", "2", "3" },
+ new String[] { "A", "1", "B", "2", "3" });
+
+ // 0 addtional more key and excess markers.
+ assertMoreKeys("0 more key & null & excess marker",
+ new String[] { "%" },
+ null,
+ null);
+ assertMoreKeys("1 more key & null & excess marker at head",
+ new String[] { "%", "A" },
+ null,
+ new String[] { "A" });
+ assertMoreKeys("1 more key & null & excess marker at tail",
+ new String[] { "A", "%" },
+ null,
+ new String[] { "A" });
+ assertMoreKeys("2 more keys & null & excess marker at middle",
+ new String[] { "A", "%", "B" },
+ null,
+ new String[] { "A", "B" });
+ assertMoreKeys("2 more keys & null & excess markers",
+ new String[] { "%", "A", "%", "B", "%" },
+ null,
+ new String[] { "A", "B" });
+
+ // Excess markers.
+ assertMoreKeys("0 more key & 1 addtional & excess marker",
+ new String[] { "%", "%" },
+ new String[] { "1" },
+ new String[] { "1" });
+ assertMoreKeys("1 more key & 1 addtional & excess marker at head",
+ new String[] { "%", "%", "A" },
+ new String[] { "1" },
+ new String[] { "1", "A" });
+ assertMoreKeys("1 more key & 1 addtional & excess marker at tail",
+ new String[] { "A", "%", "%" },
+ new String[] { "1" },
+ new String[] { "A", "1" });
+ assertMoreKeys("2 more keys & 1 addtional & excess marker at middle",
+ new String[] { "A", "%", "%", "B" },
+ new String[] { "1" },
+ new String[] { "A", "1", "B" });
+ assertMoreKeys("2 more keys & 1 addtional & excess markers",
+ new String[] { "%", "A", "%", "B", "%" },
+ new String[] { "1" },
+ new String[] { "1", "A", "B" });
+ assertMoreKeys("2 more keys & 2 addtionals & excess markers",
+ new String[] { "%", "A", "%", "B", "%" },
+ new String[] { "1", "2" },
+ new String[] { "1", "A", "2", "B" });
+ assertMoreKeys("2 more keys & 3 addtionals & excess markers",
+ new String[] { "%", "A", "%", "%", "B", "%" },
+ new String[] { "1", "2", "3" },
+ new String[] { "1", "A", "2", "3", "B" });
+ }
}