auto import from //branches/cupcake/...@138744
|
@ -0,0 +1,17 @@
|
||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := user
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := $(call all-subdir-java-files)
|
||||||
|
|
||||||
|
LOCAL_PACKAGE_NAME := LatinIME
|
||||||
|
|
||||||
|
LOCAL_CERTIFICATE := shared
|
||||||
|
|
||||||
|
LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime
|
||||||
|
|
||||||
|
LOCAL_AAPT_FLAGS := -0 .dict
|
||||||
|
|
||||||
|
include $(BUILD_PACKAGE)
|
||||||
|
include $(LOCAL_PATH)/dictionary/Android.mk
|
|
@ -0,0 +1,24 @@
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.android.inputmethod.latin"
|
||||||
|
android:sharedUserId="android.uid.shared">
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
|
<uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
|
||||||
|
|
||||||
|
<application android:label="@string/english_ime_name">
|
||||||
|
<service android:name="LatinIME"
|
||||||
|
android:label="@string/english_ime_name"
|
||||||
|
android:permission="android.permission.BIND_INPUT_METHOD">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.view.InputMethod" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data android:name="android.view.im" android:resource="@xml/method" />
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<activity android:name="LatinIMESettings" android:label="@string/english_ime_settings">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!-- This is a sample wordlist that can be converted to a binary dictionary
|
||||||
|
for use by the Latin IME.
|
||||||
|
The format of the word list is a flat list of word entries.
|
||||||
|
Each entry has a frequency between 255 and 0.
|
||||||
|
Highest frequency words get more weight in the prediction algorithm.
|
||||||
|
You can capitalize words that must always be capitalized, such as "January".
|
||||||
|
You can have a capitalized and a non-capitalized word as separate entries,
|
||||||
|
such as "robin" and "Robin".
|
||||||
|
-->
|
||||||
|
<wordlist>
|
||||||
|
<w f="255">this</w>
|
||||||
|
<w f="255">is</w>
|
||||||
|
<w f="128">sample</w>
|
||||||
|
<w f="1">wordlist</w>
|
||||||
|
</wordlist>
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
jni/com_android_inputmethod_latin_BinaryDictionary.cpp \
|
||||||
|
src/dictionary.cpp
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES += \
|
||||||
|
external/icu4c/common \
|
||||||
|
$(JNI_H_INCLUDE)
|
||||||
|
|
||||||
|
LOCAL_LDLIBS := -lm
|
||||||
|
|
||||||
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := \
|
||||||
|
libandroid_runtime \
|
||||||
|
libcutils \
|
||||||
|
libutils \
|
||||||
|
libicuuc
|
||||||
|
|
||||||
|
LOCAL_MODULE := libjni_latinime
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := user
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
|
@ -0,0 +1,207 @@
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2009, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOG_TAG "BinaryDictionary"
|
||||||
|
#include "utils/Log.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <nativehelper/jni.h>
|
||||||
|
#include "utils/AssetManager.h"
|
||||||
|
#include "utils/Asset.h"
|
||||||
|
|
||||||
|
#include "dictionary.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using namespace latinime;
|
||||||
|
|
||||||
|
using namespace android;
|
||||||
|
|
||||||
|
static jfieldID sDescriptorField;
|
||||||
|
static jfieldID sAssetManagerNativeField;
|
||||||
|
static jmethodID sAddWordMethod;
|
||||||
|
|
||||||
|
//
|
||||||
|
// helper function to throw an exception
|
||||||
|
//
|
||||||
|
static void throwException(JNIEnv *env, const char* ex, const char* fmt, int data)
|
||||||
|
{
|
||||||
|
if (jclass cls = env->FindClass(ex)) {
|
||||||
|
char msg[1000];
|
||||||
|
sprintf(msg, fmt, data);
|
||||||
|
env->ThrowNew(cls, msg);
|
||||||
|
env->DeleteLocalRef(cls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static jint latinime_BinaryDictionary_open
|
||||||
|
(JNIEnv *env, jobject object, jobject assetManager, jstring resourceString,
|
||||||
|
jint typedLetterMultiplier, jint fullWordMultiplier)
|
||||||
|
{
|
||||||
|
// Get the native file descriptor from the FileDescriptor object
|
||||||
|
AssetManager *am = (AssetManager*) env->GetIntField(assetManager, sAssetManagerNativeField);
|
||||||
|
if (!am) {
|
||||||
|
LOGE("DICT: Couldn't get AssetManager native peer\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
const char *resourcePath = env->GetStringUTFChars(resourceString, NULL);
|
||||||
|
|
||||||
|
Asset *dictAsset = am->openNonAsset(resourcePath, Asset::ACCESS_BUFFER);
|
||||||
|
if (dictAsset == NULL) {
|
||||||
|
LOGE("DICT: Couldn't get asset %s\n", resourcePath);
|
||||||
|
env->ReleaseStringUTFChars(resourceString, resourcePath);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *dict = (void*) dictAsset->getBuffer(false);
|
||||||
|
if (dict == NULL) {
|
||||||
|
LOGE("DICT: Dictionary buffer is null\n");
|
||||||
|
env->ReleaseStringUTFChars(resourceString, resourcePath);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Dictionary *dictionary = new Dictionary(dict, typedLetterMultiplier, fullWordMultiplier);
|
||||||
|
dictionary->setAsset(dictAsset);
|
||||||
|
|
||||||
|
env->ReleaseStringUTFChars(resourceString, resourcePath);
|
||||||
|
return (jint) dictionary;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int latinime_BinaryDictionary_getSuggestions(
|
||||||
|
JNIEnv *env, jobject object, jint dict, jintArray inputArray, jint arraySize,
|
||||||
|
jcharArray outputArray, jintArray frequencyArray, jint maxWordLength, jint maxWords,
|
||||||
|
jint maxAlternatives)
|
||||||
|
{
|
||||||
|
Dictionary *dictionary = (Dictionary*) dict;
|
||||||
|
if (dictionary == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int *frequencies = env->GetIntArrayElements(frequencyArray, NULL);
|
||||||
|
int *inputCodes = env->GetIntArrayElements(inputArray, NULL);
|
||||||
|
jchar *outputChars = env->GetCharArrayElements(outputArray, NULL);
|
||||||
|
|
||||||
|
int count = dictionary->getSuggestions(inputCodes, arraySize, (unsigned short*) outputChars, frequencies,
|
||||||
|
maxWordLength, maxWords, maxAlternatives);
|
||||||
|
|
||||||
|
env->ReleaseIntArrayElements(frequencyArray, frequencies, JNI_COMMIT);
|
||||||
|
env->ReleaseIntArrayElements(inputArray, inputCodes, JNI_ABORT);
|
||||||
|
env->ReleaseCharArrayElements(outputArray, outputChars, JNI_COMMIT);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static jboolean latinime_BinaryDictionary_isValidWord
|
||||||
|
(JNIEnv *env, jobject object, jint dict, jcharArray wordArray, jint wordLength)
|
||||||
|
{
|
||||||
|
Dictionary *dictionary = (Dictionary*) dict;
|
||||||
|
if (dictionary == NULL) return (jboolean) false;
|
||||||
|
|
||||||
|
jchar *word = env->GetCharArrayElements(wordArray, NULL);
|
||||||
|
jboolean result = dictionary->isValidWord((unsigned short*) word, wordLength);
|
||||||
|
env->ReleaseCharArrayElements(wordArray, word, JNI_ABORT);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void latinime_BinaryDictionary_close
|
||||||
|
(JNIEnv *env, jobject object, jint dict)
|
||||||
|
{
|
||||||
|
Dictionary *dictionary = (Dictionary*) dict;
|
||||||
|
((Asset*) dictionary->getAsset())->close();
|
||||||
|
delete (Dictionary*) dict;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static JNINativeMethod gMethods[] = {
|
||||||
|
{"openNative", "(Landroid/content/res/AssetManager;Ljava/lang/String;II)I",
|
||||||
|
(void*)latinime_BinaryDictionary_open},
|
||||||
|
{"closeNative", "(I)V", (void*)latinime_BinaryDictionary_close},
|
||||||
|
{"getSuggestionsNative", "(I[II[C[IIII)I", (void*)latinime_BinaryDictionary_getSuggestions},
|
||||||
|
{"isValidWordNative", "(I[CI)Z", (void*)latinime_BinaryDictionary_isValidWord}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int registerNativeMethods(JNIEnv* env, const char* className,
|
||||||
|
JNINativeMethod* gMethods, int numMethods)
|
||||||
|
{
|
||||||
|
jclass clazz;
|
||||||
|
|
||||||
|
clazz = env->FindClass(className);
|
||||||
|
if (clazz == NULL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Native registration unable to find class '%s'\n", className);
|
||||||
|
return JNI_FALSE;
|
||||||
|
}
|
||||||
|
if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
|
||||||
|
fprintf(stderr, "RegisterNatives failed for '%s'\n", className);
|
||||||
|
return JNI_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return JNI_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int registerNatives(JNIEnv *env)
|
||||||
|
{
|
||||||
|
const char* const kClassPathName = "com/android/inputmethod/latin/BinaryDictionary";
|
||||||
|
jclass clazz;
|
||||||
|
|
||||||
|
clazz = env->FindClass("java/io/FileDescriptor");
|
||||||
|
if (clazz == NULL) {
|
||||||
|
LOGE("Can't find %s", "java/io/FileDescriptor");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sDescriptorField = env->GetFieldID(clazz, "descriptor", "I");
|
||||||
|
|
||||||
|
clazz = env->FindClass("android/content/res/AssetManager");
|
||||||
|
if (clazz == NULL) {
|
||||||
|
LOGE("Can't find %s", "java/io/FileDescriptor");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sAssetManagerNativeField = env->GetFieldID(clazz, "mObject", "I");
|
||||||
|
|
||||||
|
return registerNativeMethods(env,
|
||||||
|
kClassPathName, gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the JNI version on success, -1 on failure.
|
||||||
|
*/
|
||||||
|
jint JNI_OnLoad(JavaVM* vm, void* reserved)
|
||||||
|
{
|
||||||
|
JNIEnv* env = NULL;
|
||||||
|
jint result = -1;
|
||||||
|
|
||||||
|
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
|
||||||
|
fprintf(stderr, "ERROR: GetEnv failed\n");
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
assert(env != NULL);
|
||||||
|
|
||||||
|
if (!registerNatives(env)) {
|
||||||
|
fprintf(stderr, "ERROR: BinaryDictionary native registration failed\n");
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* success -- return valid version number */
|
||||||
|
result = JNI_VERSION_1_4;
|
||||||
|
|
||||||
|
bail:
|
||||||
|
return result;
|
||||||
|
}
|
|
@ -0,0 +1,172 @@
|
||||||
|
/**
|
||||||
|
* Table mapping most combined Latin, Greek, and Cyrillic characters
|
||||||
|
* to their base characters. If c is in range, BASE_CHARS[c] == c
|
||||||
|
* if c is not a combined character, or the base character if it
|
||||||
|
* is combined.
|
||||||
|
*/
|
||||||
|
static unsigned short BASE_CHARS[] = {
|
||||||
|
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
|
||||||
|
0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
|
||||||
|
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
|
||||||
|
0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
|
||||||
|
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
|
||||||
|
0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
|
||||||
|
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
|
||||||
|
0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
|
||||||
|
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
|
||||||
|
0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
|
||||||
|
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
|
||||||
|
0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
|
||||||
|
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
|
||||||
|
0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
|
||||||
|
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
|
||||||
|
0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x0020, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
|
||||||
|
0x0020, 0x00a9, 0x0061, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0020,
|
||||||
|
0x00b0, 0x00b1, 0x0032, 0x0033, 0x0020, 0x03bc, 0x00b6, 0x00b7,
|
||||||
|
0x0020, 0x0031, 0x006f, 0x00bb, 0x0031, 0x0031, 0x0033, 0x00bf,
|
||||||
|
0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x00c6, 0x0043,
|
||||||
|
0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049,
|
||||||
|
0x00d0, 0x004e, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x00d7,
|
||||||
|
0x004f, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x00de, 0x0073, // Manually changed d8 to 4f
|
||||||
|
// Manually changed df to 73
|
||||||
|
0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x00e6, 0x0063,
|
||||||
|
0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069,
|
||||||
|
0x00f0, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00f7,
|
||||||
|
0x006f, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x00fe, 0x0079, // Manually changed f8 to 6f
|
||||||
|
0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063,
|
||||||
|
0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064,
|
||||||
|
0x0110, 0x0111, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065,
|
||||||
|
0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067,
|
||||||
|
0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0126, 0x0127,
|
||||||
|
0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069,
|
||||||
|
0x0049, 0x0131, 0x0049, 0x0069, 0x004a, 0x006a, 0x004b, 0x006b,
|
||||||
|
0x0138, 0x004c, 0x006c, 0x004c, 0x006c, 0x004c, 0x006c, 0x004c,
|
||||||
|
0x006c, 0x0141, 0x0142, 0x004e, 0x006e, 0x004e, 0x006e, 0x004e,
|
||||||
|
0x006e, 0x02bc, 0x014a, 0x014b, 0x004f, 0x006f, 0x004f, 0x006f,
|
||||||
|
0x004f, 0x006f, 0x0152, 0x0153, 0x0052, 0x0072, 0x0052, 0x0072,
|
||||||
|
0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073,
|
||||||
|
0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0166, 0x0167,
|
||||||
|
0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075,
|
||||||
|
0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079,
|
||||||
|
0x0059, 0x005a, 0x007a, 0x005a, 0x007a, 0x005a, 0x007a, 0x0073,
|
||||||
|
0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187,
|
||||||
|
0x0188, 0x0189, 0x018a, 0x018b, 0x018c, 0x018d, 0x018e, 0x018f,
|
||||||
|
0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197,
|
||||||
|
0x0198, 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e, 0x019f,
|
||||||
|
0x004f, 0x006f, 0x01a2, 0x01a3, 0x01a4, 0x01a5, 0x01a6, 0x01a7,
|
||||||
|
0x01a8, 0x01a9, 0x01aa, 0x01ab, 0x01ac, 0x01ad, 0x01ae, 0x0055,
|
||||||
|
0x0075, 0x01b1, 0x01b2, 0x01b3, 0x01b4, 0x01b5, 0x01b6, 0x01b7,
|
||||||
|
0x01b8, 0x01b9, 0x01ba, 0x01bb, 0x01bc, 0x01bd, 0x01be, 0x01bf,
|
||||||
|
0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x0044, 0x0044, 0x0064, 0x004c,
|
||||||
|
0x004c, 0x006c, 0x004e, 0x004e, 0x006e, 0x0041, 0x0061, 0x0049,
|
||||||
|
0x0069, 0x004f, 0x006f, 0x0055, 0x0075, 0x00dc, 0x00fc, 0x00dc,
|
||||||
|
0x00fc, 0x00dc, 0x00fc, 0x00dc, 0x00fc, 0x01dd, 0x00c4, 0x00e4,
|
||||||
|
0x0226, 0x0227, 0x00c6, 0x00e6, 0x01e4, 0x01e5, 0x0047, 0x0067,
|
||||||
|
0x004b, 0x006b, 0x004f, 0x006f, 0x01ea, 0x01eb, 0x01b7, 0x0292,
|
||||||
|
0x006a, 0x0044, 0x0044, 0x0064, 0x0047, 0x0067, 0x01f6, 0x01f7,
|
||||||
|
0x004e, 0x006e, 0x00c5, 0x00e5, 0x00c6, 0x00e6, 0x00d8, 0x00f8,
|
||||||
|
0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065,
|
||||||
|
0x0049, 0x0069, 0x0049, 0x0069, 0x004f, 0x006f, 0x004f, 0x006f,
|
||||||
|
0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075,
|
||||||
|
0x0053, 0x0073, 0x0054, 0x0074, 0x021c, 0x021d, 0x0048, 0x0068,
|
||||||
|
0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0041, 0x0061,
|
||||||
|
0x0045, 0x0065, 0x00d6, 0x00f6, 0x00d5, 0x00f5, 0x004f, 0x006f,
|
||||||
|
0x022e, 0x022f, 0x0059, 0x0079, 0x0234, 0x0235, 0x0236, 0x0237,
|
||||||
|
0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f,
|
||||||
|
0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247,
|
||||||
|
0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f,
|
||||||
|
0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257,
|
||||||
|
0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f,
|
||||||
|
0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267,
|
||||||
|
0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f,
|
||||||
|
0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277,
|
||||||
|
0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f,
|
||||||
|
0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287,
|
||||||
|
0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f,
|
||||||
|
0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297,
|
||||||
|
0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f,
|
||||||
|
0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7,
|
||||||
|
0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af,
|
||||||
|
0x0068, 0x0266, 0x006a, 0x0072, 0x0279, 0x027b, 0x0281, 0x0077,
|
||||||
|
0x0079, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf,
|
||||||
|
0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7,
|
||||||
|
0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf,
|
||||||
|
0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7,
|
||||||
|
0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x02de, 0x02df,
|
||||||
|
0x0263, 0x006c, 0x0073, 0x0078, 0x0295, 0x02e5, 0x02e6, 0x02e7,
|
||||||
|
0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef,
|
||||||
|
0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7,
|
||||||
|
0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff,
|
||||||
|
0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307,
|
||||||
|
0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f,
|
||||||
|
0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317,
|
||||||
|
0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f,
|
||||||
|
0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327,
|
||||||
|
0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f,
|
||||||
|
0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337,
|
||||||
|
0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f,
|
||||||
|
0x0300, 0x0301, 0x0342, 0x0313, 0x0308, 0x0345, 0x0346, 0x0347,
|
||||||
|
0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f,
|
||||||
|
0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357,
|
||||||
|
0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f,
|
||||||
|
0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367,
|
||||||
|
0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f,
|
||||||
|
0x0370, 0x0371, 0x0372, 0x0373, 0x02b9, 0x0375, 0x0376, 0x0377,
|
||||||
|
0x0378, 0x0379, 0x0020, 0x037b, 0x037c, 0x037d, 0x003b, 0x037f,
|
||||||
|
0x0380, 0x0381, 0x0382, 0x0383, 0x0020, 0x00a8, 0x0391, 0x00b7,
|
||||||
|
0x0395, 0x0397, 0x0399, 0x038b, 0x039f, 0x038d, 0x03a5, 0x03a9,
|
||||||
|
0x03ca, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
|
||||||
|
0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
|
||||||
|
0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
|
||||||
|
0x03a8, 0x03a9, 0x0399, 0x03a5, 0x03b1, 0x03b5, 0x03b7, 0x03b9,
|
||||||
|
0x03cb, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
|
||||||
|
0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
|
||||||
|
0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
|
||||||
|
0x03c8, 0x03c9, 0x03b9, 0x03c5, 0x03bf, 0x03c5, 0x03c9, 0x03cf,
|
||||||
|
0x03b2, 0x03b8, 0x03a5, 0x03d2, 0x03d2, 0x03c6, 0x03c0, 0x03d7,
|
||||||
|
0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
|
||||||
|
0x03e0, 0x03e1, 0x03e2, 0x03e3, 0x03e4, 0x03e5, 0x03e6, 0x03e7,
|
||||||
|
0x03e8, 0x03e9, 0x03ea, 0x03eb, 0x03ec, 0x03ed, 0x03ee, 0x03ef,
|
||||||
|
0x03ba, 0x03c1, 0x03c2, 0x03f3, 0x0398, 0x03b5, 0x03f6, 0x03f7,
|
||||||
|
0x03f8, 0x03a3, 0x03fa, 0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff,
|
||||||
|
0x0415, 0x0415, 0x0402, 0x0413, 0x0404, 0x0405, 0x0406, 0x0406,
|
||||||
|
0x0408, 0x0409, 0x040a, 0x040b, 0x041a, 0x0418, 0x0423, 0x040f,
|
||||||
|
0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
|
||||||
|
0x0418, 0x0418, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
|
||||||
|
0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
|
||||||
|
0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
|
||||||
|
0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
|
||||||
|
0x0438, 0x0438, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
|
||||||
|
0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
|
||||||
|
0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
|
||||||
|
0x0435, 0x0435, 0x0452, 0x0433, 0x0454, 0x0455, 0x0456, 0x0456,
|
||||||
|
0x0458, 0x0459, 0x045a, 0x045b, 0x043a, 0x0438, 0x0443, 0x045f,
|
||||||
|
0x0460, 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467,
|
||||||
|
0x0468, 0x0469, 0x046a, 0x046b, 0x046c, 0x046d, 0x046e, 0x046f,
|
||||||
|
0x0470, 0x0471, 0x0472, 0x0473, 0x0474, 0x0475, 0x0474, 0x0475,
|
||||||
|
0x0478, 0x0479, 0x047a, 0x047b, 0x047c, 0x047d, 0x047e, 0x047f,
|
||||||
|
0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487,
|
||||||
|
0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x048f,
|
||||||
|
0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497,
|
||||||
|
0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x049f,
|
||||||
|
0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x04a7,
|
||||||
|
0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x04af,
|
||||||
|
0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x04b7,
|
||||||
|
0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x04be, 0x04bf,
|
||||||
|
0x04c0, 0x0416, 0x0436, 0x04c3, 0x04c4, 0x04c5, 0x04c6, 0x04c7,
|
||||||
|
0x04c8, 0x04c9, 0x04ca, 0x04cb, 0x04cc, 0x04cd, 0x04ce, 0x04cf,
|
||||||
|
0x0410, 0x0430, 0x0410, 0x0430, 0x04d4, 0x04d5, 0x0415, 0x0435,
|
||||||
|
0x04d8, 0x04d9, 0x04d8, 0x04d9, 0x0416, 0x0436, 0x0417, 0x0437,
|
||||||
|
0x04e0, 0x04e1, 0x0418, 0x0438, 0x0418, 0x0438, 0x041e, 0x043e,
|
||||||
|
0x04e8, 0x04e9, 0x04e8, 0x04e9, 0x042d, 0x044d, 0x0423, 0x0443,
|
||||||
|
0x0423, 0x0443, 0x0423, 0x0443, 0x0427, 0x0447, 0x04f6, 0x04f7,
|
||||||
|
0x042b, 0x044b, 0x04fa, 0x04fb, 0x04fc, 0x04fd, 0x04fe, 0x04ff,
|
||||||
|
};
|
||||||
|
|
||||||
|
// generated with:
|
||||||
|
// cat UnicodeData.txt | perl -e 'while (<>) { @foo = split(/;/); $foo[5] =~ s/<.*> //; $base[hex($foo[0])] = hex($foo[5]);} for ($i = 0; $i < 0x500; $i += 8) { for ($j = $i; $j < $i + 8; $j++) { printf("0x%04x, ", $base[$j] ? $base[$j] : $j)}; print "\n"; }'
|
|
@ -0,0 +1,277 @@
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2009, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <cutils/log.h>
|
||||||
|
|
||||||
|
#include <unicode/uchar.h>
|
||||||
|
|
||||||
|
//#define USE_ASSET_MANAGER
|
||||||
|
|
||||||
|
#ifdef USE_ASSET_MANAGER
|
||||||
|
#include <utils/AssetManager.h>
|
||||||
|
#include <utils/Asset.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "dictionary.h"
|
||||||
|
#include "basechars.h"
|
||||||
|
|
||||||
|
#define DEBUG_DICT 0
|
||||||
|
|
||||||
|
namespace latinime {
|
||||||
|
|
||||||
|
Dictionary::Dictionary(void *dict, int typedLetterMultiplier, int fullWordMultiplier)
|
||||||
|
{
|
||||||
|
mDict = (unsigned char*) dict;
|
||||||
|
mTypedLetterMultiplier = typedLetterMultiplier;
|
||||||
|
mFullWordMultiplier = fullWordMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary::~Dictionary()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int Dictionary::getSuggestions(int *codes, int codesSize, unsigned short *outWords, int *frequencies,
|
||||||
|
int maxWordLength, int maxWords, int maxAlternatives)
|
||||||
|
{
|
||||||
|
memset(frequencies, 0, maxWords * sizeof(*frequencies));
|
||||||
|
memset(outWords, 0, maxWords * maxWordLength * sizeof(*outWords));
|
||||||
|
|
||||||
|
mFrequencies = frequencies;
|
||||||
|
mOutputChars = outWords;
|
||||||
|
mInputCodes = codes;
|
||||||
|
mInputLength = codesSize;
|
||||||
|
mMaxAlternatives = maxAlternatives;
|
||||||
|
mMaxWordLength = maxWordLength;
|
||||||
|
mMaxWords = maxWords;
|
||||||
|
mWords = 0;
|
||||||
|
|
||||||
|
getWordsRec(0, 0, mInputLength * 3, false, 1, 0);
|
||||||
|
|
||||||
|
if (DEBUG_DICT) LOGI("Returning %d words", mWords);
|
||||||
|
return mWords;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short
|
||||||
|
Dictionary::getChar(int *pos)
|
||||||
|
{
|
||||||
|
unsigned short ch = (unsigned short) (mDict[(*pos)++] & 0xFF);
|
||||||
|
// If the code is 255, then actual 16 bit code follows (in big endian)
|
||||||
|
if (ch == 0xFF) {
|
||||||
|
ch = ((mDict[*pos] & 0xFF) << 8) | (mDict[*pos + 1] & 0xFF);
|
||||||
|
(*pos) += 2;
|
||||||
|
}
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Dictionary::getAddress(int *pos)
|
||||||
|
{
|
||||||
|
int address = 0;
|
||||||
|
address += (mDict[*pos] & 0x7F) << 16;
|
||||||
|
address += (mDict[*pos + 1] & 0xFF) << 8;
|
||||||
|
address += (mDict[*pos + 2] & 0xFF);
|
||||||
|
*pos += 3;
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Dictionary::wideStrLen(unsigned short *str)
|
||||||
|
{
|
||||||
|
if (!str) return 0;
|
||||||
|
unsigned short *end = str;
|
||||||
|
while (*end)
|
||||||
|
end++;
|
||||||
|
return end - str;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Dictionary::addWord(unsigned short *word, int length, int frequency)
|
||||||
|
{
|
||||||
|
word[length] = 0;
|
||||||
|
if (DEBUG_DICT) LOGI("Found word = %s, freq = %d : \n", word, frequency);
|
||||||
|
|
||||||
|
// Find the right insertion point
|
||||||
|
int insertAt = 0;
|
||||||
|
while (insertAt < mMaxWords) {
|
||||||
|
if (frequency > mFrequencies[insertAt]
|
||||||
|
|| (mFrequencies[insertAt] == frequency
|
||||||
|
&& length < wideStrLen(mOutputChars + insertAt * mMaxWordLength))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
insertAt++;
|
||||||
|
}
|
||||||
|
if (insertAt < mMaxWords) {
|
||||||
|
memmove((char*) mFrequencies + (insertAt + 1) * sizeof(mFrequencies[0]),
|
||||||
|
(char*) mFrequencies + insertAt * sizeof(mFrequencies[0]),
|
||||||
|
(mMaxWords - insertAt - 1) * sizeof(mFrequencies[0]));
|
||||||
|
mFrequencies[insertAt] = frequency;
|
||||||
|
memmove((char*) mOutputChars + (insertAt + 1) * mMaxWordLength * sizeof(short),
|
||||||
|
(char*) mOutputChars + (insertAt ) * mMaxWordLength * sizeof(short),
|
||||||
|
(mMaxWords - insertAt - 1) * sizeof(short) * mMaxWordLength);
|
||||||
|
unsigned short *dest = mOutputChars + (insertAt ) * mMaxWordLength;
|
||||||
|
while (length--) {
|
||||||
|
*dest++ = *word++;
|
||||||
|
}
|
||||||
|
*dest = 0; // NULL terminate
|
||||||
|
// Update the word count
|
||||||
|
if (insertAt + 1 > mWords) mWords = insertAt + 1;
|
||||||
|
if (DEBUG_DICT) LOGI("Added word at %d\n", insertAt);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short
|
||||||
|
Dictionary::toLowerCase(unsigned short c, const int depth) {
|
||||||
|
if (c < sizeof(BASE_CHARS) / sizeof(BASE_CHARS[0])) {
|
||||||
|
c = BASE_CHARS[c];
|
||||||
|
}
|
||||||
|
if (depth == 0) {
|
||||||
|
if (c >='A' && c <= 'Z') {
|
||||||
|
c |= 32;
|
||||||
|
} else if (c > 127) {
|
||||||
|
c = u_tolower(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Dictionary::sameAsTyped(unsigned short *word, int length)
|
||||||
|
{
|
||||||
|
if (length != mInputLength) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int *inputCodes = mInputCodes;
|
||||||
|
while (length--) {
|
||||||
|
if ((unsigned int) *inputCodes != (unsigned int) *word) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
inputCodes += mMaxAlternatives;
|
||||||
|
word++;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char QUOTE = '\'';
|
||||||
|
|
||||||
|
void
|
||||||
|
Dictionary::getWordsRec(int pos, int depth, int maxDepth, bool completion, int snr, int inputIndex)
|
||||||
|
{
|
||||||
|
// Optimization: Prune out words that are too long compared to how much was typed.
|
||||||
|
if (depth > maxDepth) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int count = getCount(&pos);
|
||||||
|
int *currentChars = NULL;
|
||||||
|
if (mInputLength <= inputIndex) {
|
||||||
|
completion = true;
|
||||||
|
} else {
|
||||||
|
currentChars = mInputCodes + (inputIndex * mMaxAlternatives);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
unsigned short c = getChar(&pos);
|
||||||
|
unsigned short lowerC = toLowerCase(c, depth);
|
||||||
|
bool terminal = getTerminal(&pos);
|
||||||
|
int childrenAddress = getAddress(&pos);
|
||||||
|
int freq = getFreq(&pos);
|
||||||
|
// If we are only doing completions, no need to look at the typed characters.
|
||||||
|
if (completion) {
|
||||||
|
mWord[depth] = c;
|
||||||
|
if (terminal) {
|
||||||
|
addWord(mWord, depth + 1, freq * snr);
|
||||||
|
}
|
||||||
|
if (childrenAddress != 0) {
|
||||||
|
getWordsRec(childrenAddress, depth + 1, maxDepth,
|
||||||
|
completion, snr, inputIndex);
|
||||||
|
}
|
||||||
|
} else if (c == QUOTE && currentChars[0] != QUOTE) {
|
||||||
|
// Skip the ' and continue deeper
|
||||||
|
mWord[depth] = QUOTE;
|
||||||
|
if (childrenAddress != 0) {
|
||||||
|
getWordsRec(childrenAddress, depth + 1, maxDepth, false, snr, inputIndex);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int j = 0;
|
||||||
|
while (currentChars[j] > 0) {
|
||||||
|
int addedWeight = j == 0 ? mTypedLetterMultiplier : 1;
|
||||||
|
if (currentChars[j] == lowerC || currentChars[j] == c) {
|
||||||
|
mWord[depth] = c;
|
||||||
|
if (mInputLength == inputIndex + 1) {
|
||||||
|
if (terminal) {
|
||||||
|
if (//INCLUDE_TYPED_WORD_IF_VALID ||
|
||||||
|
!sameAsTyped(mWord, depth + 1)) {
|
||||||
|
addWord(mWord, depth + 1,
|
||||||
|
(freq * snr * addedWeight * mFullWordMultiplier));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (childrenAddress != 0) {
|
||||||
|
getWordsRec(childrenAddress, depth + 1,
|
||||||
|
maxDepth, true, snr * addedWeight, inputIndex + 1);
|
||||||
|
}
|
||||||
|
} else if (childrenAddress != 0) {
|
||||||
|
getWordsRec(childrenAddress, depth + 1, maxDepth,
|
||||||
|
false, snr * addedWeight, inputIndex + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Dictionary::isValidWord(unsigned short *word, int length)
|
||||||
|
{
|
||||||
|
return isValidWordRec(0, word, 0, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Dictionary::isValidWordRec(int pos, unsigned short *word, int offset, int length) {
|
||||||
|
int count = getCount(&pos);
|
||||||
|
unsigned short currentChar = (unsigned short) word[offset];
|
||||||
|
for (int j = 0; j < count; j++) {
|
||||||
|
unsigned short c = getChar(&pos);
|
||||||
|
int terminal = getTerminal(&pos);
|
||||||
|
int childPos = getAddress(&pos);
|
||||||
|
if (c == currentChar) {
|
||||||
|
if (offset == length - 1) {
|
||||||
|
if (terminal) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (childPos != 0) {
|
||||||
|
if (isValidWordRec(childPos, word, offset + 1, length)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getFreq(&pos);
|
||||||
|
// There could be two instances of each alphabet - upper and lower case. So continue
|
||||||
|
// looking ...
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace latinime
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LATINIME_DICTIONARY_H
|
||||||
|
#define LATINIME_DICTIONARY_H
|
||||||
|
|
||||||
|
namespace latinime {
|
||||||
|
|
||||||
|
class Dictionary {
|
||||||
|
public:
|
||||||
|
Dictionary(void *dict, int typedLetterMultipler, int fullWordMultiplier);
|
||||||
|
int getSuggestions(int *codes, int codesSize, unsigned short *outWords, int *frequencies,
|
||||||
|
int maxWordLength, int maxWords, int maxAlternatives);
|
||||||
|
bool isValidWord(unsigned short *word, int length);
|
||||||
|
void setAsset(void *asset) { mAsset = asset; }
|
||||||
|
void *getAsset() { return mAsset; }
|
||||||
|
~Dictionary();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
int getAddress(int *pos);
|
||||||
|
bool getTerminal(int *pos) { return (mDict[*pos] & 0x80) > 0; }
|
||||||
|
int getFreq(int *pos) { return mDict[(*pos)++] & 0xFF; }
|
||||||
|
int getCount(int *pos) { return mDict[(*pos)++] & 0xFF; }
|
||||||
|
unsigned short getChar(int *pos);
|
||||||
|
int wideStrLen(unsigned short *str);
|
||||||
|
|
||||||
|
bool sameAsTyped(unsigned short *word, int length);
|
||||||
|
bool addWord(unsigned short *word, int length, int frequency);
|
||||||
|
unsigned short toLowerCase(unsigned short c, int depth);
|
||||||
|
void getWordsRec(int pos, int depth, int maxDepth, bool completion, int frequency,
|
||||||
|
int inputIndex);
|
||||||
|
bool isValidWordRec(int pos, unsigned short *word, int offset, int length);
|
||||||
|
|
||||||
|
unsigned char *mDict;
|
||||||
|
void *mAsset;
|
||||||
|
|
||||||
|
int *mFrequencies;
|
||||||
|
int mMaxWords;
|
||||||
|
int mMaxWordLength;
|
||||||
|
int mWords;
|
||||||
|
unsigned short *mOutputChars;
|
||||||
|
int *mInputCodes;
|
||||||
|
int mInputLength;
|
||||||
|
int mMaxAlternatives;
|
||||||
|
unsigned short mWord[128];
|
||||||
|
|
||||||
|
int mFullWordMultiplier;
|
||||||
|
int mTypedLetterMultiplier;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
}; // namespace latinime
|
||||||
|
|
||||||
|
#endif // LATINIME_DICTIONARY_H
|
After Width: | Height: | Size: 166 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 593 B |
After Width: | Height: | Size: 528 B |
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2008 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item android:state_pressed="false"
|
||||||
|
android:drawable="@android:color/transparent" />
|
||||||
|
|
||||||
|
<item android:state_pressed="true"
|
||||||
|
android:drawable="@drawable/highlight_pressed" />
|
||||||
|
|
||||||
|
</selector>
|
After Width: | Height: | Size: 445 B |
After Width: | Height: | Size: 440 B |
After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 166 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 771 B |
After Width: | Height: | Size: 524 B |
After Width: | Height: | Size: 498 B |
After Width: | Height: | Size: 735 B |
After Width: | Height: | Size: 478 B |
After Width: | Height: | Size: 464 B |
After Width: | Height: | Size: 381 B |
After Width: | Height: | Size: 501 B |
After Width: | Height: | Size: 437 B |
After Width: | Height: | Size: 333 B |
After Width: | Height: | Size: 223 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 506 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 963 B |
After Width: | Height: | Size: 954 B |
After Width: | Height: | Size: 866 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1017 B |
After Width: | Height: | Size: 799 B |
After Width: | Height: | Size: 424 B |
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2009, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textColor="?android:attr/textColorPrimary"
|
||||||
|
android:minWidth="32dip"
|
||||||
|
/>
|
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:textColor="?android:attr/textColorPrimaryInverse"
|
||||||
|
android:minWidth="32dip"
|
||||||
|
android:gravity="center"
|
||||||
|
android:background="@drawable/candidate_feedback_background"
|
||||||
|
/>
|
|
@ -0,0 +1,79 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<com.android.inputmethod.latin.CandidateViewContainer
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/keyboard_suggest_strip"
|
||||||
|
>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/candidate_left_parent"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/candidate_left"
|
||||||
|
android:background="@drawable/ic_suggest_scroll_background"
|
||||||
|
android:src="@drawable/ic_suggest_strip_scroll_left_arrow"
|
||||||
|
android:layout_width="36dp"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:clickable="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:src="@drawable/keyboard_suggest_strip_divider"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.android.inputmethod.latin.CandidateView
|
||||||
|
android:id="@+id/candidates"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="38dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/candidate_right_parent"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:clickable="true"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
<ImageView
|
||||||
|
android:src="@drawable/keyboard_suggest_strip_divider"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/candidate_right"
|
||||||
|
android:background="@drawable/ic_suggest_scroll_background"
|
||||||
|
android:src="@drawable/ic_suggest_strip_scroll_right_arrow"
|
||||||
|
android:layout_width="36dp"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:clickable="true"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</com.android.inputmethod.latin.CandidateViewContainer>
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<com.android.inputmethod.latin.LatinKeyboardView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@android:id/keyboardView"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Při stisku klávesy vibrovat"</string>
|
||||||
|
<string name="sound_on_keypress">"Zvuk při stisku klávesy"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"Automatická interpunkce"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : Uloženo"</string>
|
||||||
|
<string name="alternates_for_a">"áàâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"éěèêë"</string>
|
||||||
|
<string name="alternates_for_i">"íìîï"</string>
|
||||||
|
<string name="alternates_for_o">"óòôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ůúùûü"</string>
|
||||||
|
<string name="alternates_for_s">"š§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ňñ"</string>
|
||||||
|
<string name="alternates_for_c">"čç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Vibrieren auf Tastendruck"</string>
|
||||||
|
<string name="sound_on_keypress">"Sound bei Tastendruck"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"Autom. Zeichensetzung"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : Gespeichert"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
<resources>
|
||||||
|
<bool name="im_is_default">true</bool>
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Vibrar al pulsar tecla"</string>
|
||||||
|
<string name="sound_on_keypress">"Sonido al pulsar una tecla"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"Puntuación automática"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : Guardada"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2009, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- Symbols that are commonly considered word separators in this language -->
|
||||||
|
<string name="word_separators">.\u0020,;:!?\'\n()[]*&@{}/<>_+=|\u0022</string>
|
||||||
|
<!-- Symbols that are sentence separators, for purposes of making it hug the last sentence. -->
|
||||||
|
<string name="sentence_separators">.,</string>
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Vibrer à chaque touche enfoncée"</string>
|
||||||
|
<string name="sound_on_keypress">"Son à chaque touche enfoncée"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"Ponctuation automatique"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2009, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- Symbols that are commonly considered word separators in this language -->
|
||||||
|
<string name="word_separators">.\u0020,;:!?\'\n()[]*&@{}/<>_+=|\u0022</string>
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Vibra quando premi un tasto"</string>
|
||||||
|
<string name="sound_on_keypress">"Suona quando premi un tasto"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"Punteggiatura automatica"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : parola salvata"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"キーのバイブレーション"</string>
|
||||||
|
<string name="sound_on_keypress">"キーを押したときの音"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"句読点を自動入力"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g>:保存しました"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"키를 누를 때 진동 발생"</string>
|
||||||
|
<string name="sound_on_keypress">"버튼을 누를 때 소리 발생"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"자동 구두점 입력"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : 저장됨"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<dimen name="key_height">47dip</dimen>
|
||||||
|
</resources>
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Vibrer ved tastetrykk"</string>
|
||||||
|
<string name="sound_on_keypress">"Lyd ved tastetrykk"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_correction_summary">"Autokorriger forrige ord ved mellomrom eller linjeskift"</string>
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_cap">"Stor forbokstav"</string>
|
||||||
|
<string name="auto_cap_summary">"Start automatisk setninger med stor bokstav"</string>
|
||||||
|
<string name="auto_punctuate">"Automatisk punktum"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g>: Lagret"</string>
|
||||||
|
<string name="alternates_for_a">"åæáàâãä"</string>
|
||||||
|
<string name="alternates_for_e">"éèêë"</string>
|
||||||
|
<string name="alternates_for_i">"íìîï"</string>
|
||||||
|
<string name="alternates_for_o">"ôóòöõœø"</string>
|
||||||
|
<string name="alternates_for_u">"üùúû"</string>
|
||||||
|
<string name="alternates_for_s">"ߧ"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<string name="tip_add_to_dictionary">"Trykk lenge på ordet lengst til venstre for å legge det til i ordlisten"</string>
|
||||||
|
<string name="label_go_key">"Gå"</string>
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<string name="label_symbol_key">"?123"</string>
|
||||||
|
<string name="label_phone_key">"123"</string>
|
||||||
|
<string name="label_alpha_key">"ABC"</string>
|
||||||
|
<string name="label_alt_key">"ALT"</string>
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Trillen bij druk op een toets"</string>
|
||||||
|
<string name="sound_on_keypress">"Geluid bij druk op een toets"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"Automatische interpunctie"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : Opgeslagen"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Wibruj przy naciśnięciu klawisza"</string>
|
||||||
|
<string name="sound_on_keypress">"Dźwięk przy naciśnięciu klawisza"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"Automatyczna interpunkcja"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : Zapisano"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"Вибрация при нажатии клавиш"</string>
|
||||||
|
<string name="sound_on_keypress">"Звук при нажатии клавиш"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"Автоматическая пунктуация"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g> : сохранено"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"按键时振动"</string>
|
||||||
|
<string name="sound_on_keypress">"按键时发出声音"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"自动加标点"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g>:已保存"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
<resources xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- no translation found for english_ime_name (5849054103817924472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for english_ime_settings (8408735206364332137) -->
|
||||||
|
<skip />
|
||||||
|
<string name="vibrate_on_keypress">"按下按鍵時震動"</string>
|
||||||
|
<string name="sound_on_keypress">"按下按鍵時播放音效"</string>
|
||||||
|
<!-- no translation found for hit_correction (4855351009261318389) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_summary (8761701873008070796) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land (2567691684825205448) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for hit_correction_land_summary (4076803842198368328) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction (7911639788808958255) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_correction_summary (6881047311475758267) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction (466220283138359837) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_category (7027100625580696660) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_summary (459788228830873110) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_complete_dialog_title (2172048590607201920) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape (4874601565593216183) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_landscape_summary (6736551095997839472) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap (1719746674854628252) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for auto_cap_summary (3260681697600786825) -->
|
||||||
|
<skip />
|
||||||
|
<string name="auto_punctuate">"自動標點"</string>
|
||||||
|
<!-- no translation found for auto_punctuate_summary (7849876837879793721) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes:0 (4870266572388153286) -->
|
||||||
|
<!-- no translation found for prediction_modes:1 (1669461741568287396) -->
|
||||||
|
<!-- no translation found for prediction_modes:2 (4894328801530136615) -->
|
||||||
|
<!-- no translation found for prediction_none (2472795101338047944) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_basic (8407291081834155558) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_full (3765102052052510268) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for prediction_modes_values:0 (1346378763221728910) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:1 (7980848218230433021) -->
|
||||||
|
<!-- no translation found for prediction_modes_values:2 (7444980361469942622) -->
|
||||||
|
<string name="added_word">"<xliff:g id="WORD">%s</xliff:g>:已儲存"</string>
|
||||||
|
<string name="alternates_for_a">"àáâãäåæ"</string>
|
||||||
|
<string name="alternates_for_e">"èéêë"</string>
|
||||||
|
<string name="alternates_for_i">"ìíîï"</string>
|
||||||
|
<string name="alternates_for_o">"òóôõöœø"</string>
|
||||||
|
<string name="alternates_for_u">"ùúûü"</string>
|
||||||
|
<string name="alternates_for_s">"§ß"</string>
|
||||||
|
<string name="alternates_for_n">"ñ"</string>
|
||||||
|
<string name="alternates_for_c">"ç"</string>
|
||||||
|
<string name="alternates_for_y">"ýÿ"</string>
|
||||||
|
<!-- no translation found for alternates_for_z (243837378542028049) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_long_press (6101270866284343344) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_dismiss (7585579046862204381) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_access_symbols (6344098517525531652) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for tip_add_to_dictionary (1487293888469227817) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_go_key (1635148082137219148) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_next_key (362972844525672568) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_send_key (2815056534433717444) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_symbol_key (6175820506864489453) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_phone_key (4275497665515080551) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alpha_key (8864943487292437456) -->
|
||||||
|
<skip />
|
||||||
|
<!-- no translation found for label_alt_key (2846315350346694811) -->
|
||||||
|
<skip />
|
||||||
|
</resources>
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
<resources>
|
||||||
|
<color name="candidate_normal">#FF000000</color>
|
||||||
|
<color name="candidate_recommended">#FFE35900</color>
|
||||||
|
<color name="candidate_other">#ff808080</color>
|
||||||
|
</resources>
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<dimen name="key_height">50dip</dimen>
|
||||||
|
<dimen name="bubble_pointer_offset">22dip</dimen>
|
||||||
|
</resources>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2009, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- Symbols that are commonly considered word separators in this language -->
|
||||||
|
<string name="word_separators">.\u0020,;:!?\n()[]*&@{}/<>_+=|\u0022</string>
|
||||||
|
<!-- Symbols that are sentence separators, for purposes of making it hug the last sentence. -->
|
||||||
|
<string name="sentence_separators">.,;:!?</string>
|
||||||
|
</resources>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<!-- Vibration duration in milliseconds, for key presses in the IME. This can be hardware
|
||||||
|
dependent and may require overriding with a device specific overlay. -->
|
||||||
|
<integer name="vibrate_duration_ms">40</integer>
|
||||||
|
</resources>
|
|
@ -0,0 +1,142 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- Title for Latin keyboard -->
|
||||||
|
<string name="english_ime_name">Android keyboard</string>
|
||||||
|
<!-- Title for Latin keyboard settings activity / dialog -->
|
||||||
|
<string name="english_ime_settings">Android keyboard settings</string>
|
||||||
|
|
||||||
|
<!-- Option to provide vibrate/haptic feedback on keypress -->
|
||||||
|
<string name="vibrate_on_keypress">Vibrate on keypress</string>
|
||||||
|
<!-- Option to play back sound on keypress in soft keyboard -->
|
||||||
|
<string name="sound_on_keypress">Sound on keypress</string>
|
||||||
|
|
||||||
|
<!-- Option to enable using nearby keys when correcting/predicting -->
|
||||||
|
<string name="hit_correction">Correct typing errors</string>
|
||||||
|
|
||||||
|
<!-- Description for hit_correction -->
|
||||||
|
<string name="hit_correction_summary">Enable input error correction</string>
|
||||||
|
|
||||||
|
<!-- Option to enable using nearby keys when correcting/predicting in landscape-->
|
||||||
|
<string name="hit_correction_land">Landscape input errors</string>
|
||||||
|
|
||||||
|
<!-- Description for hit_correction in landscape -->
|
||||||
|
<string name="hit_correction_land_summary">Enable input error correction</string>
|
||||||
|
|
||||||
|
<!-- Option to automatically correct word on hitting space -->
|
||||||
|
<string name="auto_correction">Word suggestions</string>
|
||||||
|
|
||||||
|
<!-- Description for auto_correction -->
|
||||||
|
<string name="auto_correction_summary">Automatically correct the previous word</string>
|
||||||
|
|
||||||
|
<!-- Option to enable text prediction -->
|
||||||
|
<string name="prediction">Word suggestions</string>
|
||||||
|
<!-- Category title for text prediction -->
|
||||||
|
<string name="prediction_category">Word suggestion settings</string>
|
||||||
|
<!-- Description for text prediction -->
|
||||||
|
<string name="prediction_summary">Enable auto completion while typing</string>
|
||||||
|
|
||||||
|
<!-- Dialog title for auto complete choices -->
|
||||||
|
<string name="auto_complete_dialog_title">Auto completion</string>
|
||||||
|
|
||||||
|
<!-- Option to enable text prediction in landscape -->
|
||||||
|
<string name="prediction_landscape">Increase text field size</string>
|
||||||
|
<!-- Description for text prediction -->
|
||||||
|
<string name="prediction_landscape_summary">Hide word suggestions in landscape view</string>
|
||||||
|
|
||||||
|
<!-- Option to enable auto capitalization of sentences -->
|
||||||
|
<string name="auto_cap">Auto-capitalization</string>
|
||||||
|
<!-- Description for auto cap -->
|
||||||
|
<string name="auto_cap_summary">Capitalize the start of a sentence</string>
|
||||||
|
<!-- Option to enable auto punctuate -->
|
||||||
|
<string name="auto_punctuate">Auto-punctuate</string>
|
||||||
|
<!-- Description for auto punctuate -->
|
||||||
|
<string name="auto_punctuate_summary"></string>
|
||||||
|
|
||||||
|
<!-- Array of prediction modes -->
|
||||||
|
<string-array name="prediction_modes">
|
||||||
|
<item>None</item>
|
||||||
|
<item>Basic</item>
|
||||||
|
<item>Advanced</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<!-- Don't translate -->
|
||||||
|
<string name="prediction_none" >0</string>
|
||||||
|
<!-- Don't translate -->
|
||||||
|
<string name="prediction_basic">1</string>
|
||||||
|
<!-- Don't translate -->
|
||||||
|
<string name="prediction_full" >2</string>
|
||||||
|
|
||||||
|
<string-array name="prediction_modes_values">
|
||||||
|
<item>@string/prediction_none</item>
|
||||||
|
<item>@string/prediction_basic</item>
|
||||||
|
<item>@string/prediction_full</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<!-- Indicates that a word has been added to the dictionary -->
|
||||||
|
<string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string>
|
||||||
|
<!-- Accented forms of "a" -->
|
||||||
|
<string name="alternates_for_a">àáâãäåæ</string>
|
||||||
|
<!-- Accented forms of "e" -->
|
||||||
|
<string name="alternates_for_e">èéêë</string>
|
||||||
|
<!-- Accented forms of "i" -->
|
||||||
|
<string name="alternates_for_i">ìíîï</string>
|
||||||
|
<!-- Accented forms of "o" -->
|
||||||
|
<string name="alternates_for_o">òóôõöœø</string>
|
||||||
|
<!-- Accented forms of "u" -->
|
||||||
|
<string name="alternates_for_u">ùúûü</string>
|
||||||
|
<!-- Letters associated with "s" -->
|
||||||
|
<string name="alternates_for_s">§ß</string>
|
||||||
|
<!-- Accented forms of "n" -->
|
||||||
|
<string name="alternates_for_n">ñ</string>
|
||||||
|
<!-- Accented forms of "c" -->
|
||||||
|
<string name="alternates_for_c">ç</string>
|
||||||
|
<!-- Accented forms of "y" -->
|
||||||
|
<string name="alternates_for_y">ýÿ</string>
|
||||||
|
<!-- Accented forms of "z" -->
|
||||||
|
<string name="alternates_for_z"></string>
|
||||||
|
|
||||||
|
<!-- Tip to long press on keys -->
|
||||||
|
<string name="tip_long_press">Hold a key down to see accents (ø, ö, etc.)</string>
|
||||||
|
<!-- Tip to dismiss keyboard -->
|
||||||
|
<string name="tip_dismiss">Press the back key \u21B6 to close the keyboard at any point</string>
|
||||||
|
<!-- Tip to press ?123 to access numbers and symbols -->
|
||||||
|
<string name="tip_access_symbols">Access numbers and symbols</string>
|
||||||
|
<!-- Tip to long press on typed word to add to dictionary -->
|
||||||
|
<string name="tip_add_to_dictionary">Press and hold the left-most word to add it to the dictionary
|
||||||
|
</string>
|
||||||
|
|
||||||
|
<!-- Label for soft enter key when it performs GO action. Must be short to fit on key! -->
|
||||||
|
<string name="label_go_key">Go</string>
|
||||||
|
<!-- Label for soft enter key when it performs NEXT action. Must be short to fit on key! -->
|
||||||
|
<string name="label_next_key">Next</string>
|
||||||
|
<!-- Label for soft enter key when it performs DONE action. Must be short to fit on key! -->
|
||||||
|
<string name="label_done_key">Done</string>
|
||||||
|
<!-- Label for soft enter key when it performs SEND action. Must be short to fit on key! -->
|
||||||
|
<string name="label_send_key">Send</string>
|
||||||
|
<!-- Label for "switch to symbols" key. Must be short to fit on key! -->
|
||||||
|
<string name="label_symbol_key">\?123</string>
|
||||||
|
<!-- Label for "switch to numeric" key. Must be short to fit on key! -->
|
||||||
|
<string name="label_phone_key">123</string>
|
||||||
|
<!-- Label for "switch to alphabetic" key. Must be short to fit on key! -->
|
||||||
|
<string name="label_alpha_key">ABC</string>
|
||||||
|
<!-- Label for ALT modifier key. Must be short to fit on key! -->
|
||||||
|
<string name="label_alt_key">ALT</string>
|
||||||
|
</resources>
|
|
@ -0,0 +1,167 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="119" android:keyLabel="w"/>
|
||||||
|
<Key android:codes="101" android:keyLabel="e"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_e"
|
||||||
|
/>
|
||||||
|
<Key android:codes="114" android:keyLabel="r"/>
|
||||||
|
<Key android:codes="116" android:keyLabel="t"/>
|
||||||
|
<Key android:codes="122" android:keyLabel="z" />
|
||||||
|
<Key android:codes="117" android:keyLabel="u"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_u"
|
||||||
|
/>
|
||||||
|
<Key android:codes="105" android:keyLabel="i"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_i"
|
||||||
|
/>
|
||||||
|
<Key android:codes="111" android:keyLabel="o"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_o"
|
||||||
|
/>
|
||||||
|
<Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="97" android:keyLabel="a" android:horizontalGap="5%p"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_a"
|
||||||
|
android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="115" android:keyLabel="s"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_s"
|
||||||
|
/>
|
||||||
|
<Key android:codes="100" android:keyLabel="d"/>
|
||||||
|
<Key android:codes="102" android:keyLabel="f"/>
|
||||||
|
<Key android:codes="103" android:keyLabel="g"/>
|
||||||
|
<Key android:codes="104" android:keyLabel="h"/>
|
||||||
|
<Key android:codes="106" android:keyLabel="j"/>
|
||||||
|
<Key android:codes="107" android:keyLabel="k"/>
|
||||||
|
<Key android:codes="108" android:keyLabel="l" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift"
|
||||||
|
android:keyWidth="15%p" android:isModifier="true"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_shift"
|
||||||
|
android:isSticky="true" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="121" android:keyLabel="y"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_y"
|
||||||
|
/>
|
||||||
|
<Key android:codes="120" android:keyLabel="x"/>
|
||||||
|
<Key android:codes="99" android:keyLabel="c"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_c"
|
||||||
|
/>
|
||||||
|
<Key android:codes="118" android:keyLabel="v"/>
|
||||||
|
<Key android:codes="98" android:keyLabel="b"/>
|
||||||
|
<Key android:codes="110" android:keyLabel="n"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_n"
|
||||||
|
/>
|
||||||
|
<Key android:codes="109" android:keyLabel="m"/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
|
||||||
|
android:keyWidth="15%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_normal" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p" />
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="30%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_url" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel=".com" android:keyOutputText=".com"
|
||||||
|
android:popupKeyboard="@xml/popup_domains"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:keyLabel="/" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="15%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_email" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p" />
|
||||||
|
<Key android:keyLabel="\@" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="15%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_im" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="30%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:keyLabel=":-)" android:keyOutputText=":-) "
|
||||||
|
android:popupKeyboard="@xml/popup_smileys"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
||||||
|
|
|
@ -0,0 +1,168 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="97" android:keyLabel="a"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_a"
|
||||||
|
android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="122" android:keyLabel="z"/>
|
||||||
|
<Key android:codes="101" android:keyLabel="e"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_e"
|
||||||
|
/>
|
||||||
|
<Key android:codes="114" android:keyLabel="r"/>
|
||||||
|
<Key android:codes="116" android:keyLabel="t"/>
|
||||||
|
<Key android:codes="121" android:keyLabel="y"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_y"
|
||||||
|
/>
|
||||||
|
<Key android:codes="117" android:keyLabel="u"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_u"
|
||||||
|
/>
|
||||||
|
<Key android:codes="105" android:keyLabel="i"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_i"
|
||||||
|
/>
|
||||||
|
<Key android:codes="111" android:keyLabel="o"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_o"
|
||||||
|
/>
|
||||||
|
<Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="115" android:keyLabel="s"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_s"
|
||||||
|
/>
|
||||||
|
<Key android:codes="100" android:keyLabel="d"/>
|
||||||
|
<Key android:codes="102" android:keyLabel="f"/>
|
||||||
|
<Key android:codes="103" android:keyLabel="g"/>
|
||||||
|
<Key android:codes="104" android:keyLabel="h"/>
|
||||||
|
<Key android:codes="106" android:keyLabel="j"/>
|
||||||
|
<Key android:codes="107" android:keyLabel="k"/>
|
||||||
|
<Key android:codes="108" android:keyLabel="l"/>
|
||||||
|
<Key android:codes="109" android:keyLabel="m" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift"
|
||||||
|
android:keyWidth="15%p" android:isModifier="true"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_shift"
|
||||||
|
android:isSticky="true" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="119" android:keyLabel="w"/>
|
||||||
|
<Key android:codes="120" android:keyLabel="x"/>
|
||||||
|
<Key android:codes="99" android:keyLabel="c"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_c"
|
||||||
|
/>
|
||||||
|
<Key android:codes="118" android:keyLabel="v"/>
|
||||||
|
<Key android:codes="98" android:keyLabel="b"/>
|
||||||
|
<Key android:codes="110" android:keyLabel="n"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_n"
|
||||||
|
/>
|
||||||
|
<!--Key android:codes="233,224,232,234" android:keyLabel="é"/-->
|
||||||
|
<Key android:keyLabel="\'"/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
|
||||||
|
android:keyWidth="15%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_normal" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p" />
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="30%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_url" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel=".com" android:keyOutputText=".com"
|
||||||
|
android:popupKeyboard="@xml/popup_domains"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:keyLabel="/" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="15%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_email" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p" />
|
||||||
|
<Key android:keyLabel="\@" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="15%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_im" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="30%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:keyLabel=":-)" android:keyOutputText=":-) "
|
||||||
|
android:popupKeyboard="@xml/popup_smileys"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="97" android:keyLabel="a"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_a"
|
||||||
|
android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="122" android:keyLabel="z"/>
|
||||||
|
<Key android:codes="101" android:keyLabel="e"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_e"
|
||||||
|
/>
|
||||||
|
<Key android:codes="114" android:keyLabel="r"/>
|
||||||
|
<Key android:codes="116" android:keyLabel="t"/>
|
||||||
|
<Key android:codes="121" android:keyLabel="y"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_y"
|
||||||
|
/>
|
||||||
|
<Key android:codes="117" android:keyLabel="u"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_u"
|
||||||
|
/>
|
||||||
|
<Key android:codes="105" android:keyLabel="i"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_i"
|
||||||
|
/>
|
||||||
|
<Key android:codes="111" android:keyLabel="o"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_o"
|
||||||
|
/>
|
||||||
|
<Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="115" android:keyLabel="s"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_s"
|
||||||
|
/>
|
||||||
|
<Key android:codes="100" android:keyLabel="d"/>
|
||||||
|
<Key android:codes="102" android:keyLabel="f"/>
|
||||||
|
<Key android:codes="103" android:keyLabel="g"/>
|
||||||
|
<Key android:codes="104" android:keyLabel="h"/>
|
||||||
|
<Key android:codes="106" android:keyLabel="j"/>
|
||||||
|
<Key android:codes="107" android:keyLabel="k"/>
|
||||||
|
<Key android:codes="108" android:keyLabel="l"/>
|
||||||
|
<Key android:codes="109" android:keyLabel="m" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift"
|
||||||
|
android:keyWidth="15%p" android:isModifier="true"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_shift"
|
||||||
|
android:isSticky="true" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="119" android:keyLabel="w"/>
|
||||||
|
<Key android:codes="120" android:keyLabel="x"/>
|
||||||
|
<Key android:codes="99" android:keyLabel="c"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_c"
|
||||||
|
/>
|
||||||
|
<Key android:codes="118" android:keyLabel="v"/>
|
||||||
|
<Key android:codes="98" android:keyLabel="b"/>
|
||||||
|
<Key android:codes="110" android:keyLabel="n"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_n"
|
||||||
|
/>
|
||||||
|
<Key android:codes="233,224,232,234" android:keyLabel="é"/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
|
||||||
|
android:keyWidth="15%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_done"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="-2" android:keyLabel="123" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="30%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46,44" android:keyLabel=". ,"
|
||||||
|
android:popupKeyboard="@xml/popup_punctuation" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:keyLabel="a"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_a"
|
||||||
|
android:keyEdgeFlags="left" />
|
||||||
|
<Key android:keyLabel="b" />
|
||||||
|
<Key android:keyLabel="c"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_c" />
|
||||||
|
<Key android:keyLabel="d" />
|
||||||
|
<Key android:keyLabel="e"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_e" />
|
||||||
|
<Key android:keyLabel="f" />
|
||||||
|
<Key android:keyLabel="g" />
|
||||||
|
<Key android:keyLabel="h" />
|
||||||
|
<Key android:keyLabel="i"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_i" />
|
||||||
|
<Key android:keyLabel="j" android:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Key android:keyLabel="k" android:keyEdgeFlags="left" />
|
||||||
|
<Key android:keyLabel="l" />
|
||||||
|
<Key android:keyLabel="m" />
|
||||||
|
<Key android:keyLabel="n"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_n" />
|
||||||
|
<Key android:keyLabel="o"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_o" />
|
||||||
|
<Key android:keyLabel="p" />
|
||||||
|
<Key android:keyLabel="q" />
|
||||||
|
<Key android:keyLabel="r" />
|
||||||
|
<Key android:keyLabel="s"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_s" />
|
||||||
|
<Key android:keyLabel="t" android:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift"
|
||||||
|
android:keyWidth="15%p" android:isModifier="true"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_shift"
|
||||||
|
android:isSticky="true" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="u"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_u" />
|
||||||
|
<Key android:keyLabel="v"/>
|
||||||
|
<Key android:keyLabel="w"/>
|
||||||
|
<Key android:keyLabel="x"/>
|
||||||
|
<Key android:keyLabel="y"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_y"
|
||||||
|
/>
|
||||||
|
<Key android:keyLabel="z"/>
|
||||||
|
<Key android:keyLabel=","/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
|
||||||
|
android:keyWidth="15%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_done"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="-2" android:keyLabel="123" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="30%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46" android:keyLabel="."
|
||||||
|
android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,67 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="26.67%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="49" android:keyIcon="@drawable/sym_keyboard_num1" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="50" android:keyIcon="@drawable/sym_keyboard_num2"/>
|
||||||
|
<Key android:codes="51" android:keyIcon="@drawable/sym_keyboard_num3"/>
|
||||||
|
<Key android:keyLabel="-" android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="52" android:keyIcon="@drawable/sym_keyboard_num4" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="53" android:keyIcon="@drawable/sym_keyboard_num5"/>
|
||||||
|
<Key android:codes="54" android:keyIcon="@drawable/sym_keyboard_num6"/>
|
||||||
|
<Key android:keyLabel="." android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="55" android:keyIcon="@drawable/sym_keyboard_num7" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="56" android:keyIcon="@drawable/sym_keyboard_num8"/>
|
||||||
|
<Key android:codes="57" android:keyIcon="@drawable/sym_keyboard_num9"/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:keyWidth="20%p"
|
||||||
|
android:isRepeatable="true" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyIcon="@drawable/sym_keyboard_numalt"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_numalt"/>
|
||||||
|
|
||||||
|
<Key android:codes="48" android:keyIcon="@drawable/sym_keyboard_num0"/>
|
||||||
|
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:keyWidth="20%p"
|
||||||
|
android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,68 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="26.67%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:keyLabel="(" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="/"/>
|
||||||
|
<Key android:keyLabel=")"/>
|
||||||
|
<Key android:keyLabel="-" android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:keyLabel="N" android:keyEdgeFlags="left"/>
|
||||||
|
<!-- Pause is a comma.
|
||||||
|
Check PhoneNumberUtils.java to see if this has changed. -->
|
||||||
|
<Key android:codes="44" android:keyLabel="Pause"/>
|
||||||
|
<Key android:keyLabel=","/>
|
||||||
|
<Key android:keyLabel="." android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="42" android:keyIcon="@drawable/sym_keyboard_numstar"
|
||||||
|
android:keyEdgeFlags="left"/>
|
||||||
|
<!-- Wait is w -->
|
||||||
|
<Key android:codes="w" android:keyLabel="Wait"/>
|
||||||
|
<Key android:codes="35" android:keyIcon="@drawable/sym_keyboard_numpound"/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:keyWidth="20%p"
|
||||||
|
android:isRepeatable="true" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_phone_key"
|
||||||
|
android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="+"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:keyWidth="20%p"
|
||||||
|
android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,166 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="119" android:keyLabel="w"/>
|
||||||
|
<Key android:codes="101" android:keyLabel="e"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_e"
|
||||||
|
/>
|
||||||
|
<Key android:codes="114" android:keyLabel="r"/>
|
||||||
|
<Key android:codes="116" android:keyLabel="t"/>
|
||||||
|
<Key android:codes="121" android:keyLabel="y"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_y"
|
||||||
|
/>
|
||||||
|
<Key android:codes="117" android:keyLabel="u"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_u"
|
||||||
|
/>
|
||||||
|
<Key android:codes="105" android:keyLabel="i"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_i"
|
||||||
|
/>
|
||||||
|
<Key android:codes="111" android:keyLabel="o"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_o"
|
||||||
|
/>
|
||||||
|
<Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="97" android:keyLabel="a" android:horizontalGap="5%p"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_a"
|
||||||
|
android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="115" android:keyLabel="s"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_s"
|
||||||
|
/>
|
||||||
|
<Key android:codes="100" android:keyLabel="d"/>
|
||||||
|
<Key android:codes="102" android:keyLabel="f"/>
|
||||||
|
<Key android:codes="103" android:keyLabel="g"/>
|
||||||
|
<Key android:codes="104" android:keyLabel="h"/>
|
||||||
|
<Key android:codes="106" android:keyLabel="j"/>
|
||||||
|
<Key android:codes="107" android:keyLabel="k"/>
|
||||||
|
<Key android:codes="108" android:keyLabel="l" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift"
|
||||||
|
android:keyWidth="15%p" android:isModifier="true"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_shift"
|
||||||
|
android:isSticky="true" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="122" android:keyLabel="z"/>
|
||||||
|
<Key android:codes="120" android:keyLabel="x"/>
|
||||||
|
<Key android:codes="99" android:keyLabel="c"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_c"
|
||||||
|
/>
|
||||||
|
<Key android:codes="118" android:keyLabel="v"/>
|
||||||
|
<Key android:codes="98" android:keyLabel="b"/>
|
||||||
|
<Key android:codes="110" android:keyLabel="n"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="@string/alternates_for_n"
|
||||||
|
/>
|
||||||
|
<Key android:codes="109" android:keyLabel="m"/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
|
||||||
|
android:keyWidth="15%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_normal" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p" />
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="30%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_url" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel=".com" android:keyOutputText=".com"
|
||||||
|
android:popupKeyboard="@xml/popup_domains"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:keyLabel="/" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="15%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_email" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p" />
|
||||||
|
<Key android:keyLabel="\@" android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="15%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:keyboardMode="@+id/mode_im" android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p"/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:keyWidth="30%p" android:isRepeatable="true"/>
|
||||||
|
<Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
|
||||||
|
android:keyWidth="15%p"/>
|
||||||
|
<Key android:keyLabel=":-)" android:keyOutputText=":-) "
|
||||||
|
android:popupKeyboard="@xml/popup_smileys"
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="¹½⅓¼⅛"
|
||||||
|
/>
|
||||||
|
<Key android:codes="50" android:keyLabel="2"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="²⅔"
|
||||||
|
/>
|
||||||
|
<Key android:codes="51" android:keyLabel="3"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="³¾⅜"
|
||||||
|
/>
|
||||||
|
<Key android:codes="52" android:keyLabel="4"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="⁴"
|
||||||
|
/>
|
||||||
|
<Key android:codes="53" android:keyLabel="5"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="⅝"
|
||||||
|
/>
|
||||||
|
<Key android:codes="54" android:keyLabel="6"/>
|
||||||
|
<Key android:codes="55" android:keyLabel="7"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="⅞"
|
||||||
|
/>
|
||||||
|
<Key android:codes="56" android:keyLabel="8"/>
|
||||||
|
<Key android:codes="57" android:keyLabel="9"/>
|
||||||
|
<Key android:codes="48" android:keyLabel="0"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="ⁿ∅"
|
||||||
|
android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="64" android:keyLabel="\@" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="35" android:keyLabel="\#"/>
|
||||||
|
<Key android:codes="36" android:keyLabel="$"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="¢£€¥₣₤₱"
|
||||||
|
/>
|
||||||
|
<Key android:codes="37" android:keyLabel="%"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="‰"
|
||||||
|
/>
|
||||||
|
<Key android:codes="38" android:keyLabel="&"/>
|
||||||
|
<Key android:codes="42" android:keyLabel="*"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="†‡"
|
||||||
|
/>
|
||||||
|
<Key android:codes="45" android:keyLabel="-"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="–—"
|
||||||
|
/>
|
||||||
|
<Key android:keyLabel="+"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="±"
|
||||||
|
/>
|
||||||
|
<Key android:codes="40" android:keyLabel="("
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="[{<"
|
||||||
|
/>
|
||||||
|
<Key android:codes="41" android:keyLabel=")" android:keyEdgeFlags="right"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="]}>"
|
||||||
|
/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="-1" android:keyLabel="@string/label_alt_key"
|
||||||
|
android:keyWidth="15%p" android:isModifier="true"
|
||||||
|
android:isSticky="true" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:codes="33" android:keyLabel="!"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="¡"
|
||||||
|
/>
|
||||||
|
<Key android:codes="34" android:keyLabel="""
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="“”«»˝"
|
||||||
|
/>
|
||||||
|
<Key android:codes="39" android:keyLabel="\'"/>
|
||||||
|
<Key android:codes="58" android:keyLabel=":"/>
|
||||||
|
<Key android:codes="59" android:keyLabel=";"/>
|
||||||
|
<Key android:codes="47" android:keyLabel="/" />
|
||||||
|
<Key android:codes="63" android:keyLabel="\?"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="¿"
|
||||||
|
/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" android:keyWidth="15%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_alpha_key"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyWidth="20%p" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="," android:keyWidth="15%p"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="‚„"
|
||||||
|
/>
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" android:keyWidth="30%p"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
<Key android:keyLabel="." android:keyWidth="15%p" />
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return" android:keyWidth="20%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
/>
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,93 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:keyLabel="~" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="`"/>
|
||||||
|
<Key android:keyLabel="|"/>
|
||||||
|
<Key android:keyLabel="•"/>
|
||||||
|
<Key android:keyLabel="√"/>
|
||||||
|
<Key android:keyLabel="π"/>
|
||||||
|
<Key android:keyLabel="÷"/>
|
||||||
|
<Key android:keyLabel="×"/>
|
||||||
|
<Key android:keyLabel="{"/>
|
||||||
|
<Key android:keyLabel="}" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:keyLabel="¥" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="£"/>
|
||||||
|
<Key android:keyLabel="¢"/>
|
||||||
|
<Key android:keyLabel="€"/>
|
||||||
|
<Key android:keyLabel="°"/>
|
||||||
|
<Key android:keyLabel="^"/>
|
||||||
|
<Key android:keyLabel="_"/>
|
||||||
|
<Key android:keyLabel="="
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="≠≈∞"
|
||||||
|
/>
|
||||||
|
<Key android:keyLabel="["/>
|
||||||
|
<Key android:keyLabel="]" android:keyEdgeFlags="right"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row>
|
||||||
|
<Key android:codes="-1" android:keyLabel="@string/label_alt_key"
|
||||||
|
android:keyWidth="15%p" android:isModifier="true"
|
||||||
|
android:isSticky="true" android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="™"/>
|
||||||
|
<Key android:keyLabel="®"/>
|
||||||
|
<Key android:keyLabel="©"/>
|
||||||
|
<Key android:keyLabel="¶"/>
|
||||||
|
<Key android:keyLabel="\\"/>
|
||||||
|
<Key android:keyLabel="<"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="≤«‹"
|
||||||
|
/>
|
||||||
|
<Key android:keyLabel=">"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters="≥»›"
|
||||||
|
/>
|
||||||
|
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" android:keyWidth="15%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_delete"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:codes="-2" android:keyLabel="@string/label_alpha_key" android:keyWidth="20%p"
|
||||||
|
android:popupKeyboard="@xml/kbd_popup_template"
|
||||||
|
android:popupCharacters=""
|
||||||
|
android:keyEdgeFlags="left"/>
|
||||||
|
<Key android:keyLabel="„" android:keyWidth="15%p" />
|
||||||
|
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" android:keyWidth="30%p"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_space"
|
||||||
|
android:isRepeatable="true"/>
|
||||||
|
<Key android:keyLabel="…" android:keyWidth="15%p" />
|
||||||
|
<Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return" android:keyWidth="20%p" android:keyEdgeFlags="right"
|
||||||
|
android:iconPreview="@drawable/sym_keyboard_feedback_return"
|
||||||
|
/>
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- The attributes in this XML file provide configuration information -->
|
||||||
|
<!-- for the Input Method Manager. -->
|
||||||
|
|
||||||
|
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:settingsActivity="com.android.inputmethod.latin.LatinIMESettings"
|
||||||
|
android:isDefault="@bool/im_is_default"
|
||||||
|
/>
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="15%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="top|bottom">
|
||||||
|
<Key android:keyLabel=".net" android:keyOutputText=".net" android:keyEdgeFlags="left" />
|
||||||
|
<Key android:keyLabel=".org" android:keyOutputText=".org"/>
|
||||||
|
<Key android:keyLabel=".gov" android:keyOutputText=".gov"/>
|
||||||
|
<Key android:keyLabel=".tv" android:keyOutputText=".tv" android:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="10%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="top|bottom">
|
||||||
|
<Key android:codes="58" android:keyLabel=":" android:keyEdgeFlags="left" />
|
||||||
|
<Key android:codes="47" android:keyLabel="/" />
|
||||||
|
<Key android:codes="64" android:keyLabel="\@" />
|
||||||
|
<Key android:codes="39" android:keyLabel="\'" />
|
||||||
|
<Key android:codes="34" android:keyLabel=""" />
|
||||||
|
<Key android:codes="63" android:keyLabel="\?" />
|
||||||
|
<Key android:codes="33" android:keyLabel="!" android:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,49 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Copyright 2008, 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:keyWidth="15%p"
|
||||||
|
android:horizontalGap="0px"
|
||||||
|
android:verticalGap="0px"
|
||||||
|
android:keyHeight="@dimen/key_height"
|
||||||
|
>
|
||||||
|
|
||||||
|
<Row android:rowEdgeFlags="top">
|
||||||
|
<Key android:keyLabel=":-)" android:keyOutputText=":-) " android:keyEdgeFlags="left" />
|
||||||
|
<Key android:keyLabel=":-(" android:keyOutputText=":-( "/>
|
||||||
|
<Key android:keyLabel=";-)" android:keyOutputText=";-) "/>
|
||||||
|
<Key android:keyLabel=":-P" android:keyOutputText=":-P "/>
|
||||||
|
<Key android:keyLabel="=-O" android:keyOutputText="=-O " android:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Key android:keyLabel=":-*" android:keyOutputText=":-* " android:keyEdgeFlags="left" />
|
||||||
|
<Key android:keyLabel=":O" android:keyOutputText=":O "/>
|
||||||
|
<Key android:keyLabel="B-)" android:keyOutputText="B-) "/>
|
||||||
|
<Key android:keyLabel=":-$" android:keyOutputText=":-$ "/>
|
||||||
|
<Key android:keyLabel=":-!" android:keyOutputText=":-! " android:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
<Row android:rowEdgeFlags="bottom">
|
||||||
|
<Key android:keyLabel=":-[" android:keyOutputText=":-[ " android:keyEdgeFlags="left" />
|
||||||
|
<Key android:keyLabel="O:-)" android:keyOutputText="O:-) "/>
|
||||||
|
<Key android:keyLabel=":-\\" android:keyOutputText=":-\\ "/>
|
||||||
|
<Key android:keyLabel=":'(" android:keyOutputText=":'( "/>
|
||||||
|
<Key android:keyLabel=":-D" android:keyOutputText=":-D " android:keyEdgeFlags="right" />
|
||||||
|
</Row>
|
||||||
|
</Keyboard>
|
|
@ -0,0 +1,81 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2008 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/english_ime_settings"
|
||||||
|
android:key="english_ime_settings">
|
||||||
|
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="vibrate_on"
|
||||||
|
android:title="@string/vibrate_on_keypress"
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:persistent="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="sound_on"
|
||||||
|
android:title="@string/sound_on_keypress"
|
||||||
|
android:persistent="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="auto_cap"
|
||||||
|
android:title="@string/auto_cap"
|
||||||
|
android:persistent="true"
|
||||||
|
android:defaultValue="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!--CheckBoxPreference
|
||||||
|
android:key="auto_punctuate"
|
||||||
|
android:title="@string/auto_punctuate"
|
||||||
|
android:persistent="true"
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:visible="false"
|
||||||
|
/-->
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="prediction_mode"
|
||||||
|
android:title="@string/prediction"
|
||||||
|
android:dialogTitle="@string/auto_complete_dialog_title"
|
||||||
|
android:summary="@string/prediction_summary"
|
||||||
|
android:persistent="true"
|
||||||
|
android:entries="@array/prediction_modes"
|
||||||
|
android:entryValues="@array/prediction_modes_values"
|
||||||
|
android:defaultValue="@string/prediction_basic"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/prediction_category"
|
||||||
|
android:key="prediction_settings">
|
||||||
|
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="hit_correction"
|
||||||
|
android:title="@string/hit_correction"
|
||||||
|
android:summary="@string/hit_correction_summary"
|
||||||
|
android:persistent="true"
|
||||||
|
android:defaultValue="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="prediction_landscape"
|
||||||
|
android:title="@string/prediction_landscape"
|
||||||
|
android:summary="@string/prediction_landscape_summary"
|
||||||
|
android:persistent="true"
|
||||||
|
android:defaultValue="false"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2009 Google Inc.
|
||||||
|
*
|
||||||
|
* 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.latin;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.AssetManager;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements a static, compacted, binary dictionary of standard words.
|
||||||
|
*/
|
||||||
|
public class BinaryDictionary extends Dictionary {
|
||||||
|
|
||||||
|
public static final int MAX_WORD_LENGTH = 48;
|
||||||
|
private static final int MAX_ALTERNATIVES = 16;
|
||||||
|
private static final int MAX_WORDS = 16;
|
||||||
|
|
||||||
|
private static final int TYPED_LETTER_MULTIPLIER = 2;
|
||||||
|
|
||||||
|
private int mNativeDict;
|
||||||
|
private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES];
|
||||||
|
private WordCallback mWordCallback;
|
||||||
|
private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS];
|
||||||
|
private int[] mFrequencies = new int[MAX_WORDS];
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
System.loadLibrary("jni_latinime");
|
||||||
|
} catch (UnsatisfiedLinkError ule) {
|
||||||
|
Log.e("BinaryDictionary", "Could not load native library jni_latinime");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a dictionary from a raw resource file
|
||||||
|
* @param context application context for reading resources
|
||||||
|
* @param resId the resource containing the raw binary dictionary
|
||||||
|
*/
|
||||||
|
public BinaryDictionary(Context context, int resId) {
|
||||||
|
if (resId != 0) {
|
||||||
|
loadDictionary(context, resId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private native int openNative(AssetManager am, String resourcePath, int typedLetterMultiplier,
|
||||||
|
int fullWordMultiplier);
|
||||||
|
private native void closeNative(int dict);
|
||||||
|
private native boolean isValidWordNative(int nativeData, char[] word, int wordLength);
|
||||||
|
private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize,
|
||||||
|
char[] outputChars, int[] frequencies,
|
||||||
|
int maxWordLength, int maxWords, int maxAlternatives);
|
||||||
|
private native void setParamsNative(int typedLetterMultiplier,
|
||||||
|
int fullWordMultiplier);
|
||||||
|
|
||||||
|
private final void loadDictionary(Context context, int resId) {
|
||||||
|
AssetManager am = context.getResources().getAssets();
|
||||||
|
String assetName = context.getResources().getString(resId);
|
||||||
|
mNativeDict = openNative(am, assetName, TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getWords(final WordComposer codes, final WordCallback callback) {
|
||||||
|
mWordCallback = callback;
|
||||||
|
final int codesSize = codes.size();
|
||||||
|
// Wont deal with really long words.
|
||||||
|
if (codesSize > MAX_WORD_LENGTH - 1) return;
|
||||||
|
|
||||||
|
Arrays.fill(mInputCodes, -1);
|
||||||
|
for (int i = 0; i < codesSize; i++) {
|
||||||
|
int[] alternatives = codes.getCodesAt(i);
|
||||||
|
System.arraycopy(alternatives, 0, mInputCodes, i * MAX_ALTERNATIVES,
|
||||||
|
Math.min(alternatives.length, MAX_ALTERNATIVES));
|
||||||
|
}
|
||||||
|
Arrays.fill(mOutputChars, (char) 0);
|
||||||
|
|
||||||
|
int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, mOutputChars, mFrequencies,
|
||||||
|
MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES);
|
||||||
|
|
||||||
|
for (int j = 0; j < count; j++) {
|
||||||
|
if (mFrequencies[j] < 1) break;
|
||||||
|
int start = j * MAX_WORD_LENGTH;
|
||||||
|
int len = 0;
|
||||||
|
while (mOutputChars[start + len] != 0) {
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
if (len > 0) {
|
||||||
|
callback.addWord(mOutputChars, start, len, mFrequencies[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isValidWord(CharSequence word) {
|
||||||
|
if (word == null) return false;
|
||||||
|
char[] chars = word.toString().toLowerCase().toCharArray();
|
||||||
|
return isValidWordNative(mNativeDict, chars, chars.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void close() {
|
||||||
|
if (mNativeDict != 0) {
|
||||||
|
closeNative(mNativeDict);
|
||||||
|
mNativeDict = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable {
|
||||||
|
close();
|
||||||
|
super.finalize();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,478 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2009 Google Inc.
|
||||||
|
*
|
||||||
|
* 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.latin;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.GestureDetector;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup.LayoutParams;
|
||||||
|
import android.widget.PopupWindow;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
public class CandidateView extends View {
|
||||||
|
|
||||||
|
private static final int OUT_OF_BOUNDS = -1;
|
||||||
|
private static final List<CharSequence> EMPTY_LIST = new ArrayList<CharSequence>();
|
||||||
|
|
||||||
|
private LatinIME mService;
|
||||||
|
private List<CharSequence> mSuggestions = EMPTY_LIST;
|
||||||
|
private boolean mShowingCompletions;
|
||||||
|
private CharSequence mSelectedString;
|
||||||
|
private int mSelectedIndex;
|
||||||
|
private int mTouchX = OUT_OF_BOUNDS;
|
||||||
|
private Drawable mSelectionHighlight;
|
||||||
|
private boolean mTypedWordValid;
|
||||||
|
|
||||||
|
private boolean mHaveMinimalSuggestion;
|
||||||
|
|
||||||
|
private Rect mBgPadding;
|
||||||
|
|
||||||
|
private TextView mPreviewText;
|
||||||
|
private PopupWindow mPreviewPopup;
|
||||||
|
private int mCurrentWordIndex;
|
||||||
|
private Drawable mDivider;
|
||||||
|
|
||||||
|
private static final int MAX_SUGGESTIONS = 32;
|
||||||
|
private static final int SCROLL_PIXELS = 20;
|
||||||
|
|
||||||
|
private static final int MSG_REMOVE_PREVIEW = 1;
|
||||||
|
private static final int MSG_REMOVE_THROUGH_PREVIEW = 2;
|
||||||
|
|
||||||
|
private int[] mWordWidth = new int[MAX_SUGGESTIONS];
|
||||||
|
private int[] mWordX = new int[MAX_SUGGESTIONS];
|
||||||
|
private int mPopupPreviewX;
|
||||||
|
private int mPopupPreviewY;
|
||||||
|
|
||||||
|
private static final int X_GAP = 10;
|
||||||
|
|
||||||
|
private int mColorNormal;
|
||||||
|
private int mColorRecommended;
|
||||||
|
private int mColorOther;
|
||||||
|
private Paint mPaint;
|
||||||
|
private int mDescent;
|
||||||
|
private boolean mScrolled;
|
||||||
|
private int mTargetScrollX;
|
||||||
|
|
||||||
|
private int mTotalWidth;
|
||||||
|
|
||||||
|
private GestureDetector mGestureDetector;
|
||||||
|
|
||||||
|
Handler mHandler = new Handler() {
|
||||||
|
@Override
|
||||||
|
public void handleMessage(Message msg) {
|
||||||
|
switch (msg.what) {
|
||||||
|
case MSG_REMOVE_PREVIEW:
|
||||||
|
mPreviewText.setVisibility(GONE);
|
||||||
|
break;
|
||||||
|
case MSG_REMOVE_THROUGH_PREVIEW:
|
||||||
|
mPreviewText.setVisibility(GONE);
|
||||||
|
if (mTouchX != OUT_OF_BOUNDS) {
|
||||||
|
removeHighlight();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a CandidateView for showing suggested words for completion.
|
||||||
|
* @param context
|
||||||
|
* @param attrs
|
||||||
|
*/
|
||||||
|
public CandidateView(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
mSelectionHighlight = context.getResources().getDrawable(
|
||||||
|
com.android.internal.R.drawable.list_selector_background_pressed);
|
||||||
|
|
||||||
|
LayoutInflater inflate =
|
||||||
|
(LayoutInflater) context
|
||||||
|
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
|
mPreviewPopup = new PopupWindow(context);
|
||||||
|
mPreviewText = (TextView) inflate.inflate(R.layout.candidate_preview, null);
|
||||||
|
mPreviewPopup.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
|
||||||
|
mPreviewPopup.setContentView(mPreviewText);
|
||||||
|
mPreviewPopup.setBackgroundDrawable(null);
|
||||||
|
mColorNormal = context.getResources().getColor(R.color.candidate_normal);
|
||||||
|
mColorRecommended = context.getResources().getColor(R.color.candidate_recommended);
|
||||||
|
mColorOther = context.getResources().getColor(R.color.candidate_other);
|
||||||
|
mDivider = context.getResources().getDrawable(R.drawable.keyboard_suggest_strip_divider);
|
||||||
|
|
||||||
|
mPaint = new Paint();
|
||||||
|
mPaint.setColor(mColorNormal);
|
||||||
|
mPaint.setAntiAlias(true);
|
||||||
|
mPaint.setTextSize(mPreviewText.getTextSize());
|
||||||
|
mPaint.setStrokeWidth(0);
|
||||||
|
mDescent = (int) mPaint.descent();
|
||||||
|
|
||||||
|
mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
|
||||||
|
@Override
|
||||||
|
public void onLongPress(MotionEvent me) {
|
||||||
|
if (mSuggestions.size() > 0) {
|
||||||
|
if (me.getX() + mScrollX < mWordWidth[0] && mScrollX < 10) {
|
||||||
|
longPressFirstWord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onScroll(MotionEvent e1, MotionEvent e2,
|
||||||
|
float distanceX, float distanceY) {
|
||||||
|
mScrolled = true;
|
||||||
|
mScrollX += distanceX;
|
||||||
|
if (mScrollX < 0) {
|
||||||
|
mScrollX = 0;
|
||||||
|
}
|
||||||
|
if (mScrollX + getWidth() > mTotalWidth) {
|
||||||
|
mScrollX -= distanceX;
|
||||||
|
}
|
||||||
|
mTargetScrollX = mScrollX;
|
||||||
|
showPreview(OUT_OF_BOUNDS, null);
|
||||||
|
invalidate();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setHorizontalFadingEdgeEnabled(true);
|
||||||
|
setWillNotDraw(false);
|
||||||
|
setHorizontalScrollBarEnabled(false);
|
||||||
|
setVerticalScrollBarEnabled(false);
|
||||||
|
mScrollX = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A connection back to the service to communicate with the text field
|
||||||
|
* @param listener
|
||||||
|
*/
|
||||||
|
public void setService(LatinIME listener) {
|
||||||
|
mService = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int computeHorizontalScrollRange() {
|
||||||
|
return mTotalWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the canvas is null, then only touch calculations are performed to pick the target
|
||||||
|
* candidate.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas) {
|
||||||
|
if (canvas != null) {
|
||||||
|
super.onDraw(canvas);
|
||||||
|
}
|
||||||
|
mTotalWidth = 0;
|
||||||
|
if (mSuggestions == null) return;
|
||||||
|
|
||||||
|
final int height = getHeight();
|
||||||
|
if (mBgPadding == null) {
|
||||||
|
mBgPadding = new Rect(0, 0, 0, 0);
|
||||||
|
if (getBackground() != null) {
|
||||||
|
getBackground().getPadding(mBgPadding);
|
||||||
|
}
|
||||||
|
mDivider.setBounds(0, mBgPadding.top, mDivider.getIntrinsicWidth(),
|
||||||
|
mDivider.getIntrinsicHeight());
|
||||||
|
}
|
||||||
|
int x = 0;
|
||||||
|
final int count = mSuggestions.size();
|
||||||
|
final int width = getWidth();
|
||||||
|
final Rect bgPadding = mBgPadding;
|
||||||
|
final Paint paint = mPaint;
|
||||||
|
final int touchX = mTouchX;
|
||||||
|
final int scrollX = mScrollX;
|
||||||
|
final boolean scrolled = mScrolled;
|
||||||
|
final boolean typedWordValid = mTypedWordValid;
|
||||||
|
final int y = (int) (height + mPaint.getTextSize() - mDescent) / 2;
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
CharSequence suggestion = mSuggestions.get(i);
|
||||||
|
if (suggestion == null) continue;
|
||||||
|
paint.setColor(mColorNormal);
|
||||||
|
if (mHaveMinimalSuggestion
|
||||||
|
&& ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) {
|
||||||
|
paint.setTypeface(Typeface.DEFAULT_BOLD);
|
||||||
|
paint.setColor(mColorRecommended);
|
||||||
|
} else if (i != 0) {
|
||||||
|
paint.setColor(mColorOther);
|
||||||
|
}
|
||||||
|
final int wordWidth;
|
||||||
|
if (mWordWidth[i] != 0) {
|
||||||
|
wordWidth = mWordWidth[i];
|
||||||
|
} else {
|
||||||
|
float textWidth = paint.measureText(suggestion, 0, suggestion.length());
|
||||||
|
wordWidth = (int) textWidth + X_GAP * 2;
|
||||||
|
mWordWidth[i] = wordWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
mWordX[i] = x;
|
||||||
|
|
||||||
|
if (touchX + scrollX >= x && touchX + scrollX < x + wordWidth && !scrolled) {
|
||||||
|
if (canvas != null) {
|
||||||
|
canvas.translate(x, 0);
|
||||||
|
mSelectionHighlight.setBounds(0, bgPadding.top, wordWidth, height);
|
||||||
|
mSelectionHighlight.draw(canvas);
|
||||||
|
canvas.translate(-x, 0);
|
||||||
|
showPreview(i, null);
|
||||||
|
}
|
||||||
|
mSelectedString = suggestion;
|
||||||
|
mSelectedIndex = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canvas != null) {
|
||||||
|
canvas.drawText(suggestion, 0, suggestion.length(), x + X_GAP, y, paint);
|
||||||
|
paint.setColor(mColorOther);
|
||||||
|
canvas.translate(x + wordWidth, 0);
|
||||||
|
mDivider.draw(canvas);
|
||||||
|
canvas.translate(-x - wordWidth, 0);
|
||||||
|
}
|
||||||
|
paint.setTypeface(Typeface.DEFAULT);
|
||||||
|
x += wordWidth;
|
||||||
|
}
|
||||||
|
mTotalWidth = x;
|
||||||
|
if (mTargetScrollX != mScrollX) {
|
||||||
|
scrollToTarget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scrollToTarget() {
|
||||||
|
if (mTargetScrollX > mScrollX) {
|
||||||
|
mScrollX += SCROLL_PIXELS;
|
||||||
|
if (mScrollX >= mTargetScrollX) {
|
||||||
|
mScrollX = mTargetScrollX;
|
||||||
|
requestLayout();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mScrollX -= SCROLL_PIXELS;
|
||||||
|
if (mScrollX <= mTargetScrollX) {
|
||||||
|
mScrollX = mTargetScrollX;
|
||||||
|
requestLayout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuggestions(List<CharSequence> suggestions, boolean completions,
|
||||||
|
boolean typedWordValid, boolean haveMinimalSuggestion) {
|
||||||
|
clear();
|
||||||
|
if (suggestions != null) {
|
||||||
|
mSuggestions = new ArrayList<CharSequence>(suggestions);
|
||||||
|
}
|
||||||
|
mShowingCompletions = completions;
|
||||||
|
mTypedWordValid = typedWordValid;
|
||||||
|
mScrollX = 0;
|
||||||
|
mTargetScrollX = 0;
|
||||||
|
mHaveMinimalSuggestion = haveMinimalSuggestion;
|
||||||
|
// Compute the total width
|
||||||
|
onDraw(null);
|
||||||
|
invalidate();
|
||||||
|
requestLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scrollPrev() {
|
||||||
|
int i = 0;
|
||||||
|
final int count = mSuggestions.size();
|
||||||
|
int firstItem = 0; // Actually just before the first item, if at the boundary
|
||||||
|
while (i < count) {
|
||||||
|
if (mWordX[i] < mScrollX
|
||||||
|
&& mWordX[i] + mWordWidth[i] >= mScrollX - 1) {
|
||||||
|
firstItem = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
int leftEdge = mWordX[firstItem] + mWordWidth[firstItem] - getWidth();
|
||||||
|
if (leftEdge < 0) leftEdge = 0;
|
||||||
|
updateScrollPosition(leftEdge);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scrollNext() {
|
||||||
|
int i = 0;
|
||||||
|
int targetX = mScrollX;
|
||||||
|
final int count = mSuggestions.size();
|
||||||
|
int rightEdge = mScrollX + getWidth();
|
||||||
|
while (i < count) {
|
||||||
|
if (mWordX[i] <= rightEdge &&
|
||||||
|
mWordX[i] + mWordWidth[i] >= rightEdge) {
|
||||||
|
targetX = Math.min(mWordX[i], mTotalWidth - getWidth());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
updateScrollPosition(targetX);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateScrollPosition(int targetX) {
|
||||||
|
if (targetX != mScrollX) {
|
||||||
|
// TODO: Animate
|
||||||
|
mTargetScrollX = targetX;
|
||||||
|
requestLayout();
|
||||||
|
invalidate();
|
||||||
|
mScrolled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
mSuggestions = EMPTY_LIST;
|
||||||
|
mTouchX = OUT_OF_BOUNDS;
|
||||||
|
mSelectedString = null;
|
||||||
|
mSelectedIndex = -1;
|
||||||
|
invalidate();
|
||||||
|
Arrays.fill(mWordWidth, 0);
|
||||||
|
Arrays.fill(mWordX, 0);
|
||||||
|
if (mPreviewPopup.isShowing()) {
|
||||||
|
mPreviewPopup.dismiss();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent me) {
|
||||||
|
|
||||||
|
if (mGestureDetector.onTouchEvent(me)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int action = me.getAction();
|
||||||
|
int x = (int) me.getX();
|
||||||
|
int y = (int) me.getY();
|
||||||
|
mTouchX = x;
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
mScrolled = false;
|
||||||
|
invalidate();
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
if (y <= 0) {
|
||||||
|
// Fling up!?
|
||||||
|
if (mSelectedString != null) {
|
||||||
|
if (!mShowingCompletions) {
|
||||||
|
TextEntryState.acceptedSuggestion(mSuggestions.get(0),
|
||||||
|
mSelectedString);
|
||||||
|
}
|
||||||
|
mService.pickSuggestionManually(mSelectedIndex, mSelectedString);
|
||||||
|
mSelectedString = null;
|
||||||
|
mSelectedIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
invalidate();
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
if (!mScrolled) {
|
||||||
|
if (mSelectedString != null) {
|
||||||
|
if (!mShowingCompletions) {
|
||||||
|
TextEntryState.acceptedSuggestion(mSuggestions.get(0),
|
||||||
|
mSelectedString);
|
||||||
|
}
|
||||||
|
mService.pickSuggestionManually(mSelectedIndex, mSelectedString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mSelectedString = null;
|
||||||
|
mSelectedIndex = -1;
|
||||||
|
removeHighlight();
|
||||||
|
showPreview(OUT_OF_BOUNDS, null);
|
||||||
|
requestLayout();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For flick through from keyboard, call this method with the x coordinate of the flick
|
||||||
|
* gesture.
|
||||||
|
* @param x
|
||||||
|
*/
|
||||||
|
public void takeSuggestionAt(float x) {
|
||||||
|
mTouchX = (int) x;
|
||||||
|
// To detect candidate
|
||||||
|
onDraw(null);
|
||||||
|
if (mSelectedString != null) {
|
||||||
|
if (!mShowingCompletions) {
|
||||||
|
TextEntryState.acceptedSuggestion(mSuggestions.get(0), mSelectedString);
|
||||||
|
}
|
||||||
|
mService.pickSuggestionManually(mSelectedIndex, mSelectedString);
|
||||||
|
}
|
||||||
|
invalidate();
|
||||||
|
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_REMOVE_THROUGH_PREVIEW), 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showPreview(int wordIndex, String altText) {
|
||||||
|
int oldWordIndex = mCurrentWordIndex;
|
||||||
|
mCurrentWordIndex = wordIndex;
|
||||||
|
// If index changed or changing text
|
||||||
|
if (oldWordIndex != mCurrentWordIndex || altText != null) {
|
||||||
|
if (wordIndex == OUT_OF_BOUNDS) {
|
||||||
|
if (mPreviewPopup.isShowing()) {
|
||||||
|
mHandler.sendMessageDelayed(mHandler
|
||||||
|
.obtainMessage(MSG_REMOVE_PREVIEW), 60);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CharSequence word = altText != null? altText : mSuggestions.get(wordIndex);
|
||||||
|
mPreviewText.setText(word);
|
||||||
|
mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
|
||||||
|
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
|
||||||
|
int wordWidth = (int) (mPaint.measureText(word, 0, word.length()) + X_GAP * 2);
|
||||||
|
final int popupWidth = wordWidth
|
||||||
|
+ mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight();
|
||||||
|
final int popupHeight = mPreviewText.getMeasuredHeight();
|
||||||
|
//mPreviewText.setVisibility(INVISIBLE);
|
||||||
|
mPopupPreviewX = mWordX[wordIndex] - mPreviewText.getPaddingLeft() - mScrollX;
|
||||||
|
mPopupPreviewY = - popupHeight;
|
||||||
|
mHandler.removeMessages(MSG_REMOVE_PREVIEW);
|
||||||
|
int [] offsetInWindow = new int[2];
|
||||||
|
getLocationInWindow(offsetInWindow);
|
||||||
|
if (mPreviewPopup.isShowing()) {
|
||||||
|
mPreviewPopup.update(mPopupPreviewX, mPopupPreviewY + offsetInWindow[1],
|
||||||
|
popupWidth, popupHeight);
|
||||||
|
} else {
|
||||||
|
mPreviewPopup.setWidth(popupWidth);
|
||||||
|
mPreviewPopup.setHeight(popupHeight);
|
||||||
|
mPreviewPopup.showAtLocation(this, Gravity.NO_GRAVITY, mPopupPreviewX,
|
||||||
|
mPopupPreviewY + offsetInWindow[1]);
|
||||||
|
}
|
||||||
|
mPreviewText.setVisibility(VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeHighlight() {
|
||||||
|
mTouchX = OUT_OF_BOUNDS;
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void longPressFirstWord() {
|
||||||
|
CharSequence word = mSuggestions.get(0);
|
||||||
|
if (mService.addWordToDictionary(word.toString())) {
|
||||||
|
showPreview(0, getContext().getResources().getString(R.string.added_word, word));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2009 Google Inc.
|
||||||
|
*
|
||||||
|
* 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.latin;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.View.OnTouchListener;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
public class CandidateViewContainer extends LinearLayout implements OnTouchListener {
|
||||||
|
|
||||||
|
private View mButtonLeft;
|
||||||
|
private View mButtonRight;
|
||||||
|
private View mButtonLeftLayout;
|
||||||
|
private View mButtonRightLayout;
|
||||||
|
private CandidateView mCandidates;
|
||||||
|
|
||||||
|
public CandidateViewContainer(Context screen, AttributeSet attrs) {
|
||||||
|
super(screen, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initViews() {
|
||||||
|
if (mCandidates == null) {
|
||||||
|
mButtonLeftLayout = findViewById(R.id.candidate_left_parent);
|
||||||
|
mButtonLeft = findViewById(R.id.candidate_left);
|
||||||
|
if (mButtonLeft != null) {
|
||||||
|
mButtonLeft.setOnTouchListener(this);
|
||||||
|
}
|
||||||
|
mButtonRightLayout = findViewById(R.id.candidate_right_parent);
|
||||||
|
mButtonRight = findViewById(R.id.candidate_right);
|
||||||
|
if (mButtonRight != null) {
|
||||||
|
mButtonRight.setOnTouchListener(this);
|
||||||
|
}
|
||||||
|
mCandidates = (CandidateView) findViewById(R.id.candidates);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void requestLayout() {
|
||||||
|
if (mCandidates != null) {
|
||||||
|
int availableWidth = mCandidates.getWidth();
|
||||||
|
int neededWidth = mCandidates.computeHorizontalScrollRange();
|
||||||
|
int x = mCandidates.getScrollX();
|
||||||
|
boolean leftVisible = x > 0;
|
||||||
|
boolean rightVisible = x + availableWidth < neededWidth;
|
||||||
|
if (mButtonLeftLayout != null) {
|
||||||
|
mButtonLeftLayout.setVisibility(leftVisible ? VISIBLE : GONE);
|
||||||
|
}
|
||||||
|
if (mButtonRightLayout != null) {
|
||||||
|
mButtonRightLayout.setVisibility(rightVisible ? VISIBLE : GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.requestLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
|
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||||
|
if (v == mButtonRight) {
|
||||||
|
mCandidates.scrollNext();
|
||||||
|
} else if (v == mButtonLeft) {
|
||||||
|
mCandidates.scrollPrev();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2009 Google Inc.
|
||||||
|
*
|
||||||
|
* 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.latin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract base class for a dictionary that can do a fuzzy search for words based on a set of key
|
||||||
|
* strokes.
|
||||||
|
*/
|
||||||
|
abstract public class Dictionary {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not to replicate the typed word in the suggested list, even if it's valid.
|
||||||
|
*/
|
||||||
|
protected static final boolean INCLUDE_TYPED_WORD_IF_VALID = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The weight to give to a word if it's length is the same as the number of typed characters.
|
||||||
|
*/
|
||||||
|
protected static final int FULL_WORD_FREQ_MULTIPLIER = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface to be implemented by classes requesting words to be fetched from the dictionary.
|
||||||
|
* @see #getWords(WordComposer, WordCallback)
|
||||||
|
*/
|
||||||
|
public interface WordCallback {
|
||||||
|
/**
|
||||||
|
* Adds a word to a list of suggestions. The word is expected to be ordered based on
|
||||||
|
* the provided frequency.
|
||||||
|
* @param word the character array containing the word
|
||||||
|
* @param wordOffset starting offset of the word in the character array
|
||||||
|
* @param wordLength length of valid characters in the character array
|
||||||
|
* @param frequency the frequency of occurence. This is normalized between 1 and 255, but
|
||||||
|
* can exceed those limits
|
||||||
|
* @return true if the word was added, false if no more words are required
|
||||||
|
*/
|
||||||
|
boolean addWord(char[] word, int wordOffset, int wordLength, int frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches for words in the dictionary that match the characters in the composer. Matched
|
||||||
|
* words are added through the callback object.
|
||||||
|
* @param composer the key sequence to match
|
||||||
|
* @param callback the callback object to send matched words to as possible candidates
|
||||||
|
* @see WordCallback#addWord(char[], int, int)
|
||||||
|
*/
|
||||||
|
abstract public void getWords(final WordComposer composer, final WordCallback callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given word occurs in the dictionary
|
||||||
|
* @param word the word to search for. The search should be case-insensitive.
|
||||||
|
* @return true if the word exists, false otherwise
|
||||||
|
*/
|
||||||
|
abstract public boolean isValidWord(CharSequence word);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares the contents of the character array with the typed word and returns true if they
|
||||||
|
* are the same.
|
||||||
|
* @param word the array of characters that make up the word
|
||||||
|
* @param length the number of valid characters in the character array
|
||||||
|
* @param typedWord the word to compare with
|
||||||
|
* @return true if they are the same, false otherwise.
|
||||||
|
*/
|
||||||
|
protected boolean same(final char[] word, final int length, final CharSequence typedWord) {
|
||||||
|
if (typedWord.length() != length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
if (word[i] != typedWord.charAt(i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,241 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008 Google Inc.
|
||||||
|
*
|
||||||
|
* 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.latin;
|
||||||
|
|
||||||
|
import android.inputmethodservice.Keyboard;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class KeyboardSwitcher {
|
||||||
|
|
||||||
|
public static final int MODE_TEXT = 1;
|
||||||
|
public static final int MODE_SYMBOLS = 2;
|
||||||
|
public static final int MODE_PHONE = 3;
|
||||||
|
public static final int MODE_URL = 4;
|
||||||
|
public static final int MODE_EMAIL = 5;
|
||||||
|
public static final int MODE_IM = 6;
|
||||||
|
|
||||||
|
public static final int MODE_TEXT_QWERTY = 0;
|
||||||
|
public static final int MODE_TEXT_ALPHA = 1;
|
||||||
|
public static final int MODE_TEXT_COUNT = 2;
|
||||||
|
|
||||||
|
public static final int KEYBOARDMODE_NORMAL = R.id.mode_normal;
|
||||||
|
public static final int KEYBOARDMODE_URL = R.id.mode_url;
|
||||||
|
public static final int KEYBOARDMODE_EMAIL = R.id.mode_email;
|
||||||
|
public static final int KEYBOARDMODE_IM = R.id.mode_im;
|
||||||
|
|
||||||
|
|
||||||
|
LatinKeyboardView mInputView;
|
||||||
|
LatinIME mContext;
|
||||||
|
|
||||||
|
private LatinKeyboard mPhoneKeyboard;
|
||||||
|
private LatinKeyboard mPhoneSymbolsKeyboard;
|
||||||
|
private LatinKeyboard mSymbolsKeyboard;
|
||||||
|
private LatinKeyboard mSymbolsShiftedKeyboard;
|
||||||
|
private LatinKeyboard mQwertyKeyboard;
|
||||||
|
private LatinKeyboard mAlphaKeyboard;
|
||||||
|
private LatinKeyboard mUrlKeyboard;
|
||||||
|
private LatinKeyboard mEmailKeyboard;
|
||||||
|
private LatinKeyboard mIMKeyboard;
|
||||||
|
|
||||||
|
List<Keyboard> mKeyboards;
|
||||||
|
|
||||||
|
private int mMode;
|
||||||
|
private int mImeOptions;
|
||||||
|
private int mTextMode = MODE_TEXT_QWERTY;
|
||||||
|
|
||||||
|
private int mLastDisplayWidth;
|
||||||
|
|
||||||
|
KeyboardSwitcher(LatinIME context) {
|
||||||
|
mContext = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setInputView(LatinKeyboardView inputView) {
|
||||||
|
mInputView = inputView;
|
||||||
|
}
|
||||||
|
|
||||||
|
void makeKeyboards() {
|
||||||
|
// Configuration change is coming after the keyboard gets recreated. So don't rely on that.
|
||||||
|
// If keyboards have already been made, check if we have a screen width change and
|
||||||
|
// create the keyboard layouts again at the correct orientation
|
||||||
|
if (mKeyboards != null) {
|
||||||
|
int displayWidth = mContext.getMaxWidth();
|
||||||
|
if (displayWidth == mLastDisplayWidth) return;
|
||||||
|
mLastDisplayWidth = displayWidth;
|
||||||
|
}
|
||||||
|
// Delayed creation when keyboard mode is set.
|
||||||
|
mQwertyKeyboard = null;
|
||||||
|
mAlphaKeyboard = null;
|
||||||
|
mUrlKeyboard = null;
|
||||||
|
mEmailKeyboard = null;
|
||||||
|
mIMKeyboard = null;
|
||||||
|
mPhoneKeyboard = null;
|
||||||
|
mPhoneSymbolsKeyboard = null;
|
||||||
|
mSymbolsKeyboard = null;
|
||||||
|
mSymbolsShiftedKeyboard = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setKeyboardMode(int mode, int imeOptions) {
|
||||||
|
mMode = mode;
|
||||||
|
mImeOptions = imeOptions;
|
||||||
|
LatinKeyboard keyboard = (LatinKeyboard) mInputView.getKeyboard();
|
||||||
|
mInputView.setPreviewEnabled(true);
|
||||||
|
switch (mode) {
|
||||||
|
case MODE_TEXT:
|
||||||
|
if (mTextMode == MODE_TEXT_QWERTY) {
|
||||||
|
if (mQwertyKeyboard == null) {
|
||||||
|
mQwertyKeyboard = new LatinKeyboard(mContext, R.xml.kbd_qwerty,
|
||||||
|
KEYBOARDMODE_NORMAL);
|
||||||
|
mQwertyKeyboard.enableShiftLock();
|
||||||
|
}
|
||||||
|
keyboard = mQwertyKeyboard;
|
||||||
|
} else if (mTextMode == MODE_TEXT_ALPHA) {
|
||||||
|
if (mAlphaKeyboard == null) {
|
||||||
|
mAlphaKeyboard = new LatinKeyboard(mContext, R.xml.kbd_alpha,
|
||||||
|
KEYBOARDMODE_NORMAL);
|
||||||
|
mAlphaKeyboard.enableShiftLock();
|
||||||
|
}
|
||||||
|
keyboard = mAlphaKeyboard;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MODE_SYMBOLS:
|
||||||
|
if (mSymbolsKeyboard == null) {
|
||||||
|
mSymbolsKeyboard = new LatinKeyboard(mContext, R.xml.kbd_symbols);
|
||||||
|
}
|
||||||
|
if (mSymbolsShiftedKeyboard == null) {
|
||||||
|
mSymbolsShiftedKeyboard = new LatinKeyboard(mContext, R.xml.kbd_symbols_shift);
|
||||||
|
}
|
||||||
|
keyboard = mSymbolsKeyboard;
|
||||||
|
break;
|
||||||
|
case MODE_PHONE:
|
||||||
|
if (mPhoneKeyboard == null) {
|
||||||
|
mPhoneKeyboard = new LatinKeyboard(mContext, R.xml.kbd_phone);
|
||||||
|
}
|
||||||
|
mInputView.setPhoneKeyboard(mPhoneKeyboard);
|
||||||
|
if (mPhoneSymbolsKeyboard == null) {
|
||||||
|
mPhoneSymbolsKeyboard = new LatinKeyboard(mContext, R.xml.kbd_phone_symbols);
|
||||||
|
}
|
||||||
|
keyboard = mPhoneKeyboard;
|
||||||
|
mInputView.setPreviewEnabled(false);
|
||||||
|
break;
|
||||||
|
case MODE_URL:
|
||||||
|
if (mUrlKeyboard == null) {
|
||||||
|
mUrlKeyboard = new LatinKeyboard(mContext, R.xml.kbd_qwerty, KEYBOARDMODE_URL);
|
||||||
|
mUrlKeyboard.enableShiftLock();
|
||||||
|
}
|
||||||
|
keyboard = mUrlKeyboard;
|
||||||
|
break;
|
||||||
|
case MODE_EMAIL:
|
||||||
|
if (mEmailKeyboard == null) {
|
||||||
|
mEmailKeyboard = new LatinKeyboard(mContext, R.xml.kbd_qwerty, KEYBOARDMODE_EMAIL);
|
||||||
|
mEmailKeyboard.enableShiftLock();
|
||||||
|
}
|
||||||
|
keyboard = mEmailKeyboard;
|
||||||
|
break;
|
||||||
|
case MODE_IM:
|
||||||
|
if (mIMKeyboard == null) {
|
||||||
|
mIMKeyboard = new LatinKeyboard(mContext, R.xml.kbd_qwerty, KEYBOARDMODE_IM);
|
||||||
|
mIMKeyboard.enableShiftLock();
|
||||||
|
}
|
||||||
|
keyboard = mIMKeyboard;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mInputView.setKeyboard(keyboard);
|
||||||
|
keyboard.setShifted(false);
|
||||||
|
keyboard.setShiftLocked(keyboard.isShiftLocked());
|
||||||
|
keyboard.setImeOptions(mContext.getResources(), mMode, imeOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getKeyboardMode() {
|
||||||
|
return mMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isTextMode() {
|
||||||
|
return mMode == MODE_TEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getTextMode() {
|
||||||
|
return mTextMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setTextMode(int position) {
|
||||||
|
if (position < MODE_TEXT_COUNT && position >= 0) {
|
||||||
|
mTextMode = position;
|
||||||
|
}
|
||||||
|
if (isTextMode()) {
|
||||||
|
setKeyboardMode(MODE_TEXT, mImeOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int getTextModeCount() {
|
||||||
|
return MODE_TEXT_COUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isAlphabetMode() {
|
||||||
|
Keyboard current = mInputView.getKeyboard();
|
||||||
|
if (current == mQwertyKeyboard
|
||||||
|
|| current == mAlphaKeyboard
|
||||||
|
|| current == mUrlKeyboard
|
||||||
|
|| current == mIMKeyboard
|
||||||
|
|| current == mEmailKeyboard) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggleShift() {
|
||||||
|
Keyboard currentKeyboard = mInputView.getKeyboard();
|
||||||
|
if (currentKeyboard == mSymbolsKeyboard) {
|
||||||
|
mSymbolsKeyboard.setShifted(true);
|
||||||
|
mInputView.setKeyboard(mSymbolsShiftedKeyboard);
|
||||||
|
mSymbolsShiftedKeyboard.setShifted(true);
|
||||||
|
mSymbolsShiftedKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
|
||||||
|
} else if (currentKeyboard == mSymbolsShiftedKeyboard) {
|
||||||
|
mSymbolsShiftedKeyboard.setShifted(false);
|
||||||
|
mInputView.setKeyboard(mSymbolsKeyboard);
|
||||||
|
mSymbolsKeyboard.setShifted(false);
|
||||||
|
mSymbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggleSymbols() {
|
||||||
|
Keyboard current = mInputView.getKeyboard();
|
||||||
|
if (mSymbolsKeyboard == null) {
|
||||||
|
mSymbolsKeyboard = new LatinKeyboard(mContext, R.xml.kbd_symbols);
|
||||||
|
}
|
||||||
|
if (mSymbolsShiftedKeyboard == null) {
|
||||||
|
mSymbolsShiftedKeyboard = new LatinKeyboard(mContext, R.xml.kbd_symbols_shift);
|
||||||
|
}
|
||||||
|
if (current == mSymbolsKeyboard || current == mSymbolsShiftedKeyboard) {
|
||||||
|
setKeyboardMode(mMode, mImeOptions); // Could be qwerty, alpha, url, email or im
|
||||||
|
return;
|
||||||
|
} else if (current == mPhoneKeyboard) {
|
||||||
|
current = mPhoneSymbolsKeyboard;
|
||||||
|
mPhoneSymbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
|
||||||
|
} else if (current == mPhoneSymbolsKeyboard) {
|
||||||
|
current = mPhoneKeyboard;
|
||||||
|
mPhoneKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
|
||||||
|
} else {
|
||||||
|
current = mSymbolsKeyboard;
|
||||||
|
mSymbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
|
||||||
|
}
|
||||||
|
mInputView.setKeyboard(current);
|
||||||
|
if (current == mSymbolsKeyboard) {
|
||||||
|
current.setShifted(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2009 Google Inc.
|
||||||
|
*
|
||||||
|
* 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.latin;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.ListPreference;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.PreferenceActivity;
|
||||||
|
import android.preference.PreferenceGroup;
|
||||||
|
|
||||||
|
public class LatinIMESettings extends PreferenceActivity
|
||||||
|
implements OnSharedPreferenceChangeListener{
|
||||||
|
|
||||||
|
private static final String CORRECTION_MODE_KEY = "prediction_mode";
|
||||||
|
private static final String PREDICTION_SETTINGS_KEY = "prediction_settings";
|
||||||
|
private static final String PREDICTION_LANDSCAPE_KEY = "prediction_landscape";
|
||||||
|
|
||||||
|
private ListPreference mCorrectionMode;
|
||||||
|
private PreferenceGroup mPredictionSettings;
|
||||||
|
private Preference mPredictionLandscape;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle icicle) {
|
||||||
|
super.onCreate(icicle);
|
||||||
|
addPreferencesFromResource(R.xml.prefs);
|
||||||
|
mCorrectionMode = (ListPreference) findPreference(CORRECTION_MODE_KEY);
|
||||||
|
mPredictionSettings = (PreferenceGroup) findPreference(PREDICTION_SETTINGS_KEY);
|
||||||
|
mPredictionLandscape = findPreference(PREDICTION_LANDSCAPE_KEY);
|
||||||
|
updatePredictionSettings();
|
||||||
|
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
getPreferenceScreen().getSharedPreferences()
|
||||||
|
.unregisterOnSharedPreferenceChangeListener(this);
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updatePredictionSettings() {
|
||||||
|
if (mCorrectionMode != null && mPredictionSettings != null) {
|
||||||
|
String correctionMode = mCorrectionMode.getValue();
|
||||||
|
if (correctionMode.equals(getResources().getString(R.string.prediction_none))) {
|
||||||
|
mPredictionSettings.setEnabled(false);
|
||||||
|
} else {
|
||||||
|
mPredictionSettings.setEnabled(true);
|
||||||
|
boolean suggestionsInLandscape =
|
||||||
|
!correctionMode.equals(getResources().getString(R.string.prediction_full));
|
||||||
|
mPredictionLandscape.setEnabled(suggestionsInLandscape);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
|
||||||
|
if (key.equals(CORRECTION_MODE_KEY)) {
|
||||||
|
updatePredictionSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|