Merge "Add lao keyboard test"
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index 387ed39..e056a26 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -525,10 +525,10 @@
         null, null, null, null, null, null, null, null, null, null,
         /* ~ more_keys_for_n */
         // Label for "switch to alphabetic" key.
-        // U+0623: "ا" ARABIC LETTER ALEF
+        // U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
-        // U+062C: "پ" ARABIC LETTER PEH
+        // U+062C: "ج" ARABIC LETTER JEEM
         /* label_to_alpha_key */ "\u0623\u200C\u0628\u200C\u062C",
         /* more_keys_for_y ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java b/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
index 65b050b..6fbede8 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
@@ -95,10 +95,10 @@
             return ARABIC_DIACRITICS;
         }
 
-        // U+0623: "ا" ARABIC LETTER ALEF
+        // U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
-        // U+062C: "پ" ARABIC LETTER PEH
+        // U+062C: "ج" ARABIC LETTER JEEM
         private static final ExpectedKey ARABIC_ALPHABET_KEY = key(
                 "\u0623\u200C\u0628\u200C\u062C", Constants.CODE_SWITCH_ALPHA_SYMBOL);
         // U+0663: "٣" ARABIC-INDIC DIGIT THREE
@@ -107,10 +107,6 @@
         // U+061F: "؟" ARABIC QUESTION MARK
         private static final ExpectedKey ARABIC_SYMBOLS_KEY = key(
                 "\u0663\u0662\u0661\u061F", Constants.CODE_SWITCH_ALPHA_SYMBOL);
-        // U+0663: "٣" ARABIC-INDIC DIGIT THREE
-        // U+0662: "٢" ARABIC-INDIC DIGIT TWO
-        // U+0661: "١" ARABIC-INDIC DIGIT ONE
-        // U+061F: "؟" ARABIC QUESTION MARK
         private static final ExpectedKey ARABIC_BACK_TO_SYMBOLS_KEY = key(
                 "\u0663\u0662\u0661\u061F", Constants.CODE_SHIFT);
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Georgian.java b/tests/src/com/android/inputmethod/keyboard/layout/Georgian.java
new file mode 100644
index 0000000..ad87c3b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Georgian.java
@@ -0,0 +1,179 @@
+/*
+ * 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;
+
+import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+/**
+ * The Georgian alphabet keyboard.
+ */
+public final class Georgian extends LayoutBase {
+    private static final String LAYOUT_NAME = "georgian";
+
+    public Georgian(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class GeorgianCustomizer extends LayoutCustomizer {
+        public GeorgianCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getAlphabetKey() { return GEORGIAN_ALPHABET_KEY; }
+
+        @Override
+        public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
+
+        @Override
+        public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_R9L; }
+
+        // U+10D0: "ა" GEORGIAN LETTER AN
+        // U+10D1: "ბ" GEORGIAN LETTER BAN
+        // U+10D2: "გ" GEORGIAN LETTER GAN
+        private static final ExpectedKey GEORGIAN_ALPHABET_KEY = key(
+                "\u10D0\u10D1\u10D2", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
+        return ALPHABET_COMMON;
+    }
+
+    @Override
+    public ExpectedKey[][] getCommonAlphabetShiftLayout(final boolean isPhone,
+            final int elementId) {
+        if (elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
+            return getCommonAlphabetLayout(isPhone);
+        }
+        return ALPHABET_SHIFTED_COMMON;
+    }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+10E5: "ქ" GEORGIAN LETTER GHAN
+                    key("\u10E5", moreKey("1")),
+                    // U+10EC: "წ" GEORGIAN LETTER CIL
+                    key("\u10EC", moreKey("2")),
+                    // U+10D4: "ე" GEORGIAN LETTER EN
+                    // U+10F1: "ჱ" GEORGIAN LETTER HE
+                    key("\u10D4", joinMoreKeys("3", "\u10F1")),
+                    // U+10E0: "რ" GEORGIAN LETTER RAE
+                    key("\u10E0", moreKey("4")),
+                    // U+10E2: "ტ" GEORGIAN LETTER TAR
+                    key("\u10E2", moreKey("5")),
+                    // U+10E7: "ყ" GEORGIAN LETTER QAR
+                    // U+10F8: "ჸ" GEORGIAN LETTER ELIFI
+                    key("\u10E7", joinMoreKeys("6", "\u10F8")),
+                    // U+10E3: "უ" GEORGIAN LETTER UN
+                    key("\u10E3", moreKey("7")),
+                    // U+10D8: "ი" GEORGIAN LETTER IN
+                    // U+10F2: "ჲ" GEORGIAN LETTER HIE
+                    key("\u10D8", joinMoreKeys("8", "\u10F2")),
+                    // U+10DD: "ო" GEORGIAN LETTER ON
+                    key("\u10DD", moreKey("9")),
+                    // U+10DE: "პ" GEORGIAN LETTER PAR
+                    key("\u10DE", moreKey("0")))
+            .setKeysOfRow(2,
+                    // U+10D0: "ა" GEORGIAN LETTER AN
+                    // U+10FA: "ჺ" GEORGIAN LETTER AIN
+                    key("\u10D0", moreKey("\u10FA")),
+                    // U+10E1: "ს" GEORGIAN LETTER SAN
+                    key("\u10E1"),
+                    // U+10D3: "დ" GEORGIAN LETTER DON
+                    key("\u10D3"),
+                    // U+10E4: "ფ" GEORGIAN LETTER PHAR
+                    // U+10F6: "ჶ" GEORGIAN LETTER FI
+                    key("\u10E4", moreKey("\u10F6")),
+                    // U+10D2: "გ" GEORGIAN LETTER GAN
+                    // U+10F9: "ჹ" GEORGIAN LETTER TURNED GAN
+                    key("\u10D2", moreKey("\u10F9")),
+                    // U+10F0: "ჰ" GEORGIAN LETTER HAE
+                    // U+10F5: "ჵ" GEORGIAN LETTER HOE
+                    key("\u10F0", moreKey("\u10F5")),
+                    // U+10EF: "ჯ" GEORGIAN LETTER JHAN
+                    // U+10F7: "ჷ" GEORGIAN LETTER YN
+                    key("\u10EF", moreKey("\u10F7")),
+                    // U+10D9: "კ" GEORGIAN LETTER KAN
+                    key("\u10D9"),
+                    // U+10DA: "ლ" GEORGIAN LETTER LAS
+                    key("\u10DA"))
+            .setKeysOfRow(3,
+                    // U+10D6: "ზ" GEORGIAN LETTER ZEN
+                    key("\u10D6"),
+                    // U+10EE: "ხ" GEORGIAN LETTER XAN
+                    // U+10F4: "ჴ" GEORGIAN LETTER HAR
+                    key("\u10EE", moreKey("\u10F4")),
+                    // U+10EA: "ც" GEORGIAN LETTER CAN
+                    key("\u10EA"),
+                    // U+10D5: "ვ" GEORGIAN LETTER VIN
+                    // U+10F3: "ჳ" GEORGIAN LETTER WE
+                    key("\u10D5", moreKey("\u10F3")),
+                    // U+10D1: "ბ" GEORGIAN LETTER BAN
+                    key("\u10D1"),
+                    // U+10DC: "ნ" GEORGIAN LETTER NAR
+                    // U+10FC: "ჼ" MODIFIER LETTER GEORGIAN NAR
+                    key("\u10DC", moreKey("\u10FC")),
+                    // U+10DB: "მ" GEORGIAN LETTER MAN
+                    key("\u10DB"))
+            .build();
+
+    private static final ExpectedKey[][] ALPHABET_SHIFTED_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    key("Q", moreKey("1")),
+                    // U+10ED: "ჭ" GEORGIAN LETTER CHAR
+                    key("\u10ED", moreKey("2")),
+                    key("E", moreKey("3")),
+                    // U+10E6: "ღ" GEORGIAN LETTER GHAN
+                    key("\u10E6", moreKey("4")),
+                    // U+10D7: "თ" GEORGIAN LETTER TAN
+                    key("\u10D7", moreKey("5")),
+                    key("Y", moreKey("6")),
+                    key("U", moreKey("7")),
+                    key("I", moreKey("8")),
+                    key("O", moreKey("9")),
+                    key("P", moreKey("0")))
+            .setKeysOfRow(2,
+                    key("A"),
+                    // U+10E8: "შ" GEORGIAN LETTER SHIN
+                    key("\u10E8"),
+                    key("D"),
+                    key("F"),
+                    key("G"),
+                    key("H"),
+                    // U+10DF: "ჟ" GEORGIAN LETTER ZHAR
+                    key("\u10DF"),
+                    key("K"),
+                    key("L"))
+            .setKeysOfRow(3,
+                    // U+10EB: "ძ" GEORGIAN LETTER JIL
+                    key("\u10EB"),
+                    key("X"),
+                    // U+10E9: "ჩ" GEORGIAN LETTER CHIN
+                    key("\u10E9"),
+                    key("V"),
+                    key("B"),
+                    key("N"),
+                    key("M"))
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java b/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java
new file mode 100644
index 0000000..61ade8b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java
@@ -0,0 +1,322 @@
+/*
+ * 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;
+
+import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+/**
+ * The Khmer alphabet keyboard.
+ */
+public final class Khmer extends LayoutBase {
+    private static final String LAYOUT_NAME = "khmer";
+
+    public Khmer(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class KhmerCustomizer extends LayoutCustomizer {
+        public KhmerCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getAlphabetKey() { return KHMER_ALPHABET_KEY; }
+
+        @Override
+        public ExpectedKey getCurrencyKey() { return CURRENCY_DOLLAR_WITH_RIEL; }
+
+        @Override
+        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) { return EMPTY_KEYS; }
+
+        // U+1780: "ក" KHMER LETTER KA
+        // U+1781: "ខ" KHMER LETTER KHA
+        // U+1782: "គ" KHMER LETTER KO
+        private static final ExpectedKey KHMER_ALPHABET_KEY = key(
+                "\u1780\u1781\u1782", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+
+        // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
+        private static final ExpectedKey CURRENCY_DOLLAR_WITH_RIEL = key(Symbols.DOLLAR_SIGN,
+                moreKey("\u17DB"), Symbols.CENT_SIGN, Symbols.POUND_SIGN, Symbols.EURO_SIGN,
+                Symbols.YEN_SIGN, Symbols.PESO_SIGN);
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
+        if (isPhone) {
+            return ALPHABET_COMMON;
+        }
+        final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
+        builder.addKeysOnTheRightOfRow(4, EXCLAMATION_AND_QUESTION_MARKS);
+        return builder.build();
+    }
+
+    @Override
+    public ExpectedKey[][] getCommonAlphabetShiftLayout(final boolean isPhone,
+            final int elementId) {
+        if (elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
+            return getCommonAlphabetLayout(isPhone);
+        }
+        return ALPHABET_SHIFTED_COMMON;
+    }
+
+    // Helper method to create alphabet layout by adding special function keys.
+    @Override
+    ExpectedKeyboardBuilder convertCommonLayoutToKeyboard(final ExpectedKeyboardBuilder builder,
+            final boolean isPhone) {
+        final LayoutCustomizer customizer = getCustomizer();
+        final ExpectedKey[] spacebar = joinKeys(
+                customizer.getKeysLeftToSpacebar(isPhone),
+                customizer.getSpaceKeys(isPhone),
+                customizer.getKeysRightToSpacebar(isPhone));
+        builder.setKeysOfRow(5, spacebar);
+        if (isPhone) {
+            builder.addKeysOnTheRightOfRow(4, DELETE_KEY)
+                    .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey())
+                    .addKeysOnTheRightOfRow(5, key(ENTER_KEY, EMOJI_KEY));
+        } else {
+            builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
+                    .addKeysOnTheRightOfRow(3, ENTER_KEY)
+                    .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey(), SETTINGS_KEY)
+                    .addKeysOnTheRightOfRow(5, EMOJI_KEY);
+        }
+        builder.addKeysOnTheLeftOfRow(4, customizer.getLeftShiftKeys(isPhone))
+                .addKeysOnTheRightOfRow(4, customizer.getRightShiftKeys(isPhone));
+        return builder;
+    }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+17E1: "១" KHMER DIGIT ONE
+                    // U+17F1: "៱" KHMER SYMBOL LEK ATTAK MUOY
+                    key("\u17E1", joinMoreKeys("1", "\u17F1")),
+                    // U+17E2: "២" KHMER DIGIT TWO
+                    // U+17F2: "៲" KHMER SYMBOL LEK ATTAK PII
+                    key("\u17E2", joinMoreKeys("2", "\u17F2")),
+                    // U+17E3: "៣" KHMER DIGIT THREE
+                    // U+17F3: "៳" KHMER SYMBOL LEK ATTAK BEI
+                    key("\u17E3", joinMoreKeys("3", "\u17F3")),
+                    // U+17E4: "៤" KHMER DIGIT FOUR
+                    // U+17F4: "៴" KHMER SYMBOL LEK ATTAK BUON
+                    key("\u17E4", joinMoreKeys("4", "\u17F4")),
+                    // U+17E5: "៥" KHMER DIGIT FIVE
+                    // U+17F5: "៵" KHMER SYMBOL LEK ATTAK PRAM
+                    key("\u17E5", joinMoreKeys("5", "\u17F5")),
+                    // U+17E6: "៦" KHMER DIGIT SIX
+                    // U+17F6: "៶" KHMER SYMBOL LEK ATTAK PRAM-MUOY
+                    key("\u17E6", joinMoreKeys("6", "\u17F6")),
+                    // U+17E7: "៧" KHMER DIGIT SEVEN
+                    // U+17F7: "៷" KHMER SYMBOL LEK ATTAK PRAM-PII
+                    key("\u17E7", joinMoreKeys("7", "\u17F7")),
+                    // U+17E8: "៨" KHMER DIGIT EIGHT
+                    // U+17F8: "៸" KHMER SYMBOL LEK ATTAK PRAM-BEI
+                    key("\u17E8", joinMoreKeys("8", "\u17F8")),
+                    // U+17E9: "៩" KHMER DIGIT NINE
+                    // U+17F9: "៹" KHMER SYMBOL LEK ATTAK PRAM-BUON
+                    key("\u17E9", joinMoreKeys("9", "\u17F9")),
+                    // U+17E0: "០" KHMER DIGIT ZERO
+                    // U+17F0: "៰" KHMER SYMBOL LEK ATTAK SON
+                    key("\u17E0", joinMoreKeys("0", "\u17F0")),
+                    // U+17A5: "ឥ" KHMER INDEPENDENT VOWEL QI
+                    // U+17A6: "ឦ" KHMER INDEPENDENT VOWEL QII
+                    key("\u17A5", moreKey("\u17A6")),
+                    // U+17B2: "ឲ" KHMER INDEPENDENT VOWEL QOO TYPE TWO
+                    // U+17B1: "ឱ" KHMER INDEPENDENT VOWEL QOO TYPE ONE
+                    key("\u17B2", moreKey("\u17B1")))
+            .setKeysOfRow(2,
+                    // U+1786: "ឆ" KHMER LETTER CHA
+                    key("\u1786"),
+                    // U+17B9: "ឹ" KHMER VOWEL SIGN Y
+                    key("\u17B9"),
+                    // U+17C1: "េ" KHMER VOWEL SIGN E
+                    key("\u17C1"),
+                    // U+179A: "រ" KHMER LETTER RO
+                    key("\u179A"),
+                    // U+178F: "ត" KHMER LETTER TA
+                    key("\u178F"),
+                    // U+1799: "យ" KHMER LETTER YO
+                    key("\u1799"),
+                    // U+17BB: "ុ" KHMER VOWEL SIGN U
+                    key("\u17BB"),
+                    // U+17B7: "ិ" KHMER VOWEL SIGN I
+                    key("\u17B7"),
+                    // U+17C4: "ោ" KHMER VOWEL SIGN OO
+                    key("\u17C4"),
+                    // U+1795: "ផ" KHMER LETTER PHA
+                    key("\u1795"),
+                    // U+17C0: "ៀ" KHMER VOWEL SIGN IE
+                    key("\u17C0"),
+                    // U+17AA: "ឪ" KHMER INDEPENDENT VOWEL QUUV
+                    // U+17A7: "ឧ" KHMER INDEPENDENT VOWEL QU
+                    // U+17B1: "ឱ" KHMER INDEPENDENT VOWEL QOO TYPE ONE
+                    // U+17B3: "ឳ" KHMER INDEPENDENT VOWEL QAU
+                    // U+17A9: "ឩ" KHMER INDEPENDENT VOWEL QUU
+                    // U+17A8: "ឨ" KHMER INDEPENDENT VOWEL QUK
+                    key("\u17AA", joinMoreKeys("\u17A7", "\u17B1", "\u17B3", "\u17A9", "\u17A8")))
+            .setKeysOfRow(3,
+                    // U+17B6: "ា" KHMER VOWEL SIGN AA
+                    key("\u17B6"),
+                    // U+179F: "ស" KHMER LETTER SA
+                    key("\u179F"),
+                    // U+178A: "ដ" KHMER LETTER DA
+                    key("\u178A"),
+                    // U+1790: "ថ" KHMER LETTER THA
+                    key("\u1790"),
+                    // U+1784: "ង" KHMER LETTER NGO
+                    key("\u1784"),
+                    // U+17A0: "ហ" KHMER LETTER HA
+                    key("\u17A0"),
+                    // U+17D2: "្" KHMER SIGN COENG
+                    key("\u17D2"),
+                    // U+1780: "ក" KHMER LETTER KA
+                    key("\u1780"),
+                    // U+179B: "ល" KHMER LETTER LO
+                    key("\u179B"),
+                    // U+17BE: "ើ" KHMER VOWEL SIGN OE
+                    key("\u17BE"),
+                    // U+17CB: "់" KHMER SIGN BANTOC
+                    key("\u17CB"),
+                    // U+17AE: "ឮ" KHMER INDEPENDENT VOWEL LYY
+                    // U+17AD: "ឭ" KHMER INDEPENDENT VOWEL LY
+                    // U+17B0: "ឰ" KHMER INDEPENDENT VOWEL QAI
+                    key("\u17AE", joinMoreKeys("\u17AD", "\u17B0")))
+            .setLabelsOfRow(4,
+                    // U+178B: "ឋ" KHMER LETTER TTHA
+                    // U+1781: "ខ" KHMER LETTER KHA
+                    // U+1785: "ច" KHMER LETTER CA
+                    // U+179C: "វ" KHMER LETTER VO
+                    // U+1794: "ប" KHMER LETTER BA
+                    // U+1793: "ន" KHMER LETTER NO
+                    // U+1798: "ម" KHMER LETTER MO
+                    // U+17BB/U+17C6: "ុំ" KHMER VOWEL SIGN U/KHMER SIGN NIKAHIT
+                    // U+17D4: "។" KHMER SIGN KHAN
+                    // U+17CA: "៊" KHMER SIGN TRIISAP
+                    "\u178B", "\u1781", "\u1785", "\u179C", "\u1794", "\u1793", "\u1798",
+                    "\u17BB\u17C6", "\u17D4", "\u17CA")
+            .build();
+
+    private static final ExpectedKey[][] ALPHABET_SHIFTED_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    key("!", ZWJ_KEY),
+                    // U+17D7: "ៗ" KHMER SIGN LEK TOO
+                    key("\u17D7", ZWNJ_KEY),
+                    // U+17D1: "៑" KHMER SIGN VIRIAM
+                    key("\"", moreKey("\u17D1")),
+                    // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
+                    key("\u17DB", joinMoreKeys(Symbols.DOLLAR_SIGN, Symbols.EURO_SIGN)),
+                    // U+17D6: "៖" KHMER SIGN CAMNUC PII KUUH
+                    key("%", moreKey("\u17D6")),
+                    // U+17CD: "៍" KHMER SIGN TOANDAKHIAT
+                    // U+17D9: "៙" KHMER SIGN PHNAEK MUAN
+                    key("\u17CD", moreKey("\u17D9")),
+                    // U+17D0: "័" KHMER SIGN SAMYOK SANNYA
+                    // U+17DA: "៚" KHMER SIGN KOOMUUT
+                    key("\u17D0", moreKey("\u17DA")),
+                    // U+17CF: "៏" KHMER SIGN AHSDA
+                    key("\u17CF", moreKey("*")),
+                    // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+                    key("(", joinMoreKeys("{", "\u00AB")),
+                    // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+                    key(")", joinMoreKeys("}", "\u00BB")),
+                    // U+17CC: "៌" KHMER SIGN ROBAT
+                    // U+00D7: "×" MULTIPLICATION SIGN
+                    key("\u17CC", moreKey("\u00D7")),
+                    // U+17CE: "៎" KHMER SIGN KAKABAT
+                    key("\u17CE"))
+            .setKeysOfRow(2,
+                    // U+1788: "ឈ" KHMER LETTER CHO
+                    // U+17DC: "ៜ" KHMER SIGN AVAKRAHASANYA
+                    key("\u1788", moreKey("\u17DC")),
+                    // U+17BA: "ឺ" KHMER VOWEL SIGN YY
+                    // U+17DD: "៝" KHMER SIGN ATTHACAN
+                    key("\u17BA", moreKey("\u17DD")),
+                    // U+17C2: "ែ" KHMER VOWEL SIGN AE
+                    key("\u17C2"),
+                    // U+17AC: "ឬ" KHMER INDEPENDENT VOWEL RYY
+                    // U+17AB: "ឫ" KHMER INDEPENDENT VOWEL RY
+                    key("\u17AC", moreKey("\u17AB")),
+                    // U+1791: "ទ" KHMER LETTER TO
+                    key("\u1791"),
+                    // U+17BD: "ួ" KHMER VOWEL SIGN UA
+                    key("\u17BD"),
+                    // U+17BC: "ូ" KHMER VOWEL SIGN UU
+                    key("\u17BC"),
+                    // U+17B8: "ី" KHMER VOWEL SIGN II
+                    key("\u17B8"),
+                    // U+17C5: "ៅ" KHMER VOWEL SIGN AU
+                    key("\u17C5"),
+                    // U+1797: "ភ" KHMER LETTER PHO
+                    key("\u1797"),
+                    // U+17BF: "ឿ" KHMER VOWEL SIGN YA
+                    key("\u17BF"),
+                    // U+17B0: "ឰ" KHMER INDEPENDENT VOWEL QAI
+                    key("\u17B0"))
+            .setKeysOfRow(3,
+                    // U+17B6/U+17C6: "ាំ" KHMER VOWEL SIGN AA/KHMER SIGN NIKAHIT
+                    key("\u17B6\u17C6"),
+                    // U+17C3: "ៃ" KHMER VOWEL SIGN AI
+                    key("\u17C3"),
+                    // U+178C: "ឌ" KHMER LETTER DO
+                    key("\u178C"),
+                    // U+1792: "ធ" KHMER LETTER THO
+                    key("\u1792"),
+                    // U+17A2: "អ" KHMER LETTER QAE
+                    key("\u17A2"),
+                    // U+17C7: "ះ" KHMER SIGN REAHMUK
+                    // U+17C8: "ៈ" KHMER SIGN YUUKALEAPINTU
+                    key("\u17C7", moreKey("\u17C8")),
+                    // U+1789: "ញ" KHMER LETTER NYO
+                    key("\u1789"),
+                    // U+1782: "គ" KHMER LETTER KO
+                    // U+179D: "ឝ" KHMER LETTER SHA
+                    key("\u1782", moreKey("\u179D")),
+                    // U+17A1: "ឡ" KHMER LETTER LA
+                    key("\u17A1"),
+                    // U+17C4/U+17C7: "ោះ" KHMER VOWEL SIGN OO/KHMER SIGN REAHMUK
+                    key("\u17C4\u17C7"),
+                    // U+17C9: "៉" KHMER SIGN MUUSIKATOAN
+                    key("\u17C9"),
+                    // U+17AF: "ឯ" KHMER INDEPENDENT VOWEL QE
+                    key("\u17AF"))
+            .setKeysOfRow(4,
+                    // U+178D: "ឍ" KHMER LETTER TTHO
+                    key("\u178D"),
+                    // U+1783: "ឃ" KHMER LETTER KHO
+                    key("\u1783"),
+                    // U+1787: "ជ" KHMER LETTER CO
+                    key("\u1787"),
+                    // U+17C1/U+17C7: "េះ" KHMER VOWEL SIGN E/KHMER SIGN REAHMUK
+                    key("\u17C1\u17C7"),
+                    // U+1796: "ព" KHMER LETTER PO
+                    // U+179E: "ឞ" KHMER LETTER SSO
+                    key("\u1796", moreKey("\u179E")),
+                    // U+178E: "ណ" KHMER LETTER NNO
+                    key("\u178E"),
+                    // U+17C6: "ំ" KHMER SIGN NIKAHIT
+                    key("\u17C6"),
+                    // U+17BB/U+17C7: "ុះ" KHMER VOWEL SIGN U/KHMER SIGN REAHMUK
+                    key("\u17BB\u17C7"),
+                    // U+17D5: "៕" KHMER SIGN BARIYOOSAN
+                    key("\u17D5"),
+                    key("?"))
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Mongolian.java b/tests/src/com/android/inputmethod/keyboard/layout/Mongolian.java
new file mode 100644
index 0000000..3c9f4a0
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Mongolian.java
@@ -0,0 +1,118 @@
+/*
+ * 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;
+
+import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+public final class Mongolian extends LayoutBase {
+    private static final String LAYOUT_NAME = "mongolian";
+
+    public Mongolian(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class MongolianMNCustomizer extends EastSlavicCustomizer {
+        public MongolianMNCustomizer(final Locale locale) {
+            super(locale);
+        }
+
+        @Override
+        public ExpectedKey getCurrencyKey() { return CURRENCY_TUGRIK; }
+
+        @Override
+        public ExpectedKey[] getOtherCurrencyKeys() {
+            return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
+        }
+
+        // U+20AE: "₮" TUGRIK SIGN
+        private static final ExpectedKey CURRENCY_TUGRIK = key("\u20AE",
+                Symbols.CURRENCY_GENERIC_MORE_KEYS);
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+0444: "ф" CYRILLIC SMALL LETTER EF
+                    key("\u0444", moreKey("1")),
+                    // U+0446: "ц" CYRILLIC SMALL LETTER TSE
+                    key("\u0446", moreKey("2")),
+                    // U+0443: "у" CYRILLIC SMALL LETTER U
+                    key("\u0443", moreKey("3")),
+                    // U+0436: "ж" CYRILLIC SMALL LETTER ZHE
+                    key("\u0436", moreKey("4")),
+                    // U+044D: "э" CYRILLIC SMALL LETTER E
+                    key("\u044D", moreKey("5")),
+                    // U+043D: "н" CYRILLIC SMALL LETTER EN
+                    key("\u043D", moreKey("6")),
+                    // U+0433: "г" CYRILLIC SMALL LETTER GHE
+                    key("\u0433", moreKey("7")),
+                    // U+0448: "ш" CYRILLIC SMALL LETTER SHA
+                    // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+                    key("\u0448", joinMoreKeys("8", "\u0449")),
+                    // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
+                    key("\u04AF", moreKey("9")),
+                    // U+0437: "з" CYRILLIC SMALL LETTER ZE
+                    key("\u0437", moreKey("0")),
+                    // U+043A: "к" CYRILLIC SMALL LETTER KA
+                    key("\u043A"))
+            // U+0439: "й" CYRILLIC SMALL LETTER SHORT I
+            // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+            // U+0431: "б" CYRILLIC SMALL LETTER BE
+            // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
+            // U+0430: "а" CYRILLIC SMALL LETTER A
+            // U+0445: "х" CYRILLIC SMALL LETTER HA
+            // U+0440: "р" CYRILLIC SMALL LETTER ER
+            // U+043E: "о" CYRILLIC SMALL LETTER O
+            // U+043B: "л" CYRILLIC SMALL LETTER EL
+            // U+0434: "д" CYRILLIC SMALL LETTER DE
+            // U+043F: "п" CYRILLIC SMALL LETTER PE
+            .setLabelsOfRow(2,
+                    "\u0439", "\u044B", "\u0431", "\u04E9", "\u0430", "\u0445", "\u0440", "\u043E",
+                    "\u043B", "\u0434", "\u043F")
+            .setKeysOfRow(3,
+                    // U+044F: "я" CYRILLIC SMALL LETTER YA
+                    key("\u044F"),
+                    // U+0447: "ч" CYRILLIC SMALL LETTER CHE
+                    key("\u0447"),
+                    // U+0451: "ё" CYRILLIC SMALL LETTER IO
+                    // U+0435: "е" CYRILLIC SMALL LETTER IE
+                    key("\u0451", moreKey("\u0435")),
+                    // U+0441: "с" CYRILLIC SMALL LETTER ES
+                    key("\u0441"),
+                    // U+043C: "м" CYRILLIC SMALL LETTER EM
+                    key("\u043C"),
+                    // U+0438: "и" CYRILLIC SMALL LETTER I
+                    key("\u0438"),
+                    // U+0442: "т" CYRILLIC SMALL LETTER TE
+                    key("\u0442"),
+                    // U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN
+                    // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+                    key("\u044C", moreKey("\u044A")),
+                    // U+0432: "в" CYRILLIC SMALL LETTER VE
+                    // U+044E: "ю" CYRILLIC SMALL LETTER YU
+                    key("\u0432", moreKey("\u044E")))
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArabic.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArabic.java
index 7c97df5..fd76708 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArabic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArabic.java
@@ -25,7 +25,7 @@
 import java.util.Locale;
 
 /**
- * ar: TestsArabic/arabic
+ * ar: Arabic/arabic
  */
 @SmallTest
 public class TestsArabic extends LayoutTestsBase {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGeorgianGE.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGeorgianGE.java
new file mode 100644
index 0000000..f25942f
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGeorgianGE.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.Georgian;
+import com.android.inputmethod.keyboard.layout.Georgian.GeorgianCustomizer;
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+
+import java.util.Locale;
+
+/**
+ * ka_GE: Georgian (Georgia)/georgian
+ */
+@SmallTest
+public final class TestsGeorgianGE extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("ka", "GE");
+    private static final LayoutBase LAYOUT = new Georgian(new GeorgianCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKhmerKH.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKhmerKH.java
new file mode 100644
index 0000000..df2f40d
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKhmerKH.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.Khmer;
+import com.android.inputmethod.keyboard.layout.Khmer.KhmerCustomizer;
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+
+import java.util.Locale;
+
+/**
+ * km_KH: Khmer (Cambodia)/khmer
+ */
+@SmallTest
+public final class TestsKhmerKH extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("km", "KH");
+    private static final LayoutBase LAYOUT = new Khmer(new KhmerCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMongolianMN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMongolianMN.java
new file mode 100644
index 0000000..e28e962
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMongolianMN.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.Mongolian;
+import com.android.inputmethod.keyboard.layout.Mongolian.MongolianMNCustomizer;
+
+import java.util.Locale;
+
+/**
+ * mn_MN: Mongolian (Mongolia)/mongolian
+ */
+@SmallTest
+public final class TestsMongolianMN extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("mn", "MN");
+    private static final LayoutBase LAYOUT = new Mongolian(new MongolianMNCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
index d997685..4bbe343 100644
--- a/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
@@ -19,10 +19,10 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Label for "switch to alphabetic" key.
-         U+0623: "ا" ARABIC LETTER ALEF
+         U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
          U+200C: ZERO WIDTH NON-JOINER
          U+0628: "ب" ARABIC LETTER BEH
-         U+062C: "پ" ARABIC LETTER PEH -->
+         U+062C: "ج" ARABIC LETTER JEEM -->
     <string name="label_to_alpha_key">&#x0623;&#x200C;&#x0628;&#x200C;&#x062C;</string>
     <!-- U+0661: "١" ARABIC-INDIC DIGIT ONE -->
     <string name="keylabel_for_symbols_1">&#x0661;</string>