Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d1a503210 | ||
|
|
d1aa59768d | ||
|
|
2c52e94e0b | ||
|
|
3adf95a4c9 | ||
|
|
44f39059e4 | ||
|
|
bbc6226839 | ||
|
|
c5f2c0b727 | ||
|
|
fb27f8d36f | ||
|
|
5beacf32b7 | ||
|
|
ad7314a016 | ||
|
|
bef29da3de | ||
|
|
a55506e607 | ||
|
|
b3dcd61c28 | ||
|
|
9257bf7392 | ||
|
|
95bd9312a7 | ||
|
|
0a86f9ab01 | ||
|
|
70d777253c | ||
|
|
d7fa5ffa9a | ||
|
|
b114c78bf1 | ||
|
|
eddf9c6c11 | ||
|
|
148f3dfc05 | ||
|
|
6725d3057b | ||
|
|
cf9fd3a0db | ||
|
|
329a35e7d3 | ||
|
|
b319356a08 | ||
|
|
73267d68fb | ||
|
|
3f2f3177da | ||
|
|
e26e1d112c | ||
|
|
0005eb2dd5 |
+9
-2
@@ -7,12 +7,12 @@
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.view.im" android:resource="@xml/method"/>
|
||||
</service>
|
||||
<activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@mipmap/ic_launcher" android:label="@string/settings_activity_label" android:theme="@style/android:Theme.DeviceDefault" android:exported="true" android:directBootAware="true">
|
||||
<activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@mipmap/ic_launcher" android:label="@string/settings_activity_label" android:theme="@style/appTheme" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="juloo.keyboard2.LauncherActivity" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/android:Theme.DeviceDefault" android:exported="true" android:directBootAware="true">
|
||||
<activity android:name="juloo.keyboard2.LauncherActivity" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/appTheme" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
@@ -21,4 +21,11 @@
|
||||
</application>
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||
|
||||
<!-- To query enabled input methods for voice IME detection -->
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.view.InputMethod" />
|
||||
</intent>
|
||||
</queries>
|
||||
</manifest>
|
||||
|
||||
+3
-2
@@ -88,14 +88,15 @@ Github secret named `DEBUG_KEYSTORE`.
|
||||
|
||||
### Adding a layout
|
||||
|
||||
Layouts are defined in XML, see `res/xml/latn_qwerty_us.xml`.
|
||||
Layouts are defined in XML, see `srcs/layouts/latn_qwerty_us.xml`.
|
||||
An online tool for editing layout files written by @Lixquid is available
|
||||
[here](https://unexpected-keyboard-layout-editor.lixquid.com/).
|
||||
|
||||
Makes sure to specify the `name` attribute like in `latn_qwerty_us.xml`,
|
||||
otherwise the layout won't be added to the app.
|
||||
|
||||
The layout file must be placed in the `res/xml/` directory and named according to:
|
||||
The layout file must be placed in the `srcs/layouts` directory and named
|
||||
according to:
|
||||
- script (`latn` for latin, etc..)
|
||||
- layout name (eg. the name of a standard)
|
||||
- country code (or language code if more adequate)
|
||||
|
||||
+28
-18
@@ -10,8 +10,8 @@ android {
|
||||
applicationId "juloo.keyboard2"
|
||||
minSdk 4
|
||||
targetSdkVersion 33
|
||||
versionCode 37
|
||||
versionName "1.25.0"
|
||||
versionCode 38
|
||||
versionName "1.26.0"
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
@@ -34,8 +34,7 @@ android {
|
||||
keyAlias(System.env.DEBUG_KEY_ALIAS ? "$System.env.DEBUG_KEY_ALIAS" : "debug")
|
||||
keyPassword(System.env.DEBUG_KEY_PASSWORD ? "$System.env.DEBUG_KEY_PASSWORD" : "debug0")
|
||||
}
|
||||
// Release builds will only be signed with a dedicated key if specified. This key has to be
|
||||
// created manually.
|
||||
|
||||
release {
|
||||
if (System.env.RELEASE_KEYSTORE) {
|
||||
storeFile file(System.env.RELEASE_KEYSTORE)
|
||||
@@ -53,10 +52,9 @@ android {
|
||||
debuggable false
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
|
||||
resValue "string", "app_name", "@string/app_name_release"
|
||||
if (System.env.RELEASE_KEYSTORE) {
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
|
||||
debug {
|
||||
minifyEnabled false
|
||||
shrinkResources false
|
||||
@@ -68,6 +66,13 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
// Name outputs after the application ID.
|
||||
android.applicationVariants.all { variant ->
|
||||
variant.outputs.all {
|
||||
outputFileName = "${applicationId}.apk"
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_7
|
||||
targetCompatibility JavaVersion.VERSION_1_7
|
||||
@@ -110,17 +115,13 @@ tasks.register('genLayoutsList') {
|
||||
|
||||
tasks.register('checkKeyboardLayouts') {
|
||||
println "\nChecking layouts"
|
||||
new ByteArrayOutputStream().withStream { bos ->
|
||||
exec {
|
||||
def layouts = new File(projectDir, "res/xml").listFiles().findAll {
|
||||
it.isFile() && it.name.endsWith(".xml")
|
||||
}
|
||||
workingDir = projectDir
|
||||
commandLine("python", "check_layout.py", *layouts)
|
||||
standardOutput = bos
|
||||
exec {
|
||||
def layouts = new File(projectDir, "srcs/layouts").listFiles().findAll {
|
||||
it.name.endsWith(".xml")
|
||||
}
|
||||
|
||||
new File(projectDir, "check_layout.output").write(bos.toString())
|
||||
workingDir = projectDir
|
||||
commandLine("python", "check_layout.py", *layouts)
|
||||
standardOutput = new FileOutputStream("${projectDir}/check_layout.output")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,6 +136,7 @@ tasks.register('syncTranslations') {
|
||||
tasks.named("preBuild") {
|
||||
dependsOn += "initDebugKeystore"
|
||||
dependsOn += "copyRawQwertyUS"
|
||||
dependsOn += "copyLayoutDefinitions"
|
||||
}
|
||||
|
||||
tasks.register('initDebugKeystore') {
|
||||
@@ -151,7 +153,15 @@ tasks.register('initDebugKeystore') {
|
||||
tasks.register('copyRawQwertyUS')
|
||||
{
|
||||
copy {
|
||||
from "res/xml/latn_qwerty_us.xml"
|
||||
from "srcs/layouts/latn_qwerty_us.xml"
|
||||
into "build/generated-resources/raw"
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('copyLayoutDefinitions')
|
||||
{
|
||||
copy {
|
||||
from "srcs/layouts"
|
||||
into "build/generated-resources/xml"
|
||||
}
|
||||
}
|
||||
|
||||
+18
-8
@@ -2,6 +2,10 @@
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# arab_hamvaj_tly
|
||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], _, `, {, |, }
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# arab_pc
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
||||
1 warnings
|
||||
@@ -39,7 +43,7 @@ Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, )
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
||||
2 warnings
|
||||
# deva_inscript
|
||||
Duplicate keys: , ।
|
||||
Duplicate keys: ।
|
||||
Layout includes some ASCII punctuation but not all, missing: ", $, ', ^, _, `, |
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
3 warnings
|
||||
@@ -61,14 +65,16 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
||||
1 warnings
|
||||
# latn_bone
|
||||
Layout includes some ASCII punctuation but not all, missing: $
|
||||
Layout redefines the bottom row but some important keys are missing, missing: switch_backward
|
||||
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc end, loc home, loc page_down, loc page_up, loc switch_greekmath, loc voice_typing, switch_backward
|
||||
2 warnings
|
||||
# latn_colemak
|
||||
0 warnings
|
||||
Some keys contain whitespaces, unexpected: ́
|
||||
1 warnings
|
||||
# latn_dvorak
|
||||
0 warnings
|
||||
# latn_neo2
|
||||
0 warnings
|
||||
Layout redefines the bottom row but some important keys are missing, missing: loc end, loc home, loc page_down, loc page_up
|
||||
1 warnings
|
||||
# latn_qwerty_br
|
||||
0 warnings
|
||||
# latn_qwerty_cz
|
||||
@@ -89,14 +95,17 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
||||
# latn_qwerty_se
|
||||
Duplicate keys: !, ', ,, -, ., ?
|
||||
1 warnings
|
||||
# latn_qwerty_tly
|
||||
Duplicate keys: a, c, g, j, q
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
||||
2 warnings
|
||||
# latn_qwerty_tr
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_qwerty_us
|
||||
0 warnings
|
||||
# latn_qwerty_vi
|
||||
Layout includes some ASCII punctuation but not all, missing: \
|
||||
1 warnings
|
||||
0 warnings
|
||||
# latn_qwertz
|
||||
0 warnings
|
||||
# latn_qwertz_cz
|
||||
@@ -113,11 +122,12 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
||||
# latn_qwertz_hu
|
||||
0 warnings
|
||||
# latn_qwertz_sk
|
||||
Layout includes some ASCII punctuation but not all, missing: \, `
|
||||
Layout includes some ASCII punctuation but not all, missing: `
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# urdu_phonetic_ur
|
||||
Duplicate keys:
|
||||
Layout includes some ASCII punctuation but not all, missing: <, >, ?, `, |, ~
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
3 warnings
|
||||
Some keys contain whitespaces, unexpected:
|
||||
4 warnings
|
||||
|
||||
+23
-11
@@ -34,6 +34,15 @@ def unexpected_keys(keys, symbols, msg):
|
||||
if len(unexpected) > 0:
|
||||
warn("%s, unexpected: %s" % (msg, key_list_str(unexpected)))
|
||||
|
||||
# Write to [keys] and [dup].
|
||||
def parse_row_from_et(row, keys, dup):
|
||||
for key in row:
|
||||
for attr in key.keys():
|
||||
if attr.startswith("key"):
|
||||
k = key.get(attr).removeprefix("\\")
|
||||
if k in keys: dup.add(k)
|
||||
keys.add(k)
|
||||
|
||||
def parse_layout(fname):
|
||||
keys = set()
|
||||
dup = set()
|
||||
@@ -41,12 +50,16 @@ def parse_layout(fname):
|
||||
if root.tag != "keyboard":
|
||||
return None
|
||||
for row in root:
|
||||
for key in row:
|
||||
for attr in key.keys():
|
||||
if attr.startswith("key"):
|
||||
k = key.get(attr).removeprefix("\\")
|
||||
if k in keys: dup.add(k)
|
||||
keys.add(k)
|
||||
parse_row_from_et(row, keys, dup)
|
||||
return root, keys, dup
|
||||
|
||||
def parse_row(fname):
|
||||
keys = set()
|
||||
dup = set()
|
||||
root = ET.parse(fname).getroot()
|
||||
if root.tag != "row":
|
||||
return None
|
||||
parse_row_from_et(root, keys, dup)
|
||||
return root, keys, dup
|
||||
|
||||
def check_layout(layout):
|
||||
@@ -66,12 +79,11 @@ def check_layout(layout):
|
||||
[ "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
|
||||
"f10", "f11", "f12" ],
|
||||
"Layout contains function keys")
|
||||
unexpected_keys(keys, [""], "Layout contains empty strings")
|
||||
unexpected_keys(keys, ["loc"], "Special keyword cannot be a symbol")
|
||||
unexpected_keys(keys, filter(lambda k: k.strip()!=k, keys), "Some keys contain whitespaces")
|
||||
|
||||
bottom_row_keys = [
|
||||
"ctrl", "fn", "switch_numeric", "change_method", "switch_emoji",
|
||||
"config", "switch_forward", "switch_backward", "enter", "action",
|
||||
"left", "up", "right", "down", "space"
|
||||
]
|
||||
_, bottom_row_keys, _ = parse_row("res/xml/bottom_row.xml")
|
||||
|
||||
if root.get("bottom_row") == "false":
|
||||
missing_required(keys, bottom_row_keys,
|
||||
|
||||
+3
-10
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Generates the list of layouts in res/values/layouts.xml from the layout files
|
||||
# in res/xml. Every layouts must have a 'name' attribute to be listed.
|
||||
# in srcs/layouts. Every layouts must have a 'name' attribute to be listed.
|
||||
|
||||
import itertools as it
|
||||
import sys, os, glob
|
||||
@@ -11,11 +11,6 @@ import xml.etree.ElementTree as XML
|
||||
# are sorted alphabetically.
|
||||
FIRST_LAYOUTS = [ "latn_qwerty_us", "latn_colemak", "latn_dvorak" ]
|
||||
|
||||
# File names that are known not to be layouts. Avoid warning about them.
|
||||
KNOWN_NOT_LAYOUT = set([
|
||||
"number_row", "numpad", "pin", "bottom_row", "settings", "method",
|
||||
"greekmath", "numeric" ])
|
||||
|
||||
# Read a layout from a file. Returns [None] if [fname] is not a layout.
|
||||
def read_layout(fname):
|
||||
root = XML.parse(fname).getroot()
|
||||
@@ -28,9 +23,7 @@ def read_layouts(files):
|
||||
for layout_file in files:
|
||||
layout_id, _ = os.path.splitext(os.path.basename(layout_file))
|
||||
layout = read_layout(layout_file)
|
||||
if layout_id in KNOWN_NOT_LAYOUT:
|
||||
continue
|
||||
elif layout == None:
|
||||
if layout == None:
|
||||
print("Not a layout file: %s" % layout_file)
|
||||
elif layout["name"] == None:
|
||||
print("Layout doesn't have a name: %s" % layout_id)
|
||||
@@ -66,6 +59,6 @@ def generate_arrays(out, layouts):
|
||||
XML.indent(root)
|
||||
XML.ElementTree(element=root).write(out, encoding="unicode", xml_declaration=True)
|
||||
|
||||
layouts = sort_layouts(read_layouts(glob.glob("res/xml/*.xml")))
|
||||
layouts = sort_layouts(read_layouts(glob.glob("srcs/layouts/*.xml")))
|
||||
with open("res/values/layouts.xml", "w") as out:
|
||||
generate_arrays(out, layouts)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
The custom vibration setting is back.
|
||||
Allow to hide the keyboard switching key.
|
||||
Fixed modifier keys in some development apps.
|
||||
Updated translations.
|
||||
Bug fixes and general improvements.
|
||||
|
||||
Many thanks to the contributors: @abb128, @marciozomb13, @RetrogisusDEV, @Sestowner, @vedamanavi, @krtsgnr7230
|
||||
@@ -3,6 +3,6 @@
|
||||
<juloo.keyboard2.EmojiGroupButtonsBar android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
|
||||
<juloo.keyboard2.EmojiGridView android:id="@+id/emoji_grid" android:layout_width="fill_parent" android:layout_height="@dimen/emoji_grid_height" android:orientation="vertical" android:numColumns="auto_fit" android:columnWidth="45sp" android:background="?attr/colorKeyboard"/>
|
||||
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<juloo.keyboard2.EmojiBottomRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?attr/emoji_key_bg"/>
|
||||
<juloo.keyboard2.Keyboard2View layout="@xml/emoji_bottom_row" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?attr/emoji_key_bg"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Stiskne Shift na začátku věty</string>
|
||||
<string name="pref_switch_input_immediate_title">Přepnout na posledně užívanou klávesnici</string>
|
||||
<string name="pref_switch_input_immediate_summary">Jak bude klávesa pro přepnutí klávesnice reagovat</string>
|
||||
<string name="pref_vibrate_title">Vibrace</string>
|
||||
<string name="pref_vibrate_summary">Preference intenzity vibrací při stisku klávesy</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">Rozvržení zadávání PIN kódu</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Automaticky při psaní čísel, datumů a telefonních čísel</string>
|
||||
<string name="pref_category_style">Styl</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Velmi dlouhá</string>
|
||||
<string name="pref_key_horizontal_space">Horizontální mezery mezi klávesami</string>
|
||||
<string name="pref_key_vertical_space">Vertikální mezery mezi klávesami</string>
|
||||
<string name="pref_vibration_e_disabled">Deaktivovány</string>
|
||||
<string name="pref_vibration_e_system">Dle systému</string>
|
||||
<string name="pref_vibration_e_strong">Silné</string>
|
||||
<string name="pref_vibration_e_medium">Střední</string>
|
||||
<string name="pref_vibration_e_light">Slabé</string>
|
||||
<string name="key_action_next">Další</string>
|
||||
<string name="key_action_done">Dokončit</string>
|
||||
<string name="key_action_go">Spustit</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">Po aktivaci můžete klávesnici rovnou vyzkoušet zde:</string>
|
||||
<string name="key_descr_capslock">Caps lock</string>
|
||||
<string name="key_descr_switch_greekmath">Řecké a matematické symboly</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Hlasové zadávání</string>
|
||||
<string name="key_descr_copy">Kopírovat</string>
|
||||
<string name="key_descr_paste">Vložit</string>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Umschalttaste am Satzanfang aktivieren</string>
|
||||
<string name="pref_switch_input_immediate_title">Sofort zur nächsten Tastatur wechseln</string>
|
||||
<string name="pref_switch_input_immediate_summary">Verhalten der Tastaturumschalttaste</string>
|
||||
<string name="pref_vibrate_title">Vibration</string>
|
||||
<string name="pref_vibrate_summary">Vibration bei Tastendruck ein-/ausschalten</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">PIN-Eingabe-Layout</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Für die Nummern-, Datums- und Telefonnummern-Eingabe</string>
|
||||
<string name="pref_category_style">Design</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Sehr weit</string>
|
||||
<string name="pref_key_horizontal_space">Horizontaler Abstand zwischen den Tasten</string>
|
||||
<string name="pref_key_vertical_space">Vertikaler Abstand zwischen den Tasten</string>
|
||||
<string name="pref_vibration_e_disabled">Deaktiviert</string>
|
||||
<string name="pref_vibration_e_system">System</string>
|
||||
<string name="pref_vibration_e_strong">Stark</string>
|
||||
<string name="pref_vibration_e_medium">Mittel</string>
|
||||
<string name="pref_vibration_e_light">Schwach</string>
|
||||
<string name="key_action_next">Nächstes</string>
|
||||
<string name="key_action_done">Fertig</string>
|
||||
<string name="key_action_go">Los</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">Nach Aktivierung kannst du die Tastatur hier ausprobieren:</string>
|
||||
<string name="key_descr_capslock">Feststelltaste</string>
|
||||
<string name="key_descr_switch_greekmath">Griechische & mathematische Symbole</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Spracheingabe</string>
|
||||
<string name="key_descr_copy">Kopieren</string>
|
||||
<string name="key_descr_paste">Einfügen</string>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Presionar Mayús al principio de una oración</string>
|
||||
<string name="pref_switch_input_immediate_title">Cambiar al último teclado usado</string>
|
||||
<string name="pref_switch_input_immediate_summary">Comportamiento de la tecla para cambiar diseño</string>
|
||||
<string name="pref_vibrate_title">Vibración</string>
|
||||
<string name="pref_vibrate_summary">Habilitar/deshabilitar vibración al presionar una tecla</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">Diseño de introducción de PIN</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Para escribir cifras, fechas y números telefónicos</string>
|
||||
<string name="pref_category_style">Estilo</string>
|
||||
@@ -57,11 +57,11 @@
|
||||
<string name="pref_theme_e_dark">Oscuro</string>
|
||||
<string name="pref_theme_e_light">Claro</string>
|
||||
<string name="pref_theme_e_black">Negro</string>
|
||||
<string name="pref_theme_e_altblack">Negro Alternativo</string>
|
||||
<string name="pref_theme_e_altblack">Negro alternativo</string>
|
||||
<string name="pref_theme_e_white">Blanco</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_theme_e_desert">Desierto</string>
|
||||
<string name="pref_theme_e_jungle">Selva</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Muy corta</string>
|
||||
<string name="pref_swipe_dist_e_short">Corta</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Muy larga</string>
|
||||
<string name="pref_key_horizontal_space">Espaciado horizontal entre las teclas</string>
|
||||
<string name="pref_key_vertical_space">Espaciado vertical entre las teclas</string>
|
||||
<string name="pref_vibration_e_disabled">Deshabilitada</string>
|
||||
<string name="pref_vibration_e_system">Igual al sistema</string>
|
||||
<string name="pref_vibration_e_strong">Fuerte</string>
|
||||
<string name="pref_vibration_e_medium">Media</string>
|
||||
<string name="pref_vibration_e_light">Suave</string>
|
||||
<string name="key_action_next">Siguiente</string>
|
||||
<string name="key_action_done">Hecho</string>
|
||||
<string name="key_action_go">Ir</string>
|
||||
@@ -81,12 +76,13 @@
|
||||
<string name="key_action_search">Buscar</string>
|
||||
<string name="key_action_send">Enviar</string>
|
||||
<string name="launcher_button_imesettings">Habilitar teclado</string>
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_button_imepicker">Seleccionar método de entrada</string>
|
||||
<string name="launcher_description">Esta aplicación es un teclado virtual. Presiona el botón de abajo para ir a Ajustes y habilitar Unexpected Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Esta es una aplicación gratuita, libre y de código abierto. Puedes encontrar el código fuente o reportar errores en Github.</string>
|
||||
<string name="launcher_sourcecode">Esta es una aplicación gratuita, libre y de código abierto. Puedes encontrar el código fuente o reportar errores en GitHub.</string>
|
||||
<string name="launcher_tryhere">Tras habilitarlo, puedes probar el teclado en este campo:</string>
|
||||
<string name="key_descr_capslock">Bloq Mayús</string>
|
||||
<string name="key_descr_switch_greekmath">Símb. griegos y matemáticos</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Dictado por voz</string>
|
||||
<string name="key_descr_copy">Copiar</string>
|
||||
<string name="key_descr_paste">Pegar</string>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">در شروع جملات دگرساز را فشار دهید</string>
|
||||
<string name="pref_switch_input_immediate_title">انتقال به آخرین صفحه کلید استفاده شده</string>
|
||||
<string name="pref_switch_input_immediate_summary">رفتار کلید تغییردهنده صفحه کلید</string>
|
||||
<string name="pref_vibrate_title">لرزش</string>
|
||||
<string name="pref_vibrate_summary">فعال/غیرفعال کردن لرزش در زمان فشار دادن کلیدها</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_category_style">سبک</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">بسیار دور</string>
|
||||
<string name="pref_key_horizontal_space">فاصله افقی بین کلیدها</string>
|
||||
<string name="pref_key_vertical_space">فاصله عمودی بین کلیدها</string>
|
||||
<!-- <string name="pref_vibration_e_disabled">Disabled</string> -->
|
||||
<!-- <string name="pref_vibration_e_system">System</string> -->
|
||||
<!-- <string name="pref_vibration_e_strong">Strong</string> -->
|
||||
<!-- <string name="pref_vibration_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_vibration_e_light">Light</string> -->
|
||||
<string name="key_action_next">بعدی</string>
|
||||
<string name="key_action_done">اتمام</string>
|
||||
<string name="key_action_go">برو</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">بعد از فعالسازی، صفحه کلید را اینجا امتحان کنید:</string>
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Activer Shift au début des phrases</string>
|
||||
<string name="pref_switch_input_immediate_title">Changer vers le clavier utilisé en dernier</string>
|
||||
<string name="pref_switch_input_immediate_summary">Comportement de la touche de changement de clavier</string>
|
||||
<string name="pref_vibrate_title">Vibreur</string>
|
||||
<string name="pref_vibrate_summary">Vibration a chaque touche</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">Clavier PIN</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Lors de la saisie de nombres, de dates et de numéros de téléphone</string>
|
||||
<string name="pref_category_style">Style</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Très longue</string>
|
||||
<string name="pref_key_horizontal_space">Espacement horizontal entre les touches</string>
|
||||
<string name="pref_key_vertical_space">Espacement vertical entre les touches</string>
|
||||
<string name="pref_vibration_e_disabled">Désactivé</string>
|
||||
<string name="pref_vibration_e_system">Système</string>
|
||||
<string name="pref_vibration_e_strong">Fort</string>
|
||||
<string name="pref_vibration_e_medium">Moyen</string>
|
||||
<string name="pref_vibration_e_light">Léger</string>
|
||||
<string name="key_action_next">Suiv.</string>
|
||||
<string name="key_action_done">Fin</string>
|
||||
<string name="key_action_go">Aller</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string>
|
||||
<string name="key_descr_capslock">Verrouillage majuscules</string>
|
||||
<string name="key_descr_switch_greekmath">Symboles mathématiques</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Saisie vocale</string>
|
||||
<string name="key_descr_copy">Copier</string>
|
||||
<string name="key_descr_paste">Coller</string>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Premi Shift all\'inizio di una frase</string>
|
||||
<!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> -->
|
||||
<!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> -->
|
||||
<string name="pref_vibrate_title">Vibrazione</string>
|
||||
<string name="pref_vibrate_summary">Abilita/Disabilita Vibrazione alla pressione dei tasti</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_category_style">Stile</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Molto distante</string>
|
||||
<string name="pref_key_horizontal_space">Spazio orizzontale tra i tasti</string>
|
||||
<string name="pref_key_vertical_space">Spazio verticale tra i tasti</string>
|
||||
<!-- <string name="pref_vibration_e_disabled">Disabled</string> -->
|
||||
<!-- <string name="pref_vibration_e_system">System</string> -->
|
||||
<!-- <string name="pref_vibration_e_strong">Strong</string> -->
|
||||
<!-- <string name="pref_vibration_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_vibration_e_light">Light</string> -->
|
||||
<string name="key_action_next">Prossimo</string>
|
||||
<string name="key_action_done">Fatto</string>
|
||||
<string name="key_action_go">Vai</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<!-- <string name="pref_autocapitalisation_summary">Press Shift at the beginning of a sentence</string> -->
|
||||
<!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> -->
|
||||
<!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> -->
|
||||
<string name="pref_vibrate_title">진동</string>
|
||||
<string name="pref_vibrate_summary">키 누를 때 진동 키거/끄기</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_category_style">스타일</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">매우 넓음</string>
|
||||
<string name="pref_key_horizontal_space">키보드 양 옆 간격</string>
|
||||
<string name="pref_key_vertical_space">키보드 세로 간격</string>
|
||||
<!-- <string name="pref_vibration_e_disabled">Disabled</string> -->
|
||||
<!-- <string name="pref_vibration_e_system">System</string> -->
|
||||
<!-- <string name="pref_vibration_e_strong">Strong</string> -->
|
||||
<!-- <string name="pref_vibration_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_vibration_e_light">Light</string> -->
|
||||
<string name="key_action_next">다음</string>
|
||||
<string name="key_action_done">확인</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Piespiest Shift teikuma sākumā</string>
|
||||
<string name="pref_switch_input_immediate_title">Pārslēgties uz pēdējo izmantoto tastatūru</string>
|
||||
<string name="pref_switch_input_immediate_summary">Tastatūras pārslēgšanas taustiņa uzvedība</string>
|
||||
<string name="pref_vibrate_title">Trīcēšana</string>
|
||||
<string name="pref_vibrate_summary">Iespējot/atspējot taustiņa piespiešanas trīcēšanu</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">Piespraust ievadīšanas izkārtojumu</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Kad ievada skaitļus, datumus un tālruņa numurus</string>
|
||||
<string name="pref_category_style">Izskata pielāgojumi</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Ļoti tāls</string>
|
||||
<string name="pref_key_horizontal_space">Līmeniskais attālums starp taustiņiem</string>
|
||||
<string name="pref_key_vertical_space">Stateniskais attālums starp taustiņiem</string>
|
||||
<string name="pref_vibration_e_disabled">Atspējota</string>
|
||||
<string name="pref_vibration_e_system">Sistēmas</string>
|
||||
<string name="pref_vibration_e_strong">Spēcīga</string>
|
||||
<string name="pref_vibration_e_medium">Vidēja</string>
|
||||
<string name="pref_vibration_e_light">Vāja</string>
|
||||
<string name="key_action_next">Nākamais</string>
|
||||
<string name="key_action_done">Darīts</string>
|
||||
<string name="key_action_go">Aiziet</string>
|
||||
@@ -89,6 +84,7 @@
|
||||
<string name="launcher_tryhere">Pēc iespējošanas šeit var izmēģināt tastatūru:</string>
|
||||
<string name="key_descr_capslock">Burtslēgs</string>
|
||||
<string name="key_descr_switch_greekmath">Grieķu un matemātikas rakstzīmes</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Rakstīšana ar balsi</string>
|
||||
<string name="key_descr_copy">Ievietot starpliktuvē</string>
|
||||
<string name="key_descr_paste">Ielīmēt</string>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="appTheme" parent="@android:style/Theme.Material"/>
|
||||
</resources>
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Naciśnij Shift na początku zdania</string>
|
||||
<string name="pref_switch_input_immediate_title">Przełącz na ostatnio używaną klawiaturę</string>
|
||||
<string name="pref_switch_input_immediate_summary">Działanie klawisza przełączającego klawiaturę</string>
|
||||
<string name="pref_vibrate_title">Wibracje</string>
|
||||
<string name="pref_vibrate_summary">Wł./wył. wibrację przy naciśnięciu klawisza</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">Układ klawiatury PIN</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Podczas wpisywania liczb, dat i numerów telefonu</string>
|
||||
<string name="pref_category_style">Styl</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Bardzo duża</string>
|
||||
<string name="pref_key_horizontal_space">Odległość pomiędzy klawiszami w poziomie</string>
|
||||
<string name="pref_key_vertical_space">Odległość pomiędzy klawiszami w pionie</string>
|
||||
<string name="pref_vibration_e_disabled">Wyłączone</string>
|
||||
<string name="pref_vibration_e_system">Systemowe</string>
|
||||
<string name="pref_vibration_e_strong">Silne</string>
|
||||
<string name="pref_vibration_e_medium">Normalne</string>
|
||||
<string name="pref_vibration_e_light">Słabe</string>
|
||||
<string name="key_action_next">Dalej</string>
|
||||
<string name="key_action_done">OK</string>
|
||||
<string name="key_action_go">Przejdź</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">Po jej włączeniu, możesz wypróbować klawiaturę tutaj:</string>
|
||||
<string name="key_descr_capslock">Caps lock</string>
|
||||
<string name="key_descr_switch_greekmath">Symbole greckie i matematyczne</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Pisanie głosowe</string>
|
||||
<string name="key_descr_copy">Kopiuj</string>
|
||||
<string name="key_descr_paste">Wklej</string>
|
||||
|
||||
+10
-14
@@ -14,7 +14,7 @@
|
||||
<string name="pref_layout_e_custom">Layout personalizado</string>
|
||||
<string name="pref_layouts_add">Adicione um layout alternativo</string>
|
||||
<string name="pref_layouts_item">Layout %1$d: %2$s</string>
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<string name="pref_layouts_remove_custom">Remover layout</string>
|
||||
<string name="pref_custom_layout_title">Layout personalizado</string>
|
||||
<string name="pref_show_numpad_title">Mostrar Teclado Numérico</string>
|
||||
<string name="pref_show_numpad_never">Nunca</string>
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Aciona o shift no início de cada frase</string>
|
||||
<string name="pref_switch_input_immediate_title">Alternar para o último teclado usado</string>
|
||||
<string name="pref_switch_input_immediate_summary">Comportamento da tecla de troca de teclado</string>
|
||||
<string name="pref_vibrate_title">Vibração</string>
|
||||
<string name="pref_vibrate_summary">Ativar/desativar vibração ao digitar</string>
|
||||
<string name="pref_vibrate_custom">Vibração personalizada</string>
|
||||
<string name="pref_vibrate_duration_title">Intensidade da vibração</string>
|
||||
<string name="pref_pin_entry_enabled_title">Layout PIN</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Quando digitando números, datas ou números de telefone</string>
|
||||
<string name="pref_category_style">Estilo</string>
|
||||
@@ -60,20 +60,15 @@
|
||||
<string name="pref_theme_e_altblack">Preto Alternativo</string>
|
||||
<string name="pref_theme_e_white">Branco</string>
|
||||
<string name="pref_theme_e_epaper">Papel Eletrônico</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Muito curto</string>
|
||||
<string name="pref_theme_e_desert">Deserto</string>
|
||||
<string name="pref_theme_e_jungle">Selva</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Bem curto</string>
|
||||
<string name="pref_swipe_dist_e_short">Curto</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
<string name="pref_swipe_dist_e_far">Longo</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Muito longo</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Bem longo</string>
|
||||
<string name="pref_key_horizontal_space">Distância horizontal entre teclas</string>
|
||||
<string name="pref_key_vertical_space">Distância vertical entre teclas</string>
|
||||
<string name="pref_vibration_e_disabled">Desabilitado</string>
|
||||
<string name="pref_vibration_e_system">Sistema</string>
|
||||
<string name="pref_vibration_e_strong">Intenso</string>
|
||||
<string name="pref_vibration_e_medium">Médio</string>
|
||||
<string name="pref_vibration_e_light">Suave</string>
|
||||
<string name="key_action_next">Próximo</string>
|
||||
<string name="key_action_done">Pronto</string>
|
||||
<string name="key_action_go">Ir</string>
|
||||
@@ -81,16 +76,17 @@
|
||||
<string name="key_action_search">Buscar</string>
|
||||
<string name="key_action_send">Enviar</string>
|
||||
<string name="launcher_button_imesettings">Ativar teclado</string>
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_button_imepicker">Selecionar teclado</string>
|
||||
<string name="launcher_description">Este app é um teclado virtual. Vá para as configurações do sistema clicando no botão abaixo e ative o Teclado Unexpected.</string>
|
||||
<string name="launcher_sourcecode">Este app é gratuito é de código aberto. Você pode consultar o código ou fazer sugestões em Github.</string>
|
||||
<string name="launcher_tryhere">Após ativar, experimente aqui:</string>
|
||||
<string name="key_descr_capslock">Caps lock</string>
|
||||
<string name="key_descr_switch_greekmath">Grego & símbolos matemáticos</string>
|
||||
<string name="key_descr_change_method">Trocar de teclado</string>
|
||||
<string name="key_descr_voice_typing">Digitação por voz</string>
|
||||
<string name="key_descr_copy">Copiar</string>
|
||||
<string name="key_descr_paste">Colar</string>
|
||||
<string name="key_descr_cut">Cortar</string>
|
||||
<string name="key_descr_cut">Recortar</string>
|
||||
<string name="key_descr_selectAll">Selecionar tudo</string>
|
||||
<string name="key_descr_shareText">Compartilhar texto</string>
|
||||
<string name="key_descr_pasteAsPlainText">Colar texto não formatado</string>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Autoapăsare Shift la începutul fiecărei propoziții</string>
|
||||
<string name="pref_switch_input_immediate_title">Schimbă la ultima tastatură folosită</string>
|
||||
<string name="pref_switch_input_immediate_summary">Comportamentul tastei pentru schimbarea tastaturii</string>
|
||||
<string name="pref_vibrate_title">Vibrație</string>
|
||||
<string name="pref_vibrate_summary">Activați/dezactivați vibrația la apăsarea tastelor</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_category_style">Stil</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Foarte depărtată</string>
|
||||
<string name="pref_key_horizontal_space">Distanța orizontală dintre taste</string>
|
||||
<string name="pref_key_vertical_space">Distanța verticală dintre taste</string>
|
||||
<!-- <string name="pref_vibration_e_disabled">Disabled</string> -->
|
||||
<!-- <string name="pref_vibration_e_system">System</string> -->
|
||||
<!-- <string name="pref_vibration_e_strong">Strong</string> -->
|
||||
<!-- <string name="pref_vibration_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_vibration_e_light">Light</string> -->
|
||||
<string name="key_action_next">Următor</string>
|
||||
<string name="key_action_done">Gata</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">După activare, puteți să încercați tastatura aici:</string>
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Автонажатие Shift в начале каждого предложения</string>
|
||||
<string name="pref_switch_input_immediate_title">Переключаться к последней используемой клавиатуре</string>
|
||||
<string name="pref_switch_input_immediate_summary">Поведение клавиши переключения клавиатуры</string>
|
||||
<string name="pref_vibrate_title">Вибрация</string>
|
||||
<string name="pref_vibrate_summary">Включение/выключение вибрации при нажатии клавиши</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_category_style">Стиль</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Очень далеко</string>
|
||||
<string name="pref_key_horizontal_space">Горизонтальное расстояние между клавишами</string>
|
||||
<string name="pref_key_vertical_space">Расстояние по вертикали между клавишами</string>
|
||||
<!-- <string name="pref_vibration_e_disabled">Disabled</string> -->
|
||||
<!-- <string name="pref_vibration_e_system">System</string> -->
|
||||
<!-- <string name="pref_vibration_e_strong">Strong</string> -->
|
||||
<!-- <string name="pref_vibration_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_vibration_e_light">Light</string> -->
|
||||
<string name="key_action_next">Далее</string>
|
||||
<string name="key_action_done">Ввод</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">После активации вы можете попробовать клавиатуру прямо здесь:</string>
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Noktadan sonra ve her cümlenin başında büyük harf yapar</string>
|
||||
<string name="pref_switch_input_immediate_title">Son kullanılan klavyeye geç</string>
|
||||
<string name="pref_switch_input_immediate_summary">Klavye değistirme tuşunun davranışını belirler</string>
|
||||
<string name="pref_vibrate_title">Titreşim</string>
|
||||
<string name="pref_vibrate_summary">Tuşlara basılınca titremeyi aç/kapat</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">NumPad</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Sayıları, tarihleri ve telefon numaralarını yazarken</string>
|
||||
<string name="pref_category_style">Tarz</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Çok uzun</string>
|
||||
<string name="pref_key_horizontal_space">Tuşlar arasındaki yatay boşluk</string>
|
||||
<string name="pref_key_vertical_space">Tuşlar arasındaki dikey boşluk</string>
|
||||
<string name="pref_vibration_e_disabled">Aktif değil</string>
|
||||
<string name="pref_vibration_e_system">Sistem</string>
|
||||
<string name="pref_vibration_e_strong">Şiddetli</string>
|
||||
<string name="pref_vibration_e_medium">Orta</string>
|
||||
<string name="pref_vibration_e_light">Hafif</string>
|
||||
<string name="key_action_next">Sonraki</string>
|
||||
<string name="key_action_done">Tamam</string>
|
||||
<string name="key_action_go">ileri</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string>
|
||||
<string name="key_descr_capslock">CapsLock</string>
|
||||
<string name="key_descr_switch_greekmath">Greek & math sembolleri</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Sesle yazma</string>
|
||||
<string name="key_descr_copy">Kopyala</string>
|
||||
<string name="key_descr_paste">Yapıştır</string>
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (Налагодження)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Налаштування</string>
|
||||
<string name="pref_portrait">У портретному режимі</string>
|
||||
<string name="pref_landscape">У альбомному режимі</string>
|
||||
<string name="pref_category_layout">Макет</string>
|
||||
<string name="pref_label_brightness">Налаштувати яскравість символів</string>
|
||||
<string name="pref_keyboard_opacity">Налаштувати прозорість фону клавіатури</string>
|
||||
<string name="pref_key_opacity">Налаштувати прозорість клавіш</string>
|
||||
<string name="pref_key_activated_opacity">Налаштувати прозорість натиснутої клавіші</string>
|
||||
<string name="pref_layout_e_system">Системні налаштування</string>
|
||||
<string name="pref_layout_e_custom">Власний макет</string>
|
||||
<string name="pref_layouts_add">Додати альтернативний макет</string>
|
||||
<string name="pref_layouts_item">Макет %1$d: %2$s</string>
|
||||
<string name="pref_layouts_remove_custom">Видалити макет</string>
|
||||
<string name="pref_custom_layout_title">Власний макет</string>
|
||||
<string name="pref_show_numpad_title">Показувати числову клавіатуру </string>
|
||||
<string name="pref_show_numpad_never">Ніколи</string>
|
||||
<string name="pref_show_numpad_landscape">Тільки в альбомному режимі</string>
|
||||
<string name="pref_show_numpad_always">Завжди</string>
|
||||
<string name="pref_number_row_title">Показувати рядок чисел</string>
|
||||
<string name="pref_number_row_summary">Додати рядок чисел у верхній частині клавіатури, коли числову клавіатуру приховано</string>
|
||||
<string name="pref_numpad_layout">Макет числової клавіатури</string>
|
||||
<string name="pref_numpad_layout_e_high_first">Від найбільшої цифри</string>
|
||||
<string name="pref_numpad_layout_e_low_first">Від найменшої цифри</string>
|
||||
<string name="pref_extra_keys_title">Додати клавіші до клавіатури</string>
|
||||
<string name="pref_extra_keys_custom">Додайте власні клавіші</string>
|
||||
<string name="pref_extra_keys_internal">Виберіть клавіші, які потрібно додати до клавіатури</string>
|
||||
<string name="pref_second_layout_title">Додаткова розкладка</string>
|
||||
<string name="pref_second_layout_none">Немає</string>
|
||||
<string name="pref_category_typing">Введення</string>
|
||||
<string name="pref_swipe_dist_title">Відстань проведення</string>
|
||||
<string name="pref_swipe_dist_summary">Відстань між символами в кутах клавіш (%s)</string>
|
||||
<string name="pref_long_timeout_title">Час очікування повтору клавіші</string>
|
||||
<string name="pref_long_interval_title">Інтервал повторення клавіш</string>
|
||||
<string name="pref_lock_double_tap_title">Двічі торкніться Shift для Caps Lock</string>
|
||||
<string name="pref_lock_double_tap_summary">Ви можете заблокувати будь-який модифікатор, утримуючи його</string>
|
||||
<string name="pref_category_behavior">Поведінка</string>
|
||||
<string name="pref_autocapitalisation_title">Автоматичне введення великих літер</string>
|
||||
<string name="pref_autocapitalisation_summary">Натиснути Shift на початку речення</string>
|
||||
<string name="pref_switch_input_immediate_title">Перейти до останньої використаної клавіатури</string>
|
||||
<string name="pref_switch_input_immediate_summary">Поведінка клавіші перемикання клавіатури</string>
|
||||
<string name="pref_vibrate_custom">Спеціальна вібрація</string>
|
||||
<string name="pref_vibrate_duration_title">Інтенсивність вібрації</string>
|
||||
<string name="pref_pin_entry_enabled_title">Макет введення PIN-коду</string>
|
||||
<string name="pref_pin_entry_enabled_summary">При наборі чисел, дат і номерів телефонів</string>
|
||||
<string name="pref_category_style">Стиль</string>
|
||||
<string name="pref_margin_bottom_title">Поле знизу</string>
|
||||
<string name="pref_keyboard_height_title">Висота клавіатури</string>
|
||||
<string name="pref_horizontal_margin_title">Горизонтальне поле</string>
|
||||
<string name="pref_character_size_title">Розмір символів</string>
|
||||
<string name="pref_character_size_summary">Розмір символів, що відображаються на клавіатурі (%.2fx)</string>
|
||||
<string name="pref_theme">Тема</string>
|
||||
<string name="pref_theme_e_system">Налаштування системи</string>
|
||||
<string name="pref_theme_e_dark">Темна</string>
|
||||
<string name="pref_theme_e_light">Світла</string>
|
||||
<string name="pref_theme_e_black">Чорна</string>
|
||||
<string name="pref_theme_e_altblack">Альтернативний чорний</string>
|
||||
<string name="pref_theme_e_white">Біла</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Пустеля</string>
|
||||
<string name="pref_theme_e_jungle">Джунглі</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
|
||||
<string name="pref_swipe_dist_e_short">Коротка</string>
|
||||
<string name="pref_swipe_dist_e_default">Звичайна</string>
|
||||
<string name="pref_swipe_dist_e_far">Далека</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Дуже далека</string>
|
||||
<string name="pref_key_horizontal_space">Горизонтальна відстань між клавішами</string>
|
||||
<string name="pref_key_vertical_space">Вертикальна відстань між клавішами</string>
|
||||
<string name="key_action_next">Далі</string>
|
||||
<string name="key_action_done">Готово</string>
|
||||
<string name="key_action_go">Іти</string>
|
||||
<string name="key_action_prev">Назад</string>
|
||||
<string name="key_action_search">Пошук</string>
|
||||
<string name="key_action_send">Надіслати</string>
|
||||
<string name="launcher_button_imesettings">Увімкнути клавіатуру</string>
|
||||
<string name="launcher_button_imepicker">Вибрати клавіатуру</string>
|
||||
<string name="launcher_description">Ця програма є віртуальною клавіатурою. Перейдіть до системних налаштувань, натиснувши кнопку нижче, і ввімкніть Unexpected-Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Це безкоштовна програма з відкритим кодом. Ви можете знайти початковий код або повідомити про помилки на GitHub.</string>
|
||||
<string name="launcher_tryhere">Після ввімкнення ви можете спробувати клавіатуру тут:</string>
|
||||
<string name="key_descr_capslock">Caps lock</string>
|
||||
<string name="key_descr_switch_greekmath">Грецькі та математичні символи</string>
|
||||
<string name="key_descr_change_method">Переключити клавіатуру</string>
|
||||
<string name="key_descr_voice_typing">Голосове введення</string>
|
||||
<string name="key_descr_copy">Копіювати</string>
|
||||
<string name="key_descr_paste">Вставити</string>
|
||||
<string name="key_descr_cut">Вирізати</string>
|
||||
<string name="key_descr_selectAll">Вибрати все</string>
|
||||
<string name="key_descr_shareText">Поділитися текстом</string>
|
||||
<string name="key_descr_pasteAsPlainText">Вставити як звичайний текст</string>
|
||||
<string name="key_descr_undo">Відмінити</string>
|
||||
<string name="key_descr_redo">Повторити</string>
|
||||
<string name="key_descr_ª">Жіночий порядковий вказівник</string>
|
||||
<string name="key_descr_º">Чоловічий порядковий вказівник</string>
|
||||
<string name="key_descr_superscript">Верхній індекс</string>
|
||||
<string name="key_descr_subscript">Нижній індекс</string>
|
||||
<string name="key_descr_page_up">Page Up</string>
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="pref_category_advanced">Додаткові</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="appTheme" parent="@android:style/Theme.Material.Light"/>
|
||||
</resources>
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Nhấn Shift ở đầu câu</string>
|
||||
<!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> -->
|
||||
<!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> -->
|
||||
<string name="pref_vibrate_title">Sự rung</string>
|
||||
<string name="pref_vibrate_summary">Bật/tắt rung khi nhấn</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_category_style">Kiểu cách</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Rất xa</string>
|
||||
<string name="pref_key_horizontal_space">Khoảng cách giữa các phím theo chiều ngang</string>
|
||||
<string name="pref_key_vertical_space">Khoảng cách giữa các phím theo chiều dọc</string>
|
||||
<!-- <string name="pref_vibration_e_disabled">Disabled</string> -->
|
||||
<!-- <string name="pref_vibration_e_system">System</string> -->
|
||||
<!-- <string name="pref_vibration_e_strong">Strong</string> -->
|
||||
<!-- <string name="pref_vibration_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_vibration_e_light">Light</string> -->
|
||||
<string name="key_action_next">Tiếp</string>
|
||||
<string name="key_action_done">Xong</string>
|
||||
<string name="key_action_go">Đi</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">在句子的开头自动按下Shift</string>
|
||||
<string name="pref_switch_input_immediate_title">切换到最近使用的键盘</string>
|
||||
<string name="pref_switch_input_immediate_summary">切换键盘按钮的行为</string>
|
||||
<string name="pref_vibrate_title">振动</string>
|
||||
<string name="pref_vibrate_summary">启用或者禁用按下按键时振动</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_category_style">样式</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">非常长</string>
|
||||
<string name="pref_key_horizontal_space">按键的左右边距</string>
|
||||
<string name="pref_key_vertical_space">按键的上下边距</string>
|
||||
<string name="pref_vibration_e_disabled">禁用</string>
|
||||
<string name="pref_vibration_e_system">使用系统振动强度</string>
|
||||
<string name="pref_vibration_e_strong">强</string>
|
||||
<string name="pref_vibration_e_medium">中</string>
|
||||
<string name="pref_vibration_e_light">弱</string>
|
||||
<string name="key_action_next">下一项</string>
|
||||
<string name="key_action_done">完成</string>
|
||||
<string name="key_action_go">前往</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">启用键盘后,可以在这里测试效果:</string>
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
|
||||
@@ -54,18 +54,4 @@
|
||||
<item>25</item>
|
||||
<item>35</item>
|
||||
</string-array>
|
||||
<string-array name="pref_vibration_entries">
|
||||
<item>@string/pref_vibration_e_disabled</item>
|
||||
<item>@string/pref_vibration_e_system</item>
|
||||
<item>@string/pref_vibration_e_strong</item>
|
||||
<item>@string/pref_vibration_e_medium</item>
|
||||
<item>@string/pref_vibration_e_light</item>
|
||||
</string-array>
|
||||
<string-array name="pref_vibration_values">
|
||||
<item>disabled</item>
|
||||
<item>system</item>
|
||||
<item>strong</item>
|
||||
<item>medium</item>
|
||||
<item>light</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<item>latn_colemak</item>
|
||||
<item>latn_dvorak</item>
|
||||
<item>arab_alt</item>
|
||||
<item>arab_hamvaj_tly</item>
|
||||
<item>arab_pc</item>
|
||||
<item>arab_pc_ckb</item>
|
||||
<item>arab_pc_hindu</item>
|
||||
@@ -37,6 +38,7 @@
|
||||
<item>latn_qwerty_pl</item>
|
||||
<item>latn_qwerty_ro</item>
|
||||
<item>latn_qwerty_se</item>
|
||||
<item>latn_qwerty_tly</item>
|
||||
<item>latn_qwerty_tr</item>
|
||||
<item>latn_qwerty_vi</item>
|
||||
<item>latn_qwertz</item>
|
||||
@@ -55,6 +57,7 @@
|
||||
<item>Colemak</item>
|
||||
<item>Dvorak</item>
|
||||
<item>Arabic Alt</item>
|
||||
<item>Talysh (تالشی همواج)</item>
|
||||
<item>Arabic PC</item>
|
||||
<item>Kurdish (کوردی)</item>
|
||||
<item>Arabic PC (Hindu numerals)</item>
|
||||
@@ -85,6 +88,7 @@
|
||||
<item>QWERTY (Polski)</item>
|
||||
<item>QWERTY (Română)</item>
|
||||
<item>QWERTY (Swedish)</item>
|
||||
<item>QWERTY (Talysh New Latin)</item>
|
||||
<item>QWERTY (Türkçe)</item>
|
||||
<item>QWERTY (Vietnamese)</item>
|
||||
<item>QWERTZ</item>
|
||||
@@ -103,6 +107,7 @@
|
||||
<item>@xml/latn_colemak</item>
|
||||
<item>@xml/latn_dvorak</item>
|
||||
<item>@xml/arab_alt</item>
|
||||
<item>@xml/arab_hamvaj_tly</item>
|
||||
<item>@xml/arab_pc</item>
|
||||
<item>@xml/arab_pc_ckb</item>
|
||||
<item>@xml/arab_pc_hindu</item>
|
||||
@@ -133,6 +138,7 @@
|
||||
<item>@xml/latn_qwerty_pl</item>
|
||||
<item>@xml/latn_qwerty_ro</item>
|
||||
<item>@xml/latn_qwerty_se</item>
|
||||
<item>@xml/latn_qwerty_tly</item>
|
||||
<item>@xml/latn_qwerty_tr</item>
|
||||
<item>@xml/latn_qwerty_vi</item>
|
||||
<item>@xml/latn_qwertz</item>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Press Shift at the beginning of a sentence</string>
|
||||
<string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string>
|
||||
<string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string>
|
||||
<string name="pref_vibrate_title">Vibration</string>
|
||||
<string name="pref_vibrate_summary">Enable/disable vibration on keypress</string>
|
||||
<string name="pref_vibrate_custom">Custom vibration</string>
|
||||
<string name="pref_vibrate_duration_title">Vibration intensity</string>
|
||||
<string name="pref_pin_entry_enabled_title">Pin entry layout</string>
|
||||
<string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string>
|
||||
<string name="pref_category_style">Style</string>
|
||||
@@ -69,11 +69,6 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Very far</string>
|
||||
<string name="pref_key_horizontal_space">Horizontal spacing between the keys</string>
|
||||
<string name="pref_key_vertical_space">Vertical spacing between the keys</string>
|
||||
<string name="pref_vibration_e_disabled">Disabled</string>
|
||||
<string name="pref_vibration_e_system">System</string>
|
||||
<string name="pref_vibration_e_strong">Strong</string>
|
||||
<string name="pref_vibration_e_medium">Medium</string>
|
||||
<string name="pref_vibration_e_light">Light</string>
|
||||
<string name="key_action_next">Next</string>
|
||||
<string name="key_action_done">Done</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -87,6 +82,7 @@
|
||||
<string name="launcher_tryhere">After enabling, you can try the keyboard here:</string>
|
||||
<string name="key_descr_capslock">Caps lock</string>
|
||||
<string name="key_descr_switch_greekmath">Greek & math symbols</string>
|
||||
<string name="key_descr_change_method">Switch keyboard</string>
|
||||
<string name="key_descr_voice_typing">Voice typing</string>
|
||||
<string name="key_descr_copy">Copy</string>
|
||||
<string name="key_descr_paste">Paste</string>
|
||||
|
||||
@@ -22,4 +22,5 @@
|
||||
<item name="android:layout_marginHorizontal">16dp</item>
|
||||
<item name="android:layout_gravity">center</item>
|
||||
</style>
|
||||
<style name="appTheme" parent="@android:style/Theme.DeviceDefault.DayNight"/>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<row height="0.95">
|
||||
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.1" key0="fn" key1="loc alt" key2="change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key width="1.1" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>
|
||||
<key width="1.7" key0="enter" key1="loc voice_typing" key2="action"/>
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
<subtype android:label="%s" android:languageTag="sk" android:imeSubtypeLocale="sk_SK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sk,extra_keys=accent_caron:ě:ř:ž:š:č:ň:ď:ľ:ť|accent_ring:ů|accent_circonflexe:ô|accent_trema:ä:ü:ö|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý"/>
|
||||
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_se,extra_keys=accent_aigu:á|accent_trema:ä:ö|accent_ring:å|€"/>
|
||||
<subtype android:label="%s" android:languageTag="tr" android:imeSubtypeLocale="tr_TR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tr,extra_keys=accent_cedille:ç:ş|accent_trema:ö:ü|accent_circonflexe:â:î:û|₺|ı|ğ"/>
|
||||
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_AZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tly,extra_keys=á|ú|â|ê|ı|š|ž"/>
|
||||
<subtype android:label="%s" android:languageTag="uk" android:imeSubtypeLocale="uk_UA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_jcuken_uk,extra_keys=ґ|є|і|ї|₴"/>
|
||||
<subtype android:label="%s" android:languageTag="vi" android:imeSubtypeLocale="vi_VN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_vi"/>
|
||||
</input-method>
|
||||
|
||||
+20
-19
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<PreferenceCategory android:title="@string/pref_category_layout">
|
||||
<juloo.keyboard2.LayoutsPreference/>
|
||||
<juloo.keyboard2.prefs.LayoutsPreference/>
|
||||
<PreferenceScreen android:title="@string/pref_extra_keys_title">
|
||||
<PreferenceCategory android:title="@string/pref_extra_keys_custom">
|
||||
<juloo.keyboard2.CustomExtraKeysPreference/>
|
||||
<juloo.keyboard2.prefs.CustomExtraKeysPreference/>
|
||||
</PreferenceCategory>
|
||||
<juloo.keyboard2.ExtraKeysPreference android:title="@string/pref_extra_keys_internal"/>
|
||||
<juloo.keyboard2.prefs.ExtraKeysPreference android:title="@string/pref_extra_keys_internal"/>
|
||||
</PreferenceScreen>
|
||||
<CheckBoxPreference android:key="number_row" android:title="@string/pref_number_row_title" android:summary="@string/pref_number_row_summary" android:defaultValue="false"/>
|
||||
<ListPreference android:key="show_numpad" android:title="@string/pref_show_numpad_title" android:summary="%s" android:defaultValue="1" android:entries="@array/pref_show_numpad_entries" android:entryValues="@array/pref_show_numpad_values"/>
|
||||
@@ -14,36 +14,37 @@
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_typing">
|
||||
<ListPreference android:key="swipe_dist" android:title="@string/pref_swipe_dist_title" android:summary="@string/pref_swipe_dist_summary" android:defaultValue="15" android:entries="@array/pref_swipe_dist_entries" android:entryValues="@array/pref_swipe_dist_values"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="longpress_timeout" android:title="@string/pref_long_timeout_title" android:summary="%sms" android:defaultValue="600" min="50" max="2000"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="longpress_interval" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="longpress_timeout" android:title="@string/pref_long_timeout_title" android:summary="%sms" android:defaultValue="600" min="50" max="2000"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="longpress_interval" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/>
|
||||
<CheckBoxPreference android:key="lock_double_tap" android:title="@string/pref_lock_double_tap_title" android:summary="@string/pref_lock_double_tap_summary" android:defaultValue="false"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_behavior">
|
||||
<CheckBoxPreference android:key="autocapitalisation" android:title="@string/pref_autocapitalisation_title" android:summary="@string/pref_autocapitalisation_summary" android:defaultValue="true"/>
|
||||
<CheckBoxPreference android:key="switch_input_immediate" android:title="@string/pref_switch_input_immediate_title" android:summary="@string/pref_switch_input_immediate_summary" android:defaultValue="false"/>
|
||||
<ListPreference android:key="vibration_behavior" android:title="@string/pref_vibrate_title" android:summary="@string/pref_vibrate_summary" android:defaultValue="system" android:entries="@array/pref_vibration_entries" android:entryValues="@array/pref_vibration_values"/>
|
||||
<CheckBoxPreference android:key="vibrate_custom" android:title="@string/pref_vibrate_custom" android:defaultValue="false"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:dependency="vibrate_custom" android:key="vibrate_duration" android:title="@string/pref_vibrate_duration_title" android:summary="%sms" android:defaultValue="20" min="0" max="100"/>
|
||||
<CheckBoxPreference android:key="pin_entry_enabled" android:title="@string/pref_pin_entry_enabled_title" android:summary="@string/pref_pin_entry_enabled_summary" android:defaultValue="true"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_style">
|
||||
<ListPreference android:key="theme" android:title="@string/pref_theme" android:summary="%s" android:defaultValue="system" android:entries="@array/pref_theme_entries" android:entryValues="@array/pref_theme_values"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="label_brightness" android:title="@string/pref_label_brightness" android:summary="%s%%" android:defaultValue="100" min="50" max="100"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="keyboard_opacity" android:title="@string/pref_keyboard_opacity" android:summary="%s%%" android:defaultValue="100" min="0" max="100"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="key_opacity" android:title="@string/pref_key_opacity" android:summary="%s%%" android:defaultValue="100" min="0" max="100"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="key_activated_opacity" android:title="@string/pref_key_activated_opacity" android:summary="%s%%" android:defaultValue="100" min="0" max="100"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="label_brightness" android:title="@string/pref_label_brightness" android:summary="%s%%" android:defaultValue="100" min="50" max="100"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_opacity" android:title="@string/pref_keyboard_opacity" android:summary="%s%%" android:defaultValue="100" min="0" max="100"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="key_opacity" android:title="@string/pref_key_opacity" android:summary="%s%%" android:defaultValue="100" min="0" max="100"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="key_activated_opacity" android:title="@string/pref_key_activated_opacity" android:summary="%s%%" android:defaultValue="100" min="0" max="100"/>
|
||||
<PreferenceScreen android:title="@string/pref_margin_bottom_title">
|
||||
<juloo.common.IntSlideBarPreference android:key="margin_bottom_portrait" android:title="@string/pref_portrait" android:summary="%sdp" android:defaultValue="7" min="0" max="100"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="margin_bottom_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="3" min="0" max="100"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="margin_bottom_portrait" android:title="@string/pref_portrait" android:summary="%sdp" android:defaultValue="7" min="0" max="100"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="margin_bottom_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="3" min="0" max="100"/>
|
||||
</PreferenceScreen>
|
||||
<PreferenceScreen android:title="@string/pref_keyboard_height_title">
|
||||
<juloo.common.IntSlideBarPreference android:key="keyboard_height" android:title="@string/pref_portrait" android:summary="%s%%" android:defaultValue="35" min="10" max="50"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="keyboard_height_landscape" android:title="@string/pref_landscape" android:summary="%s%%" android:defaultValue="50" min="20" max="65"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height" android:title="@string/pref_portrait" android:summary="%s%%" android:defaultValue="35" min="10" max="50"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height_landscape" android:title="@string/pref_landscape" android:summary="%s%%" android:defaultValue="50" min="20" max="65"/>
|
||||
</PreferenceScreen>
|
||||
<PreferenceScreen android:title="@string/pref_horizontal_margin_title">
|
||||
<juloo.common.IntSlideBarPreference android:key="horizontal_margin_portrait" android:title="@string/pref_portrait" android:summary="%sdp" android:defaultValue="3" min="0" max="30"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="horizontal_margin_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="28" min="0" max="200"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_portrait" android:title="@string/pref_portrait" android:summary="%sdp" android:defaultValue="3" min="0" max="30"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="28" min="0" max="200"/>
|
||||
</PreferenceScreen>
|
||||
<juloo.common.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.0" min="0.75" max="1.5"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="key_vertical_space" android:title="@string/pref_key_vertical_space" android:summary="%sdp" android:defaultValue="2" min="0" max="8"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="key_horizontal_space" android:title="@string/pref_key_horizontal_space" android:summary="%sdp" android:defaultValue="2" min="0" max="8"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.0" min="0.75" max="1.5"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_vertical_margin" android:title="@string/pref_key_vertical_space" android:summary="%s%%" android:defaultValue="1.5" min="0" max="5"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_horizontal_margin" android:title="@string/pref_key_horizontal_space" android:summary="%s%%" android:defaultValue="2" min="0" max="5"/>
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
||||
@@ -8,7 +8,7 @@ import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputConnection;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
final class Autocapitalisation
|
||||
public final class Autocapitalisation
|
||||
{
|
||||
boolean _enabled = false;
|
||||
boolean _should_enable_shift = false;
|
||||
|
||||
@@ -14,8 +14,11 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import juloo.keyboard2.prefs.CustomExtraKeysPreference;
|
||||
import juloo.keyboard2.prefs.ExtraKeysPreference;
|
||||
import juloo.keyboard2.prefs.LayoutsPreference;
|
||||
|
||||
final class Config
|
||||
public final class Config
|
||||
{
|
||||
private final SharedPreferences _prefs;
|
||||
|
||||
@@ -35,14 +38,17 @@ final class Config
|
||||
public boolean number_row;
|
||||
public float swipe_dist_px;
|
||||
public float slide_step_px;
|
||||
public VibratorCompat.VibrationBehavior vibration_behavior;
|
||||
// Let the system handle vibration when false.
|
||||
public boolean vibrate_custom;
|
||||
// Control the vibration if [vibrate_custom] is true.
|
||||
public long vibrate_duration;
|
||||
public long longPressTimeout;
|
||||
public long longPressInterval;
|
||||
public float margin_bottom;
|
||||
public float keyHeight;
|
||||
public float horizontal_margin;
|
||||
public float keyVerticalInterval;
|
||||
public float keyHorizontalInterval;
|
||||
public float key_vertical_margin;
|
||||
public float key_horizontal_margin;
|
||||
public int labelBrightness; // 0 - 255
|
||||
public int keyboardOpacity; // 0 - 255
|
||||
public int keyOpacity; // 0 - 255
|
||||
@@ -55,7 +61,6 @@ final class Config
|
||||
public boolean pin_entry_enabled;
|
||||
|
||||
// Dynamically set
|
||||
public boolean shouldOfferSwitchingToNextInputMethod;
|
||||
public boolean shouldOfferVoiceTyping;
|
||||
public String actionLabel; // Might be 'null'
|
||||
public int actionId; // Meaningful only when 'actionLabel' isn't 'null'
|
||||
@@ -82,7 +87,6 @@ final class Config
|
||||
// from prefs
|
||||
refresh(res);
|
||||
// initialized later
|
||||
shouldOfferSwitchingToNextInputMethod = false;
|
||||
shouldOfferVoiceTyping = false;
|
||||
actionLabel = null;
|
||||
actionId = 0;
|
||||
@@ -101,8 +105,6 @@ final class Config
|
||||
// The height of the keyboard is relative to the height of the screen.
|
||||
// This is the height of the keyboard if it have 4 rows.
|
||||
int keyboardHeightPercent;
|
||||
// Scale some dimensions depending on orientation
|
||||
float horizontalIntervalScale = 1.f;
|
||||
float characterSizeScale = 1.f;
|
||||
String show_numpad_s = _prefs.getString("show_numpad", "never");
|
||||
show_numpad = "always".equals(show_numpad_s);
|
||||
@@ -111,7 +113,6 @@ final class Config
|
||||
if ("landscape".equals(show_numpad_s))
|
||||
show_numpad = true;
|
||||
keyboardHeightPercent = _prefs.getInt("keyboard_height_landscape", 50);
|
||||
horizontalIntervalScale = 2.f;
|
||||
characterSizeScale = 1.25f;
|
||||
}
|
||||
else
|
||||
@@ -130,21 +131,21 @@ final class Config
|
||||
float swipe_dist_value = Float.valueOf(_prefs.getString("swipe_dist", "15"));
|
||||
swipe_dist_px = swipe_dist_value / 25.f * swipe_scaling;
|
||||
slide_step_px = swipe_dist_px / 4.f;
|
||||
vibration_behavior =
|
||||
VibratorCompat.VibrationBehavior.of_string(_prefs.getString("vibration_behavior", "system"));
|
||||
vibrate_custom = _prefs.getBoolean("vibrate_custom", false);
|
||||
vibrate_duration = _prefs.getInt("vibrate_duration", 20);
|
||||
longPressTimeout = _prefs.getInt("longpress_timeout", 600);
|
||||
longPressInterval = _prefs.getInt("longpress_interval", 65);
|
||||
margin_bottom = get_dip_pref_oriented(dm, "margin_bottom", 7, 3);
|
||||
keyVerticalInterval = get_dip_pref(dm, "key_vertical_space", 2);
|
||||
keyHorizontalInterval = get_dip_pref(dm, "key_horizontal_space", 2) * horizontalIntervalScale;
|
||||
key_vertical_margin = get_dip_pref(dm, "key_vertical_margin", 1.5f) / 100;
|
||||
key_horizontal_margin = get_dip_pref(dm, "key_horizontal_margin", 2) / 100;
|
||||
// Label brightness is used as the alpha channel
|
||||
labelBrightness = _prefs.getInt("label_brightness", 100) * 255 / 100;
|
||||
// Keyboard opacity
|
||||
keyboardOpacity = _prefs.getInt("keyboard_opacity", 100) * 255 / 100;
|
||||
keyOpacity = _prefs.getInt("key_opacity", 100) * 255 / 100;
|
||||
keyActivatedOpacity = _prefs.getInt("key_activated_opacity", 100) * 255 / 100;
|
||||
// Do not substract keyVerticalInterval from keyHeight because this is done
|
||||
// during rendered.
|
||||
// Do not substract key_vertical_margin from keyHeight because this is done
|
||||
// during rendering.
|
||||
keyHeight = dm.heightPixels * keyboardHeightPercent / 100 / 4;
|
||||
horizontal_margin =
|
||||
get_dip_pref_oriented(dm, "horizontal_margin", 3, 28);
|
||||
@@ -231,9 +232,7 @@ final class Config
|
||||
case Event:
|
||||
switch (key.getEvent())
|
||||
{
|
||||
case CHANGE_METHOD:
|
||||
if (!shouldOfferSwitchingToNextInputMethod)
|
||||
return null;
|
||||
case CHANGE_METHOD_PICKER:
|
||||
if (switch_input_immediate)
|
||||
return KeyValue.getKeyByName("change_method_prev");
|
||||
return key;
|
||||
@@ -398,7 +397,8 @@ final class Config
|
||||
public static interface IKeyEventHandler
|
||||
{
|
||||
public void key_down(KeyValue value, boolean is_swipe);
|
||||
public void key_up(KeyValue value, Pointers.Modifiers flags);
|
||||
public void key_up(KeyValue value, Pointers.Modifiers mods);
|
||||
public void mods_changed(Pointers.Modifiers mods);
|
||||
}
|
||||
|
||||
/** Config migrations. */
|
||||
@@ -427,7 +427,7 @@ final class Config
|
||||
l.add(migrate_layout(snd_layout));
|
||||
String custom_layout = prefs.getString("custom_layout", "");
|
||||
if (custom_layout != null && !custom_layout.equals(""))
|
||||
l.add(new LayoutsPreference.CustomLayout(custom_layout));
|
||||
l.add(LayoutsPreference.CustomLayout.parse(custom_layout));
|
||||
LayoutsPreference.save_to_preferences(e, l);
|
||||
case 1:
|
||||
default: break;
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
public class EmojiBottomRow extends Keyboard2View
|
||||
{
|
||||
public EmojiBottomRow(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
KeyboardData kw = KeyboardData.load(getResources(), R.xml.emoji_bottom_row);
|
||||
setKeyboard(kw);
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
class ExtraKeys
|
||||
public final class ExtraKeys
|
||||
{
|
||||
public static final ExtraKeys EMPTY = new ExtraKeys(Collections.EMPTY_LIST);
|
||||
|
||||
|
||||
@@ -1,28 +1,47 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.os.Looper;
|
||||
import android.text.InputType;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.ExtractedText;
|
||||
import android.view.inputmethod.ExtractedTextRequest;
|
||||
import android.view.inputmethod.InputConnection;
|
||||
import java.util.Iterator;
|
||||
|
||||
class KeyEventHandler implements Config.IKeyEventHandler
|
||||
public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
{
|
||||
IReceiver _recv;
|
||||
Autocapitalisation _autocap;
|
||||
/** State of the system modifiers. It is updated whether a modifier is down
|
||||
or up and a corresponding key event is sent. */
|
||||
Pointers.Modifiers _mods;
|
||||
/** Consistent with [_mods]. This is a mutable state rather than computed
|
||||
from [_mods] to ensure that the meta state is correct while up and down
|
||||
events are sent for the modifier keys. */
|
||||
int _meta_state = 0;
|
||||
/** Whether to force sending arrow keys to move the cursor when
|
||||
[setSelection] could be used instead. */
|
||||
boolean _move_cursor_force_fallback = false;
|
||||
|
||||
public KeyEventHandler(Looper looper, IReceiver recv)
|
||||
{
|
||||
_recv = recv;
|
||||
_autocap = new Autocapitalisation(looper,
|
||||
this.new Autocapitalisation_callback());
|
||||
_mods = Pointers.Modifiers.EMPTY;
|
||||
}
|
||||
|
||||
/** Editing just started. */
|
||||
public void started(EditorInfo info)
|
||||
{
|
||||
_autocap.started(info, _recv.getCurrentInputConnection());
|
||||
// Workaround a bug in Acode, which answers to [getExtractedText] but do
|
||||
// not react to [setSelection] while returning [true].
|
||||
// Note: Using & to workaround a bug in Acode, which sets several
|
||||
// variations at once.
|
||||
_move_cursor_force_fallback = (info.inputType & InputType.TYPE_MASK_VARIATION &
|
||||
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0;
|
||||
}
|
||||
|
||||
/** Selection has been updated. */
|
||||
@@ -33,6 +52,7 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
|
||||
/** A key is being pressed. There will not necessarily be a corresponding
|
||||
[key_up] event. */
|
||||
@Override
|
||||
public void key_down(KeyValue key, boolean isSwipe)
|
||||
{
|
||||
if (key == null)
|
||||
@@ -55,19 +75,44 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
}
|
||||
|
||||
/** A key has been released. */
|
||||
@Override
|
||||
public void key_up(KeyValue key, Pointers.Modifiers mods)
|
||||
{
|
||||
if (key == null)
|
||||
return;
|
||||
Pointers.Modifiers old_mods = _mods;
|
||||
update_meta_state(mods);
|
||||
switch (key.getKind())
|
||||
{
|
||||
case Char: send_text(String.valueOf(key.getChar())); break;
|
||||
case String: send_text(key.getString()); break;
|
||||
case Event: _recv.handle_event_key(key.getEvent()); break;
|
||||
case Keyevent: send_key_down_up(key.getKeyevent(), mods); break;
|
||||
case Keyevent: send_key_down_up(key.getKeyevent()); break;
|
||||
case Modifier: break;
|
||||
case Editing: handle_editing_key(key.getEditing(), mods); break;
|
||||
case Editing: handle_editing_key(key.getEditing()); break;
|
||||
}
|
||||
update_meta_state(old_mods);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mods_changed(Pointers.Modifiers mods)
|
||||
{
|
||||
update_meta_state(mods);
|
||||
}
|
||||
|
||||
/** Update [_mods] to be consistent with the [mods], sending key events if
|
||||
needed. */
|
||||
void update_meta_state(Pointers.Modifiers mods)
|
||||
{
|
||||
// Released modifiers
|
||||
Iterator<KeyValue.Modifier> it = _mods.diff(mods);
|
||||
while (it.hasNext())
|
||||
sendMetaKeyForModifier(it.next(), false);
|
||||
// Activated modifiers
|
||||
it = mods.diff(_mods);
|
||||
while (it.hasNext())
|
||||
sendMetaKeyForModifier(it.next(), true);
|
||||
_mods = mods;
|
||||
}
|
||||
|
||||
// private void handleDelKey(int before, int after)
|
||||
@@ -80,54 +125,58 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
// getCurrentInputConnection().deleteSurroundingText(before, after);
|
||||
// }
|
||||
|
||||
int sendMetaKey(int eventCode, int metaFlags, int metaState, boolean down)
|
||||
void sendMetaKey(int eventCode, int meta_flags, boolean down)
|
||||
{
|
||||
int action;
|
||||
int updatedMetaState;
|
||||
if (down) { action = KeyEvent.ACTION_DOWN; updatedMetaState = metaState | metaFlags; }
|
||||
else { action = KeyEvent.ACTION_UP; updatedMetaState = metaState & ~metaFlags; }
|
||||
send_keyevent(action, eventCode, metaState);
|
||||
return updatedMetaState;
|
||||
if (down)
|
||||
{
|
||||
_meta_state = _meta_state | meta_flags;
|
||||
send_keyevent(KeyEvent.ACTION_DOWN, eventCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
send_keyevent(KeyEvent.ACTION_UP, eventCode);
|
||||
_meta_state = _meta_state & ~meta_flags;
|
||||
}
|
||||
}
|
||||
|
||||
int sendMetaKeyForModifier(KeyValue.Modifier mod, int metaState, boolean down)
|
||||
void sendMetaKeyForModifier(KeyValue.Modifier mod, boolean down)
|
||||
{
|
||||
switch (mod)
|
||||
{
|
||||
case CTRL:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down);
|
||||
sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, down);
|
||||
break;
|
||||
case ALT:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down);
|
||||
sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, down);
|
||||
break;
|
||||
case SHIFT:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down);
|
||||
sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, down);
|
||||
break;
|
||||
case META:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, metaState, down);
|
||||
default: return metaState;
|
||||
sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, down);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't set KeyEvent.FLAG_SOFT_KEYBOARD.
|
||||
*/
|
||||
void send_key_down_up(int keyCode, Pointers.Modifiers mods)
|
||||
void send_key_down_up(int keyCode)
|
||||
{
|
||||
int metaState = 0;
|
||||
for (int i = 0; i < mods.size(); i++)
|
||||
metaState = sendMetaKeyForModifier(mods.get(i), metaState, true);
|
||||
send_keyevent(KeyEvent.ACTION_DOWN, keyCode, metaState);
|
||||
send_keyevent(KeyEvent.ACTION_UP, keyCode, metaState);
|
||||
for (int i = mods.size() - 1; i >= 0; i--)
|
||||
metaState = sendMetaKeyForModifier(mods.get(i), metaState, false);
|
||||
send_keyevent(KeyEvent.ACTION_DOWN, keyCode);
|
||||
send_keyevent(KeyEvent.ACTION_UP, keyCode);
|
||||
}
|
||||
|
||||
void send_keyevent(int eventAction, int eventCode, int meta)
|
||||
void send_keyevent(int eventAction, int eventCode)
|
||||
{
|
||||
InputConnection conn = _recv.getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, meta));
|
||||
conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, _meta_state));
|
||||
if (eventAction == KeyEvent.ACTION_UP)
|
||||
_autocap.event_sent(eventCode, meta);
|
||||
_autocap.event_sent(eventCode, _meta_state);
|
||||
}
|
||||
|
||||
void send_text(CharSequence text)
|
||||
@@ -148,7 +197,7 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
conn.performContextMenuAction(id);
|
||||
}
|
||||
|
||||
void handle_editing_key(KeyValue.Editing ev, Pointers.Modifiers mods)
|
||||
void handle_editing_key(KeyValue.Editing ev)
|
||||
{
|
||||
switch (ev)
|
||||
{
|
||||
@@ -163,8 +212,8 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
case REPLACE: send_context_menu_action(android.R.id.replaceText); break;
|
||||
case ASSIST: send_context_menu_action(android.R.id.textAssist); break;
|
||||
case AUTOFILL: send_context_menu_action(android.R.id.autofill); break;
|
||||
case CURSOR_LEFT: move_cursor(-1, mods); break;
|
||||
case CURSOR_RIGHT: move_cursor(1, mods); break;
|
||||
case CURSOR_LEFT: move_cursor(-1); break;
|
||||
case CURSOR_RIGHT: move_cursor(1); break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -186,19 +235,20 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
Unlike arrow keys, the selection is not removed even if shift is not on.
|
||||
Falls back to sending arrow keys events if the editor do not support
|
||||
moving the cursor or a modifier other than shift is pressed. */
|
||||
void move_cursor(int d, Pointers.Modifiers mods)
|
||||
void move_cursor(int d)
|
||||
{
|
||||
InputConnection conn = _recv.getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
ExtractedText et = get_cursor_pos(conn);
|
||||
// Fallback to sending key events
|
||||
if (et == null
|
||||
|| mods.has(KeyValue.Modifier.CTRL)
|
||||
|| mods.has(KeyValue.Modifier.ALT)
|
||||
|| mods.has(KeyValue.Modifier.META))
|
||||
if (_move_cursor_force_fallback
|
||||
|| et == null
|
||||
|| _mods.has(KeyValue.Modifier.CTRL)
|
||||
|| _mods.has(KeyValue.Modifier.ALT)
|
||||
|| _mods.has(KeyValue.Modifier.META))
|
||||
{
|
||||
move_cursor_fallback(d, mods);
|
||||
move_cursor_fallback(d);
|
||||
return;
|
||||
}
|
||||
int sel_start = et.selectionStart;
|
||||
@@ -214,24 +264,25 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
{
|
||||
sel_end += d;
|
||||
// Leave 'sel_start' where it is if shift is pressed
|
||||
if (!mods.has(KeyValue.Modifier.SHIFT))
|
||||
if (!_mods.has(KeyValue.Modifier.SHIFT))
|
||||
sel_start = sel_end;
|
||||
}
|
||||
conn.setSelection(sel_start, sel_end);
|
||||
if (!conn.setSelection(sel_start, sel_end))
|
||||
move_cursor_fallback(d);
|
||||
}
|
||||
|
||||
/** Send arrow keys as a fallback for editors that do not support
|
||||
[getExtractedText] like Termux. */
|
||||
void move_cursor_fallback(int d, Pointers.Modifiers mods)
|
||||
void move_cursor_fallback(int d)
|
||||
{
|
||||
while (d < 0)
|
||||
{
|
||||
send_key_down_up(KeyEvent.KEYCODE_DPAD_LEFT, mods);
|
||||
send_key_down_up(KeyEvent.KEYCODE_DPAD_LEFT);
|
||||
d++;
|
||||
}
|
||||
while (d > 0)
|
||||
{
|
||||
send_key_down_up(KeyEvent.KEYCODE_DPAD_RIGHT, mods);
|
||||
send_key_down_up(KeyEvent.KEYCODE_DPAD_RIGHT);
|
||||
d--;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.HashMap;
|
||||
|
||||
class KeyModifier
|
||||
public final class KeyModifier
|
||||
{
|
||||
/** Cache key is KeyValue's name */
|
||||
private static HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>> _cache =
|
||||
@@ -75,7 +75,7 @@ class KeyModifier
|
||||
case Event:
|
||||
switch (k.getEvent())
|
||||
{
|
||||
case CHANGE_METHOD_PREV:
|
||||
case CHANGE_METHOD_AUTO:
|
||||
return KeyValue.getKeyByName("change_method");
|
||||
case SWITCH_VOICE_TYPING:
|
||||
return KeyValue.getKeyByName("voice_typing_chooser");
|
||||
@@ -518,6 +518,8 @@ class KeyModifier
|
||||
case 'y': return "ý";
|
||||
// Combining diacritic
|
||||
case 'j':
|
||||
// Russian vowels
|
||||
case 'у': case 'е': case 'а': case 'о': case 'и':
|
||||
return c + "\u0301";
|
||||
default: return map_dead_char(c, '\u00B4');
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package juloo.keyboard2;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.HashMap;
|
||||
|
||||
final class KeyValue
|
||||
public final class KeyValue
|
||||
{
|
||||
public static enum Event
|
||||
{
|
||||
@@ -12,8 +12,8 @@ final class KeyValue
|
||||
SWITCH_NUMERIC,
|
||||
SWITCH_EMOJI,
|
||||
SWITCH_BACK_EMOJI,
|
||||
CHANGE_METHOD,
|
||||
CHANGE_METHOD_PREV,
|
||||
CHANGE_METHOD_PICKER,
|
||||
CHANGE_METHOD_AUTO,
|
||||
ACTION,
|
||||
SWITCH_FORWARD,
|
||||
SWITCH_BACKWARD,
|
||||
@@ -317,9 +317,9 @@ final class KeyValue
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
/* These symbols have special meaning when in `res/xml` and are escaped in
|
||||
standard layouts. The backslash is not stripped when parsed from the
|
||||
custom layout option. */
|
||||
/* These symbols have special meaning when in `srcs/layouts` and are
|
||||
escaped in standard layouts. The backslash is not stripped when parsed
|
||||
from the custom layout option. */
|
||||
case "\\?": return makeStringKey("?");
|
||||
case "\\#": return makeStringKey("#");
|
||||
case "\\@": return makeStringKey("@");
|
||||
@@ -365,8 +365,8 @@ final class KeyValue
|
||||
case "switch_forward": return eventKey(0xE013, Event.SWITCH_FORWARD, FLAG_SMALLER_FONT);
|
||||
case "switch_backward": return eventKey(0xE014, Event.SWITCH_BACKWARD, FLAG_SMALLER_FONT);
|
||||
case "switch_greekmath": return eventKey("πλ∇¬", Event.SWITCH_GREEKMATH, FLAG_SMALLER_FONT);
|
||||
case "change_method": return eventKey(0xE009, Event.CHANGE_METHOD, FLAG_SMALLER_FONT);
|
||||
case "change_method_prev": return eventKey(0xE009, Event.CHANGE_METHOD_PREV, FLAG_SMALLER_FONT);
|
||||
case "change_method": return eventKey(0xE009, Event.CHANGE_METHOD_PICKER, FLAG_SMALLER_FONT);
|
||||
case "change_method_prev": return eventKey(0xE009, Event.CHANGE_METHOD_AUTO, FLAG_SMALLER_FONT);
|
||||
case "action": return eventKey("Action", Event.ACTION, FLAG_SMALLER_FONT); // Will always be replaced
|
||||
case "capslock": return eventKey(0xE012, Event.CAPS_LOCK, 0);
|
||||
case "voice_typing": return eventKey(0xE015, Event.SWITCH_VOICE_TYPING, FLAG_SMALLER_FONT);
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import juloo.keyboard2.prefs.LayoutsPreference;
|
||||
|
||||
public class Keyboard2 extends InputMethodService
|
||||
implements SharedPreferences.OnSharedPreferenceChangeListener
|
||||
@@ -135,8 +136,6 @@ public class Keyboard2 extends InputMethodService
|
||||
for (InputMethodSubtype s : enabled_subtypes)
|
||||
extra_keys.add(extra_keys_of_subtype(s));
|
||||
_config.extra_keys_subtype = ExtraKeys.merge(extra_keys);
|
||||
if (enabled_subtypes.size() > 1)
|
||||
_config.shouldOfferSwitchingToNextInputMethod = true;
|
||||
}
|
||||
|
||||
InputMethodManager get_imm()
|
||||
@@ -147,10 +146,6 @@ public class Keyboard2 extends InputMethodService
|
||||
private void refreshSubtypeImm()
|
||||
{
|
||||
InputMethodManager imm = get_imm();
|
||||
if (VERSION.SDK_INT < 28)
|
||||
_config.shouldOfferSwitchingToNextInputMethod = true;
|
||||
else
|
||||
_config.shouldOfferSwitchingToNextInputMethod = shouldOfferSwitchingToNextInputMethod();
|
||||
_config.shouldOfferVoiceTyping = true;
|
||||
KeyboardData default_layout = null;
|
||||
_config.extra_keys_subtype = null;
|
||||
@@ -385,15 +380,15 @@ public class Keyboard2 extends InputMethodService
|
||||
setInputView(_keyboardView);
|
||||
break;
|
||||
|
||||
case CHANGE_METHOD:
|
||||
case CHANGE_METHOD_PICKER:
|
||||
get_imm().showInputMethodPicker();
|
||||
break;
|
||||
|
||||
case CHANGE_METHOD_PREV:
|
||||
case CHANGE_METHOD_AUTO:
|
||||
if (VERSION.SDK_INT < 28)
|
||||
get_imm().switchToLastInputMethod(getConnectionToken());
|
||||
else
|
||||
switchToPreviousInputMethod();
|
||||
switchToNextInputMethod(false);
|
||||
break;
|
||||
|
||||
case ACTION:
|
||||
|
||||
@@ -54,7 +54,12 @@ public class Keyboard2View extends View
|
||||
_pointers = new Pointers(this, _config);
|
||||
refresh_navigation_bar(context);
|
||||
setOnTouchListener(this);
|
||||
reset();
|
||||
int layout_id = (attrs == null) ? 0 :
|
||||
attrs.getAttributeResourceValue(null, "layout", 0);
|
||||
if (layout_id == 0)
|
||||
reset();
|
||||
else
|
||||
setKeyboard(KeyboardData.load(getResources(), layout_id));
|
||||
}
|
||||
|
||||
private Window getParentWindow(Context context)
|
||||
@@ -120,7 +125,6 @@ public class Keyboard2View extends View
|
||||
return; // Don't remove locked pointers
|
||||
_pointers.remove_fake_pointer(_shift_kv, _shift_key);
|
||||
}
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods)
|
||||
@@ -139,6 +143,7 @@ public class Keyboard2View extends View
|
||||
|
||||
public void onPointerDown(KeyValue k, boolean isSwipe)
|
||||
{
|
||||
updateFlags();
|
||||
_config.handler.key_down(k, isSwipe);
|
||||
invalidate();
|
||||
vibrate();
|
||||
@@ -146,17 +151,22 @@ public class Keyboard2View extends View
|
||||
|
||||
public void onPointerUp(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
// [key_up] must be called before [updateFlags]. The latter might disable
|
||||
// flags.
|
||||
_config.handler.key_up(k, mods);
|
||||
updateFlags();
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public void onPointerHold(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
_config.handler.key_up(k, mods);
|
||||
updateFlags();
|
||||
}
|
||||
|
||||
public void onPointerFlagsChanged(boolean shouldVibrate)
|
||||
{
|
||||
updateFlags();
|
||||
invalidate();
|
||||
if (shouldVibrate)
|
||||
vibrate();
|
||||
@@ -165,6 +175,7 @@ public class Keyboard2View extends View
|
||||
private void updateFlags()
|
||||
{
|
||||
_mods = _pointers.getModifiers();
|
||||
_config.handler.mods_changed(_mods);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -234,7 +245,7 @@ public class Keyboard2View extends View
|
||||
|
||||
private void vibrate()
|
||||
{
|
||||
VibratorCompat.vibrate(this, _config.vibration_behavior);
|
||||
VibratorCompat.vibrate(this, _config);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -282,23 +293,26 @@ public class Keyboard2View extends View
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas)
|
||||
{
|
||||
updateFlags();
|
||||
// Set keyboard background opacity
|
||||
getBackground().setAlpha(_config.keyboardOpacity);
|
||||
// Set keys opacity
|
||||
_theme.keyBgPaint.setAlpha(_config.keyOpacity);
|
||||
_theme.keyDownBgPaint.setAlpha(_config.keyActivatedOpacity);
|
||||
_theme.keyBorderPaint.setAlpha(_config.keyOpacity);
|
||||
float y = _config.marginTop + _config.keyVerticalInterval / 2;
|
||||
float key_vertical_margin = _config.key_vertical_margin * _config.keyHeight;
|
||||
float key_horizontal_margin = _config.key_horizontal_margin * _keyWidth;
|
||||
// Add half of the key margin on the left and on the top as it's then added
|
||||
// on the right and on the bottom of every keys.
|
||||
float y = _config.marginTop + key_vertical_margin / 2;
|
||||
for (KeyboardData.Row row : _keyboard.rows)
|
||||
{
|
||||
y += row.shift * _config.keyHeight;
|
||||
float x = _config.horizontal_margin + _config.keyHorizontalInterval / 2;
|
||||
float keyH = row.height * _config.keyHeight - _config.keyVerticalInterval;
|
||||
float x = _config.horizontal_margin + key_horizontal_margin / 2;
|
||||
float keyH = row.height * _config.keyHeight - key_vertical_margin;
|
||||
for (KeyboardData.Key k : row.keys)
|
||||
{
|
||||
x += k.shift * _keyWidth;
|
||||
float keyW = _keyWidth * k.width - _config.keyHorizontalInterval;
|
||||
float keyW = _keyWidth * k.width - key_horizontal_margin;
|
||||
boolean isKeyDown = _pointers.isKeyDown(k);
|
||||
drawKeyFrame(canvas, x, y, keyW, keyH, isKeyDown);
|
||||
if (k.keys[0] != null)
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
|
||||
class KeyboardData
|
||||
public final class KeyboardData
|
||||
{
|
||||
public final List<Row> rows;
|
||||
/** Total width of the keyboard. */
|
||||
@@ -27,6 +27,8 @@ class KeyboardData
|
||||
public final String script;
|
||||
/** Might be different from [script]. Might be null. */
|
||||
public final String numpad_script;
|
||||
/** The [name] attribute. Might be null. */
|
||||
public final String name;
|
||||
/** Position of every keys on the layout, see [getKeys()]. */
|
||||
private Map<KeyValue, KeyPos> _key_pos = null;
|
||||
|
||||
@@ -229,6 +231,7 @@ class KeyboardData
|
||||
String numpad_script = parser.getAttributeValue(null, "numpad_script");
|
||||
if (numpad_script == null)
|
||||
numpad_script = script;
|
||||
String name = parser.getAttributeValue(null, "name");
|
||||
ArrayList<Row> rows = new ArrayList<Row>();
|
||||
Modmap modmap = null;
|
||||
while (next_tag(parser))
|
||||
@@ -248,7 +251,7 @@ class KeyboardData
|
||||
float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows);
|
||||
if (add_bottom_row)
|
||||
rows.add(bottom_row.updateWidth(kw));
|
||||
return new KeyboardData(rows, kw, modmap, script, numpad_script);
|
||||
return new KeyboardData(rows, kw, modmap, script, numpad_script, name);
|
||||
}
|
||||
|
||||
private static float compute_max_width(List<Row> rows)
|
||||
@@ -266,7 +269,8 @@ class KeyboardData
|
||||
return Row.parse(parser);
|
||||
}
|
||||
|
||||
protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc, String npsc)
|
||||
protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc,
|
||||
String npsc, String name_)
|
||||
{
|
||||
float kh = 0.f;
|
||||
for (Row r : rows_)
|
||||
@@ -275,6 +279,7 @@ class KeyboardData
|
||||
modmap = mm;
|
||||
script = sc;
|
||||
numpad_script = npsc;
|
||||
name = name_;
|
||||
keysWidth = kw;
|
||||
keysHeight = kh;
|
||||
}
|
||||
@@ -282,7 +287,8 @@ class KeyboardData
|
||||
/** Copies the fields of an other keyboard, with rows changed. */
|
||||
protected KeyboardData(KeyboardData src, List<Row> rows)
|
||||
{
|
||||
this(rows, compute_max_width(rows), src.modmap, src.script, src.numpad_script);
|
||||
this(rows, compute_max_width(rows), src.modmap, src.script,
|
||||
src.numpad_script, src.name);
|
||||
}
|
||||
|
||||
public static class Row
|
||||
|
||||
@@ -25,6 +25,7 @@ public class LauncherActivity extends Activity
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.launcher_activity);
|
||||
_intro_video = (VideoView)findViewById(R.id.launcher_intro_video);
|
||||
|
||||
@@ -2,8 +2,10 @@ package juloo.keyboard2;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
/**
|
||||
* Manage pointers (fingers) on the screen and long presses.
|
||||
@@ -95,6 +97,7 @@ public final class Pointers implements Handler.Callback
|
||||
if (locked)
|
||||
ptr.flags |= KeyValue.FLAG_LOCKED;
|
||||
_ptrs.add(ptr);
|
||||
_handler.onPointerFlagsChanged(false);
|
||||
}
|
||||
|
||||
public void remove_fake_pointer(KeyValue kv, KeyboardData.Key key)
|
||||
@@ -102,6 +105,7 @@ public final class Pointers implements Handler.Callback
|
||||
Pointer ptr = getLatched(key, kv);
|
||||
if (ptr != null && (ptr.flags & KeyValue.FLAG_FAKE_PTR) != 0)
|
||||
removePtr(ptr);
|
||||
_handler.onPointerFlagsChanged(false);
|
||||
}
|
||||
|
||||
// Receiving events
|
||||
@@ -483,6 +487,12 @@ public final class Pointers implements Handler.Callback
|
||||
return (Arrays.binarySearch(_mods, 0, _size, m) >= 0);
|
||||
}
|
||||
|
||||
/** Returns the activated modifiers that are not in [m2]. */
|
||||
public Iterator<KeyValue.Modifier> diff(Modifiers m2)
|
||||
{
|
||||
return new ModifiersDiffIterator(this, m2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() { return Arrays.hashCode(_mods); }
|
||||
@Override
|
||||
@@ -514,6 +524,60 @@ public final class Pointers implements Handler.Callback
|
||||
}
|
||||
return new Modifiers(mods, size);
|
||||
}
|
||||
|
||||
/** Returns modifiers that are in [m1_] but not in [m2_]. */
|
||||
static final class ModifiersDiffIterator
|
||||
implements Iterator<KeyValue.Modifier>
|
||||
{
|
||||
Modifiers m1;
|
||||
int i1 = 0;
|
||||
Modifiers m2;
|
||||
int i2 = 0;
|
||||
|
||||
public ModifiersDiffIterator(Modifiers m1_, Modifiers m2_)
|
||||
{
|
||||
m1 = m1_;
|
||||
m2 = m2_;
|
||||
advance();
|
||||
}
|
||||
|
||||
public boolean hasNext()
|
||||
{
|
||||
return i1 < m1._size;
|
||||
}
|
||||
|
||||
public KeyValue.Modifier next()
|
||||
{
|
||||
if (i1 >= m1._size)
|
||||
throw new NoSuchElementException();
|
||||
KeyValue.Modifier m = m1._mods[i1];
|
||||
i1++;
|
||||
advance();
|
||||
return m;
|
||||
}
|
||||
|
||||
/** Advance to the next element if [i1] is not a valid element. The end
|
||||
is reached when [i1 = m1.size()]. */
|
||||
void advance()
|
||||
{
|
||||
while (i1 < m1.size())
|
||||
{
|
||||
KeyValue.Modifier m = m1._mods[i1];
|
||||
while (true)
|
||||
{
|
||||
if (i2 >= m2._size)
|
||||
return;
|
||||
int d = m.compareTo(m2._mods[i2]);
|
||||
if (d < 0)
|
||||
return;
|
||||
i2++;
|
||||
if (d == 0)
|
||||
break;
|
||||
}
|
||||
i1++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface IPointerEventHandler
|
||||
|
||||
@@ -12,7 +12,6 @@ public class SettingsActivity extends PreferenceActivity
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
detectSystemTheme();
|
||||
super.onCreate(savedInstanceState);
|
||||
// The preferences can't be read when in direct-boot mode. Avoid crashing
|
||||
// and don't allow changing the settings.
|
||||
@@ -26,18 +25,6 @@ public class SettingsActivity extends PreferenceActivity
|
||||
addPreferencesFromResource(R.xml.settings);
|
||||
}
|
||||
|
||||
/** The default theme is [Theme.DeviceDefault], which is dark. Detect if the
|
||||
system is using light theme. */
|
||||
void detectSystemTheme()
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= 14)
|
||||
{
|
||||
int ui_mode = getResources().getConfiguration().uiMode;
|
||||
if ((ui_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
|
||||
setTheme(android.R.style.Theme_DeviceDefault_Light);
|
||||
}
|
||||
}
|
||||
|
||||
void fallbackEncrypted()
|
||||
{
|
||||
// Can't communicate with the user here.
|
||||
|
||||
@@ -7,11 +7,13 @@ import android.view.WindowManager;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
class Utils
|
||||
public final class Utils
|
||||
{
|
||||
/** Turn the first letter of a string uppercase. */
|
||||
public static String capitalize_string(String s)
|
||||
{
|
||||
if (s.length() < 1)
|
||||
return s;
|
||||
// Make sure not to cut a code point in half
|
||||
int i = s.offsetByCodePoints(0, 1);
|
||||
return s.substring(0, i).toUpperCase() + s.substring(i);
|
||||
|
||||
@@ -8,32 +8,24 @@ import android.view.View;
|
||||
|
||||
public final class VibratorCompat
|
||||
{
|
||||
public static void vibrate(View v, VibrationBehavior b)
|
||||
public static void vibrate(View v, Config config)
|
||||
{
|
||||
switch (b)
|
||||
if (config.vibrate_custom)
|
||||
{
|
||||
case DISABLED:
|
||||
break;
|
||||
case SYSTEM:
|
||||
if (VERSION.SDK_INT >= 8)
|
||||
v.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP,
|
||||
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
|
||||
break;
|
||||
case STRONG:
|
||||
vibrator_vibrate(v, 90);
|
||||
break;
|
||||
case MEDIUM:
|
||||
vibrator_vibrate(v, 45);
|
||||
break;
|
||||
case LIGHT:
|
||||
vibrator_vibrate(v, 20);
|
||||
break;
|
||||
if (config.vibrate_duration > 0)
|
||||
vibrator_vibrate(v, config.vibrate_duration);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (VERSION.SDK_INT >= 8)
|
||||
v.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP,
|
||||
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
|
||||
}
|
||||
}
|
||||
|
||||
/** Use the older [Vibrator] when the newer API is not available or the user
|
||||
wants more control. */
|
||||
static void vibrator_vibrate(View v, int duration)
|
||||
static void vibrator_vibrate(View v, long duration)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -53,29 +45,4 @@ public final class VibratorCompat
|
||||
}
|
||||
return vibrator_service;
|
||||
}
|
||||
|
||||
public static enum VibrationBehavior
|
||||
{
|
||||
DISABLED,
|
||||
SYSTEM,
|
||||
STRONG,
|
||||
MEDIUM,
|
||||
LIGHT;
|
||||
|
||||
VibrationBehavior() {}
|
||||
|
||||
/** Defaults [SYSTEM] for unrecognized strings. */
|
||||
public static VibrationBehavior of_string(String s)
|
||||
{
|
||||
switch (s)
|
||||
{
|
||||
case "disabled": return DISABLED;
|
||||
case "system": return SYSTEM;
|
||||
case "strong": return STRONG;
|
||||
case "medium": return MEDIUM;
|
||||
case "light": return LIGHT;
|
||||
default: return SYSTEM;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
package juloo.keyboard2;
|
||||
package juloo.keyboard2.prefs;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
@@ -13,6 +13,7 @@ import android.widget.EditText;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import juloo.keyboard2.*;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
|
||||
+5
-1
@@ -1,4 +1,4 @@
|
||||
package juloo.keyboard2;
|
||||
package juloo.keyboard2.prefs;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
@@ -11,6 +11,7 @@ import android.widget.TextView;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import juloo.keyboard2.*;
|
||||
|
||||
/** This class implements the "extra keys" preference but also defines the
|
||||
possible extra keys. */
|
||||
@@ -52,6 +53,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
"home",
|
||||
"end",
|
||||
"switch_greekmath",
|
||||
"change_method",
|
||||
"capslock",
|
||||
"copy",
|
||||
"paste",
|
||||
@@ -71,6 +73,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
switch (name)
|
||||
{
|
||||
case "voice_typing":
|
||||
case "change_method":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@@ -85,6 +88,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
{
|
||||
case "capslock": id = R.string.key_descr_capslock; break;
|
||||
case "switch_greekmath": id = R.string.key_descr_switch_greekmath; break;
|
||||
case "change_method": id = R.string.key_descr_change_method; break;
|
||||
case "voice_typing": id = R.string.key_descr_voice_typing; break;
|
||||
case "copy": id = R.string.key_descr_copy; break;
|
||||
case "paste": id = R.string.key_descr_paste; break;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package juloo.common;
|
||||
package juloo.keyboard2.prefs;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
+30
-12
@@ -1,4 +1,4 @@
|
||||
package juloo.keyboard2;
|
||||
package juloo.keyboard2.prefs;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
@@ -12,6 +12,7 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import juloo.keyboard2.*;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
@@ -67,7 +68,7 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
if (l instanceof NamedLayout)
|
||||
layouts.add(layout_of_string(res, ((NamedLayout)l).name));
|
||||
else if (l instanceof CustomLayout)
|
||||
layouts.add(KeyboardData.load_string(((CustomLayout)l).xml));
|
||||
layouts.add(((CustomLayout)l).parsed);
|
||||
else // instanceof SystemLayout
|
||||
layouts.add(null);
|
||||
}
|
||||
@@ -106,7 +107,15 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
return value_i < 0 ? lname : _layout_display_names[value_i];
|
||||
}
|
||||
else if (l instanceof CustomLayout)
|
||||
return getContext().getString(R.string.pref_layout_e_custom);
|
||||
{
|
||||
// Use the layout's name if possible
|
||||
CustomLayout cl = (CustomLayout)l;
|
||||
if (cl.parsed != null && cl.parsed.name != null
|
||||
&& !cl.parsed.name.equals(""))
|
||||
return cl.parsed.name;
|
||||
else
|
||||
return getContext().getString(R.string.pref_layout_e_custom);
|
||||
}
|
||||
else // instanceof SystemLayout
|
||||
return getContext().getString(R.string.pref_layout_e_system);
|
||||
}
|
||||
@@ -175,7 +184,7 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
if (text == null)
|
||||
callback.select(null);
|
||||
else
|
||||
callback.select(new CustomLayout(text));
|
||||
callback.select(CustomLayout.parse(text));
|
||||
}
|
||||
|
||||
public String validate(String text)
|
||||
@@ -229,30 +238,39 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
|
||||
/** A layout selected by the user. The only implementations are
|
||||
[NamedLayout], [SystemLayout] and [CustomLayout]. */
|
||||
interface Layout {}
|
||||
public interface Layout {}
|
||||
|
||||
static final class SystemLayout implements Layout
|
||||
public static final class SystemLayout implements Layout
|
||||
{
|
||||
public SystemLayout() {}
|
||||
}
|
||||
|
||||
/** The name of a layout defined in [res/xml]. */
|
||||
static final class NamedLayout implements Layout
|
||||
/** The name of a layout defined in [srcs/layouts]. */
|
||||
public static final class NamedLayout implements Layout
|
||||
{
|
||||
public final String name;
|
||||
public NamedLayout(String n) { name = n; }
|
||||
}
|
||||
|
||||
/** The XML description of a custom layout. */
|
||||
static final class CustomLayout implements Layout
|
||||
public static final class CustomLayout implements Layout
|
||||
{
|
||||
public final String xml;
|
||||
public CustomLayout(String c) { xml = c; }
|
||||
/** Might be null. */
|
||||
public final KeyboardData parsed;
|
||||
public CustomLayout(String xml_, KeyboardData k) { xml = xml_; parsed = k; }
|
||||
public static CustomLayout parse(String xml)
|
||||
{
|
||||
KeyboardData parsed = null;
|
||||
try { parsed = KeyboardData.load_string_exn(xml); }
|
||||
catch (Exception e) {}
|
||||
return new CustomLayout(xml, parsed);
|
||||
}
|
||||
}
|
||||
|
||||
/** Named layouts are serialized to strings and custom layouts to JSON
|
||||
objects with a [kind] field. */
|
||||
static class Serializer implements ListGroupPreference.Serializer<Layout>
|
||||
public static class Serializer implements ListGroupPreference.Serializer<Layout>
|
||||
{
|
||||
public Layout load_item(Object obj) throws JSONException
|
||||
{
|
||||
@@ -266,7 +284,7 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
JSONObject obj_ = (JSONObject)obj;
|
||||
switch (obj_.getString("kind"))
|
||||
{
|
||||
case "custom": return new CustomLayout(obj_.getString("xml"));
|
||||
case "custom": return CustomLayout.parse(obj_.getString("xml"));
|
||||
case "system": default: return new SystemLayout();
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
package juloo.keyboard2;
|
||||
package juloo.keyboard2.prefs;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
@@ -9,6 +9,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import juloo.keyboard2.*;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package juloo.common;
|
||||
package juloo.keyboard2.prefs;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<keyboard name="Talysh (تالشی همواج)" script="persian">
|
||||
<row>
|
||||
<key key0="ض" key2="۱"/>
|
||||
<key key0="ص" key1="~" key2="۲" key3="\@"/>
|
||||
<key key0="ث" key1="!" key2="۳" key3="\#"/>
|
||||
<key key0="ق" key1="﷼" key2="۴" key3="$"/>
|
||||
<key key0="ف" key2="۵" key3="٪"/>
|
||||
<key key0="غ" key1="،" key2="۶" key3="^"/>
|
||||
<key key0="ع" key2="۷" key3="&"/>
|
||||
<key key0="ه" key2="۸" key3="*"/>
|
||||
<key key0="خ" key2="۹" key3="(" key4=")"/>
|
||||
<key key0="ح" key2="۰"/>
|
||||
<key key0="ج"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ش" key1="َ" key2="tab"/>
|
||||
<key key0="س" key1="ُ"/>
|
||||
<key key0="ی" key4="ئ"/>
|
||||
<key key0="ب" key1="ّ"/>
|
||||
<key key0="ل" key3="ِ" key4="ﻻ"/>
|
||||
<key key0="ا" key1="آ" key2="-" key3="إ" key4="أ"/>
|
||||
<key key0="ت" key1="_" key2="+"/>
|
||||
<key key0="ن" key4="ۨ"/>
|
||||
<key key0="م"/>
|
||||
<key key0="ک"/>
|
||||
<key key0="گ" key1="ء"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ظ"/>
|
||||
<key key0="ط"/>
|
||||
<key key0="ژ" key2="«"/>
|
||||
<key key0="ز" key1="ْ" key2="»"/>
|
||||
<key key0="ر" key2="."/>
|
||||
<key key0="د" key2="؛" key3=":" key4="ذ"/>
|
||||
<key key0="پ" key2="؟"/>
|
||||
<key key0="و" key1="ۋ" key4="ۊ"/>
|
||||
<key key0="چ"/>
|
||||
<key key0="ٚ" key1="ٛ"/>
|
||||
<key key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
@@ -28,8 +28,8 @@
|
||||
<key shift="0.1" key0="ट" key1="ठ" key2="ड़" key3="\#" key4="*"/>
|
||||
<key key0="ं" key1="ँ" key2="।" key3="ॐ" key4="\@"/>
|
||||
<key key0="म" key1="ण" key2="य" key3="य़" key4="%"/>
|
||||
<key key0="न" key1="" key2="।" key3=":" key4="&"/>
|
||||
<key key0="व" key1="" key2="ढ़" key3=";" key4="."/>
|
||||
<key key0="न" key2="।" key3=":" key4="&"/>
|
||||
<key key0="व" key2="ढ़" key3=";" key4="."/>
|
||||
<key key0="ल" key1="ळ" key2="फ़" key3="!" key4=","/>
|
||||
<key key0="स" key1="श" key2="ष" key3="\?" key4="।"/>
|
||||
<key shift="0.1" width="1.4" key0="backspace" key2="delete"/>
|
||||
@@ -38,7 +38,7 @@
|
||||
</row>
|
||||
<row height="0.95">
|
||||
<key width="1.8" key0="ctrl" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.2" key0="fn" key1="loc alt" key2="change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="1.2" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.0" key0="space" key7="switch_forward" key8="0"/>
|
||||
<key width="1.2" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key width="1.8" key0="enter" key3="action"/>
|
||||
@@ -41,7 +41,7 @@
|
||||
</row>
|
||||
<row height="0.95">
|
||||
<key width="1.8" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.2" key0="fn" key1="loc alt" key2="change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="1.2" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.0" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key width="1.2" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key key0="j" key4=";"/>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<keyboard name="QWERTY (Talysh New Latin)" script="latin">
|
||||
<row>
|
||||
<key key0="g" key2="1" key4="q"/>
|
||||
<key key0="ú" key2="2" key4="ü"/>
|
||||
<key key0="e" key2="3" key3="\#"/>
|
||||
<key key0="ê" key2="4" key3="!"/>
|
||||
<key key0="r" key2="5" key3="$"/>
|
||||
<key key0="t" key2="6" key3="%"/>
|
||||
<key key0="y" key2="7" key3="^"/>
|
||||
<key key0="u" key2="8" key3="û"/>
|
||||
<key key0="i" key2="9" key3="*"/>
|
||||
<key key0="o" key1="ö" key2="0" key3="("/>
|
||||
<key key0="p" key3=")"/>
|
||||
<key key0="q" key3="&" key4="ğ"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="á" key2="`" key4="a"/>
|
||||
<key key0="s" key2="~"/>
|
||||
<key key0="d" key1="{"/>
|
||||
<key key0="f" key2="}"/>
|
||||
<key key0="g" key2="-" key8="_"/>
|
||||
<key key0="h" key2="=" key3="+"/>
|
||||
<key key0="ž" key4="j"/>
|
||||
<key key0="k" key2="]" key3="["/>
|
||||
<key key0="l" key2="|" key3="\\"/>
|
||||
<key key0="ı"/>
|
||||
<key key0="a" key4="ə"/>
|
||||
<key key0="â" key3="\@"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="j" key2="<" key3="." key4="c"/>
|
||||
<key key0="v" key1="w" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key2=":" key3=";"/>
|
||||
<key key0="m" key2=""" key3="'"/>
|
||||
<key key0="c" key4="ç"/>
|
||||
<key key0="š" key4="ş"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
@@ -22,7 +22,7 @@
|
||||
<key key0="h" key2="=" key3="+"/>
|
||||
<key key0="j" key1="accent_dot_below" key3="{" key4="}"/>
|
||||
<key key0="k" key3="[" key4="]"/>
|
||||
<key key0="l" key2="|" key3="\"/>
|
||||
<key key0="l" key2="|" key3="\\"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
@@ -10,7 +10,7 @@
|
||||
<key key0="u" key1="7" key2="ü" key3="ú" key4="ů"/>
|
||||
<key key0="i" key1="8" key3="í"/>
|
||||
<key key0="o" key1="9" key2="ö" key3="ó" key4="ô"/>
|
||||
<key key0="p" key1="0" key2="=" key3="\" key4="/"/>
|
||||
<key key0="p" key1="0" key2="=" key3="\\" key4="/"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key1="tab" key3="á" key4="ä"/>
|
||||
Reference in New Issue
Block a user