From 09e44093f2430677d2528bd5883ea82ed0185b02 Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Mon, 26 Oct 2015 08:53:56 -0700 Subject: [PATCH 1/7] Import translations. DO NOT MERGE Change-Id: I64dabfa1cb5e4b6d86a6a2cb358406ce7375141c Auto-generated-cl: translation import --- java/res/values-fa/strings-emoji-descriptions.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/values-fa/strings-emoji-descriptions.xml b/java/res/values-fa/strings-emoji-descriptions.xml index e10689dad..37ecffd2c 100644 --- a/java/res/values-fa/strings-emoji-descriptions.xml +++ b/java/res/values-fa/strings-emoji-descriptions.xml @@ -582,7 +582,7 @@ "پیمایش" "یادداشت" "گوشی تلفن" - "پیجر" + "پی‌جو" "دستگاه نمابر" "آنتن ماهواره" "بلندگوی جارچی" From 2d9c8a85c6fdf40acbb3ded8c3504a9a307a54a4 Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Mon, 26 Oct 2015 08:56:33 -0700 Subject: [PATCH 2/7] Import translations. DO NOT MERGE Change-Id: If5c9898e482ef2a23bc145fdc12eab6fccbd93d3 Auto-generated-cl: translation import --- java/res/values-fa/strings.xml | 2 +- java/res/values-ky-rKG/strings.xml | 2 +- java/res/values-ne-rNP/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index 86fc672d7..10895cb3e 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -95,7 +95,7 @@ "برای ذخیره اینجا را لمس کنید" "دیکشنری موجود است" "طرح زمینه صفحه‌کلید" - "جابه‌جایی بین حساب‌ها" + "رفتن به حساب دیگر" "هیچ حسابی انتخاب نشده است" "در حال حاضر در حال استفاده از %1$s" "تأیید" diff --git a/java/res/values-ky-rKG/strings.xml b/java/res/values-ky-rKG/strings.xml index 3ef2b44e2..aa145f60e 100644 --- a/java/res/values-ky-rKG/strings.xml +++ b/java/res/values-ky-rKG/strings.xml @@ -89,7 +89,7 @@ "Үн менен киргизүү ыкмаларынын бири да иштетилген эмес. Тил & киргизүү жөндөөлөрүн текшериңиз." "Дайндрд киргзүү ыкмалрн конфигрцлоо" "Тилдер" - "Жардам & жооп пикир" + "Жардам жана жооп пикир" "Тилдер" "Сактоо үчүн кайра тийип коюңуз" "Сактоо үчүн бул жерди басыңыз" diff --git a/java/res/values-ne-rNP/strings.xml b/java/res/values-ne-rNP/strings.xml index 23b8f53c0..6170d4fa1 100644 --- a/java/res/values-ne-rNP/strings.xml +++ b/java/res/values-ne-rNP/strings.xml @@ -40,7 +40,7 @@ "अहिले सिंक गर्नुहोस्" "क्लाउड डेटा मेटाउनुहोस्" "Google बाट तपाईँको सिङ्क गरिएको डाटा मेटाउँछ" - "तपाईंको सिंक गरिएको डेटालाई क्लाउडबाट मेटाइनेछ। के तपाईं निश्चित हुनुहुन्छ?" + "तपाईँको सिंक गरिएको डेटालाई क्लाउडबाट मेटाइनेछ। के तपाईँ निश्चित हुनुहुन्छ?" "मेटाउनुहोस्" "रद्द गर्नुहोस्" "तपाईँको व्यक्तिगत शब्दकोश सिंक गरेर Google सर्भरहरूमा जगेडा राखिने छ। शब्द आवृत्तिको तथ्याङ्क जानकारी हाम्रो उत्पादनहरू सुधार गर्न मद्दतका लागि संकलन हुन सक्छ। संग्रह र सबै जानकारीको प्रयोग "" Google को गोपनीयता नीति "" अनुरूप हुने छ।" From 9a438a325b28c8f8884737683237f829c7cb5a15 Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Fri, 23 Oct 2015 14:35:26 -0700 Subject: [PATCH 3/7] Fix AltR+1 -> ESC shortcuts bringing on-screen keyboard Change the way we decide whether we want to show on-screen keyboard by not only paying attention to modifiers, but also keeping track whether the key sequence started in the right state. We are still misfiring if user presses a non-modifier key and then our modifier hot-key, but such sequence is unlikely. Given the fact that we do not want to store too much state I believe this deficiency is acceptable. Bug: 25087681 Bug: 24142161 Change-Id: I1a6b5e8e903c27a87134a6c9a7cd474a0607d5c8 (cherry picked from commit 7c513455918a52bd28c1c8181cb2880db0973b4b) --- .../latin/EmojiAltPhysicalKeyDetector.java | 254 +++++++++++------- .../android/inputmethod/latin/LatinIME.java | 5 + 2 files changed, 158 insertions(+), 101 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/EmojiAltPhysicalKeyDetector.java b/java/src/com/android/inputmethod/latin/EmojiAltPhysicalKeyDetector.java index 2529424c0..8924e0a3d 100644 --- a/java/src/com/android/inputmethod/latin/EmojiAltPhysicalKeyDetector.java +++ b/java/src/com/android/inputmethod/latin/EmojiAltPhysicalKeyDetector.java @@ -18,14 +18,15 @@ package com.android.inputmethod.latin; import android.content.res.Resources; import android.util.Log; +import android.util.Pair; import android.view.KeyEvent; import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.latin.settings.Settings; -import java.util.HashMap; +import java.util.ArrayList; import java.util.HashSet; -import java.util.Map; +import java.util.List; import java.util.Set; import javax.annotation.Nonnull; @@ -35,28 +36,155 @@ import javax.annotation.Nonnull; */ final class EmojiAltPhysicalKeyDetector { private static final String TAG = "EmojiAltPhysicalKeyDetector"; + private static final boolean DEBUG = false; - private final Map mEmojiSwitcherMap; - private final Map mSymbolsShiftedSwitcherMap; - private final Map mCombinedSwitcherMap; + private List mHotKeysList; - // Set of keys codes that have been used as modifiers. - private Set mActiveModifiers; + private static class HotKeySet extends HashSet> { }; - public EmojiAltPhysicalKeyDetector(@Nonnull final Resources resources) { - mEmojiSwitcherMap = parseSwitchDefinition(resources, R.array.keyboard_switcher_emoji); - mSymbolsShiftedSwitcherMap = parseSwitchDefinition( - resources, R.array.keyboard_switcher_symbols_shifted); - mCombinedSwitcherMap = new HashMap<>(); - mCombinedSwitcherMap.putAll(mEmojiSwitcherMap); - mCombinedSwitcherMap.putAll(mSymbolsShiftedSwitcherMap); - mActiveModifiers = new HashSet<>(); + private abstract class EmojiHotKeys { + private final String mName; + private final HotKeySet mKeySet; + + boolean mCanFire; + int mMetaState; + + public EmojiHotKeys(final String name, HotKeySet keySet) { + mName = name; + mKeySet = keySet; + mCanFire = false; + } + + public void onKeyDown(@Nonnull final KeyEvent keyEvent) { + if (DEBUG) { + Log.d(TAG, "EmojiHotKeys.onKeyDown() - " + mName + " - considering " + keyEvent); + } + + final Pair key = + Pair.create(keyEvent.getKeyCode(), keyEvent.getMetaState()); + if (mKeySet.contains(key)) { + if (DEBUG) { + Log.d(TAG, "EmojiHotKeys.onKeyDown() - " + mName + " - enabling action"); + } + mCanFire = true; + mMetaState = keyEvent.getMetaState(); + } else if (mCanFire) { + if (DEBUG) { + Log.d(TAG, "EmojiHotKeys.onKeyDown() - " + mName + " - disabling action"); + } + mCanFire = false; + } + } + + public void onKeyUp(@Nonnull final KeyEvent keyEvent) { + if (DEBUG) { + Log.d(TAG, "EmojiHotKeys.onKeyUp() - " + mName + " - considering " + keyEvent); + } + + final int keyCode = keyEvent.getKeyCode(); + int metaState = keyEvent.getMetaState(); + if (KeyEvent.isModifierKey(keyCode)) { + // Try restoring meta stat in case the released key was a modifier. + // I am sure one can come up with scenarios to break this, but it + // seems to work well in practice. + metaState |= mMetaState; + } + + final Pair key = Pair.create(keyCode, metaState); + if (mKeySet.contains(key)) { + if (mCanFire) { + if (!keyEvent.isCanceled()) { + if (DEBUG) { + Log.d(TAG, "EmojiHotKeys.onKeyUp() - " + mName + " - firing action"); + } + action(); + } else { + // This key up event was a part of key combinations and + // should be ignored. + if (DEBUG) { + Log.d(TAG, "EmojiHotKeys.onKeyUp() - " + mName + " - canceled, ignoring action"); + } + } + mCanFire = false; + } + } + + if (mCanFire) { + if (DEBUG) { + Log.d(TAG, "EmojiHotKeys.onKeyUp() - " + mName + " - disabling action"); + } + mCanFire = false; + } + } + + protected abstract void action(); } - private static Map parseSwitchDefinition( - @Nonnull final Resources resources, - final int resourceId) { - final Map definition = new HashMap<>(); + public EmojiAltPhysicalKeyDetector(@Nonnull final Resources resources) { + mHotKeysList = new ArrayList(); + + final HotKeySet emojiSwitchSet = parseHotKeys( + resources, R.array.keyboard_switcher_emoji); + final EmojiHotKeys emojiHotKeys = new EmojiHotKeys("emoji", emojiSwitchSet) { + @Override + protected void action() { + final KeyboardSwitcher switcher = KeyboardSwitcher.getInstance(); + switcher.onToggleKeyboard(KeyboardSwitcher.KeyboardSwitchState.EMOJI); + } + }; + mHotKeysList.add(emojiHotKeys); + + final HotKeySet symbolsSwitchSet = parseHotKeys( + resources, R.array.keyboard_switcher_symbols_shifted); + final EmojiHotKeys symbolsHotKeys = new EmojiHotKeys("symbols", symbolsSwitchSet) { + @Override + protected void action() { + final KeyboardSwitcher switcher = KeyboardSwitcher.getInstance(); + switcher.onToggleKeyboard(KeyboardSwitcher.KeyboardSwitchState.SYMBOLS_SHIFTED); + } + }; + mHotKeysList.add(symbolsHotKeys); + } + + public void onKeyDown(@Nonnull final KeyEvent keyEvent) { + if (DEBUG) { + Log.d(TAG, "onKeyDown(): " + keyEvent); + } + + if (shouldProcessEvent(keyEvent)) { + for (EmojiHotKeys hotKeys : mHotKeysList) { + hotKeys.onKeyDown(keyEvent); + } + } + } + + public void onKeyUp(@Nonnull final KeyEvent keyEvent) { + if (DEBUG) { + Log.d(TAG, "onKeyUp(): " + keyEvent); + } + + if (shouldProcessEvent(keyEvent)) { + for (EmojiHotKeys hotKeys : mHotKeysList) { + hotKeys.onKeyUp(keyEvent); + } + } + } + + private static boolean shouldProcessEvent(@Nonnull final KeyEvent keyEvent) { + if (!Settings.getInstance().getCurrent().mEnableEmojiAltPhysicalKey) { + // The feature is disabled. + if (DEBUG) { + Log.d(TAG, "shouldProcessEvent(): Disabled"); + } + return false; + } + + return true; + } + + private static HotKeySet parseHotKeys( + @Nonnull final Resources resources, final int resourceId) { + final HotKeySet keySet = new HotKeySet(); final String name = resources.getResourceEntryName(resourceId); final String[] values = resources.getStringArray(resourceId); for (int i = 0; values != null && i < values.length; i++) { @@ -65,91 +193,15 @@ final class EmojiAltPhysicalKeyDetector { Log.w(TAG, "Expected 2 integers in " + name + "[" + i + "] : " + values[i]); } try { - definition.put(Integer.parseInt(valuePair[0]), Integer.parseInt(valuePair[1])); + final Integer keyCode = Integer.parseInt(valuePair[0]); + final Integer metaState = Integer.parseInt(valuePair[1]); + final Pair key = Pair.create( + keyCode, KeyEvent.normalizeMetaState(metaState)); + keySet.add(key); } catch (NumberFormatException e) { Log.w(TAG, "Failed to parse " + name + "[" + i + "] : " + values[i], e); } } - return definition; - } - - /** - * Determine whether an up key event came from a mapped modifier key. - * - * @param keyEvent an up key event. - */ - public void onKeyUp(@Nonnull final KeyEvent keyEvent) { - Log.d(TAG, "onKeyUp() : " + keyEvent); - if (!Settings.getInstance().getCurrent().mEnableEmojiAltPhysicalKey) { - // The feature is disabled. - Log.d(TAG, "onKeyUp() : Disabled"); - return; - } - if (keyEvent.isCanceled()) { - // This key up event was a part of key combinations and should be ignored. - Log.d(TAG, "onKeyUp() : Canceled"); - return; - } - final Integer mappedModifier = getMappedModifier(keyEvent); - if (mappedModifier != null) { - // If the key was modified by a mapped key, then ignore the next time - // the same modifier key comes up. - Log.d(TAG, "onKeyUp() : Using Modifier: " + mappedModifier); - mActiveModifiers.add(mappedModifier); - return; - } - final int keyCode = keyEvent.getKeyCode(); - if (mActiveModifiers.contains(keyCode)) { - // Used as a modifier, not a standalone key press. - Log.d(TAG, "onKeyUp() : Used as Modifier: " + keyCode); - mActiveModifiers.remove(keyCode); - return; - } - if (!isMappedKeyCode(keyEvent)) { - // Nothing special about this key. - Log.d(TAG, "onKeyUp() : Not Mapped: " + keyCode); - return; - } - final KeyboardSwitcher switcher = KeyboardSwitcher.getInstance(); - if (mEmojiSwitcherMap.keySet().contains(keyCode)) { - switcher.onToggleKeyboard(KeyboardSwitcher.KeyboardSwitchState.EMOJI); - } else if (mSymbolsShiftedSwitcherMap.keySet().contains(keyCode)) { - switcher.onToggleKeyboard(KeyboardSwitcher.KeyboardSwitchState.SYMBOLS_SHIFTED); - } else { - Log.w(TAG, "Cannot toggle on keyCode: " + keyCode); - } - } - - /** - * @param keyEvent pressed key event - * @return true iff the user pressed a mapped modifier key. - */ - private boolean isMappedKeyCode(@Nonnull final KeyEvent keyEvent) { - return mCombinedSwitcherMap.get(keyEvent.getKeyCode()) != null; - } - - /** - * @param keyEvent pressed key event - * @return the mapped modifier used with this key opress, if any. - */ - private Integer getMappedModifier(@Nonnull final KeyEvent keyEvent) { - final int keyCode = keyEvent.getKeyCode(); - final int metaState = keyEvent.getMetaState(); - for (int mappedKeyCode : mCombinedSwitcherMap.keySet()) { - if (keyCode == mappedKeyCode) { - Log.d(TAG, "getMappedModifier() : KeyCode = MappedKeyCode = " + mappedKeyCode); - continue; - } - final Integer mappedMeta = mCombinedSwitcherMap.get(mappedKeyCode); - if (mappedMeta == null || mappedMeta.intValue() == -1) { - continue; - } - if ((metaState & mappedMeta) != 0) { - Log.d(TAG, "getMappedModifier() : MetaState(" + metaState - + ") contains MappedMeta(" + mappedMeta + ")"); - return mappedKeyCode; - } - } - return null; + return keySet; } } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 25a5de250..e02dbccd4 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1650,6 +1650,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // Hooks for hardware keyboard @Override public boolean onKeyDown(final int keyCode, final KeyEvent keyEvent) { + if (mEmojiAltPhysicalKeyDetector == null) { + mEmojiAltPhysicalKeyDetector = new EmojiAltPhysicalKeyDetector( + getApplicationContext().getResources()); + } + mEmojiAltPhysicalKeyDetector.onKeyDown(keyEvent); if (!ProductionFlags.IS_HARDWARE_KEYBOARD_SUPPORTED) { return super.onKeyDown(keyCode, keyEvent); } From 191ec804237a86a1848210af451158df9be9f82c Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Wed, 11 Nov 2015 05:31:11 -0800 Subject: [PATCH 4/7] Import translations. DO NOT MERGE Change-Id: I856b3184faf72ef8d16d849046d6fb7f05e8c67f Auto-generated-cl: translation import --- java/res/values-da/strings-emoji-descriptions.xml | 2 +- java/res/values-fa/strings-emoji-descriptions.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/res/values-da/strings-emoji-descriptions.xml b/java/res/values-da/strings-emoji-descriptions.xml index afe0060af..8937ef459 100644 --- a/java/res/values-da/strings-emoji-descriptions.xml +++ b/java/res/values-da/strings-emoji-descriptions.xml @@ -26,7 +26,7 @@ "Copyrighttegn" - "Registreret varemærke-tegn" + "Registreret brand-tegn" "Dobbelt udråbstegn" "Udråbstegn spørgsmålstegn" "Varemærketegn" diff --git a/java/res/values-fa/strings-emoji-descriptions.xml b/java/res/values-fa/strings-emoji-descriptions.xml index 37ecffd2c..2959d3cd3 100644 --- a/java/res/values-fa/strings-emoji-descriptions.xml +++ b/java/res/values-fa/strings-emoji-descriptions.xml @@ -587,7 +587,7 @@ "آنتن ماهواره" "بلندگوی جارچی" "بلندگوی تشویق‌کننده" - "سینی صندوق ارسال" + "سینی صندوق خروجی" "سینی صندوق ورودی" "بسته‌بندی" "نماد ایمیل" From 024e1cdd55e9f6c8a1d0fad829f116f022d7729f Mon Sep 17 00:00:00 2001 From: Geoff Mendal Date: Sat, 14 Nov 2015 07:00:02 -0800 Subject: [PATCH 5/7] Import translations. DO NOT MERGE Change-Id: I3ceefd186d7ee9f1c8c7039548d4b7f6794d6188 Auto-generated-cl: translation import --- java/res/values-af/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-am/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ar/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-az-rAZ/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-bg/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-bn-rBD/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ca/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-cs/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-da/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-de/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-el/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-en-rAU/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-en-rGB/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-en-rIN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-es-rUS/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-es/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-et-rEE/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-eu-rES/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-fa/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-fi/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-fr-rCA/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-fr/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-gl-rES/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-gu-rIN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-hi/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-hr/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-hu/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-hy-rAM/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-in/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-is-rIS/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-it/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-iw/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ja/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ka-rGE/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-kk-rKZ/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-km-rKH/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-kn-rIN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ko/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ky-rKG/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-lo-rLA/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-lt/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-lv/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-mk-rMK/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ml-rIN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-mn-rMN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-mr-rIN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ms-rMY/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-my-rMM/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-nb/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ne-rNP/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-nl/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-pa-rIN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-pl/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-pt-rPT/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-pt/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ro/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ru/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-si-rLK/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-sk/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-sl/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-sq-rAL/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-sr/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-sv/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-sw/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ta-rIN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-te-rIN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-th/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-tl/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-tr/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-uk/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-ur-rPK/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-uz-rUZ/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-vi/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-zh-rCN/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-zh-rHK/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-zh-rTW/strings-talkback-descriptions.xml | 8 +++++++- java/res/values-zu/strings-talkback-descriptions.xml | 8 +++++++- 77 files changed, 539 insertions(+), 77 deletions(-) diff --git a/java/res/values-af/strings-talkback-descriptions.xml b/java/res/values-af/strings-talkback-descriptions.xml index c93899625..e311a8aa6 100644 --- a/java/res/values-af/strings-talkback-descriptions.xml +++ b/java/res/values-af/strings-talkback-descriptions.xml @@ -2,7 +2,7 @@