From 25906373ffe1b0e3e99b7412e9fd2a54f5d73345 Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Mon, 11 Aug 2014 15:22:19 +0900
Subject: [PATCH] Fix Tamil keyboard

This CL adds Tamil (Sri Lanka) and Tamil (Singapore) subtypes.
This CL also fixes Sinhala Keyboard's currency symbol.

Bug: 9978106
Bug: 6911143
Change-Id: I2060978097882d0f4b1ec10f1103260ed8a447d0
---
 java/res/xml/key_styles_currency.xml          |  42 +-
 java/res/xml/key_styles_currency_generic.xml  |  42 ++
 java/res/xml/method.xml                       |  18 +
 java/res/xml/rowkeys_tamil1.xml               |  20 +-
 java/res/xml/rowkeys_tamil2.xml               |  24 +-
 java/res/xml/rowkeys_tamil3.xml               |  14 +-
 .../com/android/inputmethod/keyboard/Key.java |   3 +-
 .../keyboard/internal/KeyboardTextsTable.java | 367 ++++++++++--------
 .../KeyboardLayoutSetSubtypesCountTests.java  |   2 +-
 .../inputmethod/keyboard/layout/Sinhala.java  |  12 +
 .../inputmethod/keyboard/layout/Tamil.java    |  46 +--
 .../keyboard/layout/tests/TestsTamilIN.java   |  21 +-
 .../keyboard/layout/tests/TestsTamilLK.java   |  56 +++
 .../keyboard/layout/tests/TestsTamilSG.java   |  37 ++
 .../donottranslate-more-keys.xml              |   4 +-
 .../donottranslate-more-keys.xml              |   2 +
 .../donottranslate-more-keys.xml              |  28 ++
 .../donottranslate-more-keys.xml              |  26 ++
 .../res/values/donottranslate-more-keys.xml   |   2 +-
 19 files changed, 542 insertions(+), 224 deletions(-)
 create mode 100644 java/res/xml/key_styles_currency_generic.xml
 create mode 100644 tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilLK.java
 create mode 100644 tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilSG.java
 create mode 100644 tools/make-keyboard-text/res/values-ta-rLK/donottranslate-more-keys.xml
 create mode 100644 tools/make-keyboard-text/res/values-ta-rSG/donottranslate-more-keys.xml

diff --git a/java/res/xml/key_styles_currency.xml b/java/res/xml/key_styles_currency.xml
index 900c9bb7a..cfe9a90a1 100644
--- a/java/res/xml/key_styles_currency.xml
+++ b/java/res/xml/key_styles_currency.xml
@@ -84,7 +84,6 @@
              lo: Lao (Kip)
              mn: Mongolian (Tugrik)
              ne: Nepali (Nepalese Rupee)
-             ta_IN: Tamil (Tamil Rupee)
              th: Thai (Baht)
              uk: Ukrainian (Hryvnia)
              vi: Vietnamese (Dong)  -->
@@ -92,29 +91,24 @@
              its unicode, although there is no font glyph for it as of November 2012. -->
         <!-- TODO: The currency sign of Armenian Dram was created in 2012 and assigned U+058F for
              its unicode, although there is no font glyph for it as of September 2013. -->
-        <case latin:languageCode="fa|hi|iw|lo|mn|ne|ta|th|uk|vi">
-            <!-- U+00A3: "£" POUND SIGN
-                 U+20AC: "€" EURO SIGN
-                 U+00A2: "¢" CENT SIGN -->
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keySpec="!text/keyspec_currency"
-                latin:moreKeys="!text/morekeys_currency" />
-            <key-style
-                latin:styleName="moreCurrency1KeyStyle"
-                latin:keySpec="&#x00A3;" />
-            <key-style
-                latin:styleName="moreCurrency2KeyStyle"
-                latin:keySpec="&#x20AC;" />
-            <key-style
-                latin:styleName="moreCurrency3KeyStyle"
-                latin:keySpec="$"
-                latin:moreKeys="&#x00A2;" />
-            <key-style
-                latin:styleName="moreCurrency4KeyStyle"
-                latin:keySpec="&#x00A2;" />
+        <!-- TODO: The currency sign of Russian Ruble was created in 2014 and assigned U+20BD for
+             its unicode, although there is no font glyph for it as of August 2014. -->
+        <case latin:languageCode="fa|hi|iw|lo|mn|ne|th|uk|vi">
+            <include latin:keyboardLayout="@xml/key_styles_currency_generic" />
         </case>
-        <!-- IN: India (Rupee) -->
+        <!-- si_LK: Sinhala (Sri Lanka) (Sri Lanka Rupee)
+             ta_LK: Tamil (Sri Lanka) (Sri Lanka Rupee) -->
+        <case latin:countryCode="LK">
+            <include latin:keyboardLayout="@xml/key_styles_currency_generic" />
+        </case>
+        <!-- bn_IN: Bengali (India) (Indian Rupee)
+             en_IN: English (India) (Indian Rupee)
+             kn_IN: Kannada (India) (Indian Rupee)
+             ml_IN: Malayalam (India) (Indian Rupee)
+             mr_IN: Marathi (India) (Indian Rupee)
+             ta_IN: Tamil (India) (Indian Rupee)
+             te_IN: Telugu (India) (Indian Rupee)
+         -->
         <case latin:countryCode="IN">
             <!-- U+20B9: "₹" INDIAN RUPEE SIGN
                  U+00A3: "£" POUND SIGN
@@ -123,7 +117,7 @@
             <key-style
                 latin:styleName="currencyKeyStyle"
                 latin:keySpec="&#x20B9;"
-                latin:moreKeys="!text/morekeys_currency" />
+                latin:moreKeys="!text/morekeys_currency_generic" />
             <key-style
                 latin:styleName="moreCurrency1KeyStyle"
                 latin:keySpec="&#x00A3;" />
diff --git a/java/res/xml/key_styles_currency_generic.xml b/java/res/xml/key_styles_currency_generic.xml
new file mode 100644
index 000000000..888b5b2c9
--- /dev/null
+++ b/java/res/xml/key_styles_currency_generic.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin">
+    <!-- U+00A3: "£" POUND SIGN
+         U+20AC: "€" EURO SIGN
+         U+00A2: "¢" CENT SIGN -->
+    <key-style
+        latin:styleName="currencyKeyStyle"
+        latin:keySpec="!text/keyspec_currency"
+        latin:moreKeys="!text/morekeys_currency_generic" />
+    <key-style
+        latin:styleName="moreCurrency1KeyStyle"
+        latin:keySpec="&#x00A3;" />
+    <key-style
+        latin:styleName="moreCurrency2KeyStyle"
+        latin:keySpec="&#x20AC;" />
+    <key-style
+        latin:styleName="moreCurrency3KeyStyle"
+        latin:keySpec="$"
+        latin:moreKeys="&#x00A2;" />
+    <key-style
+        latin:styleName="moreCurrency4KeyStyle"
+        latin:keySpec="&#x00A2;" />
+</merge>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 4e2ce75f3..b3381c54c 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -92,6 +92,8 @@
     sv: Swedish/nordic
     sw: Swahili/qwerty
     ta_IN: Tamil (India)/tamil
+    ta_LK: Tamil (Sri Lanka)/tamil
+    ta_SG: Tamil (Singapore)/tamil
     te_IN: Telugu (India)/telugu
     th: Thai/thai
     tl: Tagalog/spanish
@@ -688,6 +690,22 @@
             android:imeSubtypeExtraValue="KeyboardLayoutSet=tamil,EmojiCapable"
             android:isAsciiCapable="false"
     />
+    <subtype android:icon="@drawable/ic_ime_switcher_dark"
+            android:label="@string/subtype_generic"
+            android:subtypeId="0x6ca12d84"
+            android:imeSubtypeLocale="ta_LK"
+            android:imeSubtypeMode="keyboard"
+            android:imeSubtypeExtraValue="KeyboardLayoutSet=tamil,EmojiCapable"
+            android:isAsciiCapable="false"
+    />
+    <subtype android:icon="@drawable/ic_ime_switcher_dark"
+            android:label="@string/subtype_generic"
+            android:subtypeId="0x785abbd9"
+            android:imeSubtypeLocale="ta_SG"
+            android:imeSubtypeMode="keyboard"
+            android:imeSubtypeExtraValue="KeyboardLayoutSet=tamil,EmojiCapable"
+            android:isAsciiCapable="false"
+    />
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0x1e177389"
diff --git a/java/res/xml/rowkeys_tamil1.xml b/java/res/xml/rowkeys_tamil1.xml
index 4debd9e3e..d6a5cfaf9 100644
--- a/java/res/xml/rowkeys_tamil1.xml
+++ b/java/res/xml/rowkeys_tamil1.xml
@@ -19,29 +19,39 @@
 -->
 
 <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin">
-    <!-- U+0B94: "ஔ" TAMIL LETTER AU -->
+    <!-- U+0B94: "ஔ" TAMIL LETTER AU
+         U+0BCC: "ௌ" TAMIL VOWEL SIGN AU -->
     <Key
         latin:keySpec="&#x0B94;"
+        latin:moreKeys="&#x0BCC;,%"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1" />
-    <!-- U+0B90: "ஐ" TAMIL LETTER AI -->
+    <!-- U+0B90: "ஐ" TAMIL LETTER AI
+         U+0BC8: "ை" TAMIL VOWEL SIGN AI -->
     <Key
         latin:keySpec="&#x0B90;"
+        latin:moreKeys="&#x0BC8;,%"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2" />
-    <!-- U+0B86: "ஆ" TAMIL LETTER AA -->
+    <!-- U+0B86: "ஆ" TAMIL LETTER AA
+         U+0BBE: "ா" TAMIL VOWEL SIGN AA -->
     <Key
         latin:keySpec="&#x0B86;"
+        latin:moreKeys="&#x0BBE;,%"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3" />
-    <!-- U+0B88: "ஈ" TAMIL LETTER II -->
+    <!-- U+0B88: "ஈ" TAMIL LETTER II
+         U+0BC0: "ீ" TAMIL VOWEL SIGN II -->
     <Key
         latin:keySpec="&#x0B88;"
+        latin:moreKeys="&#x0BC0;,%"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
-    <!-- U+0B8A: "ஊ" TAMIL LETTER UU -->
+    <!-- U+0B8A: "ஊ" TAMIL LETTER UU
+         U+0BC2: "ூ" TAMIL VOWEL SIGN UU -->
     <Key
         latin:keySpec="&#x0B8A;"
+        latin:moreKeys="&#x0BC2;,%"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5" />
     <!-- U+0BAE: "ம" TAMIL LETTER MA -->
diff --git a/java/res/xml/rowkeys_tamil2.xml b/java/res/xml/rowkeys_tamil2.xml
index 894825cb4..ec0b2a83c 100644
--- a/java/res/xml/rowkeys_tamil2.xml
+++ b/java/res/xml/rowkeys_tamil2.xml
@@ -20,21 +20,31 @@
 
 <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin">
     <!-- U+0B93: "ஓ" TAMIL LETTER OO
+         U+0BCB: "ோ" TAMIL VOWEL SIGN OO
          U+0BD0: "ௐ" TAMIL OM -->
     <Key
         latin:keySpec="&#x0B93;"
-        latin:moreKeys="&#x0BD0;" />
-    <!-- U+0B8F: "ஏ" TAMIL LETTER EE -->
-    <Key latin:keySpec="&#x0B8F;" />
+        latin:moreKeys="&#x0BCB;,&#x0BD0;" />
+    <!-- U+0B8F: "ஏ" TAMIL LETTER EE
+         U+0BC7: "ே" TAMIL VOWEL SIGN EE -->
+    <Key
+        latin:keySpec="&#x0B8F;"
+        latin:moreKeys="&#x0BC7;" />
     <!-- U+0B85: "அ" TAMIL LETTER A
          U+0B83: "ஃ" TAMIL SIGN VISARGA -->
     <Key
         latin:keySpec="&#x0B85;"
         latin:moreKeys="&#x0B83;" />
-    <!-- U+0B87: "இ" TAMIL LETTER I -->
-    <Key latin:keySpec="&#x0B87;" />
-    <!-- U+0B89: "உ" TAMIL LETTER U -->
-    <Key latin:keySpec="&#x0B89;" />
+    <!-- U+0B87: "இ" TAMIL LETTER I
+         U+0BBF: "ி" TAMIL VOWEL SIGN I -->
+    <Key
+        latin:keySpec="&#x0B87;"
+        latin:moreKeys="&#x0BBF;" />
+    <!-- U+0B89: "உ" TAMIL LETTER U
+         U+0BC1: "ு" TAMIL VOWEL SIGN U -->
+    <Key
+        latin:keySpec="&#x0B89;"
+        latin:moreKeys="&#x0BC1;" />
     <!-- U+0BB1: "ற" TAMIL LETTER RRA -->
     <Key latin:keySpec="&#x0BB1;" />
     <!-- U+0BAA: "ப" TAMIL LETTER PA -->
diff --git a/java/res/xml/rowkeys_tamil3.xml b/java/res/xml/rowkeys_tamil3.xml
index 5386e61cf..e517e142b 100644
--- a/java/res/xml/rowkeys_tamil3.xml
+++ b/java/res/xml/rowkeys_tamil3.xml
@@ -19,10 +19,16 @@
 -->
 
 <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin">
-    <!-- U+0B92: "ஒ" TAMIL LETTER O -->
-    <Key latin:keySpec="&#x0B92;" />
-    <!-- U+0B8E: "எ" TAMIL LETTER E -->
-    <Key latin:keySpec="&#x0B8E;" />
+    <!-- U+0B92: "ஒ" TAMIL LETTER O
+         U+0BCA: "ொ" TAMIL VOWEL SIGN O -->
+    <Key
+        latin:keySpec="&#x0B92;"
+        latin:moreKeys="&#x0BCA;" />
+    <!-- U+0B8E: "எ" TAMIL LETTER E
+         U+0BC6: "ெ" TAMIL VOWEL SIGN E -->
+    <Key
+        latin:keySpec="&#x0B8E;"
+        latin:moreKeys="&#x0BC6;" />
     <!-- U+0BCD: "்" TAMIL SIGN VIRAMA -->
     <Key latin:keySpec="&#x0BCD;" />
     <!-- U+0BB0: "ர" TAMIL LETTER RA -->
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 618d38962..f00889ed7 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -693,9 +693,10 @@ public class Key implements Comparable<Key> {
     }
 
     public final int getMoreKeyLabelFlags() {
-        return hasLabelsInMoreKeys()
+        final int labelSizeFlag = hasLabelsInMoreKeys()
                 ? LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO
                 : LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO;
+        return labelSizeFlag | LABEL_FLAGS_AUTO_X_SCALE;
     }
 
     public final boolean needsDividersInMoreKeys() {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index f18ebd1fe..e6897bf1d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -86,15 +86,15 @@ public final class KeyboardTextsTable {
         /*   0:32 */ "morekeys_a",
         /*   1:32 */ "morekeys_o",
         /*   2:30 */ "morekeys_u",
-        /*   3:29 */ "morekeys_e",
-        /*   4:28 */ "morekeys_i",
-        /*   5:28 */ "keylabel_to_alpha",
+        /*   3:30 */ "keylabel_to_alpha",
+        /*   4:29 */ "morekeys_e",
+        /*   5:28 */ "morekeys_i",
         /*   6:23 */ "morekeys_c",
         /*   7:23 */ "double_quotes",
         /*   8:22 */ "morekeys_n",
         /*   9:22 */ "single_quotes",
         /*  10:20 */ "morekeys_s",
-        /*  11:15 */ "keyspec_currency",
+        /*  11:17 */ "keyspec_currency",
         /*  12:14 */ "morekeys_y",
         /*  13:13 */ "morekeys_d",
         /*  14:12 */ "morekeys_z",
@@ -209,7 +209,7 @@ public final class KeyboardTextsTable {
         /* 123: 1 */ "morekeys_less_than",
         /* 124: 1 */ "morekeys_greater_than",
         /* 125: 1 */ "morekeys_exclamation",
-        /* 126: 0 */ "morekeys_currency",
+        /* 126: 0 */ "morekeys_currency_generic",
         /* 127: 0 */ "morekeys_symbols_1",
         /* 128: 0 */ "morekeys_symbols_2",
         /* 129: 0 */ "morekeys_symbols_3",
@@ -258,11 +258,13 @@ public final class KeyboardTextsTable {
     /* Default texts */
     private static final String[] TEXTS_DEFAULT = {
         /* morekeys_a ~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~ morekeys_i */
+        EMPTY, EMPTY, EMPTY,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         /* keylabel_to_alpha */ "ABC",
-        /* morekeys_c */ EMPTY,
+        /* morekeys_e ~ */
+        EMPTY, EMPTY, EMPTY,
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_lqm_rqm",
         /* morekeys_n */ EMPTY,
         /* single_quotes */ "!text/single_lqm_rqm",
@@ -378,7 +380,7 @@ public final class KeyboardTextsTable {
         /* morekeys_greater_than */ "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_right_double_angle_quote",
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
         /* morekeys_exclamation */ "\u00A1",
-        /* morekeys_currency */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
+        /* morekeys_currency_generic */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
         // U+00B9: "¹" SUPERSCRIPT ONE
         // U+00BD: "½" VULGAR FRACTION ONE HALF
         // U+2153: "⅓" VULGAR FRACTION ONE THIRD
@@ -492,6 +494,7 @@ public final class KeyboardTextsTable {
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -508,9 +511,8 @@ public final class KeyboardTextsTable {
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
-        /* keylabel_to_alpha ~ */
-        null, null, null,
-        /* ~ double_quotes */
+        /* morekeys_c */ null,
+        /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
@@ -525,17 +527,17 @@ public final class KeyboardTextsTable {
     /* Locale ar: Arabic */
     private static final String[] TEXTS_ar = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+062C: "ج" ARABIC LETTER JEEM
         /* keylabel_to_alpha */ "\u0623\u200C\u0628\u200C\u062C",
-        /* morekeys_c ~ */
+        /* morekeys_e ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_soft_sign */
         // U+0661: "١" ARABIC-INDIC DIGIT ONE
         /* keyspec_symbols_1 */ "\u0661",
@@ -673,6 +675,7 @@ public final class KeyboardTextsTable {
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+0259: "ə" LATIN SMALL LETTER SCHWA
         /* morekeys_e */ "\u0259",
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
@@ -683,7 +686,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -706,14 +708,16 @@ public final class KeyboardTextsTable {
     /* Locale be_BY: Belarusian (Belarus) */
     private static final String[] TEXTS_be_BY = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c */ null,
+        /* morekeys_e ~ */
+        null, null, null,
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -740,14 +744,16 @@ public final class KeyboardTextsTable {
     /* Locale bg: Bulgarian */
     private static final String[] TEXTS_bg = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c */ null,
+        /* morekeys_e ~ */
+        null, null, null,
+        /* ~ morekeys_c */
         // single_quotes of Bulgarian is default single_quotes_right_left.
         /* double_quotes */ "!text/double_9qm_lqm",
     };
@@ -755,18 +761,18 @@ public final class KeyboardTextsTable {
     /* Locale bn_IN: Bengali (India) */
     private static final String[] TEXTS_bn_IN = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0995: "क" BENGALI LETTER KA
         // U+0996: "ख" BENGALI LETTER KHA
         // U+0997: "ग" BENGALI LETTER GA
         /* keylabel_to_alpha */ "\u0995\u0996\u0997",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
-        // U+09F3: "৳" BENGALI RUPEE SIGN
-        /* keyspec_currency */ "\u09F3",
+        // U+20B9: "₹" INDIAN RUPEE SIGN
+        /* keyspec_currency */ "\u20B9",
     };
 
     /* Locale ca: Catalan */
@@ -798,6 +804,7 @@ public final class KeyboardTextsTable {
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
@@ -813,7 +820,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -872,6 +878,7 @@ public final class KeyboardTextsTable {
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
@@ -888,7 +895,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
@@ -945,13 +951,13 @@ public final class KeyboardTextsTable {
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
         /* morekeys_e */ "\u00E9,\u00EB",
         // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         /* morekeys_i */ "\u00ED,\u00EF",
-        /* keylabel_to_alpha */ null,
         /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -1020,15 +1026,15 @@ public final class KeyboardTextsTable {
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FC,%,\u00FB,\u00F9,\u00FA,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
         // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
         /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
-        /* morekeys_i ~ */
-        null, null, null,
-        /* ~ morekeys_c */
+        /* morekeys_i */ null,
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
@@ -1065,8 +1071,8 @@ public final class KeyboardTextsTable {
     /* Locale el: Greek */
     private static final String[] TEXTS_el = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
         // U+0392: "Β" GREEK CAPITAL LETTER BETA
@@ -1100,6 +1106,7 @@ public final class KeyboardTextsTable {
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -1112,7 +1119,6 @@ public final class KeyboardTextsTable {
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
         /* double_quotes */ null,
@@ -1159,6 +1165,7 @@ public final class KeyboardTextsTable {
         // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
         // U+00B5: "µ" MICRO SIGN
         /* morekeys_u */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
@@ -1178,7 +1185,6 @@ public final class KeyboardTextsTable {
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
-        /* keylabel_to_alpha */ null,
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
@@ -1300,6 +1306,7 @@ public final class KeyboardTextsTable {
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
@@ -1315,7 +1322,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -1364,6 +1370,7 @@ public final class KeyboardTextsTable {
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
         /* morekeys_u */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        /* keylabel_to_alpha */ null,
         // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
@@ -1381,7 +1388,6 @@ public final class KeyboardTextsTable {
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         /* morekeys_i */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
-        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
@@ -1466,6 +1472,7 @@ public final class KeyboardTextsTable {
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
@@ -1481,7 +1488,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -1495,16 +1501,16 @@ public final class KeyboardTextsTable {
     /* Locale fa: Persian */
     private static final String[] TEXTS_fa = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0627: "ا" ARABIC LETTER ALEF
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+067E: "پ" ARABIC LETTER PEH
         /* keylabel_to_alpha */ "\u0627\u200C\u0628\u200C\u067E",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+FDFC: "﷼" RIAL SIGN
         /* keyspec_currency */ "\uFDFC",
@@ -1655,7 +1661,7 @@ public final class KeyboardTextsTable {
         /* morekeys_o */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         /* morekeys_u */ "\u00FC",
-        /* morekeys_e ~ */
+        /* keylabel_to_alpha ~ */
         null, null, null, null, null, null, null,
         /* ~ single_quotes */
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
@@ -1716,6 +1722,7 @@ public final class KeyboardTextsTable {
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -1731,7 +1738,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -1789,6 +1795,7 @@ public final class KeyboardTextsTable {
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
@@ -1804,7 +1811,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -1818,15 +1824,15 @@ public final class KeyboardTextsTable {
     /* Locale hi: Hindi */
     private static final String[] TEXTS_hi = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
@@ -1872,7 +1878,7 @@ public final class KeyboardTextsTable {
     private static final String[] TEXTS_hr = {
         /* morekeys_a ~ */
         null, null, null, null, null, null,
-        /* ~ keylabel_to_alpha */
+        /* ~ morekeys_i */
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
@@ -1929,6 +1935,7 @@ public final class KeyboardTextsTable {
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -1944,7 +1951,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
@@ -1959,18 +1965,18 @@ public final class KeyboardTextsTable {
     /* Locale hy_AM: Armenian (Armenia) */
     private static final String[] TEXTS_hy_AM = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0531: "Ա" ARMENIAN CAPITAL LETTER AYB
         // U+0532: "Բ" ARMENIAN CAPITAL LETTER BEN
         // U+0533: "Գ" ARMENIAN CAPITAL LETTER GIM
         /* keylabel_to_alpha */ "\u0531\u0532\u0533",
-        /* morekeys_c ~ */
+        /* morekeys_e ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null,
+        null, null, null, null, null,
         /* ~ morekeys_nordic_row2_11 */
         // U+055E: "՞" ARMENIAN QUESTION MARK
         // U+055C: "՜" ARMENIAN EXCLAMATION MARK
@@ -2043,6 +2049,7 @@ public final class KeyboardTextsTable {
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
@@ -2058,7 +2065,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
@@ -2103,6 +2109,7 @@ public final class KeyboardTextsTable {
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -2118,11 +2125,11 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
-        /* keylabel_to_alpha ~ */
+        /* morekeys_c ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
+        null, null, null, null, null,
         /* ~ keyspec_tablet_comma */
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         /* keyspec_swiss_row1_11 */ "\u00FC",
@@ -2141,14 +2148,16 @@ public final class KeyboardTextsTable {
     /* Locale iw: Hebrew */
     private static final String[] TEXTS_iw = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+05D0: "א" HEBREW LETTER ALEF
         // U+05D1: "ב" HEBREW LETTER BET
         // U+05D2: "ג" HEBREW LETTER GIMEL
         /* keylabel_to_alpha */ "\u05D0\u05D1\u05D2",
-        /* morekeys_c */ null,
+        /* morekeys_e ~ */
+        null, null, null,
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_rqm_9qm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_rqm_9qm",
@@ -2198,14 +2207,16 @@ public final class KeyboardTextsTable {
     /* Locale ka_GE: Georgian (Georgia) */
     private static final String[] TEXTS_ka_GE = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+10D0: "ა" GEORGIAN LETTER AN
         // U+10D1: "ბ" GEORGIAN LETTER BAN
         // U+10D2: "გ" GEORGIAN LETTER GAN
         /* keylabel_to_alpha */ "\u10D0\u10D1\u10D2",
-        /* morekeys_c */ null,
+        /* morekeys_e ~ */
+        null, null, null,
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -2214,16 +2225,16 @@ public final class KeyboardTextsTable {
     /* Locale kk: Kazakh */
     private static final String[] TEXTS_kk = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c ~ */
+        /* morekeys_e ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null,
+        null, null, null,
         /* ~ morekeys_k */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
         /* morekeys_cyrillic_ie */ "\u0451",
@@ -2272,14 +2283,14 @@ public final class KeyboardTextsTable {
     /* Locale km_KH: Khmer (Cambodia) */
     private static final String[] TEXTS_km_KH = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+1780: "ក" KHMER LETTER KA
         // U+1781: "ខ" KHMER LETTER KHA
         // U+1782: "គ" KHMER LETTER KO
         /* keylabel_to_alpha */ "\u1780\u1781\u1782",
-        /* morekeys_c ~ */
+        /* morekeys_e ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2287,7 +2298,7 @@ public final class KeyboardTextsTable {
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_a */
         // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
         /* morekeys_currency_dollar */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
@@ -2296,15 +2307,15 @@ public final class KeyboardTextsTable {
     /* Locale kn_IN: Kannada (India) */
     private static final String[] TEXTS_kn_IN = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0C85: "ಅ" KANNADA LETTER A
         // U+0C86: "ಆ" KANNADA LETTER AA
         // U+0C87: "ಇ" KANNADA LETTER I
         /* keylabel_to_alpha */ "\u0C85\u0C86\u0C87",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
@@ -2313,16 +2324,16 @@ public final class KeyboardTextsTable {
     /* Locale ky: Kirghiz */
     private static final String[] TEXTS_ky = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c ~ */
+        /* morekeys_e ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null,
+        null, null, null,
         /* ~ morekeys_k */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
         /* morekeys_cyrillic_ie */ "\u0451",
@@ -2357,15 +2368,15 @@ public final class KeyboardTextsTable {
     /* Locale lo_LA: Lao (Laos) */
     private static final String[] TEXTS_lo_LA = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0E81: "ກ" LAO LETTER KO
         // U+0E82: "ຂ" LAO LETTER KHO SUNG
         // U+0E84: "ຄ" LAO LETTER KHO TAM
         /* keylabel_to_alpha */ "\u0E81\u0E82\u0E84",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+20AD: "₭" KIP SIGN
         /* keyspec_currency */ "\u20AD",
@@ -2402,6 +2413,7 @@ public final class KeyboardTextsTable {
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
         /* morekeys_u */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        /* keylabel_to_alpha */ null,
         // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
         // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
         // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
@@ -2419,7 +2431,6 @@ public final class KeyboardTextsTable {
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         /* morekeys_i */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
-        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
@@ -2496,6 +2507,7 @@ public final class KeyboardTextsTable {
         // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
         /* morekeys_u */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
+        /* keylabel_to_alpha */ null,
         // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
         // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
@@ -2513,7 +2525,6 @@ public final class KeyboardTextsTable {
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         /* morekeys_i */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
-        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
@@ -2563,14 +2574,16 @@ public final class KeyboardTextsTable {
     /* Locale mk: Macedonian */
     private static final String[] TEXTS_mk = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c */ null,
+        /* morekeys_e ~ */
+        null, null, null,
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -2601,13 +2614,13 @@ public final class KeyboardTextsTable {
     /* Locale ml_IN: Malayalam (India) */
     private static final String[] TEXTS_ml_IN = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0D05: "അ" MALAYALAM LETTER A
         /* keylabel_to_alpha */ "\u0D05",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
@@ -2616,15 +2629,15 @@ public final class KeyboardTextsTable {
     /* Locale mn_MN: Mongolian (Mongolia) */
     private static final String[] TEXTS_mn_MN = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+20AE: "₮" TUGRIK SIGN
         /* keyspec_currency */ "\u20AE",
@@ -2633,15 +2646,15 @@ public final class KeyboardTextsTable {
     /* Locale mr_IN: Marathi (India) */
     private static final String[] TEXTS_mr_IN = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
@@ -2686,18 +2699,18 @@ public final class KeyboardTextsTable {
     /* Locale my_MM: Burmese (Myanmar) */
     private static final String[] TEXTS_my_MM = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+1000: "က" MYANMAR LETTER KA
         // U+1001: "ခ" MYANMAR LETTER KHA
         // U+1002: "ဂ" MYANMAR LETTER GA
         /* keylabel_to_alpha */ "\u1000\u1001\u1002",
-        /* morekeys_c ~ */
+        /* morekeys_e ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null,
+        null, null, null, null, null,
         /* ~ morekeys_nordic_row2_11 */
         /* morekeys_punctuation */ "!autoColumnOrder!9,\u104A,.,?,!,#,),(,/,;,...,',@,:,-,\",+,\\%,&",
         // U+104A: "၊" MYANMAR SIGN LITTLE SECTION
@@ -2744,6 +2757,7 @@ public final class KeyboardTextsTable {
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -2752,9 +2766,8 @@ public final class KeyboardTextsTable {
         // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
         // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
         /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        /* morekeys_i ~ */
-        null, null, null,
-        /* ~ morekeys_c */
+        /* morekeys_i */ null,
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
@@ -2780,15 +2793,15 @@ public final class KeyboardTextsTable {
     /* Locale ne_NP: Nepali (Nepal) */
     private static final String[] TEXTS_ne_NP = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
         /* keyspec_currency */ "\u0930\u0941.",
@@ -2856,6 +2869,7 @@ public final class KeyboardTextsTable {
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -2872,7 +2886,6 @@ public final class KeyboardTextsTable {
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
-        /* keylabel_to_alpha */ null,
         /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -2907,6 +2920,7 @@ public final class KeyboardTextsTable {
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
         /* morekeys_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
         /* morekeys_u */ null,
+        /* keylabel_to_alpha */ null,
         // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
@@ -2916,7 +2930,6 @@ public final class KeyboardTextsTable {
         // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
         /* morekeys_e */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
         /* morekeys_i */ null,
-        /* keylabel_to_alpha */ null,
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -2969,6 +2982,7 @@ public final class KeyboardTextsTable {
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
@@ -2984,7 +2998,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
@@ -3017,7 +3030,7 @@ public final class KeyboardTextsTable {
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
         /* morekeys_a */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
         /* morekeys_o ~ */
-        null, null, null,
+        null, null, null, null,
         /* ~ morekeys_e */
         // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
@@ -3026,7 +3039,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
@@ -3046,14 +3058,16 @@ public final class KeyboardTextsTable {
     /* Locale ru: Russian */
     private static final String[] TEXTS_ru = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c */ null,
+        /* morekeys_e ~ */
+        null, null, null,
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -3080,12 +3094,17 @@ public final class KeyboardTextsTable {
     /* Locale si_LK: Sinhalese (Sri Lanka) */
     private static final String[] TEXTS_si_LK = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0D85: "අ" SINHALA LETTER AYANNA
         // U+0D86: "ආ" SINHALA LETTER AAYANNA
         /* keylabel_to_alpha */ "\u0D85,\u0D86",
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
+        /* ~ morekeys_s */
+        // U+0DBB/U+0DD4: "රු" SINHALA LETTER RAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA
+        /* keyspec_currency */ "\u0DBB\u0DD4",
     };
 
     /* Locale sk: Slovak */
@@ -3118,6 +3137,7 @@ public final class KeyboardTextsTable {
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
         /* morekeys_u */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
         // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
@@ -3135,7 +3155,6 @@ public final class KeyboardTextsTable {
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         /* morekeys_i */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
-        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
@@ -3187,7 +3206,7 @@ public final class KeyboardTextsTable {
     private static final String[] TEXTS_sl = {
         /* morekeys_a ~ */
         null, null, null, null, null, null,
-        /* ~ keylabel_to_alpha */
+        /* ~ morekeys_i */
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u0107",
@@ -3212,15 +3231,17 @@ public final class KeyboardTextsTable {
     /* Locale sr: Serbian */
     private static final String[] TEXTS_sr = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // END: More keys definitions for Serbian (Cyrillic)
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c */ null,
+        /* morekeys_e ~ */
+        null, null, null,
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -3290,6 +3311,7 @@ public final class KeyboardTextsTable {
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -3301,7 +3323,6 @@ public final class KeyboardTextsTable {
         // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         /* morekeys_i */ "\u00ED,\u00EC,\u00EE,\u00EF",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -3384,6 +3405,7 @@ public final class KeyboardTextsTable {
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -3396,7 +3418,6 @@ public final class KeyboardTextsTable {
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
         /* morekeys_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
         /* double_quotes */ null,
@@ -3414,32 +3435,61 @@ public final class KeyboardTextsTable {
     /* Locale ta_IN: Tamil (India) */
     private static final String[] TEXTS_ta_IN = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0BA4: "த" TAMIL LETTER TA
         // U+0BAE/U+0BBF: "மி" TAMIL LETTER MA/TAMIL VOWEL SIGN I
         // U+0BB4/U+0BCD: "ழ்" TAMIL LETTER LLLA/TAMIL SIGN VIRAMA
         /* keylabel_to_alpha */ "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+0BF9: "௹" TAMIL RUPEE SIGN
         /* keyspec_currency */ "\u0BF9",
     };
 
+    /* Locale ta_LK: Tamil (Sri Lanka) */
+    private static final String[] TEXTS_ta_LK = {
+        /* morekeys_a ~ */
+        null, null, null,
+        /* ~ morekeys_u */
+        // Label for "switch to alphabetic" key.
+        // U+0BA4: "த" TAMIL LETTER TA
+        // U+0BAE/U+0BBF: "மி" TAMIL LETTER MA/TAMIL VOWEL SIGN I
+        // U+0BB4/U+0BCD: "ழ்" TAMIL LETTER LLLA/TAMIL SIGN VIRAMA
+        /* keylabel_to_alpha */ "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD",
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
+        /* ~ morekeys_s */
+        // U+0DBB/U+0DD4: "රු" SINHALA LETTER RAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA
+        /* keyspec_currency */ "\u0DBB\u0DD4",
+    };
+
+    /* Locale ta_SG: Tamil (Singapore) */
+    private static final String[] TEXTS_ta_SG = {
+        /* morekeys_a ~ */
+        null, null, null,
+        /* ~ morekeys_u */
+        // Label for "switch to alphabetic" key.
+        // U+0BA4: "த" TAMIL LETTER TA
+        // U+0BAE/U+0BBF: "மி" TAMIL LETTER MA/TAMIL VOWEL SIGN I
+        // U+0BB4/U+0BCD: "ழ்" TAMIL LETTER LLLA/TAMIL SIGN VIRAMA
+        /* keylabel_to_alpha */ "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD",
+    };
+
     /* Locale te_IN: Telugu (India) */
     private static final String[] TEXTS_te_IN = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0C05: "అ" TELUGU LETTER A
         // U+0C06: "ఆ" TELUGU LETTER AA
         // U+0C07: "ఇ" TELUGU LETTER I
         /* keylabel_to_alpha */ "\u0C05\u0C06\u0C07",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
@@ -3448,15 +3498,15 @@ public final class KeyboardTextsTable {
     /* Locale th: Thai */
     private static final String[] TEXTS_th = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0E01: "ก" THAI CHARACTER KO KAI
         // U+0E02: "ข" THAI CHARACTER KHO KHAI
         // U+0E04: "ค" THAI CHARACTER KHO KHWAI
         /* keylabel_to_alpha */ "\u0E01\u0E02\u0E04",
-        /* morekeys_c ~ */
-        null, null, null, null, null,
+        /* morekeys_e ~ */
+        null, null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
         /* keyspec_currency */ "\u0E3F",
@@ -3491,6 +3541,7 @@ public final class KeyboardTextsTable {
         // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
@@ -3506,7 +3557,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -3536,6 +3586,7 @@ public final class KeyboardTextsTable {
         // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* keylabel_to_alpha */ null,
         /* morekeys_e */ null,
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
@@ -3545,7 +3596,6 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
@@ -3568,14 +3618,16 @@ public final class KeyboardTextsTable {
     /* Locale uk: Ukrainian */
     private static final String[] TEXTS_uk = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null,
+        /* ~ morekeys_u */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* morekeys_c */ null,
+        /* morekeys_e ~ */
+        null, null, null,
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -3659,6 +3711,7 @@ public final class KeyboardTextsTable {
         // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE
         // U+1EF1: "ự" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
         /* morekeys_u */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
+        /* keylabel_to_alpha */ null,
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE
@@ -3677,8 +3730,8 @@ public final class KeyboardTextsTable {
         // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
         // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
         /* morekeys_i */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
-        /* keylabel_to_alpha ~ */
-        null, null, null, null, null, null,
+        /* morekeys_c ~ */
+        null, null, null, null, null,
         /* ~ morekeys_s */
         // U+20AB: "₫" DONG SIGN
         /* keyspec_currency */ "\u20AB",
@@ -3719,6 +3772,7 @@ public final class KeyboardTextsTable {
         // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
         // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
         /* morekeys_u */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
+        /* keylabel_to_alpha */ null,
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -3731,7 +3785,6 @@ public final class KeyboardTextsTable {
         // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
         // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
         /* double_quotes */ null,
@@ -3779,6 +3832,7 @@ public final class KeyboardTextsTable {
         // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
         // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
         /* morekeys_u */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
+        /* keylabel_to_alpha */ null,
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -3800,7 +3854,6 @@ public final class KeyboardTextsTable {
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
-        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
@@ -3893,7 +3946,7 @@ public final class KeyboardTextsTable {
         "cs"     , TEXTS_cs,    /*  17/ 21 Czech */
         "da"     , TEXTS_da,    /*  19/ 54 Danish */
         "de"     , TEXTS_de,    /*  16/ 62 German */
-        "el"     , TEXTS_el,    /*   1/  6 Greek */
+        "el"     , TEXTS_el,    /*   1/  4 Greek */
         "en"     , TEXTS_en,    /*   8/ 11 English */
         "eo"     , TEXTS_eo,    /*  26/118 Esperanto */
         "es"     , TEXTS_es,    /*   8/ 55 Spanish */
@@ -3931,13 +3984,15 @@ public final class KeyboardTextsTable {
         "rm"     , TEXTS_rm,    /*   1/  2 Raeto-Romance */
         "ro"     , TEXTS_ro,    /*   6/ 16 Romanian */
         "ru"     , TEXTS_ru,    /*   9/ 32 Russian */
-        "si_LK"  , TEXTS_si_LK, /*   1/  6 Sinhalese (Sri Lanka) */
+        "si_LK"  , TEXTS_si_LK, /*   2/ 12 Sinhalese (Sri Lanka) */
         "sk"     , TEXTS_sk,    /*  20/ 22 Slovak */
         "sl"     , TEXTS_sl,    /*   8/ 20 Slovenian */
         "sr"     , TEXTS_sr,    /*  11/ 94 Serbian */
         "sv"     , TEXTS_sv,    /*  21/ 54 Swedish */
         "sw"     , TEXTS_sw,    /*   9/ 18 Swahili */
         "ta_IN"  , TEXTS_ta_IN, /*   2/ 12 Tamil (India) */
+        "ta_LK"  , TEXTS_ta_LK, /*   2/ 12 Tamil (Sri Lanka) */
+        "ta_SG"  , TEXTS_ta_SG, /*   1/  4 Tamil (Singapore) */
         "te_IN"  , TEXTS_te_IN, /*   2/ 12 Telugu (India) */
         "th"     , TEXTS_th,    /*   2/ 12 Thai */
         "tl"     , TEXTS_tl,    /*   7/  9 Tagalog */
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
index 6b0652c59..8727ab393 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
@@ -25,7 +25,7 @@ import java.util.ArrayList;
 
 @SmallTest
 public class KeyboardLayoutSetSubtypesCountTests extends KeyboardLayoutSetTestsBase {
-    private static final int NUMBER_OF_SUBTYPES = 76;
+    private static final int NUMBER_OF_SUBTYPES = 78;
     private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 45;
     private static final int NUMBER_OF_PREDEFINED_ADDITIONAL_SUBTYPES = 2;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java b/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java
index 5c0ffb4f9..354141d5a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java
@@ -42,6 +42,14 @@ public final class Sinhala extends LayoutBase {
         @Override
         public ExpectedKey getAlphabetKey() { return SINHALA_ALPHABET_KEY; }
 
+        @Override
+        public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
+
+        @Override
+        public ExpectedKey[] getOtherCurrencyKeys() {
+            return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
+        }
+
         @Override
         public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
             return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
@@ -51,6 +59,10 @@ public final class Sinhala extends LayoutBase {
         // U+0D86: "ආ" SINHALA LETTER AAYANNA
         private static final ExpectedKey SINHALA_ALPHABET_KEY = key(
                 "\u0D85,\u0D86", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+
+        // U+0DBB/U+0DD4: "රු" SINHALA LETTER RAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA
+        private static final ExpectedKey CURRENCY_RUPEE = key("\u0DBB\u0DD4",
+                Symbols.CURRENCY_GENERIC_MORE_KEYS);
     }
 
     @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Tamil.java b/tests/src/com/android/inputmethod/keyboard/layout/Tamil.java
index 70385c7d0..597b6fa55 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Tamil.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Tamil.java
@@ -41,14 +41,6 @@ public final class Tamil extends LayoutBase {
         @Override
         public ExpectedKey getAlphabetKey() { return TAMIL_ALPHABET_KEY; }
 
-        @Override
-        public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
-
-        @Override
-        public ExpectedKey[] getOtherCurrencyKeys() {
-            return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
-        }
-
         @Override
         public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
             return EMPTY_KEYS;
@@ -64,10 +56,6 @@ public final class Tamil extends LayoutBase {
         // U+0BB4/U+0BCD: "ழ்" TAMIL LETTER LLLA/TAMIL SIGN VIRAMA
         private static final ExpectedKey TAMIL_ALPHABET_KEY = key(
                 "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD", Constants.CODE_SWITCH_ALPHA_SYMBOL);
-
-        // U+0BF9: "௹" TAMIL RUPEE SIGN
-        private static final ExpectedKey CURRENCY_RUPEE = key("\u0BF9",
-                Symbols.CURRENCY_GENERIC_MORE_KEYS);
     }
 
     @Override
@@ -81,15 +69,20 @@ public final class Tamil extends LayoutBase {
     private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
             .setKeysOfRow(1,
                     // U+0B94: "ஔ" TAMIL LETTER AU
-                    key("\u0B94", moreKey("1")),
+                    // U+0BCC: "ௌ" TAMIL VOWEL SIGN AU
+                    key("\u0B94", joinMoreKeys("\u0BCC", "1")),
                     // U+0B90: "ஐ" TAMIL LETTER AI
-                    key("\u0B90", moreKey("2")),
+                    // U+0BC8: "ை" TAMIL VOWEL SIGN AI
+                    key("\u0B90", joinMoreKeys("\u0BC8", "2")),
                     // U+0B86: "ஆ" TAMIL LETTER AA
-                    key("\u0B86", moreKey("3")),
+                    // U+0BBE: "ா" TAMIL VOWEL SIGN AA
+                    key("\u0B86", joinMoreKeys("\u0BBE", "3")),
                     // U+0B88: "ஈ" TAMIL LETTER II
-                    key("\u0B88", moreKey("4")),
+                    // U+0BC0: "ீ" TAMIL VOWEL SIGN II
+                    key("\u0B88", joinMoreKeys("\u0BC0", "4")),
                     // U+0B8A: "ஊ" TAMIL LETTER UU
-                    key("\u0B8A", moreKey("5")),
+                    // U+0BC2: "ூ" TAMIL VOWEL SIGN UU
+                    key("\u0B8A", joinMoreKeys("\u0BC2","5")),
                     // U+0BAE: "ம" TAMIL LETTER MA
                     key("\u0BAE", moreKey("6")),
                     // U+0BA9: "ன" TAMIL LETTER NNNA
@@ -104,18 +97,24 @@ public final class Tamil extends LayoutBase {
                     "\u0B9E")
             .setKeysOfRow(2,
                     // U+0B93: "ஓ" TAMIL LETTER OO
+                    // U+0BCB: "ோ" TAMIL VOWEL SIGN OO
                     // U+0BD0: "ௐ" TAMIL OM
-                    key("\u0B93", moreKey("\u0BD0")),
+                    key("\u0B93", joinMoreKeys("\u0BCB", "\u0BD0")),
                     // U+0B8F: "ஏ" TAMIL LETTER EE
-                    "\u0B8F",
+                    // U+0BC7: "ே" TAMIL VOWEL SIGN EE
+                    key("\u0B8F", moreKey("\u0BC7")),
                     // U+0B85: "அ" TAMIL LETTER A
                     // U+0B83: "ஃ" TAMIL SIGN VISARGA
                     key("\u0B85", moreKey("\u0B83")),
                     // U+0B87: "இ" TAMIL LETTER I
+                    // U+0BBF: "ி" TAMIL VOWEL SIGN I
+                    key("\u0B87", moreKey("\u0BBF")),
                     // U+0B89: "உ" TAMIL LETTER U
+                    // U+0BC1: "ு" TAMIL VOWEL SIGN U
+                    key("\u0B89", moreKey("\u0BC1")),
                     // U+0BB1: "ற" TAMIL LETTER RRA
                     // U+0BAA: "ப" TAMIL LETTER PA
-                    "\u0B87", "\u0B89", "\u0BB1", "\u0BAA",
+                    "\u0BB1", "\u0BAA",
                     // U+0B95: "க" TAMIL LETTER KA
                     // U+0BB9: "ஹ" TAMIL LETTER HA
                     // U+0B95/U+0BCD/U+0BB7:
@@ -133,7 +132,11 @@ public final class Tamil extends LayoutBase {
                     "\u0B9F")
             .setKeysOfRow(3,
                     // U+0B92: "ஒ" TAMIL LETTER O
+                    // U+0BCA: "ொ" TAMIL VOWEL SIGN O
+                    key("\u0B92", moreKey("\u0BCA")),
                     // U+0B8E: "எ" TAMIL LETTER E
+                    // U+0BC6: "ெ" TAMIL VOWEL SIGN E
+                    key("\u0B8E", moreKey("\u0BC6")),
                     // U+0BCD: "்" TAMIL SIGN VIRAMA
                     // U+0BB0: "ர" TAMIL LETTER RA
                     // U+0BB5: "வ" TAMIL LETTER VA
@@ -141,8 +144,7 @@ public final class Tamil extends LayoutBase {
                     // U+0BB2: "ல" TAMIL LETTER LA
                     // U+0BB3: "ள" TAMIL LETTER LLA
                     // U+0BAF: "ய" TAMIL LETTER YA
-                    "\u0B92", "\u0B8E", "\u0BCD", "\u0BB0", "\u0BB5", "\u0BB4", "\u0BB2", "\u0BB3",
-                    "\u0BAF",
+                    "\u0BCD", "\u0BB0", "\u0BB5", "\u0BB4", "\u0BB2", "\u0BB3", "\u0BAF",
                     // U+0BB7: "ஷ" TAMIL LETTER SSA
                     // U+0B9C: "ஜ" TAMIL LETTER JA
                     key("\u0BB7", moreKey("\u0B9C")))
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilIN.java
index 5b3649d2b..31df53c0b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilIN.java
@@ -19,8 +19,11 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.SymbolsShifted;
 import com.android.inputmethod.keyboard.layout.Tamil;
 import com.android.inputmethod.keyboard.layout.Tamil.TamilCustomizer;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
 
@@ -30,8 +33,24 @@ import java.util.Locale;
 @SmallTest
 public final class TestsTamilIN extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("ta", "IN");
-    private static final LayoutBase LAYOUT = new Tamil(new TamilCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Tamil(new TamilINCustomizer(LOCALE));
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
+
+    private static class TamilINCustomizer extends TamilCustomizer {
+        public TamilINCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
+
+        @Override
+        public ExpectedKey[] getOtherCurrencyKeys() {
+            return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
+        }
+
+        // U+20B9: "₹" INDIAN RUPEE SIGN
+        private static final ExpectedKey CURRENCY_RUPEE = key("\u20B9",
+                Symbols.CURRENCY_GENERIC_MORE_KEYS);
+    }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilLK.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilLK.java
new file mode 100644
index 000000000..21b591c28
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilLK.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout.tests;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.Tamil;
+import com.android.inputmethod.keyboard.layout.Tamil.TamilCustomizer;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+
+import java.util.Locale;
+
+/**
+ * ta_LK: Tamil (Sri Lanka)/tamil
+ */
+@SmallTest
+public final class TestsTamilLK extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("ta", "LK");
+    private static final LayoutBase LAYOUT = new Tamil(new TamilLKCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class TamilLKCustomizer extends TamilCustomizer {
+        public TamilLKCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
+
+        @Override
+        public ExpectedKey[] getOtherCurrencyKeys() {
+            return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
+        }
+
+        // U+0DBB/U+0DD4: "රු" SINHALA LETTER RAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA
+        private static final ExpectedKey CURRENCY_RUPEE = key("\u0DBB\u0DD4",
+                Symbols.CURRENCY_GENERIC_MORE_KEYS);
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilSG.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilSG.java
new file mode 100644
index 000000000..ade7abaf9
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilSG.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout.tests;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Tamil;
+import com.android.inputmethod.keyboard.layout.Tamil.TamilCustomizer;
+
+import java.util.Locale;
+
+/**
+ * ta_SG: Tamil (Singapore)/tamil
+ */
+@SmallTest
+public final class TestsTamilSG extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("ta", "SG");
+    private static final LayoutBase LAYOUT = new Tamil(new TamilCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tools/make-keyboard-text/res/values-bn-rIN/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-bn-rIN/donottranslate-more-keys.xml
index 4955cd46a..1ec4249d0 100644
--- a/tools/make-keyboard-text/res/values-bn-rIN/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-bn-rIN/donottranslate-more-keys.xml
@@ -23,6 +23,6 @@
          U+0996: "ख" BENGALI LETTER KHA
          U+0997: "ग" BENGALI LETTER GA -->
     <string name="keylabel_to_alpha">&#x0995;&#x0996;&#x0997;</string>
-    <!-- U+09F3: "৳" BENGALI RUPEE SIGN -->
-    <string name="keyspec_currency">&#x09F3;</string>
+    <!-- U+20B9: "₹" INDIAN RUPEE SIGN -->
+    <string name="keyspec_currency">&#x20B9;</string>
 </resources>
diff --git a/tools/make-keyboard-text/res/values-si-rLK/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-si-rLK/donottranslate-more-keys.xml
index 89c9195e8..871d82ab0 100644
--- a/tools/make-keyboard-text/res/values-si-rLK/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-si-rLK/donottranslate-more-keys.xml
@@ -22,4 +22,6 @@
          U+0D85: "අ" SINHALA LETTER AYANNA
          U+0D86: "ආ" SINHALA LETTER AAYANNA -->
     <string name="keylabel_to_alpha">&#x0D85;,&#x0D86;</string>
+    <!-- U+0DBB/U+0DD4: "රු" SINHALA LETTER RAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA -->
+    <string name="keyspec_currency">&#x0DBB;&#x0DD4;</string>
 </resources>
diff --git a/tools/make-keyboard-text/res/values-ta-rLK/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-ta-rLK/donottranslate-more-keys.xml
new file mode 100644
index 000000000..9e900a6b1
--- /dev/null
+++ b/tools/make-keyboard-text/res/values-ta-rLK/donottranslate-more-keys.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for "switch to alphabetic" key.
+         U+0BA4: "த" TAMIL LETTER TA
+         U+0BAE/U+0BBF: "மி" TAMIL LETTER MA/TAMIL VOWEL SIGN I
+         U+0BB4/U+0BCD: "ழ்" TAMIL LETTER LLLA/TAMIL SIGN VIRAMA -->
+    <string name="keylabel_to_alpha">&#x0BA4;&#x0BAE;&#x0BBF;&#x0BB4;&#x0BCD;</string>
+    <!-- U+0DBB/U+0DD4: "රු" SINHALA LETTER RAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA -->
+    <string name="keyspec_currency">&#x0DBB;&#x0DD4;</string>
+</resources>
diff --git a/tools/make-keyboard-text/res/values-ta-rSG/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-ta-rSG/donottranslate-more-keys.xml
new file mode 100644
index 000000000..07e4d8beb
--- /dev/null
+++ b/tools/make-keyboard-text/res/values-ta-rSG/donottranslate-more-keys.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for "switch to alphabetic" key.
+         U+0BA4: "த" TAMIL LETTER TA
+         U+0BAE/U+0BBF: "மி" TAMIL LETTER MA/TAMIL VOWEL SIGN I
+         U+0BB4/U+0BCD: "ழ்" TAMIL LETTER LLLA/TAMIL SIGN VIRAMA -->
+    <string name="keylabel_to_alpha">&#x0BA4;&#x0BAE;&#x0BBF;&#x0BB4;&#x0BCD;</string>
+</resources>
diff --git a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
index 4b9ca162e..bf97e73f4 100644
--- a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
@@ -87,7 +87,7 @@
          U+20B1: "₱" PESO SIGN -->
     <string name="morekeys_currency_dollar">&#x00A2;,&#x00A3;,&#x20AC;,&#x00A5;,&#x20B1;</string>
     <string name="keyspec_currency">$</string>
-    <string name="morekeys_currency">$,&#x00A2;,&#x20AC;,&#x00A3;,&#x00A5;,&#x20B1;</string>
+    <string name="morekeys_currency_generic">$,&#x00A2;,&#x20AC;,&#x00A3;,&#x00A5;,&#x20B1;</string>
     <string name="morekeys_punctuation">"!autoColumnOrder!8,\\,,?,!,#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,',@,:,-,\",+,\\%,&amp;"</string>
     <string name="morekeys_tablet_punctuation">"!autoColumnOrder!7,\\,,',#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,@,:,-,\",+,\\%,&amp;"</string>
     <!-- U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE -->