diff --git a/indra/llwindow/llkeyboard.cpp b/indra/llwindow/llkeyboard.cpp
index 16cbf815e0b4872782c2eb6145cecc09b8561c29..8f26f980d15dc094c44d8609e6c34798757e65b0 100644
--- a/indra/llwindow/llkeyboard.cpp
+++ b/indra/llwindow/llkeyboard.cpp
@@ -343,6 +343,13 @@ std::string LLKeyboard::stringFromKey(KEY key)
 		buffer[1] = '\0';
 		res = std::string(buffer);
 	}
+
+	LLKeyStringTranslatorFunc *trans = gKeyboard->mStringTranslator;
+	if (trans != NULL)
+	{
+		res = trans(res.c_str());
+	}
+
 	return res;
 }
 
diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h
index 856b9e04fc73dfb32fda42d6f7651fede0b74bb8..6c8d28b346a91a89aba405262a93ce57773943c6 100644
--- a/indra/llxuixml/lltrans.h
+++ b/indra/llxuixml/lltrans.h
@@ -103,11 +103,12 @@ class LLTrans
 		return findString(result, xml_desc, empty);
 	}
 
-        static std::string getKeyboardString(const char* keystring)
-        {
-                // These map directly - no need to specialize
-                return getString( ll_safe_string(keystring) );
-        }
+	static std::string getKeyboardString(const char* keystring)
+	{
+		std::string key_str(keystring);
+		std::string trans_str;
+		return findString(trans_str, "Key_" + key_str) ? trans_str : key_str; 
+	}
 
 	// get the default args
 	static const LLStringUtil::format_map_t& getDefaultArgs()
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 2aa34b746bdb2e60ec6dd1582b515f6fc1e9b2bb..7a292ab943f70bbe0bf4a7afa7ec85e7790e4e42 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2282,6 +2282,9 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
 	<string name="accel-win-alt">Alt+</string>
 	<string name="accel-win-shift">Shift+</string>
 
+	<string name="Key_Esc">Esc</string>
+	<string name="Key_Home">Home</string>
+
 	<!-- Previews -->
 	<string name="FileSaved">File Saved</string>
 	<string name="Receiving">Receiving</string>