Merge "Create Ver2PtNodeArrayReader."
diff --git a/java/res/values-land/keyboard-heights.xml b/java/res/values-land/keyboard-heights.xml
index 670be33..d57f96b 100644
--- a/java/res/values-land/keyboard-heights.xml
+++ b/java/res/values-land/keyboard-heights.xml
@@ -33,7 +33,5 @@
     <!-- Preferable keyboard height in absolute scale: 45.0mm -->
         <!-- Xoom -->
         <item>HARDWARE=stingray,265.4378</item>
-    <!-- Default value for unknown device: empty string -->
-        <item>,</item>
     </string-array>
 </resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 5bedd4a..78cf34d 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -111,10 +111,6 @@
         <attr name="keyPreviewOffset" format="dimension" />
         <!-- Height of the key press feedback popup. -->
         <attr name="keyPreviewHeight" format="dimension" />
-        <!-- Duration of key preview popup zoom in animation in millisecond -->
-        <attr name="keyPreviewZoomInDuration" format="integer" />
-        <!-- Duration of key preview popup zoom out animation in millisecond -->
-        <attr name="keyPreviewZoomOutDuration" format="integer" />
         <!-- Delay after key releasing and key press feedback dismissing in millisecond -->
         <attr name="keyPreviewLingerTimeout" format="integer" />
         <!-- Layout resource for more keys keyboard -->
@@ -240,11 +236,6 @@
     </declare-styleable>
 
     <declare-styleable name="Keyboard_Key">
-        <!-- TODO: Remove code attribute and consolidate with keySpec. -->
-        <!-- The unicode value that this key outputs.
-             Code value represented in hexadecimal prefixed with "0x" or code value reference using
-             "!code/<code_name>" notation. -->
-        <attr name="code" format="string" />
         <!-- The alternate unicode value that this key outputs while typing.
              Code value represented in hexadecimal prefixed with "0x" or code value reference using
              "!code/<code_name>" notation. -->
@@ -276,9 +267,8 @@
             <flag name="altCodeWhileTyping" value="0x04" />
             <flag name="enableLongPress" value="0x08" />
         </attr>
-        <!-- TODO: Rename keyLabel to keySpec. -->
-        <!-- The label to display on the key. -->
-        <attr name="keyLabel" format="string" />
+        <!-- The label, icon to display on the key. And code, outputText of the key. -->
+        <attr name="keySpec" format="string" />
         <!-- The hint label to display on the key in conjunction with the label. -->
         <attr name="keyHintLabel" format="string" />
         <!-- The vertical adjustment of key hint label in proportion to its height. -->
@@ -318,9 +308,6 @@
             <!-- If true, disable additionalMoreKeys. -->
             <flag name="disableAdditionalMoreKeys" value="0x80000000" />
         </attr>
-        <!-- TODO: Remove keyIcon attribute and consolidate with keySpec. -->
-        <!-- The icon to display on the key instead of the label. -->
-        <attr name="keyIcon" format="string" />
         <!-- The icon for disabled key -->
         <attr name="keyIconDisabled" format="string" />
         <!-- The icon to show in the popup preview. -->
diff --git a/java/res/values/config-common.xml b/java/res/values/config-common.xml
index c920152..1b44bad 100644
--- a/java/res/values/config-common.xml
+++ b/java/res/values/config-common.xml
@@ -35,8 +35,10 @@
 
     <integer name="config_ignore_alt_code_key_timeout">350</integer>
 
-    <integer name="config_key_preview_zoom_in_duration">35</integer>
-    <integer name="config_key_preview_zoom_out_duration">40</integer>
+    <integer name="config_key_preview_show_up_duration">35</integer>
+    <integer name="config_key_preview_dismiss_duration">40</integer>
+    <fraction name="config_key_preview_show_up_start_scale">70%</fraction>
+    <fraction name="config_key_preview_dismiss_end_scale">70%</fraction>
     <integer name="config_key_preview_linger_timeout">70</integer>
     <!-- Suppress showing key preview duration after batch input in millisecond -->
     <integer name="config_suppress_key_preview_after_batch_input_duration">1000</integer>
diff --git a/java/res/values/keyboard-heights.xml b/java/res/values/keyboard-heights.xml
index c651a89..12dd51d 100644
--- a/java/res/values/keyboard-heights.xml
+++ b/java/res/values/keyboard-heights.xml
@@ -33,7 +33,5 @@
     <!-- Preferable keyboard height in absolute scale: 48.0mm -->
         <!-- Xoom -->
         <item>HARDWARE=stingray,283.1337</item>
-    <!-- Default value for unknown device: empty string -->
-        <item>,</item>
     </string-array>
 </resources>
diff --git a/java/res/values/keypress-vibration-durations.xml b/java/res/values/keypress-vibration-durations.xml
index cde4e44..032b5fd 100644
--- a/java/res/values/keypress-vibration-durations.xml
+++ b/java/res/values/keypress-vibration-durations.xml
@@ -59,7 +59,5 @@
         <item>MODEL=XT1035:MANUFACTURER=motorola,18</item>
         <!-- Sony Xperia Z, Z Ultra -->
         <item>MODEL=C6603|C6806:MANUFACTURER=Sony,35</item>
-        <!-- Default value for unknown device. The negative value means system default. -->
-        <item>,-1</item>
     </string-array>
 </resources>
diff --git a/java/res/values/keypress-volumes.xml b/java/res/values/keypress-volumes.xml
index d359055..074581d 100644
--- a/java/res/values/keypress-volumes.xml
+++ b/java/res/values/keypress-volumes.xml
@@ -26,7 +26,5 @@
         <item>HARDWARE=grouper,0.3f</item>
         <item>HARDWARE=mako,0.3f</item>
         <item>HARDWARE=manta,0.2f</item>
-        <!-- Default value for unknown device. The negative value means system default. -->
-        <item>,-1.0f</item>
     </string-array>
 </resources>
diff --git a/java/res/values/phantom-sudden-move-event-device-list.xml b/java/res/values/phantom-sudden-move-event-device-list.xml
index 53002b3..4f91cd3 100644
--- a/java/res/values/phantom-sudden-move-event-device-list.xml
+++ b/java/res/values/phantom-sudden-move-event-device-list.xml
@@ -23,7 +23,5 @@
              See {@link com.android.inputmethod.keyboard.PointerTracker}. -->
         <!-- Xoom -->
         <item>HARDWARE=stingray,true</item>
-        <!-- Default value for unknown device -->
-        <item>,false</item>
     </string-array>
 </resources>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 70f4c18..9045ce5 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -78,7 +78,7 @@
     <string name="key_preview_popup_dismiss_default_delay">Default</string>
 
     <!-- Units abbreviation for the duration (milliseconds) [CHAR LIMIT=10] -->
-    <string name="abbreviation_unit_milliseconds"><xliff:g id="milliseconds">%s</xliff:g>ms</string>
+    <string name="abbreviation_unit_milliseconds"><xliff:g id="MILLISECONDS">%s</xliff:g>ms</string>
     <!-- The text that represents the current settings value is the system default [CHAR LIMIT=25] -->
     <string name="settings_system_default">System default</string>
 
@@ -157,9 +157,6 @@
     <!-- Description for "gesture_space_aware" option. The user can input multiple words by gliding through the space key during a gesture input.[CHAR LIMIT=65]-->
     <string name="gesture_space_aware_summary">Input spaces during gestures by gliding to the space key</string>
 
-    <!-- Indicates that a word has been added to the dictionary -->
-    <string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string>
-
     <!-- Spoken description to let the user know that when typing in a password, they can plug in a headset in to hear spoken descriptions of the keys they type. [CHAR LIMIT=NONE] -->
     <string name="spoken_use_headphones">Plug in a headset to hear password keys spoken aloud.</string>
 
@@ -169,9 +166,9 @@
     <string name="spoken_no_text_entered">No text entered</string>
 
     <!-- Spoken description to let the user know what auto-correction will be performed when a key is pressed. An auto-correction replaces a single word with one or more words. -->
-    <string name="spoken_auto_correct"><xliff:g id="key" example="Space">%1$s</xliff:g> corrects <xliff:g id="original_word">%2$s</xliff:g> to <xliff:g id="corrected">%3$s</xliff:g></string>
+    <string name="spoken_auto_correct"><xliff:g id="KEY_NAME" example="Space">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g></string>
     <!-- Spoken description used during obscured (e.g. password) entry to let the user know that auto-correction will be performed when a key is pressed. -->
-    <string name="spoken_auto_correct_obscured"><xliff:g id="key" example="Space">%1$s</xliff:g> performs auto-correction</string>
+    <string name="spoken_auto_correct_obscured"><xliff:g id="KEY_NAME" example="Space">%1$s</xliff:g> performs auto-correction</string>
 
     <!-- Spoken description for unknown keyboard keys. -->
     <string name="spoken_description_unknown">Key code %d</string>
@@ -231,7 +228,7 @@
     <!-- Spoken feedback when the keyboard is hidden. -->
     <string name="announce_keyboard_hidden">Keyboard hidden</string>
     <!-- Spoken feedback when the keyboard mode changes. -->
-    <string name="announce_keyboard_mode">Showing <xliff:g id="mode" example="email">%s</xliff:g> keyboard</string>
+    <string name="announce_keyboard_mode">Showing <xliff:g id="KEYBOARD_MODE" example="email">%s</xliff:g> keyboard</string>
     <!-- Description of the keyboard mode for entering dates. -->
     <string name="keyboard_mode_date">date</string>
     <!-- Description of the keyboard mode for entering dates and times. -->
@@ -350,15 +347,15 @@
     <string name="subtype_es_US">Spanish (US)</string>
     <!-- Description for English (United Kingdom) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
          This should be identical to subtype_en_GB aside from the trailing (%s). -->
-    <string name="subtype_with_layout_en_GB">English (UK) (<xliff:g id="layout">%s</xliff:g>)</string>
+    <string name="subtype_with_layout_en_GB">English (UK) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
     <!-- Description for English (United States) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
          This should be identical to subtype_en_US aside from the trailing (%s). -->
-    <string name="subtype_with_layout_en_US">English (US) (<xliff:g id="layout">%s</xliff:g>)</string>
+    <string name="subtype_with_layout_en_US">English (US) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
     <!-- Description for Spanish (United States) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
          This should be identical to subtype_es_US aside from the trailing (%s). -->
-    <string name="subtype_with_layout_es_US">Spanish (US) (<xliff:g id="layout">%s</xliff:g>)</string>
+    <string name="subtype_with_layout_es_US">Spanish (US) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
     <!-- Description for Nepali (Traditional) keyboard subtype [CHAR LIMIT=25] -->
-    <string name="subtype_nepali_traditional"><xliff:g id="language">%s</xliff:g> (Traditional)</string>
+    <string name="subtype_nepali_traditional"><xliff:g id="LANGUAGE_NAME" example="Nepali">%s</xliff:g> (Traditional)</string>
     <!-- TODO: Uncomment once we can handle IETF language tag with script name specified.
          Description for Serbian Cyrillic keyboard subtype [CHAR LIMIT=25]
     <string name="subtype_serbian_cyrillic">Serbian (Cyrillic)</string>
@@ -366,7 +363,7 @@
     <string name="subtype_serbian_latin">Serbian (Latin)</string>
          Description for Serbian Latin keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
          This should be identical to subtype_serbian_latin aside from the trailing (%s).
-    <string name="subtype_with_layout_sr-Latn">Serbian (Latin) (<xliff:g id="layout">%s</xliff:g>)</string>
+    <string name="subtype_with_layout_sr-Latn">Serbian (Latin) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
     -->
     <!-- This string is displayed in a language list that allows to choose a language for
 suggestions in a software keyboard. This setting won't give suggestions in any particular
@@ -476,7 +473,7 @@
     <!-- Title of the button to postpone enabling a custom input style entry in the settings dialog [CHAR LIMIT=15] -->
     <string name="not_now">Not now</string>
     <!-- Toast text to describe the same input style already exists [CHAR LIMIT=64]-->
-    <string name="custom_input_style_already_exists">"The same input style already exists: <xliff:g id="input_style_name">%s</xliff:g>"</string>
+    <string name="custom_input_style_already_exists">"The same input style already exists: <xliff:g id="INPUT_STYLE_NAME" example="English (Dvorak)">%s</xliff:g>"</string>
 
     <!-- Title of an option for usability study mode -->
     <string name="prefs_usability_study_mode">Usability study mode</string>
@@ -486,6 +483,14 @@
     <string name="prefs_keypress_vibration_duration_settings">Keypress vibration duration</string>
     <!-- Title of the settings for keypress sound volume [CHAR LIMIT=35] -->
     <string name="prefs_keypress_sound_volume_settings">Keypress sound volume</string>
+    <!-- Title of the settings for key popup show up animation duration (in milliseconds) [CHAR LIMIT=35] -->
+    <string name="prefs_key_popup_show_up_duration_settings" translatable="false">Key popup show up duration</string>
+    <!-- Title of the settings for key popup dismiss animation duration (in milliseconds) [CHAR LIMIT=35] -->
+    <string name="prefs_key_popup_dismiss_duration_settings" translatable="false">Key popup dismiss duration</string>
+    <!-- Title of the settings for key popup show up animation start scale (in percentile) [CHAR LIMIT=35] -->
+    <string name="prefs_key_popup_show_up_start_scale_settings" translatable="false">Key popup show up start scale</string>
+    <!-- Title of the settings for key popup dismiss animation end scale (in percentile) [CHAR LIMIT=35] -->
+    <string name="prefs_key_popup_dismiss_end_scale_settings" translatable="false">Key popup dismiss end scale</string>
     <!-- Title of the settings for reading an external dictionary file -->
     <string name="prefs_read_external_dictionary">Read external dictionary file</string>
     <!-- Title of the settings for using only personalization dictionary -->
@@ -495,7 +500,7 @@
     <!-- Title of the dialog that selects a file to install as an external dictionary [CHAR LIMIT=50] -->
     <string name="read_external_dictionary_multiple_files_title">Select a dictionary file to install</string>
     <!-- Title of the confirmation dialog to install a file as an external dictionary [CHAR LIMIT=50] -->
-    <string name="read_external_dictionary_confirm_install_message">Really install this file for <xliff:g id="locale_name">%s</xliff:g>?</string>
+    <string name="read_external_dictionary_confirm_install_message">Really install this file for <xliff:g id="LANGUAGE_NAME" example="English">%s</xliff:g>?</string>
     <!-- Title for an error dialog that contains the details of the error in the body [CHAR LIMIT=80] -->
     <string name="error">There was an error</string>
     <!-- Title of the settings for dumpping contacts dictionary file [CHAR LIMIT=35] -->
@@ -511,7 +516,7 @@
     <string name="button_default">Default</string>
 
     <!-- Title of the setup wizard welcome screen. [CHAR LIMT=40] -->
-    <string name="setup_welcome_title">"Welcome to <xliff:g id="application_name">%s</xliff:g>"</string>
+    <string name="setup_welcome_title">"Welcome to <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string>
     <!-- Additional title of the setup wizard welcome screen, just below the setup_welcome_title. [CHAR_LIMIT=64] -->
     <string name="setup_welcome_additional_description">with Gesture Typing</string>
     <!-- The label of the button that starts the setup wizard. [CHAR_LIMIT=64] -->
@@ -519,23 +524,23 @@
     <!-- The label of the button that navigates the user to the next step of the setup wizard. [CHAR_LIMIT=64] -->
     <string name="setup_next_action">Next step</string>
     <!-- Title of the setup wizard. [CHAR LIMT=40] -->
-    <string name="setup_steps_title">"Setting up <xliff:g id="application_name">%s</xliff:g>"</string>
+    <string name="setup_steps_title">"Setting up <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string>
     <!-- Ordinal number of the 1st step in the setup wizard. [CHAR LIMIT=5] -->
     <string name="setup_step1_bullet" translatable="false">1</string>
     <!-- Title of the 1st step in the setup wizard. [CHAR LIMIT=64] -->
-    <string name="setup_step1_title">"Enable <xliff:g id="application_name">%s</xliff:g>"</string>
+    <string name="setup_step1_title">"Enable <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string>
     <!-- Detailed instruction of the 1st step in the setup wizard. [CHAR LIMIT=120] -->
-    <string name="setup_step1_instruction">"Please check \"<xliff:g id="application_name">%s</xliff:g>\" in your Language &amp; input settings. This will authorize it to run on your device."</string>
+    <string name="setup_step1_instruction">"Please check \"<xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>\" in your Language &amp; input settings. This will authorize it to run on your device."</string>
     <!-- Detailed instruction of the already finished 1st step in the setup wizard. [CHAR LIMIT=120] -->
-    <string name="setup_step1_finished_instruction">"<xliff:g id="application_name">%s</xliff:g> is already enabled in your Language &amp; input settings, so this step is done. On to the next one!"</string>
+    <string name="setup_step1_finished_instruction">"<xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g> is already enabled in your Language &amp; input settings, so this step is done. On to the next one!"</string>
     <!-- The label of the button that triggers the Language & input settings in order to enable the keyboard. [CHAR_LIMIT=64] -->
     <string name="setup_step1_action">Enable in Settings</string>
     <!-- Ordinal number of the 2nd step in the setup wizard. [CHAR LIMIT=5] -->
     <string name="setup_step2_bullet" translatable="false">2</string>
     <!-- Title of the 2nd step in the setup wizard. [CHAR LIMIT=64] -->
-    <string name="setup_step2_title">"Switch to <xliff:g id="application_name">%s</xliff:g>"</string>
+    <string name="setup_step2_title">"Switch to <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string>
     <!-- Detailed instruction of the 2nd step in the setup wizard. [CHAR LIMIT=120] -->
-    <string name="setup_step2_instruction">"Next, select \"<xliff:g id="application_name">%s</xliff:g>\" as your active text-input method."</string>
+    <string name="setup_step2_instruction">"Next, select \"<xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>\" as your active text-input method."</string>
     <!-- The label of the button that triggers the choose input method dialog in order to select the keyboard. [CHAR_LIMIT=64] -->
     <string name="setup_step2_action">Switch input methods</string>
     <!-- Ordinal number of the 3rd step in the setup wizard. [CHAR LIMIT=5] -->
@@ -543,7 +548,7 @@
     <!-- Title of the 3rd step in the setup wizard. [CHAR LIMIT=64] -->
     <string name="setup_step3_title">"Congratulations, you're all set!"</string>
     <!-- Detailed instruction of the 3rd step in the setup wizard. [CHAR LIMIT=120] -->
-    <string name="setup_step3_instruction">Now you can type in all your favorite apps with <xliff:g id="application_name">%s</xliff:g>.</string>
+    <string name="setup_step3_instruction">Now you can type in all your favorite apps with <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>.</string>
     <!-- The label of the button that triggers the screen for configuaring additional languages of the keyboard. [CHAR_LIMIT=64] -->
     <string name="setup_step3_action">Configure additional languages</string>
     <!-- The label of the button that finishes the setup wizard. [CHAR_LIMIT=64] -->
@@ -594,7 +599,7 @@
     <!-- Message to display in a dialog box while we are actively updating the word list [CHAR LIMIT=60] -->
     <string name="message_updating">Checking for updates</string>
     <!-- Message to display while the add-on dictionary list is updating [no space constraints on this, there is plenty of space but shorter is better because it's only on the screen for a second] -->
-    <string name="message_loading">Loading...</string>
+    <string name="message_loading">Loading&#x2026;</string>
 
     <!-- String to explain this dictionary is the main dictionary for this language [CHAR_LIMIT=30] -->
     <string name="main_dict_description">Main dictionary</string>
@@ -611,24 +616,24 @@
 
     <!-- Message in the popup informing the user a dictionary is available for their language, and asking for a decision to download over their mobile data plan or not. The reason we ask for this is, the data is large and may be downloaded over a paid-per-megabyte connection but a dictionary is also essential to type comfortably, so we ask the user. This only pops in selected cases, when there is no dictionary at all currently, and the only available network seems to be metered. The "Language & input" part should be set to the actual name of the option (message ID 5292716747264442359 in the translation console). [CHAR_LIMIT=700] -->
     <string name="should_download_over_metered_prompt">The selected language on your mobile device has an available dictionary.&lt;br/>
-We recommend &lt;b>downloading&lt;/b> the <xliff:g id="language" example="English">%1$s</xliff:g> dictionary to improve your typing experience.&lt;br/>
+We recommend &lt;b>downloading&lt;/b> the <xliff:g id="LANGUAGE_NAME" example="English">%1$s</xliff:g> dictionary to improve your typing experience.&lt;br/>
 &lt;br/>
 The download could take a minute or two over 3G. Charges may apply if you don\'t have an &lt;b>unlimited data plan&lt;/b>.&lt;br/>
 If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.&lt;br/>
 &lt;br/>
 Tip: You can download and remove dictionaries by going to &lt;b>Language &amp; input&lt;/b> in the &lt;b>Settings&lt;/b> menu of your mobile device.</string>
-    <string name="download_over_metered">Download now (<xliff:g id="size_in_megabytes" example="0.7">%1$.1f</xliff:g>MB)</string>
+    <string name="download_over_metered">Download now (<xliff:g id="SIZE_IN_MEGABYTES" example="0.7">%1$.1f</xliff:g>MB)</string>
     <string name="do_not_download_over_metered">Download over Wi-Fi</string>
     <!-- The text of the "dictionary available" notification. -->
-    <string name="dict_available_notification_title">A dictionary is available for <xliff:g id="language" example="English">%1$s</xliff:g></string>
+    <string name="dict_available_notification_title">A dictionary is available for <xliff:g id="LANGUAGE_NAME" example="English">%1$s</xliff:g></string>
     <!-- The small subtext in the "dictionary available" notification. -->
     <string name="dict_available_notification_description">Press to review and download</string>
 
     <!-- The text of the toast warning a download is starting automatically to enable suggestions for the selected language [CHAR LIMIT=100] -->
-    <string name="toast_downloading_suggestions">Downloading: suggestions for <xliff:g id="language" example="English">%1$s</xliff:g> will be ready soon.</string>
+    <string name="toast_downloading_suggestions">Downloading: suggestions for <xliff:g id="LANGUAGE_NAME" example="English">%1$s</xliff:g> will be ready soon.</string>
 
     <!-- Version text [CHAR LIMIT=30]-->
-    <string name="version_text">Version <xliff:g id="version_number" example="1.0.1864.643521">%1$s</xliff:g></string>
+    <string name="version_text">Version <xliff:g id="VERSION_NUMBER" example="1.0.1864.643521">%1$s</xliff:g></string>
 
     <!-- User dictionary settings -->
     <!-- User dictionary settings.  The summary of the listem item to go into the User dictionary settings screen. -->
diff --git a/java/res/values/themes-common.xml b/java/res/values/themes-common.xml
index 3bfd73a..fc96d19 100644
--- a/java/res/values/themes-common.xml
+++ b/java/res/values/themes-common.xml
@@ -77,8 +77,6 @@
         <item name="ignoreAltCodeKeyTimeout">@integer/config_ignore_alt_code_key_timeout</item>
         <item name="keyPreviewLayout">@layout/key_preview</item>
         <item name="keyPreviewHeight">@dimen/config_key_preview_height</item>
-        <item name="keyPreviewZoomInDuration">@integer/config_key_preview_zoom_in_duration</item>
-        <item name="keyPreviewZoomOutDuration">@integer/config_key_preview_zoom_out_duration</item>
         <item name="keyPreviewLingerTimeout">@integer/config_key_preview_linger_timeout</item>
         <item name="moreKeysKeyboardLayout">@layout/more_keys_keyboard</item>
         <item name="showMoreKeysKeyboardAtTouchedPoint">@bool/config_show_more_keys_keyboard_at_touched_point</item>
diff --git a/java/res/xml-sw600dp/key_azerty3_right.xml b/java/res/xml-sw600dp/key_azerty3_right.xml
index a5a6e95..25b0e52 100644
--- a/java/res/xml-sw600dp/key_azerty3_right.xml
+++ b/java/res/xml-sw600dp/key_azerty3_right.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel=":"
+        latin:keySpec=":"
         latin:keyHintLabel=";"
         latin:moreKeys=";"
         latin:keyStyle="hasShiftedLetterHintStyle" />
diff --git a/java/res/xml-sw600dp/key_colemak_colon.xml b/java/res/xml-sw600dp/key_colemak_colon.xml
index a5a6e95..25b0e52 100644
--- a/java/res/xml-sw600dp/key_colemak_colon.xml
+++ b/java/res/xml-sw600dp/key_colemak_colon.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel=":"
+        latin:keySpec=":"
         latin:keyHintLabel=";"
         latin:moreKeys=";"
         latin:keyStyle="hasShiftedLetterHintStyle" />
diff --git a/java/res/xml-sw600dp/key_f1.xml b/java/res/xml-sw600dp/key_f1.xml
index 530f7d6..ba78a64 100644
--- a/java/res/xml-sw600dp/key_f1.xml
+++ b/java/res/xml-sw600dp/key_f1.xml
@@ -26,11 +26,11 @@
             latin:mode="email"
         >
             <Key
-                latin:keyLabel="\@" />
+                latin:keySpec="\@" />
         </case>
         <default>
             <Key
-                latin:keyLabel="/" />
+                latin:keySpec="/" />
         </default>
     </switch>
 </merge>
diff --git a/java/res/xml-sw600dp/key_greek_semicolon.xml b/java/res/xml-sw600dp/key_greek_semicolon.xml
index 3f09419..9e2c1fa 100644
--- a/java/res/xml-sw600dp/key_greek_semicolon.xml
+++ b/java/res/xml-sw600dp/key_greek_semicolon.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel=";"
+        latin:keySpec=";"
         latin:keyHintLabel=":"
         latin:moreKeys=":"
         latin:keyStyle="hasShiftedLetterHintStyle" />
diff --git a/java/res/xml-sw600dp/key_question_exclamation.xml b/java/res/xml-sw600dp/key_question_exclamation.xml
index 860a0be..edee5c5 100644
--- a/java/res/xml-sw600dp/key_question_exclamation.xml
+++ b/java/res/xml-sw600dp/key_question_exclamation.xml
@@ -26,11 +26,11 @@
             latin:mode="email|url"
         >
             <Key
-                latin:keyLabel="-" />
+                latin:keySpec="-" />
         </case>
         <default>
             <Key
-                latin:keyLabel="\?"
+                latin:keySpec="\?"
                 latin:keyHintLabel="!"
                 latin:moreKeys="!"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index 4e4579b..6a79c6f 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -39,7 +39,6 @@
     <!-- Base style for shift key. A single space is used for dummy label in moreKeys. -->
     <key-style
         latin:styleName="baseForShiftKeyStyle"
-        latin:code="!code/key_shift"
         latin:keyActionFlags="noKeyPreview"
         latin:keyLabelFlags="preserveCase"
         latin:moreKeys="!noPanelAutoMoreKey!, |!code/key_capslock" />
@@ -49,7 +48,7 @@
         >
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key_shifted"
+                latin:keySpec="!icon/shift_key_shifted|!code/key_shift"
                 latin:backgroundType="stickyOff"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </case>
@@ -58,71 +57,56 @@
         >
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key_shifted"
+                latin:keySpec="!icon/shift_key_shifted|!code/key_shift"
                 latin:backgroundType="stickyOn"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </case>
         <default>
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key"
+                latin:keySpec="!icon/shift_key|!code/key_shift"
                 latin:backgroundType="stickyOff"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </default>
     </switch>
     <key-style
         latin:styleName="deleteKeyStyle"
-        latin:code="!code/key_delete"
-        latin:keyIcon="!icon/delete_key"
+        latin:keySpec="!icon/delete_key|!code/key_delete"
         latin:keyActionFlags="isRepeatable|noKeyPreview"
         latin:backgroundType="functional" />
     <include
         latin:keyboardLayout="@xml/key_styles_enter" />
-    <!-- Override defaultEnterKeyStyle in key_styles_enter.xml -->
-    <key-style
-        latin:styleName="defaultEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/enter_key"
-        latin:keyLabelFlags="preserveCase|autoXScale|followKeyLargeLabelRatio"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional"
-        latin:parentStyle="navigateMoreKeysStyle" />
     <key-style
         latin:styleName="spaceKeyStyle"
-        latin:code="!code/key_space"
+        latin:keySpec=" |!code/key_space"
         latin:keyActionFlags="noKeyPreview|enableLongPress" />
     <!-- U+200C: ZERO WIDTH NON-JOINER
          U+200D: ZERO WIDTH JOINER -->
     <key-style
         latin:styleName="zwnjKeyStyle"
-        latin:code="0x200C"
-        latin:keyIcon="!icon/zwnj_key"
+        latin:keySpec="!icon/zwnj_key|&#x200C;"
         latin:moreKeys="!icon/zwj_key|&#x200D;"
         latin:keyLabelFlags="hasPopupHint"
         latin:keyActionFlags="noKeyPreview" />
     <key-style
         latin:styleName="shortcutKeyStyle"
-        latin:code="!code/key_shortcut"
-        latin:keyIcon="!icon/shortcut_key"
+        latin:keySpec="!icon/shortcut_key|!code/key_shortcut"
         latin:keyIconDisabled="!icon/shortcut_key_disabled"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="languageSwitchKeyStyle"
-        latin:code="!code/key_language_switch"
-        latin:keyIcon="!icon/language_switch_key"
+        latin:keySpec="!icon/language_switch_key|!code/key_language_switch"
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping|enableLongPress"
         latin:altCode="!code/key_space" />
     <key-style
         latin:styleName="emojiKeyStyle"
-        latin:code="!code/key_emoji"
-        latin:keyIcon="!icon/emoji_key"
+        latin:keySpec="!icon/emoji_key|!code/key_emoji"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="settingsKeyStyle"
-        latin:code="!code/key_settings"
-        latin:keyIcon="!icon/settings_key"
+        latin:keySpec="!icon/settings_key|!code/key_settings"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <switch>
@@ -132,8 +116,7 @@
         >
             <key-style
                 latin:styleName="tabKeyStyle"
-                latin:code="!code/key_action_previous"
-                latin:keyIcon="!icon/tab_key"
+                latin:keySpec="!icon/tab_key|!code/key_action_previous"
                 latin:keyIconPreview="!icon/tab_key_preview"
                 latin:backgroundType="functional" />
         </case>
@@ -143,16 +126,14 @@
         >
             <key-style
                 latin:styleName="tabKeyStyle"
-                latin:code="!code/key_action_next"
-                latin:keyIcon="!icon/tab_key"
+                latin:keySpec="!icon/tab_key|!code/key_action_next"
                 latin:keyIconPreview="!icon/tab_key_preview"
                 latin:backgroundType="functional" />
         </case>
         <default>
             <key-style
                 latin:styleName="tabKeyStyle"
-                latin:code="!code/key_tab"
-                latin:keyIcon="!icon/tab_key"
+                latin:keySpec="!icon/tab_key|!code/key_tab"
                 latin:keyIconPreview="!icon/tab_key_preview"
                 latin:backgroundType="functional" />
         </default>
@@ -164,27 +145,23 @@
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="toSymbolKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_symbol_key"
+        latin:keySpec="!text/label_to_symbol_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toAlphaKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_alpha_key"
+        latin:keySpec="!text/label_to_alpha_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_more_symbol_for_tablet_key"
+        latin:keySpec="!text/label_to_more_symbol_for_tablet_key|!code/key_shift"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="backFromMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_symbol_key"
+        latin:keySpec="!text/label_to_symbol_key|!code/key_shift"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="comKeyStyle"
-        latin:keyLabel="!text/keylabel_for_popular_domain|!text/keylabel_for_popular_domain"
+        latin:keySpec="!text/keylabel_for_popular_domain|!text/keylabel_for_popular_domain"
         latin:keyLabelFlags="autoXScale|fontNormal|hasPopupHint|preserveCase"
         latin:moreKeys="!text/more_keys_for_popular_domain" />
 </merge>
diff --git a/java/res/xml-sw600dp/key_styles_enter.xml b/java/res/xml-sw600dp/key_styles_enter.xml
index 1d8ccfa..38a38fd 100644
--- a/java/res/xml-sw600dp/key_styles_enter.xml
+++ b/java/res/xml-sw600dp/key_styles_enter.xml
@@ -99,22 +99,11 @@
     <!-- Enter key style -->
     <key-style
         latin:styleName="defaultEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/enter_key"
+        latin:keySpec="!icon/enter_key|!code/key_enter"
         latin:keyLabelFlags="preserveCase|autoXScale|followKeyLabelRatio"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional"
         latin:parentStyle="navigateMoreKeysStyle" />
-    <key-style
-        latin:styleName="shiftEnterKeyStyle"
-        latin:code="!code/key_shift_enter"
-        latin:parentStyle="defaultEnterKeyStyle" />
-    <key-style
-        latin:styleName="defaultActionEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/undefined"
-        latin:backgroundType="action"
-        latin:parentStyle="defaultEnterKeyStyle" />
     <switch>
         <!-- Shift + Enter in textMultiLine field. -->
         <case
@@ -123,63 +112,72 @@
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:parentStyle="shiftEnterKeyStyle" />
+                latin:keySpec="!text/label_go_key|!code/key_shift_enter"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionGo"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_go_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_go_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionNext"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_next_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_next_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionPrevious"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_previous_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_previous_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionDone"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_done_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_done_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSend"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_send_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_send_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSearch"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyIcon="!icon/search_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!icon/search_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionCustomLabel"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
+                latin:keySpec="dummy_label|!code/key_enter"
                 latin:keyLabelFlags="fromCustomActionLabel"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <!-- imeAction is either actionNone or actionUnspecified. -->
         <default>
diff --git a/java/res/xml-sw600dp/keys_arabic3_left.xml b/java/res/xml-sw600dp/keys_arabic3_left.xml
index 0f2ccc0..9b4031e 100644
--- a/java/res/xml-sw600dp/keys_arabic3_left.xml
+++ b/java/res/xml-sw600dp/keys_arabic3_left.xml
@@ -23,10 +23,10 @@
 >
     <!-- U+0630: "ذ" ARABIC LETTER THAL -->
     <Key
-        latin:keyLabel="&#x0630;"
+        latin:keySpec="&#x0630;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE -->
     <Key
-        latin:keyLabel="&#x0626;"
+        latin:keySpec="&#x0626;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-sw600dp/keys_comma_period.xml b/java/res/xml-sw600dp/keys_comma_period.xml
index 55302ae..eda96b2 100644
--- a/java/res/xml-sw600dp/keys_comma_period.xml
+++ b/java/res/xml-sw600dp/keys_comma_period.xml
@@ -22,14 +22,14 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="!text/keylabel_for_tablet_comma"
+        latin:keySpec="!text/keylabel_for_tablet_comma"
         latin:keyHintLabel="!text/keyhintlabel_for_tablet_comma"
         latin:keyLabelFlags="hasPopupHint"
         latin:moreKeys="!text/more_keys_for_tablet_comma"
         latin:backgroundType="functional"
         latin:keyStyle="hasShiftedLetterHintStyle" />
     <Key
-        latin:keyLabel="!text/keylabel_for_tablet_period"
+        latin:keySpec="!text/keylabel_for_tablet_period"
         latin:keyHintLabel="!text/keyhintlabel_for_tablet_period"
         latin:keyLabelFlags="hasPopupHint"
         latin:moreKeys="!text/more_keys_for_tablet_period"
diff --git a/java/res/xml-sw600dp/keys_dvorak_123.xml b/java/res/xml-sw600dp/keys_dvorak_123.xml
index 58416ab..91ceb1c 100644
--- a/java/res/xml-sw600dp/keys_dvorak_123.xml
+++ b/java/res/xml-sw600dp/keys_dvorak_123.xml
@@ -26,31 +26,31 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel="&quot;"
+                latin:keySpec="&quot;"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1" />
             <Key
-                latin:keyLabel="&lt;"
+                latin:keySpec="&lt;"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2" />
             <Key
-                latin:keyLabel="&gt;"
+                latin:keySpec="&gt;"
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3" />
         </case>
         <default>
             <Key
-                latin:keyLabel="\'"
+                latin:keySpec="\'"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1"
                 latin:moreKeys="!,&quot;" />
             <Key
-                latin:keyLabel=","
+                latin:keySpec=","
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2"
                 latin:moreKeys="\?,&lt;" />
             <Key
-                latin:keyLabel="."
+                latin:keySpec="."
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3"
                 latin:moreKeys="&gt;" />
diff --git a/java/res/xml-sw600dp/keys_exclamation_question.xml b/java/res/xml-sw600dp/keys_exclamation_question.xml
index fd84922..116bef2 100644
--- a/java/res/xml-sw600dp/keys_exclamation_question.xml
+++ b/java/res/xml-sw600dp/keys_exclamation_question.xml
@@ -22,9 +22,9 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="!"
+        latin:keySpec="!"
         latin:moreKeys="!text/more_keys_for_exclamation" />
     <Key
-        latin:keyLabel="\?"
+        latin:keySpec="\?"
         latin:moreKeys="!text/more_keys_for_question" />
 </merge>
diff --git a/java/res/xml-sw600dp/keys_farsi3_right.xml b/java/res/xml-sw600dp/keys_farsi3_right.xml
index 3c91ae9..45d1286 100644
--- a/java/res/xml-sw600dp/keys_farsi3_right.xml
+++ b/java/res/xml-sw600dp/keys_farsi3_right.xml
@@ -23,10 +23,10 @@
 >
     <!-- U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE -->
     <Key
-        latin:keyLabel="&#x0622;"
+        latin:keySpec="&#x0622;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0686: "چ" ARABIC LETTER TCHEH -->
     <Key
-        latin:keyLabel="&#x0686;"
+        latin:keySpec="&#x0686;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml b/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml
index 324e025..ab99ec5 100644
--- a/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml
+++ b/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml
@@ -26,17 +26,17 @@
             latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
         >
             <Key
-                latin:keyLabel="["
+                latin:keySpec="["
                 latin:keyHintLabel="{"
                 latin:additionalMoreKeys="{"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
             <Key
-                latin:keyLabel="]"
+                latin:keySpec="]"
                 latin:keyHintLabel="}"
                 latin:additionalMoreKeys="}"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
             <Key
-                latin:keyLabel="\\"
+                latin:keySpec="\\"
                 latin:keyHintLabel="|"
                 latin:additionalMoreKeys="\\|"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
@@ -44,11 +44,11 @@
         <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" -->
         <default>
             <Key
-                latin:keyLabel="{" />
+                latin:keySpec="{" />
             <Key
-                latin:keyLabel="}" />
+                latin:keySpec="}" />
             <Key
-                latin:keyLabel="|" />
+                latin:keySpec="|" />
         </default>
     </switch>
 </merge>
\ No newline at end of file
diff --git a/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml b/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
index 254b5e5..5443396 100644
--- a/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
+++ b/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
@@ -26,12 +26,12 @@
             latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
         >
             <Key
-                latin:keyLabel=";"
+                latin:keySpec=";"
                 latin:keyHintLabel=":"
                 latin:additionalMoreKeys=":"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
             <Key
-                latin:keyLabel="\'"
+                latin:keySpec="\'"
                 latin:keyHintLabel="&quot;"
                 latin:additionalMoreKeys="&quot;"
                 latin:keyStyle="hasShiftedLetterHintStyle"
@@ -40,9 +40,9 @@
         <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" -->
         <default>
             <Key
-                latin:keyLabel=":" />
+                latin:keySpec=":" />
             <Key
-                latin:keyLabel="&quot;"
+                latin:keySpec="&quot;"
                 latin:moreKeys="!fixedColumnOrder!3,!text/double_quotes,!text/single_quotes" />
         </default>
     </switch>
diff --git a/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml b/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml
index 46a1c85..c95ca2e 100644
--- a/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml
+++ b/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml
@@ -26,17 +26,17 @@
             latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
         >
             <Key
-                latin:keyLabel=","
+                latin:keySpec=","
                 latin:keyHintLabel="&lt;"
                 latin:additionalMoreKeys="&lt;"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
             <Key
-                latin:keyLabel="."
+                latin:keySpec="."
                 latin:keyHintLabel="&gt;"
                 latin:additionalMoreKeys="&gt;"
                 latin:keyStyle="hasShiftedLetterHintStyle" />
             <Key
-                latin:keyLabel="/"
+                latin:keySpec="/"
                 latin:keyHintLabel="\?"
                 latin:additionalMoreKeys="\?"
                 latin:keyStyle="hasShiftedLetterHintStyle"
@@ -51,13 +51,13 @@
                  U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
                  U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&lt;"
+                latin:keySpec="&lt;"
                 latin:moreKeys="!fixedColumnOrder!3,&#x2039;,&#x2264;,&#x00AB;" />
             <Key
-                latin:keyLabel="&gt;"
+                latin:keySpec="&gt;"
                 latin:moreKeys="!fixedColumnOrder!3,&#x203A;,&#x2265;,&#x00BB;" />
             <Key
-                latin:keyLabel="\?"
+                latin:keySpec="\?"
                 latin:moreKeys="!text/more_keys_for_question" />
         </default>
     </switch>
diff --git a/java/res/xml-sw600dp/row_dvorak4.xml b/java/res/xml-sw600dp/row_dvorak4.xml
index 11b4034..2ba6a49 100644
--- a/java/res/xml-sw600dp/row_dvorak4.xml
+++ b/java/res/xml-sw600dp/row_dvorak4.xml
@@ -39,7 +39,7 @@
         <include
             latin:keyboardLayout="@xml/key_question_exclamation" />
         <Key
-            latin:keyLabel="-"
+            latin:keySpec="-"
             latin:keyHintLabel="_"
             latin:moreKeys="_"
             latin:keyStyle="hasShiftedLetterHintStyle" />
diff --git a/java/res/xml-sw600dp/rowkeys_dvorak3.xml b/java/res/xml-sw600dp/rowkeys_dvorak3.xml
index 2148bb2..edc68a3 100644
--- a/java/res/xml-sw600dp/rowkeys_dvorak3.xml
+++ b/java/res/xml-sw600dp/rowkeys_dvorak3.xml
@@ -22,26 +22,26 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="q" />
+        latin:keySpec="q" />
     <Key
-        latin:keyLabel="j"
+        latin:keySpec="j"
         latin:moreKeys="!text/more_keys_for_j" />
     <Key
-        latin:keyLabel="k"
+        latin:keySpec="k"
         latin:moreKeys="!text/more_keys_for_k" />
     <Key
-        latin:keyLabel="x" />
+        latin:keySpec="x" />
     <Key
-        latin:keyLabel="b" />
+        latin:keySpec="b" />
     <Key
-        latin:keyLabel="m" />
+        latin:keySpec="m" />
     <Key
-        latin:keyLabel="w"
+        latin:keySpec="w"
         latin:moreKeys="!text/more_keys_for_w" />
     <Key
-        latin:keyLabel="v"
+        latin:keySpec="v"
         latin:moreKeys="!text/more_keys_for_v" />
     <Key
-        latin:keyLabel="z"
+        latin:keySpec="z"
         latin:moreKeys="!text/more_keys_for_z" />
 </merge>
diff --git a/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml b/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml
index ae6bab7..5389e22 100644
--- a/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml
+++ b/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml
@@ -22,66 +22,66 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="`"
+        latin:keySpec="`"
         latin:keyHintLabel="~"
         latin:additionalMoreKeys="~"
         latin:keyStyle="hasShiftedLetterHintStyle" />
     <Key
-        latin:keyLabel="1"
+        latin:keySpec="1"
         latin:keyHintLabel="!"
         latin:additionalMoreKeys="!"
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_exclamation,!text/more_keys_for_symbols_1" />
     <Key
-        latin:keyLabel="2"
+        latin:keySpec="2"
         latin:keyHintLabel="\@"
         latin:additionalMoreKeys="\@"
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_symbols_2" />
     <Key
-        latin:keyLabel="3"
+        latin:keySpec="3"
         latin:keyHintLabel="\#"
         latin:additionalMoreKeys="\#"
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_symbols_3" />
     <Key
-        latin:keyLabel="4"
+        latin:keySpec="4"
         latin:keyHintLabel="$"
         latin:additionalMoreKeys="$"
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_symbols_4" />
     <Key
-        latin:keyLabel="5"
+        latin:keySpec="5"
         latin:keyHintLabel="%"
         latin:additionalMoreKeys="\\%"
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_symbols_5" />
     <Key
-        latin:keyLabel="6"
+        latin:keySpec="6"
         latin:keyHintLabel="^"
         latin:additionalMoreKeys="^"
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_symbols_6" />
     <Key
-        latin:keyLabel="7"
+        latin:keySpec="7"
         latin:keyHintLabel="&amp;"
         latin:additionalMoreKeys="&amp;"
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_symbols_7" />
     <Key
-        latin:keyLabel="8"
+        latin:keySpec="8"
         latin:keyHintLabel="*"
         latin:additionalMoreKeys="*"
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_symbols_8" />
     <Key
-        latin:keyLabel="9"
+        latin:keySpec="9"
         latin:keyHintLabel="("
         latin:additionalMoreKeys="("
         latin:keyStyle="hasShiftedLetterHintStyle"
         latin:moreKeys="!text/more_keys_for_symbols_9" />
     <Key
-        latin:keyLabel="0"
+        latin:keySpec="0"
         latin:keyHintLabel=")"
         latin:additionalMoreKeys=")"
         latin:keyStyle="hasShiftedLetterHintStyle"
@@ -90,7 +90,7 @@
          U+2014: "—" EM DASH
          U+00B7: "·" MIDDLE DOT -->
     <Key
-        latin:keyLabel="-"
+        latin:keySpec="-"
         latin:keyHintLabel="_"
         latin:additionalMoreKeys="_"
         latin:keyStyle="hasShiftedLetterHintStyle"
@@ -99,7 +99,7 @@
          U+2260: "≠" NOT EQUAL TO
          U+2248: "≈" ALMOST EQUAL TO -->
     <Key
-        latin:keyLabel="="
+        latin:keySpec="="
         latin:keyHintLabel="+"
         latin:additionalMoreKeys="+"
         latin:keyStyle="hasShiftedLetterHintStyle"
diff --git a/java/res/xml-sw600dp/rows_number_normal.xml b/java/res/xml-sw600dp/rows_number_normal.xml
index 37bf2e8..15f4cde 100644
--- a/java/res/xml-sw600dp/rows_number_normal.xml
+++ b/java/res/xml-sw600dp/rows_number_normal.xml
@@ -23,29 +23,29 @@
 >
     <Row>
         <Key
-            latin:keyLabel="-"
+            latin:keySpec="-"
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel="+"
+            latin:keySpec="+"
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel="."
+            latin:keySpec="."
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel="1"
+            latin:keySpec="1"
             latin:keyStyle="numKeyStyle"
             latin:keyXPos="31%p" />
         <Key
-            latin:keyLabel="2"
+            latin:keySpec="2"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="3"
+            latin:keySpec="3"
             latin:keyStyle="numKeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
@@ -58,7 +58,7 @@
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel="/"
+            latin:keySpec="/"
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
@@ -67,7 +67,7 @@
                 latin:mode="time|datetime"
             >
                 <Key
-                    latin:keyLabel=","
+                    latin:keySpec=","
                     latin:keyLabelFlags="hasPopupHint"
                     latin:moreKeys="!text/more_keys_for_am_pm"
                     latin:keyStyle="numKeyStyle"
@@ -76,21 +76,21 @@
             </case>
             <default>
                 <Key
-                    latin:keyLabel=","
+                    latin:keySpec=","
                     latin:keyStyle="numKeyStyle"
                     latin:keyWidth="10%p"
                     latin:backgroundType="functional" />
             </default>
         </switch>
         <Key
-            latin:keyLabel="4"
+            latin:keySpec="4"
             latin:keyStyle="numKeyStyle"
             latin:keyXPos="31%p" />
         <Key
-            latin:keyLabel="5"
+            latin:keySpec="5"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="6"
+            latin:keySpec="6"
             latin:keyStyle="numKeyStyle" />
         <Key
             latin:keyStyle="enterKeyStyle"
@@ -99,12 +99,12 @@
     </Row>
     <Row>
         <Key
-            latin:keyLabel="("
+            latin:keySpec="("
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel=")"
+            latin:keySpec=")"
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
@@ -113,28 +113,28 @@
                 latin:mode="time|datetime"
             >
                 <Key
-                    latin:keyLabel=":"
+                    latin:keySpec=":"
                     latin:keyStyle="numKeyStyle"
                     latin:keyWidth="10%p"
                     latin:backgroundType="functional" />
             </case>
             <default>
                 <Key
-                    latin:keyLabel="="
+                    latin:keySpec="="
                     latin:keyStyle="numKeyStyle"
                     latin:keyWidth="10%p"
                     latin:backgroundType="functional" />
             </default>
         </switch>
         <Key
-            latin:keyLabel="7"
+            latin:keySpec="7"
             latin:keyStyle="numKeyStyle"
             latin:keyXPos="31%p" />
         <Key
-            latin:keyLabel="8"
+            latin:keySpec="8"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="9"
+            latin:keySpec="9"
             latin:keyStyle="numKeyStyle" />
         <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
         <Spacer />
@@ -148,10 +148,10 @@
             latin:keyStyle="numStarKeyStyle"
             latin:keyXPos="31%p" />
         <Key
-            latin:keyLabel="0"
+            latin:keySpec="0"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="\#"
+            latin:keySpec="\#"
             latin:keyStyle="numKeyStyle" />
         <!-- Note: This Spacer prevents the above key from being marked as a right edge key. -->
         <Spacer
diff --git a/java/res/xml-sw600dp/rows_phone.xml b/java/res/xml-sw600dp/rows_phone.xml
index c4799bb..9022bc5 100644
--- a/java/res/xml-sw600dp/rows_phone.xml
+++ b/java/res/xml-sw600dp/rows_phone.xml
@@ -27,12 +27,12 @@
         latin:keyboardLayout="@xml/key_styles_number" />
     <Row>
         <Key
-            latin:keyLabel="-"
+            latin:keySpec="-"
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel="+"
+            latin:keySpec="+"
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
@@ -54,12 +54,12 @@
     </Row>
     <Row>
         <Key
-            latin:keyLabel=","
+            latin:keySpec=","
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel="."
+            latin:keySpec="."
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
@@ -81,17 +81,17 @@
     </Row>
     <Row>
         <Key
-            latin:keyLabel="("
+            latin:keySpec="("
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel=")"
+            latin:keySpec=")"
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
         <Key
-            latin:keyLabel="N"
+            latin:keySpec="N"
             latin:keyStyle="numKeyStyle"
             latin:keyWidth="10%p"
             latin:backgroundType="functional" />
@@ -116,7 +116,7 @@
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
-            latin:keyLabel="\#"
+            latin:keySpec="\#"
             latin:keyStyle="numKeyStyle" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw600dp/rows_symbols.xml b/java/res/xml-sw600dp/rows_symbols.xml
index 7a33f49..a915c33 100644
--- a/java/res/xml-sw600dp/rows_symbols.xml
+++ b/java/res/xml-sw600dp/rows_symbols.xml
@@ -51,9 +51,9 @@
             latin:keyStyle="toMoreSymbolKeyStyle"
             latin:keyWidth="10.0%p" />
         <Key
-            latin:keyLabel="\\" />
+            latin:keySpec="\\" />
         <Key
-            latin:keyLabel="=" />
+            latin:keySpec="=" />
         <include
             latin:keyboardLayout="@xml/rowkeys_symbols3" />
         <Key
diff --git a/java/res/xml-sw600dp/rows_symbols_shift.xml b/java/res/xml-sw600dp/rows_symbols_shift.xml
index 79d1aa1..7ead4d5 100644
--- a/java/res/xml-sw600dp/rows_symbols_shift.xml
+++ b/java/res/xml-sw600dp/rows_symbols_shift.xml
@@ -54,10 +54,10 @@
             latin:keyboardLayout="@xml/rowkeys_symbols_shift3" />
         <!-- U+00A1: "¡" INVERTED EXCLAMATION MARK -->
         <Key
-            latin:keyLabel="&#x00A1;" />
+            latin:keySpec="&#x00A1;" />
         <!-- U+00BF: "¿" INVERTED QUESTION MARK -->
         <Key
-            latin:keyLabel="&#x00BF;" />
+            latin:keySpec="&#x00BF;" />
         <Key
             latin:keyStyle="backFromMoreSymbolKeyStyle"
             latin:keyWidth="fillRight" />
diff --git a/java/res/xml-v16/key_devanagari_sign_anusvara.xml b/java/res/xml-v16/key_devanagari_sign_anusvara.xml
index 27c7bff..ee0f21d 100644
--- a/java/res/xml-v16/key_devanagari_sign_anusvara.xml
+++ b/java/res/xml-v16/key_devanagari_sign_anusvara.xml
@@ -27,6 +27,6 @@
 >
     <!-- U+0902: "ं" DEVANAGARI SIGN ANUSVARA -->
     <Key
-        latin:keyLabel="&#x0902;"
+        latin:keySpec="&#x0902;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/key_devanagari_sign_candrabindu.xml b/java/res/xml-v16/key_devanagari_sign_candrabindu.xml
index 03017dd..29f41d1 100644
--- a/java/res/xml-v16/key_devanagari_sign_candrabindu.xml
+++ b/java/res/xml-v16/key_devanagari_sign_candrabindu.xml
@@ -43,6 +43,6 @@
     <!-- U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU -->
     <Key
         latin:keyStyle="moreKeysDevanagariSignCandrabindu"
-        latin:keyLabel="&#x0901;"
+        latin:keySpec="&#x0901;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/key_devanagari_sign_nukta.xml b/java/res/xml-v16/key_devanagari_sign_nukta.xml
index 09c3477..9157795 100644
--- a/java/res/xml-v16/key_devanagari_sign_nukta.xml
+++ b/java/res/xml-v16/key_devanagari_sign_nukta.xml
@@ -44,6 +44,6 @@
     <!-- U+093C: "़" DEVANAGARI SIGN NUKTA -->
     <Key
         latin:keyStyle="moreKeysDevanagariSignNukta"
-        latin:keyLabel="&#x093C;"
+        latin:keySpec="&#x093C;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/key_devanagari_vowel_sign_candra_o.xml b/java/res/xml-v16/key_devanagari_vowel_sign_candra_o.xml
index 0316a7b..2f17399 100644
--- a/java/res/xml-v16/key_devanagari_vowel_sign_candra_o.xml
+++ b/java/res/xml-v16/key_devanagari_vowel_sign_candra_o.xml
@@ -27,6 +27,6 @@
 >
     <!-- U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O -->
     <Key
-        latin:keyLabel="&#x0949;"
+        latin:keySpec="&#x0949;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/key_devanagari_vowel_sign_vocalic_r.xml b/java/res/xml-v16/key_devanagari_vowel_sign_vocalic_r.xml
index 4dd3e85..dc7a0e0 100644
--- a/java/res/xml-v16/key_devanagari_vowel_sign_vocalic_r.xml
+++ b/java/res/xml-v16/key_devanagari_vowel_sign_vocalic_r.xml
@@ -50,6 +50,6 @@
     <!-- U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R -->
     <Key
         latin:keyStyle="moreKeysDevanagariVowelSignVocalicR"
-        latin:keyLabel="&#x0943;"
+        latin:keySpec="&#x0943;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_sign_virama.xml b/java/res/xml-v16/keystyle_devanagari_sign_virama.xml
index a2fbf53..764fb1f 100644
--- a/java/res/xml-v16/keystyle_devanagari_sign_virama.xml
+++ b/java/res/xml-v16/keystyle_devanagari_sign_virama.xml
@@ -28,6 +28,6 @@
     <!-- U+094D: "्" DEVANAGARI SIGN VIRAMA -->
     <key-style
         latin:styleName="baseKeyDevanagariSignVirama"
-        latin:keyLabel="&#x094D;"
+        latin:keySpec="&#x094D;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_sign_visarga.xml b/java/res/xml-v16/keystyle_devanagari_sign_visarga.xml
index ac56cb7..b047893 100644
--- a/java/res/xml-v16/keystyle_devanagari_sign_visarga.xml
+++ b/java/res/xml-v16/keystyle_devanagari_sign_visarga.xml
@@ -28,6 +28,6 @@
     <!-- U+0903: "ः" DEVANAGARI SIGN VISARGA -->
     <key-style
         latin:styleName="baseKeyDevanagariSignVisarga"
-        latin:keyLabel="&#x0903;"
+        latin:keySpec="&#x0903;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_aa.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_aa.xml
index 8e25603..fe9264b 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_aa.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_aa.xml
@@ -44,6 +44,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAa"
         latin:parentStyle="moreKeysDevanagariVowelSignAa"
-        latin:keyLabel="&#x093E;"
+        latin:keySpec="&#x093E;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_ai.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_ai.xml
index e790339..fdb53bb 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_ai.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_ai.xml
@@ -51,6 +51,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAi"
         latin:parentStyle="moreKeysDevanagariVowelSignAi"
-        latin:keyLabel="&#x0948;"
+        latin:keySpec="&#x0948;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_au.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_au.xml
index 43387a3..653e79e 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_au.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_au.xml
@@ -43,6 +43,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAu"
         latin:parentStyle="moreKeysDevanagariVowelSignAu"
-        latin:keyLabel="&#x094C;"
+        latin:keySpec="&#x094C;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_e.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_e.xml
index c70d9d9..7240a2c 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_e.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_e.xml
@@ -52,6 +52,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignE"
         latin:parentStyle="moreKeysDevanagariVowelSignE"
-        latin:keyLabel="&#x0947;"
+        latin:keySpec="&#x0947;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_i.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_i.xml
index 845c1b0..5a006f0 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_i.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_i.xml
@@ -43,6 +43,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignI"
         latin:parentStyle="moreKeysDevanagariVowelSignI"
-        latin:keyLabel="&#x093F;"
+        latin:keySpec="&#x093F;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_ii.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_ii.xml
index 0de9650..a2b07fe 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_ii.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_ii.xml
@@ -43,6 +43,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignIi"
         latin:parentStyle="moreKeysDevanagariVowelSignIi"
-        latin:keyLabel="&#x0940;"
+        latin:keySpec="&#x0940;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_o.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_o.xml
index 06f07fa..4b764cd 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_o.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_o.xml
@@ -45,6 +45,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignO"
         latin:parentStyle="moreKeysDevanagariVowelSignO"
-        latin:keyLabel="&#x094B;"
+        latin:keySpec="&#x094B;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_u.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_u.xml
index 469a27b..18d485a 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_u.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_u.xml
@@ -44,6 +44,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignU"
         latin:parentStyle="moreKeysDevanagariVowelSignU"
-        latin:keyLabel="&#x0941;"
+        latin:keySpec="&#x0941;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_uu.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_uu.xml
index 25867c0..d770ee6 100644
--- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_uu.xml
+++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_uu.xml
@@ -44,6 +44,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignUu"
         latin:parentStyle="moreKeysDevanagariVowelSignUu"
-        latin:keyLabel="&#x0942;"
+        latin:keySpec="&#x0942;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/key_armenian_sha.xml b/java/res/xml/key_armenian_sha.xml
index 3865c19..b6418f2 100644
--- a/java/res/xml/key_armenian_sha.xml
+++ b/java/res/xml/key_armenian_sha.xml
@@ -23,6 +23,6 @@
 >
     <!-- U+0577: "շ" ARMENIAN SMALL LETTER SHA -->
     <Key
-        latin:keyLabel="&#x0577;"
+        latin:keySpec="&#x0577;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/key_armenian_xeh.xml b/java/res/xml/key_armenian_xeh.xml
index 007a580..cfc5bc0 100644
--- a/java/res/xml/key_armenian_xeh.xml
+++ b/java/res/xml/key_armenian_xeh.xml
@@ -23,6 +23,6 @@
 >
     <!-- U+056D: "խ" ARMENIAN SMALL LETTER XEH -->
     <Key
-        latin:keyLabel="&#x056D;"
+        latin:keySpec="&#x056D;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/key_azerty3_right.xml b/java/res/xml/key_azerty3_right.xml
index 65789ea..85a0666 100644
--- a/java/res/xml/key_azerty3_right.xml
+++ b/java/res/xml/key_azerty3_right.xml
@@ -26,11 +26,11 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel="\?" />
+                latin:keySpec="\?" />
         </case>
         <default>
             <Key
-                latin:keyLabel="\'"
+                latin:keySpec="\'"
                 latin:moreKeys="!text/more_keys_for_single_quote" />
         </default>
     </switch>
diff --git a/java/res/xml/key_colemak_colon.xml b/java/res/xml/key_colemak_colon.xml
index 307b4eb..9330be9 100644
--- a/java/res/xml/key_colemak_colon.xml
+++ b/java/res/xml/key_colemak_colon.xml
@@ -26,13 +26,13 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel=";"
+                latin:keySpec=";"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="0" />
         </case>
         <default>
             <Key
-                latin:keyLabel=":"
+                latin:keySpec=":"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="0"
                 latin:moreKeys=";" />
diff --git a/java/res/xml/key_devanagari_sign_anusvara.xml b/java/res/xml/key_devanagari_sign_anusvara.xml
index 0acd3bc..5d7c018 100644
--- a/java/res/xml/key_devanagari_sign_anusvara.xml
+++ b/java/res/xml/key_devanagari_sign_anusvara.xml
@@ -28,7 +28,6 @@
     <!-- U+25CC: "◌" DOTTED CIRCLE
          U+0902: "ं" DEVANAGARI SIGN ANUSVARA -->
     <Key
-        latin:keyLabel="&#x25CC;&#x0902;"
-        latin:code="0x0902"
+        latin:keySpec="&#x25CC;&#x0902;|&#x0902;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_devanagari_sign_candrabindu.xml b/java/res/xml/key_devanagari_sign_candrabindu.xml
index df0c4e0..9e9c371 100644
--- a/java/res/xml/key_devanagari_sign_candrabindu.xml
+++ b/java/res/xml/key_devanagari_sign_candrabindu.xml
@@ -44,7 +44,6 @@
          U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU -->
     <Key
         latin:keyStyle="moreKeysDevanagariSignCandrabindu"
-        latin:keyLabel="&#x25CC;&#x0901;"
-        latin:code="0x0901"
+        latin:keySpec="&#x25CC;&#x0901;|&#x0901;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_devanagari_sign_nukta.xml b/java/res/xml/key_devanagari_sign_nukta.xml
index f7a03ee..b56eb0a 100644
--- a/java/res/xml/key_devanagari_sign_nukta.xml
+++ b/java/res/xml/key_devanagari_sign_nukta.xml
@@ -46,7 +46,6 @@
          U+093C: "़" DEVANAGARI SIGN NUKTA -->
     <Key
         latin:keyStyle="moreKeysDevanagariSignNukta"
-        latin:keyLabel="&#x25CC;&#x093C;"
-        latin:code="0x093C"
+        latin:keySpec="&#x25CC;&#x093C;|&#x093C;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_devanagari_vowel_sign_candra_o.xml b/java/res/xml/key_devanagari_vowel_sign_candra_o.xml
index 370fc54..6d7d000 100644
--- a/java/res/xml/key_devanagari_vowel_sign_candra_o.xml
+++ b/java/res/xml/key_devanagari_vowel_sign_candra_o.xml
@@ -28,7 +28,6 @@
     <!-- U+25CC: "◌" DOTTED CIRCLE
          U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O -->
     <Key
-        latin:keyLabel="&#x25CC;&#x0949;"
-        latin:code="0x0949"
+        latin:keySpec="&#x25CC;&#x0949;|&#x0949;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml b/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml
index f150d7e..badea3e 100644
--- a/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml
+++ b/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml
@@ -52,7 +52,6 @@
          U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R -->
     <Key
         latin:keyStyle="moreKeysDevanagariVowelSignVocalicR"
-        latin:keyLabel="&#x25CC;&#x0943;"
-        latin:code="0x0943"
+        latin:keySpec="&#x25CC;&#x0943;|&#x0943;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_f1.xml b/java/res/xml/key_f1.xml
index 0e9d497..d3a7539 100644
--- a/java/res/xml/key_f1.xml
+++ b/java/res/xml/key_f1.xml
@@ -26,21 +26,21 @@
             latin:mode="url"
         >
             <Key
-                latin:keyLabel="/"
+                latin:keySpec="/"
                 latin:keyStyle="f1MoreKeysStyle" />
         </case>
         <case
             latin:mode="email"
         >
             <Key
-                latin:keyLabel="\@"
+                latin:keySpec="\@"
                 latin:keyStyle="f1MoreKeysStyle" />
         </case>
         <case
             latin:supportsSwitchingToShortcutIme="false"
         >
             <Key
-                latin:keyLabel="!text/keylabel_for_comma"
+                latin:keySpec="!text/keylabel_for_comma"
                 latin:keyLabelFlags="hasPopupHint"
                 latin:additionalMoreKeys="!text/more_keys_for_comma"
                 latin:keyStyle="f1MoreKeysStyle" />
@@ -55,7 +55,7 @@
         <!-- latin:hasShortcutKey="false" -->
         <default>
             <Key
-                latin:keyLabel="!text/keylabel_for_comma"
+                latin:keySpec="!text/keylabel_for_comma"
                 latin:keyLabelFlags="hasPopupHint"
                 latin:additionalMoreKeys="!text/more_keys_for_comma,!text/shortcut_as_more_key"
                 latin:keyStyle="f1MoreKeysStyle" />
diff --git a/java/res/xml/key_greek_semicolon.xml b/java/res/xml/key_greek_semicolon.xml
index ae73a59..9001e4d 100644
--- a/java/res/xml/key_greek_semicolon.xml
+++ b/java/res/xml/key_greek_semicolon.xml
@@ -26,14 +26,14 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel=":"
+                latin:keySpec=":"
                 latin:keyHintLabel="1"
                 latin:moreKeys=";"
                 latin:additionalMoreKeys="1" />
         </case>
         <default>
             <Key
-                latin:keyLabel=";"
+                latin:keySpec=";"
                 latin:keyHintLabel="1"
                 latin:moreKeys=":"
                 latin:additionalMoreKeys="1" />
diff --git a/java/res/xml/key_period.xml b/java/res/xml/key_period.xml
index 838db25..edb4f94 100644
--- a/java/res/xml/key_period.xml
+++ b/java/res/xml/key_period.xml
@@ -39,7 +39,7 @@
         </case>
         <default>
             <Key
-                latin:keyLabel="!text/keylabel_for_period"
+                latin:keySpec="!text/keylabel_for_period"
                 latin:keyHintLabel="!text/keyhintlabel_for_period"
                 latin:keyLabelFlags="hasPopupHint|hasShiftedLetterHint"
                 latin:moreKeys="!text/more_keys_for_period"
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index 9c40d62..f04fc45 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -42,7 +42,6 @@
     <!-- Base style for shift key. A single space is used for dummy label in moreKeys. -->
     <key-style
         latin:styleName="baseForShiftKeyStyle"
-        latin:code="!code/key_shift"
         latin:keyActionFlags="noKeyPreview"
         latin:keyLabelFlags="preserveCase"
         latin:moreKeys="!noPanelAutoMoreKey!, |!code/key_capslock" />
@@ -52,7 +51,7 @@
         >
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key_shifted"
+                latin:keySpec="!icon/shift_key_shifted|!code/key_shift"
                 latin:backgroundType="stickyOff"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </case>
@@ -61,99 +60,71 @@
         >
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key_shifted"
+                latin:keySpec="!icon/shift_key_shifted|!code/key_shift"
                 latin:backgroundType="stickyOn"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </case>
         <default>
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key"
+                latin:keySpec="!icon/shift_key|!code/key_shift"
                 latin:backgroundType="stickyOff"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </default>
     </switch>
     <key-style
         latin:styleName="deleteKeyStyle"
-        latin:code="!code/key_delete"
-        latin:keyIcon="!icon/delete_key"
+        latin:keySpec="!icon/delete_key|!code/key_delete"
         latin:keyActionFlags="isRepeatable|noKeyPreview"
         latin:backgroundType="functional" />
+    <!-- emojiKeyStyle must be defined before including @xml/key_syles_enter. -->
+    <key-style
+        latin:styleName="emojiKeyStyle"
+        latin:keySpec="!icon/emoji_key|!code/key_emoji"
+        latin:keyActionFlags="noKeyPreview"
+        latin:backgroundType="functional" />
     <include
         latin:keyboardLayout="@xml/key_styles_enter" />
     <key-style
         latin:styleName="spaceKeyStyle"
-        latin:code="!code/key_space"
+        latin:keySpec=" |!code/key_space"
         latin:keyActionFlags="noKeyPreview|enableLongPress" />
     <!-- U+200C: ZERO WIDTH NON-JOINER
          U+200D: ZERO WIDTH JOINER -->
     <key-style
         latin:styleName="zwnjKeyStyle"
-        latin:code="0x200C"
-        latin:keyIcon="!icon/zwnj_key"
+        latin:keySpec="!icon/zwnj_key|&#x200C;"
         latin:moreKeys="!icon/zwj_key|&#x200D;"
         latin:keyLabelFlags="hasPopupHint"
         latin:keyActionFlags="noKeyPreview" />
     <key-style
         latin:styleName="shortcutKeyStyle"
-        latin:code="!code/key_shortcut"
-        latin:keyIcon="!icon/shortcut_key"
+        latin:keySpec="!icon/shortcut_key|!code/key_shortcut"
         latin:keyIconDisabled="!icon/shortcut_key_disabled"
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
         latin:altCode="!code/key_space"
         latin:parentStyle="f1MoreKeysStyle" />
     <key-style
         latin:styleName="settingsKeyStyle"
-        latin:code="!code/key_settings"
-        latin:keyIcon="!icon/settings_key"
+        latin:keySpec="!icon/settings_key|!code/key_settings"
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
         latin:altCode="!code/key_space"
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="languageSwitchKeyStyle"
-        latin:code="!code/key_language_switch"
-        latin:keyIcon="!icon/language_switch_key"
+        latin:keySpec="!icon/language_switch_key|!code/key_language_switch"
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping|enableLongPress"
         latin:altCode="!code/key_space" />
     <key-style
-        latin:styleName="emojiKeyStyle"
-        latin:code="!code/key_emoji"
-        latin:keyIcon="!icon/emoji_key"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional" />
-    <!-- Overriding EnterKeyStyle here -->
-    <switch>
-        <!-- Shift + Enter in textMultiLine field. -->
-        <case
-            latin:isMultiLine="true"
-            latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted"
-        >
-            <key-style
-                latin:styleName="enterKeyStyle"
-                latin:parentStyle="shiftEnterKeyStyle" />
-        </case>
-        <!-- Smiley in textShortMessage field.
-             Overrides common enter key style. -->
-        <case
-            latin:mode="im"
-        >
-            <key-style
-                latin:styleName="enterKeyStyle"
-                latin:parentStyle="emojiKeyStyle" />
-        </case>
-    </switch>
-    <key-style
         latin:styleName="tabKeyStyle"
-        latin:code="!code/key_tab"
-        latin:keyIcon="!icon/tab_key"
+        latin:keySpec="!icon/tab_key|!code/key_tab"
         latin:keyIconPreview="!icon/tab_key_preview"
         latin:backgroundType="functional" />
     <!-- Note: This key style is not for functional tab key. This is used for the tab key which is
          laid out as normal letter key. -->
     <key-style
         latin:styleName="nonSpecialBackgroundTabKeyStyle"
-        latin:code="!code/key_tab"
-        latin:keyIcon="!icon/tab_key"
+        latin:keySpec="!icon/tab_key|!code/key_tab"
         latin:keyIconPreview="!icon/tab_key_preview" />
     <key-style
         latin:styleName="baseForLayoutSwitchKeyStyle"
@@ -161,30 +132,24 @@
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
-        latin:styleName="baseForToSymbolKeyStyle"
-        latin:keyLabel="!text/label_to_symbol_key"
+        latin:styleName="toSymbolKeyStyle"
+        latin:keySpec="!text/label_to_symbol_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
-        latin:styleName="toSymbolKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:parentStyle="baseForToSymbolKeyStyle" />
-    <key-style
         latin:styleName="toAlphaKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_alpha_key"
+        latin:keySpec="!text/label_to_alpha_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_more_symbol_key"
+        latin:keySpec="!text/label_to_more_symbol_key|!code/key_shift"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="backFromMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:parentStyle="baseForToSymbolKeyStyle" />
+        latin:keySpec="!text/label_to_symbol_key|!code/key_shift"
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="comKeyStyle"
-        latin:keyLabel="!text/keylabel_for_popular_domain|!text/keylabel_for_popular_domain"
+        latin:keySpec="!text/keylabel_for_popular_domain|!text/keylabel_for_popular_domain"
         latin:keyLabelFlags="autoXScale|fontNormal|hasPopupHint|preserveCase"
         latin:moreKeys="!text/more_keys_for_popular_domain"
         latin:backgroundType="functional" />
diff --git a/java/res/xml/key_styles_currency.xml b/java/res/xml/key_styles_currency.xml
index 84c2abc..ed40ebc 100644
--- a/java/res/xml/key_styles_currency.xml
+++ b/java/res/xml/key_styles_currency.xml
@@ -113,21 +113,21 @@
                  U+00A2: "¢" CENT SIGN -->
             <key-style
                 latin:styleName="currencyKeyStyle"
-                latin:keyLabel="!text/keylabel_for_currency"
+                latin:keySpec="!text/keylabel_for_currency"
                 latin:moreKeys="!text/more_keys_for_currency" />
             <key-style
                 latin:styleName="moreCurrency1KeyStyle"
-                latin:keyLabel="&#x00A3;" />
+                latin:keySpec="&#x00A3;" />
             <key-style
                 latin:styleName="moreCurrency2KeyStyle"
-                latin:keyLabel="&#x20AC;" />
+                latin:keySpec="&#x20AC;" />
             <key-style
                 latin:styleName="moreCurrency3KeyStyle"
-                latin:keyLabel="$"
+                latin:keySpec="$"
                 latin:moreKeys="&#x00A2;" />
             <key-style
                 latin:styleName="moreCurrency4KeyStyle"
-                latin:keyLabel="&#x00A2;" />
+                latin:keySpec="&#x00A2;" />
         </case>
         <!-- GB: United Kingdom (Pound) -->
         <case
@@ -140,21 +140,21 @@
                  U+20B1: "₱" PESO SIGN -->
             <key-style
                 latin:styleName="currencyKeyStyle"
-                latin:keyLabel="&#x00A3;"
+                latin:keySpec="&#x00A3;"
                 latin:moreKeys="&#x00A2;,$,&#x20AC;,&#x00A5;,&#x20B1;" />
             <key-style
                 latin:styleName="moreCurrency1KeyStyle"
-                latin:keyLabel="&#x20AC;" />
+                latin:keySpec="&#x20AC;" />
             <key-style
                 latin:styleName="moreCurrency2KeyStyle"
-                latin:keyLabel="&#x00A5;" />
+                latin:keySpec="&#x00A5;" />
             <key-style
                 latin:styleName="moreCurrency3KeyStyle"
-                latin:keyLabel="$"
+                latin:keySpec="$"
                 latin:moreKeys="&#x00A2;" />
             <key-style
                 latin:styleName="moreCurrency4KeyStyle"
-                latin:keyLabel="&#x00A2;" />
+                latin:keySpec="&#x00A2;" />
         </case>
         <!-- ar: Arabic (Dollar and Rial) -->
         <default>
diff --git a/java/res/xml/key_styles_currency_dollar.xml b/java/res/xml/key_styles_currency_dollar.xml
index 674a396..a02c9bf 100644
--- a/java/res/xml/key_styles_currency_dollar.xml
+++ b/java/res/xml/key_styles_currency_dollar.xml
@@ -25,18 +25,18 @@
          U+00A5: "¥" YEN SIGN -->
     <key-style
         latin:styleName="currencyKeyStyle"
-        latin:keyLabel="$"
+        latin:keySpec="$"
         latin:moreKeys="!text/more_keys_for_currency_dollar" />
     <key-style
         latin:styleName="moreCurrency1KeyStyle"
-        latin:keyLabel="&#x00A3;" />
+        latin:keySpec="&#x00A3;" />
     <key-style
         latin:styleName="moreCurrency2KeyStyle"
-        latin:keyLabel="&#x00A2;" />
+        latin:keySpec="&#x00A2;" />
     <key-style
         latin:styleName="moreCurrency3KeyStyle"
-        latin:keyLabel="&#x20AC;" />
+        latin:keySpec="&#x20AC;" />
     <key-style
         latin:styleName="moreCurrency4KeyStyle"
-        latin:keyLabel="&#x00A5;" />
+        latin:keySpec="&#x00A5;" />
 </merge>
diff --git a/java/res/xml/key_styles_currency_euro.xml b/java/res/xml/key_styles_currency_euro.xml
index c1b5e03..c2ae87b 100644
--- a/java/res/xml/key_styles_currency_euro.xml
+++ b/java/res/xml/key_styles_currency_euro.xml
@@ -26,19 +26,19 @@
          U+20B1: "₱" PESO SIGN -->
     <key-style
         latin:styleName="currencyKeyStyle"
-        latin:keyLabel="&#x20AC;"
+        latin:keySpec="&#x20AC;"
         latin:moreKeys="&#x00A2;,&#x00A3;,$,&#x00A5;,&#x20B1;" />
     <key-style
         latin:styleName="moreCurrency1KeyStyle"
-        latin:keyLabel="&#x00A3;" />
+        latin:keySpec="&#x00A3;" />
     <key-style
         latin:styleName="moreCurrency2KeyStyle"
-        latin:keyLabel="&#x00A5;" />
+        latin:keySpec="&#x00A5;" />
     <key-style
         latin:styleName="moreCurrency3KeyStyle"
-        latin:keyLabel="$"
+        latin:keySpec="$"
         latin:moreKeys="&#x00A2;" />
     <key-style
         latin:styleName="moreCurrency4KeyStyle"
-        latin:keyLabel="&#x00A2;" />
+        latin:keySpec="&#x00A2;" />
 </merge>
diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml
index 083e6a6..64d09b1 100644
--- a/java/res/xml/key_styles_enter.xml
+++ b/java/res/xml/key_styles_enter.xml
@@ -255,21 +255,13 @@
     <!-- Enter key style -->
     <key-style
         latin:styleName="defaultEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/enter_key"
         latin:keyLabelFlags="preserveCase|autoXScale|followKeyLabelRatio"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional"
         latin:parentStyle="navigateMoreKeysStyle" />
     <key-style
         latin:styleName="shiftEnterKeyStyle"
-        latin:code="!code/key_shift_enter"
-        latin:parentStyle="defaultEnterKeyStyle" />
-    <key-style
-        latin:styleName="defaultActionEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/undefined"
-        latin:backgroundType="action"
+        latin:keySpec="!icon/enter_key|!code/key_shift_enter"
         latin:parentStyle="defaultEnterKeyStyle" />
     <switch>
         <!-- Shift + Enter in textMultiLine field. -->
@@ -281,66 +273,84 @@
                 latin:styleName="enterKeyStyle"
                 latin:parentStyle="shiftEnterKeyStyle" />
         </case>
+        <!-- Smiley in textShortMessage field.
+             This <case> should be after Shift + Enter <case> and before any of action <case>. -->
+        <case
+            latin:mode="im"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:parentStyle="emojiKeyStyle" />
+        </case>
         <case
             latin:imeAction="actionGo"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_go_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_go_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionNext"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_next_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_next_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionPrevious"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_previous_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_previous_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionDone"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_done_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_done_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSend"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_send_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!text/label_send_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSearch"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyIcon="!icon/search_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keySpec="!icon/search_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionCustomLabel"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
+                latin:keySpec="dummy_label|!code/key_enter"
                 latin:keyLabelFlags="fromCustomActionLabel"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <!-- imeAction is either actionNone or actionUnspecified. -->
         <default>
             <key-style
                 latin:styleName="enterKeyStyle"
+                latin:keySpec="!icon/enter_key|!code/key_enter"
                 latin:parentStyle="defaultEnterKeyStyle" />
         </default>
     </switch>
diff --git a/java/res/xml/key_styles_number.xml b/java/res/xml/key_styles_number.xml
index 2e5a601..7136e10 100644
--- a/java/res/xml/key_styles_number.xml
+++ b/java/res/xml/key_styles_number.xml
@@ -43,82 +43,74 @@
         latin:parentStyle="numKeyStyle" />
     <key-style
         latin:styleName="num0KeyStyle"
-        latin:keyLabel="0"
+        latin:keySpec="0"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num1KeyStyle"
-        latin:keyLabel="1"
+        latin:keySpec="1"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num2KeyStyle"
-        latin:keyLabel="2"
+        latin:keySpec="2"
         latin:keyHintLabel="ABC"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num3KeyStyle"
-        latin:keyLabel="3"
+        latin:keySpec="3"
         latin:keyHintLabel="DEF"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num4KeyStyle"
-        latin:keyLabel="4"
+        latin:keySpec="4"
         latin:keyHintLabel="GHI"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num5KeyStyle"
-        latin:keyLabel="5"
+        latin:keySpec="5"
         latin:keyHintLabel="JKL"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num6KeyStyle"
-        latin:keyLabel="6"
+        latin:keySpec="6"
         latin:keyHintLabel="MNO"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num7KeyStyle"
-        latin:keyLabel="7"
+        latin:keySpec="7"
         latin:keyHintLabel="PQRS"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num8KeyStyle"
-        latin:keyLabel="8"
+        latin:keySpec="8"
         latin:keyHintLabel="TUV"
         latin:parentStyle="numberKeyStyle" />
     <key-style
         latin:styleName="num9KeyStyle"
-        latin:keyLabel="9"
+        latin:keySpec="9"
         latin:keyHintLabel="WXYZ"
         latin:parentStyle="numberKeyStyle" />
-    <!-- U+002A: "*" ASTERISK
-         U+FF0A: "*" FULLWIDTH ASTERISK -->
+    <!-- U+FF0A: "*" FULLWIDTH ASTERISK -->
     <key-style
         latin:styleName="numStarKeyStyle"
-        latin:code="0x002A"
-        latin:keyLabel="&#xFF0A;"
+        latin:keySpec="&#xFF0A;|*"
         latin:parentStyle="numKeyStyle" />
     <!-- Only for non-tablet device -->
     <key-style
         latin:styleName="numPhoneToSymbolKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_phone_symbols_key"
+        latin:keySpec="!text/label_to_phone_symbols_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="numModeKeyStyle" />
     <key-style
         latin:styleName="numPhoneToNumericKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_phone_numeric_key"
+        latin:keySpec="!text/label_to_phone_numeric_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="numModeKeyStyle" />
-    <!-- U+002C: "," COMMA -->
     <key-style
         latin:styleName="numPauseKeyStyle"
-        latin:code="0x002C"
-        latin:keyLabel="!text/label_pause_key"
+        latin:keySpec="!text/label_pause_key|,"
         latin:keyLabelFlags="followKeyHintLabelRatio|autoXScale"
         latin:parentStyle="numKeyBaseStyle" />
-    <!-- U+003B: ";" SEMICOLON -->
     <key-style
         latin:styleName="numWaitKeyStyle"
-        latin:code="0x003B"
-        latin:keyLabel="!text/label_wait_key"
+        latin:keySpec="!text/label_wait_key|;"
         latin:keyLabelFlags="followKeyHintLabelRatio|autoXScale"
         latin:parentStyle="numKeyBaseStyle" />
     <key-style
@@ -127,15 +119,13 @@
         latin:parentStyle="tabKeyStyle" />
     <key-style
         latin:styleName="numSpaceKeyStyle"
-        latin:code="!code/key_space"
-        latin:keyIcon="!icon/space_key_for_number_layout"
+        latin:keySpec="!icon/space_key_for_number_layout|!code/key_space"
         latin:keyActionFlags="enableLongPress"
         latin:parentStyle="numKeyBaseStyle" />
     <!-- Override defaultEnterKeyStyle in key_styles_enter.xml -->
     <key-style
         latin:styleName="defaultEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/enter_key"
+        latin:keySpec="!icon/enter_key|!code/key_enter"
         latin:keyLabelFlags="preserveCase|autoXScale|followKeyLargeLabelRatio"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional"
diff --git a/java/res/xml/key_thai_kho_khuat.xml b/java/res/xml/key_thai_kho_khuat.xml
index 0ffd0f9..84988f8 100644
--- a/java/res/xml/key_thai_kho_khuat.xml
+++ b/java/res/xml/key_thai_kho_khuat.xml
@@ -27,13 +27,13 @@
         >
             <!-- U+0E05: "ฅ" THAI CHARACTER KHO KHON -->
             <Key
-                latin:keyLabel="&#x0E05;"
+                latin:keySpec="&#x0E05;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
             <!-- U+0E03: "ฃ" THAI CHARACTER KHO KHUAT -->
             <Key
-                latin:keyLabel="&#x0E03;"
+                latin:keySpec="&#x0E03;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/keys_arabic3_left.xml b/java/res/xml/keys_arabic3_left.xml
index 157af4a..2b3e12c 100644
--- a/java/res/xml/keys_arabic3_left.xml
+++ b/java/res/xml/keys_arabic3_left.xml
@@ -23,6 +23,6 @@
 >
     <!-- U+0630: "ذ" ARABIC LETTER THAL -->
     <Key
-        latin:keyLabel="&#x0630;"
+        latin:keySpec="&#x0630;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/keys_comma_period_symbols.xml b/java/res/xml/keys_comma_period_symbols.xml
index 880fe40..5221d34 100644
--- a/java/res/xml/keys_comma_period_symbols.xml
+++ b/java/res/xml/keys_comma_period_symbols.xml
@@ -22,10 +22,10 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="!text/keylabel_for_comma"
+        latin:keySpec="!text/keylabel_for_comma"
         latin:moreKeys="!text/more_keys_for_comma" />
     <!-- U+2026: "…" HORIZONTAL ELLIPSIS -->
     <Key
-        latin:keyLabel="."
+        latin:keySpec="."
         latin:moreKeys="&#x2026;" />
 </merge>
diff --git a/java/res/xml/keys_curly_brackets.xml b/java/res/xml/keys_curly_brackets.xml
index 6a4b1a9..da6dfc0 100644
--- a/java/res/xml/keys_curly_brackets.xml
+++ b/java/res/xml/keys_curly_brackets.xml
@@ -22,9 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="{"
-        latin:code="!code/key_left_curly_bracket" />
+        latin:keySpec="{|!code/key_left_curly_bracket" />
     <Key
-        latin:keyLabel="}"
-        latin:code="!code/key_right_curly_bracket" />
+        latin:keySpec="}|!code/key_right_curly_bracket" />
 </merge>
diff --git a/java/res/xml/keys_dvorak_123.xml b/java/res/xml/keys_dvorak_123.xml
index fa94f1f..6efc7f2 100644
--- a/java/res/xml/keys_dvorak_123.xml
+++ b/java/res/xml/keys_dvorak_123.xml
@@ -26,7 +26,7 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel="&quot;"
+                latin:keySpec="&quot;"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1" />
         </case>
@@ -34,7 +34,7 @@
             latin:mode="url"
         >
             <Key
-                latin:keyLabel="/"
+                latin:keySpec="/"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1" />
         </case>
@@ -42,13 +42,13 @@
             latin:mode="email"
         >
             <Key
-                latin:keyLabel="\@"
+                latin:keySpec="\@"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1" />
         </case>
         <default>
             <Key
-                latin:keyLabel="\'"
+                latin:keySpec="\'"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1"
                 latin:moreKeys="!,&quot;" />
@@ -59,22 +59,22 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel="&lt;"
+                latin:keySpec="&lt;"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2" />
             <Key
-                latin:keyLabel="&gt;"
+                latin:keySpec="&gt;"
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3" />
         </case>
         <default>
             <Key
-                latin:keyLabel=","
+                latin:keySpec=","
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2"
                 latin:moreKeys="\?,&lt;" />
             <Key
-                latin:keyLabel="."
+                latin:keySpec="."
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3"
                 latin:moreKeys="&gt;" />
diff --git a/java/res/xml/keys_farsi3_right.xml b/java/res/xml/keys_farsi3_right.xml
index 77efb0a..2618e47 100644
--- a/java/res/xml/keys_farsi3_right.xml
+++ b/java/res/xml/keys_farsi3_right.xml
@@ -23,6 +23,6 @@
 >
     <!-- U+0686: "چ" ARABIC LETTER TCHEH -->
     <Key
-        latin:keyLabel="&#x0686;"
+        latin:keySpec="&#x0686;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/keys_less_greater.xml b/java/res/xml/keys_less_greater.xml
index 56d0727..3304e4c 100644
--- a/java/res/xml/keys_less_greater.xml
+++ b/java/res/xml/keys_less_greater.xml
@@ -25,28 +25,25 @@
         <case
             latin:languageCode="fa"
         >
+            <!-- TODO: Introduce !code/key_{left,right}_angle_quotation. -->
             <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
                  U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&#x00AB;"
-                latin:code="0x00BB"
+                latin:keySpec="&#x00AB;|&#x00BB;"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_less_than" />
             <Key
-                latin:keyLabel="&#x00BB;"
-                latin:code="0x00AB"
+                latin:keySpec="&#x00BB;|&#x00AB;"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_greater_than" />
         </case>
         <default>
             <Key
-                latin:keyLabel="&lt;"
-                latin:code="!code/key_less_than"
+                latin:keySpec="&lt;|!code/key_less_than"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_less_than" />
             <Key
-                latin:keyLabel="&gt;"
-                latin:code="!code/key_greater_than"
+                latin:keySpec="&gt;|!code/key_greater_than"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_greater_than" />
         </default>
diff --git a/java/res/xml/keys_parentheses.xml b/java/res/xml/keys_parentheses.xml
index 25e89c9..ab33ef5 100644
--- a/java/res/xml/keys_parentheses.xml
+++ b/java/res/xml/keys_parentheses.xml
@@ -22,11 +22,9 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="("
-        latin:code="!code/key_left_parenthesis"
+        latin:keySpec="(|!code/key_left_parenthesis"
         latin:moreKeys="!text/more_keys_for_left_parenthesis" />
     <Key
-        latin:keyLabel=")"
-        latin:code="!code/key_right_parenthesis"
+        latin:keySpec=")|!code/key_right_parenthesis"
         latin:moreKeys="!text/more_keys_for_right_parenthesis" />
 </merge>
diff --git a/java/res/xml/keys_pcqwerty2_right3.xml b/java/res/xml/keys_pcqwerty2_right3.xml
index 6f86477..9e62b09 100644
--- a/java/res/xml/keys_pcqwerty2_right3.xml
+++ b/java/res/xml/keys_pcqwerty2_right3.xml
@@ -26,23 +26,23 @@
             latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
         >
             <Key
-                latin:keyLabel="["
+                latin:keySpec="["
                 latin:additionalMoreKeys="{" />
             <Key
-                latin:keyLabel="]"
+                latin:keySpec="]"
                 latin:additionalMoreKeys="}" />
             <Key
-                latin:keyLabel="\\"
+                latin:keySpec="\\"
                 latin:additionalMoreKeys="\\|" />
         </case>
         <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" -->
         <default>
             <Key
-                latin:keyLabel="{" />
+                latin:keySpec="{" />
             <Key
-                latin:keyLabel="}" />
+                latin:keySpec="}" />
             <Key
-                latin:keyLabel="|" />
+                latin:keySpec="|" />
         </default>
     </switch>
 </merge>
diff --git a/java/res/xml/keys_pcqwerty3_right2.xml b/java/res/xml/keys_pcqwerty3_right2.xml
index 8da145b..d889216 100644
--- a/java/res/xml/keys_pcqwerty3_right2.xml
+++ b/java/res/xml/keys_pcqwerty3_right2.xml
@@ -26,19 +26,19 @@
             latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
         >
             <Key
-                latin:keyLabel=";"
+                latin:keySpec=";"
                 latin:additionalMoreKeys=":" />
             <Key
-                latin:keyLabel="\'"
+                latin:keySpec="\'"
                 latin:additionalMoreKeys="&quot;"
                 latin:moreKeys="!fixedColumnOrder!4,!text/double_quotes,%,!text/single_quotes" />
         </case>
         <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" -->
         <default>
             <Key
-                latin:keyLabel=":" />
+                latin:keySpec=":" />
             <Key
-                latin:keyLabel="&quot;"
+                latin:keySpec="&quot;"
                 latin:moreKeys="!fixedColumnOrder!3,!text/double_quotes,!text/single_quotes" />
         </default>
     </switch>
diff --git a/java/res/xml/keys_pcqwerty4_right3.xml b/java/res/xml/keys_pcqwerty4_right3.xml
index a5d5a42..f32d809 100644
--- a/java/res/xml/keys_pcqwerty4_right3.xml
+++ b/java/res/xml/keys_pcqwerty4_right3.xml
@@ -26,13 +26,13 @@
             latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
         >
             <Key
-                latin:keyLabel=","
+                latin:keySpec=","
                 latin:additionalMoreKeys="&lt;" />
             <Key
-                latin:keyLabel="."
+                latin:keySpec="."
                 latin:additionalMoreKeys="&gt;" />
             <Key
-                latin:keyLabel="/"
+                latin:keySpec="/"
                 latin:additionalMoreKeys="\?"
                 latin:moreKeys="!text/more_keys_for_question" />
         </case>
@@ -45,13 +45,13 @@
                  U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
                  U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&lt;"
+                latin:keySpec="&lt;"
                 latin:moreKeys="!fixedColumnOrder!3,&#x2039;,&#x2264;,&#x00AB;" />
             <Key
-                latin:keyLabel="&gt;"
+                latin:keySpec="&gt;"
                 latin:moreKeys="!fixedColumnOrder!3,&#x203A;,&#x2265;,&#x00BB;" />
             <Key
-                latin:keyLabel="\?"
+                latin:keySpec="\?"
                 latin:moreKeys="!text/more_keys_for_question" />
         </default>
     </switch>
diff --git a/java/res/xml/keys_square_brackets.xml b/java/res/xml/keys_square_brackets.xml
index 5c128fd..8f0dec5 100644
--- a/java/res/xml/keys_square_brackets.xml
+++ b/java/res/xml/keys_square_brackets.xml
@@ -22,9 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="["
-        latin:code="!code/key_left_square_bracket" />
+        latin:keySpec="[|!code/key_left_square_bracket" />
     <Key
-        latin:keyLabel="]"
-        latin:code="!code/key_right_square_bracket" />
+        latin:keySpec="]|!code/key_right_square_bracket" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_sign_virama.xml b/java/res/xml/keystyle_devanagari_sign_virama.xml
index b22fbe8..5e0e108 100644
--- a/java/res/xml/keystyle_devanagari_sign_virama.xml
+++ b/java/res/xml/keystyle_devanagari_sign_virama.xml
@@ -29,7 +29,6 @@
          U+094D: "्" DEVANAGARI SIGN VIRAMA -->
     <key-style
         latin:styleName="baseKeyDevanagariSignVirama"
-        latin:keyLabel="&#x25CC;&#x094D;"
-        latin:code="0x094D"
+        latin:keySpec="&#x25CC;&#x094D;|&#x094D;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
  </merge>
diff --git a/java/res/xml/keystyle_devanagari_sign_visarga.xml b/java/res/xml/keystyle_devanagari_sign_visarga.xml
index cb29495..45f519a 100644
--- a/java/res/xml/keystyle_devanagari_sign_visarga.xml
+++ b/java/res/xml/keystyle_devanagari_sign_visarga.xml
@@ -29,7 +29,6 @@
          U+0903: "ः" DEVANAGARI SIGN VISARGA -->
     <key-style
         latin:styleName="baseKeyDevanagariSignVisarga"
-        latin:keyLabel="&#x25CC;&#x0903;"
-        latin:code="0x0903"
+        latin:keySpec="&#x25CC;&#x0903;|&#x0903;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml b/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml
index 2e78c53..97f98e3 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml
@@ -46,7 +46,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAa"
         latin:parentStyle="moreKeysDevanagariVowelSignAa"
-        latin:keyLabel="&#x25CC;&#x093E;"
-        latin:code="0x093E"
+        latin:keySpec="&#x25CC;&#x093E;|&#x093E;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml b/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml
index 0554c0e..4d1b2c5 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml
@@ -53,7 +53,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAi"
         latin:parentStyle="moreKeysDevanagariVowelSignAi"
-        latin:keyLabel="&#x25CC;&#x0948;"
-        latin:code="0x0948"
+        latin:keySpec="&#x25CC;&#x0948;|&#x0948;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_au.xml b/java/res/xml/keystyle_devanagari_vowel_sign_au.xml
index 29a11a8..66628b5 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_au.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_au.xml
@@ -44,7 +44,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAu"
         latin:parentStyle="moreKeysDevanagariVowelSignAu"
-        latin:keyLabel="&#x25CC;&#x094C;"
-        latin:code="0x094C"
+        latin:keySpec="&#x25CC;&#x094C;|&#x094C;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_e.xml b/java/res/xml/keystyle_devanagari_vowel_sign_e.xml
index edd29c7..de1d949 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_e.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_e.xml
@@ -53,7 +53,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignE"
         latin:parentStyle="moreKeysDevanagariVowelSignE"
-        latin:keyLabel="&#x25CC;&#x0947;"
-        latin:code="0x0947"
+        latin:keySpec="&#x25CC;&#x0947;|&#x0947;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_i.xml b/java/res/xml/keystyle_devanagari_vowel_sign_i.xml
index 200fed2..d1d56c1 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_i.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_i.xml
@@ -45,7 +45,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignI"
         latin:parentStyle="moreKeysDevanagariVowelSignI"
-        latin:keyLabel="&#x25CC;&#x093F;"
-        latin:code="0x093F"
+        latin:keySpec="&#x25CC;&#x093F;|&#x093F;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml b/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml
index 6dc9951..fd0ce77 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml
@@ -45,7 +45,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignIi"
         latin:parentStyle="moreKeysDevanagariVowelSignIi"
-        latin:keyLabel="&#x25CC;&#x0940;"
-        latin:code="0x0940"
+        latin:keySpec="&#x25CC;&#x0940;|&#x0940;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_o.xml b/java/res/xml/keystyle_devanagari_vowel_sign_o.xml
index 233ac86..edc3bef 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_o.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_o.xml
@@ -47,7 +47,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignO"
         latin:parentStyle="moreKeysDevanagariVowelSignO"
-        latin:keyLabel="&#x25CC;&#x094B;"
-        latin:code="0x094B"
+        latin:keySpec="&#x25CC;&#x094B;|&#x094B;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_u.xml b/java/res/xml/keystyle_devanagari_vowel_sign_u.xml
index 7291b70..c7de4fd 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_u.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_u.xml
@@ -46,7 +46,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignU"
         latin:parentStyle="moreKeysDevanagariVowelSignU"
-        latin:keyLabel="&#x25CC;&#x0941;"
-        latin:code="0x0941"
+        latin:keySpec="&#x25CC;&#x0941;|&#x0941;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml b/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml
index a95ab82..6029d6d 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml
@@ -46,7 +46,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignUu"
         latin:parentStyle="moreKeysDevanagariVowelSignUu"
-        latin:keyLabel="&#x25CC;&#x0942;"
-        latin:code="0x0942"
+        latin:keySpec="&#x25CC;&#x0942;|&#x0942;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/prefs_for_debug.xml b/java/res/xml/prefs_for_debug.xml
index 899e2b8..81a5d98 100644
--- a/java/res/xml/prefs_for_debug.xml
+++ b/java/res/xml/prefs_for_debug.xml
@@ -14,68 +14,75 @@
      limitations under the License.
 -->
 
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        android:title="@string/prefs_debug_mode"
-        android:key="english_ime_debug_settings">
-
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    android:title="@string/prefs_debug_mode"
+    android:key="english_ime_debug_settings"
+>
     <CheckBoxPreference
-            android:key="enable_logging"
-            android:title="@string/prefs_enable_log"
-            android:summary="@string/prefs_description_log"
-            android:persistent="true"
-            android:defaultValue="false" />
-
+        android:key="enable_logging"
+        android:title="@string/prefs_enable_log"
+        android:summary="@string/prefs_description_log"
+        android:persistent="true"
+        android:defaultValue="false" />
     <ListPreference
-            android:key="pref_keyboard_layout_20110916"
-            android:title="@string/keyboard_layout"
-            android:summary="%s"
-            android:persistent="true"
-            android:entryValues="@array/keyboard_layout_modes_values"
-            android:entries="@array/keyboard_layout_modes"
-            android:defaultValue="@string/config_default_keyboard_theme_index" />
-
+        android:key="pref_keyboard_layout_20110916"
+        android:title="@string/keyboard_layout"
+        android:summary="%s"
+        android:persistent="true"
+        android:entryValues="@array/keyboard_layout_modes_values"
+        android:entries="@array/keyboard_layout_modes"
+        android:defaultValue="@string/config_default_keyboard_theme_index" />
     <CheckBoxPreference
-            android:key="debug_mode"
-            android:title="@string/prefs_debug_mode"
-            android:persistent="true"
-            android:defaultValue="false" />
-
+        android:key="debug_mode"
+        android:title="@string/prefs_debug_mode"
+        android:persistent="true"
+        android:defaultValue="false" />
     <CheckBoxPreference
-            android:key="force_non_distinct_multitouch"
-            android:title="@string/prefs_force_non_distinct_multitouch"
-            android:persistent="true"
-            android:defaultValue="false" />
-
+        android:key="force_non_distinct_multitouch"
+        android:title="@string/prefs_force_non_distinct_multitouch"
+        android:persistent="true"
+        android:defaultValue="false" />
     <CheckBoxPreference
-            android:key="usability_study_mode"
-            android:title="@string/prefs_usability_study_mode"
-            android:persistent="true"
-            android:defaultValue="false" />
-
+        android:key="usability_study_mode"
+        android:title="@string/prefs_usability_study_mode"
+        android:persistent="true"
+        android:defaultValue="false" />
+    <com.android.inputmethod.latin.settings.SeekBarDialogPreference
+        android:key="pref_key_preview_show_up_start_scale"
+        android:title="@string/prefs_key_popup_show_up_start_scale_settings"
+        latin:maxValue="100" /> <!-- percent -->
+    <com.android.inputmethod.latin.settings.SeekBarDialogPreference
+        android:key="pref_key_preview_dismiss_end_scale"
+        android:title="@string/prefs_key_popup_dismiss_end_scale_settings"
+        latin:maxValue="100" /> <!-- percent -->
+    <com.android.inputmethod.latin.settings.SeekBarDialogPreference
+        android:key="pref_key_preview_show_up_duration"
+        android:title="@string/prefs_key_popup_show_up_duration_settings"
+        latin:maxValue="100" /> <!-- milliseconds -->
+    <com.android.inputmethod.latin.settings.SeekBarDialogPreference
+        android:key="pref_key_preview_dismiss_duration"
+        android:title="@string/prefs_key_popup_dismiss_duration_settings"
+        latin:maxValue="100" /> <!-- milliseconds -->
     <CheckBoxPreference
         android:defaultValue="false"
         android:key="use_only_personalization_dictionary_for_debug"
         android:persistent="true"
         android:title="@string/prefs_use_only_personalization_dictionary" />
-
     <PreferenceScreen
         android:key="read_external_dictionary"
         android:title="@string/prefs_read_external_dictionary" />
-
     <PreferenceScreen
         android:key="dump_contacts_dict"
         android:title="@string/prefs_dump_contacts_dict" />
-
     <PreferenceScreen
         android:key="dump_user_dict"
         android:title="@string/prefs_dump_user_dict" />
-
     <PreferenceScreen
         android:key="dump_user_history_dict"
         android:title="@string/prefs_dump_user_history_dict" />
-
     <PreferenceScreen
         android:key="dump_personalization_dict"
         android:title="@string/prefs_dump_personalization_dict" />
-
 </PreferenceScreen>
diff --git a/java/res/xml/row_dvorak4.xml b/java/res/xml/row_dvorak4.xml
index b78872f..0658079 100644
--- a/java/res/xml/row_dvorak4.xml
+++ b/java/res/xml/row_dvorak4.xml
@@ -28,7 +28,7 @@
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyWidth="15%p" />
         <Key
-            latin:keyLabel="q"
+            latin:keySpec="q"
             latin:backgroundType="normal"
             latin:additionalMoreKeys="!text/shortcut_as_more_key"
             latin:keyStyle="f1MoreKeysStyle" />
@@ -36,7 +36,7 @@
             latin:keyXPos="25%p"
             latin:keyboardLayout="@xml/key_space_5kw" />
         <Key
-            latin:keyLabel="z"
+            latin:keySpec="z"
             latin:keyLabelFlags="hasPopupHint"
             latin:moreKeys="!text/more_keys_for_punctuation,!text/more_keys_for_z" />
         <Key
diff --git a/java/res/xml/row_symbols4.xml b/java/res/xml/row_symbols4.xml
index 09d2a19..09f6b62 100644
--- a/java/res/xml/row_symbols4.xml
+++ b/java/res/xml/row_symbols4.xml
@@ -20,9 +20,9 @@
 
 <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" >
     <Key
-        latin:keyLabel="_" />
+        latin:keySpec="_" />
     <Key
-        latin:keyLabel="/" />
+        latin:keySpec="/" />
     <include
         latin:keyboardLayout="@xml/key_space_symbols" />
     <include
diff --git a/java/res/xml/rowkeys_arabic1.xml b/java/res/xml/rowkeys_arabic1.xml
index 3c0acf1..d5f1421 100644
--- a/java/res/xml/rowkeys_arabic1.xml
+++ b/java/res/xml/rowkeys_arabic1.xml
@@ -24,21 +24,21 @@
     <!-- U+0636: "ض" ARABIC LETTER DAD
          U+0661: "١" ARABIC-INDIC DIGIT ONE -->
     <Key
-        latin:keyLabel="&#x0636;"
+        latin:keySpec="&#x0636;"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1,&#x0661;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0635: "ص" ARABIC LETTER SAD
          U+0662: "٢" ARABIC-INDIC DIGIT TWO -->
     <Key
-        latin:keyLabel="&#x0635;"
+        latin:keySpec="&#x0635;"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2,&#x0662;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062B: "ث" ARABIC LETTER THEH
          U+0663: "٣" ARABIC-INDIC DIGIT THREE -->
     <Key
-        latin:keyLabel="&#x062B;"
+        latin:keySpec="&#x062B;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3,&#x0663;"
         latin:keyLabelFlags="fontNormal" />
@@ -47,7 +47,7 @@
          U+0664: "٤" ARABIC-INDIC DIGIT FOUR -->
     <!-- TODO: DroidSansArabic lacks the glyph of U+06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE -->
     <Key
-        latin:keyLabel="&#x0642;"
+        latin:keySpec="&#x0642;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4,&#x0664;"
         latin:moreKeys="&#x06A8;"
@@ -60,7 +60,7 @@
     <!-- TODO: DroidSansArabic lacks the glyph of U+06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW -->
     <!-- TODO: DroidSansArabic lacks the glyph of U+06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW -->
     <Key
-        latin:keyLabel="&#x0641;"
+        latin:keySpec="&#x0641;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5,&#x0665;"
         latin:moreKeys="&#x06A4;,&#x06A2;,&#x06A5;"
@@ -68,14 +68,14 @@
     <!-- U+063A: "غ" ARABIC LETTER GHAIN
          U+0666: "٦" ARABIC-INDIC DIGIT SIX -->
     <Key
-        latin:keyLabel="&#x063A;"
+        latin:keySpec="&#x063A;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6,&#x0666;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0639: "ع" ARABIC LETTER AIN
          U+0667: "٧" ARABIC-INDIC DIGIT SEVEN -->
     <Key
-        latin:keyLabel="&#x0639;"
+        latin:keySpec="&#x0639;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7,&#x0667;"
         latin:keyLabelFlags="fontNormal" />
@@ -84,7 +84,7 @@
          U+0647 U+200D: ARABIC LETTER HEH + ZERO WIDTH JOINER
          U+0668: "٨" ARABIC-INDIC DIGIT EIGHT -->
     <Key
-        latin:keyLabel="&#x0647;"
+        latin:keySpec="&#x0647;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8,&#x0668;"
         latin:moreKeys="&#xFEEB;|&#x0647;&#x200D;"
@@ -92,21 +92,21 @@
     <!-- U+062E: "خ" ARABIC LETTER KHAH
          U+0669: "٩" ARABIC-INDIC DIGIT NINE -->
     <Key
-        latin:keyLabel="&#x062E;"
+        latin:keySpec="&#x062E;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9,&#x0669;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062D: "ح" ARABIC LETTER HAH
          U+0660: "٠" ARABIC-INDIC DIGIT ZERO -->
     <Key
-        latin:keyLabel="&#x062D;"
+        latin:keySpec="&#x062D;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0,&#x0660;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062C: "ج" ARABIC LETTER JEEM
          U+0686: "چ" ARABIC LETTER TCHEH -->
     <Key
-        latin:keyLabel="&#x062C;"
+        latin:keySpec="&#x062C;"
         latin:moreKeys="&#x0686;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_arabic2.xml b/java/res/xml/rowkeys_arabic2.xml
index 4f8090d..9bc91e8 100644
--- a/java/res/xml/rowkeys_arabic2.xml
+++ b/java/res/xml/rowkeys_arabic2.xml
@@ -25,24 +25,24 @@
          U+069C: "ڜ" ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE -->
     <!-- TODO: DroidSansArabic lacks the glyph of U+069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE -->
     <Key
-        latin:keyLabel="&#x0634;"
+        latin:keySpec="&#x0634;"
         latin:moreKeys="&#x069C;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0633: "س" ARABIC LETTER SEEN -->
     <Key
-        latin:keyLabel="&#x0633;"
+        latin:keySpec="&#x0633;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+064A: "ي" ARABIC LETTER YEH
          U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE
          U+0649: "ى" ARABIC LETTER ALEF MAKSURA -->
     <Key
-        latin:keyLabel="&#x064A;"
+        latin:keySpec="&#x064A;"
         latin:moreKeys="&#x0626;,&#x0649;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0628: "ب" ARABIC LETTER BEH
          U+067E: "پ" ARABIC LETTER PEH -->
     <Key
-        latin:keyLabel="&#x0628;"
+        latin:keySpec="&#x0628;"
         latin:moreKeys="&#x067E;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0644: "ل" ARABIC LETTER LAM
@@ -55,7 +55,7 @@
          U+FEF5: "ﻵ" ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
          U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE -->
     <Key
-        latin:keyLabel="&#x0644;"
+        latin:keySpec="&#x0644;"
         latin:moreKeys="&#xFEFB;|&#x0644;&#x0627;,&#xFEF7;|&#x0644;&#x0623;,&#xFEF9;|&#x0644;&#x0625;,&#xFEF5;|&#x0644;&#x0622;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0627: "ا" ARABIC LETTER ALEF
@@ -65,30 +65,30 @@
          U+0625: "إ" ARABIC LETTER ALEF WITH HAMZA BELOW
          U+0671: "ٱ" ARABIC LETTER ALEF WASLA -->
     <Key
-        latin:keyLabel="&#x0627;"
+        latin:keySpec="&#x0627;"
         latin:moreKeys="!fixedColumnOrder!5,&#x0622;,&#x0621;,&#x0623;,&#x0625;,&#x0671;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062A: "ت" ARABIC LETTER TEH -->
     <Key
-        latin:keyLabel="&#x062A;"
+        latin:keySpec="&#x062A;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0646: "ن" ARABIC LETTER NOON -->
     <Key
-        latin:keyLabel="&#x0646;"
+        latin:keySpec="&#x0646;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0645: "م" ARABIC LETTER MEEM -->
     <Key
-        latin:keyLabel="&#x0645;"
+        latin:keySpec="&#x0645;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0643: "ك" ARABIC LETTER KAF
          U+06AF: "گ" ARABIC LETTER GAF
          U+06A9: "ک" ARABIC LETTER KEHEH -->
     <Key
-        latin:keyLabel="&#x0643;"
+        latin:keySpec="&#x0643;"
         latin:moreKeys="&#x06AF;,&#x06A9;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0637: "ط" ARABIC LETTER TAH -->
     <Key
-        latin:keyLabel="&#x0637;"
+        latin:keySpec="&#x0637;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_arabic3.xml b/java/res/xml/rowkeys_arabic3.xml
index 8a17b4b..0bfc66a 100644
--- a/java/res/xml/rowkeys_arabic3.xml
+++ b/java/res/xml/rowkeys_arabic3.xml
@@ -25,42 +25,42 @@
         latin:keyboardLayout="@xml/keys_arabic3_left" />
     <!-- U+0621: "ء" ARABIC LETTER HAMZA -->
     <Key
-        latin:keyLabel="&#x0621;"
+        latin:keySpec="&#x0621;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0624: "ؤ" ARABIC LETTER WAW WITH HAMZA ABOVE -->
     <Key
-        latin:keyLabel="&#x0624;"
+        latin:keySpec="&#x0624;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0631: "ر" ARABIC LETTER REH -->
     <Key
-        latin:keyLabel="&#x0631;"
+        latin:keySpec="&#x0631;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0649: "ى" ARABIC LETTER ALEF MAKSURA
          U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE -->
     <Key
-        latin:keyLabel="&#x0649;"
+        latin:keySpec="&#x0649;"
         latin:moreKeys="&#x0626;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0629: "ة" ARABIC LETTER TEH MARBUTA -->
     <Key
-        latin:keyLabel="&#x0629;"
+        latin:keySpec="&#x0629;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0648: "و" ARABIC LETTER WAW -->
     <Key
-        latin:keyLabel="&#x0648;"
+        latin:keySpec="&#x0648;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0632: "ز" ARABIC LETTER ZAIN
          U+0698: "ژ" ARABIC LETTER JEH -->
     <Key
-        latin:keyLabel="&#x0632;"
+        latin:keySpec="&#x0632;"
         latin:moreKeys="&#x0698;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0638: "ظ" ARABIC LETTER ZAH -->
     <Key
-        latin:keyLabel="&#x0638;"
+        latin:keySpec="&#x0638;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062F: "د" ARABIC LETTER DAL -->
     <Key
-        latin:keyLabel="&#x062F;"
+        latin:keySpec="&#x062F;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_armenian_phonetic1.xml b/java/res/xml/rowkeys_armenian_phonetic1.xml
index 1984fae..8ca78da 100644
--- a/java/res/xml/rowkeys_armenian_phonetic1.xml
+++ b/java/res/xml/rowkeys_armenian_phonetic1.xml
@@ -23,61 +23,61 @@
 >
     <!-- U+0567: "է" ARMENIAN SMALL LETTER EH -->
     <Key
-        latin:keyLabel="&#x0567;"
+        latin:keySpec="&#x0567;"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0569: "թ" ARMENIAN SMALL LETTER TO -->
     <Key
-        latin:keyLabel="&#x0569;"
+        latin:keySpec="&#x0569;"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0583: "փ" ARMENIAN SMALL LETTER PIWR -->
     <Key
-        latin:keyLabel="&#x0583;"
+        latin:keySpec="&#x0583;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0571: "ձ" ARMENIAN SMALL LETTER JA -->
     <Key
-        latin:keyLabel="&#x0571;"
+        latin:keySpec="&#x0571;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+057B: "ջ" ARMENIAN SMALL LETTER JHEH -->
     <Key
-        latin:keyLabel="&#x057B;"
+        latin:keySpec="&#x057B;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0580: "ր" ARMENIAN SMALL LETTER REH -->
     <Key
-        latin:keyLabel="&#x0580;"
+        latin:keySpec="&#x0580;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0579: "չ" ARMENIAN SMALL LETTER CHA -->
     <Key
-        latin:keyLabel="&#x0579;"
+        latin:keySpec="&#x0579;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0573: "ճ" ARMENIAN SMALL LETTER CHEH -->
     <Key
-        latin:keyLabel="&#x0573;"
+        latin:keySpec="&#x0573;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+056A: "ժ" ARMENIAN SMALL LETTER ZHE -->
     <Key
-        latin:keyLabel="&#x056A;"
+        latin:keySpec="&#x056A;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+056E: "ծ" ARMENIAN SMALL LETTER CA -->
     <Key
-        latin:keyLabel="&#x056E;"
+        latin:keySpec="&#x056E;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0"
         latin:keyLabelFlags="fontNormal" />
diff --git a/java/res/xml/rowkeys_armenian_phonetic2.xml b/java/res/xml/rowkeys_armenian_phonetic2.xml
index 3764d0d..9991f73 100644
--- a/java/res/xml/rowkeys_armenian_phonetic2.xml
+++ b/java/res/xml/rowkeys_armenian_phonetic2.xml
@@ -23,45 +23,45 @@
 >
     <!-- U+0584: "ք" ARMENIAN SMALL LETTER KEH -->
     <Key
-        latin:keyLabel="&#x0584;"
+        latin:keySpec="&#x0584;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0578: "ո" ARMENIAN SMALL LETTER VO -->
     <Key
-        latin:keyLabel="&#x0578;"
+        latin:keySpec="&#x0578;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0565: "ե" ARMENIAN SMALL LETTER ECH
          U+0587: "և" ARMENIAN SMALL LIGATURE ECH YIWN -->
     <Key
-        latin:keyLabel="&#x0565;"
+        latin:keySpec="&#x0565;"
         latin:moreKeys="&#x0587;"
         latin:keyHintLabel="&#x0587;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+057C: "ռ" ARMENIAN SMALL LETTER RA -->
     <Key
-        latin:keyLabel="&#x057C;"
+        latin:keySpec="&#x057C;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+057F: "տ" ARMENIAN SMALL LETTER TIWN -->
     <Key
-        latin:keyLabel="&#x057F;"
+        latin:keySpec="&#x057F;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0568: "ը" ARMENIAN SMALL LETTER ET -->
     <Key
-        latin:keyLabel="&#x0568;"
+        latin:keySpec="&#x0568;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0582: "ւ" ARMENIAN SMALL LETTER YIWN -->
     <Key
-        latin:keyLabel="&#x0582;"
+        latin:keySpec="&#x0582;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+056B: "ի" ARMENIAN SMALL LETTER INI -->
     <Key
-        latin:keyLabel="&#x056B;"
+        latin:keySpec="&#x056B;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0585: "օ" ARMENIAN SMALL LETTER OH -->
     <Key
-        latin:keyLabel="&#x0585;"
+        latin:keySpec="&#x0585;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+057A: "պ" ARMENIAN SMALL LETTER PEH -->
     <Key
-        latin:keyLabel="&#x057A;"
+        latin:keySpec="&#x057A;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_armenian_phonetic3.xml b/java/res/xml/rowkeys_armenian_phonetic3.xml
index 3116811..2b79386 100644
--- a/java/res/xml/rowkeys_armenian_phonetic3.xml
+++ b/java/res/xml/rowkeys_armenian_phonetic3.xml
@@ -23,38 +23,38 @@
 >
     <!-- U+0561: "ա" ARMENIAN SMALL LETTER AYB -->
     <Key
-        latin:keyLabel="&#x0561;"
+        latin:keySpec="&#x0561;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+057D: "ս" ARMENIAN SMALL LETTER SEH -->
     <Key
-        latin:keyLabel="&#x057D;"
+        latin:keySpec="&#x057D;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0564: "դ" ARMENIAN SMALL LETTER DA -->
     <Key
-        latin:keyLabel="&#x0564;"
+        latin:keySpec="&#x0564;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0586: "ֆ" ARMENIAN SMALL LETTER FEH -->
     <Key
-        latin:keyLabel="&#x0586;"
+        latin:keySpec="&#x0586;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0563: "գ" ARMENIAN SMALL LETTER GIM -->
     <Key
-        latin:keyLabel="&#x0563;"
+        latin:keySpec="&#x0563;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0570: "հ" ARMENIAN SMALL LETTER HO -->
     <Key
-        latin:keyLabel="&#x0570;"
+        latin:keySpec="&#x0570;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0575: "յ" ARMENIAN SMALL LETTER YI -->
     <Key
-        latin:keyLabel="&#x0575;"
+        latin:keySpec="&#x0575;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+056F: "կ" ARMENIAN SMALL LETTER KEN -->
     <Key
-        latin:keyLabel="&#x056F;"
+        latin:keySpec="&#x056F;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+056C: "լ" ARMENIAN SMALL LETTER LIWN -->
     <Key
-        latin:keyLabel="&#x056C;"
+        latin:keySpec="&#x056C;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_armenian_phonetic4.xml b/java/res/xml/rowkeys_armenian_phonetic4.xml
index 922481a..f8cdd12 100644
--- a/java/res/xml/rowkeys_armenian_phonetic4.xml
+++ b/java/res/xml/rowkeys_armenian_phonetic4.xml
@@ -23,30 +23,30 @@
 >
     <!-- U+0566: "զ" ARMENIAN SMALL LETTER ZA -->
     <Key
-        latin:keyLabel="&#x0566;"
+        latin:keySpec="&#x0566;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0572: "ղ" ARMENIAN SMALL LETTER GHAD -->
     <Key
-        latin:keyLabel="&#x0572;"
+        latin:keySpec="&#x0572;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0581: "ց" ARMENIAN SMALL LETTER CO -->
     <Key
-        latin:keyLabel="&#x0581;"
+        latin:keySpec="&#x0581;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+057E: "վ" ARMENIAN SMALL LETTER VEW -->
     <Key
-        latin:keyLabel="&#x057E;"
+        latin:keySpec="&#x057E;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0562: "բ" ARMENIAN SMALL LETTER BEN -->
     <Key
-        latin:keyLabel="&#x0562;"
+        latin:keySpec="&#x0562;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0576: "ն" ARMENIAN SMALL LETTER NOW -->
     <Key
-        latin:keyLabel="&#x0576;"
+        latin:keySpec="&#x0576;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0574: "մ" ARMENIAN SMALL LETTER MEN -->
     <Key
-        latin:keyLabel="&#x0574;"
+        latin:keySpec="&#x0574;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_azerty1.xml b/java/res/xml/rowkeys_azerty1.xml
index 42b2746..adb66b7 100644
--- a/java/res/xml/rowkeys_azerty1.xml
+++ b/java/res/xml/rowkeys_azerty1.xml
@@ -22,52 +22,52 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="a"
+        latin:keySpec="a"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1"
         latin:moreKeys="!text/more_keys_for_a" />
     <Key
-        latin:keyLabel="z"
+        latin:keySpec="z"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2"
         latin:moreKeys="!text/more_keys_for_z" />
     <Key
-        latin:keyLabel="e"
+        latin:keySpec="e"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:moreKeys="!text/more_keys_for_e" />
     <Key
-        latin:keyLabel="r"
+        latin:keySpec="r"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4"
         latin:moreKeys="!text/more_keys_for_r" />
     <Key
-        latin:keyLabel="t"
+        latin:keySpec="t"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5"
         latin:moreKeys="!text/more_keys_for_t" />
     <Key
-        latin:keyLabel="y"
+        latin:keySpec="y"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6"
         latin:moreKeys="!text/more_keys_for_y" />
     <Key
-        latin:keyLabel="u"
+        latin:keySpec="u"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7"
         latin:moreKeys="!text/more_keys_for_u" />
     <Key
-        latin:keyLabel="i"
+        latin:keySpec="i"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="!text/more_keys_for_i" />
     <Key
-        latin:keyLabel="o"
+        latin:keySpec="o"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9"
         latin:moreKeys="!text/more_keys_for_o" />
     <Key
-        latin:keyLabel="p"
+        latin:keySpec="p"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
 </merge>
diff --git a/java/res/xml/rowkeys_azerty2.xml b/java/res/xml/rowkeys_azerty2.xml
index 2eee214..db06867 100644
--- a/java/res/xml/rowkeys_azerty2.xml
+++ b/java/res/xml/rowkeys_azerty2.xml
@@ -22,30 +22,30 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="q" />
+        latin:keySpec="q" />
     <Key
-        latin:keyLabel="s"
+        latin:keySpec="s"
         latin:moreKeys="!text/more_keys_for_s" />
     <Key
-        latin:keyLabel="d"
+        latin:keySpec="d"
         latin:moreKeys="!text/more_keys_for_d" />
     <Key
-        latin:keyLabel="f" />
+        latin:keySpec="f" />
     <Key
-        latin:keyLabel="g"
+        latin:keySpec="g"
         latin:moreKeys="!text/more_keys_for_g" />
     <Key
-        latin:keyLabel="h"
+        latin:keySpec="h"
         latin:moreKeys="!text/more_keys_for_h" />
     <Key
-        latin:keyLabel="j"
+        latin:keySpec="j"
         latin:moreKeys="!text/more_keys_for_j" />
     <Key
-        latin:keyLabel="k"
+        latin:keySpec="k"
         latin:moreKeys="!text/more_keys_for_k" />
     <Key
-        latin:keyLabel="l"
+        latin:keySpec="l"
         latin:moreKeys="!text/more_keys_for_l" />
     <Key
-        latin:keyLabel="m" />
+        latin:keySpec="m" />
 </merge>
diff --git a/java/res/xml/rowkeys_azerty3.xml b/java/res/xml/rowkeys_azerty3.xml
index 2643f32..0aa2153 100644
--- a/java/res/xml/rowkeys_azerty3.xml
+++ b/java/res/xml/rowkeys_azerty3.xml
@@ -22,20 +22,20 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="w"
+        latin:keySpec="w"
         latin:moreKeys="!text/more_keys_for_w" />
     <Key
-        latin:keyLabel="x" />
+        latin:keySpec="x" />
     <Key
-        latin:keyLabel="c"
+        latin:keySpec="c"
         latin:moreKeys="!text/more_keys_for_c" />
     <Key
-        latin:keyLabel="v"
+        latin:keySpec="v"
         latin:moreKeys="!text/more_keys_for_v" />
     <Key
-        latin:keyLabel="b" />
+        latin:keySpec="b" />
     <Key
-        latin:keyLabel="n"
+        latin:keySpec="n"
         latin:moreKeys="!text/more_keys_for_n" />
     <include
         latin:keyboardLayout="@xml/key_azerty3_right" />
diff --git a/java/res/xml/rowkeys_bulgarian1.xml b/java/res/xml/rowkeys_bulgarian1.xml
index 441b079..e847193 100644
--- a/java/res/xml/rowkeys_bulgarian1.xml
+++ b/java/res/xml/rowkeys_bulgarian1.xml
@@ -23,57 +23,57 @@
 >
     <!-- U+044F: "я" CYRILLIC SMALL LETTER YA -->
     <Key
-        latin:keyLabel="&#x044F;"
+        latin:keySpec="&#x044F;"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1" />
     <!-- U+0432: "в" CYRILLIC SMALL LETTER VE -->
     <Key
-        latin:keyLabel="&#x0432;"
+        latin:keySpec="&#x0432;"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2" />
     <!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
     <Key
-        latin:keyLabel="&#x0435;"
+        latin:keySpec="&#x0435;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3" />
     <!-- U+0440: "р" CYRILLIC SMALL LETTER ER -->
     <Key
-        latin:keyLabel="&#x0440;"
+        latin:keySpec="&#x0440;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
     <!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
     <Key
-        latin:keyLabel="&#x0442;"
+        latin:keySpec="&#x0442;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5" />
     <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
     <Key
-        latin:keyLabel="&#x044A;"
+        latin:keySpec="&#x044A;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6" />
     <!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
     <Key
-        latin:keyLabel="&#x0443;"
+        latin:keySpec="&#x0443;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7" />
     <!-- U+0438: "и" CYRILLIC SMALL LETTER I
          U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE -->
     <Key
-        latin:keyLabel="&#x0438;"
+        latin:keySpec="&#x0438;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="&#x045D;" />
     <!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
     <Key
-        latin:keyLabel="&#x043E;"
+        latin:keySpec="&#x043E;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9" />
     <!-- U+043F: "п" CYRILLIC SMALL LETTER PE -->
     <Key
-        latin:keyLabel="&#x043F;"
+        latin:keySpec="&#x043F;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
     <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE -->
     <Key
-        latin:keyLabel="&#x0447;" />
+        latin:keySpec="&#x0447;" />
 </merge>
diff --git a/java/res/xml/rowkeys_bulgarian2.xml b/java/res/xml/rowkeys_bulgarian2.xml
index a4e93d8..e572a22 100644
--- a/java/res/xml/rowkeys_bulgarian2.xml
+++ b/java/res/xml/rowkeys_bulgarian2.xml
@@ -23,35 +23,35 @@
 >
     <!-- U+0430: "а" CYRILLIC SMALL LETTER A -->
     <Key
-        latin:keyLabel="&#x0430;" />
+        latin:keySpec="&#x0430;" />
     <!-- U+0441: "с" CYRILLIC SMALL LETTER ES -->
     <Key
-        latin:keyLabel="&#x0441;" />
+        latin:keySpec="&#x0441;" />
     <!-- U+0434: "д" CYRILLIC SMALL LETTER DE -->
     <Key
-        latin:keyLabel="&#x0434;" />
+        latin:keySpec="&#x0434;" />
     <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF -->
     <Key
-        latin:keyLabel="&#x0444;" />
+        latin:keySpec="&#x0444;" />
     <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE -->
     <Key
-        latin:keyLabel="&#x0433;" />
+        latin:keySpec="&#x0433;" />
     <!-- U+0445: "х" CYRILLIC SMALL LETTER HA -->
     <Key
-        latin:keyLabel="&#x0445;" />
+        latin:keySpec="&#x0445;" />
     <!-- U+0439: "й" CYRILLIC SMALL LETTER SHORT I -->
     <Key
-        latin:keyLabel="&#x0439;" />
+        latin:keySpec="&#x0439;" />
     <!-- U+043A: "к" CYRILLIC SMALL LETTER KA -->
     <Key
-        latin:keyLabel="&#x043A;" />
+        latin:keySpec="&#x043A;" />
     <!-- U+043B: "л" CYRILLIC SMALL LETTER EL -->
     <Key
-        latin:keyLabel="&#x043B;" />
+        latin:keySpec="&#x043B;" />
     <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA -->
     <Key
-        latin:keyLabel="&#x0448;" />
+        latin:keySpec="&#x0448;" />
     <!-- U+0449: "щ" CYRILLIC SMALL LETTER SHCHA -->
     <Key
-        latin:keyLabel="&#x0449;" />
+        latin:keySpec="&#x0449;" />
 </merge>
diff --git a/java/res/xml/rowkeys_bulgarian3.xml b/java/res/xml/rowkeys_bulgarian3.xml
index 258219c..2509793 100644
--- a/java/res/xml/rowkeys_bulgarian3.xml
+++ b/java/res/xml/rowkeys_bulgarian3.xml
@@ -23,26 +23,26 @@
 >
     <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
     <Key
-        latin:keyLabel="&#x0437;" />
+        latin:keySpec="&#x0437;" />
     <!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN -->
     <Key
-        latin:keyLabel="&#x044C;" />
+        latin:keySpec="&#x044C;" />
     <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE -->
     <Key
-        latin:keyLabel="&#x0446;" />
+        latin:keySpec="&#x0446;" />
     <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE -->
     <Key
-        latin:keyLabel="&#x0436;" />
+        latin:keySpec="&#x0436;" />
     <!-- U+0431: "б" CYRILLIC SMALL LETTER BE -->
     <Key
-        latin:keyLabel="&#x0431;" />
+        latin:keySpec="&#x0431;" />
     <!-- U+043D: "н" CYRILLIC SMALL LETTER EN -->
     <Key
-        latin:keyLabel="&#x043D;" />
+        latin:keySpec="&#x043D;" />
     <!-- U+043C: "м" CYRILLIC SMALL LETTER EM -->
     <Key
-        latin:keyLabel="&#x043C;" />
+        latin:keySpec="&#x043C;" />
     <!-- U+044E: "ю" CYRILLIC SMALL LETTER YU -->
     <Key
-        latin:keyLabel="&#x044E;" />
+        latin:keySpec="&#x044E;" />
 </merge>
diff --git a/java/res/xml/rowkeys_bulgarian_bds1.xml b/java/res/xml/rowkeys_bulgarian_bds1.xml
index eed1fcb..9d64282 100644
--- a/java/res/xml/rowkeys_bulgarian_bds1.xml
+++ b/java/res/xml/rowkeys_bulgarian_bds1.xml
@@ -23,57 +23,57 @@
 >
     <!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
     <Key
-        latin:keyLabel="&#x0443;"
+        latin:keySpec="&#x0443;"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1" />
     <!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
     <Key
-        latin:keyLabel="&#x0435;"
+        latin:keySpec="&#x0435;"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2" />
     <!-- U+0438: "и" CYRILLIC SMALL LETTER I
          U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE -->
     <Key
-        latin:keyLabel="&#x0438;"
+        latin:keySpec="&#x0438;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:moreKeys="&#x045D;" />
     <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA -->
     <Key
-        latin:keyLabel="&#x0448;"
+        latin:keySpec="&#x0448;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
     <!-- U+0449: "щ" CYRILLIC SMALL LETTER SHCHA -->
     <Key
-        latin:keyLabel="&#x0449;"
+        latin:keySpec="&#x0449;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5" />
     <!-- U+043A: "к" CYRILLIC SMALL LETTER KA -->
     <Key
-        latin:keyLabel="&#x043A;"
+        latin:keySpec="&#x043A;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6" />
     <!-- U+0441: "с" CYRILLIC SMALL LETTER ES -->
     <Key
-        latin:keyLabel="&#x0441;"
+        latin:keySpec="&#x0441;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7" />
     <!-- U+0434: "д" CYRILLIC SMALL LETTER DE -->
     <Key
-        latin:keyLabel="&#x0434;"
+        latin:keySpec="&#x0434;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8" />
     <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
     <Key
-        latin:keyLabel="&#x0437;"
+        latin:keySpec="&#x0437;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9" />
     <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE -->
     <Key
-        latin:keyLabel="&#x0446;"
+        latin:keySpec="&#x0446;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
     <!-- U+0431: "б" CYRILLIC SMALL LETTER BE -->
     <Key
-        latin:keyLabel="&#x0431;" />
+        latin:keySpec="&#x0431;" />
 </merge>
diff --git a/java/res/xml/rowkeys_bulgarian_bds2.xml b/java/res/xml/rowkeys_bulgarian_bds2.xml
index ff1bff8..e078ae7 100644
--- a/java/res/xml/rowkeys_bulgarian_bds2.xml
+++ b/java/res/xml/rowkeys_bulgarian_bds2.xml
@@ -23,35 +23,35 @@
 >
     <!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN -->
     <Key
-        latin:keyLabel="&#x044C;" />
+        latin:keySpec="&#x044C;" />
     <!-- U+044F: "я" CYRILLIC SMALL LETTER YA -->
     <Key
-        latin:keyLabel="&#x044F;" />
+        latin:keySpec="&#x044F;" />
     <!-- U+0430: "а" CYRILLIC SMALL LETTER A -->
     <Key
-        latin:keyLabel="&#x0430;" />
+        latin:keySpec="&#x0430;" />
     <!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
     <Key
-        latin:keyLabel="&#x043E;" />
+        latin:keySpec="&#x043E;" />
     <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE -->
     <Key
-        latin:keyLabel="&#x0436;" />
+        latin:keySpec="&#x0436;" />
     <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE -->
     <Key
-        latin:keyLabel="&#x0433;" />
+        latin:keySpec="&#x0433;" />
     <!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
     <Key
-        latin:keyLabel="&#x0442;" />
+        latin:keySpec="&#x0442;" />
     <!-- U+043D: "н" CYRILLIC SMALL LETTER EN -->
     <Key
-        latin:keyLabel="&#x043D;" />
+        latin:keySpec="&#x043D;" />
     <!-- U+0432: "в" CYRILLIC SMALL LETTER VE -->
     <Key
-        latin:keyLabel="&#x0432;" />
+        latin:keySpec="&#x0432;" />
     <!-- U+043C: "м" CYRILLIC SMALL LETTER EM -->
     <Key
-        latin:keyLabel="&#x043C;" />
+        latin:keySpec="&#x043C;" />
     <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE -->
     <Key
-        latin:keyLabel="&#x0447;" />
+        latin:keySpec="&#x0447;" />
 </merge>
diff --git a/java/res/xml/rowkeys_bulgarian_bds3.xml b/java/res/xml/rowkeys_bulgarian_bds3.xml
index 7bb780a..8302d69 100644
--- a/java/res/xml/rowkeys_bulgarian_bds3.xml
+++ b/java/res/xml/rowkeys_bulgarian_bds3.xml
@@ -23,29 +23,29 @@
 >
     <!-- U+044E: "ю" CYRILLIC SMALL LETTER YU -->
     <Key
-        latin:keyLabel="&#x044E;" />
+        latin:keySpec="&#x044E;" />
     <!-- U+0439: "й" CYRILLIC SMALL LETTER SHORT I -->
     <Key
-        latin:keyLabel="&#x0439;" />
+        latin:keySpec="&#x0439;" />
     <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
     <Key
-        latin:keyLabel="&#x044A;" />
+        latin:keySpec="&#x044A;" />
     <!-- U+044D: "э" CYRILLIC SMALL LETTER E -->
     <Key
-        latin:keyLabel="&#x044D;" />
+        latin:keySpec="&#x044D;" />
     <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF -->
     <Key
-        latin:keyLabel="&#x0444;" />
+        latin:keySpec="&#x0444;" />
     <!-- U+0445: "х" CYRILLIC SMALL LETTER HA -->
     <Key
-        latin:keyLabel="&#x0445;" />
+        latin:keySpec="&#x0445;" />
     <!-- U+043F: "п" CYRILLIC SMALL LETTER PE -->
     <Key
-        latin:keyLabel="&#x043F;" />
+        latin:keySpec="&#x043F;" />
     <!-- U+0440: "р" CYRILLIC SMALL LETTER ER -->
     <Key
-        latin:keyLabel="&#x0440;" />
+        latin:keySpec="&#x0440;" />
     <!-- U+043B: "л" CYRILLIC SMALL LETTER EL -->
     <Key
-        latin:keyLabel="&#x043B;" />
+        latin:keySpec="&#x043B;" />
 </merge>
diff --git a/java/res/xml/rowkeys_colemak1.xml b/java/res/xml/rowkeys_colemak1.xml
index f1c3075..819a69d 100644
--- a/java/res/xml/rowkeys_colemak1.xml
+++ b/java/res/xml/rowkeys_colemak1.xml
@@ -22,44 +22,44 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="q"
+        latin:keySpec="q"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1" />
     <Key
-        latin:keyLabel="w"
+        latin:keySpec="w"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2"
         latin:moreKeys="!text/more_keys_for_w" />
     <Key
-        latin:keyLabel="f"
+        latin:keySpec="f"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3" />
     <Key
-        latin:keyLabel="p"
+        latin:keySpec="p"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
     <Key
-        latin:keyLabel="g"
+        latin:keySpec="g"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5"
         latin:moreKeys="!text/more_keys_for_g" />
     <Key
-        latin:keyLabel="j"
+        latin:keySpec="j"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6"
         latin:moreKeys="!text/more_keys_for_j" />
     <Key
-        latin:keyLabel="l"
+        latin:keySpec="l"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7"
         latin:moreKeys="!text/more_keys_for_l" />
     <Key
-        latin:keyLabel="u"
+        latin:keySpec="u"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="!text/more_keys_for_u" />
     <Key
-        latin:keyLabel="y"
+        latin:keySpec="y"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9"
         latin:moreKeys="!text/more_keys_for_y" />
diff --git a/java/res/xml/rowkeys_colemak2.xml b/java/res/xml/rowkeys_colemak2.xml
index f73d7e9..644d845 100644
--- a/java/res/xml/rowkeys_colemak2.xml
+++ b/java/res/xml/rowkeys_colemak2.xml
@@ -22,33 +22,33 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="a"
+        latin:keySpec="a"
         latin:moreKeys="!text/more_keys_for_a" />
     <Key
-        latin:keyLabel="r"
+        latin:keySpec="r"
         latin:moreKeys="!text/more_keys_for_r" />
     <Key
-        latin:keyLabel="s"
+        latin:keySpec="s"
         latin:moreKeys="!text/more_keys_for_s" />
     <Key
-        latin:keyLabel="t"
+        latin:keySpec="t"
         latin:moreKeys="!text/more_keys_for_t" />
     <Key
-        latin:keyLabel="d"
+        latin:keySpec="d"
         latin:moreKeys="!text/more_keys_for_d" />
     <Key
-        latin:keyLabel="h"
+        latin:keySpec="h"
         latin:moreKeys="!text/more_keys_for_h" />
     <Key
-        latin:keyLabel="n"
+        latin:keySpec="n"
         latin:moreKeys="!text/more_keys_for_n" />
     <Key
-        latin:keyLabel="e"
+        latin:keySpec="e"
         latin:moreKeys="!text/more_keys_for_e" />
     <Key
-        latin:keyLabel="i"
+        latin:keySpec="i"
         latin:moreKeys="!text/more_keys_for_i" />
     <Key
-        latin:keyLabel="o"
+        latin:keySpec="o"
         latin:moreKeys="!text/more_keys_for_o" />
 </merge>
diff --git a/java/res/xml/rowkeys_colemak3.xml b/java/res/xml/rowkeys_colemak3.xml
index f0f9151..946910c 100644
--- a/java/res/xml/rowkeys_colemak3.xml
+++ b/java/res/xml/rowkeys_colemak3.xml
@@ -22,21 +22,21 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="z"
+        latin:keySpec="z"
         latin:moreKeys="!text/more_keys_for_z" />
     <Key
-        latin:keyLabel="x" />
+        latin:keySpec="x" />
     <Key
-        latin:keyLabel="c"
+        latin:keySpec="c"
         latin:moreKeys="!text/more_keys_for_c" />
     <Key
-        latin:keyLabel="v"
+        latin:keySpec="v"
         latin:moreKeys="!text/more_keys_for_v" />
     <Key
-        latin:keyLabel="b" />
+        latin:keySpec="b" />
     <Key
-        latin:keyLabel="k"
+        latin:keySpec="k"
         latin:moreKeys="!text/more_keys_for_k" />
     <Key
-        latin:keyLabel="m" />
+        latin:keySpec="m" />
 </merge>
diff --git a/java/res/xml/rowkeys_dvorak1.xml b/java/res/xml/rowkeys_dvorak1.xml
index 033308a..831bfaf 100644
--- a/java/res/xml/rowkeys_dvorak1.xml
+++ b/java/res/xml/rowkeys_dvorak1.xml
@@ -24,35 +24,35 @@
     <include
         latin:keyboardLayout="@xml/keys_dvorak_123" />
     <Key
-        latin:keyLabel="p"
+        latin:keySpec="p"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
     <Key
-        latin:keyLabel="y"
+        latin:keySpec="y"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5"
         latin:moreKeys="!text/more_keys_for_y" />
     <Key
-        latin:keyLabel="f"
+        latin:keySpec="f"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6" />
     <Key
-        latin:keyLabel="g"
+        latin:keySpec="g"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7"
         latin:moreKeys="!text/more_keys_for_g" />
     <Key
-        latin:keyLabel="c"
+        latin:keySpec="c"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="!text/more_keys_for_c" />
     <Key
-        latin:keyLabel="r"
+        latin:keySpec="r"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9"
         latin:moreKeys="!text/more_keys_for_r" />
     <Key
-        latin:keyLabel="l"
+        latin:keySpec="l"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0"
         latin:moreKeys="!text/more_keys_for_l" />
diff --git a/java/res/xml/rowkeys_dvorak2.xml b/java/res/xml/rowkeys_dvorak2.xml
index 943e3f5..7c73473 100644
--- a/java/res/xml/rowkeys_dvorak2.xml
+++ b/java/res/xml/rowkeys_dvorak2.xml
@@ -22,33 +22,33 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="a"
+        latin:keySpec="a"
         latin:moreKeys="!text/more_keys_for_a" />
     <Key
-        latin:keyLabel="o"
+        latin:keySpec="o"
         latin:moreKeys="!text/more_keys_for_o" />
     <Key
-        latin:keyLabel="e"
+        latin:keySpec="e"
         latin:moreKeys="!text/more_keys_for_e" />
     <Key
-        latin:keyLabel="u"
+        latin:keySpec="u"
         latin:moreKeys="!text/more_keys_for_u" />
     <Key
-        latin:keyLabel="i"
+        latin:keySpec="i"
         latin:moreKeys="!text/more_keys_for_i" />
     <Key
-        latin:keyLabel="d"
+        latin:keySpec="d"
         latin:moreKeys="!text/more_keys_for_d" />
     <Key
-        latin:keyLabel="h"
+        latin:keySpec="h"
         latin:moreKeys="!text/more_keys_for_h" />
     <Key
-        latin:keyLabel="t"
+        latin:keySpec="t"
         latin:moreKeys="!text/more_keys_for_t" />
     <Key
-        latin:keyLabel="n"
+        latin:keySpec="n"
         latin:moreKeys="!text/more_keys_for_n" />
     <Key
-        latin:keyLabel="s"
+        latin:keySpec="s"
         latin:moreKeys="!text/more_keys_for_s" />
 </merge>
diff --git a/java/res/xml/rowkeys_dvorak3.xml b/java/res/xml/rowkeys_dvorak3.xml
index b035f41..a9da6b9 100644
--- a/java/res/xml/rowkeys_dvorak3.xml
+++ b/java/res/xml/rowkeys_dvorak3.xml
@@ -22,21 +22,21 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="j"
+        latin:keySpec="j"
         latin:moreKeys="!text/more_keys_for_j" />
     <Key
-        latin:keyLabel="k"
+        latin:keySpec="k"
         latin:moreKeys="!text/more_keys_for_k" />
     <Key
-        latin:keyLabel="x" />
+        latin:keySpec="x" />
     <Key
-        latin:keyLabel="b" />
+        latin:keySpec="b" />
     <Key
-        latin:keyLabel="m" />
+        latin:keySpec="m" />
     <Key
-        latin:keyLabel="w"
+        latin:keySpec="w"
         latin:moreKeys="!text/more_keys_for_w" />
     <Key
-        latin:keyLabel="v"
+        latin:keySpec="v"
         latin:moreKeys="!text/more_keys_for_v" />
 </merge>
diff --git a/java/res/xml/rowkeys_east_slavic1.xml b/java/res/xml/rowkeys_east_slavic1.xml
index 5b3b4b4..7e95a8b 100644
--- a/java/res/xml/rowkeys_east_slavic1.xml
+++ b/java/res/xml/rowkeys_east_slavic1.xml
@@ -23,59 +23,59 @@
 >
     <!-- U+0439: "й" CYRILLIC SMALL LETTER SHORT I -->
     <Key
-        latin:keyLabel="&#x0439;"
+        latin:keySpec="&#x0439;"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1" />
     <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE -->
     <Key
-        latin:keyLabel="&#x0446;"
+        latin:keySpec="&#x0446;"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2" />
     <!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
     <Key
-        latin:keyLabel="&#x0443;"
+        latin:keySpec="&#x0443;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:moreKeys="!text/more_keys_for_cyrillic_u" />
     <!-- U+043A: "к" CYRILLIC SMALL LETTER KA -->
     <Key
-        latin:keyLabel="&#x043A;"
+        latin:keySpec="&#x043A;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4"
         latin:moreKeys="!text/more_keys_for_cyrillic_ka" />
     <!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
     <Key
-        latin:keyLabel="&#x0435;"
+        latin:keySpec="&#x0435;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5"
         latin:moreKeys="!text/more_keys_for_cyrillic_ie" />
     <!-- U+043D: "н" CYRILLIC SMALL LETTER EN -->
     <Key
-        latin:keyLabel="&#x043D;"
+        latin:keySpec="&#x043D;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6"
         latin:moreKeys="!text/more_keys_for_cyrillic_en" />
     <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE -->
     <Key
-        latin:keyLabel="&#x0433;"
+        latin:keySpec="&#x0433;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7"
         latin:moreKeys="!text/more_keys_for_cyrillic_ghe" />
     <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA -->
     <Key
-        latin:keyLabel="&#x0448;"
+        latin:keySpec="&#x0448;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8" />
     <Key
-        latin:keyLabel="!text/keylabel_for_east_slavic_row1_9"
+        latin:keySpec="!text/keylabel_for_east_slavic_row1_9"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9" />
     <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
     <Key
-        latin:keyLabel="&#x0437;"
+        latin:keySpec="&#x0437;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
     <!-- U+0445: "х" CYRILLIC SMALL LETTER HA -->
     <Key
-        latin:keyLabel="&#x0445;" />
+        latin:keySpec="&#x0445;" />
 </merge>
diff --git a/java/res/xml/rowkeys_east_slavic2.xml b/java/res/xml/rowkeys_east_slavic2.xml
index 2e412f0..20d963c 100644
--- a/java/res/xml/rowkeys_east_slavic2.xml
+++ b/java/res/xml/rowkeys_east_slavic2.xml
@@ -23,37 +23,37 @@
 >
     <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF -->
     <Key
-        latin:keyLabel="&#x0444;" />
+        latin:keySpec="&#x0444;" />
     <Key
-        latin:keyLabel="!text/keylabel_for_east_slavic_row2_1"
+        latin:keySpec="!text/keylabel_for_east_slavic_row2_1"
         latin:moreKeys="!text/more_keys_for_east_slavic_row2_1" />
     <!-- U+0432: "в" CYRILLIC SMALL LETTER VE -->
     <Key
-        latin:keyLabel="&#x0432;" />
+        latin:keySpec="&#x0432;" />
     <!-- U+0430: "а" CYRILLIC SMALL LETTER A -->
     <Key
-        latin:keyLabel="&#x0430;"
+        latin:keySpec="&#x0430;"
         latin:moreKeys="!text/more_keys_for_cyrillic_a" />
     <!-- U+043F: "п" CYRILLIC SMALL LETTER PE -->
     <Key
-        latin:keyLabel="&#x043F;" />
+        latin:keySpec="&#x043F;" />
     <!-- U+0440: "р" CYRILLIC SMALL LETTER ER -->
     <Key
-        latin:keyLabel="&#x0440;" />
+        latin:keySpec="&#x0440;" />
     <!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
     <Key
-        latin:keyLabel="&#x043E;"
+        latin:keySpec="&#x043E;"
         latin:moreKeys="!text/more_keys_for_cyrillic_o" />
     <!-- U+043B: "л" CYRILLIC SMALL LETTER EL -->
     <Key
-        latin:keyLabel="&#x043B;" />
+        latin:keySpec="&#x043B;" />
     <!-- U+0434: "д" CYRILLIC SMALL LETTER DE -->
     <Key
-        latin:keyLabel="&#x0434;" />
+        latin:keySpec="&#x0434;" />
     <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE -->
     <Key
-        latin:keyLabel="&#x0436;" />
+        latin:keySpec="&#x0436;" />
     <Key
-        latin:keyLabel="!text/keylabel_for_east_slavic_row2_11"
+        latin:keySpec="!text/keylabel_for_east_slavic_row2_11"
         latin:moreKeys="!text/more_keys_for_east_slavic_row2_11" />
 </merge>
diff --git a/java/res/xml/rowkeys_east_slavic3.xml b/java/res/xml/rowkeys_east_slavic3.xml
index c3a171b..b7d19b2 100644
--- a/java/res/xml/rowkeys_east_slavic3.xml
+++ b/java/res/xml/rowkeys_east_slavic3.xml
@@ -23,29 +23,29 @@
 >
     <!-- U+044F: "я" CYRILLIC SMALL LETTER YA -->
     <Key
-        latin:keyLabel="&#x044F;" />
+        latin:keySpec="&#x044F;" />
     <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE -->
     <Key
-        latin:keyLabel="&#x0447;" />
+        latin:keySpec="&#x0447;" />
     <!-- U+0441: "с" CYRILLIC SMALL LETTER ES -->
     <Key
-        latin:keyLabel="&#x0441;" />
+        latin:keySpec="&#x0441;" />
     <!-- U+043C: "м" CYRILLIC SMALL LETTER EM -->
     <Key
-        latin:keyLabel="&#x043C;" />
+        latin:keySpec="&#x043C;" />
     <Key
-        latin:keyLabel="!text/keylabel_for_east_slavic_row3_5" />
+        latin:keySpec="!text/keylabel_for_east_slavic_row3_5" />
     <!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
     <Key
-        latin:keyLabel="&#x0442;" />
+        latin:keySpec="&#x0442;" />
     <!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN -->
     <Key
-        latin:keyLabel="&#x044C;"
+        latin:keySpec="&#x044C;"
         latin:moreKeys="!text/more_keys_for_cyrillic_soft_sign" />
     <!-- U+0431: "б" CYRILLIC SMALL LETTER BE -->
     <Key
-        latin:keyLabel="&#x0431;" />
+        latin:keySpec="&#x0431;" />
     <!-- U+044E: "ю" CYRILLIC SMALL LETTER YU -->
     <Key
-        latin:keyLabel="&#x044E;" />
+        latin:keySpec="&#x044E;" />
 </merge>
diff --git a/java/res/xml/rowkeys_farsi1.xml b/java/res/xml/rowkeys_farsi1.xml
index 5a22a24..46fef42 100644
--- a/java/res/xml/rowkeys_farsi1.xml
+++ b/java/res/xml/rowkeys_farsi1.xml
@@ -24,49 +24,49 @@
     <!-- U+0636: "ض" ARABIC LETTER DAD
          U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE -->
     <Key
-        latin:keyLabel="&#x0636;"
+        latin:keySpec="&#x0636;"
         latin:keyHintLabel="&#x06F1;"
         latin:additionalMoreKeys="&#x06F1;,1"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0635: "ص" ARABIC LETTER SAD
          U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO -->
     <Key
-        latin:keyLabel="&#x0635;"
+        latin:keySpec="&#x0635;"
         latin:keyHintLabel="&#x06F2;"
         latin:additionalMoreKeys="&#x06F2;,2"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062B: "ث" ARABIC LETTER THEH
          U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE -->
     <Key
-        latin:keyLabel="&#x062B;"
+        latin:keySpec="&#x062B;"
         latin:keyHintLabel="&#x06F3;"
         latin:additionalMoreKeys="&#x06F3;,3"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0642: "ق" ARABIC LETTER QAF
          U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR -->
     <Key
-        latin:keyLabel="&#x0642;"
+        latin:keySpec="&#x0642;"
         latin:keyHintLabel="&#x06F4;"
         latin:additionalMoreKeys="&#x06F4;,4"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0641: "ف" ARABIC LETTER FEH
          U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE -->
     <Key
-        latin:keyLabel="&#x0641;"
+        latin:keySpec="&#x0641;"
         latin:keyHintLabel="&#x06F5;"
         latin:additionalMoreKeys="&#x06F5;,5"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+063A: "غ" ARABIC LETTER GHAIN
          U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX -->
     <Key
-        latin:keyLabel="&#x063A;"
+        latin:keySpec="&#x063A;"
         latin:keyHintLabel="&#x06F6;"
         latin:additionalMoreKeys="&#x06F6;,6"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0639: "ع" ARABIC LETTER AIN
          U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN -->
     <Key
-        latin:keyLabel="&#x0639;"
+        latin:keySpec="&#x0639;"
         latin:keyHintLabel="&#x06F7;"
         latin:additionalMoreKeys="&#x06F7;,7"
         latin:keyLabelFlags="fontNormal" />
@@ -77,7 +77,7 @@
          U+0629: "ة" ARABIC LETTER TEH MARBUTA
          U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT -->
     <Key
-        latin:keyLabel="&#x0647;"
+        latin:keySpec="&#x0647;"
         latin:moreKeys="&#xFEEB;|&#x0647;&#x200D;,&#x0647;&#x0654;,&#x0629;,%"
         latin:keyHintLabel="&#x06F8;"
         latin:additionalMoreKeys="&#x06F8;,8"
@@ -85,19 +85,19 @@
     <!-- U+062E: "خ" ARABIC LETTER KHAH
          U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE -->
     <Key
-        latin:keyLabel="&#x062E;"
+        latin:keySpec="&#x062E;"
         latin:keyHintLabel="&#x06F9;"
         latin:additionalMoreKeys="&#x06F9;,9"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062D: "ح" ARABIC LETTER HAH
          U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO -->
     <Key
-        latin:keyLabel="&#x062D;"
+        latin:keySpec="&#x062D;"
         latin:keyHintLabel="&#x06F0;"
         latin:additionalMoreKeys="&#x06F0;,0"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062C: "ج" ARABIC LETTER JEEM -->
     <Key
-        latin:keyLabel="&#x062C;"
+        latin:keySpec="&#x062C;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_farsi2.xml b/java/res/xml/rowkeys_farsi2.xml
index 590161f..f94ee8e 100644
--- a/java/res/xml/rowkeys_farsi2.xml
+++ b/java/res/xml/rowkeys_farsi2.xml
@@ -23,11 +23,11 @@
 >
     <!-- U+0634: "ش" ARABIC LETTER SHEEN -->
     <Key
-        latin:keyLabel="&#x0634;"
+        latin:keySpec="&#x0634;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0633: "س" ARABIC LETTER SEEN -->
     <Key
-        latin:keyLabel="&#x0633;"
+        latin:keySpec="&#x0633;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+06CC: "ی" ARABIC LETTER FARSI YEH
          U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE
@@ -35,16 +35,16 @@
          U+FBE8: "ﯨ" ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
          U+0649: "ى" ARABIC LETTER ALEF MAKSURA -->
     <Key
-        latin:keyLabel="&#x06CC;"
+        latin:keySpec="&#x06CC;"
         latin:moreKeys="&#x0626;,&#x064A;,&#xFBE8;|&#x0649;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0628: "ب" ARABIC LETTER BEH -->
     <Key
-        latin:keyLabel="&#x0628;"
+        latin:keySpec="&#x0628;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0644: "ل" ARABIC LETTER LAM -->
     <Key
-        latin:keyLabel="&#x0644;"
+        latin:keySpec="&#x0644;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0627: "ا" ARABIC LETTER ALEF
          U+0671: "ٱ" ARABIC LETTER ALEF WASLA
@@ -53,31 +53,31 @@
          U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
          U+0625: "إ" ARABIC LETTER ALEF WITH HAMZA BELOW -->
     <Key
-        latin:keyLabel="&#x0627;"
+        latin:keySpec="&#x0627;"
         latin:moreKeys="!fixedColumnOrder!5,&#x0671;,&#x0621;,&#x0622;,&#x0623;,&#x0625;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062A: "ت" ARABIC LETTER TEH
          U+0629: "ة": ARABIC LETTER TEH MARBUTA -->
     <Key
-        latin:keyLabel="&#x062A;"
+        latin:keySpec="&#x062A;"
         latin:moreKeys="&#x0629;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0646: "ن" ARABIC LETTER NOON -->
     <Key
-        latin:keyLabel="&#x0646;"
+        latin:keySpec="&#x0646;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0645: "م" ARABIC LETTER MEEM -->
     <Key
-        latin:keyLabel="&#x0645;"
+        latin:keySpec="&#x0645;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+06A9: "ک" ARABIC LETTER KEHEH
          U+0643: "ك" ARABIC LETTER KAF -->
     <Key
-        latin:keyLabel="&#x06A9;"
+        latin:keySpec="&#x06A9;"
         latin:moreKeys="&#x0643;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+06AF: "گ" ARABIC LETTER GAF -->
     <Key
-        latin:keyLabel="&#x06AF;"
+        latin:keySpec="&#x06AF;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_farsi3.xml b/java/res/xml/rowkeys_farsi3.xml
index 98949f4..edc22f9 100644
--- a/java/res/xml/rowkeys_farsi3.xml
+++ b/java/res/xml/rowkeys_farsi3.xml
@@ -23,40 +23,40 @@
 >
     <!-- U+0638: "ظ" ARABIC LETTER ZAH -->
     <Key
-        latin:keyLabel="&#x0638;"
+        latin:keySpec="&#x0638;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0637: "ط" ARABIC LETTER TAH -->
     <Key
-        latin:keyLabel="&#x0637;"
+        latin:keySpec="&#x0637;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0698: "ژ" ARABIC LETTER JEH -->
     <Key
-        latin:keyLabel="&#x0698;"
+        latin:keySpec="&#x0698;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0632: "ز" ARABIC LETTER ZAIN -->
     <Key
-        latin:keyLabel="&#x0632;"
+        latin:keySpec="&#x0632;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0631: "ر" ARABIC LETTER REH -->
     <Key
-        latin:keyLabel="&#x0631;"
+        latin:keySpec="&#x0631;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0630: "ذ" ARABIC LETTER THAL -->
     <Key
-        latin:keyLabel="&#x0630;"
+        latin:keySpec="&#x0630;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062F: "د" ARABIC LETTER DAL -->
     <Key
-        latin:keyLabel="&#x062F;"
+        latin:keySpec="&#x062F;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+067E: "پ" ARABIC LETTER PEH -->
     <Key
-        latin:keyLabel="&#x067E;"
+        latin:keySpec="&#x067E;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0648: "و" ARABIC LETTER WAW
          U+0624: "ؤ" ARABIC LETTER WAW WITH HAMZA ABOVE -->
     <Key
-        latin:keyLabel="&#x0648;"
+        latin:keySpec="&#x0648;"
         latin:moreKeys="&#x0624;"
         latin:keyLabelFlags="fontNormal" />
     <include
diff --git a/java/res/xml/rowkeys_georgian1.xml b/java/res/xml/rowkeys_georgian1.xml
index d31a4c7..c412aa3 100644
--- a/java/res/xml/rowkeys_georgian1.xml
+++ b/java/res/xml/rowkeys_georgian1.xml
@@ -26,104 +26,104 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel="Q"
+                latin:keySpec="Q"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1" />
             <!-- U+10ED: "ჭ" GEORGIAN LETTER CHAR -->
             <Key
-                latin:keyLabel="&#x10ED;"
+                latin:keySpec="&#x10ED;"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2" />
             <Key
-                latin:keyLabel="E"
+                latin:keySpec="E"
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3" />
             <!-- U+10E6: "ღ" GEORGIAN LETTER GHAN -->
             <Key
-                latin:keyLabel="&#x10E6;"
+                latin:keySpec="&#x10E6;"
                 latin:keyHintLabel="4"
                 latin:additionalMoreKeys="4" />
             <!-- U+10D7: "თ" GEORGIAN LETTER TAN -->
             <Key
-                latin:keyLabel="&#x10D7;"
+                latin:keySpec="&#x10D7;"
                 latin:keyHintLabel="5"
                 latin:additionalMoreKeys="5" />
             <Key
-                latin:keyLabel="Y"
+                latin:keySpec="Y"
                 latin:keyHintLabel="6"
                 latin:additionalMoreKeys="6" />
             <Key
-                latin:keyLabel="U"
+                latin:keySpec="U"
                 latin:keyHintLabel="7"
                 latin:additionalMoreKeys="7" />
             <Key
-                latin:keyLabel="I"
+                latin:keySpec="I"
                 latin:keyHintLabel="8"
                 latin:additionalMoreKeys="8" />
             <Key
-                latin:keyLabel="O"
+                latin:keySpec="O"
                 latin:keyHintLabel="9"
                 latin:additionalMoreKeys="9" />
             <Key
-                latin:keyLabel="P"
+                latin:keySpec="P"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="0" />
         </case>
         <default>
             <!-- U+10E5: "ქ" GEORGIAN LETTER GHAN -->
             <Key
-                latin:keyLabel="&#x10E5;"
+                latin:keySpec="&#x10E5;"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1" />
             <!-- U+10EC: "წ" GEORGIAN LETTER CIL -->
             <Key
-                latin:keyLabel="&#x10EC;"
+                latin:keySpec="&#x10EC;"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2" />
             <!-- U+10D4: "ე" GEORGIAN LETTER EN
                  U+10F1: "ჱ" GEORGIAN LETTER HE -->
             <Key
-                latin:keyLabel="&#x10D4;"
+                latin:keySpec="&#x10D4;"
                 latin:moreKeys="&#x10F1;"
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3" />
             <!-- U+10E0: "რ" GEORGIAN LETTER RAE -->
             <Key
-                latin:keyLabel="&#x10E0;"
+                latin:keySpec="&#x10E0;"
                 latin:keyHintLabel="4"
                 latin:additionalMoreKeys="4" />
             <!-- U+10E2: "ტ" GEORGIAN LETTER TAR -->
             <Key
-                latin:keyLabel="&#x10E2;"
+                latin:keySpec="&#x10E2;"
                 latin:keyHintLabel="5"
                 latin:additionalMoreKeys="5" />
             <!-- U+10E7: "ყ" GEORGIAN LETTER QAR
                  U+10F8: "ჸ" GEORGIAN LETTER ELIFI -->
             <Key
-                latin:keyLabel="&#x10E7;"
+                latin:keySpec="&#x10E7;"
                 latin:moreKeys="&#x10F8;"
                 latin:keyHintLabel="6"
                 latin:additionalMoreKeys="6" />
             <!-- U+10E3: "უ" GEORGIAN LETTER UN -->
             <Key
-                latin:keyLabel="&#x10E3;"
+                latin:keySpec="&#x10E3;"
                 latin:keyHintLabel="7"
                 latin:additionalMoreKeys="7" />
             <!-- U+10D8: "ი" GEORGIAN LETTER IN
                  U+10F2: "ჲ" GEORGIAN LETTER HIE -->
             <Key
-                latin:keyLabel="&#x10D8;"
+                latin:keySpec="&#x10D8;"
                 latin:moreKeys="&#x10F2;"
                 latin:keyHintLabel="8"
                 latin:additionalMoreKeys="8" />
             <!-- U+10DD: "ო" GEORGIAN LETTER ON -->
             <Key
-                latin:keyLabel="&#x10DD;"
+                latin:keySpec="&#x10DD;"
                 latin:keyHintLabel="9"
                 latin:additionalMoreKeys="9" />
             <!-- U+10DE: "პ" GEORGIAN LETTER PAR -->
             <Key
-                latin:keyLabel="&#x10DE;"
+                latin:keySpec="&#x10DE;"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="0" />
         </default>
diff --git a/java/res/xml/rowkeys_georgian2.xml b/java/res/xml/rowkeys_georgian2.xml
index cdccda3..162960d 100644
--- a/java/res/xml/rowkeys_georgian2.xml
+++ b/java/res/xml/rowkeys_georgian2.xml
@@ -26,64 +26,64 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel="A" />
+                latin:keySpec="A" />
             <!-- U+10E8: "შ" GEORGIAN LETTER SHIN -->
             <Key
-                latin:keyLabel="&#x10E8;" />
+                latin:keySpec="&#x10E8;" />
             <Key
-                latin:keyLabel="D" />
+                latin:keySpec="D" />
             <Key
-                latin:keyLabel="F" />
+                latin:keySpec="F" />
             <Key
-                latin:keyLabel="G" />
+                latin:keySpec="G" />
             <Key
-                latin:keyLabel="H" />
+                latin:keySpec="H" />
             <!-- U+10DF: "ჟ" GEORGIAN LETTER ZHAR -->
             <Key
-                latin:keyLabel="&#x10DF;" />
+                latin:keySpec="&#x10DF;" />
             <Key
-                latin:keyLabel="K" />
+                latin:keySpec="K" />
             <Key
-                latin:keyLabel="L" />
+                latin:keySpec="L" />
         </case>
         <default>
             <!-- U+10D0: "ა" GEORGIAN LETTER AN
                  U+10FA: "ჺ" GEORGIAN LETTER AIN -->
             <Key
-                latin:keyLabel="&#x10D0;"
+                latin:keySpec="&#x10D0;"
                 latin:moreKeys="&#x10FA;" />
             <!-- U+10E1: "ს" GEORGIAN LETTER SAN -->
             <Key
-                latin:keyLabel="&#x10E1;" />
+                latin:keySpec="&#x10E1;" />
             <!-- U+10D3: "დ" GEORGIAN LETTER DON -->
             <Key
-                latin:keyLabel="&#x10D3;" />
+                latin:keySpec="&#x10D3;" />
             <!-- U+10E4: "ფ" GEORGIAN LETTER PHAR
                  U+10F6: "ჶ" GEORGIAN LETTER FI -->
             <Key
-                latin:keyLabel="&#x10E4;"
+                latin:keySpec="&#x10E4;"
                 latin:moreKeys="&#x10F6;" />
             <!-- U+10D2: "გ" GEORGIAN LETTER GAN
                  U+10F9: "ჹ" GEORGIAN LETTER TURNED GAN -->
             <Key
-                latin:keyLabel="&#x10D2;"
+                latin:keySpec="&#x10D2;"
                 latin:moreKeys="&#x10F9;" />
             <!-- U+10F0: "ჰ" GEORGIAN LETTER HAE
                  U+10F5: "ჵ" GEORGIAN LETTER HOE -->
             <Key
-                latin:keyLabel="&#x10F0;"
+                latin:keySpec="&#x10F0;"
                 latin:moreKeys="&#x10F5;" />
             <!-- U+10EF: "ჯ" GEORGIAN LETTER JHAN
                  U+10F7: "ჷ" GEORGIAN LETTER YN -->
             <Key
-                latin:keyLabel="&#x10EF;"
+                latin:keySpec="&#x10EF;"
                 latin:moreKeys="&#x10F7;" />
             <!-- U+10D9: "კ" GEORGIAN LETTER KAN -->
             <Key
-                latin:keyLabel="&#x10D9;" />
+                latin:keySpec="&#x10D9;" />
             <!-- U+10DA: "ლ" GEORGIAN LETTER LAS -->
             <Key
-                latin:keyLabel="&#x10DA;" />
+                latin:keySpec="&#x10DA;" />
         </default>
     </switch>
 </merge>
diff --git a/java/res/xml/rowkeys_georgian3.xml b/java/res/xml/rowkeys_georgian3.xml
index a371458..a16acf8 100644
--- a/java/res/xml/rowkeys_georgian3.xml
+++ b/java/res/xml/rowkeys_georgian3.xml
@@ -27,49 +27,49 @@
         >
             <!-- U+10EB: "ძ" GEORGIAN LETTER JIL -->
             <Key
-                latin:keyLabel="&#x10EB;" />
+                latin:keySpec="&#x10EB;" />
             <Key
-                latin:keyLabel="X" />
+                latin:keySpec="X" />
             <!-- U+10E9: "ჩ" GEORGIAN LETTER CHIN -->
             <Key
-                latin:keyLabel="&#x10E9;" />
+                latin:keySpec="&#x10E9;" />
             <Key
-                latin:keyLabel="V" />
+                latin:keySpec="V" />
             <Key
-                latin:keyLabel="B" />
+                latin:keySpec="B" />
             <Key
-                latin:keyLabel="N" />
+                latin:keySpec="N" />
             <Key
-                latin:keyLabel="M" />
+                latin:keySpec="M" />
         </case>
         <default>
             <!-- U+10D6: "ზ" GEORGIAN LETTER ZEN -->
             <Key
-                latin:keyLabel="&#x10D6;" />
+                latin:keySpec="&#x10D6;" />
             <!-- U+10EE: "ხ" GEORGIAN LETTER XAN
                  U+10F4: "ჴ" GEORGIAN LETTER HAR -->
             <Key
-                latin:keyLabel="&#x10EE;"
+                latin:keySpec="&#x10EE;"
                 latin:moreKeys="&#x10F4;" />
             <!-- U+10EA: "ც" GEORGIAN LETTER CAN -->
             <Key
-                latin:keyLabel="&#x10EA;" />
+                latin:keySpec="&#x10EA;" />
             <!-- U+10D5: "ვ" GEORGIAN LETTER VIN
                  U+10F3: "ჳ" GEORGIAN LETTER WE -->
             <Key
-                latin:keyLabel="&#x10D5;"
+                latin:keySpec="&#x10D5;"
                 latin:moreKeys="&#x10F3;" />
             <!-- U+10D1: "ბ" GEORGIAN LETTER BAN -->
             <Key
-                latin:keyLabel="&#x10D1;" />
+                latin:keySpec="&#x10D1;" />
             <!-- U+10DC: "ნ" GEORGIAN LETTER NAR
                  U+10FC: "ჼ" MODIFIER LETTER GEORGIAN NAR -->
             <Key
-                latin:keyLabel="&#x10DC;"
+                latin:keySpec="&#x10DC;"
                 latin:moreKeys="&#x10FC;" />
             <!-- U+10DB: "მ" GEORGIAN LETTER MAN -->
             <Key
-                latin:keyLabel="&#x10DB;" />
+                latin:keySpec="&#x10DB;" />
         </default>
     </switch>
 </merge>
diff --git a/java/res/xml/rowkeys_greek1.xml b/java/res/xml/rowkeys_greek1.xml
index 5777d3b..5080dc8 100644
--- a/java/res/xml/rowkeys_greek1.xml
+++ b/java/res/xml/rowkeys_greek1.xml
@@ -29,7 +29,7 @@
         >
             U+0385: "΅" GREEK DIALYTIKA TONOS
             <Key
-                latin:keyLabel="&#x0385;"
+                latin:keySpec="&#x0385;"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2" />
         </case>
@@ -37,7 +37,7 @@
         -->
             <!-- U+03C2: "ς" GREEK SMALL LETTER FINAL SIGMA -->
             <Key
-                latin:keyLabel="&#x03C2;"
+                latin:keySpec="&#x03C2;"
                 latin:keyLabelFlags="preserveCase"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2" />
@@ -48,18 +48,18 @@
     <!-- U+03B5: "ε" GREEK SMALL LETTER EPSILON
          U+03AD: "έ" GREEK SMALL LETTER EPSILON WITH TONOS -->
     <Key
-        latin:keyLabel="&#x03B5;"
+        latin:keySpec="&#x03B5;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:moreKeys="&#x03AD;" />
     <!-- U+03C1: "ρ" GREEK SMALL LETTER RHO -->
     <Key
-        latin:keyLabel="&#x03C1;"
+        latin:keySpec="&#x03C1;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
     <!-- U+03C4: "τ" GREEK SMALL LETTER TAU -->
     <Key
-        latin:keyLabel="&#x03C4;"
+        latin:keySpec="&#x03C4;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5" />
     <!-- U+03C5: "υ" GREEK SMALL LETTER UPSILON
@@ -67,13 +67,13 @@
          U+03CB: "ϋ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA
          U+03B0: "ΰ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS -->
     <Key
-        latin:keyLabel="&#x03C5;"
+        latin:keySpec="&#x03C5;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6"
         latin:moreKeys="&#x03CD;,&#x03CB;,&#x03B0;" />
     <!-- U+03B8: "θ" GREEK SMALL LETTER THETA -->
     <Key
-        latin:keyLabel="&#x03B8;"
+        latin:keySpec="&#x03B8;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7" />
     <!-- U+03B9: "ι" GREEK SMALL LETTER IOTA
@@ -81,20 +81,20 @@
          U+03CA: "ϊ" GREEK SMALL LETTER IOTA WITH DIALYTIKA
          U+0390: "ΐ" GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -->
     <Key
-        latin:keyLabel="&#x03B9;"
+        latin:keySpec="&#x03B9;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="&#x03AF;,&#x03CA;,&#x0390;" />
     <!-- U+03BF: "ο" GREEK SMALL LETTER OMICRON
          U+03CC: "ό" GREEK SMALL LETTER OMICRON WITH TONOS -->
     <Key
-        latin:keyLabel="&#x03BF;"
+        latin:keySpec="&#x03BF;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9"
         latin:moreKeys="&#x03CC;" />
     <!-- U+03C0: "π" GREEK SMALL LETTER PI -->
     <Key
-        latin:keyLabel="&#x03C0;"
+        latin:keySpec="&#x03C0;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
 </merge>
diff --git a/java/res/xml/rowkeys_greek2.xml b/java/res/xml/rowkeys_greek2.xml
index 91bdc11..d8769ca 100644
--- a/java/res/xml/rowkeys_greek2.xml
+++ b/java/res/xml/rowkeys_greek2.xml
@@ -24,32 +24,32 @@
     <!-- U+03B1: "α" GREEK SMALL LETTER ALPHA
          U+03AC: "ά" GREEK SMALL LETTER ALPHA WITH TONOS -->
     <Key
-        latin:keyLabel="&#x03B1;"
+        latin:keySpec="&#x03B1;"
         latin:moreKeys="&#x03AC;" />
     <!-- U+03C3: "σ" GREEK SMALL LETTER SIGMA -->
     <Key
-        latin:keyLabel="&#x03C3;" />
+        latin:keySpec="&#x03C3;" />
     <!-- U+03B4: "δ" GREEK SMALL LETTER DELTA -->
     <Key
-        latin:keyLabel="&#x03B4;" />
+        latin:keySpec="&#x03B4;" />
     <!-- U+03C6: "φ" GREEK SMALL LETTER PHI -->
     <Key
-        latin:keyLabel="&#x03C6;" />
+        latin:keySpec="&#x03C6;" />
     <!-- U+03B3: "γ" GREEK SMALL LETTER GAMMA -->
     <Key
-        latin:keyLabel="&#x03B3;" />
+        latin:keySpec="&#x03B3;" />
     <!-- U+03B7: "η" GREEK SMALL LETTER ETA
          U+03AE: "ή" GREEK SMALL LETTER ETA WITH TONOS -->
     <Key
-        latin:keyLabel="&#x03B7;"
+        latin:keySpec="&#x03B7;"
         latin:moreKeys="&#x03AE;" />
     <!-- U+03BE: "ξ" GREEK SMALL LETTER XI -->
     <Key
-        latin:keyLabel="&#x03BE;" />
+        latin:keySpec="&#x03BE;" />
     <!-- U+03BA: "κ" GREEK SMALL LETTER KAPPA -->
     <Key
-        latin:keyLabel="&#x03BA;" />
+        latin:keySpec="&#x03BA;" />
     <!-- U+03BB: "λ" GREEK SMALL LETTER LAMDA -->
     <Key
-        latin:keyLabel="&#x03BB;" />
+        latin:keySpec="&#x03BB;" />
 </merge>
diff --git a/java/res/xml/rowkeys_greek3.xml b/java/res/xml/rowkeys_greek3.xml
index 8a99db9..3f989bc 100644
--- a/java/res/xml/rowkeys_greek3.xml
+++ b/java/res/xml/rowkeys_greek3.xml
@@ -23,25 +23,25 @@
 >
     <!-- U+03B6: "ζ" GREEK SMALL LETTER ZETA -->
     <Key
-        latin:keyLabel="&#x03B6;" />
+        latin:keySpec="&#x03B6;" />
     <!-- U+03C7: "χ" GREEK SMALL LETTER CHI -->
     <Key
-        latin:keyLabel="&#x03C7;" />
+        latin:keySpec="&#x03C7;" />
     <!-- U+03C8: "ψ" GREEK SMALL LETTER PSI -->
     <Key
-        latin:keyLabel="&#x03C8;" />
+        latin:keySpec="&#x03C8;" />
     <!-- U+03C9: "ω" GREEK SMALL LETTER OMEGA
          U+03CE: "ώ" GREEK SMALL LETTER OMEGA WITH TONOS -->
     <Key
-        latin:keyLabel="&#x03C9;"
+        latin:keySpec="&#x03C9;"
         latin:moreKeys="&#x03CE;" />
     <!-- U+03B2: "β" GREEK SMALL LETTER BETA -->
     <Key
-        latin:keyLabel="&#x03B2;" />
+        latin:keySpec="&#x03B2;" />
     <!-- U+03BD: "ν" GREEK SMALL LETTER NU -->
     <Key
-        latin:keyLabel="&#x03BD;" />
+        latin:keySpec="&#x03BD;" />
     <!-- U+03BC: "μ" GREEK SMALL LETTER MU -->
     <Key
-        latin:keyLabel="&#x03BC;" />
+        latin:keySpec="&#x03BC;" />
 </merge>
diff --git a/java/res/xml/rowkeys_hebrew1.xml b/java/res/xml/rowkeys_hebrew1.xml
index 81a00e3..e888977 100644
--- a/java/res/xml/rowkeys_hebrew1.xml
+++ b/java/res/xml/rowkeys_hebrew1.xml
@@ -26,22 +26,22 @@
             latin:mode="email|url"
         >
             <Key
-                latin:keyLabel="-"
+                latin:keySpec="-"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1" />
             <Key
-                latin:keyLabel="_"
+                latin:keySpec="_"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2" />
         </case>
         <default>
             <Key
-                latin:keyLabel="\'"
+                latin:keySpec="\'"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1"
                 latin:moreKeys="&quot;" />
             <Key
-                latin:keyLabel="-"
+                latin:keySpec="-"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2"
                 latin:moreKeys="_" />
@@ -49,42 +49,42 @@
     </switch>
     <!-- U+05E7: "ק" HEBREW LETTER QOF -->
     <Key
-        latin:keyLabel="&#x05E7;"
+        latin:keySpec="&#x05E7;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3" />
     <!-- U+05E8: "ר" HEBREW LETTER RESH -->
     <Key
-        latin:keyLabel="&#x05E8;"
+        latin:keySpec="&#x05E8;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
     <!-- U+05D0: "א" HEBREW LETTER ALEF -->
     <Key
-        latin:keyLabel="&#x05D0;"
+        latin:keySpec="&#x05D0;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5" />
     <!-- U+05D8: "ט" HEBREW LETTER TET -->
     <Key
-        latin:keyLabel="&#x05D8;"
+        latin:keySpec="&#x05D8;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6" />
     <!-- U+05D5: "ו" HEBREW LETTER VAV -->
     <Key
-        latin:keyLabel="&#x05D5;"
+        latin:keySpec="&#x05D5;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7" />
     <!-- U+05DF: "ן" HEBREW LETTER FINAL NUN -->
     <Key
-        latin:keyLabel="&#x05DF;"
+        latin:keySpec="&#x05DF;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8" />
     <!-- U+05DD: "ם" HEBREW LETTER FINAL MEM -->
     <Key
-        latin:keyLabel="&#x05DD;"
+        latin:keySpec="&#x05DD;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9" />
     <!-- U+05E4: "פ" HEBREW LETTER PE -->
     <Key
-        latin:keyLabel="&#x05E4;"
+        latin:keySpec="&#x05E4;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
 </merge>
diff --git a/java/res/xml/rowkeys_hebrew2.xml b/java/res/xml/rowkeys_hebrew2.xml
index e4ecac3..d43f5a8 100644
--- a/java/res/xml/rowkeys_hebrew2.xml
+++ b/java/res/xml/rowkeys_hebrew2.xml
@@ -23,38 +23,38 @@
 >
     <!-- U+05E9: "ש" HEBREW LETTER SHIN -->
     <Key
-        latin:keyLabel="&#x05E9;" />
+        latin:keySpec="&#x05E9;" />
     <!-- U+05D3: "ד" HEBREW LETTER DALET -->
     <Key
-        latin:keyLabel="&#x05D3;" />
+        latin:keySpec="&#x05D3;" />
     <!-- U+05D2: "ג" HEBREW LETTER GIMEL
          U+05D2 U+05F3: "ג׳" HEBREW LETTER GIMEL + HEBREW PUNCTUATION GERESH -->
     <Key
-        latin:keyLabel="&#x05D2;"
+        latin:keySpec="&#x05D2;"
         latin:moreKeys="&#x05D2;&#x05F3;" />
     <!-- U+05DB: "כ" HEBREW LETTER KAF -->
     <Key
-        latin:keyLabel="&#x05DB;" />
+        latin:keySpec="&#x05DB;" />
     <!-- U+05E2: "ע" HEBREW LETTER AYIN -->
     <Key
-        latin:keyLabel="&#x05E2;" />
+        latin:keySpec="&#x05E2;" />
     <!-- U+05D9: "י" HEBREW LETTER YOD
          U+05F2 U+05B7: "ײַ" HEBREW LIGATURE YIDDISH DOUBLE YOD + HEBREW POINT PATAH -->
     <Key
-        latin:keyLabel="&#x05D9;"
+        latin:keySpec="&#x05D9;"
         latin:moreKeys="&#x05F2;&#x05B7;" />
     <!-- U+05D7: "ח" HEBREW LETTER HET
          U+05D7 U+05F3: "ח׳" HEBREW LETTER HET + HEBREW PUNCTUATION GERESH -->
     <Key
-        latin:keyLabel="&#x05D7;"
+        latin:keySpec="&#x05D7;"
         latin:moreKeys="&#x05D7;&#x05F3;" />
     <!-- U+05DC: "ל" HEBREW LETTER LAMED -->
     <Key
-        latin:keyLabel="&#x05DC;" />
+        latin:keySpec="&#x05DC;" />
     <!-- U+05DA: "ך" HEBREW LETTER FINAL KAF -->
     <Key
-        latin:keyLabel="&#x05DA;" />
+        latin:keySpec="&#x05DA;" />
     <!-- U+05E3: "ף" HEBREW LETTER FINAL PE -->
     <Key
-        latin:keyLabel="&#x05E3;" />
+        latin:keySpec="&#x05E3;" />
 </merge>
diff --git a/java/res/xml/rowkeys_hebrew3.xml b/java/res/xml/rowkeys_hebrew3.xml
index 805a7a5..928e6b2 100644
--- a/java/res/xml/rowkeys_hebrew3.xml
+++ b/java/res/xml/rowkeys_hebrew3.xml
@@ -24,36 +24,36 @@
     <!-- U+05D6: "ז" HEBREW LETTER ZAYIN
          U+05D6 U+05F3: "ז׳" HEBREW LETTER ZAYIN + HEBREW PUNCTUATION GERESH -->
     <Key
-        latin:keyLabel="&#x05D6;"
+        latin:keySpec="&#x05D6;"
         latin:moreKeys="&#x05D6;&#x05F3;" />
     <!-- U+05E1: "ס" HEBREW LETTER SAMEKH -->
     <Key
-        latin:keyLabel="&#x05E1;" />
+        latin:keySpec="&#x05E1;" />
     <!-- U+05D1: "ב" HEBREW LETTER BET -->
     <Key
-        latin:keyLabel="&#x05D1;" />
+        latin:keySpec="&#x05D1;" />
     <!-- U+05D4: "ה" HEBREW LETTER HE -->
     <Key
-        latin:keyLabel="&#x05D4;" />
+        latin:keySpec="&#x05D4;" />
     <!-- U+05E0: "נ" HEBREW LETTER NUN -->
     <Key
-        latin:keyLabel="&#x05E0;" />
+        latin:keySpec="&#x05E0;" />
     <!-- U+05DE: "מ" HEBREW LETTER MEM -->
     <Key
-        latin:keyLabel="&#x05DE;" />
+        latin:keySpec="&#x05DE;" />
     <!-- U+05E6: "צ" HEBREW LETTER TSADI
          U+05E6 U+05F3: "צ׳" HEBREW LETTER TSADI + HEBREW PUNCTUATION GERESH -->
     <Key
-        latin:keyLabel="&#x05E6;"
+        latin:keySpec="&#x05E6;"
         latin:moreKeys="&#x05E6;&#x05F3;" />
     <!-- U+05EA: "ת" HEBREW LETTER TAV
          U+05EA U+05F3: "ת׳" HEBREW LETTER TAV + HEBREW PUNCTUATION GERESH -->
     <Key
-        latin:keyLabel="&#x05EA;"
+        latin:keySpec="&#x05EA;"
         latin:moreKeys="&#x05EA;&#x05F3;" />
     <!-- U+05E5: "ץ" HEBREW LETTER FINAL TSADI
          U+05E5 U+05F3: "ץ׳" HEBREW LETTER FINAL TSADI + HEBREW PUNCTUATION GERESH -->
     <Key
-        latin:keyLabel="&#x05E5;"
+        latin:keySpec="&#x05E5;"
         latin:moreKeys="&#x05E5;&#x05F3;" />
 </merge>
diff --git a/java/res/xml/rowkeys_hindi1.xml b/java/res/xml/rowkeys_hindi1.xml
index c0b3cb9..914618a 100644
--- a/java/res/xml/rowkeys_hindi1.xml
+++ b/java/res/xml/rowkeys_hindi1.xml
@@ -28,38 +28,38 @@
             <!-- U+0914: "औ" DEVANAGARI LETTER AU
                  U+0912/U+0902: "ऒं" DEVANAGARI LETTER SHORT O//DEVANAGARI SIGN ANUSVARA -->
             <Key
-                latin:keyLabel="&#x0914;"
+                latin:keySpec="&#x0914;"
                 latin:moreKeys="&#x0912;&#x0902;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0910: "ऐ" DEVANAGARI LETTER AI
                  U+0910/U+0902: "ऐं" DEVANAGARI LETTER AI/DEVANAGARI SIGN ANUSVARA -->
             <Key
-                latin:keyLabel="&#x0910;"
+                latin:keySpec="&#x0910;"
                 latin:moreKeys="&#x0910;&#x0902;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0906: "आ" DEVANAGARI LETTER AA
                  U+0906/U+0902: "आं" DEVANAGARI LETTER AA/DEVANAGARI SIGN ANUSVARA
                  U+0906/U+0901: "आँ" DEVANAGARI LETTER AA/DEVANAGARI SIGN CANDRABINDU -->
             <Key
-                latin:keyLabel="&#x0906;"
+                latin:keySpec="&#x0906;"
                 latin:moreKeys="&#x0906;&#x0902;,&#x0906;&#x0901;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0908: "ई" DEVANAGARI LETTER II
                  U+0908/U+0902: "ईं" DEVANAGARI LETTER II/DEVANAGARI SIGN ANUSVARA -->
             <Key
-                latin:keyLabel="&#x0908;"
+                latin:keySpec="&#x0908;"
                 latin:moreKeys="&#x0908;&#x0902;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+090A: "ऊ" DEVANAGARI LETTER UU
                  U+090A/U+0902: "ऊं" DEVANAGARI LETTER UU/DEVANAGARI SIGN ANUSVARA
                  U+090A/U+0901: "ऊँ" DEVANAGARI LETTER UU/DEVANAGARI SIGN CANDRABINDU -->
             <Key
-                latin:keyLabel="&#x090A;"
+                latin:keySpec="&#x090A;"
                 latin:moreKeys="&#x090A;&#x0902;,&#x090A;&#x0901;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092D: "भ" DEVANAGARI LETTER BHA -->
             <Key
-                latin:keyLabel="&#x092D;"
+                latin:keySpec="&#x092D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -70,22 +70,22 @@
                 latin:keyStyle="baseKeyDevanagariSignVisarga" />
             <!-- U+0918: "घ" DEVANAGARI LETTER GHA -->
             <Key
-                latin:keyLabel="&#x0918;"
+                latin:keySpec="&#x0918;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0927: "ध" DEVANAGARI LETTER DHA
                  U+0915/U+094D/U+0937: "क्ष" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER SSA
                  U+0936/U+094D/U+0930: "श्र" DEVANAGARI LETTER SHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA -->
             <Key
-                latin:keyLabel="&#x0927;"
+                latin:keySpec="&#x0927;"
                 latin:moreKeys="&#x0915;&#x094D;&#x0937;,&#x0936;&#x094D;&#x0930;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091D: "झ" DEVANAGARI LETTER JHA -->
             <Key
-                latin:keyLabel="&#x091D;"
+                latin:keySpec="&#x091D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0922: "ढ" DEVANAGARI LETTER DDHA -->
             <Key
-                latin:keyLabel="&#x0922;"
+                latin:keySpec="&#x0922;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
@@ -143,7 +143,7 @@
                  U+096C: "६" DEVANAGARI DIGIT SIX
                  U+092C/U+0952: "ब॒" DEVANAGARI LETTER BA/DEVANAGARI STRESS SIGN ANUDATTA -->
             <Key
-                latin:keyLabel="&#x092C;"
+                latin:keySpec="&#x092C;"
                 latin:moreKeys="&#x092C;&#x0952;,%"
                 latin:keyHintLabel="6"
                 latin:additionalMoreKeys="&#x096C;,6"
@@ -151,7 +151,7 @@
             <!-- U+0939: "ह" DEVANAGARI LETTER HA
                  U+096D: "७" DEVANAGARI DIGIT SEVEN -->
             <Key
-                latin:keyLabel="&#x0939;"
+                latin:keySpec="&#x0939;"
                 latin:keyHintLabel="7"
                 latin:additionalMoreKeys="&#x096D;,7"
                 latin:keyLabelFlags="fontNormal" />
@@ -161,7 +161,7 @@
                  U+0917/U+0952: "ग॒" DEVANAGARI LETTER GA/DEVANAGARI STRESS SIGN ANUDATTA
                  U+096E: "८" DEVANAGARI DIGIT EIGHT -->
             <Key
-                latin:keyLabel="&#x0917;"
+                latin:keySpec="&#x0917;"
                 latin:moreKeys="&#x091C;&#x094D;&#x091E;,&#x0917;&#x093C;,&#x0917;&#x0952;,%"
                 latin:keyHintLabel="8"
                 latin:additionalMoreKeys="&#x096E;,8"
@@ -169,7 +169,7 @@
             <!-- U+0926: "द" DEVANAGARI LETTER DA
                  U+096F: "९" DEVANAGARI DIGIT NINE -->
             <Key
-                latin:keyLabel="&#x0926;"
+                latin:keySpec="&#x0926;"
                 latin:keyHintLabel="9"
                 latin:additionalMoreKeys="&#x096F;,9"
                 latin:keyLabelFlags="fontNormal" />
@@ -179,7 +179,7 @@
                  U+091C/U+093C: "ज़" DEVANAGARI LETTER JA/DEVANAGARI SIGN NUKTA
                  U+0966: "०" DEVANAGARI DIGIT ZERO -->
             <Key
-                latin:keyLabel="&#x091C;"
+                latin:keySpec="&#x091C;"
                 latin:moreKeys="&#x091C;&#x0952;,&#x091C;&#x094D;&#x091E;,&#x091C;&#x093C;,%"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="&#x0966;,0"
@@ -188,7 +188,7 @@
                  U+0921/U+0952: "ड॒" DEVANAGARI LETTER DDA/DEVANAGARI STRESS SIGN ANUDATTA
                  U+0921/U+093C: "ड़" DEVANAGARI LETTER DDA/DEVANAGARI SIGN NUKTA -->
             <Key
-                latin:keyLabel="&#x0921;"
+                latin:keySpec="&#x0921;"
                 latin:moreKeys="&#x0921;&#x0952;,&#x0921;&#x093C;"
                 latin:keyLabelFlags="fontNormal" />
          </default>
diff --git a/java/res/xml/rowkeys_hindi2.xml b/java/res/xml/rowkeys_hindi2.xml
index 70ac66e..7ba4ee1 100644
--- a/java/res/xml/rowkeys_hindi2.xml
+++ b/java/res/xml/rowkeys_hindi2.xml
@@ -30,7 +30,7 @@
                  U+0911: "ऑ" DEVANAGARI LETTER CANDRA O
                  U+0912: "ऒ" DEVANAGARI LETTER SHORT O -->
             <Key
-                latin:keyLabel="&#x0913;"
+                latin:keySpec="&#x0913;"
                 latin:moreKeys="&#x0913;&#x0902;,&#x0911;,&#x0912;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+090F: "ए" DEVANAGARI LETTER E
@@ -39,60 +39,60 @@
                  U+090D: "ऍ" DEVANAGARI LETTER CANDRA E
                  U+090E: "ऎ" DEVANAGARI LETTER SHORT E -->
             <Key
-                latin:keyLabel="&#x090F;"
+                latin:keySpec="&#x090F;"
                 latin:moreKeys="&#x090F;&#x0902;,&#x090F;&#x0901;,&#x090D;,&#x090E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0905: "अ" DEVANAGARI LETTER A
                  U+0905/U+0902: "अं" DEVANAGARI LETTER A/DEVANAGARI SIGN ANUSVARA
                  U+0905/U+0901: "अँ" DEVANAGARI LETTER A/DEVANAGARI SIGN CANDRABINDU -->
             <Key
-                latin:keyLabel="&#x0905;"
+                latin:keySpec="&#x0905;"
                 latin:moreKeys="&#x0905;&#x0902;,&#x0905;&#x0901;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0907: "इ" DEVANAGARI LETTER I
                  U+0907/U+0902: "इं" DEVANAGARI LETTER I/DEVANAGARI SIGN ANUSVARA
                  U+0907/U+0901: "इं" DEVANAGARI LETTER I/DEVANAGARI SIGN CANDRABINDU -->
             <Key
-                latin:keyLabel="&#x0907;"
+                latin:keySpec="&#x0907;"
                 latin:moreKeys="&#x0907;&#x0902;,&#x0907;&#x0901;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0909: "उ" DEVANAGARI LETTER U
                  U+0909/U+0902: "उं" DEVANAGARI LETTER U/DEVANAGARI SIGN ANUSVARA
                  U+0909/U+0901: "उँ" DEVANAGARI LETTER U/DEVANAGARI SIGN CANDRABINDU -->
             <Key
-                latin:keyLabel="&#x0909;"
+                latin:keySpec="&#x0909;"
                 latin:moreKeys="&#x0909;&#x0902;,&#x0909;&#x0901;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092B: "फ" DEVANAGARI LETTER PHA
                  U+092B/U+093C: "फ़" DEVANAGARI LETTER PHA/DEVANAGARI SIGN NUKTA -->
             <Key
-                latin:keyLabel="&#x092B;"
+                latin:keySpec="&#x092B;"
                 latin:moreKeys="&#x092B;&#x093C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0931: "ऱ" DEVANAGARI LETTER RRA
                  U+094D/U+0930: "्र" DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA
                  U+0930/U+094D: "र्" DEVANAGARI LETTER RA/DEVANAGARI SIGN VIRAMA -->
             <Key
-                latin:keyLabel="&#x0931;"
+                latin:keySpec="&#x0931;"
                 latin:moreKeys="&#x094D;&#x0930;,&#x0930;&#x094D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0916: "ख" DEVANAGARI LETTER KHA
                  U+0916/U+093C: "ख़" DEVANAGARI LETTER KHA/DEVANAGARI SIGN NUKTA -->
             <Key
-                latin:keyLabel="&#x0916;"
+                latin:keySpec="&#x0916;"
                 latin:moreKeys="&#x0916;&#x093C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0925: "थ" DEVANAGARI LETTER THA -->
             <Key
-                latin:keyLabel="&#x0925;"
+                latin:keySpec="&#x0925;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091B: "छ" DEVANAGARI LETTER CHA -->
             <Key
-                latin:keyLabel="&#x091B;"
+                latin:keySpec="&#x091B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0920: "ठ" DEVANAGARI LETTER TTHA -->
             <Key
-                latin:keyLabel="&#x0920;"
+                latin:keySpec="&#x0920;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
@@ -133,35 +133,35 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignU" />
             <!-- U+092A: "प" DEVANAGARI LETTER PA -->
             <Key
-                latin:keyLabel="&#x092A;"
+                latin:keySpec="&#x092A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0930: "र" DEVANAGARI LETTER RA
                  U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R
                  U+0930/U+093C: "ऱ" DEVANAGARI LETTER RA/DEVANAGARI SIGN NUKTA
                  U+0960: "ॠ" DEVANAGARI LETTER VOCALIC RR -->
             <Key
-                latin:keyLabel="&#x0930;"
+                latin:keySpec="&#x0930;"
                 latin:moreKeys="&#x090B;,&#x0930;&#x093C;,&#x0960;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0915: "क" DEVANAGARI LETTER KA
                  U+0915/U+093C: "क़" DEVANAGARI LETTER KA/DEVANAGARI SIGN NUKTA -->
             <Key
-                latin:keyLabel="&#x0915;"
+                latin:keySpec="&#x0915;"
                 latin:moreKeys="&#x0915;&#x093C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0924: "त" DEVANAGARI LETTER TA
                  U+0924/U+094D/U+0930: "त्र" DEVANAGARI LETTER TA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA -->
             <Key
-                latin:keyLabel="&#x0924;"
+                latin:keySpec="&#x0924;"
                 latin:moreKeys="&#x0924;&#x094D;&#x0930;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091A: "च" DEVANAGARI LETTER CA -->
             <Key
-                latin:keyLabel="&#x091A;"
+                latin:keySpec="&#x091A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091F: "ट" DEVANAGARI LETTER TTA -->
             <Key
-                latin:keyLabel="&#x091F;"
+                latin:keySpec="&#x091F;"
                 latin:keyLabelFlags="fontNormal" />
          </default>
     </switch>
diff --git a/java/res/xml/rowkeys_hindi3.xml b/java/res/xml/rowkeys_hindi3.xml
index 136bc5f..a9be472 100644
--- a/java/res/xml/rowkeys_hindi3.xml
+++ b/java/res/xml/rowkeys_hindi3.xml
@@ -27,7 +27,7 @@
         >
             <!-- U+0911: "ऑ" DEVANAGARI LETTER CANDRA O -->
             <Key
-                latin:keyLabel="&#x0911;"
+                latin:keySpec="&#x0911;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -36,24 +36,24 @@
                 latin:keyboardLayout="@xml/key_devanagari_sign_candrabindu" />
             <!-- U+0923: "ण" DEVANAGARI LETTER NNA -->
             <Key
-                latin:keyLabel="&#x0923;"
+                latin:keySpec="&#x0923;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0929: "ऩ" DEVANAGARI LETTER NNNA -->
             <Key
-                latin:keyLabel="&#x0929;" />
+                latin:keySpec="&#x0929;" />
             <!-- U+0933: "ळ" DEVANAGARI LETTER LLA
                  U+0934: "ऴ" DEVANAGARI LETTER LLLA -->
             <Key
-                latin:keyLabel="&#x0933;"
+                latin:keySpec="&#x0933;"
                 latin:moreKeys="&#x0934;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0936: "श" DEVANAGARI LETTER SHA -->
             <Key
-                latin:keyLabel="&#x0936;"
+                latin:keySpec="&#x0936;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0937: "ष" DEVANAGARI LETTER SSA -->
             <Key
-                latin:keyLabel="&#x0937;"
+                latin:keySpec="&#x0937;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -62,7 +62,7 @@
                 latin:keyboardLayout="@xml/key_devanagari_vowel_sign_vocalic_r" />
             <!-- U+091E: "ञ" DEVANAGARI LETTER NYA -->
             <Key
-                latin:keyLabel="&#x091E;"
+                latin:keySpec="&#x091E;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
@@ -76,7 +76,7 @@
             <!-- U+092E: "म" DEVANAGARI LETTER MA
                  U+0950: "ॐ" DEVANAGARI OM -->
             <Key
-                latin:keyLabel="&#x092E;"
+                latin:keySpec="&#x092E;"
                 latin:moreKeys="&#x0950;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0928: "न" DEVANAGARI LETTER NA
@@ -84,28 +84,28 @@
                  U+0919: "ङ" DEVANAGARI LETTER NGA
                  U+0928/U+093C: "ऩ" DEVANAGARI LETTER NA/DEVANAGARI SIGN NUKTA -->
             <Key
-                latin:keyLabel="&#x0928;"
+                latin:keySpec="&#x0928;"
                 latin:moreKeys="&#x091E;,&#x0919;,&#x0928;&#x093C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0935: "व" DEVANAGARI LETTER VA -->
             <Key
-                latin:keyLabel="&#x0935;"
+                latin:keySpec="&#x0935;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0932: "ल" DEVANAGARI LETTER LA
                  U+090C: "ऌ" DEVANAGARI LETTER VOCALIC L
                  U+0961: "ॡ" DEVANAGARI LETTER VOCALIC LL -->
             <Key
-                latin:keyLabel="&#x0932;"
+                latin:keySpec="&#x0932;"
                 latin:moreKeys="&#x090C;,&#x0961;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0938: "स" DEVANAGARI LETTER SA -->
             <Key
-                latin:keyLabel="&#x0938;"
+                latin:keySpec="&#x0938;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092F: "य" DEVANAGARI LETTER YA
                  U+095F: "य़" DEVANAGARI LETTER YYA -->
             <Key
-                latin:keyLabel="&#x092F;"
+                latin:keySpec="&#x092F;"
                 latin:moreKeys="&#x095F;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
diff --git a/java/res/xml/rowkeys_khmer1.xml b/java/res/xml/rowkeys_khmer1.xml
index 05d1a86..567c6af 100644
--- a/java/res/xml/rowkeys_khmer1.xml
+++ b/java/res/xml/rowkeys_khmer1.xml
@@ -27,79 +27,79 @@
         >
             <!-- U+200D: ZERO WIDTH JOINER -->
             <Key
-                latin:keyLabel="!"
+                latin:keySpec="!"
                 latin:moreKeys="!icon/zwj_key|&#x200D;" />
             <!-- U+17D7: "ៗ" KHMER SIGN LEK TOO
                  U+200C: ZERO WIDTH NON-JOINER -->
             <Key
-                latin:keyLabel="&#x17D7;"
+                latin:keySpec="&#x17D7;"
                 latin:moreKeys="!icon/zwnj_key|&#x200C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17D1: "៑" KHMER SIGN VIRIAM -->
             <Key
-                latin:keyLabel="&quot;"
+                latin:keySpec="&quot;"
                 latin:keyHintLabel="&#x17D1;"
                 latin:moreKeys="&#x17D1;" />
             <!-- U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
                  U+20AC: "€" EURO SIGN -->
             <Key
-                latin:keyLabel="&#x17DB;"
+                latin:keySpec="&#x17DB;"
                 latin:keyHintLabel="$"
                 latin:moreKeys="$,&#x20AC;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17D6: "៖" KHMER SIGN CAMNUC PII KUUH -->
             <Key
-                latin:keyLabel="%"
+                latin:keySpec="%"
                 latin:keyHintLabel="&#x17D6;"
                 latin:moreKeys="&#x17D6;" />
             <!-- U+17CD: "៍" KHMER SIGN TOANDAKHIAT
                  U+17D9: "៙" KHMER SIGN PHNAEK MUAN -->
             <Key
-                latin:keyLabel="&#x17CD;"
+                latin:keySpec="&#x17CD;"
                 latin:keyHintLabel="&#x17D9;"
                 latin:moreKeys="&#x17D9;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17D0: "័" KHMER SIGN SAMYOK SANNYA
                  U+17DA: "៚" KHMER SIGN KOOMUUT -->
             <Key
-                latin:keyLabel="&#x17D0;"
+                latin:keySpec="&#x17D0;"
                 latin:keyHintLabel="&#x17DA;"
                 latin:keyHintLabelVerticalAdjustment="-30%"
                 latin:moreKeys="&#x17DA;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17CF: "៏" KHMER SIGN AHSDA -->
             <Key
-                latin:keyLabel="&#x17CF;"
+                latin:keySpec="&#x17CF;"
                 latin:keyHintLabel="*"
                 latin:moreKeys="*"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="("
+                latin:keySpec="("
                 latin:keyHintLabel="{"
                 latin:moreKeys="{,&#x00AB;" />
             <!-- U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keyLabel=")"
+                latin:keySpec=")"
                 latin:keyHintLabel="}"
                 latin:moreKeys="},&#x00BB;" />
             <!-- U+17CC: "៌" KHMER SIGN ROBAT
                  U+00D7: "×" MULTIPLICATION SIGN -->
             <Key
-                latin:keyLabel="&#x17CC;"
+                latin:keySpec="&#x17CC;"
                 latin:keyHintLabel="&#x00D7;"
                 latin:moreKeys="&#x00D7;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17CE: "៎" KHMER SIGN KAKABAT -->
             <Key
-                latin:keyLabel="&#x17CE;"
+                latin:keySpec="&#x17CE;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
             <!-- U+17E1: "១" KHMER DIGIT ONE
                  U+17F1: "៱" KHMER SYMBOL LEK ATTAK MUOY -->
             <Key
-                latin:keyLabel="&#x17E1;"
+                latin:keySpec="&#x17E1;"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1"
                 latin:moreKeys="&#x17F1;"
@@ -107,7 +107,7 @@
             <!-- U+17E2: "២" KHMER DIGIT TWO
                  U+17F2: "៲" KHMER SYMBOL LEK ATTAK PII -->
             <Key
-                latin:keyLabel="&#x17E2;"
+                latin:keySpec="&#x17E2;"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2"
                 latin:moreKeys="&#x17F2;"
@@ -115,7 +115,7 @@
             <!-- U+17E3: "៣" KHMER DIGIT THREE
                  U+17F3: "៳" KHMER SYMBOL LEK ATTAK BEI -->
             <Key
-                latin:keyLabel="&#x17E3;"
+                latin:keySpec="&#x17E3;"
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3"
                 latin:moreKeys="&#x17F3;"
@@ -123,7 +123,7 @@
             <!-- U+17E4: "៤" KHMER DIGIT FOUR
                  U+17F4: "៴" KHMER SYMBOL LEK ATTAK BUON -->
             <Key
-                latin:keyLabel="&#x17E4;"
+                latin:keySpec="&#x17E4;"
                 latin:keyHintLabel="4"
                 latin:additionalMoreKeys="4"
                 latin:moreKeys="&#x17F4;"
@@ -131,7 +131,7 @@
             <!-- U+17E5: "៥" KHMER DIGIT FIVE
                  U+17F5: "៵" KHMER SYMBOL LEK ATTAK PRAM -->
             <Key
-                latin:keyLabel="&#x17E5;"
+                latin:keySpec="&#x17E5;"
                 latin:keyHintLabel="5"
                 latin:additionalMoreKeys="5"
                 latin:moreKeys="&#x17F5;"
@@ -139,7 +139,7 @@
             <!-- U+17E6: "៦" KHMER DIGIT SIX
                  U+17F6: "៶" KHMER SYMBOL LEK ATTAK PRAM-MUOY -->
             <Key
-                latin:keyLabel="&#x17E6;"
+                latin:keySpec="&#x17E6;"
                 latin:keyHintLabel="6"
                 latin:additionalMoreKeys="6"
                 latin:moreKeys="&#x17F6;"
@@ -147,7 +147,7 @@
             <!-- U+17E7: "៧" KHMER DIGIT SEVEN
                  U+17F7: "៷" KHMER SYMBOL LEK ATTAK PRAM-PII -->
             <Key
-                latin:keyLabel="&#x17E7;"
+                latin:keySpec="&#x17E7;"
                 latin:keyHintLabel="7"
                 latin:additionalMoreKeys="7"
                 latin:moreKeys="&#x17F7;"
@@ -155,7 +155,7 @@
             <!-- U+17E8: "៨" KHMER DIGIT EIGHT
                  U+17F8: "៸" KHMER SYMBOL LEK ATTAK PRAM-BEI -->
             <Key
-                latin:keyLabel="&#x17E8;"
+                latin:keySpec="&#x17E8;"
                 latin:keyHintLabel="8"
                 latin:additionalMoreKeys="8"
                 latin:moreKeys="&#x17F8;"
@@ -163,7 +163,7 @@
             <!-- U+17E9: "៩" KHMER DIGIT NINE
                  U+17F9: "៹" KHMER SYMBOL LEK ATTAK PRAM-BUON -->
             <Key
-                latin:keyLabel="&#x17E9;"
+                latin:keySpec="&#x17E9;"
                 latin:keyHintLabel="9"
                 latin:additionalMoreKeys="9"
                 latin:moreKeys="&#x17F9;"
@@ -171,7 +171,7 @@
             <!-- U+17E0: "០" KHMER DIGIT ZERO
                  U+17F0: "៰" KHMER SYMBOL LEK ATTAK SON -->
             <Key
-                latin:keyLabel="&#x17E0;"
+                latin:keySpec="&#x17E0;"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="0"
                 latin:moreKeys="&#x17F0;"
@@ -179,14 +179,14 @@
             <!-- U+17A5: "ឥ" KHMER INDEPENDENT VOWEL QI
                  U+17A6: "ឦ" KHMER INDEPENDENT VOWEL QII -->
             <Key
-                latin:keyLabel="&#x17A5;"
+                latin:keySpec="&#x17A5;"
                 latin:keyHintLabel="&#x17A6;"
                 latin:moreKeys=",&#x17A6;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17B2: "ឲ" KHMER INDEPENDENT VOWEL QOO TYPE TWO
                  U+17B1: "ឱ" KHMER INDEPENDENT VOWEL QOO TYPE ONE -->
             <Key
-                latin:keyLabel="&#x17B2;"
+                latin:keySpec="&#x17B2;"
                 latin:keyHintLabel="&#x17B1;"
                 latin:moreKeys="&#x17B1;"
                 latin:keyLabelFlags="fontNormal" />
diff --git a/java/res/xml/rowkeys_khmer2.xml b/java/res/xml/rowkeys_khmer2.xml
index 801f23f..4146895 100644
--- a/java/res/xml/rowkeys_khmer2.xml
+++ b/java/res/xml/rowkeys_khmer2.xml
@@ -28,106 +28,106 @@
             <!-- U+1788: "ឈ" KHMER LETTER CHO
                  U+17DC: "ៜ" KHMER SIGN AVAKRAHASANYA -->
             <Key
-                latin:keyLabel="&#x1788;"
+                latin:keySpec="&#x1788;"
                 latin:keyHintLabel="&#x17DC;"
                 latin:moreKeys="&#x17DC;"
                 latin:keyLabelFlags="fontNormal|autoScale" />
             <!-- U+17BA: "ឺ" KHMER VOWEL SIGN YY
                  U+17DD: "៝" KHMER SIGN ATTHACAN -->
             <Key
-                latin:keyLabel="&#x17BA;"
+                latin:keySpec="&#x17BA;"
                 latin:keyHintLabel="&#x17DD;"
                 latin:keyHintLabelVerticalAdjustment="40%"
                 latin:moreKeys="&#x17DD;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17C2: "ែ" KHMER VOWEL SIGN AE -->
             <Key
-                latin:keyLabel="&#x17C2;"
+                latin:keySpec="&#x17C2;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17AC: "ឬ" KHMER INDEPENDENT VOWEL RYY
                  U+17AB: "ឫ" KHMER INDEPENDENT VOWEL RY -->
             <Key
-                latin:keyLabel="&#x17AC;"
+                latin:keySpec="&#x17AC;"
                 latin:keyHintLabel="&#x17AB;"
                 latin:moreKeys="&#x17AB;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1791: "ទ" KHMER LETTER TO -->
             <Key
-                latin:keyLabel="&#x1791;"
+                latin:keySpec="&#x1791;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17BD: "ួ" KHMER VOWEL SIGN UA -->
             <Key
-                latin:keyLabel="&#x17BD;"
+                latin:keySpec="&#x17BD;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17BC: "ូ" KHMER VOWEL SIGN UU -->
             <Key
-                latin:keyLabel="&#x17BC;"
+                latin:keySpec="&#x17BC;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17B8: "ី" KHMER VOWEL SIGN II -->
             <Key
-                latin:keyLabel="&#x17B8;"
+                latin:keySpec="&#x17B8;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17C5: "ៅ" KHMER VOWEL SIGN AU -->
             <Key
-                latin:keyLabel="&#x17C5;"
+                latin:keySpec="&#x17C5;"
                 latin:keyLabelFlags="fontNormal|autoScale" />
             <!-- U+1797: "ភ" KHMER LETTER PHO -->
             <Key
-                latin:keyLabel="&#x1797;"
+                latin:keySpec="&#x1797;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17BF: "ឿ" KHMER VOWEL SIGN YA -->
             <Key
-                latin:keyLabel="&#x17BF;"
+                latin:keySpec="&#x17BF;"
                 latin:keyLabelFlags="fontNormal|autoScale" />
             <!-- U+17B0: "ឰ" KHMER INDEPENDENT VOWEL QAI -->
             <Key
-                latin:keyLabel="&#x17B0;"
+                latin:keySpec="&#x17B0;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
             <!-- U+1786: "ឆ" KHMER LETTER CHA -->
             <Key
-                latin:keyLabel="&#x1786;"
+                latin:keySpec="&#x1786;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17B9: "ឹ" KHMER VOWEL SIGN Y -->
             <Key
-                latin:keyLabel="&#x17B9;"
+                latin:keySpec="&#x17B9;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17C1: "េ" KHMER VOWEL SIGN E -->
             <Key
-                latin:keyLabel="&#x17C1;"
+                latin:keySpec="&#x17C1;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+179A: "រ" KHMER LETTER RO -->
             <Key
-                latin:keyLabel="&#x179A;"
+                latin:keySpec="&#x179A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+178F: "ត" KHMER LETTER TA -->
             <Key
-                latin:keyLabel="&#x178F;"
+                latin:keySpec="&#x178F;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1799: "យ" KHMER LETTER YO -->
             <Key
-                latin:keyLabel="&#x1799;"
+                latin:keySpec="&#x1799;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17BB: "ុ" KHMER VOWEL SIGN U -->
             <Key
-                latin:keyLabel="&#x17BB;"
+                latin:keySpec="&#x17BB;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17B7: "ិ" KHMER VOWEL SIGN I -->
             <Key
-                latin:keyLabel="&#x17B7;"
+                latin:keySpec="&#x17B7;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17C4: "ោ" KHMER VOWEL SIGN OO -->
             <Key
-                latin:keyLabel="&#x17C4;"
+                latin:keySpec="&#x17C4;"
                 latin:keyLabelFlags="fontNormal|autoScale" />
             <!-- U+1795: "ផ" KHMER LETTER PHA -->
             <Key
-                latin:keyLabel="&#x1795;"
+                latin:keySpec="&#x1795;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17C0: "ៀ" KHMER VOWEL SIGN IE -->
             <Key
-                latin:keyLabel="&#x17C0;"
+                latin:keySpec="&#x17C0;"
                 latin:keyLabelFlags="fontNormal|autoScale" />
             <!-- U+17AA: "ឪ" KHMER INDEPENDENT VOWEL QUUV
                  U+17A7: "ឧ" KHMER INDEPENDENT VOWEL QU
@@ -136,7 +136,7 @@
                  U+17A9: "ឩ" KHMER INDEPENDENT VOWEL QUU
                  U+17A8: "ឨ" KHMER INDEPENDENT VOWEL QUK -->
             <Key
-                latin:keyLabel="&#x17AA;"
+                latin:keySpec="&#x17AA;"
                 latin:keyHintLabel="&#x17A7;"
                 latin:moreKeys="&#x17A7;,&#x17B1;,&#x17B3;,&#x17A9;,&#x17A8;"
                 latin:keyLabelFlags="fontNormal" />
diff --git a/java/res/xml/rowkeys_khmer3.xml b/java/res/xml/rowkeys_khmer3.xml
index f35ba5c..7a2efa7 100644
--- a/java/res/xml/rowkeys_khmer3.xml
+++ b/java/res/xml/rowkeys_khmer3.xml
@@ -27,109 +27,109 @@
         >
             <!-- U+17B6/U+17C6: "ាំ" KHMER VOWEL SIGN AA/KHMER SIGN NIKAHIT -->
             <Key
-                latin:keyLabel="&#x17B6;&#x17C6;"
+                latin:keySpec="&#x17B6;&#x17C6;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+17C3: "ៃ" KHMER VOWEL SIGN AI -->
             <Key
-                latin:keyLabel="&#x17C3;"
+                latin:keySpec="&#x17C3;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+178C: "ឌ" KHMER LETTER DO -->
             <Key
-                latin:keyLabel="&#x178C;"
+                latin:keySpec="&#x178C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1792: "ធ" KHMER LETTER THO -->
             <Key
-                latin:keyLabel="&#x1792;"
+                latin:keySpec="&#x1792;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17A2: "អ" KHMER LETTER QA -->
             <Key
-                latin:keyLabel="&#x17A2;"
+                latin:keySpec="&#x17A2;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17C7: "ះ" KHMER SIGN REAHMUK
                  U+17C8: "ៈ" KHMER SIGN YUUKALEAPINTU;-->
             <Key
-                latin:keyLabel="&#x17C7;"
+                latin:keySpec="&#x17C7;"
                 latin:keyHintLabel="&#x17C8;"
                 latin:moreKeys="&#x17C8;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1789: "ញ" KHMER LETTER NYO -->
             <Key
-                latin:keyLabel="&#x1789;"
+                latin:keySpec="&#x1789;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1782: "គ" KHMER LETTER KO
                  U+179D: "ឝ" KHMER LETTER SHA -->
             <Key
-                latin:keyLabel="&#x1782;"
+                latin:keySpec="&#x1782;"
                 latin:keyHintLabel="&#x179D;"
                 latin:moreKeys="&#x179D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17A1: "ឡ" KHMER LETTER LA -->
             <Key
-                latin:keyLabel="&#x17A1;"
+                latin:keySpec="&#x17A1;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17C4/U+17C7: "ោះ" KHMER VOWEL SIGN OO/KHMER SIGN REAHMUK -->
             <Key
-                latin:keyLabel="&#x17C4;&#x17C7;"
+                latin:keySpec="&#x17C4;&#x17C7;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio|autoScale" />
             <!-- U+17C9: "៉" KHMER SIGN MUUSIKATOAN -->
             <Key
-                latin:keyLabel="&#x17C9;"
+                latin:keySpec="&#x17C9;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17AF: "ឯ" KHMER INDEPENDENT VOWEL QE -->
             <Key
-                latin:keyLabel="&#x17AF;"
+                latin:keySpec="&#x17AF;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
             <!-- U+17B6: "ា" KHMER VOWEL SIGN AA -->
             <Key
-                latin:keyLabel="&#x17B6;"
+                latin:keySpec="&#x17B6;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+179F: "ស" KHMER LETTER SA -->
             <Key
-                latin:keyLabel="&#x179F;"
+                latin:keySpec="&#x179F;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+178A: "ដ" KHMER LETTER DA -->
             <Key
-                latin:keyLabel="&#x178A;"
+                latin:keySpec="&#x178A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1790: "ថ" KHMER LETTER THA -->
             <Key
-                latin:keyLabel="&#x1790;"
+                latin:keySpec="&#x1790;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1784: "ង" KHMER LETTER NGO -->
             <Key
-                latin:keyLabel="&#x1784;"
+                latin:keySpec="&#x1784;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17A0: "ហ" KHMER LETTER HA -->
             <Key
-                latin:keyLabel="&#x17A0;"
+                latin:keySpec="&#x17A0;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17D2: "្" KHMER SIGN COENG -->
             <Key
-                latin:keyLabel="&#x17D2;"
+                latin:keySpec="&#x17D2;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1780: "ក" KHMER LETTER KA -->
             <Key
-                latin:keyLabel="&#x1780;"
+                latin:keySpec="&#x1780;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+179B: "ល" KHMER LETTER LO -->
             <Key
-                latin:keyLabel="&#x179B;"
+                latin:keySpec="&#x179B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17BE: "ើ" KHMER VOWEL SIGN OE -->
             <Key
-                latin:keyLabel="&#x17BE;"
+                latin:keySpec="&#x17BE;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17CB: "់" KHMER SIGN BANTOC -->
             <Key
-                latin:keyLabel="&#x17CB;"
+                latin:keySpec="&#x17CB;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17AE: "ឮ" KHMER INDEPENDENT VOWEL LYY
                  U+17AD: "ឭ" KHMER INDEPENDENT VOWEL LY
                  U+17B0: "ឰ" KHMER INDEPENDENT VOWEL QAI -->
             <Key
-                latin:keyLabel="&#x17AE;"
+                latin:keySpec="&#x17AE;"
                 latin:keyHintLabel="&#x17AD;"
                 latin:moreKeys="&#x17AD;,&#x17B0;"
                 latin:keyLabelFlags="fontNormal" />
diff --git a/java/res/xml/rowkeys_khmer4.xml b/java/res/xml/rowkeys_khmer4.xml
index 598aed8..5523d86 100644
--- a/java/res/xml/rowkeys_khmer4.xml
+++ b/java/res/xml/rowkeys_khmer4.xml
@@ -27,86 +27,86 @@
         >
             <!-- U+178D: "ឍ" KHMER LETTER TTHO -->
             <Key
-                latin:keyLabel="&#x178D;"
+                latin:keySpec="&#x178D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1783: "ឃ" KHMER LETTER KHO -->
             <Key
-                latin:keyLabel="&#x1783;"
+                latin:keySpec="&#x1783;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1787: "ជ" KHMER LETTER CO -->
             <Key
-                latin:keyLabel="&#x1787;"
+                latin:keySpec="&#x1787;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17C1/U+17C7: "េះ" KHMER VOWEL SIGN E/KHMER SIGN REAHMUK -->
             <Key
-                latin:keyLabel="&#x17C1;&#x17C7;"
+                latin:keySpec="&#x17C1;&#x17C7;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio|autoScale" />
             <!-- U+1796: "ព" KHMER LETTER PO
                  U+179E: "ឞ" KHMER LETTER SSO -->
             <Key
-                latin:keyLabel="&#x1796;"
+                latin:keySpec="&#x1796;"
                 latin:keyHintLabel="&#x179E;"
                 latin:moreKeys="&#x179E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+178E: "ណ" KHMER LETTER NNO -->
             <Key
-                latin:keyLabel="&#x178E;"
+                latin:keySpec="&#x178E;"
                 latin:keyLabelFlags="fontNormal|autoScale" />
             <!-- U+17C6: "ំ" KHMER SIGN NIKAHIT -->
             <Key
-                latin:keyLabel="&#x17C6;"
+                latin:keySpec="&#x17C6;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17BB/U+17C7: "ុះ" KHMER VOWEL SIGN U/KHMER SIGN REAHMUK -->
             <Key
-                latin:keyLabel="&#x17BB;&#x17C7;"
+                latin:keySpec="&#x17BB;&#x17C7;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+17D5: "៕" KHMER SIGN BARIYOOSAN -->
             <Key
-                latin:keyLabel="&#x17D5;"
+                latin:keySpec="&#x17D5;"
                 latin:keyLabelFlags="fontNormal" />
             <Key
-                latin:keyLabel="\?" />
+                latin:keySpec="\?" />
         </case>
         <default>
             <!-- U+178B: "ឋ" KHMER LETTER TTHA -->
             <Key
-                latin:keyLabel="&#x178B;"
+                latin:keySpec="&#x178B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1781: "ខ" KHMER LETTER KHA -->
             <Key
-                latin:keyLabel="&#x1781;"
+                latin:keySpec="&#x1781;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1785: "ច" KHMER LETTER CA -->
             <Key
-                latin:keyLabel="&#x1785;"
+                latin:keySpec="&#x1785;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+179C: "វ" KHMER LETTER VO -->
             <Key
-                latin:keyLabel="&#x179C;"
+                latin:keySpec="&#x179C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1794: "ប" KHMER LETTER BA -->
             <Key
-                latin:keyLabel="&#x1794;"
+                latin:keySpec="&#x1794;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1793: "ន" KHMER LETTER NO -->
             <Key
-                latin:keyLabel="&#x1793;"
+                latin:keySpec="&#x1793;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+1798: "ម" KHMER LETTER MO -->
             <Key
-                latin:keyLabel="&#x1798;"
+                latin:keySpec="&#x1798;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17BB/U+17C6: "ុំ" KHMER VOWEL SIGN U/KHMER SIGN NIKAHIT -->
             <Key
-                latin:keyLabel="&#x17BB;&#x17C6;"
+                latin:keySpec="&#x17BB;&#x17C6;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+17D4: "។" KHMER SIGN KHAN -->
             <Key
-                latin:keyLabel="&#x17D4;"
+                latin:keySpec="&#x17D4;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+17CA: "៊" KHMER SIGN TRIISAP -->
             <Key
-                latin:keyLabel="&#x17CA;"
+                latin:keySpec="&#x17CA;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/rowkeys_lao1.xml b/java/res/xml/rowkeys_lao1.xml
index fa1ad97..a5085a5 100644
--- a/java/res/xml/rowkeys_lao1.xml
+++ b/java/res/xml/rowkeys_lao1.xml
@@ -27,58 +27,58 @@
         >
             <!-- U+0ED1: "໑" LAO DIGIT ONE -->
             <Key
-                latin:keyLabel="&#x0ED1;"
+                latin:keySpec="&#x0ED1;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ED2: "໒" LAO DIGIT TWO -->
             <Key
-                latin:keyLabel="&#x0ED2;"
+                latin:keySpec="&#x0ED2;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ED3: "໓" LAO DIGIT THREE -->
             <Key
-                latin:keyLabel="&#x0ED3;"
+                latin:keySpec="&#x0ED3;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ED4: "໔" LAO DIGIT FOUR -->
             <Key
-                latin:keyLabel="&#x0ED4;"
+                latin:keySpec="&#x0ED4;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ECC: "໌" LAO CANCELLATION MARK -->
             <Key
-                latin:keyLabel="&#x0ECC;"
+                latin:keySpec="&#x0ECC;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EBC: "ຼ" LAO SEMIVOWEL SIGN LO -->
             <Key
-                latin:keyLabel="&#x0EBC;"
+                latin:keySpec="&#x0EBC;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ED5: "໕" LAO DIGIT FIVE -->
             <Key
-                latin:keyLabel="&#x0ED5;"
+                latin:keySpec="&#x0ED5;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ED6: "໖" LAO DIGIT SIX -->
             <Key
-                latin:keyLabel="&#x0ED6;"
+                latin:keySpec="&#x0ED6;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ED7: "໗" LAO DIGIT SEVEN -->
             <Key
-                latin:keyLabel="&#x0ED7;"
+                latin:keySpec="&#x0ED7;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ED8: "໘" LAO DIGIT EIGHT -->
             <Key
-                latin:keyLabel="&#x0ED8;"
+                latin:keySpec="&#x0ED8;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ED9: "໙" LAO DIGIT NINE -->
             <Key
-                latin:keyLabel="&#x0ED9;"
+                latin:keySpec="&#x0ED9;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ECD/U+0EC8: "ໍ່" LAO NIGGAHITA/LAO TONE MAI EK -->
             <Key
-                latin:keyLabel="&#x0ECD;&#x0EC8;"
+                latin:keySpec="&#x0ECD;&#x0EC8;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
         </case>
         <default>
             <!-- U+0EA2: "ຢ" LAO LETTER YO
                  U+0ED1: "໑" LAO DIGIT ONE -->
             <Key
-                latin:keyLabel="&#x0EA2;"
+                latin:keySpec="&#x0EA2;"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1"
                 latin:moreKeys="&#x0ED1;"
@@ -86,7 +86,7 @@
             <!-- U+0E9F: "ຟ" LAO LETTER FO SUNG
                  U+0ED2: "໒" LAO DIGIT TWO -->
             <Key
-                latin:keyLabel="&#x0E9F;"
+                latin:keySpec="&#x0E9F;"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2"
                 latin:moreKeys="&#x0ED2;"
@@ -94,7 +94,7 @@
             <!-- U+0EC2: "ໂ" LAO VOWEL SIGN O
                  U+0ED3: "໓" LAO DIGIT THREE -->
             <Key
-                latin:keyLabel="&#x0EC2;"
+                latin:keySpec="&#x0EC2;"
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3"
                 latin:moreKeys="&#x0ED3;"
@@ -102,23 +102,23 @@
             <!-- U+0E96: "ຖ" LAO LETTER THO SUNG
                  U+0ED4: "໔" LAO DIGIT FOUR -->
             <Key
-                latin:keyLabel="&#x0E96;"
+                latin:keySpec="&#x0E96;"
                 latin:keyHintLabel="4"
                 latin:additionalMoreKeys="4"
                 latin:moreKeys="&#x0ED4;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB8: "ຸ" LAO VOWEL SIGN U -->
             <Key
-                latin:keyLabel="&#x0EB8;"
+                latin:keySpec="&#x0EB8;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB9: "ູ" LAO VOWEL SIGN UU -->
             <Key
-                latin:keyLabel="&#x0EB9;"
+                latin:keySpec="&#x0EB9;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E84: "ຄ" LAO LETTER KHO TAM
                  U+0ED5: "໕" LAO DIGIT FIVE -->
             <Key
-                latin:keyLabel="&#x0E84;"
+                latin:keySpec="&#x0E84;"
                 latin:keyHintLabel="5"
                 latin:additionalMoreKeys="5"
                 latin:moreKeys="&#x0ED5;"
@@ -126,7 +126,7 @@
             <!-- U+0E95: "ຕ" LAO LETTER TO
                  U+0ED6: "໖" LAO DIGIT SIX -->
             <Key
-                latin:keyLabel="&#x0E95;"
+                latin:keySpec="&#x0E95;"
                 latin:keyHintLabel="6"
                 latin:additionalMoreKeys="6"
                 latin:moreKeys="&#x0ED6;"
@@ -134,7 +134,7 @@
             <!-- U+0E88: "ຈ" LAO LETTER CO
                  U+0ED7: "໗" LAO DIGIT SEVEN -->
             <Key
-                latin:keyLabel="&#x0E88;"
+                latin:keySpec="&#x0E88;"
                 latin:keyHintLabel="7"
                 latin:additionalMoreKeys="7"
                 latin:moreKeys="&#x0ED7;"
@@ -142,7 +142,7 @@
             <!-- U+0E82: "ຂ" LAO LETTER KHO SUNG
                  U+0ED8: "໘" LAO DIGIT EIGHT -->
             <Key
-                latin:keyLabel="&#x0E82;"
+                latin:keySpec="&#x0E82;"
                 latin:keyHintLabel="8"
                 latin:additionalMoreKeys="8"
                 latin:moreKeys="&#x0ED8;"
@@ -150,14 +150,14 @@
             <!-- U+0E8A: "ຊ" LAO LETTER SO TAM
                  U+0ED9: "໙" LAO DIGIT NINE -->
             <Key
-                latin:keyLabel="&#x0E8A;"
+                latin:keySpec="&#x0E8A;"
                 latin:keyHintLabel="9"
                 latin:additionalMoreKeys="9"
                 latin:moreKeys="&#x0ED9;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ECD: "ໍ" LAO NIGGAHITA -->
             <Key
-                latin:keyLabel="&#x0ECD;"
+                latin:keySpec="&#x0ECD;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/rowkeys_lao2.xml b/java/res/xml/rowkeys_lao2.xml
index fca58ac..67c474f 100644
--- a/java/res/xml/rowkeys_lao2.xml
+++ b/java/res/xml/rowkeys_lao2.xml
@@ -27,100 +27,100 @@
         >
             <!-- U+0EBB/U+0EC9: "" LAO VOWEL SIGN MAI KON/LAO TONE MAI THO -->
             <Key
-                latin:keyLabel="&#x0EBB;&#x0EC9;"
+                latin:keySpec="&#x0EBB;&#x0EC9;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0ED0: "໐" LAO DIGIT ZERO -->
             <Key
-                latin:keyLabel="&#x0ED0;"
+                latin:keySpec="&#x0ED0;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB3/U+0EC9: "ຳ້" LAO VOWEL SIGN AM/LAO TONE MAI THO -->
             <Key
-                latin:keyLabel="&#x0EB3;&#x0EC9;"
+                latin:keySpec="&#x0EB3;&#x0EC9;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <Key
-                latin:keyLabel="_" />
+                latin:keySpec="_" />
             <Key
-                latin:keyLabel="+" />
+                latin:keySpec="+" />
             <!-- U+0EB4/U+0EC9: "ິ້" LAO VOWEL SIGN I/LAO TONE MAI THO -->
             <Key
-                latin:keyLabel="&#x0EB4;&#x0EC9;"
+                latin:keySpec="&#x0EB4;&#x0EC9;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0EB5/U+0EC9: "ີ້" LAO VOWEL SIGN II/LAO TONE MAI THO -->
             <Key
-                latin:keyLabel="&#x0EB5;&#x0EC9;"
+                latin:keySpec="&#x0EB5;&#x0EC9;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0EA3: "ຣ" LAO LETTER LO LING -->
             <Key
-                latin:keyLabel="&#x0EA3;"
+                latin:keySpec="&#x0EA3;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EDC: "ໜ" LAO HO NO -->
             <Key
-                latin:keyLabel="&#x0EDC;"
+                latin:keySpec="&#x0EDC;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EBD: "ຽ" LAO SEMIVOWEL SIGN NYO -->
             <Key
-                latin:keyLabel="&#x0EBD;"
+                latin:keySpec="&#x0EBD;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EAB/U+0EBC: "" LAO LETTER HO SUNG/LAO SEMIVOWEL SIGN LO -->
             <Key
-                latin:keyLabel="&#x0EAB;&#x0EBC;"
+                latin:keySpec="&#x0EAB;&#x0EBC;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+201D: "”" RIGHT DOUBLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&#x201D;" />
+                latin:keySpec="&#x201D;" />
         </case>
         <default>
             <!-- U+0EBB: "ົ" LAO VOWEL SIGN MAI KON -->
             <Key
-                latin:keyLabel="&#x0EBB;"
+                latin:keySpec="&#x0EBB;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EC4: "ໄ" LAO VOWEL SIGN AI
                  U+0ED0: "໐" LAO DIGIT ZERO -->
             <Key
-                latin:keyLabel="&#x0EC4;"
+                latin:keySpec="&#x0EC4;"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="0"
                 latin:moreKeys="&#x0ED0;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB3: "ຳ" LAO VOWEL SIGN AM -->
             <Key
-                latin:keyLabel="&#x0EB3;"
+                latin:keySpec="&#x0EB3;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E9E: "ພ" LAO LETTER PHO TAM -->
             <Key
-                latin:keyLabel="&#x0E9E;"
+                latin:keySpec="&#x0E9E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB0: "ະ" LAO VOWEL SIGN A -->
             <Key
-                latin:keyLabel="&#x0EB0;"
+                latin:keySpec="&#x0EB0;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB4: "ິ" LAO VOWEL SIGN I -->
             <Key
-                latin:keyLabel="&#x0EB4;"
+                latin:keySpec="&#x0EB4;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB5: "ີ" LAO VOWEL SIGN II -->
             <Key
-                latin:keyLabel="&#x0EB5;"
+                latin:keySpec="&#x0EB5;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EAE: "ຮ" LAO LETTER HO TAM -->
             <Key
-                latin:keyLabel="&#x0EAE;"
+                latin:keySpec="&#x0EAE;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E99: "ນ" LAO LETTER NO -->
             <Key
-                latin:keyLabel="&#x0E99;"
+                latin:keySpec="&#x0E99;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E8D: "ຍ" LAO LETTER NYO -->
             <Key
-                latin:keyLabel="&#x0E8D;"
+                latin:keySpec="&#x0E8D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E9A: "ບ" LAO LETTER BO -->
             <Key
-                latin:keyLabel="&#x0E9A;"
+                latin:keySpec="&#x0E9A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EA5: "ລ" LAO LETTER LO LOOT -->
             <Key
-                latin:keyLabel="&#x0EA5;"
+                latin:keySpec="&#x0EA5;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/rowkeys_lao3.xml b/java/res/xml/rowkeys_lao3.xml
index 2a6c2d1..172716d 100644
--- a/java/res/xml/rowkeys_lao3.xml
+++ b/java/res/xml/rowkeys_lao3.xml
@@ -27,84 +27,84 @@
         >
             <!-- U+0EB1/U+0EC9: "ັ້" LAO VOWEL SIGN MAI KAN/LAO TONE MAI THO -->
             <Key
-                latin:keyLabel="&#x0EB1;&#x0EC9;"
+                latin:keySpec="&#x0EB1;&#x0EC9;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <Key
-                latin:keyLabel=";" />
+                latin:keySpec=";" />
             <Key
-                latin:keyLabel="." />
+                latin:keySpec="." />
             <Key
-                latin:keyLabel="," />
+                latin:keySpec="," />
             <Key
-                latin:keyLabel=":" />
+                latin:keySpec=":" />
             <!-- U+0ECA: "໊" LAO TONE MAI TI -->
             <Key
-                latin:keyLabel="&#x0ECA;"
+                latin:keySpec="&#x0ECA;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0ECB: "໋" LAO TONE MAI CATAWA -->
             <Key
-                latin:keyLabel="&#x0ECB;"
+                latin:keySpec="&#x0ECB;"
                 latin:keyLabelFlags="fontNormal" />
             <Key
-                latin:keyLabel="!" />
+                latin:keySpec="!" />
             <Key
-                latin:keyLabel="\?" />
+                latin:keySpec="\?" />
             <Key
-                latin:keyLabel="%" />
+                latin:keySpec="%" />
             <Key
-                latin:keyLabel="=" />
+                latin:keySpec="=" />
             <!-- U+201C: "“" LEFT DOUBLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&#x201C;" />
+                latin:keySpec="&#x201C;" />
         </case>
         <default>
             <!-- U+0EB1: "ັ" LAO VOWEL SIGN MAI KAN -->
             <Key
-                latin:keyLabel="&#x0EB1;"
+                latin:keySpec="&#x0EB1;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EAB: "ຫ" LAO LETTER HO SUNG -->
             <Key
-                latin:keyLabel="&#x0EAB;"
+                latin:keySpec="&#x0EAB;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E81: "ກ" LAO LETTER KO -->
             <Key
-                latin:keyLabel="&#x0E81;"
+                latin:keySpec="&#x0E81;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E94: "ດ" LAO LETTER DO -->
             <Key
-                latin:keyLabel="&#x0E94;"
+                latin:keySpec="&#x0E94;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EC0: "ເ" LAO VOWEL SIGN E -->
             <Key
-                latin:keyLabel="&#x0EC0;"
+                latin:keySpec="&#x0EC0;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EC9: "້" LAO TONE MAI THO -->
             <Key
-                latin:keyLabel="&#x0EC9;"
+                latin:keySpec="&#x0EC9;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EC8: "່" LAO TONE MAI EK -->
             <Key
-                latin:keyLabel="&#x0EC8;"
+                latin:keySpec="&#x0EC8;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB2: "າ" LAO VOWEL SIGN AA -->
             <Key
-                latin:keyLabel="&#x0EB2;"
+                latin:keySpec="&#x0EB2;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EAA: "ສ" LAO LETTER SO SUNG -->
             <Key
-                latin:keyLabel="&#x0EAA;"
+                latin:keySpec="&#x0EAA;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EA7: "ວ" LAO LETTER WO -->
             <Key
-                latin:keyLabel="&#x0EA7;"
+                latin:keySpec="&#x0EA7;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E87: "ງ" LAO LETTER NGO -->
             <Key
-                latin:keyLabel="&#x0E87;"
+                latin:keySpec="&#x0E87;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+201C: "“" LEFT DOUBLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&#x201C;" />
+                latin:keySpec="&#x201C;" />
         </default>
     </switch>
 </merge>
diff --git a/java/res/xml/rowkeys_lao4.xml b/java/res/xml/rowkeys_lao4.xml
index fae9cc9..ed4b9b1 100644
--- a/java/res/xml/rowkeys_lao4.xml
+++ b/java/res/xml/rowkeys_lao4.xml
@@ -27,76 +27,76 @@
         >
             <!-- U+20AD: "₭" KIP SIGN -->
             <Key
-                latin:keyLabel="&#x20AD;" />
+                latin:keySpec="&#x20AD;" />
             <Key
-                latin:keyLabel="(" />
+                latin:keySpec="(" />
             <!-- U+0EAF: "ຯ" LAO ELLIPSIS -->
             <Key
-                latin:keyLabel="&#x0EAF;"
+                latin:keySpec="&#x0EAF;"
                 latin:keyLabelFlags="fontNormal" />
             <Key
-                latin:keyLabel="\@" />
+                latin:keySpec="\@" />
             <!-- U+0EB6/U+0EC9: "ຶ້" LAO VOWEL SIGN Y/LAO TONE MAI THO -->
             <Key
-                latin:keyLabel="&#x0EB6;&#x0EC9;"
+                latin:keySpec="&#x0EB6;&#x0EC9;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0EB7/U+0EC9: "ື້" LAO VOWEL SIGN YY/LAO TONE MAI THO -->
             <Key
-                latin:keyLabel="&#x0EB7;&#x0EC9;"
+                latin:keySpec="&#x0EB7;&#x0EC9;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0EC6: "ໆ" LAO KO LA -->
             <Key
-                latin:keyLabel="&#x0EC6;"
+                latin:keySpec="&#x0EC6;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EDD: "ໝ" LAO HO MO -->
             <Key
-                latin:keyLabel="&#x0EDD;"
+                latin:keySpec="&#x0EDD;"
                 latin:keyLabelFlags="fontNormal" />
             <Key
-                latin:keyLabel="$" />
+                latin:keySpec="$" />
             <Key
-                latin:keyLabel=")" />
+                latin:keySpec=")" />
         </case>
         <default>
             <!-- U+0E9C: "ຜ" LAO LETTER PHO SUNG -->
             <Key
-                latin:keyLabel="&#x0E9C;"
+                latin:keySpec="&#x0E9C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E9B: "ປ" LAO LETTER PO -->
             <Key
-                latin:keyLabel="&#x0E9B;"
+                latin:keySpec="&#x0E9B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EC1: "ແ" LAO VOWEL SIGN EI -->
             <Key
-                latin:keyLabel="&#x0EC1;"
+                latin:keySpec="&#x0EC1;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EAD: "ອ" LAO LETTER O -->
             <Key
-                latin:keyLabel="&#x0EAD;"
+                latin:keySpec="&#x0EAD;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB6: "ຶ" LAO VOWEL SIGN Y -->
             <Key
-                latin:keyLabel="&#x0EB6;"
+                latin:keySpec="&#x0EB6;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EB7: "ື" LAO VOWEL SIGN YY -->
             <Key
-                latin:keyLabel="&#x0EB7;"
+                latin:keySpec="&#x0EB7;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E97: "ທ" LAO LETTER THO TAM -->
             <Key
-                latin:keyLabel="&#x0E97;"
+                latin:keySpec="&#x0E97;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EA1: "ມ" LAO LETTER MO -->
             <Key
-                latin:keyLabel="&#x0EA1;"
+                latin:keySpec="&#x0EA1;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0EC3: "ໃ" LAO VOWEL SIGN AY -->
             <Key
-                latin:keyLabel="&#x0EC3;"
+                latin:keySpec="&#x0EC3;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E9D: "ຝ" LAO LETTER FO TAM -->
             <Key
-                latin:keyLabel="&#x0E9D;"
+                latin:keySpec="&#x0E9D;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/rowkeys_mongolian1.xml b/java/res/xml/rowkeys_mongolian1.xml
index 6c8c8e2..4d33755 100644
--- a/java/res/xml/rowkeys_mongolian1.xml
+++ b/java/res/xml/rowkeys_mongolian1.xml
@@ -23,61 +23,61 @@
 >
     <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF -->
     <Key
-        latin:keyLabel="&#x0444;"
+        latin:keySpec="&#x0444;"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1" />
     <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE -->
     <Key
-        latin:keyLabel="&#x0446;"
+        latin:keySpec="&#x0446;"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2" />
     <!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
     <Key
-        latin:keyLabel="&#x0443;"
+        latin:keySpec="&#x0443;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:moreKeys="!text/more_keys_for_cyrillic_u" />
     <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE -->
     <Key
-        latin:keyLabel="&#x0436;"
+        latin:keySpec="&#x0436;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
     <!-- U+044D: "э" CYRILLIC SMALL LETTER E -->
     <Key
-        latin:keyLabel="&#x044D;"
+        latin:keySpec="&#x044D;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5"
         latin:moreKeys="!text/more_keys_for_cyrillic_ie" />
     <!-- U+043D: "н" CYRILLIC SMALL LETTER EN -->
     <Key
-        latin:keyLabel="&#x043D;"
+        latin:keySpec="&#x043D;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6"
         latin:moreKeys="!text/more_keys_for_cyrillic_en" />
     <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE -->
     <Key
-        latin:keyLabel="&#x0433;"
+        latin:keySpec="&#x0433;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7"
         latin:moreKeys="!text/more_keys_for_cyrillic_ghe" />
     <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA
          U+0449: "щ" CYRILLIC SMALL LETTER SHCHA -->
     <Key
-        latin:keyLabel="&#x0448;"
+        latin:keySpec="&#x0448;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="&#x0449;" />
     <!-- U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U -->
     <Key
-        latin:keyLabel="&#x04AF;"
+        latin:keySpec="&#x04AF;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9" />
     <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
     <Key
-        latin:keyLabel="&#x0437;"
+        latin:keySpec="&#x0437;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
     <!-- U+043A: "к" CYRILLIC SMALL LETTER KA -->
     <Key
-        latin:keyLabel="&#x043A;" />
+        latin:keySpec="&#x043A;" />
 </merge>
diff --git a/java/res/xml/rowkeys_mongolian2.xml b/java/res/xml/rowkeys_mongolian2.xml
index a8aa006..f11f4f2 100644
--- a/java/res/xml/rowkeys_mongolian2.xml
+++ b/java/res/xml/rowkeys_mongolian2.xml
@@ -23,35 +23,35 @@
 >
     <!-- U+0439: "й" CYRILLIC SMALL LETTER SHORT I -->
     <Key
-        latin:keyLabel="&#x0439;" />
+        latin:keySpec="&#x0439;" />
     <!-- U+044B: "ы" CYRILLIC SMALL LETTER YERU -->
     <Key
-        latin:keyLabel="&#x044B;" />
+        latin:keySpec="&#x044B;" />
     <!-- U+0431: "б" CYRILLIC SMALL LETTER BE -->
     <Key
-        latin:keyLabel="&#x0431;" />
+        latin:keySpec="&#x0431;" />
     <!-- U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O -->
     <Key
-        latin:keyLabel="&#x04E9;" />
+        latin:keySpec="&#x04E9;" />
     <!-- U+0430: "а" CYRILLIC SMALL LETTER A -->
     <Key
-        latin:keyLabel="&#x0430;" />
+        latin:keySpec="&#x0430;" />
     <!-- U+0445: "х" CYRILLIC SMALL LETTER HA -->
     <Key
-        latin:keyLabel="&#x0445;" />
+        latin:keySpec="&#x0445;" />
     <!-- U+0440: "р" CYRILLIC SMALL LETTER ER -->
     <Key
-        latin:keyLabel="&#x0440;" />
+        latin:keySpec="&#x0440;" />
     <!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
     <Key
-        latin:keyLabel="&#x043E;" />
+        latin:keySpec="&#x043E;" />
     <!-- U+043B: "л" CYRILLIC SMALL LETTER EL -->
     <Key
-        latin:keyLabel="&#x043B;" />
+        latin:keySpec="&#x043B;" />
     <!-- U+0434: "д" CYRILLIC SMALL LETTER DE -->
     <Key
-        latin:keyLabel="&#x0434;" />
+        latin:keySpec="&#x0434;" />
     <!-- U+043F: "п" CYRILLIC SMALL LETTER PE -->
     <Key
-        latin:keyLabel="&#x043F;" />
+        latin:keySpec="&#x043F;" />
 </merge>
diff --git a/java/res/xml/rowkeys_mongolian3.xml b/java/res/xml/rowkeys_mongolian3.xml
index dc80c37..cf57d1c 100644
--- a/java/res/xml/rowkeys_mongolian3.xml
+++ b/java/res/xml/rowkeys_mongolian3.xml
@@ -23,35 +23,35 @@
 >
     <!-- U+044F: "я" CYRILLIC SMALL LETTER YA -->
     <Key
-        latin:keyLabel="&#x044F;" />
+        latin:keySpec="&#x044F;" />
     <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE -->
     <Key
-        latin:keyLabel="&#x0447;" />
+        latin:keySpec="&#x0447;" />
     <!-- U+0451: "ё" CYRILLIC SMALL LETTER IO
          U+0435: "е" CYRILLIC SMALL LETTER IE -->
     <Key
-        latin:keyLabel="&#x0451;"
+        latin:keySpec="&#x0451;"
         latin:moreKeys="&#x0435;" />
     <!-- U+0441: "с" CYRILLIC SMALL LETTER ES -->
     <Key
-        latin:keyLabel="&#x0441;" />
+        latin:keySpec="&#x0441;" />
     <!-- U+043C: "м" CYRILLIC SMALL LETTER EM -->
     <Key
-        latin:keyLabel="&#x043C;" />
+        latin:keySpec="&#x043C;" />
     <!-- U+0438: "и" CYRILLIC SMALL LETTER I -->
     <Key
-        latin:keyLabel="&#x0438;" />
+        latin:keySpec="&#x0438;" />
     <!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
     <Key
-        latin:keyLabel="&#x0442;" />
+        latin:keySpec="&#x0442;" />
     <!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN
          U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
     <Key
-        latin:keyLabel="&#x044C;"
+        latin:keySpec="&#x044C;"
         latin:moreKeys="&#x044A;" />
     <!-- U+0432: "в" CYRILLIC SMALL LETTER VE
          U+044E: "ю" CYRILLIC SMALL LETTER YU -->
     <Key
-        latin:keyLabel="&#x0432;"
+        latin:keySpec="&#x0432;"
         latin:moreKeys="&#x044E;" />
 </merge>
diff --git a/java/res/xml/rowkeys_nepali_romanized1.xml b/java/res/xml/rowkeys_nepali_romanized1.xml
index 408a966..3c082c2 100644
--- a/java/res/xml/rowkeys_nepali_romanized1.xml
+++ b/java/res/xml/rowkeys_nepali_romanized1.xml
@@ -27,11 +27,11 @@
         >
             <!-- U+0920: "ठ" DEVANAGARI LETTER TTHA -->
             <Key
-                latin:keyLabel="&#x0920;"
+                latin:keySpec="&#x0920;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0914: "औ" DEVANAGARI LETTER AU -->
             <Key
-                latin:keyLabel="&#x0914;"
+                latin:keySpec="&#x0914;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -47,11 +47,11 @@
                 latin:keyboardLayout="@xml/key_devanagari_vowel_sign_vocalic_r" />
             <!-- U+0925: "थ" DEVANAGARI LETTER THA -->
             <Key
-                latin:keyLabel="&#x0925;"
+                latin:keySpec="&#x0925;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091E: "ञ" DEVANAGARI LETTER NYA -->
             <Key
-                latin:keyLabel="&#x091E;"
+                latin:keySpec="&#x091E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -69,15 +69,15 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignIi" />
             <!-- U+0913: "ओ" DEVANAGARI LETTER O -->
             <Key
-                latin:keyLabel="&#x0913;"
+                latin:keySpec="&#x0913;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092B: "फ" DEVANAGARI LETTER PHA -->
             <Key
-                latin:keyLabel="&#x092B;"
+                latin:keySpec="&#x092B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0908: "ई" DEVANAGARI LETTER II -->
             <Key
-                latin:keyLabel="&#x0908;"
+                latin:keySpec="&#x0908;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
@@ -85,7 +85,7 @@
                  U+0967: "१" DEVANAGARI DIGIT ONE
                  U+093C: "़" DEVANAGARI SIGN NUKTA -->
             <Key
-                latin:keyLabel="&#x091F;"
+                latin:keySpec="&#x091F;"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="&#x0967;,1"
                 latin:moreKeys="&#x093C;"
@@ -113,21 +113,21 @@
             <!-- U+0930: "र" DEVANAGARI LETTER RA
                  U+096A: "४" DEVANAGARI DIGIT FOUR -->
             <Key
-                latin:keyLabel="&#x0930;"
+                latin:keySpec="&#x0930;"
                 latin:keyHintLabel="4"
                 latin:additionalMoreKeys="&#x096A;,4"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0924: "त" DEVANAGARI LETTER TA
                  U+096B: "५" DEVANAGARI DIGIT FIVE -->
             <Key
-                latin:keyLabel="&#x0924;"
+                latin:keySpec="&#x0924;"
                 latin:keyHintLabel="5"
                 latin:additionalMoreKeys="&#x096B;,5"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092F: "य" DEVANAGARI LETTER YA
                  U+096C: "६" DEVANAGARI DIGIT SIX -->
             <Key
-                latin:keyLabel="&#x092F;"
+                latin:keySpec="&#x092F;"
                 latin:keyHintLabel="6"
                 latin:additionalMoreKeys="&#x096C;,6"
                 latin:keyLabelFlags="fontNormal" />
@@ -164,13 +164,13 @@
             <!-- U+092A: "प" DEVANAGARI LETTER PA
                  U+0966: "०" DEVANAGARI DIGIT ZERO -->
             <Key
-                latin:keyLabel="&#x092A;"
+                latin:keySpec="&#x092A;"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="&#x0966;,0"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0907: "इ" DEVANAGARI LETTER I -->
             <Key
-                latin:keyLabel="&#x0907;"
+                latin:keySpec="&#x0907;"
                 latin:keyLabelFlags="fontNormal" />
          </default>
     </switch>
diff --git a/java/res/xml/rowkeys_nepali_romanized2.xml b/java/res/xml/rowkeys_nepali_romanized2.xml
index 66359ff..561ae6c 100644
--- a/java/res/xml/rowkeys_nepali_romanized2.xml
+++ b/java/res/xml/rowkeys_nepali_romanized2.xml
@@ -27,43 +27,43 @@
         >
             <!-- U+0906: "आ" DEVANAGARI LETTER AA -->
             <Key
-                latin:keyLabel="&#x0906;"
+                latin:keySpec="&#x0906;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0936: "श" DEVANAGARI LETTER SHA -->
             <Key
-                latin:keyLabel="&#x0936;"
+                latin:keySpec="&#x0936;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0927: "ध" DEVANAGARI LETTER DHA -->
             <Key
-                latin:keyLabel="&#x0927;"
+                latin:keySpec="&#x0927;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+090A: "ऊ" DEVANAGARI LETTER UU -->
             <Key
-                latin:keyLabel="&#x090A;"
+                latin:keySpec="&#x090A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0918: "घ" DEVANAGARI LETTER GHA -->
             <Key
-                latin:keyLabel="&#x0918;"
+                latin:keySpec="&#x0918;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0905: "अ" DEVANAGARI LETTER A -->
             <Key
-                latin:keyLabel="&#x0905;"
+                latin:keySpec="&#x0905;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091D: "झ" DEVANAGARI LETTER JHA -->
             <Key
-                latin:keyLabel="&#x091D;"
+                latin:keySpec="&#x091D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0916: "ख" DEVANAGARI LETTER KHA -->
             <Key
-                latin:keyLabel="&#x0916;"
+                latin:keySpec="&#x0916;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0965: "॥" DEVANAGARI DOUBLE DANDA -->
             <Key
-                latin:keyLabel="&#x0965;"
+                latin:keySpec="&#x0965;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0910: "ऐ" DEVANAGARI LETTER AI -->
             <Key
-                latin:keyLabel="&#x0910;"
+                latin:keySpec="&#x0910;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -83,43 +83,43 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignAa" />
             <!-- U+0938: "स" DEVANAGARI LETTER SA -->
             <Key
-                latin:keyLabel="&#x0938;"
+                latin:keySpec="&#x0938;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0926: "द" DEVANAGARI LETTER DA -->
             <Key
-                latin:keyLabel="&#x0926;"
+                latin:keySpec="&#x0926;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0909: "उ" DEVANAGARI LETTER U -->
             <Key
-                latin:keyLabel="&#x0909;"
+                latin:keySpec="&#x0909;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0917: "ग" DEVANAGARI LETTER GA -->
             <Key
-                latin:keyLabel="&#x0917;"
+                latin:keySpec="&#x0917;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0939: "ह" DEVANAGARI LETTER HA -->
             <Key
-                latin:keyLabel="&#x0939;"
+                latin:keySpec="&#x0939;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091C: "ज" DEVANAGARI LETTER JA -->
             <Key
-                latin:keyLabel="&#x091C;"
+                latin:keySpec="&#x091C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0915: "क" DEVANAGARI LETTER KA -->
             <Key
-                latin:keyLabel="&#x0915;"
+                latin:keySpec="&#x0915;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0932: "ल" DEVANAGARI LETTER LA -->
             <Key
-                latin:keyLabel="&#x0932;"
+                latin:keySpec="&#x0932;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+090F: "ए" DEVANAGARI LETTER E -->
             <Key
-                latin:keyLabel="&#x090F;"
+                latin:keySpec="&#x090F;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0950: "ॐ" DEVANAGARI OM -->
             <Key
-                latin:keyLabel="&#x0950;"
+                latin:keySpec="&#x0950;"
                 latin:keyLabelFlags="fontNormal" />
          </default>
     </switch>
diff --git a/java/res/xml/rowkeys_nepali_romanized3.xml b/java/res/xml/rowkeys_nepali_romanized3.xml
index 166d028..232d96e 100644
--- a/java/res/xml/rowkeys_nepali_romanized3.xml
+++ b/java/res/xml/rowkeys_nepali_romanized3.xml
@@ -27,15 +27,15 @@
         >
             <!-- U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R -->
             <Key
-                latin:keyLabel="&#x090B;"
+                latin:keySpec="&#x090B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0922: "ढ" DEVANAGARI LETTER DDHA -->
             <Key
-                latin:keyLabel="&#x0922;"
+                latin:keySpec="&#x0922;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091B: "छ" DEVANAGARI LETTER CHA -->
             <Key
-                latin:keyLabel="&#x091B;"
+                latin:keySpec="&#x091B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -44,11 +44,11 @@
                 latin:keyboardLayout="@xml/key_devanagari_sign_candrabindu" />
             <!-- U+092D: "भ" DEVANAGARI LETTER BHA -->
             <Key
-                latin:keyLabel="&#x092D;"
+                latin:keySpec="&#x092D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0923: "ण" DEVANAGARI LETTER NNA -->
             <Key
-                latin:keyLabel="&#x0923;"
+                latin:keySpec="&#x0923;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -57,7 +57,7 @@
                 latin:keyboardLayout="@xml/key_devanagari_sign_anusvara" />
             <!-- U+0919: "ङ" DEVANAGARI LETTER NGA -->
             <Key
-                latin:keyLabel="&#x0919;"
+                latin:keySpec="&#x0919;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -70,36 +70,36 @@
         <default>
             <!-- U+0937: "ष" DEVANAGARI LETTER SSA -->
             <Key
-                latin:keyLabel="&#x0937;"
+                latin:keySpec="&#x0937;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0921: "ड" DEVANAGARI LETTER DDA -->
             <Key
-                latin:keyLabel="&#x0921;"
+                latin:keySpec="&#x0921;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091A: "च" DEVANAGARI LETTER CA -->
             <Key
-                latin:keyLabel="&#x091A;"
+                latin:keySpec="&#x091A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0935: "व" DEVANAGARI LETTER VA -->
             <Key
-                latin:keyLabel="&#x0935;"
+                latin:keySpec="&#x0935;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092C: "ब" DEVANAGARI LETTER BHA -->
             <Key
-                latin:keyLabel="&#x092C;"
+                latin:keySpec="&#x092C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0928: "न" DEVANAGARI LETTER NA -->
             <Key
-                latin:keyLabel="&#x0928;"
+                latin:keySpec="&#x0928;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092E: "म" DEVANAGARI LETTER MA -->
             <Key
-                latin:keyLabel="&#x092E;"
+                latin:keySpec="&#x092E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0964: "।" DEVANAGARI DANDA
                  U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA -->
             <Key
-                latin:keyLabel="&#x0964;"
+                latin:keySpec="&#x0964;"
                 latin:moreKeys="&#x093D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
diff --git a/java/res/xml/rowkeys_nepali_traditional1.xml b/java/res/xml/rowkeys_nepali_traditional1.xml
index c7883c7..98a7be2 100644
--- a/java/res/xml/rowkeys_nepali_traditional1.xml
+++ b/java/res/xml/rowkeys_nepali_traditional1.xml
@@ -30,61 +30,61 @@
                  U+091C/U+094D/U+091E: "ज्ञ" DEVANAGARI LETTER JA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER NYA
                  U+0965: "॥" DEVANAGARI DOUBLE DANDA -->
             <Key
-                latin:keyLabel="&#x0924;&#x094D;&#x0924;"
+                latin:keySpec="&#x0924;&#x094D;&#x0924;"
                 latin:moreKeys="&#x091E;,&#x091C;&#x094D;&#x091E;,&#x0965;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0921/U+094D/U+0922: "ड्ढ" DEVANAGARI LETTER DDA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER DDHA
                  U+0908: "ई" DEVANAGARI LETTER II -->
             <Key
-                latin:keyLabel="&#x0921;&#x094D;&#x0922;"
+                latin:keySpec="&#x0921;&#x094D;&#x0922;"
                 latin:moreKeys="&#x0908;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0910: "ऐ" DEVANAGARI LETTER AI
                  U+0918: "घ" DEVANAGARI LETTER GHA -->
             <Key
-                latin:keyLabel="&#x0910;"
+                latin:keySpec="&#x0910;"
                 latin:moreKeys="&#x0918;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0926/U+094D/U+0935: "द्व" DEVANAGARI LETTER DA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER VA
                  U+0926/U+094D/U+0927: "द्ध" DEVANAGARI LETTER DA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER DHA -->
             <Key
-                latin:keyLabel="&#x0926;&#x094D;&#x0935;"
+                latin:keySpec="&#x0926;&#x094D;&#x0935;"
                 latin:moreKeys="&#x0926;&#x094D;&#x0927;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+091F/U+094D/U+091F: "ट्ट" DEVANAGARI LETTER TTA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER TTA
                  U+091B: "छ" DEVANAGARI LETTER CHA -->
             <Key
-                latin:keyLabel="&#x091F;&#x094D;&#x091F;"
+                latin:keySpec="&#x091F;&#x094D;&#x091F;"
                 latin:moreKeys="&#x091B;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0920/U+094D/U+0920: "ठ्ठ" DEVANAGARI LETTER TTHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER TTHA
                  U+091F: "ट" DEVANAGARI LETTER TTA -->
             <Key
-                latin:keyLabel="&#x0920;&#x094D;&#x0920;"
+                latin:keySpec="&#x0920;&#x094D;&#x0920;"
                 latin:moreKeys="&#x091F;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+090A: "ऊ" DEVANAGARI LETTER UU
                  U+0920: "ठ" DEVANAGARI LETTER TTHA -->
             <Key
-                latin:keyLabel="&#x090A;"
+                latin:keySpec="&#x090A;"
                 latin:moreKeys="&#x0920;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0915/U+094D/U+0937: "क्ष" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER SSA
                  U+0921: "ड" DEVANAGARI LETTER DDA -->
             <Key
-                latin:keyLabel="&#x0915;&#x094D;&#x0937;"
+                latin:keySpec="&#x0915;&#x094D;&#x0937;"
                 latin:moreKeys="&#x0921;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0907: "इ" DEVANAGARI LETTER I
                  U+0922: "ढ" DEVANAGARI LETTER DDHA -->
             <Key
-                latin:keyLabel="&#x0907;"
+                latin:keySpec="&#x0907;"
                 latin:moreKeys="&#x0922;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+090F: "ए" DEVANAGARI LETTER E
                  U+0923: "ण" DEVANAGARI LETTER NNA -->
             <Key
-                latin:keyLabel="&#x090F;"
+                latin:keySpec="&#x090F;"
                 latin:moreKeys="&#x0923;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
@@ -97,77 +97,77 @@
             <!-- U+091F: "ट" DEVANAGARI LETTER TTA
                  U+0967: "१" DEVANAGARI DIGIT ONE -->
             <Key
-                latin:keyLabel="&#x091F;"
+                latin:keySpec="&#x091F;"
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="&#x0967;,1"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0927: "ध" DEVANAGARI LETTER DHA
                  U+0968: "२" DEVANAGARI DIGIT TWO -->
             <Key
-                latin:keyLabel="&#x0927;"
+                latin:keySpec="&#x0927;"
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="&#x0968;,2"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092D: "भ" DEVANAGARI LETTER BHA
                  U+0969: "३" DEVANAGARI DIGIT THREE -->
             <Key
-                latin:keyLabel="&#x092D;"
+                latin:keySpec="&#x092D;"
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="&#x0969;,3"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091A: "च" DEVANAGARI LETTER CA
                  U+096A: "४" DEVANAGARI DIGIT FOUR -->
             <Key
-                latin:keyLabel="&#x091A;"
+                latin:keySpec="&#x091A;"
                 latin:keyHintLabel="4"
                 latin:additionalMoreKeys="&#x096A;,4"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0924: "त" DEVANAGARI LETTER TA
                  U+096B: "५" DEVANAGARI DIGIT FIVE -->
             <Key
-                latin:keyLabel="&#x0924;"
+                latin:keySpec="&#x0924;"
                 latin:keyHintLabel="5"
                 latin:additionalMoreKeys="&#x096B;,5"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0925: "थ" DEVANAGARI LETTER THA
                  U+096C: "६" DEVANAGARI DIGIT SIX -->
             <Key
-                latin:keyLabel="&#x0925;"
+                latin:keySpec="&#x0925;"
                 latin:keyHintLabel="6"
                 latin:additionalMoreKeys="&#x096C;,6"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0917: "ग" DEVANAGARI LETTER G
                  U+096D: "७" DEVANAGARI DIGIT SEVEN -->
             <Key
-                latin:keyLabel="&#x0917;"
+                latin:keySpec="&#x0917;"
                 latin:keyHintLabel="7"
                 latin:additionalMoreKeys="&#x096D;,7"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0937: "ष" DEVANAGARI LETTER SSA
                  U+096E: "८" DEVANAGARI DIGIT EIGHT -->
             <Key
-                latin:keyLabel="&#x0937;"
+                latin:keySpec="&#x0937;"
                 latin:keyHintLabel="8"
                 latin:additionalMoreKeys="&#x096E;,8"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092F: "य" DEVANAGARI LETTER YA
                  U+096F: "९" DEVANAGARI DIGIT NINE -->
             <Key
-                latin:keyLabel="&#x092F;"
+                latin:keySpec="&#x092F;"
                 latin:keyHintLabel="9"
                 latin:additionalMoreKeys="&#x096F;,9"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0909: "उ" DEVANAGARI LETTER U
                  U+0966: "०" DEVANAGARI DIGIT ZERO -->
             <Key
-                latin:keyLabel="&#x0909;"
+                latin:keySpec="&#x0909;"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="&#x0966;,0"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0907: "इ" DEVANAGARI LETTER I
                  U+0914: "औ" DEVANAGARI LETTER AU -->
             <Key
-                latin:keyLabel="&#x0907;"
+                latin:keySpec="&#x0907;"
                 latin:moreKeys="&#x0914;"
                 latin:keyLabelFlags="fontNormal" />
          </default>
diff --git a/java/res/xml/rowkeys_nepali_traditional2.xml b/java/res/xml/rowkeys_nepali_traditional2.xml
index 45620a9..5ea14ea 100644
--- a/java/res/xml/rowkeys_nepali_traditional2.xml
+++ b/java/res/xml/rowkeys_nepali_traditional2.xml
@@ -27,15 +27,15 @@
         >
             <!-- U+0906: "आ" DEVANAGARI LETTER AA -->
             <Key
-                latin:keyLabel="&#x0906;"
+                latin:keySpec="&#x0906;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0919/U+094D: "ङ्" DEVANAGARI LETTER NGA/DEVANAGARI SIGN VIRAMA -->
             <Key
-                latin:keyLabel="&#x0919;&#x094D;"
+                latin:keySpec="&#x0919;&#x094D;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0921/U+094D/U+0921: "ड्ड" DEVANAGARI LETTER DDA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER DDA -->
             <Key
-                latin:keyLabel="&#x0921;&#x094D;&#x0921;"
+                latin:keySpec="&#x0921;&#x094D;&#x0921;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -44,11 +44,11 @@
                 latin:keyboardLayout="@xml/key_devanagari_sign_candrabindu" />
             <!-- U+0926/U+094D/U+0926: "द्द" DEVANAGARI LETTER DA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER DA -->
             <Key
-                latin:keyLabel="&#x0926;&#x094D;&#x0926;"
+                latin:keySpec="&#x0926;&#x094D;&#x0926;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+091D: "झ" DEVANAGARI LETTER JHA -->
             <Key
-                latin:keyLabel="&#x091D;"
+                latin:keySpec="&#x091D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -59,7 +59,7 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignO" />
             <!-- U+092B: "फ" DEVANAGARI LETTER PHA -->
             <Key
-                latin:keyLabel="&#x092B;"
+                latin:keySpec="&#x092B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -70,7 +70,7 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignIi" />
             <!-- U+091F/U+094D/U+0920: "ट्ठ" DEVANAGARI LETTER TTA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER TTHA -->
             <Key
-                latin:keyLabel="&#x091F;&#x094D;&#x0920;"
+                latin:keySpec="&#x091F;&#x094D;&#x0920;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -83,15 +83,15 @@
         <default>
             <!-- U+092C: "ब" DEVANAGARI LETTER BA -->
             <Key
-                latin:keyLabel="&#x092C;"
+                latin:keySpec="&#x092C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0915: "क" DEVANAGARI LETTER KA -->
             <Key
-                latin:keyLabel="&#x0915;"
+                latin:keySpec="&#x0915;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092E: "म" DEVANAGARI LETTER MA -->
             <Key
-                latin:keyLabel="&#x092E;"
+                latin:keySpec="&#x092E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -102,19 +102,19 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignAa" />
             <!-- U+0928: "न" DEVANAGARI LETTER NA -->
             <Key
-                latin:keyLabel="&#x0928;"
+                latin:keySpec="&#x0928;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+091C: "ज" DEVANAGARI LETTER JA -->
             <Key
-                latin:keyLabel="&#x091C;"
+                latin:keySpec="&#x091C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0935: "व" DEVANAGARI LETTER VA -->
             <Key
-                latin:keyLabel="&#x0935;"
+                latin:keySpec="&#x0935;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+092A: "प" DEVANAGARI LETTER PA -->
             <Key
-                latin:keyLabel="&#x092A;"
+                latin:keySpec="&#x092A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -125,7 +125,7 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignI" />
             <!-- U+0938: "स" DEVANAGARI LETTER SA -->
             <Key
-                latin:keyLabel="&#x0938;"
+                latin:keySpec="&#x0938;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
diff --git a/java/res/xml/rowkeys_nepali_traditional3_left6.xml b/java/res/xml/rowkeys_nepali_traditional3_left6.xml
index 1cacced..59f6e65 100644
--- a/java/res/xml/rowkeys_nepali_traditional3_left6.xml
+++ b/java/res/xml/rowkeys_nepali_traditional3_left6.xml
@@ -27,19 +27,19 @@
         >
             <!-- U+0915/U+094D: "क्" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA -->
             <Key
-                latin:keyLabel="&#x0915;&#x094D;"
+                latin:keySpec="&#x0915;&#x094D;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0939/U+094D/U+092E: "ह्म" DEVANAGARI LETTER HA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER MA -->
             <Key
-                latin:keyLabel="&#x0939;&#x094D;&#x092E;"
+                latin:keySpec="&#x0939;&#x094D;&#x092E;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R -->
             <Key
-                latin:keyLabel="&#x090B;"
+                latin:keySpec="&#x090B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0950: "ॐ" DEVANAGARI OM -->
             <Key
-                latin:keyLabel="&#x0950;"
+                latin:keySpec="&#x0950;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -50,33 +50,33 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignAu" />
             <!-- U+0926/U+094D/U+092F: "द्य" DEVANAGARI LETTER DA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER YA -->
             <Key
-                latin:keyLabel="&#x0926;&#x094D;&#x092F;"
+                latin:keySpec="&#x0926;&#x094D;&#x092F;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
         </case>
         <default>
             <!-- U+0936: "श" DEVANAGARI LETTER SHA -->
             <Key
-                latin:keyLabel="&#x0936;"
+                latin:keySpec="&#x0936;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0939: "ह" DEVANAGARI LETTER HA -->
             <Key
-                latin:keyLabel="&#x0939;"
+                latin:keySpec="&#x0939;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0905: "अ" DEVANAGARI LETTER A -->
             <Key
-                latin:keyLabel="&#x0905;"
+                latin:keySpec="&#x0905;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0916: "ख" DEVANAGARI LETTER KHA -->
             <Key
-                latin:keyLabel="&#x0916;"
+                latin:keySpec="&#x0916;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0926: "द" DEVANAGARI LETTER DA -->
             <Key
-                latin:keyLabel="&#x0926;"
+                latin:keySpec="&#x0926;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0932: "ल" DEVANAGARI LETTER LA -->
             <Key
-                latin:keyLabel="&#x0932;"
+                latin:keySpec="&#x0932;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/rowkeys_nepali_traditional3_right3.xml b/java/res/xml/rowkeys_nepali_traditional3_right3.xml
index b2e01e4..d6a74d4 100644
--- a/java/res/xml/rowkeys_nepali_traditional3_right3.xml
+++ b/java/res/xml/rowkeys_nepali_traditional3_right3.xml
@@ -32,7 +32,7 @@
                 latin:keyboardLayout="@xml/key_devanagari_sign_anusvara" />
             <!-- U+0919: "ङ" DEVANAGARI LETTER NGA -->
             <Key
-                latin:keyLabel="&#x0919;"
+                latin:keySpec="&#x0919;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -52,12 +52,12 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignE" />
             <!-- U+0964: "।" DEVANAGARI DANDA -->
             <Key
-                latin:keyLabel="&#x0964;"
+                latin:keySpec="&#x0964;"
                 latin:keyLabelFlags="fontNormal" />
              <!-- U+0930: "र" DEVANAGARI LETTER RA
                   U+0930/U+0941: "रु" DEVANAGARI LETTER RA/DEVANAGARI VOWEL SIGN U -->
             <Key
-                latin:keyLabel="&#x0930;"
+                latin:keySpec="&#x0930;"
                 latin:moreKeys="&#x0930;&#x0941;"
                 latin:keyLabelFlags="fontNormal" />
          </default>
diff --git a/java/res/xml/rowkeys_nepali_traditional3_right5.xml b/java/res/xml/rowkeys_nepali_traditional3_right5.xml
index 87f0616..a34f400 100644
--- a/java/res/xml/rowkeys_nepali_traditional3_right5.xml
+++ b/java/res/xml/rowkeys_nepali_traditional3_right5.xml
@@ -32,7 +32,7 @@
                 latin:keyboardLayout="@xml/key_devanagari_sign_anusvara" />
             <!-- U+0919: "ङ" DEVANAGARI LETTER NGA -->
             <Key
-                latin:keyLabel="&#x0919;"
+                latin:keySpec="&#x0919;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
                  render dotted circle for incomplete combining letter of some scripts, different
@@ -43,11 +43,11 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignAi" />
             <!-- U+0930/U+0941: "रु" DEVANAGARI LETTER RA/DEVANAGARI VOWEL SIGN U -->
             <Key
-                latin:keyLabel="&#x0930;&#x0941;"
+                latin:keySpec="&#x0930;&#x0941;"
                 latin:moreKeys="!"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <Key
-                latin:keyLabel="\?" />
+                latin:keySpec="\?" />
         </case>
         <default>
             <!-- Because the font rendering system prior to API version 16 can't automatically
@@ -71,11 +71,11 @@
                 latin:keyStyle="baseKeyDevanagariVowelSignE" />
             <!-- U+0964: "।" DEVANAGARI DANDA -->
             <Key
-                latin:keyLabel="&#x0964;"
+                latin:keySpec="&#x0964;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0930: "र" DEVANAGARI LETTER RA -->
             <Key
-                latin:keyLabel="&#x0930;"
+                latin:keySpec="&#x0930;"
                 latin:moreKeys="!"
                 latin:keyLabelFlags="fontNormal" />
             <!-- Because the font rendering system prior to API version 16 can't automatically
diff --git a/java/res/xml/rowkeys_nordic1.xml b/java/res/xml/rowkeys_nordic1.xml
index 72ac86b..40e556b 100644
--- a/java/res/xml/rowkeys_nordic1.xml
+++ b/java/res/xml/rowkeys_nordic1.xml
@@ -24,5 +24,5 @@
     <include
         latin:keyboardLayout="@xml/rowkeys_qwerty1" />
     <Key
-        latin:keyLabel="!text/keylabel_for_nordic_row1_11" />
+        latin:keySpec="!text/keylabel_for_nordic_row1_11" />
 </merge>
diff --git a/java/res/xml/rowkeys_nordic2.xml b/java/res/xml/rowkeys_nordic2.xml
index 836214a..4064e4f 100644
--- a/java/res/xml/rowkeys_nordic2.xml
+++ b/java/res/xml/rowkeys_nordic2.xml
@@ -24,9 +24,9 @@
     <include
         latin:keyboardLayout="@xml/rowkeys_qwerty2" />
     <Key
-        latin:keyLabel="!text/keylabel_for_nordic_row2_10"
+        latin:keySpec="!text/keylabel_for_nordic_row2_10"
         latin:moreKeys="!text/more_keys_for_nordic_row2_10" />
     <Key
-        latin:keyLabel="!text/keylabel_for_nordic_row2_11"
+        latin:keySpec="!text/keylabel_for_nordic_row2_11"
         latin:moreKeys="!text/more_keys_for_nordic_row2_11" />
 </merge>
diff --git a/java/res/xml/rowkeys_pcqwerty1.xml b/java/res/xml/rowkeys_pcqwerty1.xml
index 1ac264a..fdb5072 100644
--- a/java/res/xml/rowkeys_pcqwerty1.xml
+++ b/java/res/xml/rowkeys_pcqwerty1.xml
@@ -22,60 +22,60 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="`"
+        latin:keySpec="`"
         latin:additionalMoreKeys="~" />
     <Key
-        latin:keyLabel="1"
+        latin:keySpec="1"
         latin:additionalMoreKeys="!,!text/more_keys_for_exclamation"
         latin:moreKeys="!text/more_keys_for_symbols_1" />
     <Key
-        latin:keyLabel="2"
+        latin:keySpec="2"
         latin:additionalMoreKeys="\@"
         latin:moreKeys="!text/more_keys_for_symbols_2" />
     <Key
-        latin:keyLabel="3"
+        latin:keySpec="3"
         latin:additionalMoreKeys="\#"
         latin:moreKeys="!text/more_keys_for_symbols_3" />
     <Key
-        latin:keyLabel="4"
+        latin:keySpec="4"
         latin:additionalMoreKeys="$"
         latin:moreKeys="!text/more_keys_for_symbols_4" />
     <Key
-        latin:keyLabel="5"
+        latin:keySpec="5"
         latin:additionalMoreKeys="\\%"
         latin:moreKeys="!text/more_keys_for_symbols_5" />
     <Key
-        latin:keyLabel="6"
+        latin:keySpec="6"
         latin:additionalMoreKeys="^"
         latin:moreKeys="!text/more_keys_for_symbols_6" />
     <Key
-        latin:keyLabel="7"
+        latin:keySpec="7"
         latin:additionalMoreKeys="&amp;"
         latin:moreKeys="!text/more_keys_for_symbols_7" />
     <Key
-        latin:keyLabel="8"
+        latin:keySpec="8"
         latin:additionalMoreKeys="*"
         latin:moreKeys="!text/more_keys_for_symbols_8" />
     <Key
-        latin:keyLabel="9"
+        latin:keySpec="9"
         latin:additionalMoreKeys="("
         latin:moreKeys="!text/more_keys_for_symbols_9" />
     <Key
-        latin:keyLabel="0"
+        latin:keySpec="0"
         latin:additionalMoreKeys=")"
         latin:moreKeys="!text/more_keys_for_symbols_0" />
     <!-- U+2013: "–" EN DASH
          U+2014: "—" EM DASH
          U+00B7: "·" MIDDLE DOT -->
     <Key
-        latin:keyLabel="-"
+        latin:keySpec="-"
         latin:additionalMoreKeys="_"
         latin:moreKeys="&#x2013;,&#x2014;,&#x00B7;" />
     <!-- U+221E: "∞" INFINITY
          U+2260: "≠" NOT EQUAL TO
          U+2248: "≈" ALMOST EQUAL TO -->
     <Key
-        latin:keyLabel="="
+        latin:keySpec="="
         latin:additionalMoreKeys="+"
         latin:moreKeys="!fixedColumnOrder!4,&#x221E;,&#x2260;,&#x2248;,%" />
 </merge>
diff --git a/java/res/xml/rowkeys_pcqwerty1_shift.xml b/java/res/xml/rowkeys_pcqwerty1_shift.xml
index 718acfd..b9597c0 100644
--- a/java/res/xml/rowkeys_pcqwerty1_shift.xml
+++ b/java/res/xml/rowkeys_pcqwerty1_shift.xml
@@ -22,39 +22,39 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="~" />
+        latin:keySpec="~" />
     <Key
-        latin:keyLabel="!"
+        latin:keySpec="!"
         latin:additionalMoreKeys="!text/more_keys_for_exclamation" />
     <Key
-        latin:keyLabel="\@" />
+        latin:keySpec="\@" />
     <Key
-        latin:keyLabel="\#" />
+        latin:keySpec="\#" />
     <Key
-        latin:keyLabel="$"
+        latin:keySpec="$"
         latin:additionalMoreKeys="!text/more_keys_for_currency_dollar" />
     <Key
-        latin:keyLabel="%"
+        latin:keySpec="%"
         latin:additionalMoreKeys="!text/more_keys_for_symbols_percent" />
     <Key
-        latin:keyLabel="^" />
+        latin:keySpec="^" />
     <Key
-        latin:keyLabel="&amp;" />
+        latin:keySpec="&amp;" />
     <Key
-        latin:keyLabel="*"
+        latin:keySpec="*"
         latin:additionalMoreKeys="!text/more_keys_for_star" />
     <Key
-        latin:keyLabel="(" />
+        latin:keySpec="(" />
     <Key
-        latin:keyLabel=")" />
+        latin:keySpec=")" />
     <Key
-        latin:keyLabel="_" />
+        latin:keySpec="_" />
     <!-- U+00B1: "±" PLUS-MINUS SIGN
          U+00D7: "×" MULTIPLICATION SIGN
          U+00F7: "÷" DIVISION SIGN
          U+221A: "√" SQUARE ROOT -->
     <Key
-        latin:keyLabel="+"
+        latin:keySpec="+"
         latin:additionalMoreKeys="!text/more_keys_for_plus"
         latin:moreKeys="&#x00B1;,&#x00D7;,&#x00F7;,&#x221A;" />
 </merge>
diff --git a/java/res/xml/rowkeys_qwerty1.xml b/java/res/xml/rowkeys_qwerty1.xml
index e7c9b59..7ebde8d 100644
--- a/java/res/xml/rowkeys_qwerty1.xml
+++ b/java/res/xml/rowkeys_qwerty1.xml
@@ -22,52 +22,52 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="!text/keylabel_for_q"
+        latin:keySpec="!text/keylabel_for_q"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1"
         latin:moreKeys="!text/more_keys_for_q" />
     <Key
-        latin:keyLabel="!text/keylabel_for_w"
+        latin:keySpec="!text/keylabel_for_w"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2"
         latin:moreKeys="!text/more_keys_for_w" />
     <Key
-        latin:keyLabel="e"
+        latin:keySpec="e"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:moreKeys="!text/more_keys_for_e" />
     <Key
-        latin:keyLabel="r"
+        latin:keySpec="r"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4"
         latin:moreKeys="!text/more_keys_for_r" />
     <Key
-        latin:keyLabel="t"
+        latin:keySpec="t"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5"
         latin:moreKeys="!text/more_keys_for_t" />
     <Key
-        latin:keyLabel="!text/keylabel_for_y"
+        latin:keySpec="!text/keylabel_for_y"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6"
         latin:moreKeys="!text/more_keys_for_y" />
     <Key
-        latin:keyLabel="u"
+        latin:keySpec="u"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7"
         latin:moreKeys="!text/more_keys_for_u" />
     <Key
-        latin:keyLabel="i"
+        latin:keySpec="i"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="!text/more_keys_for_i" />
     <Key
-        latin:keyLabel="o"
+        latin:keySpec="o"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9"
         latin:moreKeys="!text/more_keys_for_o" />
     <Key
-        latin:keyLabel="p"
+        latin:keySpec="p"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
 </merge>
diff --git a/java/res/xml/rowkeys_qwerty2.xml b/java/res/xml/rowkeys_qwerty2.xml
index d9777d9..0700cce 100644
--- a/java/res/xml/rowkeys_qwerty2.xml
+++ b/java/res/xml/rowkeys_qwerty2.xml
@@ -22,29 +22,29 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="a"
+        latin:keySpec="a"
         latin:moreKeys="!text/more_keys_for_a" />
     <Key
-        latin:keyLabel="s"
+        latin:keySpec="s"
         latin:moreKeys="!text/more_keys_for_s" />
     <Key
-        latin:keyLabel="d"
+        latin:keySpec="d"
         latin:moreKeys="!text/more_keys_for_d" />
     <Key
-        latin:keyLabel="f" />
+        latin:keySpec="f" />
     <Key
-        latin:keyLabel="g"
+        latin:keySpec="g"
         latin:moreKeys="!text/more_keys_for_g" />
     <Key
-        latin:keyLabel="h"
+        latin:keySpec="h"
         latin:moreKeys="!text/more_keys_for_h" />
     <Key
-        latin:keyLabel="j"
+        latin:keySpec="j"
         latin:moreKeys="!text/more_keys_for_j" />
     <Key
-        latin:keyLabel="k"
+        latin:keySpec="k"
         latin:moreKeys="!text/more_keys_for_k" />
     <Key
-        latin:keyLabel="l"
+        latin:keySpec="l"
         latin:moreKeys="!text/more_keys_for_l" />
 </merge>
diff --git a/java/res/xml/rowkeys_qwerty3.xml b/java/res/xml/rowkeys_qwerty3.xml
index b70fd72..b48606c 100644
--- a/java/res/xml/rowkeys_qwerty3.xml
+++ b/java/res/xml/rowkeys_qwerty3.xml
@@ -22,22 +22,22 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="z"
+        latin:keySpec="z"
         latin:moreKeys="!text/more_keys_for_z" />
     <Key
-        latin:keyLabel="!text/keylabel_for_x"
+        latin:keySpec="!text/keylabel_for_x"
         latin:moreKeys="!text/more_keys_for_x" />
     <Key
-        latin:keyLabel="c"
+        latin:keySpec="c"
         latin:moreKeys="!text/more_keys_for_c" />
     <Key
-        latin:keyLabel="v"
+        latin:keySpec="v"
         latin:moreKeys="!text/more_keys_for_v" />
     <Key
-        latin:keyLabel="b" />
+        latin:keySpec="b" />
     <Key
-        latin:keyLabel="n"
+        latin:keySpec="n"
         latin:moreKeys="!text/more_keys_for_n" />
     <Key
-        latin:keyLabel="m" />
+        latin:keySpec="m" />
 </merge>
diff --git a/java/res/xml/rowkeys_qwertz1.xml b/java/res/xml/rowkeys_qwertz1.xml
index d87f03d..61ce97b 100644
--- a/java/res/xml/rowkeys_qwertz1.xml
+++ b/java/res/xml/rowkeys_qwertz1.xml
@@ -22,51 +22,51 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="q"
+        latin:keySpec="q"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1" />
     <Key
-        latin:keyLabel="w"
+        latin:keySpec="w"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2"
         latin:moreKeys="!text/more_keys_for_w" />
     <Key
-        latin:keyLabel="e"
+        latin:keySpec="e"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:moreKeys="!text/more_keys_for_e" />
     <Key
-        latin:keyLabel="r"
+        latin:keySpec="r"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4"
         latin:moreKeys="!text/more_keys_for_r" />
     <Key
-        latin:keyLabel="t"
+        latin:keySpec="t"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5"
         latin:moreKeys="!text/more_keys_for_t" />
     <Key
-        latin:keyLabel="z"
+        latin:keySpec="z"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6"
         latin:moreKeys="!text/more_keys_for_z" />
      <Key
-        latin:keyLabel="u"
+        latin:keySpec="u"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7"
         latin:moreKeys="!text/more_keys_for_u" />
     <Key
-        latin:keyLabel="i"
+        latin:keySpec="i"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="!text/more_keys_for_i" />
     <Key
-        latin:keyLabel="o"
+        latin:keySpec="o"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9"
         latin:moreKeys="!text/more_keys_for_o" />
     <Key
-        latin:keyLabel="p"
+        latin:keySpec="p"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
 </merge>
diff --git a/java/res/xml/rowkeys_qwertz3.xml b/java/res/xml/rowkeys_qwertz3.xml
index 9e39fe0..55a8ffa 100644
--- a/java/res/xml/rowkeys_qwertz3.xml
+++ b/java/res/xml/rowkeys_qwertz3.xml
@@ -22,21 +22,21 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="y"
+        latin:keySpec="y"
         latin:moreKeys="!text/more_keys_for_y" />
     <Key
-        latin:keyLabel="x" />
+        latin:keySpec="x" />
     <Key
-        latin:keyLabel="c"
+        latin:keySpec="c"
         latin:moreKeys="!text/more_keys_for_c" />
     <Key
-        latin:keyLabel="v"
+        latin:keySpec="v"
         latin:moreKeys="!text/more_keys_for_v" />
     <Key
-        latin:keyLabel="b" />
+        latin:keySpec="b" />
     <Key
-        latin:keyLabel="n"
+        latin:keySpec="n"
         latin:moreKeys="!text/more_keys_for_n" />
     <Key
-        latin:keyLabel="m" />
+        latin:keySpec="m" />
 </merge>
diff --git a/java/res/xml/rowkeys_south_slavic1.xml b/java/res/xml/rowkeys_south_slavic1.xml
index 6117d46..8b1d696 100644
--- a/java/res/xml/rowkeys_south_slavic1.xml
+++ b/java/res/xml/rowkeys_south_slavic1.xml
@@ -23,56 +23,56 @@
 >
     <!-- U+0459: "љ" CYRILLIC SMALL LETTER LJE -->
     <Key
-        latin:keyLabel="&#x0459;"
+        latin:keySpec="&#x0459;"
         latin:keyHintLabel="1"
         latin:additionalMoreKeys="1" />
     <!-- U+045A: "њ" CYRILLIC SMALL LETTER NJE -->
     <Key
-        latin:keyLabel="&#x045A;"
+        latin:keySpec="&#x045A;"
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2" />
     <!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
     <Key
-        latin:keyLabel="&#x0435;"
+        latin:keySpec="&#x0435;"
         latin:keyHintLabel="3"
         latin:additionalMoreKeys="3"
         latin:moreKeys="!text/more_keys_for_cyrillic_ie" />
     <!-- U+0440: "р" CYRILLIC SMALL LETTER ER -->
     <Key
-        latin:keyLabel="&#x0440;"
+        latin:keySpec="&#x0440;"
         latin:keyHintLabel="4"
         latin:additionalMoreKeys="4" />
     <!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
     <Key
-        latin:keyLabel="&#x0442;"
+        latin:keySpec="&#x0442;"
         latin:keyHintLabel="5"
         latin:additionalMoreKeys="5" />
     <Key
-        latin:keyLabel="!text/keylabel_for_south_slavic_row1_6"
+        latin:keySpec="!text/keylabel_for_south_slavic_row1_6"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6" />
     <!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
     <Key
-        latin:keyLabel="&#x0443;"
+        latin:keySpec="&#x0443;"
         latin:keyHintLabel="7"
         latin:additionalMoreKeys="7" />
     <!-- U+0438: "и" CYRILLIC SMALL LETTER I -->
     <Key
-        latin:keyLabel="&#x0438;"
+        latin:keySpec="&#x0438;"
         latin:keyHintLabel="8"
         latin:additionalMoreKeys="8"
         latin:moreKeys="!text/more_keys_for_cyrillic_i" />
     <!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
     <Key
-        latin:keyLabel="&#x043E;"
+        latin:keySpec="&#x043E;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9" />
     <!-- U+043F: "п" CYRILLIC SMALL LETTER PE -->
     <Key
-        latin:keyLabel="&#x043F;"
+        latin:keySpec="&#x043F;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0" />
     <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA -->
     <Key
-        latin:keyLabel="&#x0448;" />
+        latin:keySpec="&#x0448;" />
 </merge>
diff --git a/java/res/xml/rowkeys_south_slavic2.xml b/java/res/xml/rowkeys_south_slavic2.xml
index 88e8940..fa24264 100644
--- a/java/res/xml/rowkeys_south_slavic2.xml
+++ b/java/res/xml/rowkeys_south_slavic2.xml
@@ -23,34 +23,34 @@
 >
     <!-- U+0430: "а" CYRILLIC SMALL LETTER A -->
     <Key
-        latin:keyLabel="&#x0430;" />
+        latin:keySpec="&#x0430;" />
     <!-- U+0441: "с" CYRILLIC SMALL LETTER ES -->
     <Key
-        latin:keyLabel="&#x0441;" />
+        latin:keySpec="&#x0441;" />
     <!-- U+0434: "д" CYRILLIC SMALL LETTER DE -->
     <Key
-        latin:keyLabel="&#x0434;" />
+        latin:keySpec="&#x0434;" />
     <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF -->
     <Key
-        latin:keyLabel="&#x0444;" />
+        latin:keySpec="&#x0444;" />
     <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE -->
     <Key
-        latin:keyLabel="&#x0433;" />
+        latin:keySpec="&#x0433;" />
     <!-- U+0445: "х" CYRILLIC SMALL LETTER HA -->
     <Key
-        latin:keyLabel="&#x0445;" />
+        latin:keySpec="&#x0445;" />
     <!-- U+0458: "ј" CYRILLIC SMALL LETTER JE -->
     <Key
-        latin:keyLabel="&#x0458;" />
+        latin:keySpec="&#x0458;" />
     <!-- U+043A: "к" CYRILLIC SMALL LETTER KA -->
     <Key
-        latin:keyLabel="&#x043A;" />
+        latin:keySpec="&#x043A;" />
     <!-- U+043B: "л" CYRILLIC SMALL LETTER EL -->
     <Key
-        latin:keyLabel="&#x043B;" />
+        latin:keySpec="&#x043B;" />
     <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE -->
     <Key
-        latin:keyLabel="&#x0447;" />
+        latin:keySpec="&#x0447;" />
     <Key
-        latin:keyLabel="!text/keylabel_for_south_slavic_row2_11" />
+        latin:keySpec="!text/keylabel_for_south_slavic_row2_11" />
 </merge>
diff --git a/java/res/xml/rowkeys_south_slavic3.xml b/java/res/xml/rowkeys_south_slavic3.xml
index b015509..8b54ec8 100644
--- a/java/res/xml/rowkeys_south_slavic3.xml
+++ b/java/res/xml/rowkeys_south_slavic3.xml
@@ -22,28 +22,28 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="!text/keylabel_for_south_slavic_row3_1" />
+        latin:keySpec="!text/keylabel_for_south_slavic_row3_1" />
     <!-- U+045F: "џ" CYRILLIC SMALL LETTER DZHE -->
     <Key
-        latin:keyLabel="&#x045F;" />
+        latin:keySpec="&#x045F;" />
     <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE -->
     <Key
-        latin:keyLabel="&#x0446;" />
+        latin:keySpec="&#x0446;" />
     <!-- U+0432: "в" CYRILLIC SMALL LETTER VE -->
     <Key
-        latin:keyLabel="&#x0432;" />
+        latin:keySpec="&#x0432;" />
     <!-- U+0431: "б" CYRILLIC SMALL LETTER BE -->
     <Key
-        latin:keyLabel="&#x0431;" />
+        latin:keySpec="&#x0431;" />
     <!-- U+043D: "н" CYRILLIC SMALL LETTER EN -->
     <Key
-        latin:keyLabel="&#x043D;" />
+        latin:keySpec="&#x043D;" />
     <!-- U+043C: "м" CYRILLIC SMALL LETTER EM -->
     <Key
-        latin:keyLabel="&#x043C;" />
+        latin:keySpec="&#x043C;" />
     <Key
-        latin:keyLabel="!text/keylabel_for_south_slavic_row3_8" />
+        latin:keySpec="!text/keylabel_for_south_slavic_row3_8" />
     <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE -->
     <Key
-        latin:keyLabel="&#x0436;" />
+        latin:keySpec="&#x0436;" />
 </merge>
diff --git a/java/res/xml/rowkeys_spanish2.xml b/java/res/xml/rowkeys_spanish2.xml
index 335dff3..68632fd 100644
--- a/java/res/xml/rowkeys_spanish2.xml
+++ b/java/res/xml/rowkeys_spanish2.xml
@@ -25,5 +25,5 @@
         latin:keyboardLayout="@xml/rowkeys_qwerty2" />
     <!-- U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE -->
     <Key
-        latin:keyLabel="!text/keylabel_for_spanish_row2_10" />
+        latin:keySpec="!text/keylabel_for_spanish_row2_10" />
  </merge>
diff --git a/java/res/xml/rowkeys_swiss1.xml b/java/res/xml/rowkeys_swiss1.xml
index e3b8426..458771d 100644
--- a/java/res/xml/rowkeys_swiss1.xml
+++ b/java/res/xml/rowkeys_swiss1.xml
@@ -24,6 +24,6 @@
     <include
         latin:keyboardLayout="@xml/rowkeys_qwertz1" />
     <Key
-        latin:keyLabel="!text/keylabel_for_swiss_row1_11"
+        latin:keySpec="!text/keylabel_for_swiss_row1_11"
         latin:moreKeys="!text/more_keys_for_swiss_row1_11" />
 </merge>
diff --git a/java/res/xml/rowkeys_swiss2.xml b/java/res/xml/rowkeys_swiss2.xml
index 5364a44..0c25fe8 100644
--- a/java/res/xml/rowkeys_swiss2.xml
+++ b/java/res/xml/rowkeys_swiss2.xml
@@ -24,9 +24,9 @@
     <include
         latin:keyboardLayout="@xml/rowkeys_qwerty2" />
     <Key
-        latin:keyLabel="!text/keylabel_for_swiss_row2_10"
+        latin:keySpec="!text/keylabel_for_swiss_row2_10"
         latin:moreKeys="!text/more_keys_for_swiss_row2_10" />
     <Key
-        latin:keyLabel="!text/keylabel_for_swiss_row2_11"
+        latin:keySpec="!text/keylabel_for_swiss_row2_11"
         latin:moreKeys="!text/more_keys_for_swiss_row2_11" />
 </merge>
diff --git a/java/res/xml/rowkeys_symbols1.xml b/java/res/xml/rowkeys_symbols1.xml
index 6e2f92d..b35b180 100644
--- a/java/res/xml/rowkeys_symbols1.xml
+++ b/java/res/xml/rowkeys_symbols1.xml
@@ -22,43 +22,43 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_1"
+        latin:keySpec="!text/keylabel_for_symbols_1"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_1"
         latin:moreKeys="!text/more_keys_for_symbols_1" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_2"
+        latin:keySpec="!text/keylabel_for_symbols_2"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_2"
         latin:moreKeys="!text/more_keys_for_symbols_2" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_3"
+        latin:keySpec="!text/keylabel_for_symbols_3"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_3"
         latin:moreKeys="!text/more_keys_for_symbols_3" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_4"
+        latin:keySpec="!text/keylabel_for_symbols_4"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_4"
         latin:moreKeys="!text/more_keys_for_symbols_4" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_5"
+        latin:keySpec="!text/keylabel_for_symbols_5"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_5"
         latin:moreKeys="!text/more_keys_for_symbols_5" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_6"
+        latin:keySpec="!text/keylabel_for_symbols_6"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_6"
         latin:moreKeys="!text/more_keys_for_symbols_6" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_7"
+        latin:keySpec="!text/keylabel_for_symbols_7"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_7"
         latin:moreKeys="!text/more_keys_for_symbols_7" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_8"
+        latin:keySpec="!text/keylabel_for_symbols_8"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_8"
         latin:moreKeys="!text/more_keys_for_symbols_8" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_9"
+        latin:keySpec="!text/keylabel_for_symbols_9"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_9"
         latin:moreKeys="!text/more_keys_for_symbols_9" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_0"
+        latin:keySpec="!text/keylabel_for_symbols_0"
         latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_0"
         latin:moreKeys="!text/more_keys_for_symbols_0" />
 </merge>
diff --git a/java/res/xml/rowkeys_symbols2.xml b/java/res/xml/rowkeys_symbols2.xml
index 76cbf62..fe8653d 100644
--- a/java/res/xml/rowkeys_symbols2.xml
+++ b/java/res/xml/rowkeys_symbols2.xml
@@ -28,36 +28,36 @@
             <!-- U+066C: "٬" ARABIC THOUSANDS SEPARATOR
                  U+066B: "٫" ARABIC DECIMAL SEPARATOR -->
             <Key
-                latin:keyLabel="&#x066C;"
+                latin:keySpec="&#x066C;"
                 latin:keyHintLabel="\@"
                 latin:moreKeys="\@" />
             <Key
-                latin:keyLabel="&#x066B;"
+                latin:keySpec="&#x066B;"
                 latin:keyHintLabel="\#"
                 latin:moreKeys="\#" />
         </case>
         <default>
             <Key
-                latin:keyLabel="\@" />
+                latin:keySpec="\@" />
             <Key
-                latin:keyLabel="\#" />
+                latin:keySpec="\#" />
         </default>
     </switch>
     <Key
         latin:keyStyle="currencyKeyStyle" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_percent"
+        latin:keySpec="!text/keylabel_for_symbols_percent"
         latin:moreKeys="!text/more_keys_for_symbols_percent" />
     <Key
-        latin:keyLabel="&amp;" />
+        latin:keySpec="&amp;" />
     <!-- U+2013: "–" EN DASH
          U+2014: "—" EM DASH
          U+00B7: "·" MIDDLE DOT -->
     <Key
-        latin:keyLabel="-"
+        latin:keySpec="-"
         latin:moreKeys="_,&#x2013;,&#x2014;,&#x00B7;" />
     <Key
-        latin:keyLabel="+"
+        latin:keySpec="+"
         latin:moreKeys="!text/more_keys_for_plus" />
     <include
         latin:keyboardLayout="@xml/keys_parentheses" />
diff --git a/java/res/xml/rowkeys_symbols3.xml b/java/res/xml/rowkeys_symbols3.xml
index e525dc4..01ca030 100644
--- a/java/res/xml/rowkeys_symbols3.xml
+++ b/java/res/xml/rowkeys_symbols3.xml
@@ -22,41 +22,40 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="*"
+        latin:keySpec="*"
         latin:moreKeys="!text/more_keys_for_star" />
     <switch>
         <case
             latin:languageCode="fa"
         >
+            <!-- TODO: Introduce !code/key_{left,right}_angle_quotation. -->
             <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
                  U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&#x00AB;"
-                latin:code="0x00BB"
+                latin:keySpec="&#x00AB;|&#x00BB;"
                 latin:moreKeys="!text/more_keys_for_double_quote" />
             <Key
-                latin:keyLabel="&#x00BB;"
-                latin:code="0x00AB"
+                latin:keySpec="&#x00BB;|&#x00AB;"
                 latin:moreKeys="!text/more_keys_for_single_quote" />
         </case>
         <default>
             <Key
-                latin:keyLabel="&quot;"
+                latin:keySpec="&quot;"
                 latin:moreKeys="!text/more_keys_for_double_quote" />
             <Key
-                latin:keyLabel="\'"
+                latin:keySpec="\'"
                 latin:moreKeys="!text/more_keys_for_single_quote" />
         </default>
     </switch>
     <Key
-        latin:keyLabel=":" />
+        latin:keySpec=":" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_semicolon"
+        latin:keySpec="!text/keylabel_for_symbols_semicolon"
         latin:moreKeys="!text/more_keys_for_symbols_semicolon" />
     <Key
-        latin:keyLabel="!"
+        latin:keySpec="!"
         latin:moreKeys="!text/more_keys_for_exclamation" />
     <Key
-        latin:keyLabel="!text/keylabel_for_symbols_question"
+        latin:keySpec="!text/keylabel_for_symbols_question"
         latin:moreKeys="!text/more_keys_for_question" />
 </merge>
diff --git a/java/res/xml/rowkeys_symbols_shift1.xml b/java/res/xml/rowkeys_symbols_shift1.xml
index 6013493..7cb3213 100644
--- a/java/res/xml/rowkeys_symbols_shift1.xml
+++ b/java/res/xml/rowkeys_symbols_shift1.xml
@@ -22,35 +22,35 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="~" />
+        latin:keySpec="~" />
     <Key
-        latin:keyLabel="`" />
+        latin:keySpec="`" />
     <Key
-        latin:keyLabel="|" />
+        latin:keySpec="|" />
     <!-- U+2022: "•" BULLET -->
     <Key
-        latin:keyLabel="&#x2022;"
+        latin:keySpec="&#x2022;"
         latin:moreKeys="!text/more_keys_for_bullet" />
     <!-- U+221A: "√" SQUARE ROOT -->
     <Key
-        latin:keyLabel="&#x221A;" />
+        latin:keySpec="&#x221A;" />
     <!-- U+03A0: "Π" GREEK CAPITAL LETTER PI
          U+03C0: "π" GREEK SMALL LETTER PI  -->
     <Key
-        latin:keyLabel="&#x03A0;"
+        latin:keySpec="&#x03A0;"
         latin:moreKeys="&#x03C0;" />
     <!-- U+00F7: "÷" DIVISION SIGN -->
     <Key
-        latin:keyLabel="&#x00F7;" />
+        latin:keySpec="&#x00F7;" />
     <!-- U+00D7: "×" MULTIPLICATION SIGN -->
     <Key
-        latin:keyLabel="&#x00D7;" />
+        latin:keySpec="&#x00D7;" />
     <!-- U+00B6: "¶" PILCROW SIGN
          U+00A7: "§" SECTION SIGN -->
     <Key
-        latin:keyLabel="&#x00B6;"
+        latin:keySpec="&#x00B6;"
         latin:moreKeys="&#x00A7;" />
     <!-- U+2206: "∆" INCREMENT -->
     <Key
-        latin:keyLabel="&#x2206;" />
+        latin:keySpec="&#x2206;" />
 </merge>
diff --git a/java/res/xml/rowkeys_symbols_shift2.xml b/java/res/xml/rowkeys_symbols_shift2.xml
index 36f9214..39a5803 100644
--- a/java/res/xml/rowkeys_symbols_shift2.xml
+++ b/java/res/xml/rowkeys_symbols_shift2.xml
@@ -34,19 +34,19 @@
          U+2190: "←" LEFTWARDS ARROW
          U+2192: "→" RIGHTWARDS ARROW -->
     <Key
-        latin:keyLabel="^"
+        latin:keySpec="^"
         latin:moreKeys="&#x2191;,&#x2193;,&#x2190;,&#x2192;" />
     <!-- U+00B0: "°" DEGREE SIGN
          U+2032: "′" PRIME
          U+2033: "″" DOUBLE PRIME -->
     <Key
-        latin:keyLabel="&#x00B0;"
+        latin:keySpec="&#x00B0;"
         latin:moreKeys="&#x2032;,&#x2033;" />
     <!-- U+2260: "≠" NOT EQUAL TO
          U+2248: "≈" ALMOST EQUAL TO
          U+221E: "∞" INFINITY -->
     <Key
-        latin:keyLabel="="
+        latin:keySpec="="
         latin:moreKeys="&#x2260;,&#x2248;,&#x221E;" />
     <include
         latin:keyboardLayout="@xml/keys_curly_brackets" />
diff --git a/java/res/xml/rowkeys_symbols_shift3.xml b/java/res/xml/rowkeys_symbols_shift3.xml
index 5fe1c74..92ff97b 100644
--- a/java/res/xml/rowkeys_symbols_shift3.xml
+++ b/java/res/xml/rowkeys_symbols_shift3.xml
@@ -22,19 +22,19 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="\\" />
+        latin:keySpec="\\" />
     <!-- U+00A9: "©" COPYRIGHT SIGN -->
     <Key
-        latin:keyLabel="&#x00A9;" />
+        latin:keySpec="&#x00A9;" />
     <!-- U+00AE: "®" REGISTERED SIGN -->
     <Key
-        latin:keyLabel="&#x00AE;" />
+        latin:keySpec="&#x00AE;" />
     <!-- U+2122: "™" TRADE MARK SIGN -->
     <Key
-        latin:keyLabel="&#x2122;" />
+        latin:keySpec="&#x2122;" />
     <!-- U+2105: "℅" CARE OF -->
     <Key
-        latin:keyLabel="&#x2105;" />
+        latin:keySpec="&#x2105;" />
     <include
         latin:keyboardLayout="@xml/keys_square_brackets" />
 </merge>
diff --git a/java/res/xml/rowkeys_thai1.xml b/java/res/xml/rowkeys_thai1.xml
index cd53665..e42bda3 100644
--- a/java/res/xml/rowkeys_thai1.xml
+++ b/java/res/xml/rowkeys_thai1.xml
@@ -26,77 +26,76 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel="+" />
+                latin:keySpec="+" />
             <!-- U+0E51: "๑" THAI DIGIT ONE -->
             <Key
-                latin:keyLabel="&#x0E51;"
+                latin:keySpec="&#x0E51;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E52: "๒" THAI DIGIT TWO -->
             <Key
-                latin:keyLabel="&#x0E52;"
+                latin:keySpec="&#x0E52;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E53: "๓" THAI DIGIT THREE -->
             <Key
-                latin:keyLabel="&#x0E53;"
+                latin:keySpec="&#x0E53;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E54: "๔" THAI DIGIT FOUR -->
             <Key
-                latin:keyLabel="&#x0E54;"
+                latin:keySpec="&#x0E54;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0020: " " SPACE
                  U+0E39: " ู" THAI CHARACTER SARA UU -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E39;"
-                latin:code="0x0E39"
+                latin:keySpec="&#x20;&#x0E39;|&#x0E39;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT -->
             <Key
-                latin:keyLabel="&#x0E3F;"
+                latin:keySpec="&#x0E3F;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E55: "๕" THAI DIGIT FIVE -->
             <Key
-                latin:keyLabel="&#x0E55;"
+                latin:keySpec="&#x0E55;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E56: "๖" THAI DIGIT SIX -->
             <Key
-                latin:keyLabel="&#x0E56;"
+                latin:keySpec="&#x0E56;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E57: "๗" THAI DIGIT SEVEN -->
             <Key
-                latin:keyLabel="&#x0E57;"
+                latin:keySpec="&#x0E57;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E58: "๘" THAI DIGIT EIGHT -->
             <Key
-                latin:keyLabel="&#x0E58;"
+                latin:keySpec="&#x0E58;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E59: "๙" THAI DIGIT NINE -->
             <Key
-                latin:keyLabel="&#x0E59;"
+                latin:keySpec="&#x0E59;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
             <!-- U+0E45: "ๅ" THAI CHARACTER LAKKHANGYAO -->
             <Key
-                latin:keyLabel="&#x0E45;"
+                latin:keySpec="&#x0E45;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E51: "๑" THAI DIGIT ONE -->
             <Key
                 latin:keyHintLabel="1"
                 latin:additionalMoreKeys="1"
                 latin:moreKeys="&#x0E51;"
-                latin:keyLabel="/" />
+                latin:keySpec="/" />
             <!-- U+0E52: "๒" THAI DIGIT TWO -->
             <Key
                 latin:keyHintLabel="2"
                 latin:additionalMoreKeys="2"
                 latin:moreKeys="&#x0E52;"
-                latin:keyLabel="_" />
+                latin:keySpec="_" />
             <!-- U+0E20: "ภ" THAI CHARACTER PHO SAMPHAO
                  U+0E53: "๓" THAI DIGIT THREE -->
             <Key
-                latin:keyLabel="&#x0E20;"
+                latin:keySpec="&#x0E20;"
                 latin:keyHintLabel="3"
                 latin:additionalMoreKeys="3"
                 latin:moreKeys="&#x0E53;"
@@ -104,7 +103,7 @@
             <!-- U+0E16: "ถ" THAI CHARACTER THO THUNG
                  U+0E54: "๔" THAI DIGIT FOUR -->
             <Key
-                latin:keyLabel="&#x0E16;"
+                latin:keySpec="&#x0E16;"
                 latin:keyHintLabel="4"
                 latin:additionalMoreKeys="4"
                 latin:moreKeys="&#x0E54;"
@@ -114,21 +113,19 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E38;"
-                latin:code="0x0E38"
+                latin:keySpec="&#x20;&#x0E38;|&#x0E38;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E36: " ึ" THAI CHARACTER SARA UE -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E36;"
-                latin:code="0x0E36"
+                latin:keySpec="&#x20;&#x0E36;|&#x0E36;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E04: "ค" THAI CHARACTER KHO KHWAI
                  U+0E55: "๕" THAI DIGIT FIVE -->
             <Key
-                latin:keyLabel="&#x0E04;"
+                latin:keySpec="&#x0E04;"
                 latin:keyHintLabel="5"
                 latin:additionalMoreKeys="5"
                 latin:moreKeys="&#x0E55;"
@@ -136,7 +133,7 @@
             <!-- U+0E15: "ต" THAI CHARACTER TO TAO
                  U+0E56: "๖" THAI DIGIT SIX -->
             <Key
-                latin:keyLabel="&#x0E15;"
+                latin:keySpec="&#x0E15;"
                 latin:keyHintLabel="6"
                 latin:additionalMoreKeys="6"
                 latin:moreKeys="&#x0E56;"
@@ -144,7 +141,7 @@
             <!-- U+0E08: "จ" THAI CHARACTER CHO CHAN
                  U+0E57: "๗" THAI DIGIT SEVEN -->
             <Key
-                latin:keyLabel="&#x0E08;"
+                latin:keySpec="&#x0E08;"
                 latin:keyHintLabel="7"
                 latin:additionalMoreKeys="7"
                 latin:moreKeys="&#x0E57;"
@@ -152,7 +149,7 @@
             <!-- U+0E02: "ข" THAI CHARACTER KHO KHAI
                  U+0E58: "๘" THAI DIGIT EIGHT -->
             <Key
-                latin:keyLabel="&#x0E02;"
+                latin:keySpec="&#x0E02;"
                 latin:keyHintLabel="8"
                 latin:additionalMoreKeys="8"
                 latin:moreKeys="&#x0E58;"
@@ -160,7 +157,7 @@
             <!-- U+0E0A: "ช" THAI CHARACTER CHO CHANG
                  U+0E59: "๙" THAI DIGIT NINE -->
             <Key
-                latin:keyLabel="&#x0E0A;"
+                latin:keySpec="&#x0E0A;"
                 latin:keyHintLabel="9"
                 latin:additionalMoreKeys="9"
                 latin:moreKeys="&#x0E59;"
diff --git a/java/res/xml/rowkeys_thai2.xml b/java/res/xml/rowkeys_thai2.xml
index 4bcbbbf..7ab036a 100644
--- a/java/res/xml/rowkeys_thai2.xml
+++ b/java/res/xml/rowkeys_thai2.xml
@@ -27,117 +27,113 @@
         >
             <!-- U+0E50: "๐" THAI DIGIT ZERO -->
             <Key
-                latin:keyLabel="&#x0E50;"
+                latin:keySpec="&#x0E50;"
                 latin:keyLabelFlags="fontNormal" />
             <Key
-                latin:keyLabel="&quot;" />
+                latin:keySpec="&quot;" />
             <!-- U+0E0E: "ฎ" THAI CHARACTER DO CHADA -->
             <Key
-                latin:keyLabel="&#x0E0E;"
+                latin:keySpec="&#x0E0E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E11: "ฑ" THAI CHARACTER THO NANGMONTHO -->
             <Key
-                latin:keyLabel="&#x0E11;"
+                latin:keySpec="&#x0E11;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E18: "ธ" THAI CHARACTER THO THONG -->
             <Key
-                latin:keyLabel="&#x0E18;"
+                latin:keySpec="&#x0E18;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0020: " " SPACE
                  U+0E4D: " ํ" THAI CHARACTER THANTHAKHAT -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E4D;"
-                latin:code="0x0E4D"
+                latin:keySpec="&#x20;&#x0E4D;|&#x0E4D;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E4A: " ๊" THAI CHARACTER MAI TRI -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E4A;"
-                latin:code="0x0E4A"
+                latin:keySpec="&#x20;&#x0E4A;|&#x0E4A;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E13: "ณ" THAI CHARACTER NO NEN -->
             <Key
-                latin:keyLabel="&#x0E13;"
+                latin:keySpec="&#x0E13;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E2F: "ฯ" THAI CHARACTER PAIYANNOI -->
             <Key
-                latin:keyLabel="&#x0E2F;"
+                latin:keySpec="&#x0E2F;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E0D: "ญ" THAI CHARACTER YO YING -->
             <Key
-                latin:keyLabel="&#x0E0D;"
+                latin:keySpec="&#x0E0D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E10: "ฐ" THAI CHARACTER THO THAN -->
             <Key
-                latin:keyLabel="&#x0E10;"
+                latin:keySpec="&#x0E10;"
                 latin:keyLabelFlags="fontNormal" />
             <Key
-                latin:keyLabel="," />
+                latin:keySpec="," />
         </case>
         <default>
             <!-- U+0E46: "ๆ" THAI CHARACTER MAIYAMOK
                  U+0E50: "๐" THAI DIGIT ZERO -->
             <Key
-                latin:keyLabel="&#x0E46;"
+                latin:keySpec="&#x0E46;"
                 latin:keyHintLabel="0"
                 latin:additionalMoreKeys="0"
                 latin:moreKeys="&#x0E50;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E44: "ไ" THAI CHARACTER SARA AI MAIMALAI -->
             <Key
-                latin:keyLabel="&#x0E44;"
+                latin:keySpec="&#x0E44;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E33: "ำ" THAI CHARACTER SARA AM -->
             <Key
-                latin:keyLabel="&#x0E33;"
+                latin:keySpec="&#x0E33;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E1E: "พ" THAI CHARACTER PHO PHAN -->
             <Key
-                latin:keyLabel="&#x0E1E;"
+                latin:keySpec="&#x0E1E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E30: "ะ" THAI CHARACTER SARA A -->
             <Key
-                latin:keyLabel="&#x0E30;"
+                latin:keySpec="&#x0E30;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0020: " " SPACE
                  U+0E31: " ั" THAI CHARACTER MAI HAN-AKAT -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E31;"
-                latin:code="0x0E31"
+                latin:keySpec="&#x20;&#x0E31;|&#x0E31;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E35: " ี" HAI CHARACTER SARA II -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E35;"
-                latin:code="0x0E35"
+                latin:keySpec="&#x20;&#x0E35;|&#x0E35;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E23: "ร" THAI CHARACTER RO RUA -->
             <Key
-                latin:keyLabel="&#x0E23;"
+                latin:keySpec="&#x0E23;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E19: "น" THAI CHARACTER NO NU -->
             <Key
-                latin:keyLabel="&#x0E19;"
+                latin:keySpec="&#x0E19;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E22: "ย" THAI CHARACTER YO YAK -->
             <Key
-                latin:keyLabel="&#x0E22;"
+                latin:keySpec="&#x0E22;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E1A: "บ" THAI CHARACTER BO BAIMAI -->
             <Key
-                latin:keyLabel="&#x0E1A;"
+                latin:keySpec="&#x0E1A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E25: "ล" THAI CHARACTER LO LING -->
             <Key
-                latin:keyLabel="&#x0E25;"
+                latin:keySpec="&#x0E25;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/rowkeys_thai3.xml b/java/res/xml/rowkeys_thai3.xml
index 7b6e637..4af4d23 100644
--- a/java/res/xml/rowkeys_thai3.xml
+++ b/java/res/xml/rowkeys_thai3.xml
@@ -27,107 +27,103 @@
         >
             <!-- U+0E24: "ฤ" THAI CHARACTER RU -->
             <Key
-                latin:keyLabel="&#x0E24;"
+                latin:keySpec="&#x0E24;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E06: "ฆ" THAI CHARACTER KHO RAKHANG -->
             <Key
-                latin:keyLabel="&#x0E06;"
+                latin:keySpec="&#x0E06;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E0F: "ฏ" THAI CHARACTER TO PATAK -->
             <Key
-                latin:keyLabel="&#x0E0F;"
+                latin:keySpec="&#x0E0F;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E42: "โ" THAI CHARACTER SARA O -->
             <Key
-                latin:keyLabel="&#x0E42;"
+                latin:keySpec="&#x0E42;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E0C: "ฌ" THAI CHARACTER CHO CHOE -->
             <Key
-                latin:keyLabel="&#x0E0C;"
+                latin:keySpec="&#x0E0C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0020: " " SPACE
                  U+0E47: " ็" THAI CHARACTER MAITAIKHU -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E47;"
-                latin:code="0x0E47"
+                latin:keySpec="&#x20;&#x0E47;|&#x0E47;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E4B: " ๋" THAI CHARACTER MAI CHATTAWA -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E4B;"
-                latin:code="0x0E4B"
+                latin:keySpec="&#x20;&#x0E4B;|&#x0E4B;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E29: "ษ" THAI CHARACTER SO RUSI -->
             <Key
-                latin:keyLabel="&#x0E29;"
+                latin:keySpec="&#x0E29;"
                 latin:keyLabelFlags="fontNormal" />
             <!--  U+0E28: "ศ" THAI CHARACTER SO SALA -->
             <Key
-                latin:keyLabel="&#x0E28;"
+                latin:keySpec="&#x0E28;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E0B: "ซ" THAI CHARACTER SO SO -->
             <Key
-                latin:keyLabel="&#x0E0B;"
+                latin:keySpec="&#x0E0B;"
                 latin:keyLabelFlags="fontNormal" />
             <Key
-                latin:keyLabel="." />
+                latin:keySpec="." />
         </case>
         <default>
             <!-- U+0E1F: "ฟ" THAI CHARACTER FO FAN -->
             <Key
-                latin:keyLabel="&#x0E1F;"
+                latin:keySpec="&#x0E1F;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E2B: "ห" THAI CHARACTER HO HIP -->
             <Key
-                latin:keyLabel="&#x0E2B;"
+                latin:keySpec="&#x0E2B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E01: "ก" THAI CHARACTER KO KAI -->
             <Key
-                latin:keyLabel="&#x0E01;"
+                latin:keySpec="&#x0E01;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E14: "ด" THAI CHARACTER DO DEK -->
             <Key
-                latin:keyLabel="&#x0E14;"
+                latin:keySpec="&#x0E14;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E40: "เ" THAI CHARACTER SARA E -->
             <Key
-                latin:keyLabel="&#x0E40;"
+                latin:keySpec="&#x0E40;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0020: " " SPACE
                  U+0E49: " ้" THAI CHARACTER MAI THO -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E49;"
-                latin:code="0x0E49"
+                latin:keySpec="&#x20;&#x0E49;|&#x0E49;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E48: " ่" THAI CHARACTER MAI EK -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E48;"
-                latin:code="0x0E48"
+                latin:keySpec="&#x20;&#x0E48;|&#x0E48;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E32: "า" THAI CHARACTER SARA AA -->
             <Key
-                latin:keyLabel="&#x0E32;"
+                latin:keySpec="&#x0E32;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E2A: "ส" THAI CHARACTER SO SUA -->
             <Key
-                latin:keyLabel="&#x0E2A;"
+                latin:keySpec="&#x0E2A;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E27: "ว" THAI CHARACTER WO WAEN -->
             <Key
-                latin:keyLabel="&#x0E27;"
+                latin:keySpec="&#x0E27;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E07: "ง" THAI CHARACTER NGO NGU -->
             <Key
-                latin:keyLabel="&#x0E07;"
+                latin:keySpec="&#x0E07;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/rowkeys_thai4.xml b/java/res/xml/rowkeys_thai4.xml
index 8a78424..332d09d 100644
--- a/java/res/xml/rowkeys_thai4.xml
+++ b/java/res/xml/rowkeys_thai4.xml
@@ -26,96 +26,92 @@
             latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"
         >
             <Key
-                latin:keyLabel="(" />
+                latin:keySpec="(" />
             <Key
-                latin:keyLabel=")" />
+                latin:keySpec=")" />
             <!-- U+0E09: "ฉ" THAI CHARACTER CHO CHING -->
             <Key
-                latin:keyLabel="&#x0E09;"
+                latin:keySpec="&#x0E09;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E2E: "ฮ" THAI CHARACTER HO NOKHUK -->
             <Key
-                latin:keyLabel="&#x0E2E;"
+                latin:keySpec="&#x0E2E;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0020: " " SPACE
                  U+0E3A: " ฺ" THAI CHARACTER PHINTHU -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E3A;"
-                latin:code="0x0E3A"
+                latin:keySpec="&#x20;&#x0E3A;|&#x0E3A;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E4C: " ์" THAI CHARACTER THANTHAKHAT -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E4C;"
-                latin:code="0x0E4C"
+                latin:keySpec="&#x20;&#x0E4C;|&#x0E4C;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <Key
-                latin:keyLabel="\?" />
+                latin:keySpec="\?" />
             <!-- U+0E12: "ฒ" THAI CHARACTER THO PHUTHAO -->
             <Key
-                latin:keyLabel="&#x0E12;"
+                latin:keySpec="&#x0E12;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E2C: "ฬ" THAI CHARACTER LO CHULA -->
             <Key
-                latin:keyLabel="&#x0E2C;"
+                latin:keySpec="&#x0E2C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E26: "ฦ" THAI CHARACTER LU -->
             <Key
-                latin:keyLabel="&#x0E26;"
+                latin:keySpec="&#x0E26;"
                 latin:keyLabelFlags="fontNormal" />
         </case>
         <default>
             <!-- U+0E1C: "ผ" THAI CHARACTER PHO PHUNG -->
             <Key
-                latin:keyLabel="&#x0E1C;"
+                latin:keySpec="&#x0E1C;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E1B: "ป" THAI CHARACTER PO PLA -->
             <Key
-                latin:keyLabel="&#x0E1B;"
+                latin:keySpec="&#x0E1B;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E41: "แ" THAI CHARACTER SARA AE -->
             <Key
-                latin:keyLabel="&#x0E41;"
+                latin:keySpec="&#x0E41;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E2D: "อ" THAI CHARACTER O ANG -->
             <Key
-                latin:keyLabel="&#x0E2D;"
+                latin:keySpec="&#x0E2D;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0020: " " SPACE
                  U+0E34: " ิ" THAI CHARACTER SARA I -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E34;"
-                latin:code="0x0E34"
+                latin:keySpec="&#x20;&#x0E34;|&#x0E34;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E37: " ื" THAI CHARACTER SARA UEE -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E37;"
-                latin:code="0x0E37"
+                latin:keySpec="&#x20;&#x0E37;|&#x0E37;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E17: "ท" THAI CHARACTER THO THAHAN -->
             <Key
-                latin:keyLabel="&#x0E17;"
+                latin:keySpec="&#x0E17;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E21: "ม" THAI CHARACTER MO MA -->
             <Key
-                latin:keyLabel="&#x0E21;"
+                latin:keySpec="&#x0E21;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E43: "ใ" THAI CHARACTER SARA AI MAIMUAN -->
             <Key
-                latin:keyLabel="&#x0E43;"
+                latin:keySpec="&#x0E43;"
                 latin:keyLabelFlags="fontNormal" />
             <!-- U+0E1D: "ฝ" THAI CHARACTER FO FA -->
             <Key
-                latin:keyLabel="&#x0E1D;"
+                latin:keySpec="&#x0E1D;"
                 latin:keyLabelFlags="fontNormal" />
         </default>
     </switch>
diff --git a/java/res/xml/rows_number_normal.xml b/java/res/xml/rows_number_normal.xml
index 291018a..8c9267a 100644
--- a/java/res/xml/rows_number_normal.xml
+++ b/java/res/xml/rows_number_normal.xml
@@ -23,16 +23,16 @@
 >
     <Row>
         <Key
-            latin:keyLabel="1"
+            latin:keySpec="1"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="2"
+            latin:keySpec="2"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="3"
+            latin:keySpec="3"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="-"
+            latin:keySpec="-"
             latin:moreKeys="+"
             latin:keyLabelFlags="hasPopupHint"
             latin:keyStyle="numFunctionalKeyStyle"
@@ -40,20 +40,20 @@
     </Row>
     <Row>
         <Key
-            latin:keyLabel="4"
+            latin:keySpec="4"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="5"
+            latin:keySpec="5"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="6"
+            latin:keySpec="6"
             latin:keyStyle="numKeyStyle" />
         <switch>
             <case
                 latin:mode="date"
             >
                 <Key
-                    latin:keyLabel="."
+                    latin:keySpec="."
                     latin:keyStyle="numFunctionalKeyStyle"
                     latin:keyWidth="fillRight" />
             </case>
@@ -61,7 +61,7 @@
                 latin:mode="time|datetime"
             >
                 <Key
-                    latin:keyLabel="."
+                    latin:keySpec="."
                     latin:keyLabelFlags="hasPopupHint"
                     latin:moreKeys="!text/more_keys_for_am_pm"
                     latin:keyStyle="numFunctionalKeyStyle"
@@ -69,7 +69,7 @@
             </case>
             <default>
                 <Key
-                    latin:keyLabel=","
+                    latin:keySpec=","
                     latin:keyStyle="numFunctionalKeyStyle"
                     latin:keyWidth="fillRight" />
             </default>
@@ -77,13 +77,13 @@
     </Row>
     <Row>
         <Key
-            latin:keyLabel="7"
+            latin:keySpec="7"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="8"
+            latin:keySpec="8"
             latin:keyStyle="numKeyStyle"/>
         <Key
-            latin:keyLabel="9"
+            latin:keySpec="9"
             latin:keyStyle="numKeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
@@ -93,36 +93,34 @@
         <Key
             latin:keyStyle="numSpaceKeyStyle" />
         <Key
-            latin:keyLabel="0"
+            latin:keySpec="0"
             latin:keyStyle="numKeyStyle" />
         <switch>
             <case
                 latin:mode="date"
             >
                 <Key
-                    latin:keyLabel="/"
+                    latin:keySpec="/"
                     latin:keyStyle="numKeyStyle" />
             </case>
             <case
                 latin:mode="time"
             >
                 <Key
-                    latin:keyLabel=":"
+                    latin:keySpec=":"
                     latin:keyStyle="numKeyStyle" />
             </case>
             <case
                 latin:mode="datetime"
             >
-                <!-- U+002F: "/" SOLIDUS -->
                 <Key
-                    latin:code="0x002F"
-                    latin:keyLabel="/ :"
+                    latin:keySpec="/ :|/"
                     latin:moreKeys="!noPanelAutoMoreKey!,:"
                     latin:keyStyle="numKeyStyle" />
             </case>
             <default>
                 <Key
-                    latin:keyLabel="."
+                    latin:keySpec="."
                     latin:keyStyle="numKeyStyle" />
             </default>
         </switch>
diff --git a/java/res/xml/rows_phone.xml b/java/res/xml/rows_phone.xml
index d8dcfbd..03e4541 100644
--- a/java/res/xml/rows_phone.xml
+++ b/java/res/xml/rows_phone.xml
@@ -33,7 +33,7 @@
         <Key
             latin:keyStyle="num3KeyStyle" />
         <Key
-            latin:keyLabel="-"
+            latin:keySpec="-"
             latin:moreKeys="+"
             latin:keyLabelFlags="hasPopupHint"
             latin:keyStyle="numFunctionalKeyStyle"
@@ -47,7 +47,7 @@
         <Key
             latin:keyStyle="num6KeyStyle" />
         <Key
-            latin:keyLabel="."
+            latin:keySpec="."
             latin:keyStyle="numFunctionalKeyStyle"
             latin:keyWidth="fillRight" />
     </Row>
@@ -68,8 +68,7 @@
         <!-- U+0030: "0" DIGIT ZERO -->
         <Key
             latin:keyStyle="num0KeyStyle"
-            latin:code="0x0030"
-            latin:keyLabel="0 +"
+            latin:keySpec="0 +|0"
             latin:moreKeys="!noPanelAutoMoreKey!,+" />
         <Key
             latin:keyStyle="numSpaceKeyStyle" />
diff --git a/java/res/xml/rows_phone_symbols.xml b/java/res/xml/rows_phone_symbols.xml
index 8c10a2d..983bfb5 100644
--- a/java/res/xml/rows_phone_symbols.xml
+++ b/java/res/xml/rows_phone_symbols.xml
@@ -27,16 +27,16 @@
         latin:keyboardLayout="@xml/key_styles_number" />
     <Row>
         <Key
-            latin:keyLabel="("
+            latin:keySpec="("
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="/"
+            latin:keySpec="/"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel=")"
+            latin:keySpec=")"
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="-"
+            latin:keySpec="-"
             latin:moreKeys="+"
             latin:keyLabelFlags="hasPopupHint"
             latin:keyStyle="numFunctionalKeyStyle"
@@ -44,17 +44,17 @@
     </Row>
     <Row>
         <Key
-            latin:keyLabel="N"
+            latin:keySpec="N"
             latin:keyStyle="numKeyBaseStyle" />
         <!-- Pause is a comma. Check PhoneNumberUtils.java to see if this
             has changed. -->
         <Key
             latin:keyStyle="numPauseKeyStyle" />
         <Key
-            latin:keyLabel=","
+            latin:keySpec=","
             latin:keyStyle="numKeyStyle" />
         <Key
-            latin:keyLabel="."
+            latin:keySpec="."
             latin:keyStyle="numFunctionalKeyStyle"
             latin:keyWidth="fillRight" />
     </Row>
@@ -65,7 +65,7 @@
         <Key
             latin:keyStyle="numWaitKeyStyle" />
         <Key
-            latin:keyLabel="\#"
+            latin:keySpec="\#"
             latin:keyStyle="numKeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
@@ -75,7 +75,7 @@
         <Key
             latin:keyStyle="numPhoneToNumericKeyStyle" />
         <Key
-            latin:keyLabel="+"
+            latin:keySpec="+"
             latin:keyStyle="numKeyStyle" />
         <Key
             latin:keyStyle="numSpaceKeyStyle" />
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 1b9007d..6f0f753 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -22,13 +22,11 @@
 import static com.android.inputmethod.latin.Constants.CODE_SWITCH_ALPHA_SYMBOL;
 import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED;
 
-import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Rect;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
-import android.util.Xml;
 
 import com.android.inputmethod.keyboard.internal.KeyDrawParams;
 import com.android.inputmethod.keyboard.internal.KeySpecParser;
@@ -42,9 +40,6 @@
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.utils.StringUtils;
 
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
 import java.util.Arrays;
 import java.util.Locale;
 
@@ -188,22 +183,15 @@
     private boolean mEnabled = true;
 
     /**
-     * This constructor is being used only for keys in more keys keyboard.
+     * Constructor for a key on <code>MoreKeyKeyboard</code>, on <code>MoreSuggestions</code>,
+     * and in a <GridRows/>.
      */
-    public Key(final KeyboardParams params, final MoreKeySpec moreKeySpec, final int x, final int y,
-            final int width, final int height, final int labelFlags) {
-        this(params, moreKeySpec.mLabel, null, moreKeySpec.mIconId, moreKeySpec.mCode,
-                moreKeySpec.mOutputText, x, y, width, height, labelFlags, BACKGROUND_TYPE_NORMAL);
-    }
-
-    /**
-     * This constructor is being used only for key in popup suggestions pane.
-     */
-    public Key(final KeyboardParams params, final String label, final String hintLabel,
-            final int iconId, final int code, final String outputText, final int x, final int y,
-            final int width, final int height, final int labelFlags, final int backgroundType) {
-        mHeight = height - params.mVerticalGap;
-        mWidth = width - params.mHorizontalGap;
+    public Key(final String label, final int iconId, final int code, final String outputText,
+            final String hintLabel, final int labelFlags, final int backgroundType, final int x,
+            final int y, final int width, final int height, final int horizontalGap,
+            final int verticalGap) {
+        mHeight = height - verticalGap;
+        mWidth = width - horizontalGap;
         mHintLabel = hintLabel;
         mLabelFlags = labelFlags;
         mBackgroundType = backgroundType;
@@ -218,7 +206,7 @@
         mEnabled = (code != CODE_UNSPECIFIED);
         mIconId = iconId;
         // Horizontal gap is divided equally to both sides of the key.
-        mX = x + params.mHorizontalGap / 2;
+        mX = x + horizontalGap / 2;
         mY = y;
         mHitBox.set(x, y, x + width + 1, y + height);
         mKeyVisualAttributes = null;
@@ -227,25 +215,22 @@
     }
 
     /**
-     * Create a key with the given top-left coordinate and extract its attributes from the XML
-     * parser.
-     * @param res resources associated with the caller's context
+     * Create a key with the given top-left coordinate and extract its attributes from a key
+     * specification string, Key attribute array, key style, and etc.
+     *
+     * @param keySpec the key specification.
+     * @param keyAttr the Key XML attributes array.
+     * @param keyStyle the {@link KeyStyle} of this key.
      * @param params the keyboard building parameters.
      * @param row the row that this key belongs to. row's x-coordinate will be the right edge of
      *        this key.
-     * @param parser the XML parser containing the attributes for this key
-     * @throws XmlPullParserException
      */
-    public Key(final Resources res, final KeyboardParams params, final KeyboardRow row,
-            final XmlPullParser parser) throws XmlPullParserException {
+    public Key(final String keySpec, final TypedArray keyAttr, final KeyStyle style,
+            final KeyboardParams params, final KeyboardRow row) {
         final float horizontalGap = isSpacer() ? 0 : params.mHorizontalGap;
         final int rowHeight = row.getRowHeight();
         mHeight = rowHeight - params.mVerticalGap;
 
-        final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
-                R.styleable.Keyboard_Key);
-
-        final KeyStyle style = params.mKeyStyles.getKeyStyle(keyAttr, parser);
         final float keyXPos = row.getKeyX(keyAttr);
         final float keyWidth = row.getKeyWidth(keyAttr, keyXPos);
         final int keyYPos = row.getKeyY();
@@ -315,21 +300,13 @@
         }
         mActionFlags = actionFlags;
 
-        final String keySpec = style.getString(keyAttr, R.styleable.Keyboard_Key_keyLabel);
-
-        final int iconIdInAttr = KeySpecParser.getIconId(style.getString(keyAttr,
-                R.styleable.Keyboard_Key_keyIcon));
-        mIconId = (iconIdInAttr != ICON_UNDEFINED) ? iconIdInAttr
-                : KeySpecParser.getIconId(keySpec);
+        mIconId = KeySpecParser.getIconId(keySpec);
         final int disabledIconId = KeySpecParser.getIconId(style.getString(keyAttr,
                 R.styleable.Keyboard_Key_keyIconDisabled));
         final int previewIconId = KeySpecParser.getIconId(style.getString(keyAttr,
                 R.styleable.Keyboard_Key_keyIconPreview));
 
-        final int codeInAttr = KeySpecParser.parseCode(style.getString(keyAttr,
-                R.styleable.Keyboard_Key_code), params.mCodesSet, CODE_UNSPECIFIED);
-        final int code = (codeInAttr != CODE_UNSPECIFIED) ? codeInAttr
-                : KeySpecParser.getCode(keySpec, params.mCodesSet);
+        final int code = KeySpecParser.getCode(keySpec, params.mCodesSet);
         if ((mLabelFlags & LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL) != 0) {
             mLabel = params.mId.mCustomActionLabel;
         } else if (code >= Character.MIN_SUPPLEMENTARY_CODE_POINT) {
@@ -376,19 +353,18 @@
         } else {
             mCode = StringUtils.toUpperCaseOfCodeForLocale(code, needsToUpperCase, locale);
         }
+        final int altCodeInAttr = KeySpecParser.parseCode(style.getString(keyAttr,
+                R.styleable.Keyboard_Key_altCode), params.mCodesSet, CODE_UNSPECIFIED);
         final int altCode = StringUtils.toUpperCaseOfCodeForLocale(
-                KeySpecParser.parseCode(style.getString(keyAttr,
-                R.styleable.Keyboard_Key_altCode), params.mCodesSet, CODE_UNSPECIFIED),
-                needsToUpperCase, locale);
+                altCodeInAttr, needsToUpperCase, locale);
         mOptionalAttributes = OptionalAttributes.newInstance(outputText, altCode,
                 disabledIconId, previewIconId, visualInsetsLeft, visualInsetsRight);
         mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr);
-        keyAttr.recycle();
         mHashCode = computeHashCode(this);
     }
 
     /**
-     * Copy constructor.
+     * Copy constructor for DynamicGridKeyboard.GridKey.
      *
      * @param key the original key.
      */
@@ -940,9 +916,9 @@
     }
 
     public static class Spacer extends Key {
-        public Spacer(final Resources res, final KeyboardParams params, final KeyboardRow row,
-                final XmlPullParser parser) throws XmlPullParserException {
-            super(res, params, row, parser);
+        public Spacer(final TypedArray keyAttr, final KeyStyle keyStyle,
+                final KeyboardParams params, final KeyboardRow row) {
+            super(null /* keySpec */, keyAttr, keyStyle, params, row);
         }
 
         /**
@@ -950,8 +926,9 @@
          */
         protected Spacer(final KeyboardParams params, final int x, final int y, final int width,
                 final int height) {
-            super(params, null, null, ICON_UNDEFINED, CODE_UNSPECIFIED,
-                    null, x, y, width, height, 0, BACKGROUND_TYPE_EMPTY);
+            super(null /* label */, ICON_UNDEFINED, CODE_UNSPECIFIED, null /* outputText */,
+                    null /* hintLabel */, 0 /* labelFlags */, BACKGROUND_TYPE_EMPTY, x, y, width,
+                    height, params.mHorizontalGap, params.mVerticalGap);
         }
     }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 53b4485..aebba60 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -80,6 +80,7 @@
     private KeyboardState mState;
 
     private KeyboardLayoutSet mKeyboardLayoutSet;
+    private SettingsValues mCurrentSettingsValues;
 
     /** mIsAutoCorrectionActive indicates that auto corrected word will be input instead of
      * what user actually typed. */
@@ -158,6 +159,7 @@
                 settingsValues.mShowsVoiceInputKey,
                 settingsValues.isLanguageSwitchKeyEnabled());
         mKeyboardLayoutSet = builder.build();
+        mCurrentSettingsValues = settingsValues;
         try {
             mState.onLoadKeyboard();
         } catch (KeyboardLayoutSetException e) {
@@ -189,8 +191,13 @@
         keyboardView.setKeyboard(keyboard);
         mCurrentInputView.setKeyboardTopPadding(keyboard.mTopPadding);
         keyboardView.setKeyPreviewPopupEnabled(
-                Settings.readKeyPreviewPopupEnabled(mPrefs, mResources),
-                Settings.readKeyPreviewPopupDismissDelay(mPrefs, mResources));
+                mCurrentSettingsValues.mKeyPreviewPopupOn,
+                mCurrentSettingsValues.mKeyPreviewPopupDismissDelay);
+        keyboardView.setKeyPreviewAnimationParams(
+                mCurrentSettingsValues.mKeyPreviewShowUpStartScale,
+                mCurrentSettingsValues.mKeyPreviewShowUpDuration,
+                mCurrentSettingsValues.mKeyPreviewDismissEndScale,
+                mCurrentSettingsValues.mKeyPreviewDismissDuration);
         keyboardView.updateAutoCorrectionState(mIsAutoCorrectionActive);
         keyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
         final boolean subtypeChanged = (oldKeyboard == null)
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index f3cfae2..bd955ae 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -63,7 +63,6 @@
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 import com.android.inputmethod.latin.utils.TypefaceUtils;
 import com.android.inputmethod.latin.utils.UsabilityStudyLogUtils;
-import com.android.inputmethod.latin.utils.ViewLayoutUtils;
 import com.android.inputmethod.research.ResearchLogger;
 
 import java.util.WeakHashMap;
@@ -421,6 +420,12 @@
         mKeyPreviewDrawParams.setPopupEnabled(previewEnabled, delay);
     }
 
+    public void setKeyPreviewAnimationParams(final float showUpStartScale, final int showUpDuration,
+            final float dismissEndScale, final int dismissDuration) {
+        mKeyPreviewDrawParams.setAnimationParams(
+                showUpStartScale, showUpDuration, dismissEndScale, dismissDuration);
+    }
+
     private void locatePreviewPlacerView() {
         if (mDrawingPreviewPlacerView.getParent() != null) {
             return;
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
index 2bff107..a72f791 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
@@ -343,8 +343,7 @@
                 final int row = n / params.mNumColumns;
                 final int x = params.getX(n, row);
                 final int y = params.getY(row);
-                final Key key = new Key(params, moreKeySpec, x, y,
-                        params.mDefaultKeyWidth, params.mDefaultRowHeight, moreKeyFlags);
+                final Key key = moreKeySpec.buildKey(x, y, moreKeyFlags, params);
                 params.markAsEdgeKey(key, row);
                 params.onAddKey(key);
 
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 0931550..19aef14 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -215,8 +215,8 @@
 
         final Resources res = mainKeyboardViewAttr.getResources();
         sNeedsPhantomSuddenMoveEventHack = Boolean.parseBoolean(
-                ResourceUtils.getDeviceOverrideValue(
-                        res, R.array.phantom_sudden_move_event_device_list));
+                ResourceUtils.getDeviceOverrideValue(res,
+                        R.array.phantom_sudden_move_event_device_list, Boolean.FALSE.toString()));
         BogusMoveEventDetector.init(res);
 
         sTimerProxy = timerProxy;
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
index df869b2..ff197ba 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
@@ -100,7 +100,7 @@
         if (withAnimation) {
             if (tag instanceof KeyPreviewAnimations) {
                 final KeyPreviewAnimations animation = (KeyPreviewAnimations)tag;
-                animation.startZoomOut();
+                animation.startDismiss();
             }
             return;
         }
@@ -198,87 +198,87 @@
         }
 
         // Show preview with animation.
-        final Animator zoomIn = createZoomInAniation(key, previewTextView);
-        final Animator zoomOut = createZoomOutAnimation(key, previewTextView);
-        final KeyPreviewAnimations animation = new KeyPreviewAnimations(zoomIn, zoomOut);
+        final Animator showUpAnimation = createShowUpAniation(key, previewTextView);
+        final Animator dismissAnimation = createDismissAnimation(key, previewTextView);
+        final KeyPreviewAnimations animation = new KeyPreviewAnimations(
+                showUpAnimation, dismissAnimation);
         previewTextView.setTag(animation);
-        animation.startZoomIn();
+        animation.startShowUp();
     }
 
-    // TODO: Move these parameters to resources or preferences.
-    private static final float KEY_PREVIEW_START_ZOOM_IN_SCALE = 0.7f;
-    private static final float KEY_PREVIEW_END_ZOOM_IN_SCALE = 1.0f;
-    private static final float KEY_PREVIEW_END_ZOOM_OUT_SCALE = 0.7f;
+    private static final float KEY_PREVIEW_SHOW_UP_END_SCALE = 1.0f;
     private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR =
             new AccelerateInterpolator();
     private static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
             new DecelerateInterpolator();
 
-    private Animator createZoomInAniation(final Key key, final TextView previewTextView) {
+    private Animator createShowUpAniation(final Key key, final TextView previewTextView) {
+        // TODO: Optimization for no scale animation and no duration.
         final ObjectAnimator scaleXAnimation = ObjectAnimator.ofFloat(
-                previewTextView, View.SCALE_X, KEY_PREVIEW_START_ZOOM_IN_SCALE,
-                KEY_PREVIEW_END_ZOOM_IN_SCALE);
+                previewTextView, View.SCALE_X, mParams.getShowUpStartScale(),
+                KEY_PREVIEW_SHOW_UP_END_SCALE);
         final ObjectAnimator scaleYAnimation = ObjectAnimator.ofFloat(
-                previewTextView, View.SCALE_Y, KEY_PREVIEW_START_ZOOM_IN_SCALE,
-                KEY_PREVIEW_END_ZOOM_IN_SCALE);
-        final AnimatorSet zoomInAnimation = new AnimatorSet();
-        zoomInAnimation.play(scaleXAnimation).with(scaleYAnimation);
-        // TODO: Implement preference option to control key preview animation duration.
-        zoomInAnimation.setDuration(mParams.mZoomInDuration);
-        zoomInAnimation.setInterpolator(DECELERATE_INTERPOLATOR);
-        zoomInAnimation.addListener(new AnimatorListenerAdapter() {
+                previewTextView, View.SCALE_Y, mParams.getShowUpStartScale(),
+                KEY_PREVIEW_SHOW_UP_END_SCALE);
+        final AnimatorSet showUpAnimation = new AnimatorSet();
+        showUpAnimation.play(scaleXAnimation).with(scaleYAnimation);
+        showUpAnimation.setDuration(mParams.getShowUpDuration());
+        showUpAnimation.setInterpolator(DECELERATE_INTERPOLATOR);
+        showUpAnimation.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationStart(final Animator animation) {
                 showKeyPreview(key, previewTextView, false /* withAnimation */);
             }
         });
-        return zoomInAnimation;
+        return showUpAnimation;
     }
 
-    private Animator createZoomOutAnimation(final Key key, final TextView previewTextView) {
+    private Animator createDismissAnimation(final Key key, final TextView previewTextView) {
+        // TODO: Optimization for no scale animation and no duration.
         final ObjectAnimator scaleXAnimation = ObjectAnimator.ofFloat(
-                previewTextView, View.SCALE_X, KEY_PREVIEW_END_ZOOM_OUT_SCALE);
+                previewTextView, View.SCALE_X, mParams.getDismissEndScale());
         final ObjectAnimator scaleYAnimation = ObjectAnimator.ofFloat(
-                previewTextView, View.SCALE_Y, KEY_PREVIEW_END_ZOOM_OUT_SCALE);
-        final AnimatorSet zoomOutAnimation = new AnimatorSet();
-        zoomOutAnimation.play(scaleXAnimation).with(scaleYAnimation);
-        // TODO: Implement preference option to control key preview animation duration.
-        final int zoomOutDuration = Math.min(mParams.mZoomOutDuration, mParams.getLingerTimeout());
-        zoomOutAnimation.setDuration(zoomOutDuration);
-        zoomOutAnimation.setInterpolator(ACCELERATE_INTERPOLATOR);
-        zoomOutAnimation.addListener(new AnimatorListenerAdapter() {
+                previewTextView, View.SCALE_Y, mParams.getDismissEndScale());
+        final AnimatorSet dismissAnimation = new AnimatorSet();
+        dismissAnimation.play(scaleXAnimation).with(scaleYAnimation);
+        final int dismissDuration = Math.min(
+                mParams.getDismissDuration(), mParams.getLingerTimeout());
+        dismissAnimation.setDuration(dismissDuration);
+        dismissAnimation.setInterpolator(ACCELERATE_INTERPOLATOR);
+        dismissAnimation.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(final Animator animation) {
                 dismissKeyPreview(key, false /* withAnimation */);
             }
         });
-        return zoomOutAnimation;
+        return dismissAnimation;
     }
 
     private static class KeyPreviewAnimations extends AnimatorListenerAdapter {
-        private final Animator mZoomIn;
-        private final Animator mZoomOut;
+        private final Animator mShowUpAnimation;
+        private final Animator mDismissAnimation;
 
-        public KeyPreviewAnimations(final Animator zoomIn, final Animator zoomOut) {
-            mZoomIn = zoomIn;
-            mZoomOut = zoomOut;
+        public KeyPreviewAnimations(final Animator showUpAnimation,
+                final Animator dismissAnimation) {
+            mShowUpAnimation = showUpAnimation;
+            mDismissAnimation = dismissAnimation;
         }
 
-        public void startZoomIn() {
-            mZoomIn.start();
+        public void startShowUp() {
+            mShowUpAnimation.start();
         }
 
-        public void startZoomOut() {
-            if (mZoomIn.isRunning()) {
-                mZoomIn.addListener(this);
+        public void startDismiss() {
+            if (mShowUpAnimation.isRunning()) {
+                mShowUpAnimation.addListener(this);
                 return;
             }
-            mZoomOut.start();
+            mDismissAnimation.start();
         }
 
         @Override
         public void onAnimationEnd(final Animator animation) {
-            mZoomOut.start();
+            mDismissAnimation.start();
         }
     }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
index ff493b1..37e5c88 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
@@ -26,9 +26,10 @@
     public final int mLayoutId;
     public final int mPreviewOffset;
     public final int mPreviewHeight;
-    // TODO: Move those parameters to preferences.
-    public final int mZoomInDuration;
-    public final int mZoomOutDuration;
+    private int mShowUpDuration;
+    private int mDismissDuration;
+    private float mShowUpStartScale;
+    private float mDismissEndScale;
     private int mLingerTimeout;
     private boolean mShowPopup = true;
 
@@ -69,10 +70,6 @@
         if (mLayoutId == 0) {
             mShowPopup = false;
         }
-        mZoomInDuration = mainKeyboardViewAttr.getInt(
-                R.styleable.MainKeyboardView_keyPreviewZoomInDuration, 0);
-        mZoomOutDuration = mainKeyboardViewAttr.getInt(
-                R.styleable.MainKeyboardView_keyPreviewZoomOutDuration, 0);
     }
 
     public void setVisibleOffset(final int previewVisibleOffset) {
@@ -117,4 +114,28 @@
     public int getLingerTimeout() {
         return mLingerTimeout;
     }
+
+    public void setAnimationParams(final float showUpStartScale, final int showUpDuration,
+            final float dismissEndScale, final int dismissDuration) {
+        mShowUpStartScale = showUpStartScale;
+        mShowUpDuration = showUpDuration;
+        mDismissEndScale = dismissEndScale;
+        mDismissDuration = dismissDuration;
+    }
+
+    public float getShowUpStartScale() {
+        return mShowUpStartScale;
+    }
+
+    public int getShowUpDuration() {
+        return mShowUpDuration;
+    }
+
+    public float getDismissEndScale() {
+        return mDismissEndScale;
+    }
+
+    public int getDismissDuration() {
+        return mDismissDuration;
+    }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
index 2925a4b..2099666 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
@@ -42,6 +42,7 @@
  * Note that the '\' is also parsed by XML parser and {@link MoreKeySpec#splitKeySpecs(String)}
  * as well.
  */
+// TODO: Rename to KeySpec and make this class to the key specification object.
 public final class KeySpecParser {
     // Constants for parsing.
     private static final char BACKSLASH = Constants.CODE_BACKSLASH;
@@ -57,8 +58,15 @@
     }
 
     private static boolean hasCode(final String keySpec, final int labelEnd) {
-        if (labelEnd > 0 && labelEnd + 1 < keySpec.length()
-                && keySpec.startsWith(KeyboardCodesSet.PREFIX_CODE, labelEnd + 1)) {
+        if (labelEnd <= 0 || labelEnd + 1 >= keySpec.length()) {
+            return false;
+        }
+        if (keySpec.startsWith(KeyboardCodesSet.PREFIX_CODE, labelEnd + 1)) {
+            return true;
+        }
+        // This is a workaround to have a key that has a supplementary code point. We can't put a
+        // string in resource as a XML entity of a supplementary code point or a surrogate pair.
+        if (keySpec.startsWith(PREFIX_HEX, labelEnd + 1)) {
             return true;
         }
         return false;
@@ -203,19 +211,20 @@
         return (StringUtils.codePointCount(label) == 1) ? label.codePointAt(0) : CODE_OUTPUT_TEXT;
     }
 
-    // TODO: Make this method private once Key.code attribute is removed.
     public static int parseCode(final String text, final KeyboardCodesSet codesSet,
-            final int defCode) {
+            final int defaultCode) {
         if (text == null) {
-            return defCode;
+            return defaultCode;
         }
         if (text.startsWith(KeyboardCodesSet.PREFIX_CODE)) {
             return codesSet.getCode(text.substring(KeyboardCodesSet.PREFIX_CODE.length()));
         }
+        // This is a workaround to have a key that has a supplementary code point. We can't put a
+        // string in resource as a XML entity of a supplementary code point or a surrogate pair.
         if (text.startsWith(PREFIX_HEX)) {
             return Integer.parseInt(text.substring(PREFIX_HEX.length()), 16);
         }
-        return Integer.parseInt(text);
+        return defaultCode;
     }
 
     public static int getIconId(final String keySpec) {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
index a64f235..700c9b0 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
@@ -135,14 +135,12 @@
 
         public void readKeyAttributes(final TypedArray keyAttr) {
             // TODO: Currently not all Key attributes can be declared as style.
-            readString(keyAttr, R.styleable.Keyboard_Key_code);
             readString(keyAttr, R.styleable.Keyboard_Key_altCode);
-            readString(keyAttr, R.styleable.Keyboard_Key_keyLabel);
+            readString(keyAttr, R.styleable.Keyboard_Key_keySpec);
             readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel);
             readStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
             readStringArray(keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys);
             readFlags(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags);
-            readString(keyAttr, R.styleable.Keyboard_Key_keyIcon);
             readString(keyAttr, R.styleable.Keyboard_Key_keyIconDisabled);
             readString(keyAttr, R.styleable.Keyboard_Key_keyIconPreview);
             readInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index 47e9142..340d184 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -21,6 +21,7 @@
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
 import android.os.Build;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.TypedValue;
@@ -37,6 +38,7 @@
 import com.android.inputmethod.latin.utils.StringUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 import com.android.inputmethod.latin.utils.XmlParseUtils;
+import com.android.inputmethod.latin.utils.XmlParseUtils.ParseException;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -455,11 +457,15 @@
                 if (Build.VERSION.SDK_INT < supportedMinSdkVersion) {
                     continue;
                 }
+                final int labelFlags = row.getDefaultKeyLabelFlags();
+                final int backgroundType = row.getDefaultBackgroundType();
                 final int x = (int)row.getKeyX(null);
                 final int y = row.getKeyY();
-                final Key key = new Key(mParams, label, null /* hintLabel */, 0 /* iconId */,
-                        code, outputText, x, y, (int)keyWidth, row.getRowHeight(),
-                        row.getDefaultKeyLabelFlags(), row.getDefaultBackgroundType());
+                final int width = (int)keyWidth;
+                final int height = row.getRowHeight();
+                final Key key = new Key(label, KeyboardIconsSet.ICON_UNDEFINED, code, outputText,
+                        null /* hintLabel */, labelFlags, backgroundType, x, y, width, height,
+                        mParams.mHorizontalGap, mParams.mVerticalGap);
                 endKey(key);
                 row.advanceXPos(keyWidth);
             }
@@ -476,7 +482,15 @@
             if (DEBUG) startEndTag("<%s /> skipped", TAG_KEY);
             return;
         }
-        final Key key = new Key(mResources, mParams, row, parser);
+        final TypedArray keyAttr = mResources.obtainAttributes(
+                Xml.asAttributeSet(parser), R.styleable.Keyboard_Key);
+        final KeyStyle keyStyle = mParams.mKeyStyles.getKeyStyle(keyAttr, parser);
+        final String keySpec = keyStyle.getString(keyAttr, R.styleable.Keyboard_Key_keySpec);
+        if (TextUtils.isEmpty(keySpec)) {
+            throw new ParseException("Empty keySpec", parser);
+        }
+        final Key key = new Key(keySpec, keyAttr, keyStyle, mParams, row);
+        keyAttr.recycle();
         if (DEBUG) {
             startEndTag("<%s%s %s moreKeys=%s />", TAG_KEY, (key.isEnabled() ? "" : " disabled"),
                     key, Arrays.toString(key.getMoreKeys()));
@@ -492,7 +506,11 @@
             if (DEBUG) startEndTag("<%s /> skipped", TAG_SPACER);
             return;
         }
-        final Key.Spacer spacer = new Key.Spacer(mResources, mParams, row, parser);
+        final TypedArray keyAttr = mResources.obtainAttributes(
+                Xml.asAttributeSet(parser), R.styleable.Keyboard_Key);
+        final KeyStyle keyStyle = mParams.mKeyStyles.getKeyStyle(keyAttr, parser);
+        final Key spacer = new Key.Spacer(keyAttr, keyStyle, mParams, row);
+        keyAttr.recycle();
         if (DEBUG) startEndTag("<%s />", TAG_SPACER);
         XmlParseUtils.checkEndTag(TAG_SPACER, parser);
         endKey(spacer);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index 4322345..27e3e30 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -27,46 +27,18 @@
 import java.util.HashMap;
 import java.util.Locale;
 
-/**
- * !!!!! DO NOT EDIT THIS FILE !!!!!
- *
- * This file is generated by tools/make-keyboard-text. The base template file is
- *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
- *
- * This file must be updated when any text resources in keyboard layout files have been changed.
- * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
- * and should be defined in
- *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
- *
- * To update this file, please run the following commands.
- *   $ cd $ANDROID_BUILD_TOP
- *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
- *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
- *
- * The updated source file will be generated to the following path (this file).
- *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
- *   KeyboardTextsSet.java
- */
 public final class KeyboardTextsSet {
     public static final String PREFIX_TEXT = "!text/";
     private static final char BACKSLASH = Constants.CODE_BACKSLASH;
     private static final int MAX_STRING_REFERENCE_INDIRECTION = 10;
 
-    // Language to texts map.
-    private static final HashMap<String, String[]> sLanguageToTextsMap =
-            CollectionUtils.newHashMap();
-    private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap();
-
-    private String[] mTexts;
+    private String[] mTextsTable;
     // Resource name to text map.
     private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
 
     public void setLocale(final Locale locale) {
         final String language = locale.getLanguage();
-        mTexts = sLanguageToTextsMap.get(language);
-        if (mTexts == null) {
-            mTexts = LANGUAGE_DEFAULT;
-        }
+        mTextsTable = KeyboardTextsTable.getTextsTable(language);
     }
 
     public void loadStringResources(final Context context) {
@@ -86,14 +58,8 @@
     }
 
     public String getText(final String name) {
-        String text = mResourceNameToTextsMap.get(name);
-        if (text != null) {
-            return text;
-        }
-        final Integer id = sNameToIdsMap.get(name);
-        if (id == null) throw new RuntimeException("Unknown label: " + name);
-        text = (id < mTexts.length) ? mTexts[id] : null;
-        return (text == null) ? LANGUAGE_DEFAULT[id] : text;
+        final String text = mResourceNameToTextsMap.get(name);
+        return (text != null) ? text : KeyboardTextsTable.getText(name, mTextsTable);
     }
 
     private static int searchTextNameEnd(final String text, final int start) {
@@ -170,3487 +136,4 @@
         "label_pause_key",
         "label_wait_key",
     };
-
-    private static final String[] NAMES = {
-        /*  0 */ "more_keys_for_a",
-        /*  1 */ "more_keys_for_e",
-        /*  2 */ "more_keys_for_i",
-        /*  3 */ "more_keys_for_o",
-        /*  4 */ "more_keys_for_u",
-        /*  5 */ "more_keys_for_s",
-        /*  6 */ "more_keys_for_n",
-        /*  7 */ "more_keys_for_c",
-        /*  8 */ "more_keys_for_y",
-        /*  9 */ "more_keys_for_d",
-        /* 10 */ "more_keys_for_r",
-        /* 11 */ "more_keys_for_t",
-        /* 12 */ "more_keys_for_z",
-        /* 13 */ "more_keys_for_k",
-        /* 14 */ "more_keys_for_l",
-        /* 15 */ "more_keys_for_g",
-        /* 16 */ "more_keys_for_v",
-        /* 17 */ "more_keys_for_h",
-        /* 18 */ "more_keys_for_j",
-        /* 19 */ "more_keys_for_w",
-        /* 20 */ "keylabel_for_nordic_row1_11",
-        /* 21 */ "keylabel_for_nordic_row2_10",
-        /* 22 */ "keylabel_for_nordic_row2_11",
-        /* 23 */ "more_keys_for_nordic_row2_10",
-        /* 24 */ "more_keys_for_nordic_row2_11",
-        /* 25 */ "keylabel_for_east_slavic_row1_9",
-        /* 26 */ "keylabel_for_east_slavic_row1_12",
-        /* 27 */ "keylabel_for_east_slavic_row2_1",
-        /* 28 */ "keylabel_for_east_slavic_row2_11",
-        /* 29 */ "keylabel_for_east_slavic_row3_5",
-        /* 30 */ "more_keys_for_cyrillic_u",
-        /* 31 */ "more_keys_for_cyrillic_ka",
-        /* 32 */ "more_keys_for_cyrillic_en",
-        /* 33 */ "more_keys_for_cyrillic_ghe",
-        /* 34 */ "more_keys_for_east_slavic_row2_1",
-        /* 35 */ "more_keys_for_cyrillic_a",
-        /* 36 */ "more_keys_for_cyrillic_o",
-        /* 37 */ "more_keys_for_cyrillic_soft_sign",
-        /* 38 */ "more_keys_for_east_slavic_row2_11",
-        /* 39 */ "keylabel_for_south_slavic_row1_6",
-        /* 40 */ "keylabel_for_south_slavic_row2_11",
-        /* 41 */ "keylabel_for_south_slavic_row3_1",
-        /* 42 */ "keylabel_for_south_slavic_row3_8",
-        /* 43 */ "more_keys_for_cyrillic_ie",
-        /* 44 */ "more_keys_for_cyrillic_i",
-        /* 45 */ "keylabel_for_swiss_row1_11",
-        /* 46 */ "keylabel_for_swiss_row2_10",
-        /* 47 */ "keylabel_for_swiss_row2_11",
-        /* 48 */ "more_keys_for_swiss_row1_11",
-        /* 49 */ "more_keys_for_swiss_row2_10",
-        /* 50 */ "more_keys_for_swiss_row2_11",
-        /* 51 */ "label_to_alpha_key",
-        /* 52 */ "single_quotes",
-        /* 53 */ "double_quotes",
-        /* 54 */ "single_angle_quotes",
-        /* 55 */ "double_angle_quotes",
-        /* 56 */ "more_keys_for_currency_dollar",
-        /* 57 */ "keylabel_for_currency",
-        /* 58 */ "more_keys_for_currency",
-        /* 59 */ "more_keys_for_punctuation",
-        /* 60 */ "more_keys_for_tablet_punctuation",
-        /* 61 */ "more_keys_for_star",
-        /* 62 */ "more_keys_for_bullet",
-        /* 63 */ "more_keys_for_plus",
-        /* 64 */ "more_keys_for_left_parenthesis",
-        /* 65 */ "more_keys_for_right_parenthesis",
-        /* 66 */ "more_keys_for_less_than",
-        /* 67 */ "more_keys_for_greater_than",
-        /* 68 */ "more_keys_for_arabic_diacritics",
-        /* 69 */ "keylabel_for_symbols_1",
-        /* 70 */ "keylabel_for_symbols_2",
-        /* 71 */ "keylabel_for_symbols_3",
-        /* 72 */ "keylabel_for_symbols_4",
-        /* 73 */ "keylabel_for_symbols_5",
-        /* 74 */ "keylabel_for_symbols_6",
-        /* 75 */ "keylabel_for_symbols_7",
-        /* 76 */ "keylabel_for_symbols_8",
-        /* 77 */ "keylabel_for_symbols_9",
-        /* 78 */ "keylabel_for_symbols_0",
-        /* 79 */ "label_to_symbol_key",
-        /* 80 */ "label_to_symbol_with_microphone_key",
-        /* 81 */ "additional_more_keys_for_symbols_1",
-        /* 82 */ "additional_more_keys_for_symbols_2",
-        /* 83 */ "additional_more_keys_for_symbols_3",
-        /* 84 */ "additional_more_keys_for_symbols_4",
-        /* 85 */ "additional_more_keys_for_symbols_5",
-        /* 86 */ "additional_more_keys_for_symbols_6",
-        /* 87 */ "additional_more_keys_for_symbols_7",
-        /* 88 */ "additional_more_keys_for_symbols_8",
-        /* 89 */ "additional_more_keys_for_symbols_9",
-        /* 90 */ "additional_more_keys_for_symbols_0",
-        /* 91 */ "more_keys_for_symbols_1",
-        /* 92 */ "more_keys_for_symbols_2",
-        /* 93 */ "more_keys_for_symbols_3",
-        /* 94 */ "more_keys_for_symbols_4",
-        /* 95 */ "more_keys_for_symbols_5",
-        /* 96 */ "more_keys_for_symbols_6",
-        /* 97 */ "more_keys_for_symbols_7",
-        /* 98 */ "more_keys_for_symbols_8",
-        /* 99 */ "more_keys_for_symbols_9",
-        /* 100 */ "more_keys_for_symbols_0",
-        /* 101 */ "keylabel_for_comma",
-        /* 102 */ "more_keys_for_comma",
-        /* 103 */ "keylabel_for_tablet_comma",
-        /* 104 */ "keyhintlabel_for_tablet_comma",
-        /* 105 */ "more_keys_for_tablet_comma",
-        /* 106 */ "keylabel_for_period",
-        /* 107 */ "keyhintlabel_for_period",
-        /* 108 */ "more_keys_for_period",
-        /* 109 */ "keylabel_for_tablet_period",
-        /* 110 */ "keyhintlabel_for_tablet_period",
-        /* 111 */ "more_keys_for_tablet_period",
-        /* 112 */ "keylabel_for_symbols_question",
-        /* 113 */ "keylabel_for_symbols_semicolon",
-        /* 114 */ "keylabel_for_symbols_percent",
-        /* 115 */ "more_keys_for_exclamation",
-        /* 116 */ "more_keys_for_question",
-        /* 117 */ "more_keys_for_symbols_semicolon",
-        /* 118 */ "more_keys_for_symbols_percent",
-        /* 119 */ "more_keys_for_q",
-        /* 120 */ "more_keys_for_x",
-        /* 121 */ "keylabel_for_q",
-        /* 122 */ "keylabel_for_w",
-        /* 123 */ "keylabel_for_y",
-        /* 124 */ "keylabel_for_x",
-        /* 125 */ "keylabel_for_spanish_row2_10",
-        /* 126 */ "more_keys_for_am_pm",
-        /* 127 */ "settings_as_more_key",
-        /* 128 */ "shortcut_as_more_key",
-        /* 129 */ "action_next_as_more_key",
-        /* 130 */ "action_previous_as_more_key",
-        /* 131 */ "label_to_more_symbol_key",
-        /* 132 */ "label_to_more_symbol_for_tablet_key",
-        /* 133 */ "label_tab_key",
-        /* 134 */ "label_to_phone_numeric_key",
-        /* 135 */ "label_to_phone_symbols_key",
-        /* 136 */ "label_time_am",
-        /* 137 */ "label_time_pm",
-        /* 138 */ "keylabel_for_popular_domain",
-        /* 139 */ "more_keys_for_popular_domain",
-        /* 140 */ "single_laqm_raqm",
-        /* 141 */ "single_laqm_raqm_rtl",
-        /* 142 */ "single_raqm_laqm",
-        /* 143 */ "double_laqm_raqm",
-        /* 144 */ "double_laqm_raqm_rtl",
-        /* 145 */ "double_raqm_laqm",
-        /* 146 */ "single_lqm_rqm",
-        /* 147 */ "single_9qm_lqm",
-        /* 148 */ "single_9qm_rqm",
-        /* 149 */ "double_lqm_rqm",
-        /* 150 */ "double_9qm_lqm",
-        /* 151 */ "double_9qm_rqm",
-        /* 152 */ "more_keys_for_single_quote",
-        /* 153 */ "more_keys_for_double_quote",
-        /* 154 */ "more_keys_for_tablet_double_quote",
-        /* 155 */ "emoji_key_as_more_key",
-    };
-
-    private static final String EMPTY = "";
-
-    /* Default texts */
-    private static final String[] LANGUAGE_DEFAULT = {
-        /* 0~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        /* 51 */ "ABC",
-        /* 52 */ "!text/single_lqm_rqm",
-        /* 53 */ "!text/double_lqm_rqm",
-        /* 54 */ "!text/single_laqm_raqm",
-        /* 55 */ "!text/double_laqm_raqm",
-        // U+00A2: "¢" CENT SIGN
-        // U+00A3: "£" POUND SIGN
-        // U+20AC: "€" EURO SIGN
-        // U+00A5: "¥" YEN SIGN
-        // U+20B1: "₱" PESO SIGN
-        /* 56 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
-        /* 57 */ "$",
-        /* 58 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
-        /* 59 */ "!fixedColumnOrder!8,;,/,(,),#,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!7,;,/,(,),#,',\\,,&,\\%,+,\",-,:,@",
-        // U+2020: "†" DAGGER
-        // U+2021: "‡" DOUBLE DAGGER
-        // U+2605: "★" BLACK STAR
-        /* 61 */ "\u2020,\u2021,\u2605",
-        // U+266A: "♪" EIGHTH NOTE
-        // U+2665: "♥" BLACK HEART SUIT
-        // U+2660: "♠" BLACK SPADE SUIT
-        // U+2666: "♦" BLACK DIAMOND SUIT
-        // U+2663: "♣" BLACK CLUB SUIT
-        /* 62 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
-        // U+00B1: "±" PLUS-MINUS SIGN
-        /* 63 */ "\u00B1",
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 64 */ "!fixedColumnOrder!3,<,{,[",
-        /* 65 */ "!fixedColumnOrder!3,>,},]",
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 66 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
-        /* 67 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
-        /* 68 */ EMPTY,
-        /* 69 */ "1",
-        /* 70 */ "2",
-        /* 71 */ "3",
-        /* 72 */ "4",
-        /* 73 */ "5",
-        /* 74 */ "6",
-        /* 75 */ "7",
-        /* 76 */ "8",
-        /* 77 */ "9",
-        /* 78 */ "0",
-        // Label for "switch to symbols" key.
-        /* 79 */ "?123",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "123",
-        /* 81~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~90 */
-        // U+00B9: "¹" SUPERSCRIPT ONE
-        // U+00BD: "½" VULGAR FRACTION ONE HALF
-        // U+2153: "⅓" VULGAR FRACTION ONE THIRD
-        // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
-        // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
-        /* 91 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
-        // U+00B2: "²" SUPERSCRIPT TWO
-        // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
-        /* 92 */ "\u00B2,\u2154",
-        // U+00B3: "³" SUPERSCRIPT THREE
-        // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
-        // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
-        /* 93 */ "\u00B3,\u00BE,\u215C",
-        // U+2074: "⁴" SUPERSCRIPT FOUR
-        /* 94 */ "\u2074",
-        // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
-        /* 95 */ "\u215D",
-        /* 96 */ EMPTY,
-        // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
-        /* 97 */ "\u215E",
-        /* 98 */ EMPTY,
-        /* 99 */ EMPTY,
-        // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
-        // U+2205: "∅" EMPTY SET
-        /* 100 */ "\u207F,\u2205",
-        // Comma key
-        /* 101 */ ",",
-        /* 102 */ EMPTY,
-        /* 103 */ ",",
-        /* 104 */ EMPTY,
-        /* 105 */ EMPTY,
-        // Period key
-        /* 106 */ ".",
-        /* 107 */ EMPTY,
-        /* 108 */ "!text/more_keys_for_punctuation",
-        /* 109 */ ".",
-        /* 110 */ EMPTY,
-        /* 111 */ "!text/more_keys_for_tablet_punctuation",
-        /* 112 */ "?",
-        /* 113 */ ";",
-        /* 114 */ "%",
-        // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 115 */ "\u00A1",
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 116 */ "\u00BF",
-        /* 117 */ EMPTY,
-        // U+2030: "‰" PER MILLE SIGN
-        /* 118 */ "\u2030",
-        /* 119 */ EMPTY,
-        /* 120 */ EMPTY,
-        /* 121 */ "q",
-        /* 122 */ "w",
-        /* 123 */ "y",
-        /* 124 */ "x",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 125 */ "\u00F1",
-        /* 126 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
-        /* 127 */ "!icon/settings_key|!code/key_settings",
-        /* 128 */ "!icon/shortcut_key|!code/key_shortcut",
-        /* 129 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
-        /* 130 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
-        // Label for "switch to more symbol" modifier key.  Must be short to fit on key!
-        /* 131 */ "= \\ <",
-        // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
-        /* 132 */ "~ [ <",
-        // Label for "Tab" key.  Must be short to fit on key!
-        /* 133 */ "Tab",
-        // Label for "switch to phone numeric" key.  Must be short to fit on key!
-        /* 134 */ "123",
-        // Label for "switch to phone symbols" key.  Must be short to fit on key!
-        // U+FF0A: "*" FULLWIDTH ASTERISK
-        // U+FF03: "#" FULLWIDTH NUMBER SIGN
-        /* 135 */ "\uFF0A\uFF03",
-        // Key label for "ante meridiem"
-        /* 136 */ "AM",
-        // Key label for "post meridiem"
-        /* 137 */ "PM",
-        /* 138 */ ".com",
-        // popular web domains for the locale - most popular, displayed on the keyboard
-        /* 139 */ "!hasLabels!,.net,.org,.gov,.edu",
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        // Abbreviations are:
-        // laqm: LEFT-POINTING ANGLE QUOTATION MARK
-        // raqm: RIGHT-POINTING ANGLE QUOTATION MARK
-        // rtl: Right-To-Left script order
-        // lqm: LEFT QUOTATION MARK
-        // rqm: RIGHT QUOTATION MARK
-        // 9qm: LOW-9 QUOTATION MARK
-        // The following each quotation mark pair consist of
-        // <opening quotation mark>, <closing quotation mark>
-        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 140 */ "\u2039,\u203A",
-        /* 141 */ "\u2039|\u203A,\u203A|\u2039",
-        /* 142 */ "\u203A,\u2039",
-        /* 143 */ "\u00AB,\u00BB",
-        /* 144 */ "\u00AB|\u00BB,\u00BB|\u00AB",
-        /* 145 */ "\u00BB,\u00AB",
-        // The following each quotation mark triplet consists of
-        // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
-        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 146 */ "\u201A,\u2018,\u2019",
-        /* 147 */ "\u2019,\u201A,\u2018",
-        /* 148 */ "\u2018,\u201A,\u2019",
-        /* 149 */ "\u201E,\u201C,\u201D",
-        /* 150 */ "\u201D,\u201E,\u201C",
-        /* 151 */ "\u201C,\u201E,\u201D",
-        /* 152 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
-        /* 153 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
-        /* 154 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
-        /* 155 */ "!icon/emoji_key|!code/key_emoji",
-    };
-
-    /* Language af: Afrikaans */
-    private static final String[] LANGUAGE_af = {
-        // This is the same as Dutch except more keys of y and demoting vowels with diaeresis.
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
-        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u00FD,\u0133",
-    };
-
-    /* Language ar: Arabic */
-    private static final String[] LANGUAGE_ar = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0623: "ا" ARABIC LETTER ALEF
-        // U+200C: ZERO WIDTH NON-JOINER
-        // U+0628: "ب" ARABIC LETTER BEH
-        // U+062C: "پ" ARABIC LETTER PEH
-        /* 51 */ "\u0623\u200C\u0628\u200C\u062C",
-        /* 52 */ null,
-        /* 53 */ null,
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56~ */
-        null, null, null,
-        /* ~58 */
-        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
-        /* 60 */ null,
-        // U+2605: "★" BLACK STAR
-        // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 61 */ "\u2605,\u066D",
-        // U+266A: "♪" EIGHTH NOTE
-        /* 62 */ "\u266A",
-        /* 63 */ null,
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
-        // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
-        /* 64 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 65 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
-        // U+0655: "ٕ" ARABIC HAMZA BELOW
-        // U+0654: "ٔ" ARABIC HAMZA ABOVE
-        // U+0652: "ْ" ARABIC SUKUN
-        // U+064D: "ٍ" ARABIC KASRATAN
-        // U+064C: "ٌ" ARABIC DAMMATAN
-        // U+064B: "ً" ARABIC FATHATAN
-        // U+0651: "ّ" ARABIC SHADDA
-        // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF
-        // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF
-        // U+0653: "ٓ" ARABIC MADDAH ABOVE
-        // U+0650: "ِ" ARABIC KASRA
-        // U+064F: "ُ" ARABIC DAMMA
-        // U+064E: "َ" ARABIC FATHA
-        // U+0640: "ـ" ARABIC TATWEEL
-        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
-        // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 68 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        // U+0661: "١" ARABIC-INDIC DIGIT ONE
-        /* 69 */ "\u0661",
-        // U+0662: "٢" ARABIC-INDIC DIGIT TWO
-        /* 70 */ "\u0662",
-        // U+0663: "٣" ARABIC-INDIC DIGIT THREE
-        /* 71 */ "\u0663",
-        // U+0664: "٤" ARABIC-INDIC DIGIT FOUR
-        /* 72 */ "\u0664",
-        // U+0665: "٥" ARABIC-INDIC DIGIT FIVE
-        /* 73 */ "\u0665",
-        // U+0666: "٦" ARABIC-INDIC DIGIT SIX
-        /* 74 */ "\u0666",
-        // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN
-        /* 75 */ "\u0667",
-        // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT
-        /* 76 */ "\u0668",
-        // U+0669: "٩" ARABIC-INDIC DIGIT NINE
-        /* 77 */ "\u0669",
-        // U+0660: "٠" ARABIC-INDIC DIGIT ZERO
-        /* 78 */ "\u0660",
-        // Label for "switch to symbols" key.
-        // U+061F: "؟" ARABIC QUESTION MARK
-        /* 79 */ "\u0663\u0662\u0661\u061F",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "\u0663\u0662\u0661",
-        /* 81 */ "1",
-        /* 82 */ "2",
-        /* 83 */ "3",
-        /* 84 */ "4",
-        /* 85 */ "5",
-        /* 86 */ "6",
-        /* 87 */ "7",
-        /* 88 */ "8",
-        /* 89 */ "9",
-        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
-        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 90 */ "0,\u066B,\u066C",
-        /* 91~ */
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~100 */
-        // U+060C: "،" ARABIC COMMA
-        /* 101 */ "\u060C",
-        /* 102 */ "\\,",
-        // U+061F: "؟" ARABIC QUESTION MARK
-        // U+060C: "،" ARABIC COMMA
-        // U+061B: "؛" ARABIC SEMICOLON
-        /* 103 */ "\u060C",
-        /* 104 */ "\u061F",
-        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\",\'",
-        /* 106 */ null,
-        // U+0651: "ّ" ARABIC SHADDA
-        /* 107 */ "\u0651",
-        /* 108 */ "!text/more_keys_for_arabic_diacritics",
-        /* 109 */ null,
-        /* 110 */ "\u0651",
-        /* 111 */ "!text/more_keys_for_arabic_diacritics",
-        /* 112 */ "\u061F",
-        /* 113 */ "\u061B",
-        // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 114 */ "\u066A",
-        /* 115 */ null,
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 116 */ "?,\u00BF",
-        /* 117 */ ";",
-        // U+2030: "‰" PER MILLE SIGN
-        /* 118 */ "\\%,\u2030",
-    };
-
-    /* Language az_AZ: Azerbaijani (Azerbaijan) */
-    private static final String[] LANGUAGE_az_AZ = {
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        /* 0 */ "\u00E2",
-        // U+0259: "ə" LATIN SMALL LETTER SCHWA
-        /* 1 */ "\u0259",
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
-        /* 6 */ 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
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        null, null, null, null, null, null, null,
-        /* ~14 */
-        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u011F",
-    };
-
-    /* Language be_BY: Belarusian (Belarus) */
-    private static final String[] LANGUAGE_be_BY = {
-        /* 0~ */
-        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,
-        /* ~24 */
-        // U+045E: "ў" CYRILLIC SMALL LETTER SHORT U
-        /* 25 */ "\u045E",
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 26 */ "\u0451",
-        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 29 */ "\u0456",
-        /* 30~ */
-        null, null, null, null, null, null, null,
-        /* ~36 */
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language bg: Bulgarian */
-    private static final String[] LANGUAGE_bg = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ null,
-        // single_quotes of Bulgarian is default single_quotes_right_left.
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language ca: Catalan */
-    private static final String[] LANGUAGE_ca = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        null, null, null, null, null, null,
-        /* ~13 */
-        // U+00B7: "·" MIDDLE DOT
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "l\u00B7l,\u0142",
-        /* 15~ */
-        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,
-        /* ~58 */
-        // U+00B7: "·" MIDDLE DOT
-        /* 59 */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!8,;,/,(,),#,\u00B7,',\\,,&,\\%,+,\",-,:,@",
-        /* 61~ */
-        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,
-        /* ~124 */
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 125 */ "\u00E7",
-    };
-
-    /* Language cs: Czech */
-    private static final String[] LANGUAGE_cs = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        /* 5 */ "\u0161,\u00DF,\u015B",
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0148,\u00F1,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0159",
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0165",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language da: Danish */
-    private static final String[] LANGUAGE_da = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        /* 1 */ "\u00E9,\u00EB",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        /* 2 */ "\u00ED,\u00EF",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u00DF,\u015B,\u0161",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u00F0",
-        /* 10~ */
-        null, null, null, null,
-        /* ~13 */
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        null, null, null, null, null,
-        /* ~19 */
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 21 */ "\u00E6",
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 22 */ "\u00F8",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 23 */ "\u00E4",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 24 */ "\u00F6",
-        /* 25~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language de: German */
-    private static final String[] LANGUAGE_de = {
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
-        // 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
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
-        /* 2 */ null,
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u00DF,\u015B,\u0161",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7~ */
-        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,
-        /* ~44 */
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 45 */ "\u00FC",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 46 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 47 */ "\u00E4",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        /* 48 */ "\u00E8",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        /* 49 */ "\u00E9",
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        /* 50 */ "\u00E0",
-        /* 51 */ null,
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language el: Greek */
-    private static final String[] LANGUAGE_el = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
-        // U+0392: "Β" GREEK CAPITAL LETTER BETA
-        // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA
-        /* 51 */ "\u0391\u0392\u0393",
-    };
-
-    /* Language en: English */
-    private static final String[] LANGUAGE_en = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
-    };
-
-    /* Language eo: Esperanto */
-    private static final String[] LANGUAGE_eo = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00B5: "µ" MICRO SIGN
-        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u00DF,\u0161,\u015B,\u0219,\u015F",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
-        // U+014B: "ŋ" LATIN SMALL LETTER ENG
-        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
-        /* 7 */ "\u0107,\u010D,\u00E7,\u010B",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 8 */ "y,\u00FD,\u0177,\u00FF,\u00FE",
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u00F0,\u010F,\u0111",
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        /* 10 */ "\u0159,\u0155,\u0157",
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
-        /* 11 */ "\u0165,\u021B,\u0163,\u0167",
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017A,\u017C,\u017E",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        // U+0138: "ĸ" LATIN SMALL LETTER KRA
-        /* 13 */ "\u0137,\u0138",
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
-        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
-        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-        /* 15 */ "\u011F,\u0121,\u0123",
-        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 16 */ "w,\u0175",
-        // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
-        // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE
-        /* 17 */ "\u0125,\u0127",
-        /* 18 */ null,
-        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 19 */ "w,\u0175",
-        /* 20~ */
-        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, 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,
-        /* ~118 */
-        /* 119 */ "q",
-        /* 120 */ "x",
-        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
-        /* 121 */ "\u015D",
-        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
-        /* 122 */ "\u011D",
-        // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
-        /* 123 */ "\u016D",
-        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        /* 124 */ "\u0109",
-        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 125 */ "\u0135",
-    };
-
-    /* Language es: Spanish */
-    private static final String[] LANGUAGE_es = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        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,
-        /* ~58 */
-        // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 59 */ "!fixedColumnOrder!9,\u00A1,;,/,(,),#,!,\\,,?,\u00BF,&,\\%,+,\",-,:,',@",
-    };
-
-    /* Language et_EE: Estonian (Estonia) */
-    private static final String[] LANGUAGE_et_EE = {
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
-        // 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
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
-        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null,
-        /* ~19 */
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 20 */ "\u00FC",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 23 */ "\u00F5",
-        /* 24~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language fa: Persian */
-    private static final String[] LANGUAGE_fa = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // 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
-        /* 51 */ "\u0627\u200C\u0628\u200C\u067E",
-        /* 52 */ null,
-        /* 53 */ null,
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56 */ null,
-        // U+FDFC: "﷼" RIAL SIGN
-        /* 57 */ "\uFDFC",
-        /* 58 */ null,
-        // U+061F: "؟" ARABIC QUESTION MARK
-        // U+060C: "،" ARABIC COMMA
-        // U+061B: "؛" ARABIC SEMICOLON
-        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
-        /* 60 */ null,
-        // U+2605: "★" BLACK STAR
-        // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 61 */ "\u2605,\u066D",
-        // U+266A: "♪" EIGHTH NOTE
-        /* 62 */ "\u266A",
-        /* 63 */ null,
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
-        // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
-        /* 64 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 65 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
-        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
-        // U+0655: "ٕ" ARABIC HAMZA BELOW
-        // U+0652: "ْ" ARABIC SUKUN
-        // U+0651: "ّ" ARABIC SHADDA
-        // U+064C: "ٌ" ARABIC DAMMATAN
-        // U+064D: "ٍ" ARABIC KASRATAN
-        // U+064B: "ً" ARABIC FATHATAN
-        // U+0654: "ٔ" ARABIC HAMZA ABOVE
-        // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF
-        // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF
-        // U+0653: "ٓ" ARABIC MADDAH ABOVE
-        // U+064F: "ُ" ARABIC DAMMA
-        // U+0650: "ِ" ARABIC KASRA
-        // U+064E: "َ" ARABIC FATHA
-        // U+0640: "ـ" ARABIC TATWEEL
-        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
-        // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 68 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
-        /* 69 */ "\u06F1",
-        // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
-        /* 70 */ "\u06F2",
-        // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE
-        /* 71 */ "\u06F3",
-        // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR
-        /* 72 */ "\u06F4",
-        // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE
-        /* 73 */ "\u06F5",
-        // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX
-        /* 74 */ "\u06F6",
-        // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN
-        /* 75 */ "\u06F7",
-        // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT
-        /* 76 */ "\u06F8",
-        // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE
-        /* 77 */ "\u06F9",
-        // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO
-        /* 78 */ "\u06F0",
-        // Label for "switch to symbols" key.
-        // U+061F: "؟" ARABIC QUESTION MARK
-        /* 79 */ "\u06F3\u06F2\u06F1\u061F",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "\u06F3\u06F2\u06F1",
-        /* 81 */ "1",
-        /* 82 */ "2",
-        /* 83 */ "3",
-        /* 84 */ "4",
-        /* 85 */ "5",
-        /* 86 */ "6",
-        /* 87 */ "7",
-        /* 88 */ "8",
-        /* 89 */ "9",
-        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
-        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 90 */ "0,\u066B,\u066C",
-        /* 91~ */
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~100 */
-        // U+060C: "،" ARABIC COMMA
-        /* 101 */ "\u060C",
-        /* 102 */ "\\,",
-        // U+060C: "،" ARABIC COMMA
-        // U+061B: "؛" ARABIC SEMICOLON
-        // U+061F: "؟" ARABIC QUESTION MARK
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 103 */ "\u060C",
-        /* 104 */ "\u061F",
-        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
-        /* 106 */ null,
-        // U+064B: "ً" ARABIC FATHATAN
-        /* 107 */ "\u064B",
-        /* 108 */ "!text/more_keys_for_arabic_diacritics",
-        /* 109 */ null,
-        /* 110 */ "\u064B",
-        /* 111 */ "!text/more_keys_for_arabic_diacritics",
-        /* 112 */ "\u061F",
-        /* 113 */ "\u061B",
-        // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 114 */ "\u066A",
-        /* 115 */ null,
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 116 */ "?,\u00BF",
-        /* 117 */ ";",
-        // U+2030: "‰" PER MILLE SIGN
-        /* 118 */ "\\%,\u2030",
-    };
-
-    /* Language fi: Finnish */
-    private static final String[] LANGUAGE_fi = {
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
-        /* 1 */ null,
-        /* 2 */ null,
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 4 */ "\u00FC",
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        /* 5 */ "\u0161,\u00DF,\u015B",
-        /* 6~ */
-        null, null, null, null, null, null,
-        /* ~11 */
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        null, null, null, null, null, null, null,
-        /* ~19 */
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 23 */ "\u00F8",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 24 */ "\u00E6",
-    };
-
-    /* Language fr: French */
-    private static final String[] LANGUAGE_fr = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
-        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
-        /* 5 */ null,
-        /* 6 */ 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
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "%,\u00FF",
-        /* 9~ */
-        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,
-        /* ~44 */
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        /* 45 */ "\u00E8",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        /* 46 */ "\u00E9",
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        /* 47 */ "\u00E0",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 48 */ "\u00FC",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 49 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 50 */ "\u00E4",
-    };
-
-    /* Language hi: Hindi */
-    private static final String[] LANGUAGE_hi = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0915: "क" DEVANAGARI LETTER KA
-        // U+0916: "ख" DEVANAGARI LETTER KHA
-        // U+0917: "ग" DEVANAGARI LETTER GA
-        /* 51 */ "\u0915\u0916\u0917",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+20B9: "₹" INDIAN RUPEE SIGN
-        /* 57 */ "\u20B9",
-        /* 58~ */
-        null, null, null, null, null, null, null, null, null, null, null,
-        /* ~68 */
-        // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 69 */ "\u0967",
-        // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 70 */ "\u0968",
-        // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 71 */ "\u0969",
-        // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 72 */ "\u096A",
-        // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 73 */ "\u096B",
-        // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 74 */ "\u096C",
-        // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 75 */ "\u096D",
-        // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 76 */ "\u096E",
-        // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 77 */ "\u096F",
-        // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 78 */ "\u0966",
-        // Label for "switch to symbols" key.
-        /* 79 */ "?\u0967\u0968\u0969",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "\u0967\u0968\u0969",
-        /* 81 */ "1",
-        /* 82 */ "2",
-        /* 83 */ "3",
-        /* 84 */ "4",
-        /* 85 */ "5",
-        /* 86 */ "6",
-        /* 87 */ "7",
-        /* 88 */ "8",
-        /* 89 */ "9",
-        /* 90 */ "0",
-    };
-
-    /* Language hr: Croatian */
-    private static final String[] LANGUAGE_hr = {
-        /* 0~ */
-        null, null, null, null, null,
-        /* ~4 */
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u0161,\u015B,\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u010D,\u0107,\u00E7",
-        /* 8 */ null,
-        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10 */ null,
-        /* 11 */ null,
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language hu: Hungarian */
-    private static final String[] LANGUAGE_hu = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
-        /* 5~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language hy_AM: Armenian (Armenia) */
-    private static final String[] LANGUAGE_hy_AM = {
-        /* 0~ */
-        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,
-        /* ~58 */
-        // U+058A: "֊" ARMENIAN HYPHEN
-        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
-        // U+055D: "՝" ARMENIAN COMMA
-        // U+055E: "՞" ARMENIAN QUESTION MARK
-        // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING
-        // U+055A: "՚" ARMENIAN APOSTROPHE
-        // U+055B: "՛" ARMENIAN EMPHASIS MARK
-        // U+055F: "՟" ARMENIAN ABBREVIATION MARK
-        /* 59 */ "!fixedColumnOrder!8,!,?,\u0559,\u055A,.,\u055C,\\,,\u055E,:,;,\u055F,\u00AB,\u00BB,\u058A,\u055D,\u055B",
-        /* 60~ */
-        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,
-        /* ~102 */
-        // U+058F: "֏" ARMENIAN DRAM SIGN
-        // TODO: Enable this when we have glyph for the following letter
-        // <string name="keylabel_for_currency">&#x058F;</string>
-        // 
-        // U+055D: "՝" ARMENIAN COMMA
-        /* 103 */ "\u055D",
-        /* 104 */ null,
-        /* 105 */ null,
-        // U+0589: "։" ARMENIAN FULL STOP
-        /* 106 */ "\u0589",
-        /* 107 */ null,
-        /* 108 */ null,
-        /* 109 */ "\u0589",
-        /* 110 */ null,
-        /* 111 */ "!text/more_keys_for_punctuation",
-        /* 112~ */
-        null, null, null,
-        /* ~114 */
-        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
-        // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 115 */ "\u055C,\u00A1",
-        // U+055E: "՞" ARMENIAN QUESTION MARK
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 116 */ "\u055E,\u00BF",
-    };
-
-    /* Language is: Icelandic */
-    private static final String[] LANGUAGE_is = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
-        /* 5~ */
-        null, null, null,
-        /* ~7 */
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u00F0",
-        /* 10 */ null,
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 11 */ "\u00FE",
-        /* 12~ */
-        null, null, null, null, null, null, null, null,
-        /* ~19 */
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 20 */ "\u00F0",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 21 */ "\u00E6",
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 22 */ "\u00FE",
-        /* 23~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language it: Italian */
-    private static final String[] LANGUAGE_it = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
-    };
-
-    /* Language iw: Hebrew */
-    private static final String[] LANGUAGE_iw = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+05D0: "א" HEBREW LETTER ALEF
-        // U+05D1: "ב" HEBREW LETTER BET
-        // U+05D2: "ג" HEBREW LETTER GIMEL
-        /* 51 */ "\u05D0\u05D1\u05D2",
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        /* 52 */ "\u2018,\u2019,\u201A",
-        /* 53 */ "\u201C,\u201D,\u201E",
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56 */ null,
-        // U+20AA: "₪" NEW SHEQEL SIGN
-        /* 57 */ "\u20AA",
-        /* 58 */ null,
-        /* 59 */ "!fixedColumnOrder!8,;,/,(|),)|(,#,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!7,;,/,(|),)|(,#,',\\,,&,\\%,+,\",-,:,@",
-        // U+2605: "★" BLACK STAR
-        /* 61 */ "\u2605",
-        /* 62 */ null,
-        // U+00B1: "±" PLUS-MINUS SIGN
-        // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
-        /* 63 */ "\u00B1,\uFB29",
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 64 */ "!fixedColumnOrder!3,<|>,{|},[|]",
-        /* 65 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
-    };
-
-    /* Language ka_GE: Georgian (Georgia) */
-    private static final String[] LANGUAGE_ka_GE = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+10D0: "ა" GEORGIAN LETTER AN
-        // U+10D1: "ბ" GEORGIAN LETTER BAN
-        // U+10D2: "გ" GEORGIAN LETTER GAN
-        /* 51 */ "\u10D0\u10D1\u10D2",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language kk: Kazakh */
-    private static final String[] LANGUAGE_kk = {
-        /* 0~ */
-        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,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
-        // U+04B1: "ұ" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
-        /* 30 */ "\u04AF,\u04B1",
-        // U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER
-        /* 31 */ "\u049B",
-        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
-        /* 32 */ "\u04A3",
-        // U+0493: "ғ" CYRILLIC SMALL LETTER GHE WITH STROKE
-        /* 33 */ "\u0493",
-        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 34 */ "\u0456",
-        // U+04D9: "ә" CYRILLIC SMALL LETTER SCHWA
-        /* 35 */ "\u04D9",
-        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
-        /* 36 */ "\u04E9",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA
-        /* 38 */ "\u04BB",
-        /* 39~ */
-        null, null, null, null,
-        /* ~42 */
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-    };
-
-    /* Language km_KH: Khmer (Cambodia) */
-    private static final String[] LANGUAGE_km_KH = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+1780: "ក" KHMER LETTER KA
-        // U+1781: "ខ" KHMER LETTER KHA
-        // U+1782: "គ" KHMER LETTER KO
-        /* 51 */ "\u1780\u1781\u1782",
-        /* 52~ */
-        null, null, null, null,
-        /* ~55 */
-        // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
-        /* 56 */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
-    };
-
-    /* Language ky: Kirghiz */
-    private static final String[] LANGUAGE_ky = {
-        /* 0~ */
-        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,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
-        /* 30 */ "\u04AF",
-        /* 31 */ null,
-        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
-        /* 32 */ "\u04A3",
-        /* 33~ */
-        null, null, null,
-        /* ~35 */
-        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
-        /* 36 */ "\u04E9",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-    };
-
-    /* Language lo_LA: Lao (Laos) */
-    private static final String[] LANGUAGE_lo_LA = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0E81: "ກ" LAO LETTER KO
-        // U+0E82: "ຂ" LAO LETTER KHO SUNG
-        // U+0E84: "ຄ" LAO LETTER KHO TAM
-        /* 51 */ "\u0E81\u0E82\u0E84",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+20AD: "₭" KIP SIGN
-        /* 57 */ "\u20AD",
-    };
-
-    /* Language lt: Lithuanian */
-    private static final String[] LANGUAGE_lt = {
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
-        // 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
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
-        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language lv: Latvian */
-    private static final String[] LANGUAGE_lv = {
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
-        // 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
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
-        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language mk: Macedonian */
-    private static final String[] LANGUAGE_mk = {
-        /* 0~ */
-        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,
-        /* ~38 */
-        // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
-        /* 39 */ "\u0455",
-        // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
-        /* 40 */ "\u045C",
-        // U+0437: "з" CYRILLIC SMALL LETTER ZE
-        /* 41 */ "\u0437",
-        // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE
-        /* 42 */ "\u0453",
-        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
-        /* 43 */ "\u0450",
-        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
-        /* 44 */ "\u045D",
-        /* 45~ */
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language mn_MN: Mongolian (Mongolia) */
-    private static final String[] LANGUAGE_mn_MN = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+20AE: "₮" TUGRIK SIGN
-        /* 57 */ "\u20AE",
-    };
-
-    /* Language nb: Norwegian Bokmål */
-    private static final String[] LANGUAGE_nb = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
-        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        /* 2 */ null,
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        /* 5~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~19 */
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 21 */ "\u00F8",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 22 */ "\u00E6",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 23 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 24 */ "\u00E4",
-        /* 25~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-    };
-
-    /* Language ne_NP: Nepali (Nepal) */
-    private static final String[] LANGUAGE_ne_NP = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0915: "क" DEVANAGARI LETTER KA
-        // U+0916: "ख" DEVANAGARI LETTER KHA
-        // U+0917: "ग" DEVANAGARI LETTER GA
-        /* 51 */ "\u0915\u0916\u0917",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
-        /* 57 */ "\u0930\u0941.",
-        /* 58~ */
-        null, null, null, null, null, null, null, null, null, null, null,
-        /* ~68 */
-        // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 69 */ "\u0967",
-        // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 70 */ "\u0968",
-        // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 71 */ "\u0969",
-        // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 72 */ "\u096A",
-        // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 73 */ "\u096B",
-        // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 74 */ "\u096C",
-        // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 75 */ "\u096D",
-        // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 76 */ "\u096E",
-        // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 77 */ "\u096F",
-        // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 78 */ "\u0966",
-        // Label for "switch to symbols" key.
-        /* 79 */ "?\u0967\u0968\u0969",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "\u0967\u0968\u0969",
-        /* 81 */ "1",
-        /* 82 */ "2",
-        /* 83 */ "3",
-        /* 84 */ "4",
-        /* 85 */ "5",
-        /* 86 */ "6",
-        /* 87 */ "7",
-        /* 88 */ "8",
-        /* 89 */ "9",
-        /* 90 */ "0",
-    };
-
-    /* Language nl: Dutch */
-    private static final String[] LANGUAGE_nl = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u0133",
-        /* 9~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-    };
-
-    /* Language pl: Polish */
-    private static final String[] LANGUAGE_pl = {
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // 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
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
-        /* 2 */ null,
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        /* 4 */ null,
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015B,\u00DF,\u0161",
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u0144,\u00F1",
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u0107,\u00E7,\u010D",
-        /* 8~ */
-        null, null, null, null,
-        /* ~11 */
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017C,\u017A,\u017E",
-        /* 13 */ null,
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-    };
-
-    /* Language pt: Portuguese */
-    private static final String[] LANGUAGE_pt = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        /* 6 */ 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
-        /* 7 */ "\u00E7,\u010D,\u0107",
-    };
-
-    /* Language rm: Raeto-Romance */
-    private static final String[] LANGUAGE_rm = {
-        /* 0~ */
-        null, null, null,
-        /* ~2 */
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
-    };
-
-    /* Language ro: Romanian */
-    private static final String[] LANGUAGE_ro = {
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
-        /* 1 */ null,
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        /* 3 */ null,
-        /* 4 */ null,
-        // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u0219,\u00DF,\u015B,\u0161",
-        /* 6~ */
-        null, null, null, null, null,
-        /* ~10 */
-        // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
-        /* 11 */ "\u021B",
-        /* 12~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-    };
-
-    /* Language ru: Russian */
-    private static final String[] LANGUAGE_ru = {
-        /* 0~ */
-        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,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        /* 30~ */
-        null, null, null, null, null, null, null,
-        /* ~36 */
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language sk: Slovak */
-    private static final String[] LANGUAGE_sk = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        // 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
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0148,\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        /* 10 */ "\u0155,\u0159,\u0157",
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        /* 11 */ "\u0165,\u0163",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013E,\u013A,\u013C,\u0142",
-        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language sl: Slovenian */
-    private static final String[] LANGUAGE_sl = {
-        /* 0~ */
-        null, null, null, null, null,
-        /* ~4 */
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u0161",
-        /* 6 */ null,
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u0107",
-        /* 8 */ null,
-        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10 */ null,
-        /* 11 */ null,
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017E",
-        /* 13~ */
-        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,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language sr: Serbian */
-    private static final String[] LANGUAGE_sr = {
-        /* 0~ */
-        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,
-        /* ~38 */
-        // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified.
-        // BEGIN: More keys definitions for Serbian (Latin)
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // <string name="more_keys_for_s">&#x0161;,&#x00DF;,&#x015B;</string>
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // <string name="more_keys_for_c">&#x010D;,&#x00E7;,&#x0107;</string>
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        // <string name="more_keys_for_d">&#x010F;</string>
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // <string name="more_keys_for_z">&#x017E;,&#x017A;,&#x017C;</string>
-        // END: More keys definitions for Serbian (Latin)
-        // BEGIN: More keys definitions for Serbian (Cyrillic)
-        // U+0437: "з" CYRILLIC SMALL LETTER ZE
-        /* 39 */ "\u0437",
-        // U+045B: "ћ" CYRILLIC SMALL LETTER TSHE
-        /* 40 */ "\u045B",
-        // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
-        /* 41 */ "\u0455",
-        // U+0452: "ђ" CYRILLIC SMALL LETTER DJE
-        /* 42 */ "\u0452",
-        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
-        /* 43 */ "\u0450",
-        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
-        /* 44 */ "\u045D",
-        /* 45~ */
-        null, null, null, null, null, null,
-        /* ~50 */
-        // 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
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language sv: Swedish */
-    private static final String[] LANGUAGE_sv = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
-        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        /* 2 */ "\u00ED,\u00EC,\u00EE,\u00EF",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B",
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u015B,\u0161,\u015F,\u00DF",
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        /* 6 */ "\u0144,\u00F1,\u0148",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF,\u00FC",
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u00F0,\u010F",
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0159",
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 11 */ "\u0165,\u00FE",
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017A,\u017E,\u017C",
-        /* 13 */ null,
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        null, null, null, null, null,
-        /* ~19 */
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        /* 23 */ "\u00F8,\u0153",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 24 */ "\u00E6",
-        /* 25~ */
-        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,
-        /* ~53 */
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language sw: Swahili */
-    private static final String[] LANGUAGE_sw = {
-        // This is the same as English except more_keys_for_g.
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
-        /* 8~ */
-        null, null, null, null, null, null, null,
-        /* ~14 */
-        /* 15 */ "g\'",
-    };
-
-    /* Language th: Thai */
-    private static final String[] LANGUAGE_th = {
-        /* 0~ */
-        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,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0E01: "ก" THAI CHARACTER KO KAI
-        // U+0E02: "ข" THAI CHARACTER KHO KHAI
-        // U+0E04: "ค" THAI CHARACTER KHO KHWAI
-        /* 51 */ "\u0E01\u0E02\u0E04",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
-        /* 57 */ "\u0E3F",
-    };
-
-    /* Language tl: Tagalog */
-    private static final String[] LANGUAGE_tl = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-    };
-
-    /* Language tr: Turkish */
-    private static final String[] LANGUAGE_tr = {
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        /* 0 */ "\u00E2",
-        /* 1 */ null,
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
-        /* 6 */ 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
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        null, null, null, null, null, null, null,
-        /* ~14 */
-        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u011F",
-    };
-
-    /* Language uk: Ukrainian */
-    private static final String[] LANGUAGE_uk = {
-        /* 0~ */
-        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,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+0457: "ї" CYRILLIC SMALL LETTER YI
-        /* 26 */ "\u0457",
-        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 27 */ "\u0456",
-        // U+0454: "є" CYRILLIC SMALL LETTER UKRAINIAN IE
-        /* 28 */ "\u0454",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        /* 30~ */
-        null, null, null,
-        /* ~32 */
-        // U+0491: "ґ" CYRILLIC SMALL LETTER GHE WITH UPTURN
-        /* 33 */ "\u0491",
-        // U+0457: "ї" CYRILLIC SMALL LETTER YI
-        /* 34 */ "\u0457",
-        /* 35 */ null,
-        /* 36 */ null,
-        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54~ */
-        null, null, null,
-        /* ~56 */
-        // U+20B4: "₴" HRYVNIA SIGN
-        /* 57 */ "\u20B4",
-    };
-
-    /* Language vi: Vietnamese */
-    private static final String[] LANGUAGE_vi = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+1EA3: "ả" LATIN SMALL LETTER A WITH HOOK ABOVE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+1EA1: "ạ" LATIN SMALL LETTER A WITH DOT BELOW
-        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
-        // U+1EB1: "ằ" LATIN SMALL LETTER A WITH BREVE AND GRAVE
-        // U+1EAF: "ắ" LATIN SMALL LETTER A WITH BREVE AND ACUTE
-        // U+1EB3: "ẳ" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
-        // U+1EB5: "ẵ" LATIN SMALL LETTER A WITH BREVE AND TILDE
-        // U+1EB7: "ặ" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+1EA7: "ầ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
-        // U+1EA5: "ấ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
-        // U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
-        // U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
-        // U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
-        /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
-        // 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
-        // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE
-        // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
-        // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
-        // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
-        // U+1EC5: "ễ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
-        // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
-        /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE
-        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
-        // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
-        /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+1ECD: "ọ" LATIN SMALL LETTER O WITH DOT BELOW
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+1ED3: "ồ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
-        // U+1ED1: "ố" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
-        // U+1ED5: "ổ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
-        // U+1ED7: "ỗ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
-        // U+1ED9: "ộ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
-        // U+01A1: "ơ" LATIN SMALL LETTER O WITH HORN
-        // U+1EDD: "ờ" LATIN SMALL LETTER O WITH HORN AND GRAVE
-        // U+1EDB: "ớ" LATIN SMALL LETTER O WITH HORN AND ACUTE
-        // U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
-        // U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE
-        // U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
-        /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE
-        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
-        // U+1EE5: "ụ" LATIN SMALL LETTER U WITH DOT BELOW
-        // U+01B0: "ư" LATIN SMALL LETTER U WITH HORN
-        // U+1EEB: "ừ" LATIN SMALL LETTER U WITH HORN AND GRAVE
-        // U+1EE9: "ứ" LATIN SMALL LETTER U WITH HORN AND ACUTE
-        // U+1EED: "ử" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
-        // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE
-        // U+1EF1: "ự" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
-        /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
-        /* 5~ */
-        null, null, null,
-        /* ~7 */
-        // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+1EF7: "ỷ" LATIN SMALL LETTER Y WITH HOOK ABOVE
-        // U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE
-        // U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW
-        /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
-        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10~ */
-        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,
-        /* ~56 */
-        // U+20AB: "₫" DONG SIGN
-        /* 57 */ "\u20AB",
-    };
-
-    /* Language zu: Zulu */
-    private static final String[] LANGUAGE_zu = {
-        // This is the same as English
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
-    };
-
-    /* Language zz: Alphabet */
-    private static final String[] LANGUAGE_zz = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
-        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-        // U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE
-        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
-        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-        // U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE
-        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+0153: "œ" LATIN SMALL LIGATURE OE
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
-        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-        // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
-        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-        // U+017F: "ſ" LATIN SMALL LETTER LONG S
-        /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
-        // U+014B: "ŋ" LATIN SMALL LETTER ENG
-        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u00FD,\u0177,\u00FF,\u0133",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u010F,\u0111,\u00F0",
-        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0155,\u0157,\u0159",
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
-        /* 11 */ "\u00FE,\u0163,\u0165,\u0167",
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017A,\u017C,\u017E",
-        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-        // U+0138: "ĸ" LATIN SMALL LETTER KRA
-        /* 13 */ "\u0137,\u0138",
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
-        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
-        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
-        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-        // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
-        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-        /* 15 */ "\u011D,\u011F,\u0121,\u0123",
-        /* 16 */ null,
-        // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
-        /* 17 */ "\u0125",
-        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 18 */ "\u0135",
-        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 19 */ "\u0175",
-    };
-
-    // TODO: Use the language + "_" + region representation for the locale string key.
-    // Currently we are dropping the region from the key.
-    private static final Object[] LANGUAGES_AND_TEXTS = {
-        "DEFAULT", LANGUAGE_DEFAULT, /* default */
-        "af", LANGUAGE_af, /* Afrikaans */
-        "ar", LANGUAGE_ar, /* Arabic */
-        "az" /* "az_AZ" */, LANGUAGE_az_AZ, /* Azerbaijani (Azerbaijan) */
-        "be" /* "be_BY" */, LANGUAGE_be_BY, /* Belarusian (Belarus) */
-        "bg", LANGUAGE_bg, /* Bulgarian */
-        "ca", LANGUAGE_ca, /* Catalan */
-        "cs", LANGUAGE_cs, /* Czech */
-        "da", LANGUAGE_da, /* Danish */
-        "de", LANGUAGE_de, /* German */
-        "el", LANGUAGE_el, /* Greek */
-        "en", LANGUAGE_en, /* English */
-        "eo", LANGUAGE_eo, /* Esperanto */
-        "es", LANGUAGE_es, /* Spanish */
-        "et" /* "et_EE" */, LANGUAGE_et_EE, /* Estonian (Estonia) */
-        "fa", LANGUAGE_fa, /* Persian */
-        "fi", LANGUAGE_fi, /* Finnish */
-        "fr", LANGUAGE_fr, /* French */
-        "hi", LANGUAGE_hi, /* Hindi */
-        "hr", LANGUAGE_hr, /* Croatian */
-        "hu", LANGUAGE_hu, /* Hungarian */
-        "hy" /* "hy_AM" */, LANGUAGE_hy_AM, /* Armenian (Armenia) */
-        "is", LANGUAGE_is, /* Icelandic */
-        "it", LANGUAGE_it, /* Italian */
-        "iw", LANGUAGE_iw, /* Hebrew */
-        "ka" /* "ka_GE" */, LANGUAGE_ka_GE, /* Georgian (Georgia) */
-        "kk", LANGUAGE_kk, /* Kazakh */
-        "km" /* "km_KH" */, LANGUAGE_km_KH, /* Khmer (Cambodia) */
-        "ky", LANGUAGE_ky, /* Kirghiz */
-        "lo" /* "lo_LA" */, LANGUAGE_lo_LA, /* Lao (Laos) */
-        "lt", LANGUAGE_lt, /* Lithuanian */
-        "lv", LANGUAGE_lv, /* Latvian */
-        "mk", LANGUAGE_mk, /* Macedonian */
-        "mn" /* "mn_MN" */, LANGUAGE_mn_MN, /* Mongolian (Mongolia) */
-        "nb", LANGUAGE_nb, /* Norwegian Bokmål */
-        "ne" /* "ne_NP" */, LANGUAGE_ne_NP, /* Nepali (Nepal) */
-        "nl", LANGUAGE_nl, /* Dutch */
-        "pl", LANGUAGE_pl, /* Polish */
-        "pt", LANGUAGE_pt, /* Portuguese */
-        "rm", LANGUAGE_rm, /* Raeto-Romance */
-        "ro", LANGUAGE_ro, /* Romanian */
-        "ru", LANGUAGE_ru, /* Russian */
-        "sk", LANGUAGE_sk, /* Slovak */
-        "sl", LANGUAGE_sl, /* Slovenian */
-        "sr", LANGUAGE_sr, /* Serbian */
-        "sv", LANGUAGE_sv, /* Swedish */
-        "sw", LANGUAGE_sw, /* Swahili */
-        "th", LANGUAGE_th, /* Thai */
-        "tl", LANGUAGE_tl, /* Tagalog */
-        "tr", LANGUAGE_tr, /* Turkish */
-        "uk", LANGUAGE_uk, /* Ukrainian */
-        "vi", LANGUAGE_vi, /* Vietnamese */
-        "zu", LANGUAGE_zu, /* Zulu */
-        "zz", LANGUAGE_zz, /* Alphabet */
-    };
-
-    static {
-        int id = 0;
-        for (final String name : NAMES) {
-            sNameToIdsMap.put(name, id++);
-        }
-
-        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
-            final String language = (String)LANGUAGES_AND_TEXTS[i];
-            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
-            sLanguageToTextsMap.put(language, texts);
-        }
-    }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
new file mode 100644
index 0000000..14991f5
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -0,0 +1,3546 @@
+/*
+ * 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.internal;
+
+import com.android.inputmethod.latin.utils.CollectionUtils;
+
+import java.util.HashMap;
+
+/**
+ * !!!!! DO NOT EDIT THIS FILE !!!!!
+ *
+ * This file is generated by tools/make-keyboard-text. The base template file is
+ *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
+ *
+ * This file must be updated when any text resources in keyboard layout files have been changed.
+ * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
+ * and should be defined in
+ *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
+ *
+ * To update this file, please run the following commands.
+ *   $ cd $ANDROID_BUILD_TOP
+ *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
+ *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
+ *
+ * The updated source file will be generated to the following path (this file).
+ *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
+ *   KeyboardTextsTable.java
+ */
+public final class KeyboardTextsTable {
+    // Name to index map.
+    private static final HashMap<String, Integer> sNameToIndexesMap = CollectionUtils.newHashMap();
+    // Language to texts map.
+    private static final HashMap<String, String[]> sLanguageToTextsMap =
+            CollectionUtils.newHashMap();
+
+    public static String getText(final String name, final String[] textsTable) {
+        final Integer indexObj = sNameToIndexesMap.get(name);
+        if (indexObj == null) {
+            throw new RuntimeException("Unknown text name: " + name);
+        }
+        final int index = indexObj;
+        final String text = (index < textsTable.length) ? textsTable[index] : null;
+        return (text != null) ? text : LANGUAGE_DEFAULT[index];
+    }
+
+    public static String[] getTextsTable(final String language) {
+        final String[] textsTable = sLanguageToTextsMap.get(language);
+        return textsTable != null ? textsTable : LANGUAGE_DEFAULT;
+    }
+
+    private static final String[] NAMES = {
+        /*  0 */ "more_keys_for_a",
+        /*  1 */ "more_keys_for_e",
+        /*  2 */ "more_keys_for_i",
+        /*  3 */ "more_keys_for_o",
+        /*  4 */ "more_keys_for_u",
+        /*  5 */ "more_keys_for_s",
+        /*  6 */ "more_keys_for_n",
+        /*  7 */ "more_keys_for_c",
+        /*  8 */ "more_keys_for_y",
+        /*  9 */ "more_keys_for_d",
+        /* 10 */ "more_keys_for_r",
+        /* 11 */ "more_keys_for_t",
+        /* 12 */ "more_keys_for_z",
+        /* 13 */ "more_keys_for_k",
+        /* 14 */ "more_keys_for_l",
+        /* 15 */ "more_keys_for_g",
+        /* 16 */ "more_keys_for_v",
+        /* 17 */ "more_keys_for_h",
+        /* 18 */ "more_keys_for_j",
+        /* 19 */ "more_keys_for_w",
+        /* 20 */ "keylabel_for_nordic_row1_11",
+        /* 21 */ "keylabel_for_nordic_row2_10",
+        /* 22 */ "keylabel_for_nordic_row2_11",
+        /* 23 */ "more_keys_for_nordic_row2_10",
+        /* 24 */ "more_keys_for_nordic_row2_11",
+        /* 25 */ "keylabel_for_east_slavic_row1_9",
+        /* 26 */ "keylabel_for_east_slavic_row1_12",
+        /* 27 */ "keylabel_for_east_slavic_row2_1",
+        /* 28 */ "keylabel_for_east_slavic_row2_11",
+        /* 29 */ "keylabel_for_east_slavic_row3_5",
+        /* 30 */ "more_keys_for_cyrillic_u",
+        /* 31 */ "more_keys_for_cyrillic_ka",
+        /* 32 */ "more_keys_for_cyrillic_en",
+        /* 33 */ "more_keys_for_cyrillic_ghe",
+        /* 34 */ "more_keys_for_east_slavic_row2_1",
+        /* 35 */ "more_keys_for_cyrillic_a",
+        /* 36 */ "more_keys_for_cyrillic_o",
+        /* 37 */ "more_keys_for_cyrillic_soft_sign",
+        /* 38 */ "more_keys_for_east_slavic_row2_11",
+        /* 39 */ "keylabel_for_south_slavic_row1_6",
+        /* 40 */ "keylabel_for_south_slavic_row2_11",
+        /* 41 */ "keylabel_for_south_slavic_row3_1",
+        /* 42 */ "keylabel_for_south_slavic_row3_8",
+        /* 43 */ "more_keys_for_cyrillic_ie",
+        /* 44 */ "more_keys_for_cyrillic_i",
+        /* 45 */ "keylabel_for_swiss_row1_11",
+        /* 46 */ "keylabel_for_swiss_row2_10",
+        /* 47 */ "keylabel_for_swiss_row2_11",
+        /* 48 */ "more_keys_for_swiss_row1_11",
+        /* 49 */ "more_keys_for_swiss_row2_10",
+        /* 50 */ "more_keys_for_swiss_row2_11",
+        /* 51 */ "label_to_alpha_key",
+        /* 52 */ "single_quotes",
+        /* 53 */ "double_quotes",
+        /* 54 */ "single_angle_quotes",
+        /* 55 */ "double_angle_quotes",
+        /* 56 */ "more_keys_for_currency_dollar",
+        /* 57 */ "keylabel_for_currency",
+        /* 58 */ "more_keys_for_currency",
+        /* 59 */ "more_keys_for_punctuation",
+        /* 60 */ "more_keys_for_tablet_punctuation",
+        /* 61 */ "more_keys_for_star",
+        /* 62 */ "more_keys_for_bullet",
+        /* 63 */ "more_keys_for_plus",
+        /* 64 */ "more_keys_for_left_parenthesis",
+        /* 65 */ "more_keys_for_right_parenthesis",
+        /* 66 */ "more_keys_for_less_than",
+        /* 67 */ "more_keys_for_greater_than",
+        /* 68 */ "more_keys_for_arabic_diacritics",
+        /* 69 */ "keylabel_for_symbols_1",
+        /* 70 */ "keylabel_for_symbols_2",
+        /* 71 */ "keylabel_for_symbols_3",
+        /* 72 */ "keylabel_for_symbols_4",
+        /* 73 */ "keylabel_for_symbols_5",
+        /* 74 */ "keylabel_for_symbols_6",
+        /* 75 */ "keylabel_for_symbols_7",
+        /* 76 */ "keylabel_for_symbols_8",
+        /* 77 */ "keylabel_for_symbols_9",
+        /* 78 */ "keylabel_for_symbols_0",
+        /* 79 */ "label_to_symbol_key",
+        /* 80 */ "label_to_symbol_with_microphone_key",
+        /* 81 */ "additional_more_keys_for_symbols_1",
+        /* 82 */ "additional_more_keys_for_symbols_2",
+        /* 83 */ "additional_more_keys_for_symbols_3",
+        /* 84 */ "additional_more_keys_for_symbols_4",
+        /* 85 */ "additional_more_keys_for_symbols_5",
+        /* 86 */ "additional_more_keys_for_symbols_6",
+        /* 87 */ "additional_more_keys_for_symbols_7",
+        /* 88 */ "additional_more_keys_for_symbols_8",
+        /* 89 */ "additional_more_keys_for_symbols_9",
+        /* 90 */ "additional_more_keys_for_symbols_0",
+        /* 91 */ "more_keys_for_symbols_1",
+        /* 92 */ "more_keys_for_symbols_2",
+        /* 93 */ "more_keys_for_symbols_3",
+        /* 94 */ "more_keys_for_symbols_4",
+        /* 95 */ "more_keys_for_symbols_5",
+        /* 96 */ "more_keys_for_symbols_6",
+        /* 97 */ "more_keys_for_symbols_7",
+        /* 98 */ "more_keys_for_symbols_8",
+        /* 99 */ "more_keys_for_symbols_9",
+        /* 100 */ "more_keys_for_symbols_0",
+        /* 101 */ "keylabel_for_comma",
+        /* 102 */ "more_keys_for_comma",
+        /* 103 */ "keylabel_for_tablet_comma",
+        /* 104 */ "keyhintlabel_for_tablet_comma",
+        /* 105 */ "more_keys_for_tablet_comma",
+        /* 106 */ "keylabel_for_period",
+        /* 107 */ "keyhintlabel_for_period",
+        /* 108 */ "more_keys_for_period",
+        /* 109 */ "keylabel_for_tablet_period",
+        /* 110 */ "keyhintlabel_for_tablet_period",
+        /* 111 */ "more_keys_for_tablet_period",
+        /* 112 */ "keylabel_for_symbols_question",
+        /* 113 */ "keylabel_for_symbols_semicolon",
+        /* 114 */ "keylabel_for_symbols_percent",
+        /* 115 */ "more_keys_for_exclamation",
+        /* 116 */ "more_keys_for_question",
+        /* 117 */ "more_keys_for_symbols_semicolon",
+        /* 118 */ "more_keys_for_symbols_percent",
+        /* 119 */ "more_keys_for_q",
+        /* 120 */ "more_keys_for_x",
+        /* 121 */ "keylabel_for_q",
+        /* 122 */ "keylabel_for_w",
+        /* 123 */ "keylabel_for_y",
+        /* 124 */ "keylabel_for_x",
+        /* 125 */ "keylabel_for_spanish_row2_10",
+        /* 126 */ "more_keys_for_am_pm",
+        /* 127 */ "settings_as_more_key",
+        /* 128 */ "shortcut_as_more_key",
+        /* 129 */ "action_next_as_more_key",
+        /* 130 */ "action_previous_as_more_key",
+        /* 131 */ "label_to_more_symbol_key",
+        /* 132 */ "label_to_more_symbol_for_tablet_key",
+        /* 133 */ "label_tab_key",
+        /* 134 */ "label_to_phone_numeric_key",
+        /* 135 */ "label_to_phone_symbols_key",
+        /* 136 */ "label_time_am",
+        /* 137 */ "label_time_pm",
+        /* 138 */ "keylabel_for_popular_domain",
+        /* 139 */ "more_keys_for_popular_domain",
+        /* 140 */ "single_laqm_raqm",
+        /* 141 */ "single_laqm_raqm_rtl",
+        /* 142 */ "single_raqm_laqm",
+        /* 143 */ "double_laqm_raqm",
+        /* 144 */ "double_laqm_raqm_rtl",
+        /* 145 */ "double_raqm_laqm",
+        /* 146 */ "single_lqm_rqm",
+        /* 147 */ "single_9qm_lqm",
+        /* 148 */ "single_9qm_rqm",
+        /* 149 */ "double_lqm_rqm",
+        /* 150 */ "double_9qm_lqm",
+        /* 151 */ "double_9qm_rqm",
+        /* 152 */ "more_keys_for_single_quote",
+        /* 153 */ "more_keys_for_double_quote",
+        /* 154 */ "more_keys_for_tablet_double_quote",
+        /* 155 */ "emoji_key_as_more_key",
+    };
+
+    private static final String EMPTY = "";
+
+    /* Default texts */
+    private static final String[] LANGUAGE_DEFAULT = {
+        /* 0~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        /* 51 */ "ABC",
+        /* 52 */ "!text/single_lqm_rqm",
+        /* 53 */ "!text/double_lqm_rqm",
+        /* 54 */ "!text/single_laqm_raqm",
+        /* 55 */ "!text/double_laqm_raqm",
+        // U+00A2: "¢" CENT SIGN
+        // U+00A3: "£" POUND SIGN
+        // U+20AC: "€" EURO SIGN
+        // U+00A5: "¥" YEN SIGN
+        // U+20B1: "₱" PESO SIGN
+        /* 56 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+        /* 57 */ "$",
+        /* 58 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
+        /* 59 */ "!fixedColumnOrder!8,;,/,(,),#,!,\\,,?,&,\\%,+,\",-,:,',@",
+        /* 60 */ "!fixedColumnOrder!7,;,/,(,),#,',\\,,&,\\%,+,\",-,:,@",
+        // U+2020: "†" DAGGER
+        // U+2021: "‡" DOUBLE DAGGER
+        // U+2605: "★" BLACK STAR
+        /* 61 */ "\u2020,\u2021,\u2605",
+        // U+266A: "♪" EIGHTH NOTE
+        // U+2665: "♥" BLACK HEART SUIT
+        // U+2660: "♠" BLACK SPADE SUIT
+        // U+2666: "♦" BLACK DIAMOND SUIT
+        // U+2663: "♣" BLACK CLUB SUIT
+        /* 62 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
+        // U+00B1: "±" PLUS-MINUS SIGN
+        /* 63 */ "\u00B1",
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        /* 64 */ "!fixedColumnOrder!3,<,{,[",
+        /* 65 */ "!fixedColumnOrder!3,>,},]",
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        /* 66 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
+        /* 67 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
+        /* 68 */ EMPTY,
+        /* 69 */ "1",
+        /* 70 */ "2",
+        /* 71 */ "3",
+        /* 72 */ "4",
+        /* 73 */ "5",
+        /* 74 */ "6",
+        /* 75 */ "7",
+        /* 76 */ "8",
+        /* 77 */ "9",
+        /* 78 */ "0",
+        // Label for "switch to symbols" key.
+        /* 79 */ "?123",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "123",
+        /* 81~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~90 */
+        // U+00B9: "¹" SUPERSCRIPT ONE
+        // U+00BD: "½" VULGAR FRACTION ONE HALF
+        // U+2153: "⅓" VULGAR FRACTION ONE THIRD
+        // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
+        // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
+        /* 91 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
+        // U+00B2: "²" SUPERSCRIPT TWO
+        // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
+        /* 92 */ "\u00B2,\u2154",
+        // U+00B3: "³" SUPERSCRIPT THREE
+        // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
+        // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
+        /* 93 */ "\u00B3,\u00BE,\u215C",
+        // U+2074: "⁴" SUPERSCRIPT FOUR
+        /* 94 */ "\u2074",
+        // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
+        /* 95 */ "\u215D",
+        /* 96 */ EMPTY,
+        // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
+        /* 97 */ "\u215E",
+        /* 98 */ EMPTY,
+        /* 99 */ EMPTY,
+        // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
+        // U+2205: "∅" EMPTY SET
+        /* 100 */ "\u207F,\u2205",
+        // Comma key
+        /* 101 */ ",",
+        /* 102 */ EMPTY,
+        /* 103 */ ",",
+        /* 104 */ EMPTY,
+        /* 105 */ EMPTY,
+        // Period key
+        /* 106 */ ".",
+        /* 107 */ EMPTY,
+        /* 108 */ "!text/more_keys_for_punctuation",
+        /* 109 */ ".",
+        /* 110 */ EMPTY,
+        /* 111 */ "!text/more_keys_for_tablet_punctuation",
+        /* 112 */ "?",
+        /* 113 */ ";",
+        /* 114 */ "%",
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        /* 115 */ "\u00A1",
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 116 */ "\u00BF",
+        /* 117 */ EMPTY,
+        // U+2030: "‰" PER MILLE SIGN
+        /* 118 */ "\u2030",
+        /* 119 */ EMPTY,
+        /* 120 */ EMPTY,
+        /* 121 */ "q",
+        /* 122 */ "w",
+        /* 123 */ "y",
+        /* 124 */ "x",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 125 */ "\u00F1",
+        /* 126 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
+        /* 127 */ "!icon/settings_key|!code/key_settings",
+        /* 128 */ "!icon/shortcut_key|!code/key_shortcut",
+        /* 129 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
+        /* 130 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
+        // Label for "switch to more symbol" modifier key ("= \ <"). Must be short to fit on key!
+        /* 131 */ "= \\\\ <",
+        // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
+        /* 132 */ "~ [ <",
+        // Label for "Tab" key.  Must be short to fit on key!
+        /* 133 */ "Tab",
+        // Label for "switch to phone numeric" key.  Must be short to fit on key!
+        /* 134 */ "123",
+        // Label for "switch to phone symbols" key.  Must be short to fit on key!
+        // U+FF0A: "*" FULLWIDTH ASTERISK
+        // U+FF03: "#" FULLWIDTH NUMBER SIGN
+        /* 135 */ "\uFF0A\uFF03",
+        // Key label for "ante meridiem"
+        /* 136 */ "AM",
+        // Key label for "post meridiem"
+        /* 137 */ "PM",
+        /* 138 */ ".com",
+        // popular web domains for the locale - most popular, displayed on the keyboard
+        /* 139 */ "!hasLabels!,.net,.org,.gov,.edu",
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // The following characters don't need BIDI mirroring.
+        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+        // Abbreviations are:
+        // laqm: LEFT-POINTING ANGLE QUOTATION MARK
+        // raqm: RIGHT-POINTING ANGLE QUOTATION MARK
+        // rtl: Right-To-Left script order
+        // lqm: LEFT QUOTATION MARK
+        // rqm: RIGHT QUOTATION MARK
+        // 9qm: LOW-9 QUOTATION MARK
+        // The following each quotation mark pair consist of
+        // <opening quotation mark>, <closing quotation mark>
+        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
+        /* 140 */ "\u2039,\u203A",
+        /* 141 */ "\u2039|\u203A,\u203A|\u2039",
+        /* 142 */ "\u203A,\u2039",
+        /* 143 */ "\u00AB,\u00BB",
+        /* 144 */ "\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 145 */ "\u00BB,\u00AB",
+        // The following each quotation mark triplet consists of
+        // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
+        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
+        /* 146 */ "\u201A,\u2018,\u2019",
+        /* 147 */ "\u2019,\u201A,\u2018",
+        /* 148 */ "\u2018,\u201A,\u2019",
+        /* 149 */ "\u201E,\u201C,\u201D",
+        /* 150 */ "\u201D,\u201E,\u201C",
+        /* 151 */ "\u201C,\u201E,\u201D",
+        /* 152 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
+        /* 153 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
+        /* 154 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
+        /* 155 */ "!icon/emoji_key|!code/key_emoji",
+    };
+
+    /* Language af: Afrikaans */
+    private static final String[] LANGUAGE_af = {
+        // This is the same as Dutch except more keys of y and demoting vowels with diaeresis.
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
+        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 2 */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        /* 7 */ null,
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 8 */ "\u00FD,\u0133",
+    };
+
+    /* Language ar: Arabic */
+    private static final String[] LANGUAGE_ar = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0623: "ا" ARABIC LETTER ALEF
+        // U+200C: ZERO WIDTH NON-JOINER
+        // U+0628: "ب" ARABIC LETTER BEH
+        // U+062C: "پ" ARABIC LETTER PEH
+        /* 51 */ "\u0623\u200C\u0628\u200C\u062C",
+        /* 52 */ null,
+        /* 53 */ null,
+        /* 54 */ "!text/single_laqm_raqm_rtl",
+        /* 55 */ "!text/double_laqm_raqm_rtl",
+        /* 56~ */
+        null, null, null,
+        /* ~58 */
+        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
+        /* 60 */ null,
+        // U+2605: "★" BLACK STAR
+        // U+066D: "٭" ARABIC FIVE POINTED STAR
+        /* 61 */ "\u2605,\u066D",
+        // U+266A: "♪" EIGHTH NOTE
+        /* 62 */ "\u266A",
+        /* 63 */ null,
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
+        // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
+        /* 64 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 65 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        // U+0655: "ٕ" ARABIC HAMZA BELOW
+        // U+0654: "ٔ" ARABIC HAMZA ABOVE
+        // U+0652: "ْ" ARABIC SUKUN
+        // U+064D: "ٍ" ARABIC KASRATAN
+        // U+064C: "ٌ" ARABIC DAMMATAN
+        // U+064B: "ً" ARABIC FATHATAN
+        // U+0651: "ّ" ARABIC SHADDA
+        // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF
+        // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF
+        // U+0653: "ٓ" ARABIC MADDAH ABOVE
+        // U+0650: "ِ" ARABIC KASRA
+        // U+064F: "ُ" ARABIC DAMMA
+        // U+064E: "َ" ARABIC FATHA
+        // U+0640: "ـ" ARABIC TATWEEL
+        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
+        // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
+        /* 68 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
+        // U+0661: "١" ARABIC-INDIC DIGIT ONE
+        /* 69 */ "\u0661",
+        // U+0662: "٢" ARABIC-INDIC DIGIT TWO
+        /* 70 */ "\u0662",
+        // U+0663: "٣" ARABIC-INDIC DIGIT THREE
+        /* 71 */ "\u0663",
+        // U+0664: "٤" ARABIC-INDIC DIGIT FOUR
+        /* 72 */ "\u0664",
+        // U+0665: "٥" ARABIC-INDIC DIGIT FIVE
+        /* 73 */ "\u0665",
+        // U+0666: "٦" ARABIC-INDIC DIGIT SIX
+        /* 74 */ "\u0666",
+        // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN
+        /* 75 */ "\u0667",
+        // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT
+        /* 76 */ "\u0668",
+        // U+0669: "٩" ARABIC-INDIC DIGIT NINE
+        /* 77 */ "\u0669",
+        // U+0660: "٠" ARABIC-INDIC DIGIT ZERO
+        /* 78 */ "\u0660",
+        // Label for "switch to symbols" key.
+        // U+061F: "؟" ARABIC QUESTION MARK
+        /* 79 */ "\u0663\u0662\u0661\u061F",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "\u0663\u0662\u0661",
+        /* 81 */ "1",
+        /* 82 */ "2",
+        /* 83 */ "3",
+        /* 84 */ "4",
+        /* 85 */ "5",
+        /* 86 */ "6",
+        /* 87 */ "7",
+        /* 88 */ "8",
+        /* 89 */ "9",
+        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
+        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
+        /* 90 */ "0,\u066B,\u066C",
+        /* 91~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~100 */
+        // U+060C: "،" ARABIC COMMA
+        /* 101 */ "\u060C",
+        /* 102 */ "\\,",
+        // U+061F: "؟" ARABIC QUESTION MARK
+        // U+060C: "،" ARABIC COMMA
+        // U+061B: "؛" ARABIC SEMICOLON
+        /* 103 */ "\u060C",
+        /* 104 */ "\u061F",
+        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\",\'",
+        /* 106 */ null,
+        // U+0651: "ّ" ARABIC SHADDA
+        /* 107 */ "\u0651",
+        /* 108 */ "!text/more_keys_for_arabic_diacritics",
+        /* 109 */ null,
+        /* 110 */ "\u0651",
+        /* 111 */ "!text/more_keys_for_arabic_diacritics",
+        /* 112 */ "\u061F",
+        /* 113 */ "\u061B",
+        // U+066A: "٪" ARABIC PERCENT SIGN
+        /* 114 */ "\u066A",
+        /* 115 */ null,
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 116 */ "?,\u00BF",
+        /* 117 */ ";",
+        // U+2030: "‰" PER MILLE SIGN
+        /* 118 */ "\\%,\u2030",
+    };
+
+    /* Language az_AZ: Azerbaijani (Azerbaijan) */
+    private static final String[] LANGUAGE_az_AZ = {
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        /* 0 */ "\u00E2",
+        // U+0259: "ə" LATIN SMALL LETTER SCHWA
+        /* 1 */ "\u0259",
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
+        /* 6 */ 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
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        null, null, null, null, null, null, null,
+        /* ~14 */
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u011F",
+    };
+
+    /* Language be_BY: Belarusian (Belarus) */
+    private static final String[] LANGUAGE_be_BY = {
+        /* 0~ */
+        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,
+        /* ~24 */
+        // U+045E: "ў" CYRILLIC SMALL LETTER SHORT U
+        /* 25 */ "\u045E",
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* 26 */ "\u0451",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* 29 */ "\u0456",
+        /* 30~ */
+        null, null, null, null, null, null, null,
+        /* ~36 */
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44~ */
+        null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language bg: Bulgarian */
+    private static final String[] LANGUAGE_bg = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ null,
+        // single_quotes of Bulgarian is default single_quotes_right_left.
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language ca: Catalan */
+    private static final String[] LANGUAGE_ca = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        null, null, null, null, null, null,
+        /* ~13 */
+        // U+00B7: "·" MIDDLE DOT
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "l\u00B7l,\u0142",
+        /* 15~ */
+        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,
+        /* ~58 */
+        // U+00B7: "·" MIDDLE DOT
+        /* 59 */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@",
+        /* 60 */ "!fixedColumnOrder!8,;,/,(,),#,\u00B7,',\\,,&,\\%,+,\",-,:,@",
+        /* 61~ */
+        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,
+        /* ~124 */
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 125 */ "\u00E7",
+    };
+
+    /* Language cs: Czech */
+    private static final String[] LANGUAGE_cs = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        /* 5 */ "\u0161,\u00DF,\u015B",
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0148,\u00F1,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        /* 10 */ "\u0159",
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        /* 11 */ "\u0165",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        /* 12 */ "\u017E,\u017A,\u017C",
+        /* 13~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language da: Danish */
+    private static final String[] LANGUAGE_da = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        /* 1 */ "\u00E9,\u00EB",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        /* 2 */ "\u00ED,\u00EF",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u00DF,\u015B,\u0161",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        /* 7 */ null,
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        /* 9 */ "\u00F0",
+        /* 10~ */
+        null, null, null, null,
+        /* ~13 */
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u0142",
+        /* 15~ */
+        null, null, null, null, null,
+        /* ~19 */
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        /* 20 */ "\u00E5",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 21 */ "\u00E6",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 22 */ "\u00F8",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 23 */ "\u00E4",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 24 */ "\u00F6",
+        /* 25~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language de: German */
+    private static final String[] LANGUAGE_de = {
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
+        // 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
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
+        /* 2 */ null,
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u00DF,\u015B,\u0161",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        /* 7~ */
+        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,
+        /* ~44 */
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 45 */ "\u00FC",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 46 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 47 */ "\u00E4",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        /* 48 */ "\u00E8",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        /* 49 */ "\u00E9",
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        /* 50 */ "\u00E0",
+        /* 51 */ null,
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language el: Greek */
+    private static final String[] LANGUAGE_el = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
+        // U+0392: "Β" GREEK CAPITAL LETTER BETA
+        // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA
+        /* 51 */ "\u0391\u0392\u0393",
+    };
+
+    /* Language en: English */
+    private static final String[] LANGUAGE_en = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 6 */ "\u00F1",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 7 */ "\u00E7",
+    };
+
+    /* Language eo: Esperanto */
+    private static final String[] LANGUAGE_eo = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 2 */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00B5: "µ" MICRO SIGN
+        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u00DF,\u0161,\u015B,\u0219,\u015F",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+        // U+014B: "ŋ" LATIN SMALL LETTER ENG
+        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
+        /* 7 */ "\u0107,\u010D,\u00E7,\u010B",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* 8 */ "y,\u00FD,\u0177,\u00FF,\u00FE",
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+        /* 9 */ "\u00F0,\u010F,\u0111",
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        /* 10 */ "\u0159,\u0155,\u0157",
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
+        /* 11 */ "\u0165,\u021B,\u0163,\u0167",
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* 12 */ "\u017A,\u017C,\u017E",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        // U+0138: "ĸ" LATIN SMALL LETTER KRA
+        /* 13 */ "\u0137,\u0138",
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
+        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
+        /* 15 */ "\u011F,\u0121,\u0123",
+        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+        /* 16 */ "w,\u0175",
+        // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
+        // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE
+        /* 17 */ "\u0125,\u0127",
+        /* 18 */ null,
+        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+        /* 19 */ "w,\u0175",
+        /* 20~ */
+        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, 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,
+        /* ~118 */
+        /* 119 */ "q",
+        /* 120 */ "x",
+        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
+        /* 121 */ "\u015D",
+        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
+        /* 122 */ "\u011D",
+        // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
+        /* 123 */ "\u016D",
+        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
+        /* 124 */ "\u0109",
+        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
+        /* 125 */ "\u0135",
+    };
+
+    /* Language es: Spanish */
+    private static final String[] LANGUAGE_es = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        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,
+        /* ~58 */
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 59 */ "!fixedColumnOrder!9,\u00A1,;,/,(,),#,!,\\,,?,\u00BF,&,\\%,+,\",-,:,',@",
+    };
+
+    /* Language et_EE: Estonian (Estonia) */
+    private static final String[] LANGUAGE_et_EE = {
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
+        // 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
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        /* 10 */ "\u0157,\u0159,\u0155",
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        /* 11 */ "\u0163,\u0165",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        /* 12 */ "\u017E,\u017C,\u017A",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        /* 13 */ "\u0137",
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        null, null, null, null,
+        /* ~19 */
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 20 */ "\u00FC",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 21 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 22 */ "\u00E4",
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        /* 23 */ "\u00F5",
+        /* 24~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language fa: Persian */
+    private static final String[] LANGUAGE_fa = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // 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
+        /* 51 */ "\u0627\u200C\u0628\u200C\u067E",
+        /* 52 */ null,
+        /* 53 */ null,
+        /* 54 */ "!text/single_laqm_raqm_rtl",
+        /* 55 */ "!text/double_laqm_raqm_rtl",
+        /* 56 */ null,
+        // U+FDFC: "﷼" RIAL SIGN
+        /* 57 */ "\uFDFC",
+        /* 58 */ null,
+        // U+061F: "؟" ARABIC QUESTION MARK
+        // U+060C: "،" ARABIC COMMA
+        // U+061B: "؛" ARABIC SEMICOLON
+        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
+        /* 60 */ null,
+        // U+2605: "★" BLACK STAR
+        // U+066D: "٭" ARABIC FIVE POINTED STAR
+        /* 61 */ "\u2605,\u066D",
+        // U+266A: "♪" EIGHTH NOTE
+        /* 62 */ "\u266A",
+        /* 63 */ null,
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
+        // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
+        /* 64 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 65 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
+        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
+        // U+0655: "ٕ" ARABIC HAMZA BELOW
+        // U+0652: "ْ" ARABIC SUKUN
+        // U+0651: "ّ" ARABIC SHADDA
+        // U+064C: "ٌ" ARABIC DAMMATAN
+        // U+064D: "ٍ" ARABIC KASRATAN
+        // U+064B: "ً" ARABIC FATHATAN
+        // U+0654: "ٔ" ARABIC HAMZA ABOVE
+        // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF
+        // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF
+        // U+0653: "ٓ" ARABIC MADDAH ABOVE
+        // U+064F: "ُ" ARABIC DAMMA
+        // U+0650: "ِ" ARABIC KASRA
+        // U+064E: "َ" ARABIC FATHA
+        // U+0640: "ـ" ARABIC TATWEEL
+        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
+        // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
+        /* 68 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
+        // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
+        /* 69 */ "\u06F1",
+        // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
+        /* 70 */ "\u06F2",
+        // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE
+        /* 71 */ "\u06F3",
+        // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR
+        /* 72 */ "\u06F4",
+        // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE
+        /* 73 */ "\u06F5",
+        // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX
+        /* 74 */ "\u06F6",
+        // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN
+        /* 75 */ "\u06F7",
+        // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT
+        /* 76 */ "\u06F8",
+        // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE
+        /* 77 */ "\u06F9",
+        // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO
+        /* 78 */ "\u06F0",
+        // Label for "switch to symbols" key.
+        // U+061F: "؟" ARABIC QUESTION MARK
+        /* 79 */ "\u06F3\u06F2\u06F1\u061F",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "\u06F3\u06F2\u06F1",
+        /* 81 */ "1",
+        /* 82 */ "2",
+        /* 83 */ "3",
+        /* 84 */ "4",
+        /* 85 */ "5",
+        /* 86 */ "6",
+        /* 87 */ "7",
+        /* 88 */ "8",
+        /* 89 */ "9",
+        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
+        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
+        /* 90 */ "0,\u066B,\u066C",
+        /* 91~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~100 */
+        // U+060C: "،" ARABIC COMMA
+        /* 101 */ "\u060C",
+        /* 102 */ "\\,",
+        // U+060C: "،" ARABIC COMMA
+        // U+061B: "؛" ARABIC SEMICOLON
+        // U+061F: "؟" ARABIC QUESTION MARK
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        /* 103 */ "\u060C",
+        /* 104 */ "\u061F",
+        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 106 */ null,
+        // U+064B: "ً" ARABIC FATHATAN
+        /* 107 */ "\u064B",
+        /* 108 */ "!text/more_keys_for_arabic_diacritics",
+        /* 109 */ null,
+        /* 110 */ "\u064B",
+        /* 111 */ "!text/more_keys_for_arabic_diacritics",
+        /* 112 */ "\u061F",
+        /* 113 */ "\u061B",
+        // U+066A: "٪" ARABIC PERCENT SIGN
+        /* 114 */ "\u066A",
+        /* 115 */ null,
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 116 */ "?,\u00BF",
+        /* 117 */ ";",
+        // U+2030: "‰" PER MILLE SIGN
+        /* 118 */ "\\%,\u2030",
+    };
+
+    /* Language fi: Finnish */
+    private static final String[] LANGUAGE_fi = {
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
+        /* 1 */ null,
+        /* 2 */ null,
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 4 */ "\u00FC",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        /* 5 */ "\u0161,\u00DF,\u015B",
+        /* 6~ */
+        null, null, null, null, null, null,
+        /* ~11 */
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        /* 12 */ "\u017E,\u017A,\u017C",
+        /* 13~ */
+        null, null, null, null, null, null, null,
+        /* ~19 */
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        /* 20 */ "\u00E5",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 21 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 22 */ "\u00E4",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 23 */ "\u00F8",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 24 */ "\u00E6",
+    };
+
+    /* Language fr: French */
+    private static final String[] LANGUAGE_fr = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
+        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
+        /* 5 */ null,
+        /* 6 */ 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
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "%,\u00FF",
+        /* 9~ */
+        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,
+        /* ~44 */
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        /* 45 */ "\u00E8",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        /* 46 */ "\u00E9",
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        /* 47 */ "\u00E0",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 48 */ "\u00FC",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 49 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 50 */ "\u00E4",
+    };
+
+    /* Language hi: Hindi */
+    private static final String[] LANGUAGE_hi = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0915: "क" DEVANAGARI LETTER KA
+        // U+0916: "ख" DEVANAGARI LETTER KHA
+        // U+0917: "ग" DEVANAGARI LETTER GA
+        /* 51 */ "\u0915\u0916\u0917",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+20B9: "₹" INDIAN RUPEE SIGN
+        /* 57 */ "\u20B9",
+        /* 58~ */
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~68 */
+        // U+0967: "१" DEVANAGARI DIGIT ONE
+        /* 69 */ "\u0967",
+        // U+0968: "२" DEVANAGARI DIGIT TWO
+        /* 70 */ "\u0968",
+        // U+0969: "३" DEVANAGARI DIGIT THREE
+        /* 71 */ "\u0969",
+        // U+096A: "४" DEVANAGARI DIGIT FOUR
+        /* 72 */ "\u096A",
+        // U+096B: "५" DEVANAGARI DIGIT FIVE
+        /* 73 */ "\u096B",
+        // U+096C: "६" DEVANAGARI DIGIT SIX
+        /* 74 */ "\u096C",
+        // U+096D: "७" DEVANAGARI DIGIT SEVEN
+        /* 75 */ "\u096D",
+        // U+096E: "८" DEVANAGARI DIGIT EIGHT
+        /* 76 */ "\u096E",
+        // U+096F: "९" DEVANAGARI DIGIT NINE
+        /* 77 */ "\u096F",
+        // U+0966: "०" DEVANAGARI DIGIT ZERO
+        /* 78 */ "\u0966",
+        // Label for "switch to symbols" key.
+        /* 79 */ "?\u0967\u0968\u0969",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "\u0967\u0968\u0969",
+        /* 81 */ "1",
+        /* 82 */ "2",
+        /* 83 */ "3",
+        /* 84 */ "4",
+        /* 85 */ "5",
+        /* 86 */ "6",
+        /* 87 */ "7",
+        /* 88 */ "8",
+        /* 89 */ "9",
+        /* 90 */ "0",
+    };
+
+    /* Language hr: Croatian */
+    private static final String[] LANGUAGE_hr = {
+        /* 0~ */
+        null, null, null, null, null,
+        /* ~4 */
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u0161,\u015B,\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 7 */ "\u010D,\u0107,\u00E7",
+        /* 8 */ null,
+        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+        /* 9 */ "\u0111",
+        /* 10 */ null,
+        /* 11 */ null,
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        /* 12 */ "\u017E,\u017A,\u017C",
+        /* 13~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language hu: Hungarian */
+    private static final String[] LANGUAGE_hu = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
+        /* 5~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language hy_AM: Armenian (Armenia) */
+    private static final String[] LANGUAGE_hy_AM = {
+        /* 0~ */
+        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,
+        /* ~58 */
+        // U+058A: "֊" ARMENIAN HYPHEN
+        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
+        // U+055D: "՝" ARMENIAN COMMA
+        // U+055E: "՞" ARMENIAN QUESTION MARK
+        // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING
+        // U+055A: "՚" ARMENIAN APOSTROPHE
+        // U+055B: "՛" ARMENIAN EMPHASIS MARK
+        // U+055F: "՟" ARMENIAN ABBREVIATION MARK
+        /* 59 */ "!fixedColumnOrder!8,!,?,\u0559,\u055A,.,\u055C,\\,,\u055E,:,;,\u055F,\u00AB,\u00BB,\u058A,\u055D,\u055B",
+        /* 60~ */
+        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,
+        /* ~102 */
+        // U+058F: "֏" ARMENIAN DRAM SIGN
+        // TODO: Enable this when we have glyph for the following letter
+        // <string name="keylabel_for_currency">&#x058F;</string>
+        // 
+        // U+055D: "՝" ARMENIAN COMMA
+        /* 103 */ "\u055D",
+        /* 104 */ null,
+        /* 105 */ null,
+        // U+0589: "։" ARMENIAN FULL STOP
+        /* 106 */ "\u0589",
+        /* 107 */ null,
+        /* 108 */ null,
+        /* 109 */ "\u0589",
+        /* 110 */ null,
+        /* 111 */ "!text/more_keys_for_punctuation",
+        /* 112~ */
+        null, null, null,
+        /* ~114 */
+        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        /* 115 */ "\u055C,\u00A1",
+        // U+055E: "՞" ARMENIAN QUESTION MARK
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 116 */ "\u055E,\u00BF",
+    };
+
+    /* Language is: Icelandic */
+    private static final String[] LANGUAGE_is = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        /* 5~ */
+        null, null, null,
+        /* ~7 */
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        /* 9 */ "\u00F0",
+        /* 10 */ null,
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* 11 */ "\u00FE",
+        /* 12~ */
+        null, null, null, null, null, null, null, null,
+        /* ~19 */
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        /* 20 */ "\u00F0",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 21 */ "\u00E6",
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* 22 */ "\u00FE",
+        /* 23~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language it: Italian */
+    private static final String[] LANGUAGE_it = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
+    };
+
+    /* Language iw: Hebrew */
+    private static final String[] LANGUAGE_iw = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+05D0: "א" HEBREW LETTER ALEF
+        // U+05D1: "ב" HEBREW LETTER BET
+        // U+05D2: "ג" HEBREW LETTER GIMEL
+        /* 51 */ "\u05D0\u05D1\u05D2",
+        // The following characters don't need BIDI mirroring.
+        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+        /* 52 */ "\u2018,\u2019,\u201A",
+        /* 53 */ "\u201C,\u201D,\u201E",
+        /* 54 */ "!text/single_laqm_raqm_rtl",
+        /* 55 */ "!text/double_laqm_raqm_rtl",
+        /* 56 */ null,
+        // U+20AA: "₪" NEW SHEQEL SIGN
+        /* 57 */ "\u20AA",
+        /* 58 */ null,
+        /* 59 */ "!fixedColumnOrder!8,;,/,(|),)|(,#,!,\\,,?,&,\\%,+,\",-,:,',@",
+        /* 60 */ "!fixedColumnOrder!7,;,/,(|),)|(,#,',\\,,&,\\%,+,\",-,:,@",
+        // U+2605: "★" BLACK STAR
+        /* 61 */ "\u2605",
+        /* 62 */ null,
+        // U+00B1: "±" PLUS-MINUS SIGN
+        // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
+        /* 63 */ "\u00B1,\uFB29",
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        /* 64 */ "!fixedColumnOrder!3,<|>,{|},[|]",
+        /* 65 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+    };
+
+    /* Language ka_GE: Georgian (Georgia) */
+    private static final String[] LANGUAGE_ka_GE = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+10D0: "ა" GEORGIAN LETTER AN
+        // U+10D1: "ბ" GEORGIAN LETTER BAN
+        // U+10D2: "გ" GEORGIAN LETTER GAN
+        /* 51 */ "\u10D0\u10D1\u10D2",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language kk: Kazakh */
+    private static final String[] LANGUAGE_kk = {
+        /* 0~ */
+        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,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 26 */ "\u044A",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
+        // U+04B1: "ұ" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+        /* 30 */ "\u04AF,\u04B1",
+        // U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER
+        /* 31 */ "\u049B",
+        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
+        /* 32 */ "\u04A3",
+        // U+0493: "ғ" CYRILLIC SMALL LETTER GHE WITH STROKE
+        /* 33 */ "\u0493",
+        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* 34 */ "\u0456",
+        // U+04D9: "ә" CYRILLIC SMALL LETTER SCHWA
+        /* 35 */ "\u04D9",
+        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
+        /* 36 */ "\u04E9",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA
+        /* 38 */ "\u04BB",
+        /* 39~ */
+        null, null, null, null,
+        /* ~42 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44~ */
+        null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+    };
+
+    /* Language km_KH: Khmer (Cambodia) */
+    private static final String[] LANGUAGE_km_KH = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+1780: "ក" KHMER LETTER KA
+        // U+1781: "ខ" KHMER LETTER KHA
+        // U+1782: "គ" KHMER LETTER KO
+        /* 51 */ "\u1780\u1781\u1782",
+        /* 52~ */
+        null, null, null, null,
+        /* ~55 */
+        // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
+        /* 56 */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+    };
+
+    /* Language ky: Kirghiz */
+    private static final String[] LANGUAGE_ky = {
+        /* 0~ */
+        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,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 26 */ "\u044A",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
+        /* 30 */ "\u04AF",
+        /* 31 */ null,
+        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
+        /* 32 */ "\u04A3",
+        /* 33~ */
+        null, null, null,
+        /* ~35 */
+        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
+        /* 36 */ "\u04E9",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44~ */
+        null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+    };
+
+    /* Language lo_LA: Lao (Laos) */
+    private static final String[] LANGUAGE_lo_LA = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0E81: "ກ" LAO LETTER KO
+        // U+0E82: "ຂ" LAO LETTER KHO SUNG
+        // U+0E84: "ຄ" LAO LETTER KHO TAM
+        /* 51 */ "\u0E81\u0E82\u0E84",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+20AD: "₭" KIP SIGN
+        /* 57 */ "\u20AD",
+    };
+
+    /* Language lt: Lithuanian */
+    private static final String[] LANGUAGE_lt = {
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
+        // 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
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        /* 10 */ "\u0157,\u0159,\u0155",
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        /* 11 */ "\u0163,\u0165",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        /* 12 */ "\u017E,\u017C,\u017A",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        /* 13 */ "\u0137",
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language lv: Latvian */
+    private static final String[] LANGUAGE_lv = {
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
+        // 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
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        /* 10 */ "\u0157,\u0159,\u0155",
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        /* 11 */ "\u0163,\u0165",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        /* 12 */ "\u017E,\u017C,\u017A",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        /* 13 */ "\u0137",
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language mk: Macedonian */
+    private static final String[] LANGUAGE_mk = {
+        /* 0~ */
+        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,
+        /* ~38 */
+        // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
+        /* 39 */ "\u0455",
+        // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
+        /* 40 */ "\u045C",
+        // U+0437: "з" CYRILLIC SMALL LETTER ZE
+        /* 41 */ "\u0437",
+        // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE
+        /* 42 */ "\u0453",
+        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
+        /* 43 */ "\u0450",
+        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+        /* 44 */ "\u045D",
+        /* 45~ */
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language mn_MN: Mongolian (Mongolia) */
+    private static final String[] LANGUAGE_mn_MN = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+20AE: "₮" TUGRIK SIGN
+        /* 57 */ "\u20AE",
+    };
+
+    /* Language nb: Norwegian Bokmål */
+    private static final String[] LANGUAGE_nb = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
+        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        /* 2 */ null,
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* 5~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~19 */
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        /* 20 */ "\u00E5",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 21 */ "\u00F8",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 22 */ "\u00E6",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 23 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 24 */ "\u00E4",
+        /* 25~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+    };
+
+    /* Language ne_NP: Nepali (Nepal) */
+    private static final String[] LANGUAGE_ne_NP = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0915: "क" DEVANAGARI LETTER KA
+        // U+0916: "ख" DEVANAGARI LETTER KHA
+        // U+0917: "ग" DEVANAGARI LETTER GA
+        /* 51 */ "\u0915\u0916\u0917",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
+        /* 57 */ "\u0930\u0941.",
+        /* 58~ */
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~68 */
+        // U+0967: "१" DEVANAGARI DIGIT ONE
+        /* 69 */ "\u0967",
+        // U+0968: "२" DEVANAGARI DIGIT TWO
+        /* 70 */ "\u0968",
+        // U+0969: "३" DEVANAGARI DIGIT THREE
+        /* 71 */ "\u0969",
+        // U+096A: "४" DEVANAGARI DIGIT FOUR
+        /* 72 */ "\u096A",
+        // U+096B: "५" DEVANAGARI DIGIT FIVE
+        /* 73 */ "\u096B",
+        // U+096C: "६" DEVANAGARI DIGIT SIX
+        /* 74 */ "\u096C",
+        // U+096D: "७" DEVANAGARI DIGIT SEVEN
+        /* 75 */ "\u096D",
+        // U+096E: "८" DEVANAGARI DIGIT EIGHT
+        /* 76 */ "\u096E",
+        // U+096F: "९" DEVANAGARI DIGIT NINE
+        /* 77 */ "\u096F",
+        // U+0966: "०" DEVANAGARI DIGIT ZERO
+        /* 78 */ "\u0966",
+        // Label for "switch to symbols" key.
+        /* 79 */ "?\u0967\u0968\u0969",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "\u0967\u0968\u0969",
+        /* 81 */ "1",
+        /* 82 */ "2",
+        /* 83 */ "3",
+        /* 84 */ "4",
+        /* 85 */ "5",
+        /* 86 */ "6",
+        /* 87 */ "7",
+        /* 88 */ "8",
+        /* 89 */ "9",
+        /* 90 */ "0",
+    };
+
+    /* Language nl: Dutch */
+    private static final String[] LANGUAGE_nl = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        /* 7 */ null,
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 8 */ "\u0133",
+        /* 9~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+    };
+
+    /* Language pl: Polish */
+    private static final String[] LANGUAGE_pl = {
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // 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
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
+        /* 2 */ null,
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        /* 4 */ null,
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u015B,\u00DF,\u0161",
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 6 */ "\u0144,\u00F1",
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u0107,\u00E7,\u010D",
+        /* 8~ */
+        null, null, null, null,
+        /* ~11 */
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* 12 */ "\u017C,\u017A,\u017E",
+        /* 13 */ null,
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u0142",
+        /* 15~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+    };
+
+    /* Language pt: Portuguese */
+    private static final String[] LANGUAGE_pt = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* 5 */ null,
+        /* 6 */ 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
+        /* 7 */ "\u00E7,\u010D,\u0107",
+    };
+
+    /* Language rm: Raeto-Romance */
+    private static final String[] LANGUAGE_rm = {
+        /* 0~ */
+        null, null, null,
+        /* ~2 */
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
+    };
+
+    /* Language ro: Romanian */
+    private static final String[] LANGUAGE_ro = {
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
+        /* 1 */ null,
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* 3 */ null,
+        /* 4 */ null,
+        // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u0219,\u00DF,\u015B,\u0161",
+        /* 6~ */
+        null, null, null, null, null,
+        /* ~10 */
+        // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
+        /* 11 */ "\u021B",
+        /* 12~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+    };
+
+    /* Language ru: Russian */
+    private static final String[] LANGUAGE_ru = {
+        /* 0~ */
+        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,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 26 */ "\u044A",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        /* 30~ */
+        null, null, null, null, null, null, null,
+        /* ~36 */
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44~ */
+        null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language sk: Slovak */
+    private static final String[] LANGUAGE_sk = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        /* 0 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        // 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
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* 2 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0148,\u0146,\u00F1,\u0144,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        /* 10 */ "\u0155,\u0159,\u0157",
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        /* 11 */ "\u0165,\u0163",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        /* 12 */ "\u017E,\u017C,\u017A",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        /* 13 */ "\u0137",
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u013E,\u013A,\u013C,\u0142",
+        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language sl: Slovenian */
+    private static final String[] LANGUAGE_sl = {
+        /* 0~ */
+        null, null, null, null, null,
+        /* ~4 */
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u0161",
+        /* 6 */ null,
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u0107",
+        /* 8 */ null,
+        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+        /* 9 */ "\u0111",
+        /* 10 */ null,
+        /* 11 */ null,
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* 12 */ "\u017E",
+        /* 13~ */
+        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,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language sr: Serbian */
+    private static final String[] LANGUAGE_sr = {
+        /* 0~ */
+        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,
+        /* ~38 */
+        // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified.
+        // BEGIN: More keys definitions for Serbian (Latin)
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // <string name="more_keys_for_s">&#x0161;,&#x00DF;,&#x015B;</string>
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // <string name="more_keys_for_c">&#x010D;,&#x00E7;,&#x0107;</string>
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        // <string name="more_keys_for_d">&#x010F;</string>
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // <string name="more_keys_for_z">&#x017E;,&#x017A;,&#x017C;</string>
+        // END: More keys definitions for Serbian (Latin)
+        // BEGIN: More keys definitions for Serbian (Cyrillic)
+        // U+0437: "з" CYRILLIC SMALL LETTER ZE
+        /* 39 */ "\u0437",
+        // U+045B: "ћ" CYRILLIC SMALL LETTER TSHE
+        /* 40 */ "\u045B",
+        // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
+        /* 41 */ "\u0455",
+        // U+0452: "ђ" CYRILLIC SMALL LETTER DJE
+        /* 42 */ "\u0452",
+        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
+        /* 43 */ "\u0450",
+        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+        /* 44 */ "\u045D",
+        /* 45~ */
+        null, null, null, null, null, null,
+        /* ~50 */
+        // 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
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language sv: Swedish */
+    private static final String[] LANGUAGE_sv = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        /* 0 */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
+        // 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+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        /* 2 */ "\u00ED,\u00EC,\u00EE,\u00EF",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B",
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u015B,\u0161,\u015F,\u00DF",
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        /* 6 */ "\u0144,\u00F1,\u0148",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF,\u00FC",
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u00F0,\u010F",
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        /* 10 */ "\u0159",
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* 11 */ "\u0165,\u00FE",
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        /* 12 */ "\u017A,\u017E,\u017C",
+        /* 13 */ null,
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u0142",
+        /* 15~ */
+        null, null, null, null, null,
+        /* ~19 */
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        /* 20 */ "\u00E5",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 21 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 22 */ "\u00E4",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        /* 23 */ "\u00F8,\u0153",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 24 */ "\u00E6",
+        /* 25~ */
+        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,
+        /* ~53 */
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language sw: Swahili */
+    private static final String[] LANGUAGE_sw = {
+        // This is the same as English except more_keys_for_g.
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 6 */ "\u00F1",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 7 */ "\u00E7",
+        /* 8~ */
+        null, null, null, null, null, null, null,
+        /* ~14 */
+        /* 15 */ "g\'",
+    };
+
+    /* Language th: Thai */
+    private static final String[] LANGUAGE_th = {
+        /* 0~ */
+        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,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0E01: "ก" THAI CHARACTER KO KAI
+        // U+0E02: "ข" THAI CHARACTER KHO KHAI
+        // U+0E04: "ค" THAI CHARACTER KHO KHWAI
+        /* 51 */ "\u0E01\u0E02\u0E04",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
+        /* 57 */ "\u0E3F",
+    };
+
+    /* Language tl: Tagalog */
+    private static final String[] LANGUAGE_tl = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+    };
+
+    /* Language tr: Turkish */
+    private static final String[] LANGUAGE_tr = {
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        /* 0 */ "\u00E2",
+        /* 1 */ null,
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
+        /* 6 */ 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
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        null, null, null, null, null, null, null,
+        /* ~14 */
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u011F",
+    };
+
+    /* Language uk: Ukrainian */
+    private static final String[] LANGUAGE_uk = {
+        /* 0~ */
+        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,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+0457: "ї" CYRILLIC SMALL LETTER YI
+        /* 26 */ "\u0457",
+        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* 27 */ "\u0456",
+        // U+0454: "є" CYRILLIC SMALL LETTER UKRAINIAN IE
+        /* 28 */ "\u0454",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        /* 30~ */
+        null, null, null,
+        /* ~32 */
+        // U+0491: "ґ" CYRILLIC SMALL LETTER GHE WITH UPTURN
+        /* 33 */ "\u0491",
+        // U+0457: "ї" CYRILLIC SMALL LETTER YI
+        /* 34 */ "\u0457",
+        /* 35 */ null,
+        /* 36 */ null,
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54~ */
+        null, null, null,
+        /* ~56 */
+        // U+20B4: "₴" HRYVNIA SIGN
+        /* 57 */ "\u20B4",
+    };
+
+    /* Language vi: Vietnamese */
+    private static final String[] LANGUAGE_vi = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+1EA3: "ả" LATIN SMALL LETTER A WITH HOOK ABOVE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+1EA1: "ạ" LATIN SMALL LETTER A WITH DOT BELOW
+        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+        // U+1EB1: "ằ" LATIN SMALL LETTER A WITH BREVE AND GRAVE
+        // U+1EAF: "ắ" LATIN SMALL LETTER A WITH BREVE AND ACUTE
+        // U+1EB3: "ẳ" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+        // U+1EB5: "ẵ" LATIN SMALL LETTER A WITH BREVE AND TILDE
+        // U+1EB7: "ặ" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+1EA7: "ầ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+        // U+1EA5: "ấ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+        // U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+        // U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+        // U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+        /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
+        // 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
+        // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE
+        // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+        // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+        // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+        // U+1EC5: "ễ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+        // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+        /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE
+        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
+        // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
+        /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+1ECD: "ọ" LATIN SMALL LETTER O WITH DOT BELOW
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+1ED3: "ồ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+        // U+1ED1: "ố" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+        // U+1ED5: "ổ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+        // U+1ED7: "ỗ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+        // U+1ED9: "ộ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+        // U+01A1: "ơ" LATIN SMALL LETTER O WITH HORN
+        // U+1EDD: "ờ" LATIN SMALL LETTER O WITH HORN AND GRAVE
+        // U+1EDB: "ớ" LATIN SMALL LETTER O WITH HORN AND ACUTE
+        // U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+        // U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE
+        // U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+        /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE
+        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
+        // U+1EE5: "ụ" LATIN SMALL LETTER U WITH DOT BELOW
+        // U+01B0: "ư" LATIN SMALL LETTER U WITH HORN
+        // U+1EEB: "ừ" LATIN SMALL LETTER U WITH HORN AND GRAVE
+        // U+1EE9: "ứ" LATIN SMALL LETTER U WITH HORN AND ACUTE
+        // U+1EED: "ử" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+        // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE
+        // U+1EF1: "ự" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+        /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
+        /* 5~ */
+        null, null, null,
+        /* ~7 */
+        // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+1EF7: "ỷ" LATIN SMALL LETTER Y WITH HOOK ABOVE
+        // U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE
+        // U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW
+        /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
+        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+        /* 9 */ "\u0111",
+        /* 10~ */
+        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,
+        /* ~56 */
+        // U+20AB: "₫" DONG SIGN
+        /* 57 */ "\u20AB",
+    };
+
+    /* Language zu: Zulu */
+    private static final String[] LANGUAGE_zu = {
+        // This is the same as English
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 6 */ "\u00F1",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 7 */ "\u00E7",
+    };
+
+    /* Language zz: Alphabet */
+    private static final String[] LANGUAGE_zz = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+        // U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE
+        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE
+        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        // U+017F: "ſ" LATIN SMALL LETTER LONG S
+        /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+        // U+014B: "ŋ" LATIN SMALL LETTER ENG
+        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
+        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 8 */ "\u00FD,\u0177,\u00FF,\u0133",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        /* 9 */ "\u010F,\u0111,\u00F0",
+        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+        /* 10 */ "\u0155,\u0157,\u0159",
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
+        /* 11 */ "\u00FE,\u0163,\u0165,\u0167",
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* 12 */ "\u017A,\u017C,\u017E",
+        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+        // U+0138: "ĸ" LATIN SMALL LETTER KRA
+        /* 13 */ "\u0137,\u0138",
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
+        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
+        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
+        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
+        /* 15 */ "\u011D,\u011F,\u0121,\u0123",
+        /* 16 */ null,
+        // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
+        /* 17 */ "\u0125",
+        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
+        /* 18 */ "\u0135",
+        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+        /* 19 */ "\u0175",
+    };
+
+    // TODO: Use the language + "_" + region representation for the locale string key.
+    // Currently we are dropping the region from the key.
+    private static final Object[] LANGUAGES_AND_TEXTS = {
+        "DEFAULT", LANGUAGE_DEFAULT, /* default */
+        "af", LANGUAGE_af, /* Afrikaans */
+        "ar", LANGUAGE_ar, /* Arabic */
+        "az" /* "az_AZ" */, LANGUAGE_az_AZ, /* Azerbaijani (Azerbaijan) */
+        "be" /* "be_BY" */, LANGUAGE_be_BY, /* Belarusian (Belarus) */
+        "bg", LANGUAGE_bg, /* Bulgarian */
+        "ca", LANGUAGE_ca, /* Catalan */
+        "cs", LANGUAGE_cs, /* Czech */
+        "da", LANGUAGE_da, /* Danish */
+        "de", LANGUAGE_de, /* German */
+        "el", LANGUAGE_el, /* Greek */
+        "en", LANGUAGE_en, /* English */
+        "eo", LANGUAGE_eo, /* Esperanto */
+        "es", LANGUAGE_es, /* Spanish */
+        "et" /* "et_EE" */, LANGUAGE_et_EE, /* Estonian (Estonia) */
+        "fa", LANGUAGE_fa, /* Persian */
+        "fi", LANGUAGE_fi, /* Finnish */
+        "fr", LANGUAGE_fr, /* French */
+        "hi", LANGUAGE_hi, /* Hindi */
+        "hr", LANGUAGE_hr, /* Croatian */
+        "hu", LANGUAGE_hu, /* Hungarian */
+        "hy" /* "hy_AM" */, LANGUAGE_hy_AM, /* Armenian (Armenia) */
+        "is", LANGUAGE_is, /* Icelandic */
+        "it", LANGUAGE_it, /* Italian */
+        "iw", LANGUAGE_iw, /* Hebrew */
+        "ka" /* "ka_GE" */, LANGUAGE_ka_GE, /* Georgian (Georgia) */
+        "kk", LANGUAGE_kk, /* Kazakh */
+        "km" /* "km_KH" */, LANGUAGE_km_KH, /* Khmer (Cambodia) */
+        "ky", LANGUAGE_ky, /* Kirghiz */
+        "lo" /* "lo_LA" */, LANGUAGE_lo_LA, /* Lao (Laos) */
+        "lt", LANGUAGE_lt, /* Lithuanian */
+        "lv", LANGUAGE_lv, /* Latvian */
+        "mk", LANGUAGE_mk, /* Macedonian */
+        "mn" /* "mn_MN" */, LANGUAGE_mn_MN, /* Mongolian (Mongolia) */
+        "nb", LANGUAGE_nb, /* Norwegian Bokmål */
+        "ne" /* "ne_NP" */, LANGUAGE_ne_NP, /* Nepali (Nepal) */
+        "nl", LANGUAGE_nl, /* Dutch */
+        "pl", LANGUAGE_pl, /* Polish */
+        "pt", LANGUAGE_pt, /* Portuguese */
+        "rm", LANGUAGE_rm, /* Raeto-Romance */
+        "ro", LANGUAGE_ro, /* Romanian */
+        "ru", LANGUAGE_ru, /* Russian */
+        "sk", LANGUAGE_sk, /* Slovak */
+        "sl", LANGUAGE_sl, /* Slovenian */
+        "sr", LANGUAGE_sr, /* Serbian */
+        "sv", LANGUAGE_sv, /* Swedish */
+        "sw", LANGUAGE_sw, /* Swahili */
+        "th", LANGUAGE_th, /* Thai */
+        "tl", LANGUAGE_tl, /* Tagalog */
+        "tr", LANGUAGE_tr, /* Turkish */
+        "uk", LANGUAGE_uk, /* Ukrainian */
+        "vi", LANGUAGE_vi, /* Vietnamese */
+        "zu", LANGUAGE_zu, /* Zulu */
+        "zz", LANGUAGE_zz, /* Alphabet */
+    };
+
+    static {
+        for (int index = 0; index < NAMES.length; index++) {
+            sNameToIndexesMap.put(NAMES[index], index);
+        }
+
+        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
+            final String language = (String)LANGUAGES_AND_TEXTS[i];
+            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
+            sLanguageToTextsMap.put(language, texts);
+        }
+    }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
index 0551e9e..319bf89 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
@@ -18,6 +18,7 @@
 
 import android.text.TextUtils;
 
+import com.android.inputmethod.keyboard.Key;
 import com.android.inputmethod.latin.Constants;
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.utils.CollectionUtils;
@@ -38,6 +39,7 @@
  * Note that the '\' is also parsed by XML parser and {@link MoreKeySpec#splitKeySpecs(String)}
  * as well.
  */
+// TODO: Should extend the key specification object.
 public final class MoreKeySpec {
     public final int mCode;
     public final String mLabel;
@@ -66,6 +68,13 @@
         mIconId = KeySpecParser.getIconId(moreKeySpec);
     }
 
+    public Key buildKey(final int x, final int y, final int labelFlags,
+            final KeyboardParams params) {
+        return new Key(mLabel, mIconId, mCode, mOutputText, null /* hintLabel */, labelFlags,
+                Key.BACKGROUND_TYPE_NORMAL, x, y, params.mDefaultKeyWidth, params.mDefaultRowHeight,
+                params.mHorizontalGap, params.mVerticalGap);
+    }
+
     @Override
     public int hashCode() {
         int hashCode = 1;
diff --git a/java/src/com/android/inputmethod/latin/DictionaryWriter.java b/java/src/com/android/inputmethod/latin/DictionaryWriter.java
index 8489868..b931c66 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryWriter.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryWriter.java
@@ -21,6 +21,7 @@
 import com.android.inputmethod.latin.makedict.FusionDictionary;
 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray;
 import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
+import com.android.inputmethod.latin.makedict.ProbabilityInfo;
 import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 import com.android.inputmethod.latin.utils.CollectionUtils;
 
@@ -56,22 +57,23 @@
     // TODO: Create "cache dictionary" to cache fresh words for frequently updated dictionaries,
     // considering performance regression.
     @Override
-    public void addUnigramWord(final String word, final String shortcutTarget, final int frequency,
-            final int shortcutFreq, final boolean isNotAWord) {
+    public void addUnigramWord(final String word, final String shortcutTarget,
+            final int probability, final int shortcutProbability, final boolean isNotAWord) {
         if (shortcutTarget == null) {
-            mFusionDictionary.add(word, frequency, null, isNotAWord);
+            mFusionDictionary.add(word, new ProbabilityInfo(probability), null, isNotAWord);
         } else {
             // TODO: Do this in the subclass, with this class taking an arraylist.
             final ArrayList<WeightedString> shortcutTargets = CollectionUtils.newArrayList();
-            shortcutTargets.add(new WeightedString(shortcutTarget, shortcutFreq));
-            mFusionDictionary.add(word, frequency, shortcutTargets, isNotAWord);
+            shortcutTargets.add(new WeightedString(shortcutTarget, shortcutProbability));
+            mFusionDictionary.add(word, new ProbabilityInfo(probability), shortcutTargets,
+                    isNotAWord);
         }
     }
 
     @Override
-    public void addBigramWords(final String word0, final String word1, final int frequency,
+    public void addBigramWords(final String word0, final String word1, final int probability,
             final boolean isValid, final long lastModifiedTime) {
-        mFusionDictionary.setBigram(word0, word1, frequency);
+        mFusionDictionary.setBigram(word0, word1, new ProbabilityInfo(probability));
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 3b42772..432b8a5 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1350,8 +1350,17 @@
     public void setSuggestedWords(final SuggestedWords suggestedWords, final boolean shouldShow) {
         mInputLogic.setSuggestedWords(suggestedWords);
         if (mSuggestionStripView != null) {
-            mSuggestionStripView.setSuggestions(suggestedWords,
-                    SubtypeLocaleUtils.isRtlLanguage(mSubtypeSwitcher.getCurrentSubtype()));
+            final boolean showSuggestions;
+            if (SuggestedWords.EMPTY == suggestedWords
+                    || suggestedWords.mIsPunctuationSuggestions) {
+                showSuggestions = !mSuggestionStripView.maybeShowImportantNoticeTitle();
+            } else {
+                showSuggestions = true;
+            }
+            if (showSuggestions) {
+                mSuggestionStripView.setSuggestions(suggestedWords,
+                        SubtypeLocaleUtils.isRtlLanguage(mSubtypeSwitcher.getCurrentSubtype()));
+            }
             mKeyboardSwitcher.onAutoCorrectionStateChanged(suggestedWords.mWillAutoCorrect);
             setSuggestionStripShownInternal(shouldShow, true /* needsInputViewShown */);
         }
diff --git a/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java
index e7d1c98..1bc3227 100644
--- a/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java
@@ -20,7 +20,6 @@
 import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding;
 import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer;
 import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions;
-import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -117,94 +116,6 @@
     }
 
     /**
-     * A utility class for reading a PtNode.
-     */
-    protected static class PtNodeReader {
-        protected static int readPtNodeOptionFlags(final DictBuffer dictBuffer) {
-            return dictBuffer.readUnsignedByte();
-        }
-
-        protected static int readParentAddress(final DictBuffer dictBuffer,
-                final FormatOptions formatOptions) {
-            if (BinaryDictIOUtils.supportsDynamicUpdate(formatOptions)) {
-                return BinaryDictDecoderUtils.readSInt24(dictBuffer);
-            } else {
-                return FormatSpec.NO_PARENT_ADDRESS;
-            }
-        }
-
-        protected static int readChildrenAddress(final DictBuffer dictBuffer, final int optionFlags,
-                final FormatOptions formatOptions) {
-            if (BinaryDictIOUtils.supportsDynamicUpdate(formatOptions)) {
-                final int address = BinaryDictDecoderUtils.readSInt24(dictBuffer);
-                if (address == 0) return FormatSpec.NO_CHILDREN_ADDRESS;
-                return address;
-            } else {
-                switch (optionFlags & FormatSpec.MASK_CHILDREN_ADDRESS_TYPE) {
-                    case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE:
-                        return dictBuffer.readUnsignedByte();
-                    case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES:
-                        return dictBuffer.readUnsignedShort();
-                    case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES:
-                        return dictBuffer.readUnsignedInt24();
-                    case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS:
-                    default:
-                        return FormatSpec.NO_CHILDREN_ADDRESS;
-                }
-            }
-        }
-
-        // Reads shortcuts and returns the read length.
-        protected static int readShortcut(final DictBuffer dictBuffer,
-                final ArrayList<WeightedString> shortcutTargets) {
-            final int pointerBefore = dictBuffer.position();
-            dictBuffer.readUnsignedShort(); // skip the size
-            while (true) {
-                final int targetFlags = dictBuffer.readUnsignedByte();
-                final String word = CharEncoding.readString(dictBuffer);
-                shortcutTargets.add(new WeightedString(word,
-                        targetFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY));
-                if (0 == (targetFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT)) break;
-            }
-            return dictBuffer.position() - pointerBefore;
-        }
-
-        protected static int readBigramAddresses(final DictBuffer dictBuffer,
-                final ArrayList<PendingAttribute> bigrams, final int baseAddress) {
-            int readLength = 0;
-            int bigramCount = 0;
-            while (bigramCount++ < FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) {
-                final int bigramFlags = dictBuffer.readUnsignedByte();
-                ++readLength;
-                final int sign = 0 == (bigramFlags & FormatSpec.FLAG_BIGRAM_ATTR_OFFSET_NEGATIVE)
-                        ? 1 : -1;
-                int bigramAddress = baseAddress + readLength;
-                switch (bigramFlags & FormatSpec.MASK_BIGRAM_ATTR_ADDRESS_TYPE) {
-                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_ONEBYTE:
-                        bigramAddress += sign * dictBuffer.readUnsignedByte();
-                        readLength += 1;
-                        break;
-                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_TWOBYTES:
-                        bigramAddress += sign * dictBuffer.readUnsignedShort();
-                        readLength += 2;
-                        break;
-                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_THREEBYTES:
-                        bigramAddress += sign * dictBuffer.readUnsignedInt24();
-                        readLength += 3;
-                        break;
-                    default:
-                        throw new RuntimeException("Has bigrams with no address");
-                }
-                bigrams.add(new PendingAttribute(
-                        bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY,
-                        bigramAddress));
-                if (0 == (bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT)) break;
-            }
-            return readLength;
-        }
-    }
-
-    /**
      * Check whether the header contains the expected information. This is a no-error method,
      * that will return an error code and never throw a checked exception.
      * @return an error code, either ERROR_* or SUCCESS.
@@ -264,9 +175,4 @@
     public boolean hasNextPtNodeArray() {
         return false;
     }
-
-    @Override
-    @UsedForTesting
-    public void skipPtNode(final FormatOptions formatOptions) {
-    }
 }
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
index 782ada3..fc5788d 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
@@ -166,15 +166,6 @@
             return size;
         }
 
-        @UsedForTesting
-        static int getCharArraySize(final int[] chars, final int start, final int end) {
-            int size = 0;
-            for (int i = start; i < end; ++i) {
-                size += getCharSize(chars[i]);
-            }
-            return size;
-        }
-
         /**
          * Writes a char array to a byte buffer.
          *
@@ -253,41 +244,6 @@
         }
 
         /**
-         * Writes an array of code points with our character format to an OutputStream.
-         *
-         * This will also write the terminator byte.
-         *
-         * @param stream the OutputStream to write to.
-         * @param codePoints the array of code points
-         * @return the size written, in bytes.
-         */
-        // TODO: Merge this method with writeCharArray and rename the various write* methods to
-        // make the difference clear.
-        @UsedForTesting
-        static int writeCodePoints(final OutputStream stream, final int[] codePoints,
-                final int startIndex, final int endIndex)
-                throws IOException {
-            int written = 0;
-            for (int i = startIndex; i < endIndex; ++i) {
-                final int codePoint = codePoints[i];
-                final int charSize = getCharSize(codePoint);
-                if (1 == charSize) {
-                    stream.write((byte) codePoint);
-                } else {
-                    stream.write((byte) (0xFF & (codePoint >> 16)));
-                    stream.write((byte) (0xFF & (codePoint >> 8)));
-                    stream.write((byte) (0xFF & codePoint));
-                }
-                written += charSize;
-            }
-            if (endIndex - startIndex > 1) {
-                stream.write(FormatSpec.PTNODE_CHARACTERS_TERMINATOR);
-                written += FormatSpec.PTNODE_TERMINATOR_SIZE;
-            }
-            return written;
-        }
-
-        /**
          * Reads a string from a DictBuffer. This is the converse of the above method.
          */
         static String readString(final DictBuffer dictBuffer) {
@@ -321,50 +277,6 @@
         }
     }
 
-    // Input methods: Read a binary dictionary to memory.
-    // readDictionaryBinary is the public entry point for them.
-
-    static int readSInt24(final DictBuffer dictBuffer) {
-        final int retval = dictBuffer.readUnsignedInt24();
-        final int sign = ((retval & FormatSpec.MSB24) != 0) ? -1 : 1;
-        return sign * (retval & FormatSpec.SINT24_MAX);
-    }
-
-    static int readChildrenAddress(final DictBuffer dictBuffer,
-            final int optionFlags, final FormatOptions options) {
-        if (options.supportsDynamicUpdate()) {
-            final int address = dictBuffer.readUnsignedInt24();
-            if (address == 0) return FormatSpec.NO_CHILDREN_ADDRESS;
-            if ((address & FormatSpec.MSB24) != 0) {
-                return -(address & FormatSpec.SINT24_MAX);
-            } else {
-                return address;
-            }
-        }
-        switch (optionFlags & FormatSpec.MASK_CHILDREN_ADDRESS_TYPE) {
-            case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE:
-                return dictBuffer.readUnsignedByte();
-            case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES:
-                return dictBuffer.readUnsignedShort();
-            case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES:
-                return dictBuffer.readUnsignedInt24();
-            case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS:
-            default:
-                return FormatSpec.NO_CHILDREN_ADDRESS;
-        }
-    }
-
-    static int readParentAddress(final DictBuffer dictBuffer,
-            final FormatOptions formatOptions) {
-        if (BinaryDictIOUtils.supportsDynamicUpdate(formatOptions)) {
-            final int parentAddress = dictBuffer.readUnsignedInt24();
-            final int sign = ((parentAddress & FormatSpec.MSB24) != 0) ? -1 : 1;
-            return sign * (parentAddress & FormatSpec.SINT24_MAX);
-        } else {
-            return FormatSpec.NO_PARENT_ADDRESS;
-        }
-    }
-
     /**
      * Reads and returns the PtNode count out of a buffer and forwards the pointer.
      */
@@ -408,7 +320,7 @@
     private static WeightedString getWordAtPositionWithParentAddress(final DictDecoder dictDecoder,
             final int pos, final FormatOptions options) {
         int currentPos = pos;
-        int frequency = Integer.MIN_VALUE;
+        ProbabilityInfo probabilityInfo = null;
         final StringBuilder builder = new StringBuilder();
         // the length of the path from the root to the leaf is limited by MAX_WORD_LENGTH
         for (int count = 0; count < FormatSpec.MAX_WORD_LENGTH; ++count) {
@@ -424,13 +336,15 @@
                     MakedictLog.d("Too many jumps - probably a bug");
                 }
             } while (BinaryDictIOUtils.isMovedPtNode(currentInfo.mFlags, options));
-            if (Integer.MIN_VALUE == frequency) frequency = currentInfo.mFrequency;
+            if (probabilityInfo == null) {
+                probabilityInfo = currentInfo.mProbabilityInfo;
+            }
             builder.insert(0,
                     new String(currentInfo.mCharacters, 0, currentInfo.mCharacters.length));
             if (currentInfo.mParentAddress == FormatSpec.NO_PARENT_ADDRESS) break;
             currentPos = currentInfo.mParentAddress + currentInfo.mOriginalAddress;
         }
-        return new WeightedString(builder.toString(), frequency);
+        return new WeightedString(builder.toString(), probabilityInfo);
     }
 
     private static WeightedString getWordAtPositionWithoutParentAddress(
@@ -448,7 +362,7 @@
             groupPos = info.mEndAddress;
             if (info.mOriginalAddress == pos) {
                 builder.append(new String(info.mCharacters, 0, info.mCharacters.length));
-                result = new WeightedString(builder.toString(), info.mFrequency);
+                result = new WeightedString(builder.toString(), info.mProbabilityInfo);
                 break; // and return
             }
             if (BinaryDictIOUtils.hasChildrenAddress(info.mChildrenAddress)) {
@@ -527,13 +441,13 @@
                     }
                     nodeArrayContents.add(
                             new PtNode(info.mCharacters, shortcutTargets, bigrams,
-                                    info.mFrequency,
+                                    info.mProbabilityInfo,
                                     0 != (info.mFlags & FormatSpec.FLAG_IS_NOT_A_WORD),
                                     0 != (info.mFlags & FormatSpec.FLAG_IS_BLACKLISTED), children));
                 } else {
                     nodeArrayContents.add(
                             new PtNode(info.mCharacters, shortcutTargets, bigrams,
-                                    info.mFrequency,
+                                    info.mProbabilityInfo,
                                     0 != (info.mFlags & FormatSpec.FLAG_IS_NOT_A_WORD),
                                     0 != (info.mFlags & FormatSpec.FLAG_IS_BLACKLISTED)));
                 }
@@ -611,7 +525,7 @@
                     newDict.addBlacklistEntry(wordProperty.mWord, wordProperty.mShortcutTargets,
                             wordProperty.mIsNotAWord);
                 } else {
-                    newDict.add(wordProperty.mWord, wordProperty.getProbability(),
+                    newDict.add(wordProperty.mWord, wordProperty.mProbabilityInfo,
                             wordProperty.mShortcutTargets, wordProperty.mIsNotAWord);
                 }
             }
@@ -620,7 +534,7 @@
                 // words that are not also registered as unigrams so we don't have to avoid
                 // them explicitly here.
                 for (final WeightedString bigram : wordProperty.mBigrams) {
-                    newDict.setBigram(wordProperty.mWord, bigram.mWord, bigram.getProbability());
+                    newDict.setBigram(wordProperty.mWord, bigram.mWord, bigram.mProbabilityInfo);
                 }
             }
         }
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java
index eff8fc3..9c5d1b9 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java
@@ -673,7 +673,7 @@
 
     /* package */ static byte makePtNodeFlags(final PtNode node, final int childrenOffset,
             final FormatOptions formatOptions) {
-        return (byte) makePtNodeFlags(node.mChars.length > 1, node.mFrequency >= 0,
+        return (byte) makePtNodeFlags(node.mChars.length > 1, node.isTerminal(),
                 getByteSize(childrenOffset),
                 node.mShortcutTargets != null && !node.mShortcutTargets.isEmpty(),
                 node.mBigrams != null, node.mIsNotAWord, node.mIsBlacklistEntry, formatOptions);
@@ -833,10 +833,10 @@
                         + ptNode.mCachedAddressAfterUpdate);
             }
             // Sanity checks.
-            if (DBG && ptNode.mFrequency > FormatSpec.MAX_TERMINAL_FREQUENCY) {
+            if (DBG && ptNode.getProbability() > FormatSpec.MAX_TERMINAL_FREQUENCY) {
                 throw new RuntimeException("A node has a frequency > "
                         + FormatSpec.MAX_TERMINAL_FREQUENCY
-                        + " : " + ptNode.mFrequency);
+                        + " : " + ptNode.mProbabilityInfo.toString());
             }
             dictEncoder.writePtNode(ptNode, parentPosition, formatOptions, dict);
         }
@@ -871,7 +871,7 @@
             for (final PtNode ptNode : ptNodeArray.mData) {
                 ++ptNodes;
                 if (ptNode.mChars.length > maxRuns) maxRuns = ptNode.mChars.length;
-                if (ptNode.mFrequency >= 0) {
+                if (ptNode.isTerminal()) {
                     if (ptNodeArray.mCachedAddressAfterUpdate < firstTerminalAddress)
                         firstTerminalAddress = ptNodeArray.mCachedAddressAfterUpdate;
                     if (ptNodeArray.mCachedAddressAfterUpdate > lastTerminalAddress)
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
index dea9f2e..54446df 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
@@ -21,7 +21,6 @@
 import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding;
 import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer;
 import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions;
-import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode;
 import com.android.inputmethod.latin.utils.ByteArrayDictBuffer;
 
 import java.io.File;
@@ -91,21 +90,23 @@
                 stack.pop();
                 continue;
             }
-            PtNodeInfo info = dictDecoder.readPtNode(p.mAddress, formatOptions);
-            for (int i = 0; i < info.mCharacters.length; ++i) {
-                pushedChars[index++] = info.mCharacters[i];
+            final PtNodeInfo ptNodeInfo = dictDecoder.readPtNode(p.mAddress, formatOptions);
+            for (int i = 0; i < ptNodeInfo.mCharacters.length; ++i) {
+                pushedChars[index++] = ptNodeInfo.mCharacters[i];
             }
             p.mPosition++;
 
-            final boolean isMovedPtNode = isMovedPtNode(info.mFlags,
+            final boolean isMovedPtNode = isMovedPtNode(ptNodeInfo.mFlags,
                     formatOptions);
-            final boolean isDeletedPtNode = isDeletedPtNode(info.mFlags,
+            final boolean isDeletedPtNode = isDeletedPtNode(ptNodeInfo.mFlags,
                     formatOptions);
-            if (!isMovedPtNode && !isDeletedPtNode
-                    && info.mFrequency != FusionDictionary.PtNode.NOT_A_TERMINAL) {// found word
-                words.put(info.mOriginalAddress, new String(pushedChars, 0, index));
-                frequencies.put(info.mOriginalAddress, info.mFrequency);
-                if (info.mBigrams != null) bigrams.put(info.mOriginalAddress, info.mBigrams);
+            if (!isMovedPtNode && !isDeletedPtNode && ptNodeInfo.isTerminal()) {// found word
+                words.put(ptNodeInfo.mOriginalAddress, new String(pushedChars, 0, index));
+                frequencies.put(
+                        ptNodeInfo.mOriginalAddress, ptNodeInfo.mProbabilityInfo.mProbability);
+                if (ptNodeInfo.mBigrams != null) {
+                    bigrams.put(ptNodeInfo.mOriginalAddress, ptNodeInfo.mBigrams);
+                }
             }
 
             if (p.mPosition == p.mNumOfPtNode) {
@@ -127,8 +128,8 @@
                 p.mAddress = dictDecoder.getPosition();
             }
 
-            if (!isMovedPtNode && hasChildrenAddress(info.mChildrenAddress)) {
-                final Position childrenPos = new Position(info.mChildrenAddress, index);
+            if (!isMovedPtNode && hasChildrenAddress(ptNodeInfo.mChildrenAddress)) {
+                final Position childrenPos = new Position(ptNodeInfo.mChildrenAddress, index);
                 stack.push(childrenPos);
             }
         }
@@ -203,8 +204,7 @@
                     if (same) {
                         // found the PtNode matches the word.
                         if (wordPos + currentInfo.mCharacters.length == wordLen) {
-                            if (currentInfo.mFrequency == PtNode.NOT_A_TERMINAL
-                                    || isDeletedNode) {
+                            if (!currentInfo.isTerminal() || isDeletedNode) {
                                 return FormatSpec.NOT_VALID_WORD;
                             } else {
                                 return ptNodePos;
diff --git a/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java
index bba1d43..a93a8bb 100644
--- a/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java
@@ -228,8 +228,6 @@
         }
     }
 
-    public void skipPtNode(final FormatOptions formatOptions);
-
     /**
      * @return whether this decoder has a valid binary dictionary that it can decode.
      */
diff --git a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
index ca4a2e9..8f73b27 100644
--- a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
+++ b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
@@ -107,24 +107,26 @@
     }
 
     /**
-     * PtNode is a group of characters, with a frequency, shortcut targets, bigrams, and children
-     * (Pt means Patricia Trie).
+     * PtNode is a group of characters, with probability information, shortcut targets, bigrams,
+     * and children (Pt means Patricia Trie).
      *
      * This is the central class of the in-memory representation. A PtNode is what can
      * be seen as a traditional "trie node", except it can hold several characters at the
      * same time. A PtNode essentially represents one or several characters in the middle
      * of the trie tree; as such, it can be a terminal, and it can have children.
      * In this in-memory representation, whether the PtNode is a terminal or not is represented
-     * in the frequency, where NOT_A_TERMINAL (= -1) means this is not a terminal and any other
-     * value is the frequency of this terminal. A terminal may have non-null shortcuts and/or
-     * bigrams, but a non-terminal may not. Moreover, children, if present, are null.
+     * by mProbabilityInfo. The PtNode is a terminal when the mProbabilityInfo is not null and the
+     * PtNode is not a terminal when the mProbabilityInfo is null. A terminal may have non-null
+     * shortcuts and/or bigrams, but a non-terminal may not. Moreover, children, if present,
+     * are non-null.
      */
     public static final class PtNode {
-        public static final int NOT_A_TERMINAL = -1;
+        private static final int NOT_A_TERMINAL = -1;
         final int mChars[];
         ArrayList<WeightedString> mShortcutTargets;
         ArrayList<WeightedString> mBigrams;
-        int mFrequency; // NOT_A_TERMINAL == mFrequency indicates this is not a terminal.
+        // null == mProbabilityInfo indicates this is not a terminal.
+        ProbabilityInfo mProbabilityInfo;
         int mTerminalId; // NOT_A_TERMINAL == mTerminalId indicates this is not a terminal.
         PtNodeArray mChildren;
         boolean mIsNotAWord; // Only a shortcut
@@ -140,11 +142,11 @@
         int mCachedAddressAfterUpdate; // The address of this PtNode (after update)
 
         public PtNode(final int[] chars, final ArrayList<WeightedString> shortcutTargets,
-                final ArrayList<WeightedString> bigrams, final int frequency,
+                final ArrayList<WeightedString> bigrams, final ProbabilityInfo probabilityInfo,
                 final boolean isNotAWord, final boolean isBlacklistEntry) {
             mChars = chars;
-            mFrequency = frequency;
-            mTerminalId = frequency;
+            mProbabilityInfo = probabilityInfo;
+            mTerminalId = probabilityInfo == null ? NOT_A_TERMINAL : probabilityInfo.mProbability;
             mShortcutTargets = shortcutTargets;
             mBigrams = bigrams;
             mChildren = null;
@@ -153,11 +155,11 @@
         }
 
         public PtNode(final int[] chars, final ArrayList<WeightedString> shortcutTargets,
-                final ArrayList<WeightedString> bigrams, final int frequency,
+                final ArrayList<WeightedString> bigrams, final ProbabilityInfo probabilityInfo,
                 final boolean isNotAWord, final boolean isBlacklistEntry,
                 final PtNodeArray children) {
             mChars = chars;
-            mFrequency = frequency;
+            mProbabilityInfo = probabilityInfo;
             mShortcutTargets = shortcutTargets;
             mBigrams = bigrams;
             mChildren = children;
@@ -177,11 +179,15 @@
         }
 
         public boolean isTerminal() {
-            return NOT_A_TERMINAL != mFrequency;
+            return mProbabilityInfo != null;
         }
 
-        public int getFrequency() {
-            return mFrequency;
+        public int getProbability() {
+            if (isTerminal()) {
+                return mProbabilityInfo.mProbability;
+            } else {
+                return NOT_A_TERMINAL;
+            }
         }
 
         public boolean getIsNotAWord() {
@@ -213,18 +219,18 @@
         }
 
         /**
-         * Adds a word to the bigram list. Updates the probability if the word already
+         * Adds a word to the bigram list. Updates the probability information if the word already
          * exists.
          */
-        public void addBigram(final String word, final int probability) {
+        public void addBigram(final String word, final ProbabilityInfo probabilityInfo) {
             if (mBigrams == null) {
                 mBigrams = new ArrayList<WeightedString>();
             }
             WeightedString bigram = getBigram(word);
             if (bigram != null) {
-                bigram.setProbability(probability);
+                bigram.mProbabilityInfo = probabilityInfo;
             } else {
-                bigram = new WeightedString(word, probability);
+                bigram = new WeightedString(word, probabilityInfo);
                 mBigrams.add(bigram);
             }
         }
@@ -270,12 +276,11 @@
          * the existing ones if any. Note: unigram, bigram, and shortcut frequencies are only
          * updated if they are higher than the existing ones.
          */
-        public void update(final int frequency, final ArrayList<WeightedString> shortcutTargets,
+        private void update(final ProbabilityInfo probabilityInfo,
+                final ArrayList<WeightedString> shortcutTargets,
                 final ArrayList<WeightedString> bigrams,
                 final boolean isNotAWord, final boolean isBlacklistEntry) {
-            if (frequency > mFrequency) {
-                mFrequency = frequency;
-            }
+            mProbabilityInfo = ProbabilityInfo.max(mProbabilityInfo, probabilityInfo);
             if (shortcutTargets != null) {
                 if (mShortcutTargets == null) {
                     mShortcutTargets = shortcutTargets;
@@ -286,8 +291,9 @@
                         final WeightedString existingShortcut = getShortcut(shortcut.mWord);
                         if (existingShortcut == null) {
                             mShortcutTargets.add(shortcut);
-                        } else if (existingShortcut.getProbability() < shortcut.getProbability()) {
-                            existingShortcut.setProbability(shortcut.getProbability());
+                        } else {
+                            existingShortcut.mProbabilityInfo = ProbabilityInfo.max(
+                                    existingShortcut.mProbabilityInfo, shortcut.mProbabilityInfo);
                         }
                     }
                 }
@@ -302,8 +308,9 @@
                         final WeightedString existingBigram = getBigram(bigram.mWord);
                         if (existingBigram == null) {
                             mBigrams.add(bigram);
-                        } else if (existingBigram.getProbability() < bigram.getProbability()) {
-                            existingBigram.setProbability(bigram.getProbability());
+                        } else {
+                            existingBigram.mProbabilityInfo = ProbabilityInfo.max(
+                                    existingBigram.mProbabilityInfo, bigram.mProbabilityInfo);
                         }
                     }
                 }
@@ -393,13 +400,13 @@
      * they will be added to the dictionary as necessary.
      *
      * @param word the word to add.
-     * @param frequency the frequency of the word, in the range [0..255].
+     * @param probabilityInfo probability information of the word.
      * @param shortcutTargets a list of shortcut targets for this word, or null.
      * @param isNotAWord true if this should not be considered a word (e.g. shortcut only)
      */
-    public void add(final String word, final int frequency,
+    public void add(final String word, final ProbabilityInfo probabilityInfo,
             final ArrayList<WeightedString> shortcutTargets, final boolean isNotAWord) {
-        add(getCodePoints(word), frequency, shortcutTargets, isNotAWord,
+        add(getCodePoints(word), probabilityInfo, shortcutTargets, isNotAWord,
                 false /* isBlacklistEntry */);
     }
 
@@ -412,7 +419,8 @@
      */
     public void addBlacklistEntry(final String word,
             final ArrayList<WeightedString> shortcutTargets, final boolean isNotAWord) {
-        add(getCodePoints(word), 0, shortcutTargets, isNotAWord, true /* isBlacklistEntry */);
+        add(getCodePoints(word), new ProbabilityInfo(0), shortcutTargets, isNotAWord,
+                true /* isBlacklistEntry */);
     }
 
     /**
@@ -438,21 +446,22 @@
      *
      * @param word0 the previous word of the context
      * @param word1 the next word of the context
-     * @param frequency the bigram frequency
+     * @param probabilityInfo the bigram probability info
      */
-    public void setBigram(final String word0, final String word1, final int frequency) {
+    public void setBigram(final String word0, final String word1,
+            final ProbabilityInfo probabilityInfo) {
         PtNode ptNode0 = findWordInTree(mRootNodeArray, word0);
         if (ptNode0 != null) {
             final PtNode ptNode1 = findWordInTree(mRootNodeArray, word1);
             if (ptNode1 == null) {
-                add(getCodePoints(word1), 0, null, false /* isNotAWord */,
+                add(getCodePoints(word1), new ProbabilityInfo(0), null, false /* isNotAWord */,
                         false /* isBlacklistEntry */);
                 // The PtNode for the first word may have moved by the above insertion,
                 // if word1 and word2 share a common stem that happens not to have been
                 // a cutting point until now. In this case, we need to refresh ptNode.
                 ptNode0 = findWordInTree(mRootNodeArray, word0);
             }
-            ptNode0.addBigram(word1, frequency);
+            ptNode0.addBigram(word1, probabilityInfo);
         } else {
             throw new RuntimeException("First word of bigram not found " + word0);
         }
@@ -465,15 +474,15 @@
      * an exception is thrown.
      *
      * @param word the word, as an int array.
-     * @param frequency the frequency of the word, in the range [0..255].
+     * @param probabilityInfo the probability information of the word.
      * @param shortcutTargets an optional list of shortcut targets for this word (null if none).
      * @param isNotAWord true if this is not a word for spellcheking purposes (shortcut only or so)
      * @param isBlacklistEntry true if this is a blacklisted word, false otherwise
      */
-    private void add(final int[] word, final int frequency,
+    private void add(final int[] word, final ProbabilityInfo probabilityInfo,
             final ArrayList<WeightedString> shortcutTargets,
             final boolean isNotAWord, final boolean isBlacklistEntry) {
-        assert(frequency >= 0 && frequency <= 255);
+        assert(probabilityInfo.mProbability <= FormatSpec.MAX_TERMINAL_FREQUENCY);
         if (word.length >= Constants.DICTIONARY_MAX_WORD_LENGTH) {
             MakedictLog.w("Ignoring a word that is too long: word.length = " + word.length);
             return;
@@ -501,7 +510,8 @@
             // No node at this point to accept the word. Create one.
             final int insertionIndex = findInsertionIndex(currentNodeArray, word[charIndex]);
             final PtNode newPtNode = new PtNode(Arrays.copyOfRange(word, charIndex, word.length),
-                    shortcutTargets, null /* bigrams */, frequency, isNotAWord, isBlacklistEntry);
+                    shortcutTargets, null /* bigrams */, probabilityInfo, isNotAWord,
+                    isBlacklistEntry);
             currentNodeArray.mData.add(insertionIndex, newPtNode);
             if (DBG) checkStack(currentNodeArray);
         } else {
@@ -511,15 +521,15 @@
                     // The new word is a prefix of an existing word, but the node on which it
                     // should end already exists as is. Since the old PtNode was not a terminal,
                     // make it one by filling in its frequency and other attributes
-                    currentPtNode.update(frequency, shortcutTargets, null, isNotAWord,
+                    currentPtNode.update(probabilityInfo, shortcutTargets, null, isNotAWord,
                             isBlacklistEntry);
                 } else {
                     // The new word matches the full old word and extends past it.
                     // We only have to create a new node and add it to the end of this.
                     final PtNode newNode = new PtNode(
                             Arrays.copyOfRange(word, charIndex + differentCharIndex, word.length),
-                                    shortcutTargets, null /* bigrams */, frequency, isNotAWord,
-                                    isBlacklistEntry);
+                                    shortcutTargets, null /* bigrams */, probabilityInfo,
+                                    isNotAWord, isBlacklistEntry);
                     currentPtNode.mChildren = new PtNodeArray();
                     currentPtNode.mChildren.mData.add(newNode);
                 }
@@ -527,7 +537,7 @@
                 if (0 == differentCharIndex) {
                     // Exact same word. Update the frequency if higher. This will also add the
                     // new shortcuts to the existing shortcut list if it already exists.
-                    currentPtNode.update(frequency, shortcutTargets, null,
+                    currentPtNode.update(probabilityInfo, shortcutTargets, null,
                             currentPtNode.mIsNotAWord && isNotAWord,
                             currentPtNode.mIsBlacklistEntry || isBlacklistEntry);
                 } else {
@@ -537,7 +547,7 @@
                     final PtNode newOldWord = new PtNode(
                             Arrays.copyOfRange(currentPtNode.mChars, differentCharIndex,
                                     currentPtNode.mChars.length), currentPtNode.mShortcutTargets,
-                            currentPtNode.mBigrams, currentPtNode.mFrequency,
+                            currentPtNode.mBigrams, currentPtNode.mProbabilityInfo,
                             currentPtNode.mIsNotAWord, currentPtNode.mIsBlacklistEntry,
                             currentPtNode.mChildren);
                     newChildren.mData.add(newOldWord);
@@ -546,16 +556,17 @@
                     if (charIndex + differentCharIndex >= word.length) {
                         newParent = new PtNode(
                                 Arrays.copyOfRange(currentPtNode.mChars, 0, differentCharIndex),
-                                shortcutTargets, null /* bigrams */, frequency,
+                                shortcutTargets, null /* bigrams */, probabilityInfo,
                                 isNotAWord, isBlacklistEntry, newChildren);
                     } else {
                         newParent = new PtNode(
                                 Arrays.copyOfRange(currentPtNode.mChars, 0, differentCharIndex),
-                                null /* shortcutTargets */, null /* bigrams */, -1,
-                                false /* isNotAWord */, false /* isBlacklistEntry */, newChildren);
+                                null /* shortcutTargets */, null /* bigrams */,
+                                null /* probabilityInfo */, false /* isNotAWord */,
+                                false /* isBlacklistEntry */, newChildren);
                         final PtNode newWord = new PtNode(Arrays.copyOfRange(word,
                                 charIndex + differentCharIndex, word.length),
-                                shortcutTargets, null /* bigrams */, frequency,
+                                shortcutTargets, null /* bigrams */, probabilityInfo,
                                 isNotAWord, isBlacklistEntry);
                         final int addIndex = word[charIndex + differentCharIndex]
                                 > currentPtNode.mChars[differentCharIndex] ? 1 : 0;
@@ -617,8 +628,8 @@
     private static int findInsertionIndex(final PtNodeArray nodeArray, int character) {
         final ArrayList<PtNode> data = nodeArray.mData;
         final PtNode reference = new PtNode(new int[] { character },
-                null /* shortcutTargets */, null /* bigrams */, 0, false /* isNotAWord */,
-                false /* isBlacklistEntry */);
+                null /* shortcutTargets */, null /* bigrams */, null /* probabilityInfo */,
+                false /* isNotAWord */, false /* isBlacklistEntry */);
         int result = Collections.binarySearch(data, reference, PTNODE_COMPARATOR);
         return result >= 0 ? result : -result - 1;
     }
@@ -752,8 +763,9 @@
                         currentPos.length = mCurrentString.length();
                         mPositions.addLast(currentPos);
                     }
-                    if (currentPtNode.mFrequency >= 0) {
-                        return new WordProperty(mCurrentString.toString(), currentPtNode.mFrequency,
+                    if (currentPtNode.isTerminal()) {
+                        return new WordProperty(mCurrentString.toString(),
+                                currentPtNode.mProbabilityInfo,
                                 currentPtNode.mShortcutTargets, currentPtNode.mBigrams,
                                 currentPtNode.mIsNotAWord, currentPtNode.mIsBlacklistEntry);
                     }
diff --git a/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java b/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java
index dafbc04..9dcd63f 100644
--- a/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java
+++ b/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java
@@ -30,6 +30,21 @@
     public final int mLevel;
     public final int mCount;
 
+    public static ProbabilityInfo max(final ProbabilityInfo probabilityInfo1,
+            final ProbabilityInfo probabilityInfo2) {
+        if (probabilityInfo1 == null) {
+            return probabilityInfo2;
+        }
+        if (probabilityInfo2 == null) {
+            return probabilityInfo1;
+        }
+        if (probabilityInfo1.mProbability > probabilityInfo2.mProbability) {
+            return probabilityInfo1;
+        } else {
+            return probabilityInfo2;
+        }
+    }
+
     public ProbabilityInfo(final int probability) {
         this(probability, BinaryDictionary.NOT_A_VALID_TIMESTAMP, 0, 0);
     }
diff --git a/java/src/com/android/inputmethod/latin/makedict/PtNodeInfo.java b/java/src/com/android/inputmethod/latin/makedict/PtNodeInfo.java
index 188de7a..4760aa8 100644
--- a/java/src/com/android/inputmethod/latin/makedict/PtNodeInfo.java
+++ b/java/src/com/android/inputmethod/latin/makedict/PtNodeInfo.java
@@ -29,24 +29,28 @@
     public final int mEndAddress;
     public final int mFlags;
     public final int[] mCharacters;
-    public final int mFrequency;
+    public final ProbabilityInfo mProbabilityInfo;
     public final int mChildrenAddress;
     public final int mParentAddress;
     public final ArrayList<WeightedString> mShortcutTargets;
     public final ArrayList<PendingAttribute> mBigrams;
 
     public PtNodeInfo(final int originalAddress, final int endAddress, final int flags,
-            final int[] characters, final int frequency, final int parentAddress,
+            final int[] characters, final ProbabilityInfo probabilityInfo, final int parentAddress,
             final int childrenAddress, final ArrayList<WeightedString> shortcutTargets,
             final ArrayList<PendingAttribute> bigrams) {
         mOriginalAddress = originalAddress;
         mEndAddress = endAddress;
         mFlags = flags;
         mCharacters = characters;
-        mFrequency = frequency;
+        mProbabilityInfo = probabilityInfo;
         mParentAddress = parentAddress;
         mChildrenAddress = childrenAddress;
         mShortcutTargets = shortcutTargets;
         mBigrams = bigrams;
     }
+
+    public boolean isTerminal() {
+        return mProbabilityInfo != null;
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java
index d35f780..fd6138d 100644
--- a/java/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/Ver2DictDecoder.java
@@ -20,7 +20,6 @@
 import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding;
 import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer;
 import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions;
-import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode;
 import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
 
 import android.util.Log;
@@ -38,10 +37,82 @@
 public class Ver2DictDecoder extends AbstractDictDecoder {
     private static final String TAG = Ver2DictDecoder.class.getSimpleName();
 
-    protected static class PtNodeReader extends AbstractDictDecoder.PtNodeReader {
-        private static int readFrequency(final DictBuffer dictBuffer) {
+    /**
+     * A utility class for reading a PtNode.
+     */
+    protected static class PtNodeReader {
+        private static ProbabilityInfo readProbabilityInfo(final DictBuffer dictBuffer) {
+            // Ver2 dicts don't contain historical information.
+            return new ProbabilityInfo(dictBuffer.readUnsignedByte());
+        }
+
+        protected static int readPtNodeOptionFlags(final DictBuffer dictBuffer) {
             return dictBuffer.readUnsignedByte();
         }
+
+        protected static int readChildrenAddress(final DictBuffer dictBuffer,
+                final int ptNodeFlags) {
+            switch (ptNodeFlags & FormatSpec.MASK_CHILDREN_ADDRESS_TYPE) {
+                case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE:
+                    return dictBuffer.readUnsignedByte();
+                case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES:
+                    return dictBuffer.readUnsignedShort();
+                case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES:
+                    return dictBuffer.readUnsignedInt24();
+                case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS:
+                default:
+                    return FormatSpec.NO_CHILDREN_ADDRESS;
+            }
+        }
+
+        // Reads shortcuts and returns the read length.
+        protected static int readShortcut(final DictBuffer dictBuffer,
+                final ArrayList<WeightedString> shortcutTargets) {
+            final int pointerBefore = dictBuffer.position();
+            dictBuffer.readUnsignedShort(); // skip the size
+            while (true) {
+                final int targetFlags = dictBuffer.readUnsignedByte();
+                final String word = CharEncoding.readString(dictBuffer);
+                shortcutTargets.add(new WeightedString(word,
+                        targetFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY));
+                if (0 == (targetFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT)) break;
+            }
+            return dictBuffer.position() - pointerBefore;
+        }
+
+        protected static int readBigramAddresses(final DictBuffer dictBuffer,
+                final ArrayList<PendingAttribute> bigrams, final int baseAddress) {
+            int readLength = 0;
+            int bigramCount = 0;
+            while (bigramCount++ < FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) {
+                final int bigramFlags = dictBuffer.readUnsignedByte();
+                ++readLength;
+                final int sign = 0 == (bigramFlags & FormatSpec.FLAG_BIGRAM_ATTR_OFFSET_NEGATIVE)
+                        ? 1 : -1;
+                int bigramAddress = baseAddress + readLength;
+                switch (bigramFlags & FormatSpec.MASK_BIGRAM_ATTR_ADDRESS_TYPE) {
+                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_ONEBYTE:
+                        bigramAddress += sign * dictBuffer.readUnsignedByte();
+                        readLength += 1;
+                        break;
+                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_TWOBYTES:
+                        bigramAddress += sign * dictBuffer.readUnsignedShort();
+                        readLength += 2;
+                        break;
+                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_THREEBYTES:
+                        bigramAddress += sign * dictBuffer.readUnsignedInt24();
+                        readLength += 3;
+                        break;
+                    default:
+                        throw new RuntimeException("Has bigrams with no address");
+                }
+                bigrams.add(new PendingAttribute(
+                        bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY,
+                        bigramAddress));
+                if (0 == (bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT)) break;
+            }
+            return readLength;
+        }
     }
 
     protected final File mDictionaryBinaryFile;
@@ -95,8 +166,8 @@
         }
         final DictionaryHeader header = super.readHeader(mDictBuffer);
         final int version = header.mFormatOptions.mVersion;
-        if (!(version >= 2 && version <= 3)) {
-          throw new UnsupportedFormatException("File header has a wrong version : " + version);
+        if (version != FormatSpec.VERSION2) {
+            throw new UnsupportedFormatException("File header has a wrong version : " + version);
         }
         return header;
     }
@@ -108,12 +179,6 @@
         int addressPointer = ptNodePos;
         final int flags = PtNodeReader.readPtNodeOptionFlags(mDictBuffer);
         addressPointer += FormatSpec.PTNODE_FLAGS_SIZE;
-
-        final int parentAddress = PtNodeReader.readParentAddress(mDictBuffer, options);
-        if (BinaryDictIOUtils.supportsDynamicUpdate(options)) {
-            addressPointer += FormatSpec.PARENT_ADDRESS_SIZE;
-        }
-
         final int characters[];
         if (0 != (flags & FormatSpec.FLAG_HAS_MULTIPLE_CHARS)) {
             int index = 0;
@@ -133,14 +198,14 @@
             addressPointer += CharEncoding.getCharSize(character);
             characters = new int[] { character };
         }
-        final int frequency;
+        final ProbabilityInfo probabilityInfo;
         if (0 != (FormatSpec.FLAG_IS_TERMINAL & flags)) {
-            frequency = PtNodeReader.readFrequency(mDictBuffer);
+            probabilityInfo = PtNodeReader.readProbabilityInfo(mDictBuffer);
             addressPointer += FormatSpec.PTNODE_FREQUENCY_SIZE;
         } else {
-            frequency = PtNode.NOT_A_TERMINAL;
+            probabilityInfo = null;
         }
-        int childrenAddress = PtNodeReader.readChildrenAddress(mDictBuffer, flags, options);
+        int childrenAddress = PtNodeReader.readChildrenAddress(mDictBuffer, flags);
         if (childrenAddress != FormatSpec.NO_CHILDREN_ADDRESS) {
             childrenAddress += addressPointer;
         }
@@ -166,8 +231,8 @@
         } else {
             bigrams = null;
         }
-        return new PtNodeInfo(ptNodePos, addressPointer, flags, characters, frequency,
-                parentAddress, childrenAddress, shortcutTargets, bigrams);
+        return new PtNodeInfo(ptNodePos, addressPointer, flags, characters, probabilityInfo,
+                FormatSpec.NO_PARENT_ADDRESS, childrenAddress, shortcutTargets, bigrams);
     }
 
     @Override
@@ -223,40 +288,4 @@
     public boolean hasNextPtNodeArray() {
         return mDictBuffer.position() != FormatSpec.NO_FORWARD_LINK_ADDRESS;
     }
-
-    @Override
-    public void skipPtNode(final FormatOptions formatOptions) {
-        final int flags = PtNodeReader.readPtNodeOptionFlags(mDictBuffer);
-        PtNodeReader.readParentAddress(mDictBuffer, formatOptions);
-        BinaryDictIOUtils.skipString(mDictBuffer,
-                (flags & FormatSpec.FLAG_HAS_MULTIPLE_CHARS) != 0);
-        PtNodeReader.readChildrenAddress(mDictBuffer, flags, formatOptions);
-        if ((flags & FormatSpec.FLAG_IS_TERMINAL) != 0) PtNodeReader.readFrequency(mDictBuffer);
-        if ((flags & FormatSpec.FLAG_HAS_SHORTCUT_TARGETS) != 0) {
-            final int shortcutsSize = mDictBuffer.readUnsignedShort();
-            mDictBuffer.position(mDictBuffer.position() + shortcutsSize
-                    - FormatSpec.PTNODE_SHORTCUT_LIST_SIZE_SIZE);
-        }
-        if ((flags & FormatSpec.FLAG_HAS_BIGRAMS) != 0) {
-            int bigramCount = 0;
-            while (bigramCount++ < FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) {
-                final int bigramFlags = mDictBuffer.readUnsignedByte();
-                switch (bigramFlags & FormatSpec.MASK_BIGRAM_ATTR_ADDRESS_TYPE) {
-                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_ONEBYTE:
-                        mDictBuffer.readUnsignedByte();
-                        break;
-                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_TWOBYTES:
-                        mDictBuffer.readUnsignedShort();
-                        break;
-                    case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_THREEBYTES:
-                        mDictBuffer.readUnsignedInt24();
-                        break;
-                }
-                if ((bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT) == 0) break;
-            }
-            if (bigramCount >= FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) {
-                throw new RuntimeException("Too many bigrams in a PtNode.");
-            }
-        }
-    }
 }
diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
index 3de083e..634f631 100644
--- a/java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
@@ -227,7 +227,7 @@
             final PtNode target =
                     FusionDictionary.findWordInTree(dict.mRootNodeArray, bigram.mWord);
             final int addressOfBigram = target.mCachedAddressAfterUpdate;
-            final int unigramFrequencyForThisWord = target.mFrequency;
+            final int unigramFrequencyForThisWord = target.getProbability();
             final int offset = addressOfBigram
                     - (mPosition + FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE);
             final int bigramFlags = BinaryDictEncoderUtils.makeBigramFlags(bigramIterator.hasNext(),
@@ -251,7 +251,7 @@
         writePtNodeFlags(ptNode, formatOptions);
         writeParentPosition(parentPosition, ptNode, formatOptions);
         writeCharacters(ptNode.mChars, ptNode.hasSeveralChars());
-        writeFrequency(ptNode.mFrequency);
+        writeFrequency(ptNode.getProbability());
         writeChildrenPosition(ptNode, formatOptions);
         writeShortcuts(ptNode.mShortcutTargets);
         writeBigrams(ptNode.mBigrams, dict);
diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
index 8370748..1c74852 100644
--- a/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
@@ -81,14 +81,11 @@
 
         // Insert unigrams to the fusion dictionary.
         for (final WordProperty wordProperty : wordProperties) {
-            // TODO: Support probability that is -1.
-            final int probability = wordProperty.getProbability() < 0 ?
-                    0 : wordProperty.getProbability();
             if (wordProperty.mIsBlacklistEntry) {
                 fusionDict.addBlacklistEntry(wordProperty.mWord, wordProperty.mShortcutTargets,
                         wordProperty.mIsNotAWord);
             } else {
-                fusionDict.add(wordProperty.mWord, probability,
+                fusionDict.add(wordProperty.mWord, wordProperty.mProbabilityInfo,
                         wordProperty.mShortcutTargets, wordProperty.mIsNotAWord);
             }
         }
@@ -99,7 +96,7 @@
             }
             final String word0 = wordProperty.mWord;
             for (final WeightedString bigram : wordProperty.mBigrams) {
-                fusionDict.setBigram(word0, bigram.mWord, bigram.getProbability());
+                fusionDict.setBigram(word0, bigram.mWord, bigram.mProbabilityInfo);
             }
         }
         return fusionDict;
diff --git a/java/src/com/android/inputmethod/latin/makedict/WordProperty.java b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java
index b93a0a5..1fc61e1 100644
--- a/java/src/com/android/inputmethod/latin/makedict/WordProperty.java
+++ b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java
@@ -43,12 +43,12 @@
 
     private int mHashCode = 0;
 
-    public WordProperty(final String word, final int probability,
+    public WordProperty(final String word, final ProbabilityInfo probabilityInfo,
             final ArrayList<WeightedString> shortcutTargets,
             final ArrayList<WeightedString> bigrams,
             final boolean isNotAWord, final boolean isBlacklistEntry) {
         mWord = word;
-        mProbabilityInfo = new ProbabilityInfo(probability);
+        mProbabilityInfo = probabilityInfo;
         mShortcutTargets = shortcutTargets;
         mBigrams = bigrams;
         mIsNotAWord = isNotAWord;
diff --git a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
index fa5ae92..c87dd15 100644
--- a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
@@ -18,6 +18,7 @@
 
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Process;
 import android.preference.CheckBoxPreference;
@@ -32,6 +33,7 @@
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.debug.ExternalDictionaryGetterForDebug;
 import com.android.inputmethod.latin.utils.ApplicationUtils;
+import com.android.inputmethod.latin.utils.ResourceUtils;
 
 public final class DebugSettings extends PreferenceFragment
         implements SharedPreferences.OnSharedPreferenceChangeListener {
@@ -42,6 +44,14 @@
     public static final String PREF_STATISTICS_LOGGING = "enable_logging";
     public static final String PREF_USE_ONLY_PERSONALIZATION_DICTIONARY_FOR_DEBUG =
             "use_only_personalization_dictionary_for_debug";
+    public static final String PREF_KEY_PREVIEW_SHOW_UP_START_SCALE =
+            "pref_key_preview_show_up_start_scale";
+    public static final String PREF_KEY_PREVIEW_DISMISS_END_SCALE =
+            "pref_key_preview_dismiss_end_scale";
+    public static final String PREF_KEY_PREVIEW_SHOW_UP_DURATION =
+            "pref_key_preview_show_up_duration";
+    public static final String PREF_KEY_PREVIEW_DISMISS_DURATION =
+            "pref_key_preview_dismiss_duration";
     private static final String PREF_READ_EXTERNAL_DICTIONARY = "read_external_dictionary";
     private static final String PREF_DUMP_CONTACTS_DICT = "dump_contacts_dict";
     private static final String PREF_DUMP_USER_DICT = "dump_user_dict";
@@ -101,6 +111,17 @@
                 dictDumpPrefClickListener);
         findPreference(PREF_DUMP_PERSONALIZATION_DICT).setOnPreferenceClickListener(
                 dictDumpPrefClickListener);
+        final Resources res = getResources();
+        setupKeyPreviewAnimationDuration(prefs, res, PREF_KEY_PREVIEW_SHOW_UP_DURATION,
+                res.getInteger(R.integer.config_key_preview_show_up_duration));
+        setupKeyPreviewAnimationDuration(prefs, res, PREF_KEY_PREVIEW_DISMISS_DURATION,
+                res.getInteger(R.integer.config_key_preview_dismiss_duration));
+        setupKeyPreviewAnimationScale(prefs, res, PREF_KEY_PREVIEW_SHOW_UP_START_SCALE,
+                ResourceUtils.getFloatFromFraction(
+                        res, R.fraction.config_key_preview_show_up_start_scale));
+        setupKeyPreviewAnimationScale(prefs, res, PREF_KEY_PREVIEW_DISMISS_END_SCALE,
+                ResourceUtils.getFloatFromFraction(
+                        res, R.fraction.config_key_preview_dismiss_end_scale));
 
         mServiceNeedsRestart = false;
         mDebugMode = (CheckBoxPreference) findPreference(PREF_DEBUG_MODE);
@@ -180,4 +201,92 @@
             mDebugMode.setSummary(version);
         }
     }
+
+    private void setupKeyPreviewAnimationScale(final SharedPreferences sp, final Resources res,
+            final String prefKey, final float defaultValue) {
+        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey);
+        if (pref == null) {
+            return;
+        }
+        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
+            private static final float PERCENTAGE_FLOAT = 100.0f;
+
+            private float getValueFromPercentage(final int percentage) {
+                return percentage / PERCENTAGE_FLOAT;
+            }
+
+            private int getPercentageFromValue(final float floatValue) {
+                return (int)(floatValue * PERCENTAGE_FLOAT);
+            }
+
+            @Override
+            public void writeValue(final int value, final String key) {
+                sp.edit().putFloat(key, getValueFromPercentage(value)).apply();
+            }
+
+            @Override
+            public void writeDefaultValue(final String key) {
+                sp.edit().remove(key).apply();
+            }
+
+            @Override
+            public int readValue(final String key) {
+                return getPercentageFromValue(
+                        Settings.readKeyPreviewAnimationScale(sp, key, defaultValue));
+            }
+
+            @Override
+            public int readDefaultValue(final String key) {
+                return getPercentageFromValue(defaultValue);
+            }
+
+            @Override
+            public String getValueText(final int value) {
+                if (value < 0) {
+                    return res.getString(R.string.settings_system_default);
+                }
+                return String.format("%d%%", value);
+            }
+
+            @Override
+            public void feedbackValue(final int value) {}
+        });
+    }
+
+    private void setupKeyPreviewAnimationDuration(final SharedPreferences sp, final Resources res,
+            final String prefKey, final int defaultValue) {
+        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey);
+        if (pref == null) {
+            return;
+        }
+        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
+            @Override
+            public void writeValue(final int value, final String key) {
+                sp.edit().putInt(key, value).apply();
+            }
+
+            @Override
+            public void writeDefaultValue(final String key) {
+                sp.edit().remove(key).apply();
+            }
+
+            @Override
+            public int readValue(final String key) {
+                return Settings.readKeyPreviewAnimationDuration(sp, key, defaultValue);
+            }
+
+            @Override
+            public int readDefaultValue(final String key) {
+                return defaultValue;
+            }
+
+            @Override
+            public String getValueText(final int value) {
+                return res.getString(R.string.abbreviation_unit_milliseconds, value);
+            }
+
+            @Override
+            public void feedbackValue(final int value) {}
+        });
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/settings/Settings.java b/java/src/com/android/inputmethod/latin/settings/Settings.java
index 9bf269b..45c5b73 100644
--- a/java/src/com/android/inputmethod/latin/settings/Settings.java
+++ b/java/src/com/android/inputmethod/latin/settings/Settings.java
@@ -107,6 +107,9 @@
     public static final String PREF_EMOJI_CATEGORY_LAST_TYPED_ID = "emoji_category_last_typed_id";
     public static final String PREF_LAST_SHOWN_EMOJI_CATEGORY_ID = "last_shown_emoji_category_id";
 
+    private static final float UNDEFINED_PREFERENCE_VALUE_FLOAT = -1.0f;
+    private static final int UNDEFINED_PREFERENCE_VALUE_INT = -1;
+
     private Context mContext;
     private Resources mRes;
     private SharedPreferences mPrefs;
@@ -301,19 +304,27 @@
 
     public static float readKeypressSoundVolume(final SharedPreferences prefs,
             final Resources res) {
-        final float volume = prefs.getFloat(PREF_KEYPRESS_SOUND_VOLUME, -1.0f);
-        return (volume >= 0) ? volume : readDefaultKeypressSoundVolume(res);
+        final float volume = prefs.getFloat(
+                PREF_KEYPRESS_SOUND_VOLUME, UNDEFINED_PREFERENCE_VALUE_FLOAT);
+        return (volume != UNDEFINED_PREFERENCE_VALUE_FLOAT) ? volume
+                : readDefaultKeypressSoundVolume(res);
     }
 
+    // Default keypress sound volume for unknown devices.
+    // The negative value means system default.
+    private static final String DEFAULT_KEYPRESS_SOUND_VOLUME = Float.toString(-1.0f);
+
     public static float readDefaultKeypressSoundVolume(final Resources res) {
-        return Float.parseFloat(
-                ResourceUtils.getDeviceOverrideValue(res, R.array.keypress_volumes));
+        return Float.parseFloat(ResourceUtils.getDeviceOverrideValue(res,
+                R.array.keypress_volumes, DEFAULT_KEYPRESS_SOUND_VOLUME));
     }
 
     public static int readKeyLongpressTimeout(final SharedPreferences prefs,
             final Resources res) {
-        final int ms = prefs.getInt(PREF_KEY_LONGPRESS_TIMEOUT, -1);
-        return (ms >= 0) ? ms : readDefaultKeyLongpressTimeout(res);
+        final int milliseconds = prefs.getInt(
+                PREF_KEY_LONGPRESS_TIMEOUT, UNDEFINED_PREFERENCE_VALUE_INT);
+        return (milliseconds != UNDEFINED_PREFERENCE_VALUE_INT) ? milliseconds
+                : readDefaultKeyLongpressTimeout(res);
     }
 
     public static int readDefaultKeyLongpressTimeout(final Resources res) {
@@ -322,19 +333,37 @@
 
     public static int readKeypressVibrationDuration(final SharedPreferences prefs,
             final Resources res) {
-        final int ms = prefs.getInt(PREF_VIBRATION_DURATION_SETTINGS, -1);
-        return (ms >= 0) ? ms : readDefaultKeypressVibrationDuration(res);
+        final int milliseconds = prefs.getInt(
+                PREF_VIBRATION_DURATION_SETTINGS, UNDEFINED_PREFERENCE_VALUE_INT);
+        return (milliseconds != UNDEFINED_PREFERENCE_VALUE_INT) ? milliseconds
+                : readDefaultKeypressVibrationDuration(res);
     }
 
+    // Default keypress vibration duration for unknown devices.
+    // The negative value means system default.
+    private static final String DEFAULT_KEYPRESS_VIBRATION_DURATION = Integer.toString(-1);
+
     public static int readDefaultKeypressVibrationDuration(final Resources res) {
-        return Integer.parseInt(
-                ResourceUtils.getDeviceOverrideValue(res, R.array.keypress_vibration_durations));
+        return Integer.parseInt(ResourceUtils.getDeviceOverrideValue(res,
+                R.array.keypress_vibration_durations, DEFAULT_KEYPRESS_VIBRATION_DURATION));
     }
 
     public static boolean readUsabilityStudyMode(final SharedPreferences prefs) {
         return prefs.getBoolean(DebugSettings.PREF_USABILITY_STUDY_MODE, true);
     }
 
+    public static float readKeyPreviewAnimationScale(final SharedPreferences prefs,
+            final String prefKey, final float defaultValue) {
+        final float fraction = prefs.getFloat(prefKey, UNDEFINED_PREFERENCE_VALUE_FLOAT);
+        return (fraction != UNDEFINED_PREFERENCE_VALUE_FLOAT) ? fraction : defaultValue;
+    }
+
+    public static int readKeyPreviewAnimationDuration(final SharedPreferences prefs,
+            final String prefKey, final int defaultValue) {
+        final int milliseconds = prefs.getInt(prefKey, UNDEFINED_PREFERENCE_VALUE_INT);
+        return (milliseconds != UNDEFINED_PREFERENCE_VALUE_INT) ? milliseconds : defaultValue;
+    }
+
     public static boolean readUseFullscreenMode(final Resources res) {
         return res.getBoolean(R.bool.config_use_fullscreen_mode);
     }
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
index 2979544..90d3519 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
@@ -29,6 +29,7 @@
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.RichInputMethodManager;
 import com.android.inputmethod.latin.utils.AsyncResultHolder;
+import com.android.inputmethod.latin.utils.ResourceUtils;
 import com.android.inputmethod.latin.utils.TargetPackageInfoGetterTask;
 
 import java.util.Arrays;
@@ -93,6 +94,10 @@
 
     // Debug settings
     public final boolean mIsInternal;
+    public final int mKeyPreviewShowUpDuration;
+    public final int mKeyPreviewDismissDuration;
+    public final float mKeyPreviewShowUpStartScale;
+    public final float mKeyPreviewDismissEndScale;
 
     public SettingsValues(final Context context, final SharedPreferences prefs, final Resources res,
             final InputAttributes inputAttributes) {
@@ -149,6 +154,20 @@
         AdditionalFeaturesSettingUtils.readAdditionalFeaturesPreferencesIntoArray(
                 prefs, mAdditionalFeaturesSettingValues);
         mIsInternal = Settings.isInternal(prefs);
+        mKeyPreviewShowUpDuration = Settings.readKeyPreviewAnimationDuration(
+                prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_DURATION,
+                res.getInteger(R.integer.config_key_preview_show_up_duration));
+        mKeyPreviewDismissDuration = Settings.readKeyPreviewAnimationDuration(
+                prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_DURATION,
+                res.getInteger(R.integer.config_key_preview_dismiss_duration));
+        mKeyPreviewShowUpStartScale = Settings.readKeyPreviewAnimationScale(
+                prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_SCALE,
+                ResourceUtils.getFloatFromFraction(
+                        res, R.fraction.config_key_preview_show_up_start_scale));
+        mKeyPreviewDismissEndScale = Settings.readKeyPreviewAnimationScale(
+                prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_SCALE,
+                ResourceUtils.getFloatFromFraction(
+                        res, R.fraction.config_key_preview_dismiss_end_scale));
         mUseOnlyPersonalizationDictionaryForDebug = prefs.getBoolean(
                 DebugSettings.PREF_USE_ONLY_PERSONALIZATION_DICTIONARY_FOR_DEBUG, false);
         mDisplayOrientation = res.getConfiguration().orientation;
diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
index b96175f..2f4c183 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
@@ -209,10 +209,10 @@
                 final String word = mSuggestedWords.getWord(index);
                 final String info = mSuggestedWords.getDebugString(index);
                 final int indexInMoreSuggestions = index + SUGGESTION_CODE_BASE;
-                final Key key = new Key(
-                        params, word, info, KeyboardIconsSet.ICON_UNDEFINED, indexInMoreSuggestions,
-                        null /* outputText */, x, y, width, params.mDefaultRowHeight,
-                        0 /* labelFlags */, Key.BACKGROUND_TYPE_NORMAL);
+                final Key key = new Key(word, KeyboardIconsSet.ICON_UNDEFINED,
+                        indexInMoreSuggestions, null /* outputText */, info, 0 /* labelFlags */,
+                        Key.BACKGROUND_TYPE_NORMAL, x, y, width, params.mDefaultRowHeight,
+                        params.mHorizontalGap, params.mVerticalGap);
                 params.markAsEdgeKey(key, index);
                 params.onAddKey(key);
                 final int columnNumber = params.getColumnNumber(index);
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index a89f70e..4063edc 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -504,15 +504,9 @@
                 titleView, infoIcon, null, moreIcon, null);
         final CharSequence importantNoticeTitle = titleView.getText();
         titleView.setTextScaleX(1.0f); // Reset textScaleX.
-        // When the suggestions strip is displayed first time, stripWidth may be zero.
-        // Then importantNoticeTitle will be displayed as is without auto text scaleX.
-        // TODO: Fix the logic to always have a correct value of stripWidth.
-        if (width > 0) {
-            // Auto text scaleX to show entire important notice title should be on the strip.
-            final float titleScaleX = getTextScaleX(
-                    importantNoticeTitle, width, titleView.getPaint());
-            titleView.setTextScaleX(titleScaleX);
-        }
+        final float titleScaleX = getTextScaleX(
+                importantNoticeTitle, width, titleView.getPaint());
+        titleView.setTextScaleX(titleScaleX);
     }
 
     static void setLayoutWeight(final View v, final float weight, final int height) {
@@ -529,7 +523,7 @@
             final TextPaint paint) {
         paint.setTextScaleX(1.0f);
         final int width = getTextWidth(text, paint);
-        if (width <= maxWidth) {
+        if (width <= maxWidth || maxWidth <= 0) {
             return 1.0f;
         }
         return maxWidth / (float)width;
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index b04a2cb..68c891b 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -46,6 +46,7 @@
 import com.android.inputmethod.latin.define.ProductionFlag;
 import com.android.inputmethod.latin.suggestions.MoreSuggestions.MoreSuggestionsListener;
 import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.ImportantNoticeUtils;
 import com.android.inputmethod.research.ResearchLogger;
 
 import java.util.ArrayList;
@@ -220,11 +221,20 @@
         return false;
     }
 
-    // TODO: This method should be called after this View has been attached and displayed.
-    public void showImportantNoticeTitle() {
-        mLayoutHelper.layoutImportantNotice(mImportantNoticeStrip, getWidth());
+    // This method checks if we should show the important notice (checks on permanent storage if
+    // it has been shown once already or not, and if in the setup wizard). If applicable, it shows
+    // the notice. In all cases, it returns true if it was shown, false otherwise.
+    public boolean maybeShowImportantNoticeTitle() {
+        if (!ImportantNoticeUtils.hasNewImportantNotice(getContext())
+                || ImportantNoticeUtils.isInSystemSetupWizard(getContext())) {
+            return false;
+        }
+        final int width = getWidth();
+        if (width <= 0) return false;
+        mLayoutHelper.layoutImportantNotice(mImportantNoticeStrip, width);
         mStripVisibilityGroup.showImportantNoticeStrip();
         mImportantNoticeStrip.setOnClickListener(this);
+        return true;
     }
 
     public void clear() {
@@ -415,4 +425,11 @@
         super.onDetachedFromWindow();
         dismissMoreSuggestionsPanel();
     }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        // Called by the framework when the size is known. Show the important notice if applicable.
+        // This may be overriden by showing suggestions later, if applicable.
+        maybeShowImportantNoticeTitle();
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
index deb28a0..49f4929 100644
--- a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
@@ -67,7 +67,8 @@
         sBuildKeyValuesDebugString = "[" + TextUtils.join(" ", keyValuePairs) + "]";
     }
 
-    public static String getDeviceOverrideValue(final Resources res, final int overrideResId) {
+    public static String getDeviceOverrideValue(final Resources res, final int overrideResId,
+            final String defaultValue) {
         final int orientation = res.getConfiguration().orientation;
         final String key = overrideResId + "-" + orientation;
         if (sDeviceOverrideValueMap.containsKey(key)) {
@@ -86,23 +87,6 @@
             return overrideValue;
         }
 
-        String defaultValue = null;
-        try {
-            defaultValue = findDefaultConstant(overrideArray);
-            // The defaultValue might be an empty string.
-            if (defaultValue == null) {
-                Log.w(TAG, "Couldn't find override value nor default value:"
-                        + " resource="+ res.getResourceEntryName(overrideResId)
-                        + " build=" + sBuildKeyValuesDebugString);
-            } else {
-                Log.i(TAG, "Found default value:"
-                        + " resource="+ res.getResourceEntryName(overrideResId)
-                        + " build=" + sBuildKeyValuesDebugString
-                        + " default=" + defaultValue);
-            }
-        } catch (final DeviceOverridePatternSyntaxError e) {
-            Log.w(TAG, "Syntax error, ignored", e);
-        }
         sDeviceOverrideValueMap.put(key, defaultValue);
         return defaultValue;
     }
@@ -152,8 +136,7 @@
             }
             final String condition = conditionConstant.substring(0, posComma);
             if (condition.isEmpty()) {
-                // Default condition. The default condition should be searched by
-                // {@link #findConstantForDefault(String[])}.
+                Log.w(TAG, "Array element has no condition: " + conditionConstant);
                 continue;
             }
             try {
@@ -199,24 +182,6 @@
         return matchedAll;
     }
 
-    @UsedForTesting
-    static String findDefaultConstant(final String[] conditionConstantArray)
-            throws DeviceOverridePatternSyntaxError {
-        if (conditionConstantArray == null) {
-            return null;
-        }
-        for (final String condition : conditionConstantArray) {
-            final int posComma = condition.indexOf(',');
-            if (posComma < 0) {
-                throw new DeviceOverridePatternSyntaxError("Array element has no comma", condition);
-            }
-            if (posComma == 0) { // condition is empty.
-                return condition.substring(posComma + 1);
-            }
-        }
-        return null;
-    }
-
     public static int getDefaultKeyboardWidth(final Resources res) {
         final DisplayMetrics dm = res.getDisplayMetrics();
         return dm.widthPixels;
@@ -224,12 +189,13 @@
 
     public static int getDefaultKeyboardHeight(final Resources res) {
         final DisplayMetrics dm = res.getDisplayMetrics();
-        final String keyboardHeightString = getDeviceOverrideValue(res, R.array.keyboard_heights);
+        final String keyboardHeightInDp = getDeviceOverrideValue(
+                res, R.array.keyboard_heights, null /* defaultValue */);
         final float keyboardHeight;
-        if (TextUtils.isEmpty(keyboardHeightString)) {
+        if (TextUtils.isEmpty(keyboardHeightInDp)) {
             keyboardHeight = res.getDimension(R.dimen.config_default_keyboard_height);
         } else {
-            keyboardHeight = Float.parseFloat(keyboardHeightString) * dm.density;
+            keyboardHeight = Float.parseFloat(keyboardHeightInDp) * dm.density;
         }
         final float maxKeyboardHeight = res.getFraction(
                 R.fraction.config_max_keyboard_height, dm.heightPixels, dm.heightPixels);
@@ -260,6 +226,10 @@
         return dimension >= 0;
     }
 
+    public static float getFloatFromFraction(final Resources res, final int fractionResId) {
+        return res.getFraction(fractionResId, 1, 1);
+    }
+
     public static float getFraction(final TypedArray a, final int index, final float defValue) {
         final TypedValue value = a.peekValue(index);
         if (value == null || !isFractionValue(value)) {
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
index f0ab7f5..edeb6a6 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
@@ -218,6 +218,32 @@
                 "a|c", null, ICON_UNDEFINED, mCodeSettings);
     }
 
+    public void testCodes() {
+        assertParser("Hexadecimal code", "a|0x1000",
+                "a", null, ICON_UNDEFINED, 0x1000);
+        assertParserError("Illegal hexadecimal code", "a|0x100X",
+                "a", null, ICON_UNDEFINED, CODE_UNSPECIFIED);
+        assertParser("Escaped hexadecimal code 1", "a|\\0x1000",
+                "a", "0x1000", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
+        assertParser("Escaped hexadecimal code 2", "a|0\\x1000",
+                "a", "0x1000", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
+        assertParser("Escaped hexadecimal code 2", "a|0\\x1000",
+                "a", "0x1000", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
+        assertParserError("Illegally escaped hexadecimal code", "a|0x1\\000",
+                "a", null, ICON_UNDEFINED, CODE_UNSPECIFIED);
+        // This is a workaround to have a key that has a supplementary code point. We can't put a
+        // string in resource as a XML entity of a supplementary code point or a surrogate pair.
+        // TODO: Should pass this test.
+//        assertParser("Hexadecimal supplementary code", String.format("a|0x%06x", SURROGATE_CODE2),
+//                SURROGATE_PAIR2, null, ICON_UNDEFINED, SURROGATE_CODE2);
+        assertParser("Zero is treated as output text", "a|0",
+                "a", null, ICON_UNDEFINED, '0');
+        assertParser("Digit is treated as output text", "a|3",
+                "a", null, ICON_UNDEFINED, '3');
+        assertParser("Decimal number is treated as an output text", "a|2014",
+                "a", "2014", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
+    }
+
     public void testIcons() {
         assertParser("Icon with single letter", ICON_SETTINGS + "|a",
                 null, null, mSettingsIconId, 'a');
diff --git a/tests/src/com/android/inputmethod/latin/FusionDictionaryTests.java b/tests/src/com/android/inputmethod/latin/FusionDictionaryTests.java
index e211d94..cf528d0 100644
--- a/tests/src/com/android/inputmethod/latin/FusionDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/FusionDictionaryTests.java
@@ -20,6 +20,7 @@
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.latin.makedict.FusionDictionary;
+import com.android.inputmethod.latin.makedict.ProbabilityInfo;
 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray;
 
 import java.util.HashMap;
@@ -33,16 +34,16 @@
         FusionDictionary dict = new FusionDictionary(new PtNodeArray(),
                 new FusionDictionary.DictionaryOptions(new HashMap<String,String>()));
 
-        dict.add("abc", 10, null, false /* isNotAWord */);
+        dict.add("abc", new ProbabilityInfo(10), null, false /* isNotAWord */);
         assertNull(FusionDictionary.findWordInTree(dict.mRootNodeArray, "aaa"));
         assertNotNull(FusionDictionary.findWordInTree(dict.mRootNodeArray, "abc"));
 
-        dict.add("aa", 10, null, false /* isNotAWord */);
+        dict.add("aa", new ProbabilityInfo(10), null, false /* isNotAWord */);
         assertNull(FusionDictionary.findWordInTree(dict.mRootNodeArray, "aaa"));
         assertNotNull(FusionDictionary.findWordInTree(dict.mRootNodeArray, "aa"));
 
-        dict.add("babcd", 10, null, false /* isNotAWord */);
-        dict.add("bacde", 10, null, false /* isNotAWord */);
+        dict.add("babcd", new ProbabilityInfo(10), null, false /* isNotAWord */);
+        dict.add("bacde", new ProbabilityInfo(10), null, false /* isNotAWord */);
         assertNull(FusionDictionary.findWordInTree(dict.mRootNodeArray, "ba"));
         assertNotNull(FusionDictionary.findWordInTree(dict.mRootNodeArray, "babcd"));
         assertNotNull(FusionDictionary.findWordInTree(dict.mRootNodeArray, "bacde"));
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
index bc4452f..75a1aa3 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
@@ -151,8 +151,8 @@
                     shortcuts.add(new WeightedString(shortcut, UNIGRAM_FREQ));
                 }
             }
-            dict.add(word, UNIGRAM_FREQ, (shortcutMap == null) ? null : shortcuts,
-                    false /* isNotAWord */);
+            dict.add(word, new ProbabilityInfo(UNIGRAM_FREQ),
+                    (shortcutMap == null) ? null : shortcuts, false /* isNotAWord */);
         }
     }
 
@@ -162,7 +162,7 @@
         for (int i = 0; i < bigrams.size(); ++i) {
             final int w1 = bigrams.keyAt(i);
             for (int w2 : bigrams.valueAt(i)) {
-                dict.setBigram(words.get(w1), words.get(w2), BIGRAM_FREQ);
+                dict.setBigram(words.get(w1), words.get(w2), new ProbabilityInfo(BIGRAM_FREQ));
             }
         }
     }
diff --git a/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
index 1ae22e3..3eb7040 100644
--- a/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/ResourceUtilsTests.java
@@ -19,43 +19,10 @@
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.inputmethod.latin.utils.ResourceUtils.DeviceOverridePatternSyntaxError;
-
 import java.util.HashMap;
 
 @SmallTest
 public class ResourceUtilsTests extends AndroidTestCase {
-    public void testFindDefaultConstant() {
-        final String[] nullArray = null;
-        final String[] emptyArray = {};
-        final String[] array = {
-                "HARDWARE=grouper,0.3",
-                "HARDWARE=mako,0.4",
-                ",defaultValue1",
-                "HARDWARE=manta,0.2",
-                ",defaultValue2",
-        };
-
-        try {
-            assertNull(ResourceUtils.findDefaultConstant(nullArray));
-            assertNull(ResourceUtils.findDefaultConstant(emptyArray));
-            assertEquals(ResourceUtils.findDefaultConstant(array), "defaultValue1");
-        } catch (final DeviceOverridePatternSyntaxError e) {
-            fail(e.getMessage());
-        }
-
-        final String[] errorArray = {
-            "HARDWARE=grouper,0.3",
-            "no_comma"
-        };
-        try {
-            final String defaultValue = ResourceUtils.findDefaultConstant(errorArray);
-            fail("exception should be thrown: defaultValue=" + defaultValue);
-        } catch (final DeviceOverridePatternSyntaxError e) {
-            assertEquals("Array element has no comma: no_comma", e.getMessage());
-        }
-    }
-
     public void testFindConstantForKeyValuePairsSimple() {
         final HashMap<String,String> anyKeyValue = CollectionUtils.newHashMap();
         anyKeyValue.put("anyKey", "anyValue");
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/CombinedInputOutput.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/CombinedInputOutput.java
index 8d2f5fb..b6795ea 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/CombinedInputOutput.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/CombinedInputOutput.java
@@ -21,6 +21,7 @@
 import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions;
 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray;
 import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
+import com.android.inputmethod.latin.makedict.ProbabilityInfo;
 import com.android.inputmethod.latin.makedict.WordProperty;
 import com.android.inputmethod.latin.utils.CombinedFormatUtils;
 
@@ -112,7 +113,7 @@
 
         String line;
         String word = null;
-        int freq = 0;
+        ProbabilityInfo probabilityInfo = new ProbabilityInfo(0);
         boolean isNotAWord = false;
         ArrayList<WeightedString> bigrams = new ArrayList<WeightedString>();
         ArrayList<WeightedString> shortcuts = new ArrayList<WeightedString>();
@@ -121,9 +122,10 @@
             final String args[] = line.trim().split(",");
             if (args[0].matches(CombinedFormatUtils.WORD_TAG + "=.*")) {
                 if (null != word) {
-                    dict.add(word, freq, shortcuts.isEmpty() ? null : shortcuts, isNotAWord);
+                    dict.add(word, probabilityInfo, shortcuts.isEmpty() ? null : shortcuts,
+                            isNotAWord);
                     for (WeightedString s : bigrams) {
-                        dict.setBigram(word, s.mWord, s.getProbability());
+                        dict.setBigram(word, s.mWord, s.mProbabilityInfo);
                     }
                 }
                 if (!shortcuts.isEmpty()) shortcuts = new ArrayList<WeightedString>();
@@ -135,14 +137,19 @@
                     if (CombinedFormatUtils.WORD_TAG.equals(params[0])) {
                         word = params[1];
                     } else if (CombinedFormatUtils.PROBABILITY_TAG.equals(params[0])) {
-                        freq = Integer.parseInt(params[1]);
+                        probabilityInfo = new ProbabilityInfo(Integer.parseInt(params[1]),
+                                probabilityInfo.mTimestamp, probabilityInfo.mLevel,
+                                probabilityInfo.mCount);
                     } else if (CombinedFormatUtils.HISTORICAL_INFO_TAG.equals(params[0])) {
                         final String[] historicalInfoParams =
                                 params[1].split(CombinedFormatUtils.HISTORICAL_INFO_SEPARATOR);
                         if (historicalInfoParams.length != HISTORICAL_INFO_ELEMENT_COUNT) {
                             throw new RuntimeException("Wrong format (historical info) : " + line);
                         }
-                        // TODO: Use parsed historical info.
+                        probabilityInfo = new ProbabilityInfo(probabilityInfo.mProbability,
+                                Integer.parseInt(historicalInfoParams[0]),
+                                Integer.parseInt(historicalInfoParams[1]),
+                                Integer.parseInt(historicalInfoParams[2]));
                     } else if (CombinedFormatUtils.NOT_A_WORD_TAG.equals(params[0])) {
                         isNotAWord = "true".equals(params[1]);
                     }
@@ -168,34 +175,40 @@
                 }
             } else if (args[0].matches(CombinedFormatUtils.BIGRAM_TAG + "=.*")) {
                 String secondWordOfBigram = null;
-                int bigramFreq = 0;
+                ProbabilityInfo bigramProbabilityInfo = new ProbabilityInfo(0);
                 for (String param : args) {
                     final String params[] = param.split("=", 2);
                     if (2 != params.length) throw new RuntimeException("Wrong format : " + line);
                     if (CombinedFormatUtils.BIGRAM_TAG.equals(params[0])) {
                         secondWordOfBigram = params[1];
                     } else if (CombinedFormatUtils.PROBABILITY_TAG.equals(params[0])) {
-                        bigramFreq = Integer.parseInt(params[1]);
+                        bigramProbabilityInfo = new ProbabilityInfo(Integer.parseInt(params[1]),
+                                bigramProbabilityInfo.mTimestamp, bigramProbabilityInfo.mLevel,
+                                bigramProbabilityInfo.mCount);
                     }  else if (CombinedFormatUtils.HISTORICAL_INFO_TAG.equals(params[0])) {
                         final String[] historicalInfoParams =
                                 params[1].split(CombinedFormatUtils.HISTORICAL_INFO_SEPARATOR);
                         if (historicalInfoParams.length != HISTORICAL_INFO_ELEMENT_COUNT) {
                             throw new RuntimeException("Wrong format (historical info) : " + line);
                         }
-                        // TODO: Use parsed historical info.
+                        bigramProbabilityInfo = new ProbabilityInfo(
+                                bigramProbabilityInfo.mProbability,
+                                Integer.parseInt(historicalInfoParams[0]),
+                                Integer.parseInt(historicalInfoParams[1]),
+                                Integer.parseInt(historicalInfoParams[2]));
                     }
                 }
                 if (null != secondWordOfBigram) {
-                    bigrams.add(new WeightedString(secondWordOfBigram, bigramFreq));
+                    bigrams.add(new WeightedString(secondWordOfBigram, bigramProbabilityInfo));
                 } else {
                     throw new RuntimeException("Wrong format : " + line);
                 }
             }
         }
         if (null != word) {
-            dict.add(word, freq, shortcuts.isEmpty() ? null : shortcuts, isNotAWord);
+            dict.add(word, probabilityInfo, shortcuts.isEmpty() ? null : shortcuts, isNotAWord);
             for (WeightedString s : bigrams) {
-                dict.setBigram(word, s.mWord, s.getProbability());
+                dict.setBigram(word, s.mWord, s.mProbabilityInfo);
             }
         }
 
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Diff.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Diff.java
index 9947608..ce9b9f3 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Diff.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Diff.java
@@ -118,9 +118,10 @@
                 hasDifferences = true;
             } else {
                 // We found the word. Compare frequencies, shortcuts, bigrams
-                if (word0Property.getProbability() != word1PtNode.getFrequency()) {
+                if (word0Property.getProbability() != word1PtNode.getProbability()) {
                     System.out.println("Probability changed: " + word0Property.mWord + " "
-                            + word0Property.getProbability() + " -> " + word1PtNode.getFrequency());
+                            + word0Property.getProbability() + " -> "
+                            + word1PtNode.getProbability());
                     hasDifferences = true;
                 }
                 if (word0Property.mIsNotAWord != word1PtNode.getIsNotAWord()) {
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Info.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Info.java
index c1eb0f8..178df5c 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Info.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Info.java
@@ -72,7 +72,7 @@
             return;
         }
         System.out.println("Word: " + word);
-        System.out.println("  Freq: " + ptNode.getFrequency());
+        System.out.println("  Freq: " + ptNode.getProbability());
         if (ptNode.getIsNotAWord()) {
             System.out.println("  Is not a word");
         }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/XmlDictInputOutput.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/XmlDictInputOutput.java
index c6c60b8..2ac842a 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/XmlDictInputOutput.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/XmlDictInputOutput.java
@@ -20,6 +20,7 @@
 import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions;
 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray;
 import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
+import com.android.inputmethod.latin.makedict.ProbabilityInfo;
 import com.android.inputmethod.latin.makedict.WordProperty;
 
 import java.io.BufferedReader;
@@ -66,6 +67,7 @@
         private static final int START = 1;
         private static final int WORD = 2;
         private static final int UNKNOWN = 3;
+        private static final int SHORTCUT_ONLY_WORD_PROBABILITY = 1;
 
         FusionDictionary mDictionary;
         int mState; // the state of the parser
@@ -90,7 +92,8 @@
             final FusionDictionary dict = mDictionary;
             for (final String shortcutOnly : mShortcutsMap.keySet()) {
                 if (dict.hasWord(shortcutOnly)) continue;
-                dict.add(shortcutOnly, 1, mShortcutsMap.get(shortcutOnly), true /* isNotAWord */);
+                dict.add(shortcutOnly, new ProbabilityInfo(SHORTCUT_ONLY_WORD_PROBABILITY),
+                        mShortcutsMap.get(shortcutOnly), true /* isNotAWord */);
             }
             mDictionary = null;
             mShortcutsMap.clear();
@@ -138,7 +141,8 @@
         @Override
         public void endElement(String uri, String localName, String qName) {
             if (WORD == mState) {
-                mDictionary.add(mWord, mFreq, mShortcutsMap.get(mWord), false /* isNotAWord */);
+                mDictionary.add(mWord, new ProbabilityInfo(mFreq), mShortcutsMap.get(mWord),
+                        false /* isNotAWord */);
                 mState = START;
             }
         }
@@ -319,7 +323,7 @@
             final ArrayList<WeightedString> bigramList = bigramMap.get(firstWord);
             for (final WeightedString bigram : bigramList) {
                 if (!dict.hasWord(bigram.mWord)) continue;
-                dict.setBigram(firstWord, bigram.mWord, bigram.getProbability());
+                dict.setBigram(firstWord, bigram.mWord, bigram.mProbabilityInfo);
             }
         }
         return dict;
@@ -354,7 +358,6 @@
         }
         // TODO: use an XMLSerializer if this gets big
         destination.write("<wordlist format=\"2\"");
-        final HashMap<String, String> options = dict.mOptions.mAttributes;
         for (final String key : dict.mOptions.mAttributes.keySet()) {
             final String value = dict.mOptions.mAttributes.get(key);
             destination.write(" " + key + "=\"" + value + "\"");
diff --git a/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java b/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
index 9ed4dd5..69b49f0 100644
--- a/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
+++ b/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
@@ -24,6 +24,7 @@
 import com.android.inputmethod.latin.makedict.FusionDictionary;
 import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions;
 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray;
+import com.android.inputmethod.latin.makedict.ProbabilityInfo;
 import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 import com.android.inputmethod.latin.makedict.Ver2DictEncoder;
 
@@ -53,11 +54,11 @@
         testOptions.mAttributes.put(DictionaryHeader.DICTIONARY_LOCALE_KEY, LOCALE);
         testOptions.mAttributes.put(DictionaryHeader.DICTIONARY_ID_KEY, ID);
         final FusionDictionary dict = new FusionDictionary(new PtNodeArray(), testOptions);
-        dict.add("foo", TEST_FREQ, null, false /* isNotAWord */);
-        dict.add("fta", 1, null, false /* isNotAWord */);
-        dict.add("ftb", 1, null, false /* isNotAWord */);
-        dict.add("bar", 1, null, false /* isNotAWord */);
-        dict.add("fool", 1, null, false /* isNotAWord */);
+        dict.add("foo", new ProbabilityInfo(TEST_FREQ), null, false /* isNotAWord */);
+        dict.add("fta", new ProbabilityInfo(1), null, false /* isNotAWord */);
+        dict.add("ftb", new ProbabilityInfo(1), null, false /* isNotAWord */);
+        dict.add("bar", new ProbabilityInfo(1), null, false /* isNotAWord */);
+        dict.add("fool", new ProbabilityInfo(1), null, false /* isNotAWord */);
 
         final File dst = File.createTempFile("testGetRawDict", ".tmp");
         dst.deleteOnExit();
@@ -87,7 +88,7 @@
         assertEquals("Wrong id attribute", ID, resultDict.mOptions.mAttributes.get(
                 DictionaryHeader.DICTIONARY_ID_KEY));
         assertEquals("Dictionary can't be read back correctly",
-                FusionDictionary.findWordInTree(resultDict.mRootNodeArray, "foo").getFrequency(),
+                FusionDictionary.findWordInTree(resultDict.mRootNodeArray, "foo").getProbability(),
                 TEST_FREQ);
     }
 
diff --git a/tools/dicttool/tests/com/android/inputmethod/latin/makedict/BinaryDictEncoderFlattenTreeTests.java b/tools/dicttool/tests/com/android/inputmethod/latin/makedict/BinaryDictEncoderFlattenTreeTests.java
index c6e4976..283abcd 100644
--- a/tools/dicttool/tests/com/android/inputmethod/latin/makedict/BinaryDictEncoderFlattenTreeTests.java
+++ b/tools/dicttool/tests/com/android/inputmethod/latin/makedict/BinaryDictEncoderFlattenTreeTests.java
@@ -33,11 +33,11 @@
     public void testFlattenNodes() {
         final FusionDictionary dict = new FusionDictionary(new PtNodeArray(),
                 new DictionaryOptions(new HashMap<String, String>()));
-        dict.add("foo", 1, null, false /* isNotAWord */);
-        dict.add("fta", 1, null, false /* isNotAWord */);
-        dict.add("ftb", 1, null, false /* isNotAWord */);
-        dict.add("bar", 1, null, false /* isNotAWord */);
-        dict.add("fool", 1, null, false /* isNotAWord */);
+        dict.add("foo", new ProbabilityInfo(1), null, false /* isNotAWord */);
+        dict.add("fta", new ProbabilityInfo(1), null, false /* isNotAWord */);
+        dict.add("ftb", new ProbabilityInfo(1), null, false /* isNotAWord */);
+        dict.add("bar", new ProbabilityInfo(1), null, false /* isNotAWord */);
+        dict.add("fool", new ProbabilityInfo(1), null, false /* isNotAWord */);
         final ArrayList<PtNodeArray> result =
                 BinaryDictEncoderUtils.flattenTree(dict.mRootNodeArray);
         assertEquals(4, result.size());
diff --git a/tools/dicttool/tests/com/android/inputmethod/latin/makedict/FusionDictionaryTest.java b/tools/dicttool/tests/com/android/inputmethod/latin/makedict/FusionDictionaryTest.java
index 1915464..d0d47da 100644
--- a/tools/dicttool/tests/com/android/inputmethod/latin/makedict/FusionDictionaryTest.java
+++ b/tools/dicttool/tests/com/android/inputmethod/latin/makedict/FusionDictionaryTest.java
@@ -101,7 +101,7 @@
         prepare(time);
         for (int i = 0; i < sWords.size(); ++i) {
             System.out.println("Adding in pos " + i + " : " + dumpWord(sWords.get(i)));
-            dict.add(sWords.get(i), 180, null, false);
+            dict.add(sWords.get(i), new ProbabilityInfo(180), null, false);
             dumpDict(dict);
             checkDictionary(dict, sWords, i);
         }
diff --git a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
deleted file mode 100644
index 7a6284f..0000000
--- a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2012 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.internal;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.text.TextUtils;
-
-import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.Constants;
-import com.android.inputmethod.latin.utils.CollectionUtils;
-
-import java.util.HashMap;
-import java.util.Locale;
-
-/**
- * !!!!! DO NOT EDIT THIS FILE !!!!!
- *
- * This file is generated by tools/make-keyboard-text. The base template file is
- *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
- *
- * This file must be updated when any text resources in keyboard layout files have been changed.
- * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
- * and should be defined in
- *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
- *
- * To update this file, please run the following commands.
- *   $ cd $ANDROID_BUILD_TOP
- *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
- *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
- *
- * The updated source file will be generated to the following path (this file).
- *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
- *   KeyboardTextsSet.java
- */
-public final class KeyboardTextsSet {
-    public static final String PREFIX_TEXT = "!text/";
-    private static final char BACKSLASH = Constants.CODE_BACKSLASH;
-    private static final int MAX_STRING_REFERENCE_INDIRECTION = 10;
-
-    // Language to texts map.
-    private static final HashMap<String, String[]> sLanguageToTextsMap =
-            CollectionUtils.newHashMap();
-    private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap();
-
-    private String[] mTexts;
-    // Resource name to text map.
-    private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
-
-    public void setLocale(final Locale locale) {
-        final String language = locale.getLanguage();
-        mTexts = sLanguageToTextsMap.get(language);
-        if (mTexts == null) {
-            mTexts = LANGUAGE_DEFAULT;
-        }
-    }
-
-    public void loadStringResources(final Context context) {
-        final int referenceId = context.getApplicationInfo().labelRes;
-        loadStringResourcesInternal(context, RESOURCE_NAMES, referenceId);
-    }
-
-    @UsedForTesting
-    void loadStringResourcesInternal(final Context context, final String[] resourceNames,
-            final int referenceId) {
-        final Resources res = context.getResources();
-        final String packageName = res.getResourcePackageName(referenceId);
-        for (final String resName : resourceNames) {
-            final int resId = res.getIdentifier(resName, "string", packageName);
-            mResourceNameToTextsMap.put(resName, res.getString(resId));
-        }
-    }
-
-    public String getText(final String name) {
-        String text = mResourceNameToTextsMap.get(name);
-        if (text != null) {
-            return text;
-        }
-        final Integer id = sNameToIdsMap.get(name);
-        if (id == null) throw new RuntimeException("Unknown label: " + name);
-        text = (id < mTexts.length) ? mTexts[id] : null;
-        return (text == null) ? LANGUAGE_DEFAULT[id] : text;
-    }
-
-    private static int searchTextNameEnd(final String text, final int start) {
-        final int size = text.length();
-        for (int pos = start; pos < size; pos++) {
-            final char c = text.charAt(pos);
-            // Label name should be consisted of [a-zA-Z_0-9].
-            if ((c >= 'a' && c <= 'z') || c == '_' || (c >= '0' && c <= '9')) {
-                continue;
-            }
-            return pos;
-        }
-        return size;
-    }
-
-    public String resolveTextReference(final String rawText) {
-        if (TextUtils.isEmpty(rawText)) {
-            return null;
-        }
-        int level = 0;
-        String text = rawText;
-        StringBuilder sb;
-        do {
-            level++;
-            if (level >= MAX_STRING_REFERENCE_INDIRECTION) {
-                throw new RuntimeException("too many @string/resource indirection: " + text);
-            }
-
-            final int prefixLen = PREFIX_TEXT.length();
-            final int size = text.length();
-            if (size < prefixLen) {
-                return TextUtils.isEmpty(text) ? null : text;
-            }
-
-            sb = null;
-            for (int pos = 0; pos < size; pos++) {
-                final char c = text.charAt(pos);
-                if (text.startsWith(PREFIX_TEXT, pos)) {
-                    if (sb == null) {
-                        sb = new StringBuilder(text.substring(0, pos));
-                    }
-                    final int end = searchTextNameEnd(text, pos + prefixLen);
-                    final String name = text.substring(pos + prefixLen, end);
-                    sb.append(getText(name));
-                    pos = end - 1;
-                } else if (c == BACKSLASH) {
-                    if (sb != null) {
-                        // Append both escape character and escaped character.
-                        sb.append(text.substring(pos, Math.min(pos + 2, size)));
-                    }
-                    pos++;
-                } else if (sb != null) {
-                    sb.append(c);
-                }
-            }
-
-            if (sb != null) {
-                text = sb.toString();
-            }
-        } while (sb != null);
-        return TextUtils.isEmpty(text) ? null : text;
-    }
-
-    // These texts' name should be aligned with the @string/<name> in
-    // values*/strings-action-keys.xml.
-    private static final String[] RESOURCE_NAMES = {
-        // Labels for action.
-        "label_go_key",
-        "label_send_key",
-        "label_next_key",
-        "label_done_key",
-        "label_previous_key",
-        // Other labels.
-        "label_pause_key",
-        "label_wait_key",
-    };
-
-    private static final String[] NAMES = {
-        /* @NAMES@ */
-    };
-
-    private static final String EMPTY = "";
-
-    /* Default texts */
-    private static final String[] LANGUAGE_DEFAULT = {
-        /* @DEFAULT_TEXTS@ */
-    };
-
-    /* @TEXTS@ */
-    // TODO: Use the language + "_" + region representation for the locale string key.
-    // Currently we are dropping the region from the key.
-    private static final Object[] LANGUAGES_AND_TEXTS = {
-        /* @LANGUAGES_AND_TEXTS@ */
-    };
-
-    static {
-        int id = 0;
-        for (final String name : NAMES) {
-            sNameToIdsMap.put(name, id++);
-        }
-
-        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
-            final String language = (String)LANGUAGES_AND_TEXTS[i];
-            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
-            sLanguageToTextsMap.put(language, texts);
-        }
-    }
-}
diff --git a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
new file mode 100644
index 0000000..d95de29
--- /dev/null
+++ b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
@@ -0,0 +1,94 @@
+/*
+ * 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.internal;
+
+import com.android.inputmethod.latin.utils.CollectionUtils;
+
+import java.util.HashMap;
+
+/**
+ * !!!!! DO NOT EDIT THIS FILE !!!!!
+ *
+ * This file is generated by tools/make-keyboard-text. The base template file is
+ *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
+ *
+ * This file must be updated when any text resources in keyboard layout files have been changed.
+ * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
+ * and should be defined in
+ *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
+ *
+ * To update this file, please run the following commands.
+ *   $ cd $ANDROID_BUILD_TOP
+ *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
+ *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
+ *
+ * The updated source file will be generated to the following path (this file).
+ *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
+ *   KeyboardTextsTable.java
+ */
+public final class KeyboardTextsTable {
+    // Name to index map.
+    private static final HashMap<String, Integer> sNameToIndexesMap = CollectionUtils.newHashMap();
+    // Language to texts map.
+    private static final HashMap<String, String[]> sLanguageToTextsMap =
+            CollectionUtils.newHashMap();
+
+    public static String getText(final String name, final String[] textsTable) {
+        final Integer indexObj = sNameToIndexesMap.get(name);
+        if (indexObj == null) {
+            throw new RuntimeException("Unknown text name: " + name);
+        }
+        final int index = indexObj;
+        final String text = (index < textsTable.length) ? textsTable[index] : null;
+        return (text != null) ? text : LANGUAGE_DEFAULT[index];
+    }
+
+    public static String[] getTextsTable(final String language) {
+        final String[] textsTable = sLanguageToTextsMap.get(language);
+        return textsTable != null ? textsTable : LANGUAGE_DEFAULT;
+    }
+
+    private static final String[] NAMES = {
+        /* @NAMES@ */
+    };
+
+    private static final String EMPTY = "";
+
+    /* Default texts */
+    private static final String[] LANGUAGE_DEFAULT = {
+        /* @DEFAULT_TEXTS@ */
+    };
+
+    /* @TEXTS@ */
+    // TODO: Use the language + "_" + region representation for the locale string key.
+    // Currently we are dropping the region from the key.
+    private static final Object[] LANGUAGES_AND_TEXTS = {
+        /* @LANGUAGES_AND_TEXTS@ */
+    };
+
+    static {
+        for (int index = 0; index < NAMES.length; index++) {
+            sNameToIndexesMap.put(NAMES[index], index);
+        }
+
+        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
+            final String language = (String)LANGUAGES_AND_TEXTS[i];
+            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
+            sLanguageToTextsMap.put(language, texts);
+        }
+    }
+}
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 2b7ef7c..46eab57 100644
--- a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
@@ -196,8 +196,8 @@
     <string name="shortcut_as_more_key">!icon/shortcut_key|!code/key_shortcut</string>
     <string name="action_next_as_more_key">!hasLabels!,\@string/label_next_key|!code/key_action_next</string>
     <string name="action_previous_as_more_key">!hasLabels!,\@string/label_previous_key|!code/key_action_previous</string>
-    <!-- Label for "switch to more symbol" modifier key.  Must be short to fit on key! -->
-    <string name="label_to_more_symbol_key">= \\ &lt;</string>
+    <!-- Label for "switch to more symbol" modifier key ("= \ <"). Must be short to fit on key! -->
+    <string name="label_to_more_symbol_key">= \\\\ &lt;</string>
     <!-- Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key! -->
     <string name="label_to_more_symbol_for_tablet_key">~ [ &lt;</string>
     <!-- Label for "Tab" key.  Must be short to fit on key! -->
diff --git a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
index a883830..dddb3d6 100644
--- a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
+++ b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
@@ -32,7 +32,7 @@
 public class MoreKeysResources {
     private static final String TEXT_RESOURCE_NAME = "donottranslate-more-keys.xml";
 
-    private static final String JAVA_TEMPLATE = "KeyboardTextsSet.tmpl";
+    private static final String JAVA_TEMPLATE = "KeyboardTextsTable.tmpl";
     private static final String MARK_NAMES = "@NAMES@";
     private static final String MARK_DEFAULT_TEXTS = "@DEFAULT_TEXTS@";
     private static final String MARK_TEXTS = "@TEXTS@";