Merge pull request #1281 from keymanapp/android-add-strings

[Android] Consolidate UI strings
This commit is contained in:
Darcy Wong 2018-10-24 03:15:28 -05:00 committed by GitHub
commit f4aaa7491e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 111 additions and 121 deletions

View file

@ -117,9 +117,9 @@ public class BookmarksActivity extends AppCompatActivity {
@Override
public void onClick(View v) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("Add Bookmark");
dialogBuilder.setTitle(getString(R.string.add_bookmark));
dialogBuilder.setView(getLayoutInflater().inflate(R.layout.add_bookmark_dialog_layout, null));
dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
dialogBuilder.setPositiveButton(getString(R.string.label_add), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
EditText titleField = (EditText) mDialog.findViewById(R.id.title);
EditText urlField = (EditText) mDialog.findViewById(R.id.url);
@ -154,7 +154,7 @@ public class BookmarksActivity extends AppCompatActivity {
}
});
dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
dialogBuilder.setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Cancel
}

View file

@ -73,25 +73,25 @@ public class GetStartedActivity extends AppCompatActivity {
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put(iconKey, "0");
hashMap.put(textKey, context.getResources().getString(R.string.add_a_keyboard));
hashMap.put(textKey, getString(R.string.add_a_keyboard));
hashMap.put(isEnabledKey, "true");
list.add(hashMap);
hashMap = new HashMap<String, String>();
hashMap.put(iconKey, "0");
hashMap.put(textKey, context.getResources().getString(R.string.enable_system_keyboard));
hashMap.put(textKey, getString(R.string.enable_system_keyboard));
hashMap.put(isEnabledKey, "true");
list.add(hashMap);
hashMap = new HashMap<String, String>();
hashMap.put(iconKey, "0");
hashMap.put(textKey, context.getResources().getString(R.string.set_keyman_as_default));
hashMap.put(textKey, getString(R.string.set_keyman_as_default));
hashMap.put(isEnabledKey, "false");
list.add(hashMap);
hashMap = new HashMap<String, String>();
hashMap.put(iconKey, "0");
hashMap.put(textKey, context.getResources().getString(R.string.more_info));
hashMap.put(textKey, getString(R.string.more_info));
hashMap.put(isEnabledKey, "true");
list.add(hashMap);

View file

@ -58,7 +58,7 @@ public class InfoActivity extends AppCompatActivity {
PackageInfo pInfo;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
ver = String.format("Version: %s", pInfo.versionName);
ver = String.format("%s: %s", getString(R.string.title_version), pInfo.versionName);
} catch (NameNotFoundException e) {
// Could not get version number
}

View file

@ -298,7 +298,9 @@ public class MainActivity extends AppCompatActivity implements OnKeyboardEventLi
downloadIntent.putExtra("receiver", resultReceiver);
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Downloading keyboard package\n" + filename + "...");
String ellipsisStr = "\u2026";
progressDialog.setMessage(String.format("%s\n%s%s",
getString(R.string.downloading_keyboard_package), filename, ellipsisStr));
progressDialog.setCancelable(false);
progressDialog.show();
@ -509,9 +511,9 @@ public class MainActivity extends AppCompatActivity implements OnKeyboardEventLi
final View textSizeController = inflater.inflate(R.layout.text_size_controller, null);
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
dialogBuilder.setIcon(R.drawable.ic_light_action_textsize);
dialogBuilder.setTitle(String.format("Text Size: %d", textSize));
dialogBuilder.setTitle(String.format("%s: %d", getString(R.string.action_text_size), textSize));
dialogBuilder.setView(textSizeController);
dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
dialogBuilder.setPositiveButton(getString(R.string.label_ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Done
@ -540,7 +542,7 @@ public class MainActivity extends AppCompatActivity implements OnKeyboardEventLi
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
textSize = progress + minTextSize;
textView.setTextSize((float) textSize);
dialog.setTitle(String.format("Text Size: %d", textSize));
dialog.setTitle(String.format("%s: %d", getString(R.string.action_text_size), textSize));
}
});
@ -568,16 +570,16 @@ public class MainActivity extends AppCompatActivity implements OnKeyboardEventLi
private void showClearTextDialog() {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
dialogBuilder.setIcon(R.drawable.ic_light_action_trash);
dialogBuilder.setTitle("Clear Text");
dialogBuilder.setMessage("\nAll text will be cleared\n");
dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
dialogBuilder.setTitle(getString(R.string.action_clear_text));
dialogBuilder.setMessage(String.format("\n%s\n", getString(R.string.all_text_will_be_cleared)));
dialogBuilder.setPositiveButton(getString(R.string.label_ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
textView.setText("");
}
});
dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
dialogBuilder.setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Cancel

View file

@ -61,7 +61,8 @@ public class PackageActivity extends AppCompatActivity {
try {
tempPackagePath = PackageProcessor.unzipKMP(kmpFile);
} catch (Exception e) {
String message = "Failed to extract\n" + kmpFile.getAbsolutePath();
String message = String.format("%s\n%s",
getString(R.string.failed_to_extract), kmpFile.getAbsolutePath());
showErrorDialog(context, pkgId, message);
}
@ -80,7 +81,7 @@ public class PackageActivity extends AppCompatActivity {
packageActivityTitle.setTextSize(getResources().getDimension(R.dimen.titlebar_label_textsize));
packageActivityTitle.setGravity(Gravity.CENTER);
String titleStr = "Install Keyboard Package " + pkgVersion;
String titleStr = String.format("%s %s", getString(R.string.install_keyboard_package), pkgVersion);
packageActivityTitle.setText(titleStr);
getSupportActionBar().setCustomView(packageActivityTitle);
@ -139,7 +140,8 @@ public class PackageActivity extends AppCompatActivity {
webView.loadUrl("file:///" + files[0].getAbsolutePath());
} else {
// No welcome.htm so display minimal package information
String keyboardString = (pkgName != null && pkgName.toLowerCase().endsWith("keyboard")) ? "" : " Keyboard ";
String keyboardString = (pkgName != null && pkgName.toLowerCase().endsWith("keyboard")) ? "" :
String.format(" %s", getString(R.string.title_keyboard));
String htmlString = String.format(
"<body style=\"max-width:600px;\"><H1>The %s%s Package</H1></body>",
pkgName, keyboardString);
@ -161,12 +163,12 @@ public class PackageActivity extends AppCompatActivity {
}
cleanup();
} else {
showErrorDialog(context, pkgId, "No new touch-optimized keyboards to install");
showErrorDialog(context, pkgId, getString(R.string.no_new_touch_keyboards_to_install));
}
} catch (Exception e) {
Log.e("PackageActivity", "Error " + e);
showErrorDialog(context, pkgId, "No valid touch-optimized keyboards to install");
showErrorDialog(context, pkgId, getString(R.string.no_valid_touch_keyboards_to_install));
}
}
});
@ -216,11 +218,12 @@ public class PackageActivity extends AppCompatActivity {
private void showErrorDialog(Context context, String pkgId, String message) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle("Package " + pkgId + " failed to install");
alertDialogBuilder.setTitle(String.format("%s %s %s",
getString(R.string.title_package), pkgId, getString(R.string.title_failed_to_install)));
alertDialogBuilder
.setMessage(message)
.setCancelable(false)
.setNeutralButton("Close",new DialogInterface.OnClickListener() {
.setPositiveButton(getString(R.string.label_close),new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
if (dialog != null) {
dialog.dismiss();

View file

@ -13,7 +13,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/splash_version"
android:text="@string/title_version"
android:textSize="@dimen/activity_splash_textsize" />
<TextView

View file

@ -2,21 +2,30 @@
<resources>
<string name="app_name" translatable="false">Keyman</string>
<string name="splash_version" translatable="false">Version</string>
<string name="splash_copyright" translatable="false">Copyright &#169; 1992-</string>
<string name="action_settings" translatable="false">Settings</string>
<string name="action_share" translatable="false">Share</string>
<string name="action_web" translatable="false">Web Browser</string>
<string name="action_text_size" translatable="false">Text Size</string>
<string name="action_overflow" translatable="false">More</string>
<string name="action_clear_text" translatable="false">Clear Text</string>
<string name="action_info" translatable="false">Info</string>
<string name="title_version" translatable="false">Version</string>
<!-- &#8230; is the ellipsis character "..." -->
<string name="textview_hint" translatable="false">Start typing here&#8230;</string>
<!-- Splash screen (version/copyright info currently disabled -->
<string name="splash_copyright" translatable="false">Copyright &#169; 1992-</string>
<!-- Text Size dialog -->
<string name="ic_text_size_up" translatable="false">Text size up</string>
<string name="ic_text_size_down" translatable="false">Text size down</string>
<string name="textview_hint" translatable="false">Start typing here&#8230;</string>
<string name="share" translatable="false">Share</string>
<!-- Get started menu strings -->
<!-- Clear Text dialog -->
<string name="all_text_will_be_cleared" translatable="false">All text will be cleared</string>
<!-- Info screen reuses title_version -->
<!-- Get Started menu strings -->
<string name="get_started" translatable="false">Get Started</string>
<string name="add_a_keyboard" translatable="false">Add a keyboard for your language</string>
<string name="enable_system_keyboard" translatable="false">Enable Keyman as system-wide keyboard</string>
@ -28,11 +37,17 @@
<string name="hint_text" translatable="false">Search or type URL</string>
<string name="title_bookmarks" translatable="false">Bookmarks</string>
<string name="no_bookmarks" translatable="false">No Bookmarks</string>
<string name="add_bookmark" translatable="false">Add Bookmark</string>
<string name="hint_title" translatable="false">Title</string>
<string name="hint_url" translatable="false">Url</string>
<!-- Keyboard Package strings -->
<string name="label_cancel" translatable="false">Cancel</string>
<string name="label_install" translatable="false">Install</string>
<string name="title_package" translatable="false">Package</string>
<string name="title_failed_to_install" translatable="false">failed to install</string>
<string name="downloading_keyboard_package" translatable="false">Downloading keyboard package</string>
<string name="failed_to_extract" translatable="false">Failed to extract</string>
<string name="install_keyboard_package" translatable="false">Install Keyboard Package</string>
<string name="no_new_touch_keyboards_to_install" translatable="false">No new touch-optimized keyboards to install</string>
<string name="no_valid_touch_keyboards_to_install" translatable="false">No valid touch-optimized keyboards to install</string>
</resources>

View file

@ -21,8 +21,8 @@ public class ConfirmDialogFragment extends DialogFragment {
return new AlertDialog.Builder(getActivity())
.setTitle(title)
.setMessage("Would you like to download this keyboard?")
.setPositiveButton("Download", new DialogInterface.OnClickListener() {
.setMessage(getString(R.string.confirm_download))
.setPositiveButton(getString(R.string.label_download), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Download keyboard
@ -33,7 +33,7 @@ public class ConfirmDialogFragment extends DialogFragment {
}
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
.setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Cancel
dialog.dismiss();

View file

@ -106,7 +106,7 @@ public class KMKeyboardDownloaderActivity extends AppCompatActivity {
Bundle args = new Bundle();
String title = "";
if (url != null) {
title = "Custom Keyboard: " + filename;
title = String.format("%s: %s", getString(R.string.custom_keyboard), filename);
} else if (customKeyboard != null && customLanguage != null &&
!customKeyboard.trim().isEmpty() && !customLanguage.trim().isEmpty()) {
int kbIndex = KMManager.getKeyboardIndex(getApplicationContext(), customKeyboard, customLanguage);
@ -117,10 +117,10 @@ public class KMKeyboardDownloaderActivity extends AppCompatActivity {
return; // false
}
title = customLanguage + "_" + customKeyboard;
title = String.format("%s_%s", customLanguage, customKeyboard);
} else {
// Download keyboard from cloud server
title = langName + ": " + kbName;
title = String.format("%s: %s", langName, kbName);
}
DialogFragment dialog = new ConfirmDialogFragment();
@ -153,7 +153,7 @@ public class KMKeyboardDownloaderActivity extends AppCompatActivity {
super.onPreExecute();
if (showProgressDialog) {
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Downloading keyboard...");
progressDialog.setMessage(context.getString(R.string.downloading_keyboard));
progressDialog.setCancelable(false);
if (!((AppCompatActivity) context).isFinishing()) {
progressDialog.show();
@ -178,7 +178,7 @@ public class KMKeyboardDownloaderActivity extends AppCompatActivity {
throw new Exception(exceptionStr);
}
String deviceType = context.getResources().getString(R.string.device_type);
String deviceType = context.getString(R.string.device_type);
if (deviceType.equals("AndroidTablet")) {
deviceType = "androidtablet";
} else {

View file

@ -266,25 +266,6 @@ public final class KMManager {
parent.removeView(SystemKeyboard);
keyboardLayout.addView(SystemKeyboard);
/*
final RelativeLayout overlayLayout = new RelativeLayout(appContext);
overlayLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
LayoutInflater inflater = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
RelativeLayout overlayView = (RelativeLayout) inflater.inflate(R.layout.overlay_layout, null, false);
overlayView.setLayoutParams(SystemKeyboard.getLayoutParams());
overlayView.setBackgroundColor(Color.argb(192, 0, 0, 0));
overlayView.setClickable(true);
overlayLayout.addView(overlayView);
Button activateButton = (Button) overlayView.findViewById(R.id.button1);
activateButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
mainLayout.removeView(overlayLayout);
Toast.makeText(context, "Reactivated", Toast.LENGTH_LONG).show();
}
});
*/
mainLayout.addView(keyboardLayout);
//mainLayout.addView(overlayLayout);
return mainLayout;
@ -1507,7 +1488,7 @@ public final class KMManager {
SystemKeyboard.showHelpBubble(context, fx, fy);
}
} else if (url.indexOf("showKeyPreview") >= 0) {
String deviceType = context.getResources().getString(R.string.device_type);
String deviceType = context.getString(R.string.device_type);
if (deviceType.equals("AndroidTablet")) {
return false;
}

View file

@ -70,7 +70,7 @@ public final class KeyboardInfoActivity extends AppCompatActivity {
infoList = new ArrayList<HashMap<String, String>>();
String icon = "0";
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put(titleKey, "Keyboard version");
hashMap.put(titleKey, getString(R.string.keyboard_version));
hashMap.put(subtitleKey, kbVersion);
hashMap.put(iconKey, icon);
infoList.add(hashMap);
@ -79,7 +79,7 @@ public final class KeyboardInfoActivity extends AppCompatActivity {
if (!isCustomKeyboard || customHelpLink != null) {
icon = String.valueOf(R.drawable.ic_arrow_forward);
hashMap = new HashMap<String, String>();
hashMap.put(titleKey, "Help link");
hashMap.put(titleKey, getString(R.string.help_link));
hashMap.put(subtitleKey, "");
hashMap.put(iconKey, icon);
infoList.add(hashMap);

View file

@ -162,10 +162,9 @@ public final class KeyboardPickerActivity extends AppCompatActivity implements O
context.startActivity(i);
} else {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle(context.getResources().getString(R.string.title_add_keyboard));
dialogBuilder.setIcon(context.getResources().getDrawable(android.R.drawable.ic_input_add));
dialogBuilder.setMessage("\nCannot connect to Keyman server!\n");
dialogBuilder.setPositiveButton("OK", null);
dialogBuilder.setTitle(getString(R.string.title_add_keyboard));
dialogBuilder.setMessage(String.format("\n%s\n", getString(R.string.cannot_connect)));
dialogBuilder.setPositiveButton(getString(R.string.label_ok), null);
AlertDialog dialog = dialogBuilder.create();
dialog.show();
}
@ -196,7 +195,7 @@ public final class KeyboardPickerActivity extends AppCompatActivity implements O
public void run() {
boolean shouldCheckUpdate = false;
if (lastUpdateCheck == null) {
SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE);
SharedPreferences prefs = context.getSharedPreferences(getString(R.string.kma_prefs_name), Context.MODE_PRIVATE);
Long lastUpdateCheckTime = prefs.getLong("lastUpdateCheck", 0);
if (lastUpdateCheckTime > 0) {
lastUpdateCheck = Calendar.getInstance();
@ -523,10 +522,9 @@ public final class KeyboardPickerActivity extends AppCompatActivity implements O
context.startActivity(i);
} else {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle(context.getResources().getString(R.string.title_add_keyboard));
dialogBuilder.setIcon(context.getResources().getDrawable(android.R.drawable.ic_input_add));
dialogBuilder.setMessage("\nCannot connect to Keyman server!\n");
dialogBuilder.setPositiveButton("OK", null);
dialogBuilder.setTitle(context.getString(R.string.title_add_keyboard));
dialogBuilder.setMessage(String.format("\n%s\n", context.getString(R.string.cannot_connect)));
dialogBuilder.setPositiveButton(context.getString(R.string.label_ok), null);
AlertDialog dialog = dialogBuilder.create();
dialog.show();
}
@ -544,7 +542,7 @@ public final class KeyboardPickerActivity extends AppCompatActivity implements O
checkingUpdates = true;
if (hasConnection) {
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Checking keyboard updates...");
progressDialog.setMessage(context.getString(R.string.checking_keyboard_updates));
progressDialog.setCancelable(false);
if (!((AppCompatActivity) context).isFinishing()) {
progressDialog.show();
@ -560,7 +558,7 @@ public final class KeyboardPickerActivity extends AppCompatActivity implements O
int ret = 0;
if (hasConnection && !isCancelled()) {
try {
String deviceType = context.getResources().getString(R.string.device_type);
String deviceType = context.getString(R.string.device_type);
if (deviceType.equals("AndroidTablet")) {
deviceType = "androidtablet";
} else {
@ -619,9 +617,9 @@ public final class KeyboardPickerActivity extends AppCompatActivity implements O
failedUpdateCount = 0;
updateCount = result;
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("Keyboard Updates Available");
dialogBuilder.setMessage("Would you like to update keyboards now?");
dialogBuilder.setPositiveButton("Update", new DialogInterface.OnClickListener() {
dialogBuilder.setTitle(context.getString(R.string.keyboard_updates_available));
dialogBuilder.setMessage(context.getString(R.string.confirm_update));
dialogBuilder.setPositiveButton(context.getString(R.string.label_update), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Update keyboards
if (KMManager.hasConnection(context)) {
@ -640,7 +638,7 @@ public final class KeyboardPickerActivity extends AppCompatActivity implements O
if (Float.valueOf(newKbVersion) > Float.valueOf(kbVersion)) {
if (updateProgress == null || !updateProgress.isShowing()) {
updateProgress = new ProgressDialog(context);
updateProgress.setMessage("Updating keyboards...");
updateProgress.setMessage(context.getString(R.string.updating_keyboards));
updateProgress.setCancelable(false);
updateProgress.show();
}
@ -665,7 +663,7 @@ public final class KeyboardPickerActivity extends AppCompatActivity implements O
}
});
dialogBuilder.setNegativeButton("Later", new DialogInterface.OnClickListener() {
dialogBuilder.setNegativeButton(context.getString(R.string.label_later), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
lastUpdateCheck = Calendar.getInstance();
checkingUpdates = false;

View file

@ -339,7 +339,7 @@ public final class LanguageListActivity extends AppCompatActivity implements OnK
if (hasConnection && !loadFromCache) {
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Loading...");
progressDialog.setMessage(getString(R.string.loading));
progressDialog.setCancelable(false);
if (!((AppCompatActivity) context).isFinishing()) {
progressDialog.show();
@ -362,7 +362,7 @@ public final class LanguageListActivity extends AppCompatActivity implements OnK
jsonObj = getCachedJSONObject(context);
} else if (hasConnection) {
try {
String deviceType = context.getResources().getString(R.string.device_type);
String deviceType = getString(R.string.device_type);
if (deviceType.equals("AndroidTablet")) {
deviceType = "androidtablet";
} else {

View file

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/trial_expired"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true"
android:text="@string/reactivate" />
</RelativeLayout>

View file

@ -2,5 +2,5 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/popup_delete"
android:icon="@android:drawable/ic_menu_delete"
android:title="@string/popup_menu_delete" />
android:title="@string/label_delete" />
</menu>

View file

@ -1,38 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Device type -->
<string name="device_type" translatable="false">AndroidMobile</string>
<!-- Application name -->
<!-- Application name (Keyman Engine for Android) -->
<string name="app_name" translatable="false">KMEA</string>
<!-- Title for settings -->
<string name="action_settings" translatable="false">Settings</string>
<!-- Title for lists-->
<string name="title_keyboards" translatable="false">Keyboards</string>
<string name="title_keyboard" translatable="false">Keyboard</string>
<string name="title_add_keyboard" translatable="false">Add New Keyboard</string>
<!-- Button labels -->
<string name="label_action_button" translatable="false">Action Button</string>
<string name="label_done" translatable="false">Done</string>
<string name="label_add" translatable="false">Add</string>
<string name="label_back" translatable="false">Back</string>
<string name="label_cancel" translatable="false">Cancel</string>
<string name="label_close" translatable="false">Close</string>
<string name="label_download" translatable="false">Download</string>
<string name="label_install" translatable="false">Install</string>
<string name="label_later" translatable="false">Later</string>
<string name="label_ok" translatable="false">OK</string>
<string name="label_update" translatable="false">Update</string>
<!-- For the following, &#8230; is the ellipsis character "..." -->
<!-- Keyboard Updates -->
<string name="cannot_connect" translatable="false">Cannot connect to Keyman server!</string>
<string name="checking_keyboard_updates" translatable="false">Checking keyboard updates&#8230;</string>
<string name="confirm_download" translatable="false">Would you like to download this keyboard?</string>
<string name="confirm_update" translatable="false">Would you like to update keyboards now?</string>
<string name="custom_keyboard" translatable="false">Custom Keyboard</string>
<string name="downloading_keyboard" translatable="false">Downloading keyboard&#8230;</string>
<string name="keyboard_updates_available" translatable="false">Keyboard Updates Available</string>
<string name="loading" translatable="false">Loading&#8230;</string>
<string name="updating_keyboards" translatable="false">Updating keyboards&#8230;</string>
<!-- Keyboard Info -->
<string name="keyboard_version" translatable="false">Keyboard version</string>
<string name="help_link" translatable="false">Help link</string>
<!-- Content descriptions -->
<string name="image_button" translatable="false">Image Button</string>
<string name="image_view" translatable="false">Image View</string>
<!-- Popup menu labels -->
<string name="popup_menu_delete" translatable="false">Delete</string>
<string name="label_delete" translatable="false">Delete</string>
<!-- Shared preferences name -->
<string name="kma_prefs_name" translatable="false">KMAPreferences</string>
<!-- Other strings -->
<string name="help_bubble_text" translatable="false">Tap here to change keyboard</string>
<string name="trial_expired" translatable="false">Trial period has expired!</string>
<string name="reactivate" translatable="false">Reactivate</string>
</resources>