diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
index e3455c1a1e653b780b3faeae882f6dc09da1237f..d2031d15566d5338fbf719d01b4e5d38d746f851 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
@@ -35,6 +35,7 @@ import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.MainKeyboardView;
 import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
 public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat {
     private static final AccessibleKeyboardViewProxy sInstance = new AccessibleKeyboardViewProxy();
@@ -67,8 +68,8 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
     private int mEdgeSlop;
 
     /** The most recently set keyboard mode. */
-    private int mLastKeyboardMode;
-    private static final int NOT_A_KEYBOARD_MODE = -1;
+    private int mLastKeyboardMode = KEYBOARD_IS_HIDDEN;
+    private static final int KEYBOARD_IS_HIDDEN = -1;
 
     public static void init(final InputMethodService inputMethod) {
         sInstance.initInternal(inputMethod);
@@ -124,20 +125,27 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
         if (keyboard == null) {
             return;
         }
-        mKeyboard = keyboard;
         if (mAccessibilityNodeProvider != null) {
             mAccessibilityNodeProvider.setKeyboard(keyboard);
         }
-        final int keyboardMode = keyboard.mId.mMode;
+        final Keyboard lastKeyboard = mKeyboard;
+        final int lastKeyboardMode = mLastKeyboardMode;
+        mKeyboard = keyboard;
+        mLastKeyboardMode = keyboard.mId.mMode;
 
         // Since this method is called even when accessibility is off, make sure
-        // to check the state before announcing anything. Also, don't announce
-        // changes within the same mode.
-        if (AccessibilityUtils.getInstance().isAccessibilityEnabled()
-                && (mLastKeyboardMode != keyboardMode)) {
-            announceKeyboardMode(keyboardMode);
+        // to check the state before announcing anything.
+        if (!AccessibilityUtils.getInstance().isAccessibilityEnabled()) {
+            return;
+        }
+        // Announce the language name only when the language is changed.
+        if (lastKeyboard == null || !lastKeyboard.mId.mSubtype.equals(keyboard.mId.mSubtype)) {
+            announceKeyboardLanguage(keyboard);
+        }
+        // Announce the mode only when the mode is changed.
+        if (lastKeyboardMode != keyboard.mId.mMode) {
+            announceKeyboardMode(keyboard);
         }
-        mLastKeyboardMode = keyboardMode;
     }
 
     /**
@@ -148,23 +156,35 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp
             return;
         }
         announceKeyboardHidden();
-        mLastKeyboardMode = NOT_A_KEYBOARD_MODE;
+        mLastKeyboardMode = KEYBOARD_IS_HIDDEN;
+    }
+
+    /**
+     * Announces which language of keyboard is being displayed.
+     *
+     * @param keyboard The new keyboard.
+     */
+    private void announceKeyboardLanguage(final Keyboard keyboard) {
+        final String languageText = SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(
+                keyboard.mId.mSubtype);
+        sendWindowStateChanged(languageText);
     }
 
     /**
-     * Announces which type of keyboard is being displayed. If the keyboard type
-     * is unknown, no announcement is made.
+     * Announces which type of keyboard is being displayed.
+     * If the keyboard type is unknown, no announcement is made.
      *
-     * @param mode The new keyboard mode.
+     * @param keyboard The new keyboard.
      */
-    private void announceKeyboardMode(final int mode) {
-        final int resId = KEYBOARD_MODE_RES_IDS.get(mode);
-        if (resId == 0) {
+    private void announceKeyboardMode(final Keyboard keyboard) {
+        final int mode = keyboard.mId.mMode;
+        final Context context = mView.getContext();
+        final int modeTextResId = KEYBOARD_MODE_RES_IDS.get(mode);
+        if (modeTextResId == 0) {
             return;
         }
-        final Context context = mView.getContext();
-        final String keyboardMode = context.getString(resId);
-        final String text = context.getString(R.string.announce_keyboard_mode, keyboardMode);
+        final String modeText = context.getString(modeTextResId);
+        final String text = context.getString(R.string.announce_keyboard_mode, modeText);
         sendWindowStateChanged(text);
     }