Compare commits

..

9 Commits

Author SHA1 Message Date
Jules Aguillon
87da258c5b Fix margin calculation on Android 14
Some checks failed
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
2024-12-26 18:10:02 +01:00
Jules Aguillon
dd99579a90 Comment 2024-12-26 17:42:57 +01:00
Jules Aguillon
cc3d2591a7 Simpler fix for the launcher activity 2024-12-26 17:36:25 +01:00
Jules Aguillon
ede983aef7 Implement for the settings activity 2024-12-26 17:25:30 +01:00
Jules Aguillon
d396af9240 Implement edge-to-edge for the launcher activity 2024-12-26 17:11:17 +01:00
Jules Aguillon
185ddcec60 Account for buttons in the gesture-navigation bar
Some checks are pending
Check layouts / check_layout.output (push) Waiting to run
Check layouts / Generated files (push) Waiting to run
Check translations / check-translations (push) Waiting to run
Make Apk CI / Build-Apk (push) Waiting to run
The back and IME switching buttons that appear in the navigation bar are
not accounted by WindowInsets and would overlap with the keyboard.
2024-12-26 13:41:06 +01:00
Jules Aguillon
f13af579c1 Allow keyboard to draw behind navigation bars 2024-12-26 13:37:05 +01:00
Jules Aguillon
da957d534b Keyboard doesn't draw behind button-navigation bars in landscape mode 2024-12-26 12:32:35 +01:00
Jules Aguillon
139ff760e0 Proper support for Android 15 edge-to-edge
The keyboard background now extends under the system bars and display
cutout but the keys do not.

This does not yet handle the gesture navigation bar changing height when
the IME dismiss and switch buttons are added.
2024-12-24 17:13:16 +01:00
202 changed files with 4104 additions and 7569 deletions

View File

@@ -13,7 +13,7 @@ jobs:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@v4 uses: actions/checkout@v4
- run: python3 gen_layouts.py - run: python3 gen_layouts.py
- name: "Run 'python3 gen_layouts.py' to update generated files" - name: "Check that the generated 'layouts.xml' is uptodate, otherwise run 'python3 gen_layouts.py'"
run: git diff --exit-code run: git diff --exit-code
check-layouts: check-layouts:
name: check_layout.output name: check_layout.output
@@ -22,5 +22,5 @@ jobs:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@v4 uses: actions/checkout@v4
- run: python3 check_layout.py - run: python3 check_layout.py
- name: "Fix your layout accordingly or run 'python3 check_layout.py' to promote the warnings" - name: "Check that the generated 'check_layout.output' is uptodate, otherwise run 'python3 check_layout.py'"
run: git diff --exit-code run: git diff --exit-code

View File

@@ -0,0 +1,16 @@
name: Check translations
on:
workflow_dispatch:
push:
pull_request:
jobs:
check-translations:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
- run: python3 sync_translations.py
- name: "Check that strings files are uptodate, otherwise run 'python3 sync_translations.py'"
run: git add -N . && git diff --exit-code

1
.gitignore vendored
View File

@@ -10,4 +10,3 @@
/build /build
# Directory _build is not used anymore # Directory _build is not used anymore
/_build /_build
/release

View File

@@ -11,7 +11,7 @@
<meta-data android:name="android.view.im" android:resource="@xml/method"/> <meta-data android:name="android.view.im" android:resource="@xml/method"/>
</service> </service>
<activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/settingsTheme" 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/settingsTheme" android:exported="true" android:directBootAware="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
</intent-filter> </intent-filter>

View File

@@ -173,13 +173,13 @@ Remove the `<!--` and `-->` parts and change the text.
### Adding a translation ### Adding a translation
The preferred method for translating the app is to use Weblate:
https://hosted.weblate.org/engage/unexpected-keyboard/
The `res/values-<language_tag>/strings.xml` file must be created by copying the The `res/values-<language_tag>/strings.xml` file must be created by copying the
default translation in `res/values/strings.xml`, which contain the structure of default translation in `res/values/strings.xml`, which contain the structure of
the file and the English strings. the file and the English strings.
To check that `strings.xml` is formatted correctly, run
`python sync_translations.py`. This will modify your files.
Store descriptions in `fastlane/metadata/android/` are updated automatically. Store descriptions in `fastlane/metadata/android/` are updated automatically.
Translating changelogs is not useful. Translating changelogs is not useful.
@@ -190,46 +190,18 @@ As translations need to be updated regularly, you can subscribe to this issue
to receive a notification when an update is needed: to receive a notification when an update is needed:
https://github.com/Julow/Unexpected-Keyboard/issues/373 https://github.com/Julow/Unexpected-Keyboard/issues/373
### Adding symbols to Shift, Fn, Compose and other modifiers ### Adding Compose key sequences
New key combinations can be added to builtin modifiers in the following files: New Compose sequences can be added into `srcs/compose/compose/extra.json`.
If a entirely new family of sequences were to be added, a new `.json` file can
be created in the same directory to host them.
- Shift in `srcs/compose/shift.json`. ### Adding key combinations
- Fn in `srcs/compose/fn.json`.
- Compose in `srcs/compose/compose/extra.json`.
- Other modifiers are defined in the `accent_*.json` files in `srcs/compose`.
Generated code must then be updated by running: Key combinations are defined in `srcs/juloo.keyboard2/KeyModifier.java`.
For example, keys modified by the `Fn` key are defined in method
`apply_fn_char`.
``` Keys with special meaning are defined in `KeyValue.java` in method
./gradlew compileComposeSequences `getKeyByName`. Their special action are defined in `KeyEventHandler.java` in
``` method `key_up`
These files describe each symbols that get transformed when a given modifier is
activated, in JSON format. For example:
Example from `fn.json`, when `Fn` is activated, `<` becomes `«`:
```json
{
"<": "«",
}
```
The result of a sequence can be a key name. See the list of key names in
[doc/Possible-key-values.md](doc/Possible-key-values.md). For example from
`fn.json`, when `Fn` is activated, space becomes `nbsp`:
```json
{
" ": "nbsp",
}
```
Compose sequences are made of several steps. For example, the sequence
`Compose V s = Š` is defined as:
```json
{
"V": {
"s": "Š"
}
}
```

View File

@@ -1,4 +1,4 @@
# Unexpected Keyboard [<img src="https://hosted.weblate.org/widget/unexpected-keyboard/svg-badge.svg" alt="État de la traduction" />](https://hosted.weblate.org/engage/unexpected-keyboard/) # Unexpected Keyboard
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" [<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on F-Droid" alt="Get it on F-Droid"
@@ -24,14 +24,7 @@ Usage: to apply the symbols located in the corners of each key, slide your finge
| --- | --- | --- | | --- | --- | --- |
| <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> | | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
## Help translate the application
Improve the application translations [using Weblate](https://hosted.weblate.org/engage/unexpected-keyboard/).
[<img src="https://hosted.weblate.org/widget/unexpected-keyboard/multi-auto.svg" alt="État de la traduction" />](https://hosted.weblate.org/engage/unexpected-keyboard/)
## Similar apps ## Similar apps
* [Calculator++](https://git.bubu1.eu/Bubu/android-calculatorpp) - Calculator with a similar UX, swipe to corners for advanced math symbols and operators. * [Calculator++](https://git.bubu1.eu/Bubu/android-calculatorpp) - Calculator with a similar UX, swipe to corners for advanced math symbols and operators.
## Contributing ## Contributing

Binary file not shown.

View File

@@ -1,23 +1,21 @@
plugins { plugins {
id 'com.android.application' version '8.6.0' id 'com.android.application' version '8.1.1'
} }
dependencies { dependencies {
implementation "androidx.window:window-java:1.3.0"
implementation "androidx.core:core:1.16.0"
testImplementation "junit:junit:4.13.2" testImplementation "junit:junit:4.13.2"
} }
android { android {
namespace 'juloo.keyboard2' namespace 'juloo.keyboard2'
compileSdk 35 compileSdk 34
defaultConfig { defaultConfig {
applicationId "juloo.keyboard2" applicationId "juloo.keyboard2"
minSdk 21 minSdk 11
targetSdkVersion 35 targetSdkVersion 35
versionCode 50 versionCode 44
versionName "1.32.1" versionName "1.30.1"
} }
sourceSets { sourceSets {
@@ -84,11 +82,13 @@ android {
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_7
} }
lintOptions { lintOptions {
// Translation are already checked by 'syncTranslations'
disable 'MissingTranslation'
} }
} }
@@ -119,6 +119,7 @@ tasks.register('genEmojis') {
tasks.withType(Test).configureEach { tasks.withType(Test).configureEach {
dependsOn 'genLayoutsList' dependsOn 'genLayoutsList'
dependsOn 'checkKeyboardLayouts' dependsOn 'checkKeyboardLayouts'
dependsOn 'syncTranslations'
dependsOn 'compileComposeSequences' dependsOn 'compileComposeSequences'
} }
@@ -133,8 +134,20 @@ tasks.register('genLayoutsList') {
tasks.register('checkKeyboardLayouts') { tasks.register('checkKeyboardLayouts') {
println "\nChecking layouts" println "\nChecking layouts"
exec { exec {
def layouts = new File(projectDir, "srcs/layouts").listFiles().findAll {
it.name.endsWith(".xml")
}
workingDir = projectDir workingDir = projectDir
commandLine("python", "check_layout.py") commandLine("python", "check_layout.py", *layouts)
standardOutput = new FileOutputStream("${projectDir}/check_layout.output")
}
}
tasks.register('syncTranslations') {
println "\nUpdating translations"
exec {
workingDir = projectDir
commandLine "python", "sync_translations.py"
} }
} }

View File

@@ -1,23 +1,185 @@
arab_alt: Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~ # arab_alt
arab_hamvaj_tly: Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], _, `, {, |, } Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~
arab_pc: Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, | 1 warnings
arab_pc_ckb: Layout includes some ASCII punctuation but not all, missing: ", %, ', +, ,, ;, <, =, >, ?, `, |, ~ # arab_hamvaj_tly
arab_pc_ckb_fa: Layout includes some ASCII punctuation but not all, missing: ", #, $, %, &, ', ,, /, ;, ?, @, \, ^, `, |, ~ Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], _, `, {, |, }
arab_pc_hindu: Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, | Layout doesn't define some important keys, missing: loc esc
arab_pc_ir: Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, } 2 warnings
beng_national: Layout includes some ASCII punctuation but not all, missing: $ # arab_pc
beng_provat: Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >, [, \, ], `, {, |, } Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
cyrl_lynyertdz_mk: Layout includes some ASCII punctuation but not all, missing: " 1 warnings
cyrl_yaverti: Layout includes some ASCII punctuation but not all, missing: ~ # arab_pc_ckb
cyrl_yxukeng_os: Layout includes some ASCII punctuation but not all, missing: ", #, $, &, ', @, [, ], ~ Layout includes some ASCII punctuation but not all, missing: ", %, ', +, ,, ;, <, =, >, ?, `, |, ~
deva_alt: Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), *, +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~ 1 warnings
deva_inscript: Layout includes some ASCII punctuation but not all, missing: ", $, ', ^, _, `, | # arab_pc_ckb_fa
hebr_1_il: Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, } Layout includes some ASCII punctuation but not all, missing: ", #, $, %, &, ', ,, /, ;, ?, @, \, ^, `, |, ~
hebr_2_il: Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, } Layout doesn't define some important keys, missing: loc esc, loc tab
kann_kannada: Layout includes some ASCII punctuation but not all, missing: #, $, %, (, ), *, +, /, <, =, >, [, \, ], ^, `, {, |, }, ~ 2 warnings
latn_colemak: Some keys contain whitespaces, unexpected: ́ # arab_pc_hindu
latn_dvorak: Missing important key, missing: loc capslock Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
latn_neo2: Layout redefines the bottom row but some important keys are missing, missing: loc switch_clipboard 1 warnings
latn_qwertz_cz_multifunctional: Layout includes some ASCII punctuation but not all, missing: ` # arab_pc_ir
latn_qwertz_sk: Layout includes some ASCII punctuation but not all, missing: ` Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, }
urdu_phonetic_ur: Layout includes some ASCII punctuation but not all, missing: <, >, ?, `, |, ~ 1 warnings
# armenian_ph_am
0 warnings
# beng_national
Layout includes some ASCII punctuation but not all, missing: $
1 warnings
# beng_provat
Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >, [, \, ], `, {, |, }
1 warnings
# cyrl_jcuken_kk
0 warnings
# cyrl_jcuken_ru
0 warnings
# cyrl_jcuken_uk
0 warnings
# cyrl_lynyertz_sr
0 warnings
# cyrl_ueishsht
0 warnings
# cyrl_yaverti
Layout includes some ASCII punctuation but not all, missing: ~
1 warnings
# cyrl_yqukeng_tj
Layout doesn't define some important keys, missing: loc esc, loc tab
These keys are now added automatically, unexpected: f11_placeholder, f12_placeholder
2 warnings
# cyrl_yxukeng_os
Layout includes some ASCII punctuation but not all, missing: ", #, $, &, ', @, [, ], ~
Layout doesn't define some important keys, missing: loc esc, loc tab
These keys are now added automatically, unexpected: f11_placeholder, f12_placeholder
3 warnings
# deva_alt
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~
Layout doesn't define some important keys, missing: loc esc, loc tab
2 warnings
# deva_inscript
Duplicate keys: ।
Layout includes some ASCII punctuation but not all, missing: ", $, ', ^, _, `, |
2 warnings
# deva_phonetic_in
Duplicate keys: ट
1 warnings
# georgian_mes
0 warnings
# georgian_qwerty
0 warnings
# grek_qwerty
Duplicate keys: ;
1 warnings
# guj_phonetic_in
Duplicate keys: ટ, ડ
1 warnings
# hang_dubeolsik_kr
Layout doesn't define some important keys, missing: loc esc, loc tab
1 warnings
# hebr_1_il
Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, }
1 warnings
# hebr_2_il
Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, }
1 warnings
# kann_kannada
Layout includes some ASCII punctuation but not all, missing: #, $, %, (, ), *, +, /, <, =, >, [, \, ], ^, `, {, |, }, ~
Layout doesn't define some important keys, missing: loc esc, loc tab
2 warnings
# latn_azerty_be
0 warnings
# latn_azerty_fr
0 warnings
# latn_bepo_fr
0 warnings
# latn_bone
Layout doesn't define some important keys, missing: loc esc, loc tab
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_clipboard, loc switch_greekmath, loc voice_typing, switch_backward
2 warnings
# latn_colemak
Some keys contain whitespaces, unexpected: ́
1 warnings
# latn_dvorak
0 warnings
# latn_neo2
Layout redefines the bottom row but some important keys are missing, missing: loc switch_clipboard
1 warnings
# latn_qwerty_br
0 warnings
# latn_qwerty_cy
0 warnings
# latn_qwerty_cz
0 warnings
# latn_qwerty_da
0 warnings
# latn_qwerty_es
0 warnings
# latn_qwerty_et
0 warnings
# latn_qwerty_ga
0 warnings
# latn_qwerty_gb
0 warnings
# latn_qwerty_haw
0 warnings
# latn_qwerty_hu
0 warnings
# latn_qwerty_jp
0 warnings
# latn_qwerty_kk
0 warnings
# latn_qwerty_lv
0 warnings
# latn_qwerty_no
0 warnings
# latn_qwerty_pl
0 warnings
# latn_qwerty_ro
0 warnings
# latn_qwerty_se
Duplicate keys: !, ', ,, -, ., ?
1 warnings
# latn_qwerty_sk
0 warnings
# latn_qwerty_sr
0 warnings
# latn_qwerty_tly
Duplicate keys: a, c, j, q
Layout doesn't define some important keys, missing: loc esc, loc tab
2 warnings
# latn_qwerty_tr
0 warnings
# latn_qwerty_us
0 warnings
# latn_qwerty_vi
0 warnings
# latn_qwertz
0 warnings
# latn_qwertz_cz
0 warnings
# latn_qwertz_cz_diacritics
0 warnings
# latn_qwertz_cz_multifunctional
Layout includes some ASCII punctuation but not all, missing: `
1 warnings
# latn_qwertz_de
0 warnings
# latn_qwertz_fr_ch
0 warnings
# latn_qwertz_hu
0 warnings
# latn_qwertz_sk
Layout includes some ASCII punctuation but not all, missing: `
1 warnings
# latn_qwertz_sq
0 warnings
# latn_workman_us
0 warnings
# shaw_imperial_en
0 warnings
# tamil_default
0 warnings
# urdu_phonetic_ur
Duplicate keys:
Layout includes some ASCII punctuation but not all, missing: <, >, ?, `, |, ~
Some keys contain whitespaces, unexpected:
3 warnings

View File

@@ -1,8 +1,7 @@
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import sys, os, glob, re import sys, os
layout_file_name = 0 warning_count = 0
warnings = []
KNOWN_NOT_LAYOUT = set([ KNOWN_NOT_LAYOUT = set([
"number_row", "numpad", "pin", "number_row", "numpad", "pin",
@@ -15,12 +14,10 @@ KEY_ATTRIBUTES = set([
"c", "nw", "ne", "sw", "se", "w", "e", "n", "s" "c", "nw", "ne", "sw", "se", "w", "e", "n", "s"
]) ])
# Keys defined in KeyValue.java
known_keys = set()
def warn(msg): def warn(msg):
global warnings global warning_count
warnings.append("%s: %s" % (layout_file_name, msg)) print(msg)
warning_count += 1
def key_list_str(keys): def key_list_str(keys):
return ", ".join(sorted(list(keys))) return ", ".join(sorted(list(keys)))
@@ -76,7 +73,9 @@ def check_layout(layout):
if len(dup) > 0: warn("Duplicate keys: " + key_list_str(dup)) if len(dup) > 0: warn("Duplicate keys: " + key_list_str(dup))
missing_some_of(keys, "~!@#$%^&*(){}`[]=\\-_;:/.,?<>'\"+|", "ASCII punctuation") missing_some_of(keys, "~!@#$%^&*(){}`[]=\\-_;:/.,?<>'\"+|", "ASCII punctuation")
missing_some_of(keys, "0123456789", "digits") missing_some_of(keys, "0123456789", "digits")
missing_required(keys, ["backspace", "delete"], "Layout doesn't define some important keys") missing_required(keys,
["loc esc", "loc tab", "backspace", "delete"],
"Layout doesn't define some important keys")
unexpected_keys(keys, unexpected_keys(keys,
["copy", "paste", "cut", "selectAll", "shareText", ["copy", "paste", "cut", "selectAll", "shareText",
"pasteAsPlainText", "undo", "redo" ], "pasteAsPlainText", "undo", "redo" ],
@@ -90,10 +89,6 @@ def check_layout(layout):
unexpected_keys(keys, filter(lambda k: k.strip()!=k, keys), "Some keys contain whitespaces") unexpected_keys(keys, filter(lambda k: k.strip()!=k, keys), "Some keys contain whitespaces")
unexpected_keys(keys, ["f11_placeholder", "f12_placeholder"], "These keys are now added automatically") unexpected_keys(keys, ["f11_placeholder", "f12_placeholder"], "These keys are now added automatically")
if root.get("script", "latin") == "latin":
missing_required(keys, ["shift", "loc capslock"], "Missing important key")
missing_required(keys, ["loc esc", "loc tab"], "Missing programming keys")
_, bottom_row_keys, _ = parse_row("res/xml/bottom_row.xml") _, bottom_row_keys, _ = parse_row("res/xml/bottom_row.xml")
if root.get("bottom_row") == "false": if root.get("bottom_row") == "false":
@@ -106,34 +101,15 @@ def check_layout(layout):
if root.get("script") == None: if root.get("script") == None:
warn("Layout doesn't specify a script.") warn("Layout doesn't specify a script.")
keys_without_loc = set(( k.removeprefix("loc ") for k in keys )) for fname in sorted(sys.argv[1:]):
# Keys with a len under 3 are often composed characters
special_keys = set(( k for k in keys_without_loc if len(k) > 3 and ":" not in k ))
unknown = special_keys.difference(known_keys)
if len(unknown) > 0:
warn("Layout contains unknown keys: %s" % key_list_str(unknown))
# Fill 'known_keys', which is used for some checks
def parse_known_keys():
global known_keys
with open("srcs/juloo.keyboard2/KeyValue.java", "r") as f:
known_keys = set(
( m.group(1) for m in re.finditer('case "([^"]+)":', f.read()) )
)
parse_known_keys()
for fname in sorted(glob.glob("srcs/layouts/*.xml")):
layout_id, _ = os.path.splitext(os.path.basename(fname)) layout_id, _ = os.path.splitext(os.path.basename(fname))
if layout_id in KNOWN_NOT_LAYOUT: if layout_id in KNOWN_NOT_LAYOUT:
continue continue
layout_file_name = layout_id
layout = parse_layout(fname) layout = parse_layout(fname)
if layout == None: if layout == None:
warn("Not a layout file") print("Not a layout file: %s" % layout_id)
else: else:
print("# %s" % layout_id)
warning_count = 0
check_layout(layout) check_layout(layout)
print("%d warnings" % warning_count)
with open("check_layout.output", "w") as out:
for w in warnings:
print(w, file=out)

View File

@@ -6,7 +6,7 @@ We recommend you keep your work in a file outside Unexpected Keyboard (named som
Put initial contents into your file in one of these ways: Put initial contents into your file in one of these ways:
* Copypaste the code Unexpected displays for _Custom layout_. * Copypaste the code Unexpected displays for _Custom layout_.
* Make a copy of one of the built-in layouts found in [`/srcs/layouts`](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts). * Make a copy of one of the built-in layouts found in [`/srcs/layouts`](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts).
* Use the [web-based editor](https://domportera.github.io/app-unexpected-keyboard-layout-editor/). Interact with this web page to define keys and swipes and move keys to desired positions, and it will write the XML code for you. You can make the web page put the XML in a text file or copy it to the clipboard. * Use the [web-based editor](https://unexpected-keyboard-layout-editor.lixquid.com/). Interact with this web page to define keys and swipes and move keys to desired positions, and it will write the XML code for you. You can make the web page put the XML in a text file or copy it to the clipboard.
When you have prepared suitable XML code in one of these ways, copy it to the clipboard and paste it into Unexpected Keyboard. When you have prepared suitable XML code in one of these ways, copy it to the clipboard and paste it into Unexpected Keyboard.
@@ -47,16 +47,12 @@ The `<keyboard>`...`</keyboard>` pair follows the declaration tag and encloses t
+ We recommend your layout use the built-in bottom row, because it is still evolving and your layout will incorporate innovations in future versions. However, to define your own, the current definition of the bottom row is in [bottom_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/bottom_row.xml). You can copypaste this XML into your custom layout as a starting point. + We recommend your layout use the built-in bottom row, because it is still evolving and your layout will incorporate innovations in future versions. However, to define your own, the current definition of the bottom row is in [bottom_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/bottom_row.xml). You can copypaste this XML into your custom layout as a starting point.
+ Likewise, the current definition of the top (number) row is in [number_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/number_row.xml). + Likewise, the current definition of the top (number) row is in [number_row.xml](https://github.com/Julow/Unexpected-Keyboard/res/xml/number_row.xml).
* `embedded_number_row`: Whether the layout has an embedded number row, and thus the "Show number row" setting shouldn't add another one. It accepts `true` or `false`, and defaults to `false`.
* `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`. * `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`.
## Row ## Row
The `<row>`...`</row>` pair encloses one row on the keyboard. It has the following optional property: The `<row>`...`</row>` pair encloses one row on the keyboard. It has only one optional property:
* `height`: The height of the row: a positive floating-point value. * `height`: The height of the row: a positive floating-point value.
* `scale`: A positive floating-point value. If present, scale the width of each key so that the total is equal to the specified value, in key width unit.
A row's default height is 1.0 (one quarter of the keyboard height specified on the Settings menu). The `height` property makes the row taller or shorter than this. For example, if you define a 5-row keyboard but one row has `height="0.7"`, then the keyboard's total height is 4.7 units. If the total is different from 4.0, the keyboard will be taller or shorter than that specified in Settings. A row's default height is 1.0 (one quarter of the keyboard height specified on the Settings menu). The `height` property makes the row taller or shorter than this. For example, if you define a 5-row keyboard but one row has `height="0.7"`, then the keyboard's total height is 4.7 units. If the total is different from 4.0, the keyboard will be taller or shorter than that specified in Settings.
## Key ## Key
@@ -97,6 +93,7 @@ The following optional properties define the effects of swipes:
You can define a swipe only once with either compass-point or numeric notation. Unexpected Keyboard automatically puts a small legend in that direction from the center of the key. You can define a swipe only once with either compass-point or numeric notation. Unexpected Keyboard automatically puts a small legend in that direction from the center of the key.
* `slider`: If `slider="true"`, and the key also has `w` and `e` properties, then the key tracks horizontal finger motion precisely and sends the `w` and `e` keystrokes repeatedly. In built-in layouts, this makes the space bar send left and right characters as the user slides on the space bar.
* `anticircle`: The key value to send when doing an anti-clockwise gesture on the key. * `anticircle`: The key value to send when doing an anti-clockwise gesture on the key.
### Layout ### Layout

View File

@@ -1,73 +1,43 @@
# Key values # Key values
A key value defines what a key on the keyboard does when pressed or swiped. This is an exhaustive list of special values accepted for the `key0` through `key8` or `nw` through `se` attributes on a key.
Key values appear in the following places: Any string that does not exactly match these will be printed verbatim.
A key can output multiple characters, but cannot combine multiple built-in key values.
- In custom layouts, they are the value of: the `c` attribute, the compass-point attributes `nw` ... `se`, and the old-style `key0` ... `key8` attributes. ## Escape codes
- Internally, they are used in the definition of the "Add keys to the keyboard" setting. Value | Escape code for
Key values can be any of the following:
- The name of a special key. A complete list of valid special keys follows.
- An arbitrary sequence of characters not containing `:`.
This results in a key that writes the specified characters.
- The syntax `legend:key_def`.
`legend` is the visible legend on the keyboard. It cannot contain `:`.
`key_def` can be:
+ The name of a special key, as listed below.
+ `'string'` An arbitrary string that can contain `:`. `'` can be added to the string as `` \' ``.
+ `keyevent:keycode` An Android keycode. They are listed as `KEYCODE_...` in [KeyEvent](https://developer.android.com/reference/android/view/KeyEvent#summary).
Examples:
+ `⏯:keyevent:85` A play/pause key (which has no effect in most apps).
+ `my@:'my.email@domain.com'` A key that sends an arbitrary string
- A macro, `legend:key_def1,key_def2,...`.
This results in a key with legend `legend` that behaves as if the sequence of `key_def` had been pressed in order.
Examples:
+ `CA:ctrl,a,ctrl,c` A key with legend CA that sends the sequence `ctrl+a`, `ctrl+c`.
+ `Cd:ctrl,backspace` A key with legend Cd that sends the shortcut `ctrl+backspace`.
### Escape codes
When defining a key value, several characters have special effects. If you want a character not to have its usual effect but to be taken literally, you should "escape" it in the usual way for XML:
To get this character... | ...you can type
:---- | :------ :---- | :------
A literal newline character, which is different from `enter` and `action` in certain apps. | `\n` `\?` | `?`
A literal tab character, which is different from `tab` in certain apps. | `\t` `\#` | `#`
`&` | `&amp;` `\@` | `@`
`<` | `&lt;` `\n` | Literal newline character. This is different from `enter` and `action` in certain apps.
`>` | `&gt;` `\t` | Literal tab character. This is different from `tab` in certain apps.
`"` | `&quot;` `\\` | `\`
The characters `\` (unless followed by n or t), `?`, `#`, and `@` do not need to be escaped when writing custom layouts. When writing a layout to be included in the app (in [srcs/layouts](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts)), they are represented by typing `\\`, `\?`, `\#`, and `\@`. XML escape codes also work, including:
The characters `,` and `:` can be escaped in a key value, using single quotes. For example, this macro defines a key with legend `http` that sends a string containing `:`: `<key c="http:home,'https://'" />` For simplicity, `,` and `:` cannot be escaped in the key legend. Value | Escape code for
:------- | :------
`&amp;` | `&`
`&lt;` | `<`
`&gt;` | `>`
`&quot;` | `"`
## Modifiers ## Modifiers
System modifiers are sent to the app, which can take app-specific action. System modifiers are sent to the app, which is free to do whatever they want in response.
The other modifiers only exist within the keyboard.
Value | Meaning Value | Meaning
:---------- | :------ :---------- | :------
`shift` | System modifier. `shift` | System modifier.
`ctrl` | System modifier. `ctrl` | System modifier.
`alt` | System modifier. `alt` | System modifier.
`meta` | System modifier. Equivalent to the Windows key. `meta` | System modifier. Equivalent to the Windows key.
`fn` | Activates Fn mode, which assigns letters and symbols to special characters. e.g. `fn` `!` = `¡`
`compose` | Compose key. Enables composing characters using Linux-like shortcuts; e.g. `Compose` `A` `single quote` types `Á` (A with acute accent).
`capslock` | Actives and locks Shift
The other modifiers take effect only within the keyboard. ## Special keys
Value | Meaning
:---------- | :------
`fn` | Activates Fn mode, which assigns letters and symbols to special characters. Example: `fn` `!` = `¡`
`compose` | Compose key. Enables composing characters using Linux-like shortcuts. Example: `Compose` `A` `'` types `Á` (A with acute accent).
`capslock` | Activates and locks Shift.
## App function keys
These keys are sent to apps, which are free to ignore them. The keyboard does not perform editing in response to these keys. These keys are sent to apps, which are free to ignore them. The keyboard does not perform editing in response to these keys.
`esc`, `enter`, `esc`, `enter`,
@@ -83,19 +53,6 @@ These keys are sent to apps, which are free to ignore them. The keyboard does no
`selectAll`, `pasteAsPlainText`, `selectAll`, `pasteAsPlainText`,
`undo`, `redo` `undo`, `redo`
## Keyboard editing actions
In contrast, these keys perform editing on the text without sending anything to the app.
Value | Meaning
:-------------------- | :------
`cursor_left` | Moves the cursor to the left with the slider gesture.
`cursor_right` | Moves the cursor to the right with the slider gesture.
`cursor_up` | Moves the cursor up with the slider gesture. Warning: this might make the cursor leave the text box.
`cursor_down` | Moves the cursor down with the slider gesture. Warning: this might make the cursor leave the text box.
`delete_word` | Delete the word to the left of the cursor.
`forward_delete_word` | Delete the word to the right of the cursor.
The values with `cursor_` are new in v1.31.0. Previous custom layouts specified the slider with `slider="true"`, which should be removed.
## Whitespace ## Whitespace
Value | Meaning Value | Meaning
:------ | :------ :------ | :------
@@ -105,6 +62,13 @@ Value | Meaning
`zwj` | Zero-width joiner. `zwj` | Zero-width joiner.
`zwnj` | Zero-width non-joiner. `zwnj` | Zero-width non-joiner.
## Keyboard editing actions
These keys perform editing on the text without sending keys that the app can interpret differently or ignore.
Value | Meaning
:----------------- | :------
`cursor_left` | Moves the cursor position to the left directly, without sending a `left` key event.
`cursor_right` | Moves the cursor position to the right directly, without sending a `right` key event.
## Other modifiers and diacritics ## Other modifiers and diacritics
Value | Meaning Value | Meaning
:------------------- | :------ :------------------- | :------
@@ -141,20 +105,6 @@ Value | Meaning
`rlm` | Right-to-left mark. `rlm` | Right-to-left mark.
`b(`, `b)`, `b[`, `b]`, `b{`, `b}`, `blt`, `bgt` | Sends the bracket characters, but with mirrored key legends for right-to-left languages. (`blt` and `bgt` print `<` and `>` respectively.) `b(`, `b)`, `b[`, `b]`, `b{`, `b}`, `blt`, `bgt` | Sends the bracket characters, but with mirrored key legends for right-to-left languages. (`blt` and `bgt` print `<` and `>` respectively.)
## Arabic
These are the diacritics for Arabic
Value | Meaning
:------ | :------
`combining_fatha` | َ
`combining_dammah` | ُ
`combining_kasra` | ِ
`combining_sukun` | ْ
`combining_shaddah` | ّ
`combining_hamza_above` | ٔ
`combining_hamza_below` | ٕ
## Hebrew ## Hebrew
Keys ending in `_placeholder` are normally hidden unless the Fn key is pressed. Keys ending in `_placeholder` are normally hidden unless the Fn key is pressed.
@@ -200,3 +150,50 @@ These keys are known to do nothing.
These keys are normally hidden unless the Fn modifier is activated. These keys are normally hidden unless the Fn modifier is activated.
`f11_placeholder` | `f12_placeholder` `f11_placeholder` | `f12_placeholder`
## Complex keys
More complex keys are of this form:
```
:<kind> <attributes>:<payload>
```
Where `<kind>` is one of the kinds documented below and `<attributes>` is a
space separated list of attributes. `<payload>` depends on the `<kind>`.
Attributes are:
- `symbol='Sym'` specifies the symbol to be shown on the keyboard.
- `flags='<flags>'` changes the behavior of the key.
`<flags>` is a coma separated list of:
+ `dim`: Make the symbol dimmer.
+ `small`: Make the symbol smaller.
### Kind `str`
Defines a key that outputs an arbitrary string. `<payload>` is a string wrapped
in single-quotes (`'`), escaping of other single quotes is allowed with `\'`.
For example:
- `:str:'Arbitrary string with a \' inside'`
- `:str symbol='Symbol':'Output string'`
### Kind `char`
Defines a key that outputs a single character. `<payload>` is the character to
output, unquoted.
This kind of key can be used to define a character key with a different symbol
on it. `char` keys can be modified by `ctrl` and other modifiers, unlike `str`
keys.
For example:
- `:char symbol='љ':q`, which is used to implement `ctrl` shortcuts in cyrillic
layouts.
### Kind `keyevent`
Defines a key that sends an Android [key event](https://developer.android.com/reference/android/view/KeyEvent).
`<payload>` is the key event number.
For example:
- `:keyevent symbol='⏯' flags='small':85`

View File

@@ -1 +0,0 @@
Bug fixes

View File

@@ -1 +0,0 @@
Bug fixes

View File

@@ -1,8 +0,0 @@
Delete a word with a circle gesture on the delete key.
Compose key can be unselected.
Improved space bar slider and added selection mode.
Lock shift with a circle gesture.
Improvements to layouts.
Various bug fixes and improvements to themes.
Huge thanks to the contributors: @0skar2 @chuckwagoncomputing @dzaima @eandersons Lokesh Kumar @lrvideckis @ms-jagadeeshan @quantenzitrone @Sestowner @solokot @Spike-from-NH @srikanban @tenextractor

View File

@@ -1,9 +0,0 @@
Bug fixes
Delete a word with a circle gesture on the delete key.
Compose key can be unselected.
Improved space bar slider and added selection mode.
Lock shift with a circle gesture.
Various bug fixes and improvements to themes and layouts.
Many thanks to the contributors: @HaleyHalcyon @Jaoheah @Spike-from-NH

View File

@@ -1,6 +0,0 @@
Better support for foldable devices
Added layouts
Improved selection mode
Bug fixes and many other improvements
Huge thanks to the contributors: @alotbsol555, @bergentroll, @dacc9, @HaleyHalcyon, @Jaoheah, @jorexdeveloper, @malbajun, @matejdro, @Spike-from-NH, @tenextractor

View File

@@ -1 +0,0 @@
Bug fixes

View File

@@ -1,6 +0,0 @@
Ang pangunahing feature ay maaari kang mag-type ng mas marami pang karakter sa pag-swipe sa gilid ng mga key.
Noong simula, ginawa itong application para sa mga programmer sa na nagte-Termux.
Ngayo'y perpekto na sa pang-araw-araw.
Walang ads, hindi nagne-network request at Open Source ang application na ito.

View File

@@ -1 +0,0 @@
Magaan at privacy-conscious na virtual keyboard sa Android.

View File

@@ -1 +0,0 @@
Unexpected Keyboard

View File

@@ -1,6 +0,0 @@
Fitur utamanya adalah Anda dapat mengetik lebih banyak karakter dengan menggeser tombol ke arah sudut.
Aplikasi ini awalnya dirancang untuk programmer yang menggunakan Termux.
Sekarang sempurna untuk penggunaan sehari-hari.
Aplikasi ini tidak berisi iklan, tidak membuat permintaan jaringan dan Open Source.

View File

@@ -1 +0,0 @@
Keyboard virtual yang ringan dan sadar privasi untuk Android.

View File

@@ -1 +0,0 @@
Unexpected Keyboard

View File

@@ -1,6 +0,0 @@
La principale funzionalita` e' che si possono digitare caratteri aggiuntivi scorrendo sui tasti verso gli angoli.
.
Questa app e' stata inizialmente progettata per i programmatori che usavano Termux.
Oggi e' perfetta per l'utilizzo quotidiano,
.
Questa app non contiene pubblicita`, non genera chiamate di rete ed e' Open Source.

View File

@@ -1,6 +1,6 @@
Galvenā tastatūras iespēja ir viegli ievadīt vairāk rakstzīmju ar pavilkšanu uz taustiņu stūriem. Galvenā iezīme ir iespēja ievadīt vairāk rakstzīmju ar pavilkšanu uz taustiņu stūriem.
Sākotnēji šī lietotne tika izstrādāta programmētājiem, kas izmanto Termux. Šī lietotne sākotnēji tika izstrādāta programmētājiem, kas izmanto Termux.
Tagad lieliski piemērota ikdienas lietošanai. Tagad lieliski piemērota izmantošanai ikdienā.
Lietotne nesatur reklāmas, neveic nekādus tīkla pieprasījumus, un tās pirmkods ir pieejams visiem. Šī lietotne nesatur reklāmas, neveic nekādus tīkla pieprasījumus, un tās pirmkods ir pieejams visiem.

View File

@@ -1 +1 @@
Mazizmēra virtuālā Android tastatūra, kurai rūp privātums. Mazizmēra un privātumu ievērojoša virtuālā Android tastatūra.

View File

@@ -1,6 +0,0 @@
De belangrijkste functie is dat je meer tekens kunt typen door de toetsen naar de hoeken te vegen.
Deze applicatie is oorspronkelijk ontworpen voor programmeurs die Termux gebruiken.
Nu perfect voor dagelijks gebruik.
Deze applicatie bevat geen advertenties, doet geen netwerkverzoeken en is Open Source.

View File

@@ -1 +0,0 @@
Lichtgewicht en privacy-bewust virtueel toetsenbord voor Android.

View File

@@ -1 +0,0 @@
Unexpected Keyboard

View File

@@ -1,91 +0,0 @@
{
"version": "v1.0.0",
"entity": {
"type": "individual",
"role": "owner",
"name": "Julow",
"email": "jules@j3s.fr",
"description": "Open source developer and maintainer of Unexpected Keyboard.",
"webpageUrl": {
"url": "https://github.com/Julow"
}
},
"projects": [
{
"guid": "unexpected-keyboard",
"name": "Unexpected Keyboard",
"description": "Lightweight and privacy-conscious virtual keyboard for Android.",
"webpageUrl": {
"url": "https://github.com/Julow/Unexpected-Keyboard/"
},
"repositoryUrl": {
"url": "https://github.com/Julow/Unexpected-Keyboard/"
},
"licenses": [
"spdx:GPL-3.0",
"spdx:CC0-1.0"
],
"tags": [
"android",
"mobile",
"privacy",
"productivity",
"programming",
"user-experience"
]
}
],
"funding": {
"channels": [
{
"guid": "liberapay",
"type": "other",
"address": "https://liberapay.com/Julow/",
"description": "Recurring donations for funding Unexpected Keyboard."
},
{
"guid": "github-sponsors",
"type": "other",
"address": "https://github.com/sponsors/Julow",
"description": "Recurring donations for funding Unexpected Keyboard."
},
{
"guid": "paypal",
"type": "other",
"address": "https://paypal.me/JulesAguillon",
"description": "One-time donations for funding Unexpected-keyboard."
}
],
"plans": [
{
"guid": "fund-maintenance",
"status": "active",
"name": "Fund developer time",
"description": "Help the maintainers spend time on Unexpected Keyboard",
"amount": 0,
"currency": "EUR",
"frequency": "monthly",
"channels": [
"liberapay",
"github-sponsors",
"paypal"
]
},
{
"guid": "one-time-contribution",
"status": "active",
"name": "Fund developer time",
"description": "Help the maintainers spend time on Unexpected Keyboard",
"amount": 0,
"currency": "EUR",
"frequency": "one-time",
"channels": [
"liberapay",
"github-sponsors",
"paypal"
]
}
],
"history": []
}
}

View File

@@ -1,524 +0,0 @@
#! /bin/env python3
"""
Script to generate a layout based on an existing.
Tuned to create Sinhala phonetic layout based on qwerty (US), but may be adoped
for other scripts. Look at dicts before the LayoutBuilder code.
Usage:
python3 gen_sinhala_phonetic_layout [-h|--help] [-v|--verbose] [-o|--output]
By default with no args will write to corresponding file in `srcs/layouts/`.
Script uses central symbol (in direction "c") to identify a key, which may not
be appropriate for base (reference) layouts other, than qwerty (US).
Warning will be printed to stderr if new symbol overrides some symbol of the
reference layout in directions other, than "c".
Exception will be rised on other
conflicts e. g. when trying to move a symbol into occupied position.
- Made with latn_qwerty_us.xml from commit `6b1551d`
- Made with Python 3.13
- Requires Python >= 3.11
"""
import argparse
import logging
from enum import StrEnum
from pathlib import Path
from xml.etree import ElementTree
class Placement(StrEnum):
C = 'c'
NW = 'nw'
N = 'n'
NE = 'ne'
E = 'e'
SE = 'se'
S = 's'
SW = 'sw'
W = 'w'
# Based on XKB Sinhala (phonetic)
KEYS_MAP: dict[str, tuple[str, str, str, str]] = {
# Row 1 ###########################################
'q': ('', '', '\u0DD8', '\u0DF2'),
'w': ('', '', '\u0DD0', '\u0DD1'),
'e': ('', '', '\u0DD9', '\u0DDA'),
'r': ('', '', '', ''), # In XKB virama is on layer 2
't': ('', '', '', ''),
'y': ('', '', '', ''), # In XKB virama is on layer 2
'u': ('', '', '\u0DD4', '\u0DD6'),
'i': ('', '', '\u0DD2', '\u0DD3'),
'o': ('', '', '\u0DDC', '\u0DDD'),
'p': ('', '', '', ''),
# Row 2 ###########################################
'a': ('', '', '\u0DCA', '\u0DCF'),
's': ('', '', '', ''),
'd': ('', '', '', ''),
'f': ('', '\u0D93', '', '\u0DDB'), # In XKB aiyanna placed otherwise
'g': ('', '', '', ''),
'h': ('', '\u0D83', '\u0DDE', ''),
'j': ('', '', '', ''),
'k': ('', '', '', ''),
'l': ('', '', '\u0DDF', '\u0DF3'),
# Row 3 ###########################################
'z': ('', '', '', ''), # In XKB contains bar, broken bar
'x': ('', '', '', ''),
'c': ('', '', '', ''),
'v': ('', '', '', ''),
'b': ('', '', '', ''),
'n': ('', '', '\u0D82', ''),
'm': ('', '', '', ''),
}
# How to place four levels of Key.
# Syntax: LEVEL: PLACEMENT | 'FROM_LEVEL+MODIFIER'
# The last means symbol on level FROM_LEVEL with modifier key MODIFIER gives
# key on level LEVEL
#
LEVELS_MAP = {
0: Placement.C,
1: Placement.NE,
2: '0+shift',
3: '1+shift',
}
# Additional modify keys combinations.
# Syntax:
# MODKEY: { A: B }
#
MODMAP_EXTRA: dict[str, dict[str, str]] = {
'shift': {
# Astrological numbers
'1': '',
'2': '',
'3': '',
'4': '',
'5': '',
'6': '',
'7': '',
'8': '',
'9': '',
'0': '',
# Kunddaliya
'.': '',
# Extra broken bar intead z key in XKB
'\u007C': '\u00A6',
# Special whitespaces
'zwj': 'zwnj',
},
'fn': {
# Sinhala archaic digits
'': '𑇡', # 1
'': '𑇢', # 2
'': '𑇣', # 3
'': '𑇤', # 4
'': '𑇥', # 5
'': '𑇦', # 6
'': '𑇧', # 7
'': '𑇨', # 8
'': '𑇩', # 9
'': '𑇪', # 10
'': '𑇫', # 20
'': '𑇬', # 30
'': '𑇭', # 40
'': '𑇮', # 50
'': '𑇯', # 60
'': '𑇰', # 70
'': '𑇱', # 80
'': '𑇲', # 90
'': '𑇳', # 100
'': '𑇴', # 1000
# Sinhala candrabindu for Sanskrit
'': '\u0D81',
},
}
# Table to move additional characters in reference layout.
# Format is (CENTRAL_CHAR, PLACEMENT): (CENTRAL_CHAR, PLACEMENT). E. g. to move
# char from key with central character "q", direction "se" to key with central
# character "w", direction "sw", add line:
# ('q', Placement.SE): ('w', Placement.SW),
#
# To delete a char, use None as destination placement. E.g.:
# ('q', Placment.SE): ('q', None)
#
# Moving of main char in central placement is not supported.
#
TRANSITIONS_MAP: dict[tuple[str, Placement], tuple[str, Placement | None]] = {
('q', Placement.SE): ('q', Placement.SW), # loc esc
('q', Placement.NE): ('q', Placement.SE), # 1
('w', Placement.NE): ('w', Placement.SE), # 2
('e', Placement.SE): ('r', Placement.NW), # loc €
('e', Placement.NE): ('e', Placement.SE), # 3
('r', Placement.NE): ('r', Placement.SE), # 4
('t', Placement.NE): ('t', Placement.SE), # 5
('y', Placement.NE): ('y', Placement.SE), # 6
('u', Placement.NE): ('u', Placement.SE), # 7
('i', Placement.NE): ('i', Placement.SE), # 8
('o', Placement.SE): ('p', Placement.SW), # )
('o', Placement.NE): ('o', Placement.SE), # 9
('p', Placement.NE): ('p', Placement.SE), # 0
('a', Placement.NE): ('a', Placement.NW), # `
('a', Placement.NW): ('a', Placement.SW), # loc tab
('s', Placement.NE): ('s', Placement.NW), # loc §
('g', Placement.SW): ('g', Placement.NW), # _
('g', Placement.NE): ('g', Placement.SW), # -
('h', Placement.SW): ('h', Placement.NW), # +
('h', Placement.NE): ('h', Placement.SW), # =
('l', Placement.NE): ('l', Placement.NW), # |
('x', Placement.NE): ('x', Placement.NW), # loc †
('c', Placement.NE): ('c', Placement.NW), # <
('b', Placement.NE): ('b', Placement.NW), # ?
('n', Placement.NE): ('n', Placement.NW), # :
('m', Placement.NE): ('m', Placement.NW), # "
}
# Add additional characters to arbitrary places.
# Syntax is CHAR: POSITION, where POSITION is a pari as in TRANSITIONS_MAP.
#
CHARS_EXTRA = {
# In XKB ZWJ is on `/` key, and ZWNJ is on spacebar
'zwj': ('m', Placement.SE),
}
# List of char unicode numbers and inclusive ranges of numbers to encode as XML
# numeric character references.
# Good for combining signs to not mess with quotes.
# Characters in line of the keyboard tag will not be escaped.
#
ESCAPE_LIST: list[int | tuple[int, int]] = [
# Sinhalese diacritics
(0xD81, 0xD83),
(0xDCA, 0xDDF),
]
# Default filename. Output path can be overrided with `-o` flag also.
LAYOUT_FILENAME = 'sinhala_phonetic.xml'
# Will be placed after XML declaration. Need to have proper <!-- --> tags.
COMMENT = '''
<!-- This file defines Sinhala layout.
Based on XKB Sinhala (phonetic) layout.
-->
'''
BASE_DIR = Path(__file__).parent
REFERENCE_LAYOUT_FILE = BASE_DIR / 'srcs/layouts/latn_qwerty_us.xml'
LOGGER = logging.getLogger(__name__)
KeysMapType = list[list[ElementTree.Element]]
class LayoutGenError(RuntimeError):
...
def xml_elem_to_str(element: ElementTree.Element) -> str:
return ElementTree.tostring(
element,
xml_declaration=False,
encoding='unicode').strip()
def keys_map_to_str(keys_map: KeysMapType) -> str:
""" Make laout rows map printable for debug purposes """
result = '[\n'
for row in keys_map:
result += ' ' * 4
for key in row:
result += str(key.attrib) + ', '
result += '\n'
result += ']'
return result
def is_in_escape_list(char: str | int) -> bool:
if isinstance(char, str):
char = ord(char)
for item in ESCAPE_LIST:
if isinstance(item, tuple) and char >= item[0] and char <= item[1]:
return True
elif isinstance(item, int):
if char == item:
return True
else:
TypeError(f'Unexpected item {item} of ESCAPE_LIST')
return False
def xml_encode_char(ch: str | int) -> str:
if isinstance(ch, str):
ch = ord(ch)
hex_val = hex(ch).split('x')[-1]
return f'&#x{hex_val.upper().zfill(4)};'
class LayoutBuilder:
XML_DECLARATION = "<?xml version='1.0' encoding='utf-8'?>"
def __init__(
self,
name: str = '',
script: str = '',
numpad_script: str = '',
comment: str = '',
) -> None:
"""
:param comment: MUST be a valid XML comment wrapped in <!-- tags -->
"""
attrs = {}
if name:
attrs['name'] = name
if script:
attrs['script'] = script
if numpad_script:
attrs['numpad_script'] = numpad_script
self._comment = None
if comment:
self._comment = comment.strip() or None
self._xml_keyboard = ElementTree.Element('keyboard', attrib=attrs)
self._modmap = ElementTree.Element('modmap')
@staticmethod
def _parse_reference_layout() -> list[ElementTree.Element]:
return ElementTree.parse(REFERENCE_LAYOUT_FILE).findall('row')
@staticmethod
def _move_untransited_to_new_map(
ref_map: KeysMapType,
new_map: KeysMapType
) -> None:
coordinates = [
(row_num, key_num)
for row_num in range(len(ref_map))
for key_num in range(len(ref_map[row_num]))
]
for row_num, key_num in coordinates:
old_key = ref_map[row_num][key_num]
new_key = new_map[row_num][key_num]
for k, val in old_key.attrib.items():
if (transited := new_key.attrib.get(k)) is not None:
msg = (
f'Transition of {transited} to'
f' {new_key.get(Placement.C)}:{k} conflictls with'
f' existing value "{val}"')
raise LayoutGenError(msg)
new_key.set(k, val)
@staticmethod
def _add_extra_chars_to_ref_map(
coord_map: dict[str, tuple[int, int]],
new_map: KeysMapType
) -> None:
for char, (to_key_name, to_plc) in CHARS_EXTRA.items():
if not (to_coord := coord_map.get(to_key_name)):
msg = f'Trying to add "{char}" to missing key "{to_key_name}"'
raise LayoutGenError(msg)
row_num, key_num = to_coord
key = new_map[row_num][key_num]
if (existing := key.get(to_plc)) is not None:
msg = f'Trying to add char to <{to_key_name}:{to_plc}>, but already contains "{existing}"'
raise LayoutGenError(msg)
key.set(to_plc, char)
LOGGER.info(
'Added "%s" to <%s:%s>',
char, to_key_name, to_plc)
@classmethod
def _apply_transitions(cls, ref_map: list) -> list:
coord_map: dict[str, tuple[int, int]] = {}
coordinates = [
(row_num, key_num)
for row_num in range(len(ref_map))
for key_num in range(len(ref_map[row_num]))
]
for row_num, key_num in coordinates:
row = ref_map[row_num]
key = row[key_num]
key_name = key.get(Placement.C)
if key_name in coord_map:
msg = f'Duplicated value "{key_name}" in central position'
raise LayoutGenError(msg)
coord_map[key_name] = (row_num, key_num)
# Make new map with empty keys
result_map = [[ElementTree.Element('key') for key in row] for row in ref_map]
# Place by transitions map on new places
for (from_key_name, from_plc), (to_key_name, to_plc) in TRANSITIONS_MAP.items():
if Placement.C in (from_plc, to_plc):
raise NotImplementedError('Transition from or to placment "c"')
if not (from_coord := coord_map.get(from_key_name)):
raise LayoutGenError(f'Transition from missing key {from_key_name}')
if not (to_coord := coord_map.get(to_key_name)):
raise LayoutGenError(f'Transition to missing key {to_key_name}')
from_key = ref_map[from_coord[0]][from_coord[1]]
to_key = result_map[to_coord[0]][to_coord[1]]
try:
val = from_key.attrib.pop(from_plc)
except KeyError:
msg = f'No value in key {from_key_name}, placement {from_plc} to move'
raise LayoutGenError(msg)
if to_plc is not None:
if to_key.get(to_plc):
msg = f'Second transition to key {to_key_name}, placement {to_plc}'
raise LayoutGenError(msg)
to_key.set(to_plc, val)
LOGGER.info(
'Moved "%s" from <%s:%s> to <%s:%s>',
val, from_key_name, from_plc, to_key_name, to_plc)
else:
LOGGER.info(
'Deleted "%s" from <%s:%s>',
val, from_key_name, from_plc)
# Fill new map with other values
cls._move_untransited_to_new_map(ref_map, new_map=result_map)
# Add additional characters
cls._add_extra_chars_to_ref_map(coord_map, new_map=result_map)
return result_map
@staticmethod
def _resolve_placement(
key: ElementTree.Element,
placement: Placement,
new_char: str
) -> None:
if placement != Placement.C:
central_char = key.get(Placement.C)
existing = key.get(placement)
if existing:
LOGGER.warning(
'Placement %s of key %s already occupied with %s',
placement, central_char, existing)
key.set(placement, new_char)
def _process_key(self, key: ElementTree.Element) -> ElementTree.Element:
central_char = key.get(Placement.C)
if not central_char:
return key
new_key_entry = KEYS_MAP.get(central_char)
if new_key_entry is None:
return key
for level, placement_spec in LEVELS_MAP.items():
if not (new_char := new_key_entry[level]):
continue
if '+' in placement_spec:
pair = placement_spec.split('+')
from_level, modkey = int(pair[0]), pair[1]
key_a = new_key_entry[from_level]
key_b = new_char
if key_a is None:
raise LayoutGenError(f'Tried to modife {key_a} to {key_b}')
ElementTree.SubElement(self._modmap, modkey, a=key_a, b=key_b)
else:
placement = Placement(placement_spec)
self._resolve_placement(key, placement=placement, new_char=new_char)
return key
@staticmethod
def _make_extra_modmap(modmap: ElementTree.Element) -> ElementTree.Element:
for modkey, ab_map in MODMAP_EXTRA.items():
for a, b in ab_map.items():
LOGGER.info('Adding modmap %s "%s" -> "%s"', modkey, a, b)
ElementTree.SubElement(modmap, modkey, a=a, b=b)
return modmap
@staticmethod
def _post_escape(data: str) -> str:
buf = ''
lines = data.splitlines(keepends=True)
for line in lines:
# Skip keyboard tag line to keep attributes
if '<keyboard ' in line:
buf += line
continue
for ch in line:
if is_in_escape_list(ch):
ch = xml_encode_char(ch)
buf += ch
return buf
def build(self) -> None:
raw_ref_rows = self._parse_reference_layout()
ref_rows = self._apply_transitions(raw_ref_rows)
for row in ref_rows:
new_row = ElementTree.SubElement(self._xml_keyboard, 'row')
for key in row:
LOGGER.debug(
'Processing reference entry %s',
xml_elem_to_str(key))
new_row.append(self._process_key(key))
self._modmap = self._make_extra_modmap(self._modmap)
self._xml_keyboard.append(self._modmap)
def get_xml(self) -> str:
ElementTree.indent(self._xml_keyboard)
body_raw = xml_elem_to_str(self._xml_keyboard)
body = self._post_escape(body_raw)
result = self.XML_DECLARATION + '\n'
if self._comment:
result += self._comment + '\n'
result += body + '\n'
return result
def get_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
prog='gen_sinhala_phonetic_layout',
description='Generate XKB-based Sinhala layout',)
parser.add_argument(
'-o',
'--output',
default=BASE_DIR / f'srcs/layouts/{LAYOUT_FILENAME}',
help='File to write result, `-` for stdout')
parser.add_argument(
'-v',
'--verbose',
help='More verbose logging',
action='store_true')
return parser.parse_args()
if __name__ == '__main__':
args = get_args()
logging.basicConfig(
level=logging.DEBUG if args.verbose else logging.WARNING,
format='%(levelname)s: %(message)s')
builder = LayoutBuilder(name='සිංහල', script='sinhala', comment=COMMENT)
builder.build()
content = builder.get_xml()
if args.output == '-':
print(content)
else:
with open(args.output, 'w') as file:
file.write(content)

View File

@@ -1,3 +1,3 @@
org.gradle.jvmargs=-Dfile.encoding=UTF-8 org.gradle.jvmargs=-Dfile.encoding=UTF-8
android.useAndroidX=true android.useAndroidX=false
android.nonTransitiveRClass=true android.nonTransitiveRClass=true

View File

@@ -1,6 +1,6 @@
#Mon Aug 21 18:13:41 CEST 2023 #Mon Aug 21 18:13:41 CEST 2023
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -3,15 +3,28 @@
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector android:name="vector" android:width="35dp" android:height="40dp" android:viewportWidth="35" android:viewportHeight="40"> <vector android:name="vector" android:width="35dp" android:height="40dp" android:viewportWidth="35" android:viewportHeight="40">
<path android:name="trace" android:pathData="M 17.5 20 C 20 3 26 7 27.5 10" android:strokeColor="#09b3f1" android:strokeWidth="2" android:strokeLineCap="round"/> <path android:name="trace" android:pathData="M 17.5 20 C 20 3 26 7 27.5 10" android:strokeColor="#09b3f1" android:strokeWidth="2" android:strokeLineCap="round"/>
<group android:name="pointer_g" android:translateX="27" android:translateY="10"> <group android:name="pointer_g">
<path android:name="pointer" android:pathData="m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0" android:fillColor="#09b3f1" android:strokeColor="#09b3f1" android:strokeWidth="2"/> <path android:name="pointer" android:pathData="m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0" android:fillColor="#09b3f1" android:strokeColor="#09b3f1" android:strokeWidth="2" android:fillAlpha="0" android:strokeAlpha="0"/>
</group> </group>
</vector> </vector>
</aapt:attr> </aapt:attr>
<target android:name="trace"> <target android:name="trace">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator android:propertyName="strokeAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator android:propertyName="trimPathEnd" android:duration="700" android:valueFrom="0" android:valueTo="1" android:interpolator="@android:interpolator/linear_out_slow_in"/> <objectAnimator android:propertyName="trimPathEnd" android:duration="700" android:valueFrom="0" android:valueTo="1" android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
</set>
</aapt:attr>
</target>
<target android:name="pointer">
<aapt:attr name="android:animation">
<set>
<objectAnimator android:propertyName="fillAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator android:propertyName="fillAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>

View File

@@ -2,14 +2,31 @@
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector android:name="vector" android:width="35dp" android:height="40dp" android:viewportWidth="35" android:viewportHeight="40"> <vector android:name="vector" android:width="35dp" android:height="40dp" android:viewportWidth="35" android:viewportHeight="40">
<path android:name="trace" android:pathData="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31,4" android:fillColor="#09b3f1" android:strokeColor="#09b3f1" android:strokeWidth="2" android:strokeLineCap="round"/> <path android:name="trace" android:pathData="M 0 0" android:fillColor="#09b3f1" android:strokeColor="#09b3f1" android:strokeWidth="2" android:strokeLineCap="round"/>
</vector> </vector>
</aapt:attr> </aapt:attr>
<target android:name="trace"> <target android:name="trace">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator android:propertyName="pathData" android:duration="350" android:valueFrom="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 17.5,20.0" android:valueTo="M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31,4" android:valueType="pathType" android:interpolator="@android:interpolator/linear_out_slow_in"/> <objectAnimator android:propertyName="fillAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator android:propertyName="pathData" android:startOffset="400" android:duration="800" android:valueFrom="M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31,4" android:valueTo="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31,4" android:valueType="pathType" android:interpolator="@android:interpolator/linear_out_slow_in"/> <objectAnimator android:propertyName="strokeAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator
android:propertyName="pathData"
android:duration="350"
android:valueFrom="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 17.5,20.0"
android:valueTo="M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31,4"
android:valueType="pathType"
android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator
android:propertyName="pathData"
android:startOffset="400"
android:duration="800"
android:valueFrom="M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31,4"
android:valueTo="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31,4"
android:valueType="pathType"
android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator android:propertyName="fillAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>

View File

@@ -2,13 +2,23 @@
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable"> <aapt:attr name="android:drawable">
<vector android:name="vector" android:width="35dp" android:height="40dp" android:viewportWidth="35" android:viewportHeight="40"> <vector android:name="vector" android:width="35dp" android:height="40dp" android:viewportWidth="35" android:viewportHeight="40">
<path android:name="trace" android:pathData=" M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31 ,4" android:fillColor="#09b3f1" android:strokeColor="#09b3f1" android:strokeWidth="2" android:strokeLineCap="round"/> <path android:name="trace" android:pathData="M 0 0" android:fillColor="#09b3f1" android:strokeColor="#09b3f1" android:strokeWidth="2" android:strokeLineCap="round"/>
</vector> </vector>
</aapt:attr> </aapt:attr>
<target android:name="trace"> <target android:name="trace">
<aapt:attr name="android:animation"> <aapt:attr name="android:animation">
<set> <set>
<objectAnimator android:propertyName="pathData" android:duration="700" android:valueFrom="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 17.5,20.0" android:valueTo=" M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31 ,4" android:valueType="pathType" android:interpolator="@android:interpolator/linear_out_slow_in"/> <objectAnimator android:propertyName="fillAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:duration="100" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:interpolator="@android:interpolator/fast_out_slow_in"/>
<objectAnimator
android:propertyName="pathData"
android:duration="700"
android:valueFrom="M 17.5 20.0 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 17.5,20.0"
android:valueTo=" M 31 4 m 2,0 a 2,2 0 1,1 -4,0 a 2,2 0 1,1 4,0 M 17.5 20.0 L 31 ,4"
android:valueType="pathType"
android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator android:propertyName="fillAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
<objectAnimator android:propertyName="strokeAlpha" android:startOffset="900" android:duration="400" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:interpolator="@android:interpolator/linear_out_slow_in"/>
</set> </set>
</aapt:attr> </aapt:attr>
</target> </target>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Klávesnice Unexpected</string> <string name="app_name_release">Klávesnice Unexpected</string>
<string name="app_name_debug">Klávesnice Unexpected (pro ladění)</string> <string name="app_name_debug">Klávesnice Unexpected (pro ladění)</string>
<string name="short_description">Nenáročná virtuální klávesnice pro vývojáře.</string> <string name="short_description">Nenáročná virtuální klávesnice pro vývojáře.</string>
<string name="store_description">Hlavní funkcí je možnost psát více znaků posunutím kláves směrem k rohům.\n\nTato aplikace byla původně navržena pro programátory používající Termux.\nNyní je ideální pro každodenní použití.\n\nTato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je Open Source.</string> <string name="store_description">"Hlavní funkcí je možnost psát více znaků posunutím kláves směrem k rohům.
<string name="pref_portrait">V režimu na výšku</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Tato aplikace byla původně navržena pro programátory používající Termux.
<string name="pref_landscape">V režimu na šířku</string> Nyní je ideální pro každodenní použití.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Rozvržení</string> Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je Open Source."</string>
<string name="pref_label_brightness">Upravit jas nápisu</string> <string name="settings_activity_label">Nastavení Klávesnice Unexpected</string>
<string name="pref_keyboard_opacity">Upravit průhlednost pozadí klávesnice</string> <string name="pref_portrait">V režimu na výšku</string>
<string name="pref_key_opacity">Upravit průhlednost kláves</string> <string name="pref_landscape">V režimu na šířku</string>
<string name="pref_key_activated_opacity">Upravit průhlednost stisknutých kláves</string> <string name="pref_category_layout">Rozvržení</string>
<string name="pref_layout_e_system">Dle nastavení systému</string> <string name="pref_label_brightness">Upravit jas nápisu</string>
<string name="pref_layout_e_custom">Vlastní rozvržení</string> <string name="pref_keyboard_opacity">Upravit průhlednost pozadí klávesnice</string>
<string name="pref_layouts_add">Přidat alternativní rozložení</string> <string name="pref_key_opacity">Upravit průhlednost kláves</string>
<string name="pref_layouts_item">Rozložení %1$d: %2$s</string> <string name="pref_key_activated_opacity">Upravit průhlednost stisknutých kláves</string>
<string name="pref_layouts_remove_custom">Odebrat rozložení</string> <string name="pref_layout_e_system">Dle nastavení systému</string>
<string name="pref_custom_layout_title">Vlastní rozložení</string> <string name="pref_layout_e_custom">Vlastní rozvržení</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">Přidat alternativní rozložení</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">Rozložení %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">Odebrat rozložení</string>
<string name="pref_show_numpad_title">Zobrazit NumPad</string> <string name="pref_custom_layout_title">Vlastní rozložení</string>
<string name="pref_show_numpad_never">Nikdy</string> <string name="pref_show_numpad_title">Zobrazit NumPad</string>
<string name="pref_show_numpad_landscape">Pouze v režimu na šířku</string> <string name="pref_show_numpad_never">Nikdy</string>
<string name="pref_show_numpad_always">Vždy</string> <string name="pref_show_numpad_landscape">Pouze v režimu na šířku</string>
<string name="pref_number_row_title">Zobrazit řádek s čísly</string> <string name="pref_show_numpad_always">Vždy</string>
<string name="pref_number_row_summary">Přidá řádek s čísly nad klávesnici, pokud je NumPad skrytý</string> <string name="pref_number_row_title">Zobrazit řádek s čísly</string>
<string name="pref_numpad_layout">Rozložení NumPadu</string> <string name="pref_number_row_summary">Přidá řádek s čísly nad klávesnici, pokud je NumPad skrytý</string>
<string name="pref_numpad_layout_e_high_first">Vyšší číslice jako první (horní řádek 789)</string> <string name="pref_numpad_layout">Rozložení NumPadu</string>
<string name="pref_numpad_layout_e_low_first">Nižší číslice jako první (horní řádek 123)</string> <string name="pref_numpad_layout_e_high_first">Vyšší číslice jako první (horní řádek 789)</string>
<string name="pref_extra_keys_title">Přidat klávesy do klávesnice</string> <string name="pref_numpad_layout_e_low_first">Nižší číslice jako první (horní řádek 123)</string>
<string name="pref_extra_keys_custom">Přidat vlastní klávesy</string> <string name="pref_extra_keys_title">Přidat klávesy do klávesnice</string>
<string name="pref_extra_keys_internal">Výbrané klávesy k přidaní do klávesnice</string> <string name="pref_extra_keys_custom">Přidat vlastní klávesy</string>
<string name="pref_category_typing">Psaní</string> <string name="pref_extra_keys_internal">Výbrané klávesy k přidaní do klávesnice</string>
<string name="pref_swipe_dist_title">Vzdálenost posunutí prstem</string> <string name="pref_category_typing">Psaní</string>
<string name="pref_swipe_dist_summary">Jak daleko je třeba posunout prst pro zadání znaku/znaménka v rohu klávey (%s)</string> <string name="pref_swipe_dist_title">Vzdálenost posunutí prstem</string>
<string name="pref_long_timeout_title">Doba pro aktivaci dlouhého podržení</string> <string name="pref_swipe_dist_summary">Jak daleko je třeba posunout prst pro zadání znaku/znaménka v rohu klávey (%s)</string>
<string name="pref_long_interval_title">Interval opakování znaků</string> <string name="pref_long_timeout_title">Doba pro aktivaci dlouhého podržení</string>
<string name="pref_keyrepeat_enabled">Opakování kláves při držení</string> <string name="pref_long_interval_title">Interval opakování znaků</string>
<string name="pref_lock_double_tap_title">Dvojklik pro aktivaci Capslock(u)</string> <string name="pref_keyrepeat_enabled">Opakování kláves při držení</string>
<string name="pref_lock_double_tap_summary">Umožňuje zamknout Shift dvojklikem, namísto podržení</string> <string name="pref_lock_double_tap_title">Dvojklik pro aktivaci Capslock(u)</string>
<string name="pref_category_behavior">Chová</string> <string name="pref_lock_double_tap_summary">Umožňuje zamknout Shift dvojklikem, namísto podrže</string>
<string name="pref_autocapitalisation_title">Automatická kapitalizace</string> <string name="pref_category_behavior">Chování</string>
<string name="pref_autocapitalisation_summary">Stiskne Shift na začátku věty</string> <string name="pref_autocapitalisation_title">Automatická kapitalizace</string>
<string name="pref_switch_input_immediate_title">Přepnout na posledně užívanou klávesnici</string> <string name="pref_autocapitalisation_summary">Stiskne Shift na začátku věty</string>
<string name="pref_switch_input_immediate_summary">Jak bude klávesa pro přepnutí klávesnice reagovat</string> <string name="pref_switch_input_immediate_title">Přepnout na posledně užívanou klávesnici</string>
<string name="pref_vibrate_custom">Vlastní vibrace</string> <string name="pref_switch_input_immediate_summary">Jak bude klávesa pro přepnutí klávesnice reagovat</string>
<string name="pref_vibrate_duration_title">Síla vibrace</string> <string name="pref_vibrate_custom">Vlastní vibrace</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">Síla vibrace</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">Rozvržení zadávání PIN kódu</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">Automaticky při psaní čísel, datumů a telefonních čísel</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Styl</string>
<string name="pref_category_style">Styl</string> <string name="pref_margin_bottom_title">Spodní odsazení</string>
<string name="pref_margin_bottom_title">Spodní odsazení</string> <string name="pref_keyboard_height_title">Výška klávesnice</string>
<string name="pref_keyboard_height_title">Výška klávesnice</string> <string name="pref_horizontal_margin_title">Boční odsazení</string>
<string name="pref_horizontal_margin_title">Boční odsazení</string> <string name="pref_character_size_title">Velikost znaků</string>
<string name="pref_character_size_title">Velikost znaků</string> <string name="pref_character_size_summary">Velikost znaků zobrazených na klávesnici (%.2fx)</string>
<string name="pref_character_size_summary">Velikost znaků zobrazených na klávesnici (%.2fx)</string> <string name="pref_theme">Motiv</string>
<string name="pref_theme">Motiv</string> <string name="pref_theme_e_system">Dle systému</string>
<string name="pref_theme_e_system">Dle systému</string> <string name="pref_theme_e_dark">Tmavý</string>
<string name="pref_theme_e_dark">Tmavý</string> <string name="pref_theme_e_light">Světlý</string>
<string name="pref_theme_e_light">Světlý</string> <string name="pref_theme_e_black">Černý</string>
<string name="pref_theme_e_black">Černý</string> <string name="pref_theme_e_altblack">Černý (alternativní)</string>
<string name="pref_theme_e_altblack">Černý (alternativní)</string> <string name="pref_theme_e_white">Bílý</string>
<string name="pref_theme_e_white">Bílý</string> <string name="pref_theme_e_epaper">ePapír</string>
<string name="pref_theme_e_epaper">ePapír</string> <string name="pref_theme_e_desert">Poušťě</string>
<string name="pref_theme_e_desert">Poušťě</string> <string name="pref_theme_e_jungle">Džungle</string>
<string name="pref_theme_e_jungle">Džungle</string> <string name="pref_theme_e_monet">Monet (dle systému)</string>
<string name="pref_theme_e_monet">Monet (dle systému)</string> <string name="pref_theme_e_monetlight">Monet (Světlý)</string>
<string name="pref_theme_e_monetlight">Monet (Světlý)</string> <string name="pref_theme_e_monetdark">Monet (Tmavý)</string>
<string name="pref_theme_e_monetdark">Monet (Tmavý)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_theme_e_rosepine">Růžová borovice</string> <string name="pref_swipe_dist_e_very_short">Velmi krátká</string>
<string name="pref_swipe_dist_e_very_short">Velmi krátká</string> <string name="pref_swipe_dist_e_short">Krátká</string>
<string name="pref_swipe_dist_e_short">Krátká</string> <string name="pref_swipe_dist_e_default">Běžná</string>
<string name="pref_swipe_dist_e_default">Běžná</string> <string name="pref_swipe_dist_e_far">Dlouhá</string>
<string name="pref_swipe_dist_e_far">Dlouhá</string> <string name="pref_swipe_dist_e_very_far">Velmi dlouhá</string>
<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_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_key_vertical_space">Vertikální mezery mezi klávesami</string> <string name="pref_border_config_title">Přizpůsobit okraje</string>
<string name="pref_border_config_title">Přizpůsobit okraje</string> <string name="pref_border_width_title">Šířka okraje</string>
<string name="pref_border_width_title">Šířka okraje</string> <string name="pref_corners_radius_title">Poloměr okraje</string>
<string name="pref_corners_radius_title">Poloměr okraje</string> <string name="pref_circle_sensitivity_title">Citlivost kruhového gesta</string>
<string name="pref_circle_sensitivity_title">Citlivost kruhového gesta</string> <string name="pref_circle_sensitivity_e_high">Vysoká</string>
<string name="pref_circle_sensitivity_e_high">Vysoká</string> <string name="pref_circle_sensitivity_e_medium">Střední</string>
<string name="pref_circle_sensitivity_e_medium">Střední</string> <string name="pref_circle_sensitivity_e_low">Nízká</string>
<string name="pref_circle_sensitivity_e_low">Nízká</string> <string name="pref_circle_sensitivity_e_disabled">Deaktivováno</string>
<string name="pref_circle_sensitivity_e_disabled">Deaktivováno</string> <string name="key_action_next">Další</string>
<string name="key_action_next">Další</string> <string name="key_action_done">Dokončit</string>
<string name="key_action_done">Dokončit</string> <string name="key_action_go">Spustit</string>
<string name="key_action_go">Spustit</string> <string name="key_action_prev">Předchozí</string>
<string name="key_action_prev">Předchozí</string> <string name="key_action_search">Hledat</string>
<string name="key_action_search">Hledat</string> <string name="key_action_send">Odeslat</string>
<string name="key_action_send">Odeslat</string> <string name="launcher_button_imesettings">Aktivovat klávesnici</string>
<string name="launcher_button_imesettings">Aktivovat klávesnici</string> <string name="launcher_button_imepicker">Vybrat klávesnici</string>
<string name="launcher_button_imepicker">Vybrat klávesnici</string> <string name="launcher_description">Tato aplikace je pouhou virtuální klávesnicí. Přejděte do systémového nastavení, kliknutím na tlačítko níže a aktivujte ji.</string>
<string name="launcher_description">Tato aplikace je pouhou virtuální klávesnicí. Přejděte do systémového nastavení, kliknutím na tlačítko níže a aktivujte ji.</string> <string name="launcher_sourcecode">Toto je volná, open-source aplikace. Její zdrojový kód, či hlášení chyb, naleznete na Githubu.</string>
<string name="launcher_sourcecode">Toto je volná, open-source aplikace. Její zdrojový kód, či hlášení chyb, naleznete na Githubu.</string> <string name="launcher_tryhere">Po aktivaci můžete klávesnici rovnou vyzkoušet zde:</string>
<string name="launcher_tryhere">Po aktivaci můžete klávesnici rovnou vyzkoušet zde:</string> <string name="launcher_tryhere_hint">Zkoušejte zde</string>
<string name="launcher_tryhere_hint">Zkoušejte zde</string> <string name="key_descr_capslock">Caps lock</string>
<string name="key_descr_capslock">Caps lock</string> <string name="key_descr_compose">Compose</string>
<string name="key_descr_compose">Compose</string> <string name="key_descr_switch_greekmath">Řecké a matematické symboly</string>
<string name="key_descr_switch_greekmath">Řecké a matematické symboly</string> <string name="key_descr_change_method">Přepnout klávesnici</string>
<string name="key_descr_change_method">Přepnout klávesnici</string> <string name="key_descr_voice_typing">Hlasové zadávání</string>
<string name="key_descr_voice_typing">Hlasové zadávání</string> <string name="key_descr_copy">Kopírovat</string>
<string name="key_descr_copy">Kopírovat</string> <string name="key_descr_paste">Vložit</string>
<string name="key_descr_paste">Vložit</string> <string name="key_descr_cut">Vyjmout</string>
<string name="key_descr_cut">Vyjmout</string> <string name="key_descr_selectAll">Označit vše</string>
<string name="key_descr_selectAll">Označit vše</string> <string name="key_descr_shareText">Sdílet text</string>
<string name="key_descr_pasteAsPlainText">Vložit jako prostý text</string> <string name="key_descr_pasteAsPlainText">Vložit jako prostý text</string>
<string name="key_descr_undo">Zpět</string> <string name="key_descr_undo">Zpět</string>
<string name="key_descr_redo">Znovu</string> <string name="key_descr_redo">Znovu</string>
<string name="key_descr_ª">Indikátor řadové číslovky</string> <string name="key_descr_ª">Indikátor řadové číslovky</string>
<string name="key_descr_º">Indikátor řadové číslovky</string> <string name="key_descr_º">Indikátor řadové číslovky</string>
<string name="key_descr_superscript">Horní index</string> <string name="key_descr_superscript">Horní index</string>
<string name="key_descr_subscript">Dolní index</string> <string name="key_descr_subscript">Dolní index</string>
<string name="key_descr_page_up">Page Up</string> <string name="key_descr_page_up">Page Up</string>
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Správce schránky</string> <string name="key_descr_clipboard">Správce schránky</string>
<string name="key_descr_combining">Kombinace diakritiky</string> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="key_descr_dead_key">Mrtvá klávesa</string> <string name="clipboard_history_heading">Nedávno kopírovaný text</string>
<string name="key_descr_zwj">Spojka nulové šířky (ZWJ)</string> <string name="clipboard_pin_heading">Připnout</string>
<string name="key_descr_zwnj">ne-Spojka nulové šířky (ZWNJ)</string> <string name="clipboard_remove_confirm">Odebrat ze schránky?</string>
<string name="key_descr_nbsp">Nezlomitelná mezera</string> <string name="clipboard_remove_confirmed">Ano</string>
<string name="key_descr_nnbsp">Úzká nezlomitelná mezera</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Nedávno kopírovaný text</string>
<string name="clipboard_pin_heading">Připnout</string>
<string name="clipboard_remove_confirm">Odebrat ze schránky?</string>
<string name="clipboard_remove_confirmed">Ano</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (Debug)</string> <string name="app_name_debug">Unexpected Keyboard (Debug)</string>
<string name="short_description">Eine schlanke, datenschutzfreundliche Bildschirmtastatur für Android.</string> <string name="short_description">Eine schlanke, datenschutzfreundliche Bildschirmtastatur für Android.</string>
<string name="store_description">Diese Tastatur zeichnet sich dadurch aus, dass man zusätzliche Zeichen durch Wischgesten in Richtung der Tastenecken eingeben kann.\n\nDie Anwendung wurde ursprünglich für das Programmieren in Termux entwickelt.\nMittlerweile ist sie auch für den täglichen Gebrauch perfekt geeignet.\n\nDiese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quelloffen.</string> <string name="store_description">"Diese Tastatur zeichnet sich dadurch aus, dass man zusätzliche Zeichen durch Wischgesten in Richtung der Tastenecken eingeben kann.
<string name="pref_portrait">Im Hochformatmodus</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Die Anwendung wurde ursprünglich für das Programmieren in Termux entwickelt.
<string name="pref_landscape">Im Querformatmodus</string> Mittlerweile ist sie auch für den täglichen Gebrauch perfekt geeignet.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Layout</string> Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quelloffen."</string>
<string name="pref_label_brightness">Helligkeit der Beschriftung anpassen</string> <string name="settings_activity_label">Unexpected Keyboard - Einstellungen</string>
<string name="pref_keyboard_opacity">Deckkraft des Tastaturhintergrunds anpassen</string> <string name="pref_portrait">Im Hochformatmodus</string>
<string name="pref_key_opacity">Deckkraft der Tasten anpassen</string> <string name="pref_landscape">Im Querformatmodus</string>
<string name="pref_key_activated_opacity">Deckkraft gedrückter Tasten anpassen</string> <string name="pref_category_layout">Layout</string>
<string name="pref_layout_e_system">Systemeinstellung</string> <string name="pref_label_brightness">Helligkeit der Beschriftung anpassen</string>
<string name="pref_layout_e_custom">Eigenes Layout</string> <string name="pref_keyboard_opacity">Deckkraft des Tastaturhintergrunds anpassen</string>
<string name="pref_layouts_add">Alternatives Layout hinzufügen</string> <string name="pref_key_opacity">Deckkraft der Tasten anpassen</string>
<string name="pref_layouts_item">Layout %1$d: %2$s</string> <string name="pref_key_activated_opacity">Deckkraft gedrückter Tasten anpassen</string>
<string name="pref_layouts_remove_custom">Layout entfernen</string> <string name="pref_layout_e_system">Systemeinstellung</string>
<string name="pref_custom_layout_title">Eigenes Layout</string> <string name="pref_layout_e_custom">Eigenes Layout</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">Alternatives Layout hinzufügen</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">Layout %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">Layout entfernen</string>
<string name="pref_show_numpad_title">Ziffernblock anzeigen</string> <string name="pref_custom_layout_title">Eigenes Layout</string>
<string name="pref_show_numpad_never">Nie</string> <string name="pref_show_numpad_title">Ziffernblock anzeigen</string>
<string name="pref_show_numpad_landscape">Nur im Querformat</string> <string name="pref_show_numpad_never">Nie</string>
<string name="pref_show_numpad_always">Immer</string> <string name="pref_show_numpad_landscape">Nur im Querformat</string>
<string name="pref_number_row_title">Zahlenreihe anzeigen</string> <string name="pref_show_numpad_always">Immer</string>
<string name="pref_number_row_summary">Eine Zahlenreihe oben an der Tastatur hinzufügen, wenn der Ziffernblock ausgeblendet ist</string> <string name="pref_number_row_title">Zahlenreihe anzeigen</string>
<string name="pref_numpad_layout">Zahlenblock-Layout</string> <string name="pref_number_row_summary">Eine Zahlenreihe oben an der Tastatur hinzufügen, wenn der Ziffernblock ausgeblendet ist</string>
<string name="pref_numpad_layout_e_high_first">Hohe Ziffern zuerst</string> <string name="pref_numpad_layout">Zahlenblock-Layout</string>
<string name="pref_numpad_layout_e_low_first">Niedrige Ziffern zuerst</string> <string name="pref_numpad_layout_e_high_first">Hohe Ziffern zuerst</string>
<string name="pref_extra_keys_title">Zusätzliche Zeichen zur Tastatur hinzufügen</string> <string name="pref_numpad_layout_e_low_first">Niedrige Ziffern zuerst</string>
<string name="pref_extra_keys_custom">Benutzerdefinierte Tasten hinzufügen</string> <string name="pref_extra_keys_title">Zusätzliche Zeichen zur Tastatur hinzufügen</string>
<string name="pref_extra_keys_internal">Tasten auswählen, die der Tastatur hinzugefügt werden sollen</string> <string name="pref_extra_keys_custom">Benutzerdefinierte Tasten hinzufügen</string>
<string name="pref_category_typing">Tippen</string> <string name="pref_extra_keys_internal">Tasten auswählen, die der Tastatur hinzugefügt werden sollen</string>
<string name="pref_swipe_dist_title">Länge der Wischgeste</string> <string name="pref_category_typing">Tippen</string>
<string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string> <string name="pref_swipe_dist_title">Länge der Wischgeste</string>
<string name="pref_long_timeout_title">Zeitüberschreitung durch langes Drücken</string> <string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string>
<string name="pref_long_interval_title">Intervall der Tastenwiederholung</string> <string name="pref_long_timeout_title">Zeitüberschreitung durch langes Drücken</string>
<string name="pref_keyrepeat_enabled">Tastenwiederholung bei langem Drücken</string> <string name="pref_long_interval_title">Intervall der Tastenwiederholung</string>
<string name="pref_lock_double_tap_title">Umschalttaste mit Doppeltippen einrasten</string> <string name="pref_keyrepeat_enabled">Tastenwiederholung bei langem Drücken</string>
<string name="pref_lock_double_tap_summary">Anstatt Taste längere Zeit gedrückt zu halten</string> <string name="pref_lock_double_tap_title">Umschalttaste mit Doppeltippen einrasten</string>
<string name="pref_category_behavior">Verhalten</string> <string name="pref_lock_double_tap_summary">Anstatt Taste längere Zeit gedrückt zu halten</string>
<string name="pref_autocapitalisation_title">Automatische Großschreibung</string> <string name="pref_category_behavior">Verhalten</string>
<string name="pref_autocapitalisation_summary">Umschalttaste am Satzanfang aktivieren</string> <string name="pref_autocapitalisation_title">Automatische Großschreibung</string>
<string name="pref_switch_input_immediate_title">Sofort zur nächsten Tastatur wechseln</string> <string name="pref_autocapitalisation_summary">Umschalttaste am Satzanfang aktivieren</string>
<string name="pref_switch_input_immediate_summary">Verhalten der Tastaturumschalttaste</string> <string name="pref_switch_input_immediate_title">Sofort zur nächsten Tastatur wechseln</string>
<string name="pref_vibrate_custom">Benutzerdefinierte Vibration</string> <string name="pref_switch_input_immediate_summary">Verhalten der Tastaturumschalttaste</string>
<string name="pref_vibrate_duration_title">Vibrationsstärke</string> <string name="pref_vibrate_custom">Benutzerdefinierte Vibration</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">Vibrationsstärke</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">PIN-Eingabe-Layout</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">Für die Nummern-, Datums- und Telefonnummern-Eingabe</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Design</string>
<string name="pref_category_style">Design</string> <string name="pref_margin_bottom_title">Unterer Abstand</string>
<string name="pref_margin_bottom_title">Unterer Abstand</string> <string name="pref_keyboard_height_title">Höhe der Tastatur</string>
<string name="pref_keyboard_height_title">Höhe der Tastatur</string> <string name="pref_horizontal_margin_title">Horizontaler Abstand</string>
<string name="pref_horizontal_margin_title">Horizontaler Abstand</string> <string name="pref_character_size_title">Größe der Beschriftung</string>
<string name="pref_character_size_title">Größe der Beschriftung</string> <string name="pref_character_size_summary">Größe der Buchstaben auf den Tasten (%.2fx)</string>
<string name="pref_character_size_summary">Größe der Buchstaben auf den Tasten (%.2fx)</string> <string name="pref_theme">Thema</string>
<string name="pref_theme">Thema</string> <string name="pref_theme_e_system">Systemeinstellung</string>
<string name="pref_theme_e_system">Systemeinstellung</string> <string name="pref_theme_e_dark">Dunkel</string>
<string name="pref_theme_e_dark">Dunkel</string> <string name="pref_theme_e_light">Hell</string>
<string name="pref_theme_e_light">Hell</string> <string name="pref_theme_e_black">Schwarz</string>
<string name="pref_theme_e_black">Schwarz</string> <string name="pref_theme_e_altblack">Alternatives Schwarz</string>
<string name="pref_theme_e_altblack">Alternatives Schwarz</string> <string name="pref_theme_e_white">Weiß</string>
<string name="pref_theme_e_white">Weiß</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_desert">Wüste</string>
<string name="pref_theme_e_desert">Wüste</string> <string name="pref_theme_e_jungle">Dschungel</string>
<string name="pref_theme_e_jungle">Dschungel</string> <string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monet">Monet (System)</string> <string name="pref_theme_e_monetlight">Monet (Hell)</string>
<string name="pref_theme_e_monetlight">Monet (Hell)</string> <string name="pref_theme_e_monetdark">Monet (Dunkel)</string>
<string name="pref_theme_e_monetdark">Monet (Dunkel)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> --> <string name="pref_swipe_dist_e_very_short">Sehr kurz</string>
<string name="pref_swipe_dist_e_very_short">Sehr kurz</string> <string name="pref_swipe_dist_e_short">Kurz</string>
<string name="pref_swipe_dist_e_short">Kurz</string> <string name="pref_swipe_dist_e_default">Normal</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_far">Weit</string>
<string name="pref_swipe_dist_e_far">Weit</string> <string name="pref_swipe_dist_e_very_far">Sehr weit</string>
<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_horizontal_space">Horizontaler Abstand zwischen den Tasten</string> <string name="pref_key_vertical_space">Vertikaler Abstand zwischen den Tasten</string>
<string name="pref_key_vertical_space">Vertikaler Abstand zwischen den Tasten</string> <string name="pref_border_config_title">Ränder anpassen</string>
<string name="pref_border_config_title">Ränder anpassen</string> <string name="pref_border_width_title">Randbreite</string>
<string name="pref_border_width_title">Randbreite</string> <string name="pref_corners_radius_title">Radius der Ecken</string>
<string name="pref_corners_radius_title">Radius der Ecken</string> <string name="pref_circle_sensitivity_title">Empfindlichkeit der Kreisgeste</string>
<string name="pref_circle_sensitivity_title">Empfindlichkeit der Kreisgeste</string> <string name="pref_circle_sensitivity_e_high">Hoch</string>
<string name="pref_circle_sensitivity_e_high">Hoch</string> <string name="pref_circle_sensitivity_e_medium">Mittel</string>
<string name="pref_circle_sensitivity_e_medium">Mittel</string> <string name="pref_circle_sensitivity_e_low">Niedrig</string>
<string name="pref_circle_sensitivity_e_low">Niedrig</string> <string name="pref_circle_sensitivity_e_disabled">Aus</string>
<string name="pref_circle_sensitivity_e_disabled">Aus</string> <string name="key_action_next">Nächstes</string>
<string name="key_action_next">Nächstes</string> <string name="key_action_done">Fertig</string>
<string name="key_action_done">Fertig</string> <string name="key_action_go">Los</string>
<string name="key_action_go">Los</string> <string name="key_action_prev">Vorheriges</string>
<string name="key_action_prev">Vorheriges</string> <string name="key_action_search">Suchen</string>
<string name="key_action_search">Suchen</string> <string name="key_action_send">Senden</string>
<string name="key_action_send">Senden</string> <string name="launcher_button_imesettings">Tastatur aktivieren</string>
<string name="launcher_button_imesettings">Tastatur aktivieren</string> <string name="launcher_button_imepicker">Tastatur auswählen</string>
<string name="launcher_button_imepicker">Tastatur auswählen</string> <string name="launcher_description">Diese App ist eine virtuelle Tastatur. Tippe auf den Button unten und aktivere Unexpected Keyboard in den Systemeinstellungen.</string>
<string name="launcher_description">Diese App ist eine virtuelle Tastatur. Tippe auf den Button unten und aktivere Unexpected Keyboard in den Systemeinstellungen.</string> <string name="launcher_sourcecode">Dies ist eine freie und quelloffene App. Du findest den Quellcode auf Github. Dort können auch Bugs gemeldet werden.</string>
<string name="launcher_sourcecode">Dies ist eine freie und quelloffene App. Du findest den Quellcode auf Github. Dort können auch Bugs gemeldet werden.</string> <string name="launcher_tryhere">Nach Aktivierung kannst du die Tastatur hier ausprobieren:</string>
<string name="launcher_tryhere">Nach Aktivierung kannst du die Tastatur hier ausprobieren:</string> <string name="launcher_tryhere_hint">Hier ausprobieren</string>
<string name="launcher_tryhere_hint">Hier ausprobieren</string> <string name="key_descr_capslock">Feststelltaste</string>
<string name="key_descr_capslock">Feststelltaste</string> <string name="key_descr_compose">Compose-Taste</string>
<string name="key_descr_compose">Compose-Taste</string> <string name="key_descr_switch_greekmath">Griechische &amp; mathematische Symbole</string>
<string name="key_descr_switch_greekmath">Griechische &amp; mathematische Symbole</string> <string name="key_descr_change_method">Tastatur wechseln</string>
<string name="key_descr_change_method">Tastatur wechseln</string> <string name="key_descr_voice_typing">Spracheingabe</string>
<string name="key_descr_voice_typing">Spracheingabe</string> <string name="key_descr_copy">Kopieren</string>
<string name="key_descr_copy">Kopieren</string> <string name="key_descr_paste">Einfügen</string>
<string name="key_descr_paste">Einfügen</string> <string name="key_descr_cut">Ausschneiden</string>
<string name="key_descr_cut">Ausschneiden</string> <string name="key_descr_selectAll">Alles auswählen</string>
<string name="key_descr_selectAll">Alles auswählen</string> <string name="key_descr_shareText">Text teilen</string>
<string name="key_descr_pasteAsPlainText">Unformatiert einfügen</string> <string name="key_descr_pasteAsPlainText">Unformatiert einfügen</string>
<string name="key_descr_undo">Rückgängig</string> <string name="key_descr_undo">Rückgängig</string>
<string name="key_descr_redo">Wiederholen</string> <string name="key_descr_redo">Wiederholen</string>
<string name="key_descr_ª">Ordinalzeichen</string> <string name="key_descr_ª">Ordinalzeichen</string>
<string name="key_descr_º">Ordinalzeichen</string> <string name="key_descr_º">Ordinalzeichen</string>
<string name="key_descr_superscript">Hochgestellt</string> <string name="key_descr_superscript">Hochgestellt</string>
<string name="key_descr_subscript">Tiefgestellt</string> <string name="key_descr_subscript">Tiefgestellt</string>
<string name="key_descr_page_up">Bild auf</string> <string name="key_descr_page_up">Bild auf</string>
<string name="key_descr_page_down">Bild ab</string> <string name="key_descr_page_down">Bild ab</string>
<string name="key_descr_home">Pos1</string> <string name="key_descr_home">Pos1</string>
<string name="key_descr_end">Ende</string> <string name="key_descr_end">Ende</string>
<string name="key_descr_clipboard">Clipboard-Manager</string> <string name="key_descr_clipboard">Clipboard-Manager</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> --> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="key_descr_dead_key">Dead key</string> --> <string name="clipboard_history_heading">Zuletzt kopierter Text</string>
<!-- <string name="key_descr_zwj">Zero width joiner</string> --> <string name="clipboard_pin_heading">Angeheftet</string>
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> --> <string name="clipboard_remove_confirm">Aus der Zwischenablage entfernen?</string>
<!-- <string name="key_descr_nbsp">Non-breaking space</string> --> <string name="clipboard_remove_confirmed">Ja</string>
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Zuletzt kopierter Text</string>
<string name="clipboard_pin_heading">Angeheftet</string>
<!-- <string name="clipboard_remove_confirm">Remove this clipboard item?</string> -->
<string name="clipboard_remove_confirmed">Ja</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (debug)</string> <string name="app_name_debug">Unexpected Keyboard (debug)</string>
<string name="short_description">Un teclado virtual ligero para Android consciente de su privacidad.</string> <string name="short_description">Un teclado virtual ligero para Android consciente de su privacidad.</string>
<string name="store_description">La característica principal es que hay acceso a más caractéres deslizando hacia las esquinas de las teclas.\n\nEsta aplicación fue originalmente diseñada para programadores que usaran Termux.\nAhora es perfecta para uso cotidiano.\n\nLa misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta.</string> <string name="store_description">"La característica principal es que hay acceso a más caractéres deslizando hacia las esquinas de las teclas.
<string name="pref_portrait">En modo vertical</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Esta aplicación fue originalmente diseñada para programadores que usaran Termux.
<string name="pref_landscape">En modo horizontal</string> Ahora es perfecta para uso cotidiano.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Distribución</string> La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta."</string>
<string name="pref_label_brightness">Ajustar brillo de etiqueta</string> <string name="settings_activity_label">Ajustes de Unexpected Keyboard</string>
<string name="pref_keyboard_opacity">Ajustar opacidad del fondo del teclado</string> <string name="pref_portrait">En modo vertical</string>
<string name="pref_key_opacity">Ajustar opacidad de teclas</string> <string name="pref_landscape">En modo horizontal</string>
<string name="pref_key_activated_opacity">Ajustar opacidad de teclas presionadas</string> <string name="pref_category_layout">Distribución</string>
<string name="pref_layout_e_system">Igual al sistema</string> <string name="pref_label_brightness">Ajustar brillo de etiqueta</string>
<string name="pref_layout_e_custom">Diseño personalizado</string> <string name="pref_keyboard_opacity">Ajustar opacidad del fondo del teclado</string>
<string name="pref_layouts_add">Añadir distribución alterna</string> <string name="pref_key_opacity">Ajustar opacidad de teclas</string>
<string name="pref_layouts_item">Diseño %1$d: %2$s</string> <string name="pref_key_activated_opacity">Ajustar opacidad de teclas presionadas</string>
<string name="pref_layouts_remove_custom">Quitar diseño</string> <string name="pref_layout_e_system">Igual al sistema</string>
<string name="pref_custom_layout_title">Diseño personalizado</string> <string name="pref_layout_e_custom">Diseño personalizado</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">Añadir distribución alterna</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">Diseño %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">Quitar diseño</string>
<string name="pref_show_numpad_title">Mostrar teclado numérico</string> <string name="pref_custom_layout_title">Diseño personalizado</string>
<string name="pref_show_numpad_never">Nunca</string> <string name="pref_show_numpad_title">Mostrar teclado numérico</string>
<string name="pref_show_numpad_landscape">Solo en modo horizontal</string> <string name="pref_show_numpad_never">Nunca</string>
<string name="pref_show_numpad_always">Siempre</string> <string name="pref_show_numpad_landscape">Solo en modo horizontal</string>
<string name="pref_number_row_title">Mostrar fila de números</string> <string name="pref_show_numpad_always">Siempre</string>
<string name="pref_number_row_summary">Agrega la fila numérica a la parte superior del teclado si el teclado numérico está oculto</string> <string name="pref_number_row_title">Mostrar fila de números</string>
<string name="pref_numpad_layout">Diseño del teclado numérico</string> <string name="pref_number_row_summary">Agrega la fila numérica a la parte superior del teclado si el teclado numérico está oculto</string>
<string name="pref_numpad_layout_e_high_first">Dígitos descendientes</string> <string name="pref_numpad_layout">Diseño del teclado numérico</string>
<string name="pref_numpad_layout_e_low_first">Dígitos ascendientes</string> <string name="pref_numpad_layout_e_high_first">Dígitos descendientes</string>
<string name="pref_extra_keys_title">Agregar teclas</string> <string name="pref_numpad_layout_e_low_first">Dígitos ascendientes</string>
<string name="pref_extra_keys_custom">Agregar teclas personalizadas</string> <string name="pref_extra_keys_title">Agregar teclas</string>
<string name="pref_extra_keys_internal">Selecciona teclas para agregar al teclado</string> <string name="pref_extra_keys_custom">Agregar teclas personalizadas</string>
<string name="pref_category_typing">Escritura</string> <string name="pref_extra_keys_internal">Selecciona teclas para agregar al teclado</string>
<string name="pref_swipe_dist_title">Distancia de deslizamiento</string> <string name="pref_category_typing">Escritura</string>
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las teclas (%s)</string> <string name="pref_swipe_dist_title">Distancia de deslizamiento</string>
<string name="pref_long_timeout_title">Duración para toque largo</string> <string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las teclas (%s)</string>
<string name="pref_long_interval_title">Intervalo de repetición de tecla</string> <string name="pref_long_timeout_title">Duración para toque largo</string>
<string name="pref_keyrepeat_enabled">Permitir repetición de toque largo</string> <string name="pref_long_interval_title">Intervalo de repetición de tecla</string>
<string name="pref_lock_double_tap_title">Doble toque en Mayús para bloquear las mayúsculas</string> <string name="pref_keyrepeat_enabled">Permitir repetición de toque largo</string>
<string name="pref_lock_double_tap_summary">Se puede bloquear cualquier modificador manteniéndolo presionado</string> <string name="pref_lock_double_tap_title">Doble toque en Mayús para bloquear las mayúsculas</string>
<string name="pref_category_behavior">Comportamiento</string> <string name="pref_lock_double_tap_summary">Se puede bloquear cualquier modificador manteniéndolo presionado</string>
<string name="pref_autocapitalisation_title">Mayúsculas automáticas</string> <string name="pref_category_behavior">Comportamiento</string>
<string name="pref_autocapitalisation_summary">Presionar Mayús al principio de una oración</string> <string name="pref_autocapitalisation_title">Mayúsculas automáticas</string>
<string name="pref_switch_input_immediate_title">Cambiar al último teclado usado</string> <string name="pref_autocapitalisation_summary">Presionar Mayús al principio de una oración</string>
<string name="pref_switch_input_immediate_summary">Comportamiento de la tecla para cambiar diseño</string> <string name="pref_switch_input_immediate_title">Cambiar al último teclado usado</string>
<string name="pref_vibrate_custom">Vibración personalizada</string> <string name="pref_switch_input_immediate_summary">Comportamiento de la tecla para cambiar diseño</string>
<string name="pref_vibrate_duration_title">Intensidad de vibración</string> <string name="pref_vibrate_custom">Vibración personalizada</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">Intensidad de vibración</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">Diseño de introducción de PIN</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">Para escribir cifras, fechas y números telefónicos</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Estilo</string>
<string name="pref_category_style">Estilo</string> <string name="pref_margin_bottom_title">Margen inferior</string>
<string name="pref_margin_bottom_title">Margen inferior</string> <string name="pref_keyboard_height_title">Altura del teclado</string>
<string name="pref_keyboard_height_title">Altura del teclado</string> <string name="pref_horizontal_margin_title">Margen horizontal</string>
<string name="pref_horizontal_margin_title">Margen horizontal</string> <string name="pref_character_size_title">Tamaño de etiqueta</string>
<string name="pref_character_size_title">Tamaño de etiqueta</string> <string name="pref_character_size_summary">Tamaño de caracteres mostrados en el teclado (%.2fx)</string>
<string name="pref_character_size_summary">Tamaño de caracteres mostrados en el teclado (%.2fx)</string> <string name="pref_theme">Tema</string>
<string name="pref_theme">Tema</string> <string name="pref_theme_e_system">Igual al sistema</string>
<string name="pref_theme_e_system">Igual al sistema</string> <string name="pref_theme_e_dark">Oscuro</string>
<string name="pref_theme_e_dark">Oscuro</string> <string name="pref_theme_e_light">Claro</string>
<string name="pref_theme_e_light">Claro</string> <string name="pref_theme_e_black">Negro</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_white">Blanco</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_desert">Desierto</string>
<string name="pref_theme_e_desert">Desierto</string> <string name="pref_theme_e_jungle">Selva</string>
<string name="pref_theme_e_jungle">Selva</string> <string name="pref_theme_e_monet">Monet (de sistema)</string>
<string name="pref_theme_e_monet">Monet (de sistema)</string> <string name="pref_theme_e_monetlight">Monet (claro)</string>
<string name="pref_theme_e_monetlight">Monet (claro)</string> <string name="pref_theme_e_monetdark">Monet (oscuro)</string>
<string name="pref_theme_e_monetdark">Monet (oscuro)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> --> <string name="pref_swipe_dist_e_very_short">Muy corta</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_short">Corta</string> <string name="pref_swipe_dist_e_default">Normal</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_far">Larga</string>
<string name="pref_swipe_dist_e_far">Larga</string> <string name="pref_swipe_dist_e_very_far">Muy larga</string>
<string name="pref_swipe_dist_e_very_far">Muy larga</string> <string name="pref_key_horizontal_space">Espacio horizontal entre las teclas</string>
<string name="pref_key_horizontal_space">Espacio horizontal entre las teclas</string> <string name="pref_key_vertical_space">Espacio vertical entre las teclas</string>
<string name="pref_key_vertical_space">Espacio vertical entre las teclas</string> <string name="pref_border_config_title">Bordes personalizados</string>
<string name="pref_border_config_title">Bordes personalizados</string> <string name="pref_border_width_title">Ancho de bordes</string>
<string name="pref_border_width_title">Ancho de bordes</string> <string name="pref_corners_radius_title">Radio de rincones</string>
<string name="pref_corners_radius_title">Radio de rincones</string> <string name="pref_circle_sensitivity_title">Sensibilidad a gestos circulares</string>
<string name="pref_circle_sensitivity_title">Sensibilidad a gestos circulares</string> <string name="pref_circle_sensitivity_e_high">Alta</string>
<string name="pref_circle_sensitivity_e_high">Alta</string> <string name="pref_circle_sensitivity_e_medium">Mediana</string>
<string name="pref_circle_sensitivity_e_medium">Mediana</string> <string name="pref_circle_sensitivity_e_low">Baja</string>
<string name="pref_circle_sensitivity_e_low">Baja</string> <string name="pref_circle_sensitivity_e_disabled">Apagada</string>
<string name="pref_circle_sensitivity_e_disabled">Apagada</string> <string name="key_action_next">Siguiente</string>
<string name="key_action_next">Siguiente</string> <string name="key_action_done">Hecho</string>
<string name="key_action_done">Hecho</string> <string name="key_action_go">Ir</string>
<string name="key_action_go">Ir</string> <string name="key_action_prev">Anterior</string>
<string name="key_action_prev">Anterior</string> <string name="key_action_search">Buscar</string>
<string name="key_action_search">Buscar</string> <string name="key_action_send">Enviar</string>
<string name="key_action_send">Enviar</string> <string name="launcher_button_imesettings">Habilitar teclado</string>
<string name="launcher_button_imesettings">Habilitar teclado</string> <string name="launcher_button_imepicker">Seleccionar método de entrada</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_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="launcher_tryhere">Tras habilitarlo, puedes probar el teclado en este campo:</string> <string name="launcher_tryhere_hint">Intentar aquí</string>
<string name="launcher_tryhere_hint">Intentar aquí</string> <string name="key_descr_capslock">Bloq Mayús</string>
<string name="key_descr_capslock">Bloq Mayús</string> <string name="key_descr_compose">Componer</string>
<string name="key_descr_compose">Componer</string> <string name="key_descr_switch_greekmath">Símb. griegos y matemáticos</string>
<string name="key_descr_switch_greekmath">Símb. griegos y matemáticos</string> <string name="key_descr_change_method">Cambiar teclado</string>
<string name="key_descr_change_method">Cambiar teclado</string> <string name="key_descr_voice_typing">Dictado por voz</string>
<string name="key_descr_voice_typing">Dictado por voz</string> <string name="key_descr_copy">Copiar</string>
<string name="key_descr_copy">Copiar</string> <string name="key_descr_paste">Pegar</string>
<string name="key_descr_paste">Pegar</string> <string name="key_descr_cut">Cortar</string>
<string name="key_descr_cut">Cortar</string> <string name="key_descr_selectAll">Seleccionar todo</string>
<string name="key_descr_selectAll">Seleccionar todo</string> <string name="key_descr_shareText">Compartir texto</string>
<string name="key_descr_pasteAsPlainText">Pegar como texto sin formato</string> <string name="key_descr_pasteAsPlainText">Pegar como texto sin formato</string>
<string name="key_descr_undo">Deshacer</string> <string name="key_descr_undo">Deshacer</string>
<string name="key_descr_redo">Rehacer</string> <string name="key_descr_redo">Rehacer</string>
<string name="key_descr_ª">Indicador de ordinal</string> <string name="key_descr_ª">Indicador de ordinal</string>
<string name="key_descr_º">Indicador de ordinal</string> <string name="key_descr_º">Indicador de ordinal</string>
<string name="key_descr_superscript">Superíndice</string> <string name="key_descr_superscript">Superíndice</string>
<string name="key_descr_subscript">Subíndice</string> <string name="key_descr_subscript">Subíndice</string>
<string name="key_descr_page_up">Av Pág</string> <string name="key_descr_page_up">Av Pág</string>
<string name="key_descr_page_down">Re Pág</string> <string name="key_descr_page_down">Re Pág</string>
<string name="key_descr_home">Inicio</string> <string name="key_descr_home">Inicio</string>
<string name="key_descr_end">Fin</string> <string name="key_descr_end">Fin</string>
<string name="key_descr_clipboard">Arreglar portapapeles</string> <string name="key_descr_clipboard">Arreglar portapapeles</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> --> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="key_descr_dead_key">Dead key</string> --> <string name="clipboard_history_heading">Textos recién copiados</string>
<!-- <string name="key_descr_zwj">Zero width joiner</string> --> <string name="clipboard_pin_heading">Pegado</string>
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> --> <string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>
<!-- <string name="key_descr_nbsp">Non-breaking space</string> --> <string name="clipboard_remove_confirmed"></string>
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Textos recién copiados</string>
<string name="clipboard_pin_heading">Pegado</string>
<string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>
<string name="clipboard_remove_confirmed"></string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">صفحه کلید غیرمنتظره</string> <string name="app_name_release">صفحه کلید غیرمنتظره</string>
<string name="app_name_debug">صفحه کلید غیرمنتظره</string> <string name="app_name_debug">صفحه کلید غیرمنتظره</string>
<!-- <string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string> --> <!-- <string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string> -->
<!-- <string name="store_description">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string> --> <!-- <string name="store_description">"The main feature is that you can type more characters by swiping the keys towards the corners.
<string name="pref_portrait">در حالت عمودی</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> This application was originally designed for programmers using Termux.
<string name="pref_landscape">در حالت افقی</string> Now perfect for everyday use.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">طرح</string> This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
<string name="pref_label_brightness">تنظیم برچسب روشنایی</string> <string name="settings_activity_label">تنظیمات صفحه کلید غیرمنتظره</string>
<string name="pref_keyboard_opacity">تنظیم کدر بودن پس‌زمینه صفحه کلید</string> <string name="pref_portrait">در حالت عمودی</string>
<string name="pref_key_opacity">تنظیم کدر بودن کلید</string> <string name="pref_landscape">در حالت افقی</string>
<string name="pref_key_activated_opacity">تنظیم کدر بودن کلید فشرده شده</string> <string name="pref_category_layout">طرح</string>
<string name="pref_layout_e_system">تنظیمات سامانه</string> <string name="pref_label_brightness">تنظیم برچسب روشنایی</string>
<string name="pref_layout_e_custom">طرح صفارشی</string> <string name="pref_keyboard_opacity">تنظیم کدر بودن پس‌زمینه صفحه کلید</string>
<!-- <string name="pref_layouts_add">Add an alternate layout</string> --> <string name="pref_key_opacity">تنظیم کدر بودن کلید</string>
<!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> --> <string name="pref_key_activated_opacity">تنظیم کدر بودن کلید فشرده شده</string>
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> --> <string name="pref_layout_e_system">تنظیمات سامانه</string>
<string name="pref_custom_layout_title">طرح شخصی</string> <string name="pref_layout_e_custom">طرح صفارشی</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
<string name="pref_show_numpad_title">نمایش پد شماره‌ها</string> <string name="pref_custom_layout_title">طرح شخصی</string>
<string name="pref_show_numpad_never">هرگز</string> <string name="pref_show_numpad_title">نمایش پد شماره‌ها</string>
<string name="pref_show_numpad_landscape">فقط در حالت افقی</string> <string name="pref_show_numpad_never">هرگز</string>
<string name="pref_show_numpad_always">همیشه</string> <string name="pref_show_numpad_landscape">فقط در حالت افقی</string>
<string name="pref_number_row_title">نمایش ردیف اعداد</string> <string name="pref_show_numpad_always">همیشه</string>
<string name="pref_number_row_summary">افزودن ردیف اعداد زمانیکه پد شماره‌ها پنهان است</string> <string name="pref_number_row_title">نمایش ردیف اعداد</string>
<string name="pref_numpad_layout">طرح پد شماره‌ها</string> <string name="pref_number_row_summary">افزودن ردیف اعداد زمانیکه پد شماره‌ها پنهان است</string>
<string name="pref_numpad_layout_e_high_first">ابتدا اعداد بزرگ</string> <string name="pref_numpad_layout">طرح پد شماره‌ها</string>
<string name="pref_numpad_layout_e_low_first">ابتدا اعداد کوچک</string> <string name="pref_numpad_layout_e_high_first">ابتدا اعداد بزرگ</string>
<string name="pref_extra_keys_title">افزودن کلیدها به صفحه کلید</string> <string name="pref_numpad_layout_e_low_first">ابتدا اعداد کوچک</string>
<!-- <string name="pref_extra_keys_custom">Add custom keys</string> --> <string name="pref_extra_keys_title">افزودن کلیدها به صفحه کلید</string>
<!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> --> <!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
<string name="pref_category_typing">درحال نوشتن</string> <!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
<string name="pref_swipe_dist_title">فاصله کشیدن</string> <string name="pref_category_typing">درحال نوشتن</string>
<string name="pref_swipe_dist_summary">فاصله حروف از گوشه‌های کلیدها )(%s)</string> <string name="pref_swipe_dist_title">فاصله کشیدن</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_swipe_dist_summary">فاصله حروف از گوشه‌های کلیدها )(%s)</string>
<string name="pref_long_interval_title">فاصله تکرار کلید</string> <!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_long_interval_title">فاصله تکرار کلید</string>
<string name="pref_lock_double_tap_title">دوبار ضربه روی دگرساز برای فعال شدن کپس لاک</string> <!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_lock_double_tap_summary">شما میتوانید قفل کنید هر میانبری را با نگه داشتن آن</string> <string name="pref_lock_double_tap_title">دوبار ضربه روی دگرساز برای فعال شدن کپس لاک</string>
<string name="pref_category_behavior">ٰرفتار</string> <string name="pref_lock_double_tap_summary">شما میتوانید قفل کنید هر میانبری را با نگه داشتن آن</string>
<string name="pref_autocapitalisation_title">بزرگسازی خودکار</string> <string name="pref_category_behavior">ٰرفتار</string>
<string name="pref_autocapitalisation_summary">در شروع جملات دگرساز را فشار دهید</string> <string name="pref_autocapitalisation_title">بزرگسازی خودکار</string>
<string name="pref_switch_input_immediate_title">انتقال به آخرین صفحه کلید استفاده شده</string> <string name="pref_autocapitalisation_summary">در شروع جملات دگرساز را فشار دهید</string>
<string name="pref_switch_input_immediate_summary">رفتار کلید تغییردهنده صفحه کلید</string> <string name="pref_switch_input_immediate_title">انتقال به آخرین صفحه کلید استفاده شده</string>
<!-- <string name="pref_vibrate_custom">Custom vibration</string> --> <string name="pref_switch_input_immediate_summary">رفتار کلید تغییردهنده صفحه کلید</string>
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> --> <!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">سبک</string>
<string name="pref_category_style">سبک</string> <string name="pref_margin_bottom_title">حاشیه پایین</string>
<string name="pref_margin_bottom_title">حاشیه پایین</string> <string name="pref_keyboard_height_title">ارتفاع صفحه کلید</string>
<string name="pref_keyboard_height_title">ارتفاع صفحه کلید</string> <string name="pref_horizontal_margin_title">حاشیه افقی</string>
<string name="pref_horizontal_margin_title">حاشیه افقی</string> <string name="pref_character_size_title">اندازه برچسب</string>
<string name="pref_character_size_title">اندازه برچسب</string> <string name="pref_character_size_summary">اندازه نویسه‌های نشان داده شده روی صفحه کلید (%.2fx)</string>
<string name="pref_character_size_summary">اندازه نویسه‌های نشان داده شده روی صفحه کلید (%.2fx)</string> <string name="pref_theme">زمینه</string>
<string name="pref_theme">زمینه</string> <string name="pref_theme_e_system">تنظیمات سامانه</string>
<string name="pref_theme_e_system">تنظیمات سامانه</string> <string name="pref_theme_e_dark">تاریک</string>
<string name="pref_theme_e_dark">تاریک</string> <string name="pref_theme_e_light">روشن</string>
<string name="pref_theme_e_light">روشن</string> <string name="pref_theme_e_black">سیاه</string>
<string name="pref_theme_e_black">سیاه</string> <string name="pref_theme_e_altblack">سیاه مشابه</string>
<string name="pref_theme_e_altblack">سیاه مشابه</string> <string name="pref_theme_e_white">سفید</string>
<string name="pref_theme_e_white">سفید</string> <string name="pref_theme_e_epaper">ای-پیپر</string>
<string name="pref_theme_e_epaper">ای-پیپر</string> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> --> <!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> --> <!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> --> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> --> <string name="pref_swipe_dist_e_very_short">بسیار کوتاه</string>
<string name="pref_swipe_dist_e_very_short">بسیار کوتاه</string> <string name="pref_swipe_dist_e_short">کوتاه</string>
<string name="pref_swipe_dist_e_short">کوتاه</string> <string name="pref_swipe_dist_e_default">عادی</string>
<string name="pref_swipe_dist_e_default">عادی</string> <string name="pref_swipe_dist_e_far">دور</string>
<string name="pref_swipe_dist_e_far">دور</string> <string name="pref_swipe_dist_e_very_far">بسیار دور</string>
<string name="pref_swipe_dist_e_very_far">بسیار دور</string> <string name="pref_key_horizontal_space">فاصله افقی بین کلیدها</string>
<string name="pref_key_horizontal_space">فاصله افقی بین کلیدها</string> <string name="pref_key_vertical_space">فاصله عمودی بین کلیدها</string>
<string name="pref_key_vertical_space">فاصله عمودی بین کلیدها</string> <!-- <string name="pref_border_config_title">Customize borders</string> -->
<!-- <string name="pref_border_config_title">Customize borders</string> --> <!-- <string name="pref_border_width_title">Border Width</string> -->
<!-- <string name="pref_border_width_title">Border Width</string> --> <!-- <string name="pref_corners_radius_title">Corner radius</string> -->
<!-- <string name="pref_corners_radius_title">Corner radius</string> --> <!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="key_action_next">بعدی</string>
<string name="key_action_next">بعدی</string> <string name="key_action_done">اتمام</string>
<string name="key_action_done">اتمام</string> <string name="key_action_go">برو</string>
<string name="key_action_go">برو</string> <string name="key_action_prev">قبلی</string>
<string name="key_action_prev">قبلی</string> <string name="key_action_search">جستجو</string>
<string name="key_action_search">جستجو</string> <string name="key_action_send">ارسال</string>
<string name="key_action_send">ارسال</string> <string name="launcher_button_imesettings">فعال کردن صفحه کلید</string>
<string name="launcher_button_imesettings">فعال کردن صفحه کلید</string> <!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
<!-- <string name="launcher_button_imepicker">Select keyboard</string> --> <string name="launcher_description">این برنامه یک صفحه کلید مجازی است. با کلیک روی گزینه زیر به تنظیمات سامانه بروید و صفحه کلید غیرمنتظره را فعال کنید.</string>
<string name="launcher_description">این برنامه یک صفحه کلید مجازی است. با کلیک روی گزینه زیر به تنظیمات سامانه بروید و صفحه کلید غیرمنتظره را فعال کنید.</string> <string name="launcher_sourcecode">این یک برنامه متن باز و آزاد است. شما می‌توانید کد منبع را در گیتهاب پیدا کرده و نیز باگ‌ها را گزارش کنید.</string>
<string name="launcher_sourcecode">این یک برنامه متن باز و آزاد است. شما می‌توانید کد منبع را در گیتهاب پیدا کرده و نیز باگ‌ها را گزارش کنید.</string> <string name="launcher_tryhere">بعد از فعالسازی، صفحه کلید را اینجا امتحان کنید:</string>
<string name="launcher_tryhere">بعد از فعالسازی، صفحه کلید را اینجا امتحان کنید:</string> <!-- <string name="launcher_tryhere_hint">Try here</string> -->
<!-- <string name="launcher_tryhere_hint">Try here</string> --> <!-- <string name="key_descr_capslock">Caps lock</string> -->
<!-- <string name="key_descr_capslock">Caps lock</string> --> <!-- <string name="key_descr_compose">Compose</string> -->
<!-- <string name="key_descr_compose">Compose</string> --> <!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> -->
<!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> --> <!-- <string name="key_descr_change_method">Switch keyboard</string> -->
<!-- <string name="key_descr_change_method">Switch keyboard</string> --> <!-- <string name="key_descr_voice_typing">Voice typing</string> -->
<!-- <string name="key_descr_voice_typing">Voice typing</string> --> <!-- <string name="key_descr_copy">Copy</string> -->
<!-- <string name="key_descr_copy">Copy</string> --> <!-- <string name="key_descr_paste">Paste</string> -->
<!-- <string name="key_descr_paste">Paste</string> --> <!-- <string name="key_descr_cut">Cut</string> -->
<!-- <string name="key_descr_cut">Cut</string> --> <!-- <string name="key_descr_selectAll">Select all</string> -->
<!-- <string name="key_descr_selectAll">Select all</string> --> <!-- <string name="key_descr_shareText">Share text</string> -->
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> --> <!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
<!-- <string name="key_descr_undo">Undo</string> --> <!-- <string name="key_descr_undo">Undo</string> -->
<!-- <string name="key_descr_redo">Redo</string> --> <!-- <string name="key_descr_redo">Redo</string> -->
<!-- <string name="key_descr_ª">Ordinal Indicator</string> --> <!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
<!-- <string name="key_descr_º">Ordinal Indicator</string> --> <!-- <string name="key_descr_º">Ordinal Indicator</string> -->
<!-- <string name="key_descr_superscript">Superscript</string> --> <!-- <string name="key_descr_superscript">Superscript</string> -->
<!-- <string name="key_descr_subscript">Subscript</string> --> <!-- <string name="key_descr_subscript">Subscript</string> -->
<!-- <string name="key_descr_page_up">Page Up</string> --> <!-- <string name="key_descr_page_up">Page Up</string> -->
<!-- <string name="key_descr_page_down">Page Down</string> --> <!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> --> <!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> --> <!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> --> <!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> --> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="key_descr_dead_key">Dead key</string> --> <!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="key_descr_zwj">Zero width joiner</string> --> <!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> --> <!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="key_descr_nbsp">Non-breaking space</string> --> <!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard item?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
<string name="short_description">Magaan at privacy-conscious na virtual keyboard sa Android.</string>
<string name="store_description">Ang pangunahing feature ay maaari kang mag-type ng mas marami pang karakter sa pag-swipe sa gilid ng mga key.\n\nNoong simula, ginawa itong application para sa mga programmer sa na nagte-Termux.\nNgayo\'y perpekto na sa pang-araw-araw.\n\nWalang ads, hindi nagne-network request at Open Source ang application na ito.</string>
<string name="pref_portrait">Nakapatayo</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">Nakapahiga</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Layout</string>
<string name="pref_label_brightness">Kaliwanagan ng label</string>
<string name="pref_keyboard_opacity">Opacity ng likuran ng keyboard</string>
<string name="pref_key_opacity">Opacity ng key</string>
<string name="pref_key_activated_opacity">Opacity ng pinindot na key</string>
<string name="pref_layout_e_system">System settings</string>
<string name="pref_layout_e_custom">Custom na layout</string>
<string name="pref_layouts_add">Maglagay ng isa pang layout</string>
<string name="pref_layouts_item">Layout %1$d: %2$s</string>
<string name="pref_layouts_remove_custom">Tanggalin itong layout</string>
<string name="pref_custom_layout_title">Custom na layout</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> -->
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> -->
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> -->
<string name="pref_show_numpad_title">Ipakita ang NumPad</string>
<string name="pref_show_numpad_never">Huwag</string>
<string name="pref_show_numpad_landscape">Kapag nakapahiga lamang</string>
<string name="pref_show_numpad_always">Palagi</string>
<string name="pref_number_row_title">Ipakita ang number row</string>
<string name="pref_number_row_summary">Maglagay ng number row sa itaas ng keyboard kapag nakatago ang numpad</string>
<string name="pref_numpad_layout">Layout ng NumPad</string>
<string name="pref_numpad_layout_e_high_first">Pinakamataas muna</string>
<string name="pref_numpad_layout_e_low_first">Pinakamababa muna</string>
<string name="pref_extra_keys_title">Maglagay ng key sa keyboard</string>
<string name="pref_extra_keys_custom">Maglagay ng custom na key</string>
<string name="pref_extra_keys_internal">Pumili ng key na ilalagay sa keyboard</string>
<string name="pref_category_typing">Pag-type</string>
<string name="pref_swipe_dist_title">Layo ng swipe</string>
<string name="pref_swipe_dist_summary">Layo ng karakter sa gilid ng mga key (%s)</string>
<string name="pref_long_timeout_title">Timeout sa long press</string>
<string name="pref_long_interval_title">Agwat sa pag-ulit ng key</string>
<string name="pref_keyrepeat_enabled">Paulitin ang key kapag nag-long press</string>
<string name="pref_lock_double_tap_title">Pag-double tap sa shift para mag-caps lock</string>
<string name="pref_lock_double_tap_summary">Mala-lock mo ang anumang modifier kapag ini-long press</string>
<string name="pref_category_behavior">Ugali</string>
<string name="pref_autocapitalisation_title">Automatikong pagkakapitalisa</string>
<string name="pref_autocapitalisation_summary">Mag-Shift sa simula ng pangungusap</string>
<string name="pref_switch_input_immediate_title">Lumipat sa huling ginamit na keyboard</string>
<string name="pref_switch_input_immediate_summary">Ugali ng key sa pagpapalit ng keyboard</string>
<string name="pref_vibrate_custom">Custom na vibration</string>
<string name="pref_vibrate_duration_title">Lakas ng vibration</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> -->
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> -->
<!-- <string name="pref_number_entry_layout_number">Number pane</string> -->
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> -->
<string name="pref_category_style">Estilo</string>
<string name="pref_margin_bottom_title">Pambabang margin</string>
<string name="pref_keyboard_height_title">Taas ng keyboard</string>
<string name="pref_horizontal_margin_title">Kabilaang margin</string>
<string name="pref_character_size_title">Laki ng label</string>
<string name="pref_character_size_summary">Laki ng nakikitang karakter sa keyboard (%.2fx)</string>
<string name="pref_theme">Tema</string>
<string name="pref_theme_e_system">System settings</string>
<string name="pref_theme_e_dark">Madilim</string>
<string name="pref_theme_e_light">Maliwanag</string>
<string name="pref_theme_e_black">Itim</string>
<string name="pref_theme_e_altblack">Itim (alternatibo)</string>
<string name="pref_theme_e_white">Puti</string>
<string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desyerto</string>
<string name="pref_theme_e_jungle">Gubat</string>
<string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monetlight">Monet (maliwanag)</string>
<string name="pref_theme_e_monetdark">Monet (madilim)</string>
<string name="pref_theme_e_rosepine">Rosé Pine</string>
<string name="pref_swipe_dist_e_very_short">Maikling-maikli</string>
<string name="pref_swipe_dist_e_short">Maikli</string>
<string name="pref_swipe_dist_e_default">Normal</string>
<string name="pref_swipe_dist_e_far">Malayo</string>
<string name="pref_swipe_dist_e_very_far">Malayong-malayo</string>
<string name="pref_key_horizontal_space">Kabilaang agwat ng mga key</string>
<string name="pref_key_vertical_space">Taas-babang agwat ng mga key</string>
<string name="pref_border_config_title">I-customize ang giliran ng key</string>
<string name="pref_border_width_title">Haba ng Giliran</string>
<string name="pref_corners_radius_title">Radius ng sulok</string>
<string name="pref_circle_sensitivity_title">Sensitibidad ng circle gesture</string>
<string name="pref_circle_sensitivity_e_high">Malakas</string>
<string name="pref_circle_sensitivity_e_medium">Katamtaman</string>
<string name="pref_circle_sensitivity_e_low">Mahina</string>
<string name="pref_circle_sensitivity_e_disabled">Nakapatay</string>
<string name="key_action_next">Sunod</string>
<string name="key_action_done">OK</string>
<string name="key_action_go">Sige</string>
<string name="key_action_prev">Balik</string>
<string name="key_action_search">Maghanap</string>
<string name="key_action_send">Send</string>
<string name="launcher_button_imesettings">Paganahin ang keyboard</string>
<string name="launcher_button_imepicker">Pumili ng keyboard</string>
<string name="launcher_description">Itong application ay isang virtual keyboard. Pindutin ang buton sa ilalim nang pumunta sa system settings at buksan ang Unexpected-Keyboard.</string>
<string name="launcher_sourcecode">Libre at open source ito na application. Maaaring makita ang source code o makapagreport ng bugs sa Github.</string>
<string name="launcher_tryhere">Pagkatapos buksan, masusubukan mo ang keyboard dito:</string>
<string name="launcher_tryhere_hint">Subukan dito</string>
<string name="key_descr_capslock">Caps lock</string>
<string name="key_descr_compose">Compose</string>
<string name="key_descr_switch_greekmath">Simbolong Griyego at ng matematika</string>
<string name="key_descr_change_method">Magpalit ng keyboard</string>
<string name="key_descr_voice_typing">Voice typing</string>
<string name="key_descr_copy">I-copy</string>
<string name="key_descr_paste">I-paste</string>
<string name="key_descr_cut">Ilipat</string>
<string name="key_descr_selectAll">Piliin lahat</string>
<string name="key_descr_pasteAsPlainText">I-paste bilang plain text</string>
<string name="key_descr_undo">I-undo</string>
<string name="key_descr_redo">I-redo</string>
<string name="key_descr_ª">Ordinal</string>
<string name="key_descr_º">Ordinal</string>
<string name="key_descr_superscript">Superscript</string>
<string name="key_descr_subscript">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="key_descr_clipboard">Clipboard</string>
<string name="key_descr_combining">Combining diacritic</string>
<string name="key_descr_dead_key">Dead key</string>
<string name="key_descr_zwj">Zero width joiner</string>
<string name="key_descr_zwnj">Zero width non-joiner</string>
<string name="key_descr_nbsp">Non-breaking space</string>
<string name="key_descr_nnbsp">Narrow non-breaking space</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Kakokopyang text</string>
<string name="clipboard_pin_heading">Nakapin</string>
<string name="clipboard_remove_confirm">Tanggalin ito sa clipboard?</string>
<string name="clipboard_remove_confirmed">Oo</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (debug)</string> <string name="app_name_debug">Unexpected Keyboard (debug)</string>
<string name="short_description">Clavier virtuel léger et respectueux de la vie privée pour Android.</string> <string name="short_description">Clavier virtuel léger et respectueux de la vie privée pour Android.</string>
<string name="store_description">La fonctionnalité principale est l\'accès rapide à plus de caractères en balayant les touches vers les coins.\n\nCette application a été conçue à l\'origine pour les programmeurs utilisant Termux.\nElle est maintenant parfaite pour une utilisation quotidienne.\n\nCette application ne contient pas de publicité, n\'accède pas au réseau et est Open Source.</string> <string name="store_description">"La fonctionnalité principale est l'accès rapide à plus de caractères en balayant les touches vers les coins.
<string name="pref_portrait">En mode portrait</string>
<string name="pref_portrait_unfolded">En mode portrait déplié</string> Cette application a été conçue à l'origine pour les programmeurs utilisant Termux.
<string name="pref_landscape">En mode landscape</string> Elle est maintenant parfaite pour une utilisation quotidienne.
<string name="pref_landscape_unfolded">En mode landscape déplié</string>
<string name="pref_category_layout">Disposition</string> Cette application ne contient pas de publicité, n'accède pas au réseau et est Open Source."</string>
<string name="pref_label_brightness">Luminosité des symboles</string> <string name="settings_activity_label">Unexpected Keyboard Paramètres</string>
<string name="pref_keyboard_opacity">Transparence du clavier</string> <string name="pref_portrait">En mode portrait</string>
<string name="pref_key_opacity">Transparence des touches</string> <string name="pref_landscape">En mode landscape</string>
<string name="pref_key_activated_opacity">Transparence des touches pressées</string> <string name="pref_category_layout">Disposition</string>
<string name="pref_layout_e_system">Paramètre système</string> <string name="pref_label_brightness">Luminosité des symboles</string>
<string name="pref_layout_e_custom">Disposition personnalisée</string> <string name="pref_keyboard_opacity">Transparence du clavier</string>
<string name="pref_layouts_add">Ajouter un clavier alternatif</string> <string name="pref_key_opacity">Transparence des touches</string>
<string name="pref_layouts_item">Disposition %1$d: %2$s</string> <string name="pref_key_activated_opacity">Transparence des touches pressées</string>
<string name="pref_layouts_remove_custom">Supprimer</string> <string name="pref_layout_e_system">Paramètre système</string>
<string name="pref_custom_layout_title">Disposition personnalisée</string> <string name="pref_layout_e_custom">Disposition personnalisée</string>
<string name="pref_show_number_row_no_number_row">Pas de rangée de chiffres</string> <string name="pref_layouts_add">Ajouter un clavier alternatif</string>
<string name="pref_show_number_row_no_symbols">Rangée de chiffres sans symboles</string> <string name="pref_layouts_item">Disposition %1$d: %2$s</string>
<string name="pref_show_number_row_symbols">Rangée de chiffres avec symboles</string> <string name="pref_layouts_remove_custom">Supprimer</string>
<string name="pref_show_numpad_title">Afficher le pavé numérique</string> <string name="pref_custom_layout_title">Disposition personnalisée</string>
<string name="pref_show_numpad_never">Jamais</string> <string name="pref_show_numpad_title">Afficher le pavé numérique</string>
<string name="pref_show_numpad_landscape">Seulement en mode paysage</string> <string name="pref_show_numpad_never">Jamais</string>
<string name="pref_show_numpad_always">Toujour</string> <string name="pref_show_numpad_landscape">Seulement en mode paysage</string>
<string name="pref_number_row_title">Rangée de chiffres</string> <string name="pref_show_numpad_always">Toujour</string>
<string name="pref_number_row_summary">Ajoute une rangée de chiffres en haut du clavier quand le pavé numérique est caché</string> <string name="pref_number_row_title">Rangée de nombres</string>
<string name="pref_numpad_layout">Disposition du pavé numérique</string> <string name="pref_number_row_summary">Ajoute une rangée de nombres en haut du clavier quand le pavé numérique est caché</string>
<string name="pref_numpad_layout_e_high_first">Du plus haut au plus bas</string> <string name="pref_numpad_layout">Disposition du pavé numérique</string>
<string name="pref_numpad_layout_e_low_first">Du plus bas au plus haut</string> <string name="pref_numpad_layout_e_high_first">Du plus haut au plus bas</string>
<string name="pref_extra_keys_title">Ajouter des touches au clavier</string> <string name="pref_numpad_layout_e_low_first">Du plus bas au plus haut</string>
<string name="pref_extra_keys_custom">Ajouter des touches personnalisées</string> <string name="pref_extra_keys_title">Ajouter des touches au clavier</string>
<string name="pref_extra_keys_internal">Sélectionner les touches à ajouter au clavier</string> <string name="pref_extra_keys_custom">Ajouter des touches personnalisées</string>
<string name="pref_category_typing">Saisie</string> <string name="pref_extra_keys_internal">Sélectionner les touches à ajouter au clavier</string>
<string name="pref_swipe_dist_title">Distance de swipe</string> <string name="pref_category_typing">Saisie</string>
<string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string> <string name="pref_swipe_dist_title">Distance de swipe</string>
<string name="pref_long_timeout_title">Delai de l\'appui long</string> <string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string>
<string name="pref_long_interval_title">Écart entre les répétitions</string> <string name="pref_long_timeout_title">Delai de l\'appui long</string>
<string name="pref_keyrepeat_enabled">Répétition par appui long</string> <string name="pref_long_interval_title">Écart entre les répétitions</string>
<string name="pref_lock_double_tap_title">Appuyer deux fois pour bloquer la majuscule</string> <string name="pref_keyrepeat_enabled">Répétition par appui long</string>
<string name="pref_lock_double_tap_summary">Un appui long bloque la majuscule</string> <string name="pref_lock_double_tap_title">Appuyer deux fois pour bloquer la majuscule</string>
<string name="pref_category_behavior">Comportement</string> <string name="pref_lock_double_tap_summary">Un appui long bloque la majuscule</string>
<string name="pref_autocapitalisation_title">Majuscule automatique</string> <string name="pref_category_behavior">Comportement</string>
<string name="pref_autocapitalisation_summary">Activer Shift au début des phrases</string> <string name="pref_autocapitalisation_title">Majuscule automatique</string>
<string name="pref_switch_input_immediate_title">Changer vers le clavier utilisé en dernier</string> <string name="pref_autocapitalisation_summary">Activer Shift au début des phrases</string>
<string name="pref_switch_input_immediate_summary">Comportement de la touche de changement de clavier</string> <string name="pref_switch_input_immediate_title">Changer vers le clavier utilisé en dernier</string>
<string name="pref_vibrate_custom">Vibrations personnalisées</string> <string name="pref_switch_input_immediate_summary">Comportement de la touche de changement de clavier</string>
<string name="pref_vibrate_duration_title">Intensité des vibrations</string> <string name="pref_vibrate_custom">Vibrations personnalisées</string>
<string name="pref_number_entry_title">Disposition pour les nombres, dates et numéros de téléphone</string> <string name="pref_vibrate_duration_title">Intensité des vibrations</string>
<string name="pref_number_entry_layout_pin">Clavier PIN</string> <string name="pref_pin_entry_enabled_title">Clavier PIN</string>
<string name="pref_number_entry_layout_number">Écran des nombres</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_number_entry_layout_normal">Utiliser le clavier principal</string> <string name="pref_category_style">Style</string>
<string name="pref_category_style">Style</string> <string name="pref_margin_bottom_title">Marge du bas</string>
<string name="pref_margin_bottom_title">Marge du bas</string> <string name="pref_keyboard_height_title">Hauteur du clavier</string>
<string name="pref_keyboard_height_title">Hauteur du clavier</string> <string name="pref_horizontal_margin_title">Marge des côtés</string>
<string name="pref_horizontal_margin_title">Marge des côtés</string> <string name="pref_character_size_title">Taille des symboles</string>
<string name="pref_character_size_title">Taille des symboles</string> <string name="pref_character_size_summary">Taille des caractères affichés sur les touches (%.2fx)</string>
<string name="pref_character_size_summary">Taille des caractères affichés sur les touches (%.2fx)</string> <string name="pref_theme">Thème</string>
<string name="pref_theme">Thème</string> <string name="pref_theme_e_system">Paramètre système</string>
<string name="pref_theme_e_system">Paramètre système</string> <string name="pref_theme_e_dark">Sombre</string>
<string name="pref_theme_e_dark">Sombre</string> <string name="pref_theme_e_light">Clair</string>
<string name="pref_theme_e_light">Clair</string> <string name="pref_theme_e_black">Noir</string>
<string name="pref_theme_e_black">Noir</string> <string name="pref_theme_e_altblack">Noir 2</string>
<string name="pref_theme_e_altblack">Noir 2</string> <string name="pref_theme_e_white">Blanc</string>
<string name="pref_theme_e_white">Blanc</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_desert">Desert</string>
<string name="pref_theme_e_desert">Désert</string> <string name="pref_theme_e_jungle">Jungle</string>
<string name="pref_theme_e_jungle">Jungle</string> <string name="pref_theme_e_monet">Monet (Système)</string>
<string name="pref_theme_e_monet">Monet (Système)</string> <string name="pref_theme_e_monetlight">Monet (Clair)</string>
<string name="pref_theme_e_monetlight">Monet (Clair)</string> <string name="pref_theme_e_monetdark">Monet (Sombre)</string>
<string name="pref_theme_e_monetdark">Monet (Sombre)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_theme_e_rosepine">Rosé Pine</string> <string name="pref_swipe_dist_e_very_short">Très courte</string>
<string name="pref_swipe_dist_e_very_short">Très courte</string> <string name="pref_swipe_dist_e_short">Courte</string>
<string name="pref_swipe_dist_e_short">Courte</string> <string name="pref_swipe_dist_e_default">Normale</string>
<string name="pref_swipe_dist_e_default">Normale</string> <string name="pref_swipe_dist_e_far">Longue</string>
<string name="pref_swipe_dist_e_far">Longue</string> <string name="pref_swipe_dist_e_very_far">Très longue</string>
<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_horizontal_space">Espacement horizontal entre les touches</string> <string name="pref_key_vertical_space">Espacement vertical entre les touches</string>
<string name="pref_key_vertical_space">Espacement vertical entre les touches</string> <string name="pref_border_config_title">Bordures personnalisées</string>
<string name="pref_border_config_title">Bordures personnalisées</string> <string name="pref_border_width_title">Largeur des bordures</string>
<string name="pref_border_width_title">Largeur des bordures</string> <string name="pref_corners_radius_title">Rayon des coins</string>
<string name="pref_corners_radius_title">Rayon des coins</string> <string name="pref_circle_sensitivity_title">Sensibilité du mouvement en cercle</string>
<string name="pref_circle_sensitivity_title">Sensibilité du mouvement en cercle</string> <string name="pref_circle_sensitivity_e_high">Haute</string>
<string name="pref_circle_sensitivity_e_high">Haute</string> <string name="pref_circle_sensitivity_e_medium">Moyenne</string>
<string name="pref_circle_sensitivity_e_medium">Moyenne</string> <string name="pref_circle_sensitivity_e_low">Basse</string>
<string name="pref_circle_sensitivity_e_low">Basse</string> <string name="pref_circle_sensitivity_e_disabled">Désactivée</string>
<string name="pref_circle_sensitivity_e_disabled">Désactivée</string> <string name="key_action_next">Suiv.</string>
<string name="key_action_next">Suiv.</string> <string name="key_action_done">Fin</string>
<string name="key_action_done">Fini</string> <string name="key_action_go">Aller</string>
<string name="key_action_go">Aller</string> <string name="key_action_prev">Prec.</string>
<string name="key_action_prev">Prec.</string> <string name="key_action_search">Chercher</string>
<string name="key_action_search">Chercher</string> <string name="key_action_send">Envoyer</string>
<string name="key_action_send">Envoyer</string> <string name="launcher_button_imesettings">Activer le clavier</string>
<string name="launcher_button_imesettings">Activer le clavier</string> <string name="launcher_button_imepicker">Selectionner le keyboard</string>
<string name="launcher_button_imepicker">Selectionner le clavier</string> <string name="launcher_description">Cette application est un clavier virtuel. Activez-le dans les paramètres système en cliquant sur le bouton ci-dessous.</string>
<string name="launcher_description">Cette application est un clavier virtuel. Activez-le dans les paramètres système en cliquant sur le bouton ci-dessous.</string> <string name="launcher_sourcecode">Cette application est libre et open-source. Lisez le source code et reportez des problèmes sur Github.</string>
<string name="launcher_sourcecode">Cette application est libre et open-source. Lisez le source code et reportez des problèmes sur Github.</string> <string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string>
<string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici :</string> <string name="launcher_tryhere_hint">Essayer ici</string>
<string name="launcher_tryhere_hint">Essayer ici</string> <string name="key_descr_capslock">Verrouillage majuscules</string>
<string name="key_descr_capslock">Verrouillage majuscules</string> <string name="key_descr_compose">Compose</string>
<string name="key_descr_compose">Composition</string> <string name="key_descr_switch_greekmath">Symboles mathématiques</string>
<string name="key_descr_switch_greekmath">Symboles mathématiques</string> <string name="key_descr_change_method">Changer de clavier</string>
<string name="key_descr_change_method">Changer de clavier</string> <string name="key_descr_voice_typing">Saisie vocale</string>
<string name="key_descr_voice_typing">Saisie vocale</string> <string name="key_descr_copy">Copier</string>
<string name="key_descr_copy">Copier</string> <string name="key_descr_paste">Coller</string>
<string name="key_descr_paste">Coller</string> <string name="key_descr_cut">Couper</string>
<string name="key_descr_cut">Couper</string> <string name="key_descr_selectAll">Sel. tout</string>
<string name="key_descr_selectAll">Sel. tout</string> <string name="key_descr_shareText">Partager</string>
<string name="key_descr_pasteAsPlainText">Copier en texte brut</string> <string name="key_descr_pasteAsPlainText">Copier en texte brut</string>
<string name="key_descr_undo">Annuler</string> <string name="key_descr_undo">Undo</string>
<string name="key_descr_redo">Refaire</string> <string name="key_descr_redo">Redo</string>
<string name="key_descr_ª">Ordinal</string> <string name="key_descr_ª">Ordinal</string>
<string name="key_descr_º">Ordinal</string> <string name="key_descr_º">Ordinal</string>
<string name="key_descr_superscript">Exposant</string> <string name="key_descr_superscript">Exposant</string>
<string name="key_descr_subscript">Souscrit</string> <string name="key_descr_subscript">Souscrit</string>
<string name="key_descr_page_up">Page précédente</string> <string name="key_descr_page_up">Page précédente</string>
<string name="key_descr_page_down">Page suivante</string> <string name="key_descr_page_down">Page suivante</string>
<string name="key_descr_home">Début</string> <string name="key_descr_home">Début</string>
<string name="key_descr_end">Fin</string> <string name="key_descr_end">Fin</string>
<string name="key_descr_clipboard">Presse-papiers</string> <string name="key_descr_clipboard">Presse-papiers</string>
<string name="key_descr_combining">Diacritique combinant</string> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="key_descr_dead_key">Touche morte</string> <string name="clipboard_history_heading">Texte récemment copié</string>
<string name="key_descr_zwj">Liant sans chasse</string> <string name="clipboard_pin_heading">Épinglé</string>
<string name="key_descr_zwnj">Antiliant sans chasse</string> <string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>
<string name="key_descr_nbsp">Espace insécable</string> <string name="clipboard_remove_confirmed">Oui</string>
<string name="key_descr_nnbsp">Espace fine insécable</string>
<string name="key_descr_delete_word">Effacer un mot</string>
<string name="key_descr_forward_delete_word">Effacer un mot à droite</string>
<string name="key_descr_gesture">Geste</string>
<string name="clipboard_history_heading">Texte récemment copié</string>
<string name="clipboard_pin_heading">Épinglé</string>
<string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>
<string name="clipboard_remove_confirmed">Oui</string>
<string name="toast_no_voice_input">Pas d\'application de saisie vocale</string>
</resources> </resources>

View File

@@ -1,138 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- <string name="app_name_release">Unexpected Keyboard</string> -->
<!-- <string name="app_name_debug">Unexpected Keyboard (Debug)</string> -->
<!-- <string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string> -->
<!-- <string name="store_description">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string> -->
<!-- <string name="pref_portrait">In portrait mode</string> -->
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<!-- <string name="pref_landscape">In landscape mode</string> -->
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<!-- <string name="pref_category_layout">Layout</string> -->
<!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
<!-- <string name="pref_layout_e_system">System settings</string> -->
<!-- <string name="pref_layout_e_custom">Custom layout</string> -->
<!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
<!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> -->
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> -->
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> -->
<!-- <string name="pref_show_numpad_title">Show NumPad</string> -->
<!-- <string name="pref_show_numpad_never">Never</string> -->
<!-- <string name="pref_show_numpad_landscape">Only in landscape mode</string> -->
<!-- <string name="pref_show_numpad_always">Always</string> -->
<!-- <string name="pref_number_row_title">Show number row</string> -->
<!-- <string name="pref_number_row_summary">Add a number row at the top of the keyboard when the numpad is hidden</string> -->
<!-- <string name="pref_numpad_layout">NumPad layout</string> -->
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</string> -->
<!-- <string name="pref_extra_keys_title">Add keys to the keyboard</string> -->
<!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
<!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
<!-- <string name="pref_category_typing">Typing</string> -->
<!-- <string name="pref_swipe_dist_title">Swiping distance</string> -->
<!-- <string name="pref_swipe_dist_summary">Distance of characters in the corners of the keys (%s)</string> -->
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<!-- <string name="pref_long_interval_title">Key repeat interval</string> -->
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<!-- <string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> -->
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string> -->
<!-- <string name="pref_category_behavior">Behavior</string> -->
<!-- <string name="pref_autocapitalisation_title">Automatic capitalisation</string> -->
<!-- <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_custom">Custom vibration</string> -->
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> -->
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> -->
<!-- <string name="pref_number_entry_layout_number">Number pane</string> -->
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> -->
<!-- <string name="pref_category_style">Style</string> -->
<!-- <string name="pref_margin_bottom_title">Margin bottom</string> -->
<!-- <string name="pref_keyboard_height_title">Keyboard height</string> -->
<!-- <string name="pref_horizontal_margin_title">Horizontal margin</string> -->
<!-- <string name="pref_character_size_title">Label size</string> -->
<!-- <string name="pref_character_size_summary">Size of characters displayed on the keyboard (%.2fx)</string> -->
<!-- <string name="pref_theme">Theme</string> -->
<!-- <string name="pref_theme_e_system">System settings</string> -->
<!-- <string name="pref_theme_e_dark">Dark</string> -->
<!-- <string name="pref_theme_e_light">Light</string> -->
<!-- <string name="pref_theme_e_black">Black</string> -->
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
<!-- <string name="pref_theme_e_white">White</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_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<!-- <string name="pref_swipe_dist_e_very_short">Very short</string> -->
<!-- <string name="pref_swipe_dist_e_short">Short</string> -->
<!-- <string name="pref_swipe_dist_e_default">Normal</string> -->
<!-- <string name="pref_swipe_dist_e_far">Far</string> -->
<!-- <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_border_config_title">Customize borders</string> -->
<!-- <string name="pref_border_width_title">Border Width</string> -->
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<!-- <string name="key_action_next">Next</string> -->
<!-- <string name="key_action_done">Done</string> -->
<!-- <string name="key_action_go">Go</string> -->
<!-- <string name="key_action_prev">Prev</string> -->
<!-- <string name="key_action_search">Search</string> -->
<!-- <string name="key_action_send">Send</string> -->
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
<!-- <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> -->
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
<!-- <string name="key_descr_capslock">Caps lock</string> -->
<!-- <string name="key_descr_compose">Compose</string> -->
<!-- <string name="key_descr_switch_greekmath">Greek &amp; 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> -->
<!-- <string name="key_descr_cut">Cut</string> -->
<!-- <string name="key_descr_selectAll">Select all</string> -->
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
<!-- <string name="key_descr_undo">Undo</string> -->
<!-- <string name="key_descr_redo">Redo</string> -->
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
<!-- <string name="key_descr_superscript">Superscript</string> -->
<!-- <string name="key_descr_subscript">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="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="key_descr_dead_key">Dead key</string> -->
<!-- <string name="key_descr_zwj">Zero width joiner</string> -->
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> -->
<!-- <string name="key_descr_nbsp">Non-breaking space</string> -->
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard item?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources>

View File

@@ -1,138 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
<string name="short_description">Keyboard virtual yang ringan dan sadar privasi untuk Android.</string>
<string name="store_description">Fitur utamanya adalah Anda dapat mengetik lebih banyak karakter dengan menggeser tombol ke arah sudut.\n\nAplikasi ini awalnya dirancang untuk programmer yang menggunakan Termux.\nSekarang sempurna untuk penggunaan sehari-hari.\n\nAplikasi ini tidak berisi iklan, tidak membuat permintaan jaringan dan Open Source.</string>
<string name="pref_portrait">Dalam mode potret</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">Dalam mode lansekap</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Tata letak</string>
<string name="pref_label_brightness">Sesuaikan kecerahan label</string>
<string name="pref_keyboard_opacity">Sesuaikan Opacity Latar Belakang Keyboard</string>
<string name="pref_key_opacity">Sesuaikan opacity tombol</string>
<string name="pref_key_activated_opacity">Sesuaikan opacity tombol yang ditekan</string>
<string name="pref_layout_e_system">Pengaturan sistem</string>
<string name="pref_layout_e_custom">Tata letak kustom</string>
<string name="pref_layouts_add">Tambahkan tata letak alternatif</string>
<string name="pref_layouts_item">Tata letak %1$d: %2$s</string>
<string name="pref_layouts_remove_custom">Hapus tata letak</string>
<string name="pref_custom_layout_title">Tata letak khusus</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> -->
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> -->
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> -->
<string name="pref_show_numpad_title">Tampilkan NumPad</string>
<string name="pref_show_numpad_never">Tidak pernah</string>
<string name="pref_show_numpad_landscape">Hanya dalam mode lanskap</string>
<string name="pref_show_numpad_always">Selalu</string>
<string name="pref_number_row_title">Tampilkan baris nomor</string>
<string name="pref_number_row_summary">Menambahkan baris angka di bagian atas keyboard saat numpad disembunyikan</string>
<string name="pref_numpad_layout">Tata letak NumPad</string>
<string name="pref_numpad_layout_e_high_first">digit tinggi dulu</string>
<string name="pref_numpad_layout_e_low_first">digit rendah dulu</string>
<string name="pref_extra_keys_title">Tambahkan tombol ke keyboard</string>
<string name="pref_extra_keys_custom">Menambahkan tombol khusus</string>
<string name="pref_extra_keys_internal">Pilih tombol untuk ditambahkan ke keyboard</string>
<string name="pref_category_typing">Mengetik</string>
<string name="pref_swipe_dist_title">Jarak menggeser</string>
<string name="pref_swipe_dist_summary">Jarak karakter di sudut tombol (%s)</string>
<string name="pref_long_timeout_title">Waktu tekan lama</string>
<string name="pref_long_interval_title">Interval pengulangan tombol</string>
<string name="pref_keyrepeat_enabled">Ulangi tombol pada tekan lama</string>
<string name="pref_lock_double_tap_title">Ketuk dua kali pada shift untuk mengunci huruf kapital</string>
<string name="pref_lock_double_tap_summary">Kunci apapun dengan menahan pengubah</string>
<string name="pref_category_behavior">Perilaku</string>
<string name="pref_autocapitalisation_title">Kapitalisasi Otomatis</string>
<string name="pref_autocapitalisation_summary">Tekan shift di awal kalimat</string>
<string name="pref_switch_input_immediate_title">Beralih ke keyboard yang terakhir digunakan</string>
<string name="pref_switch_input_immediate_summary">Perilaku tombol penggantian keyboard</string>
<string name="pref_vibrate_custom">Getaran kustom</string>
<string name="pref_vibrate_duration_title">Intensitas getaran</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> -->
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> -->
<!-- <string name="pref_number_entry_layout_number">Number pane</string> -->
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> -->
<string name="pref_category_style">Gaya</string>
<string name="pref_margin_bottom_title">Batas bawah</string>
<string name="pref_keyboard_height_title">Tinggi keyboard</string>
<string name="pref_horizontal_margin_title">Garis tepi horizontal</string>
<string name="pref_character_size_title">Ukuran label</string>
<string name="pref_character_size_summary">Ukuran karakter yang ditampilkan pada keyboard (%.2fx)</string>
<string name="pref_theme">Tema</string>
<string name="pref_theme_e_system">Pengaturan Sistem</string>
<string name="pref_theme_e_dark">Gelap</string>
<string name="pref_theme_e_light">Terang</string>
<string name="pref_theme_e_black">Hitam</string>
<string name="pref_theme_e_altblack">Alternatif Hitam</string>
<string name="pref_theme_e_white">Putih</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_monet">Monet (Sistem)</string>
<string name="pref_theme_e_monetlight">Monet (Terang)</string>
<string name="pref_theme_e_monetdark">Monet (Gelap)</string>
<string name="pref_theme_e_rosepine">Rosé Pine</string>
<string name="pref_swipe_dist_e_very_short">Sangat pendek</string>
<string name="pref_swipe_dist_e_short">Pendek</string>
<string name="pref_swipe_dist_e_default">Normal</string>
<string name="pref_swipe_dist_e_far">Jauh</string>
<string name="pref_swipe_dist_e_very_far">Sangat jauh</string>
<string name="pref_key_horizontal_space">Jarak horizontal di antara tombol</string>
<string name="pref_key_vertical_space">Jarak vertikal antara tombol</string>
<string name="pref_border_config_title">Kustomisasi tepi</string>
<string name="pref_border_width_title">Lebar tepi</string>
<string name="pref_corners_radius_title">Radius tepi</string>
<string name="pref_circle_sensitivity_title">Sensitivitas gestur melingkar</string>
<string name="pref_circle_sensitivity_e_high">Tinggi</string>
<string name="pref_circle_sensitivity_e_medium">Sedang</string>
<string name="pref_circle_sensitivity_e_low">Rendah</string>
<string name="pref_circle_sensitivity_e_disabled">Mati</string>
<string name="key_action_next">Lanjut</string>
<string name="key_action_done">Selesai</string>
<string name="key_action_go">Pergi</string>
<string name="key_action_prev">Sblm</string>
<string name="key_action_search">Cari</string>
<string name="key_action_send">Kirim</string>
<string name="launcher_button_imesettings">Aktifkan keyboard</string>
<string name="launcher_button_imepicker">Pilih keyboard</string>
<string name="launcher_description">Aplikasi ini adalah keyboard virtual. Buka pengaturan sistem dengan mengklik tombol di bawah ini dan aktifkan Unexpected-Keyboard.</string>
<string name="launcher_sourcecode">Ini adalah aplikasi sumber terbuka dan gratis. Anda dapat menemukan kode sumber atau melaporkan bug di GitHub.</string>
<string name="launcher_tryhere">Setelah mengaktifkan, Anda dapat mencoba keyboard di sini:</string>
<string name="launcher_tryhere_hint">Ketik disini</string>
<string name="key_descr_capslock">Kunci kapital</string>
<string name="key_descr_compose">Menggabungkan</string>
<string name="key_descr_switch_greekmath">Greek &amp; Simbol matematika</string>
<string name="key_descr_change_method">Beralih keyboard</string>
<string name="key_descr_voice_typing">Pengetikan suara</string>
<string name="key_descr_copy">Salin</string>
<string name="key_descr_paste">Tempel</string>
<string name="key_descr_cut">Potong</string>
<string name="key_descr_selectAll">Pilih semua</string>
<string name="key_descr_pasteAsPlainText">Tempel sebagai teks biasa</string>
<string name="key_descr_undo">Undo</string>
<string name="key_descr_redo">Redo</string>
<string name="key_descr_ª">Indikator ordinal</string>
<string name="key_descr_º">Indikator ordinal</string>
<string name="key_descr_superscript">Superscript</string>
<string name="key_descr_subscript">Subscript</string>
<string name="key_descr_page_up">Halaman atas</string>
<string name="key_descr_page_down">Halaman bawah</string>
<string name="key_descr_home">Beranda</string>
<string name="key_descr_end">Akhir</string>
<string name="key_descr_clipboard">Manajer Clipboard</string>
<string name="key_descr_combining">Menggabungkan diakritik</string>
<string name="key_descr_dead_key">Tombol mati</string>
<string name="key_descr_zwj">Joiner lebar nol</string>
<string name="key_descr_zwnj">Lebar nol non-joiner</string>
<string name="key_descr_nbsp">Spasi non-pecah</string>
<string name="key_descr_nnbsp">Spasi sempit non-pecah</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Teks yang baru disalin</string>
<string name="clipboard_pin_heading">Disematkan</string>
<string name="clipboard_remove_confirm">Hapus clipboard ini?</string>
<string name="clipboard_remove_confirmed">Ya</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (debug)</string> <string name="app_name_debug">Unexpected Keyboard (debug)</string>
<string name="short_description">Una Tastiera Virtuale Leggera Per La Programmazione</string> <string name="short_description">Una Tastiera Virtuale Leggera Per La Programmazione</string>
<string name="store_description">La principale funzionalita` e\' che si possono digitare caratteri aggiuntivi scorrendo sui tasti verso gli angoli.\n.\nQuesta app e\' stata inizialmente progettata per i programmatori che usavano Termux.\nOggi e\' perfetta per l\'utilizzo quotidiano,\n.\nQuesta app non contiene pubblicita`, non genera chiamate di rete ed e\' Open Source.</string> <!-- <string name="store_description">"The main feature is that you can type more characters by swiping the keys towards the corners.
<string name="pref_portrait">In modalita` verticale</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> This application was originally designed for programmers using Termux.
<string name="pref_landscape">In modalita` orizzontale</string> Now perfect for everyday use.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Layout</string> This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
<string name="pref_label_brightness">Regolare la luminosita` della descrizione</string> <string name="settings_activity_label">Impostazioni di Unexpected Keyboard</string>
<string name="pref_keyboard_opacity">Regolare l\'opacita` dello sfondo della tastiera</string> <!-- <string name="pref_portrait">In portrait mode</string> -->
<string name="pref_key_opacity">Regolare l\'opacita` dei tasti</string> <!-- <string name="pref_landscape">In landscape mode</string> -->
<string name="pref_key_activated_opacity">Regolare l\'opacita` del tasto premuto</string> <string name="pref_category_layout">Layout</string>
<string name="pref_layout_e_system">Impostazioni di sistema</string> <!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
<string name="pref_layout_e_custom">Layout personalizzato</string> <!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
<string name="pref_layouts_add">Aggiungere un layout alternativo</string> <!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
<string name="pref_layouts_item">Layout %1$d: %2$s</string> <!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
<string name="pref_layouts_remove_custom">Eliminare layout</string> <string name="pref_layout_e_system">Impostazioni di sistema</string>
<string name="pref_custom_layout_title">Layout personalizzato</string> <!-- <string name="pref_layout_e_custom">Custom layout</string> -->
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
<string name="pref_show_numpad_title">Mostrare il tastierino numerico</string> <!-- <string name="pref_custom_layout_title">Custom layout</string> -->
<string name="pref_show_numpad_never">Mai</string> <!-- <string name="pref_show_numpad_title">Show NumPad</string> -->
<string name="pref_show_numpad_landscape">Solo in modalita` orizzontale</string> <!-- <string name="pref_show_numpad_never">Never</string> -->
<string name="pref_show_numpad_always">Sempre</string> <!-- <string name="pref_show_numpad_landscape">Only in landscape mode</string> -->
<string name="pref_number_row_title">Mostrare la riga dei numeri</string> <!-- <string name="pref_show_numpad_always">Always</string> -->
<string name="pref_number_row_summary">Aggiungere una riga dei numeri sopra la tastiera quando il tastierino numerico e\' nascosto</string> <!-- <string name="pref_number_row_title">Show number row</string> -->
<string name="pref_numpad_layout">Layout del yadtierino numerico</string> <!-- <string name="pref_number_row_summary">Add a number row at the top of the keyboard when the numpad is hidden</string> -->
<string name="pref_numpad_layout_e_high_first">Prima i numeri piu` alti</string> <!-- <string name="pref_numpad_layout">NumPad layout</string> -->
<string name="pref_numpad_layout_e_low_first">Prima i numeri piu` bassi</string> <!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
<string name="pref_extra_keys_title">Aggiungi altri simboli alla tastiera</string> <!-- <string name="pref_numpad_layout_e_low_first">Low digits first</string> -->
<string name="pref_extra_keys_custom">Aggiungere tasti personalizzati</string> <!-- <string name="pref_extra_keys_title">Add keys to the keyboard</string> -->
<string name="pref_extra_keys_internal">Selezionare tasti da aggiungere alla tastiera</string> <!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
<string name="pref_category_typing">Digitando</string> <!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
<string name="pref_swipe_dist_title">Distanza swipe</string> <string name="pref_category_typing">Digitando</string>
<string name="pref_swipe_dist_summary">Distanza dei caratteri negli angoli dei tasti (%s)</string> <string name="pref_swipe_dist_title">Distanza swipe</string>
<string name="pref_long_timeout_title">Durata tasto premuto a lungo</string> <string name="pref_swipe_dist_summary">Distanza dei caratteri negli angoli dei tasti (%s)</string>
<string name="pref_long_interval_title">Intervallo ripetizione tasto</string> <!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_keyrepeat_enabled">Ripetizione carattere su tasto premuto a lungo</string> <string name="pref_long_interval_title">Intervallo ripetizione tasto</string>
<string name="pref_lock_double_tap_title">Doppio tocco su Shift per attivare CapsLock</string> <!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_lock_double_tap_summary">Invece di premere i modificatori a lungo</string> <string name="pref_lock_double_tap_title">Doppio tocco su Shift per attivare CapsLock</string>
<string name="pref_category_behavior">Comportamento</string> <string name="pref_lock_double_tap_summary">Invece di premere i modificatori a lungo</string>
<string name="pref_autocapitalisation_title">Maiuscole Automatiche</string> <!-- <string name="pref_category_behavior">Behavior</string> -->
<string name="pref_autocapitalisation_summary">Premi Shift all\'inizio di una frase</string> <string name="pref_autocapitalisation_title">Maiuscole Automatiche</string>
<string name="pref_switch_input_immediate_title">Passare all\'ultima tastiera usata</string> <string name="pref_autocapitalisation_summary">Premi Shift all\'inizio di una frase</string>
<string name="pref_switch_input_immediate_summary">Comportamento del tasto di cambio tastiera</string> <!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> -->
<string name="pref_vibrate_custom">Vibrazione personalizzata</string> <!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> -->
<string name="pref_vibrate_duration_title">Intensita` della vibrazione</string> <!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Stile</string>
<string name="pref_category_style">Stile</string> <string name="pref_margin_bottom_title">Margine inferiore</string>
<string name="pref_margin_bottom_title">Margine inferiore</string> <string name="pref_keyboard_height_title">Altezza tastiera</string>
<string name="pref_keyboard_height_title">Altezza tastiera</string> <string name="pref_horizontal_margin_title">Margine orizzontale</string>
<string name="pref_horizontal_margin_title">Margine orizzontale</string> <string name="pref_character_size_title">Dimensione Caratteri</string>
<string name="pref_character_size_title">Dimensione Caratteri</string> <string name="pref_character_size_summary">Dimensione dei caratteri mostrati sulla tastiera (%.2fx)</string>
<string name="pref_character_size_summary">Dimensione dei caratteri mostrati sulla tastiera (%.2fx)</string> <string name="pref_theme">Tema</string>
<string name="pref_theme">Tema</string> <string name="pref_theme_e_system">Impostazioni di sistema</string>
<string name="pref_theme_e_system">Impostazioni di sistema</string> <string name="pref_theme_e_dark">Scuro</string>
<string name="pref_theme_e_dark">Scuro</string> <string name="pref_theme_e_light">Chiaro</string>
<string name="pref_theme_e_light">Chiaro</string> <string name="pref_theme_e_black">Nero</string>
<string name="pref_theme_e_black">Nero</string> <!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> --> <!-- <string name="pref_theme_e_white">White</string> -->
<!-- <string name="pref_theme_e_white">White</string> --> <!-- <string name="pref_theme_e_epaper">ePaper</string> -->
<!-- <string name="pref_theme_e_epaper">ePaper</string> --> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> --> <!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> --> <!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> --> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> --> <string name="pref_swipe_dist_e_very_short">Veramente breve</string>
<string name="pref_swipe_dist_e_very_short">Veramente breve</string> <string name="pref_swipe_dist_e_short">Breve</string>
<string name="pref_swipe_dist_e_short">Breve</string> <string name="pref_swipe_dist_e_default">Normale</string>
<string name="pref_swipe_dist_e_default">Normale</string> <string name="pref_swipe_dist_e_far">Distante</string>
<string name="pref_swipe_dist_e_far">Distante</string> <string name="pref_swipe_dist_e_very_far">Molto distante</string>
<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_horizontal_space">Spazio orizzontale tra i tasti</string> <string name="pref_key_vertical_space">Spazio verticale tra i tasti</string>
<string name="pref_key_vertical_space">Spazio verticale tra i tasti</string> <!-- <string name="pref_border_config_title">Customize borders</string> -->
<!-- <string name="pref_border_config_title">Customize borders</string> --> <!-- <string name="pref_border_width_title">Border Width</string> -->
<!-- <string name="pref_border_width_title">Border Width</string> --> <!-- <string name="pref_corners_radius_title">Corner radius</string> -->
<!-- <string name="pref_corners_radius_title">Corner radius</string> --> <!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="key_action_next">Prossimo</string>
<string name="key_action_next">Prossimo</string> <string name="key_action_done">Fatto</string>
<string name="key_action_done">Fatto</string> <string name="key_action_go">Vai</string>
<string name="key_action_go">Vai</string> <string name="key_action_prev">Precedente</string>
<string name="key_action_prev">Precedente</string> <string name="key_action_search">Cerca</string>
<string name="key_action_search">Cerca</string> <string name="key_action_send">Invia</string>
<string name="key_action_send">Invia</string> <!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> --> <!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
<!-- <string name="launcher_button_imepicker">Select keyboard</string> --> <!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> --> <!-- <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> -->
<!-- <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> --> <!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> --> <!-- <string name="launcher_tryhere_hint">Try here</string> -->
<!-- <string name="launcher_tryhere_hint">Try here</string> --> <!-- <string name="key_descr_capslock">Caps lock</string> -->
<!-- <string name="key_descr_capslock">Caps lock</string> --> <!-- <string name="key_descr_compose">Compose</string> -->
<!-- <string name="key_descr_compose">Compose</string> --> <!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> -->
<!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> --> <!-- <string name="key_descr_change_method">Switch keyboard</string> -->
<!-- <string name="key_descr_change_method">Switch keyboard</string> --> <!-- <string name="key_descr_voice_typing">Voice typing</string> -->
<!-- <string name="key_descr_voice_typing">Voice typing</string> --> <!-- <string name="key_descr_copy">Copy</string> -->
<!-- <string name="key_descr_copy">Copy</string> --> <!-- <string name="key_descr_paste">Paste</string> -->
<!-- <string name="key_descr_paste">Paste</string> --> <!-- <string name="key_descr_cut">Cut</string> -->
<string name="key_descr_cut">Taglia</string> <!-- <string name="key_descr_selectAll">Select all</string> -->
<string name="key_descr_selectAll">Seleziona tutto</string> <!-- <string name="key_descr_shareText">Share text</string> -->
<string name="key_descr_pasteAsPlainText">Incolla testo non formattato</string> <!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
<string name="key_descr_undo">Annulla</string> <!-- <string name="key_descr_undo">Undo</string> -->
<string name="key_descr_redo">Ripeti</string> <!-- <string name="key_descr_redo">Redo</string> -->
<string name="key_descr_ª">Ordinale</string> <!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
<string name="key_descr_º">Ordinale</string> <!-- <string name="key_descr_º">Ordinal Indicator</string> -->
<string name="key_descr_superscript">All\'esponente</string> <!-- <string name="key_descr_superscript">Superscript</string> -->
<!-- <string name="key_descr_subscript">Subscript</string> --> <!-- <string name="key_descr_subscript">Subscript</string> -->
<string name="key_descr_page_up">Pagina su</string> <!-- <string name="key_descr_page_up">Page Up</string> -->
<string name="key_descr_page_down">Pagina giu`</string> <!-- <string name="key_descr_page_down">Page Down</string> -->
<string name="key_descr_home">Inizio</string> <!-- <string name="key_descr_home">Home</string> -->
<string name="key_descr_end">Fine</string> <!-- <string name="key_descr_end">End</string> -->
<string name="key_descr_clipboard">Clipboard-Manager</string> <!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> --> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="key_descr_dead_key">Tasto vuoto</string> <!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="key_descr_zwj">Zero width joiner</string> --> <!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> --> <!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<string name="key_descr_nbsp">Spazio senza interruzione</string> <!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Testo copiato recentemente</string>
<string name="clipboard_pin_heading">In evidenza</string>
<string name="clipboard_remove_confirm">Eliminare questi appunti?</string>
<string name="clipboard_remove_confirmed">Si</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,130 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (Debug)</string> <string name="app_name_debug">Unexpected Keyboard (Debug)</string>
<string name="short_description">軽量でプライバシーに配慮したAndroid用仮想キーボード</string> <string name="short_description">軽量でプライバシーに配慮したAndroid用仮想キーボード</string>
<string name="store_description">このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。\n\nこのアプリは元々はTermuxでのプログラミング用に設計されました。\nしかし、今では普段の入力にも適しています。\nPCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。\n\nこのアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。</string> <string name="store_description">"このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。
<string name="pref_portrait">縦向き</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> このアプリは元々はTermuxでのプログラミング用に設計されました。
<string name="pref_landscape">横向き</string> しかし、今では普段の入力にも適しています。
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> --> PCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。
<string name="pref_category_layout">レイアウト</string>
<string name="pref_label_brightness">文字の明るさ</string> このアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。"</string>
<string name="pref_keyboard_opacity">背景の不透明度</string> <string name="settings_activity_label">Unexpected Keyboardの設定</string>
<string name="pref_key_opacity">キーの不透明度</string> <string name="pref_portrait">縦向き</string>
<string name="pref_key_activated_opacity">押下中のキーの不透明度</string> <string name="pref_landscape">横向き</string>
<string name="pref_layout_e_system">システム設定</string> <string name="pref_category_layout">レイアウト</string>
<string name="pref_layout_e_custom">カスタムレイアウト</string> <string name="pref_label_brightness">文字の明るさ</string>
<string name="pref_layouts_add">レイアウトを追加</string> <string name="pref_keyboard_opacity">背景の不透明度</string>
<string name="pref_layouts_item">レイアウト %1$d: %2$s</string> <string name="pref_key_opacity">キーの不透明度</string>
<string name="pref_layouts_remove_custom">レイアウトを削除</string> <string name="pref_key_activated_opacity">押下中のキーの不透明度</string>
<string name="pref_custom_layout_title">カスタムレイアウト</string> <string name="pref_layout_e_system">システム設定</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layout_e_custom">カスタムレイアウト</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_add">レイアウトを追加</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_item">レイアウト %1$d: %2$s</string>
<string name="pref_show_numpad_title">テンキーを表示</string> <string name="pref_layouts_remove_custom">レイアウトを削除</string>
<string name="pref_show_numpad_never">表示しない</string> <string name="pref_custom_layout_title">カスタムレイアウト</string>
<string name="pref_show_numpad_landscape">横向きの時は表示</string> <string name="pref_show_numpad_title">テンキーを表示</string>
<string name="pref_show_numpad_always">表示する</string> <string name="pref_show_numpad_never">表示しない</string>
<string name="pref_number_row_title">数字の行を表示</string> <string name="pref_show_numpad_landscape">横向きの時は表示</string>
<string name="pref_number_row_summary">テンキーが非表示の場合最上段に数字の行を追加します</string> <string name="pref_show_numpad_always">表示する</string>
<string name="pref_numpad_layout">テンキーのレイアウト</string> <string name="pref_number_row_title">数字の行を表示</string>
<string name="pref_numpad_layout_e_high_first">大きい数字を上に</string> <string name="pref_number_row_summary">テンキーが非表示の場合最上段に数字の行を追加します</string>
<string name="pref_numpad_layout_e_low_first">小さい数字を上に</string> <string name="pref_numpad_layout">テンキーのレイアウト</string>
<string name="pref_extra_keys_title">追加のキーの設定</string> <string name="pref_numpad_layout_e_high_first">大きい数字を上に</string>
<string name="pref_extra_keys_custom">キーを追加</string> <string name="pref_numpad_layout_e_low_first">小さい数字を上に</string>
<string name="pref_extra_keys_internal">キーボードに表示するキーを選択</string> <string name="pref_extra_keys_title">追加のキーの設定</string>
<string name="pref_category_typing">入力</string> <string name="pref_extra_keys_custom">キーを追加</string>
<string name="pref_swipe_dist_title">スワイプ距離</string> <string name="pref_extra_keys_internal">キーボードに表示するキーを選択</string>
<string name="pref_swipe_dist_summary">キーの角をスワイプする距離 (%s)</string> <string name="pref_category_typing">入力</string>
<string name="pref_long_timeout_title">キー長押しの時間</string> <string name="pref_swipe_dist_title">スワイプ距離</string>
<string name="pref_long_interval_title">キーを連続入力する間隔</string> <string name="pref_swipe_dist_summary">キーの角をスワイプする距離 (%s)</string>
<string name="pref_keyrepeat_enabled">長押しでキーを連続入力する</string> <string name="pref_long_timeout_title">キー長押しの時間</string>
<string name="pref_lock_double_tap_title">ShiftをダブルタップでCaps Lock</string> <string name="pref_long_interval_title">キーを連続入力する間隔</string>
<string name="pref_lock_double_tap_summary">どの装飾キーも長押しで固定できます</string> <string name="pref_keyrepeat_enabled">長押しでキーを連続入力する</string>
<string name="pref_category_behavior">挙動</string> <string name="pref_lock_double_tap_title">ShiftをダブルタップでCaps Lock</string>
<string name="pref_autocapitalisation_title">自動大文字化</string> <string name="pref_lock_double_tap_summary">どの装飾キーも長押しで固定できます</string>
<string name="pref_autocapitalisation_summary">文章の先頭でShiftキーを自動入力</string> <string name="pref_category_behavior">挙動</string>
<string name="pref_switch_input_immediate_title">最後に使用したキーボードに切替</string> <string name="pref_autocapitalisation_title">自動大文字化</string>
<string name="pref_switch_input_immediate_summary">キーボード切替キーの挙動</string> <string name="pref_autocapitalisation_summary">文章の先頭でShiftキーを自動入力</string>
<string name="pref_vibrate_custom">キーボード独自の振動設定</string> <string name="pref_switch_input_immediate_title">最後に使用したキーボードに切替</string>
<string name="pref_vibrate_duration_title">振動の時間</string> <string name="pref_switch_input_immediate_summary">キーボード切替キーの挙動</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_custom">キーボード独自の振動設定</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_vibrate_duration_title">振動の時間</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_title">PIN入力</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_pin_entry_enabled_summary">数字・日付・電話番号入力時</string>
<string name="pref_category_style">表示</string> <string name="pref_category_style">表示</string>
<string name="pref_margin_bottom_title">下の余白</string> <string name="pref_margin_bottom_title">下の余白</string>
<string name="pref_keyboard_height_title">キーボードの高さ</string> <string name="pref_keyboard_height_title">キーボードの高さ</string>
<string name="pref_horizontal_margin_title">左右の余白</string> <string name="pref_horizontal_margin_title">左右の余白</string>
<string name="pref_character_size_title">文字の大きさ</string> <string name="pref_character_size_title">文字の大きさ</string>
<string name="pref_character_size_summary">キーボードに表示される文字の大きさ (%.2fx)</string> <string name="pref_character_size_summary">キーボードに表示される文字の大きさ (%.2fx)</string>
<string name="pref_theme">テーマ</string> <string name="pref_theme">テーマ</string>
<string name="pref_theme_e_system">システム設定</string> <string name="pref_theme_e_system">システム設定</string>
<string name="pref_theme_e_dark">ダークモード</string> <string name="pref_theme_e_dark">ダークモード</string>
<string name="pref_theme_e_light">ライトモード</string> <string name="pref_theme_e_light">ライトモード</string>
<string name="pref_theme_e_black"></string> <string name="pref_theme_e_black"></string>
<string name="pref_theme_e_altblack">黒(別バージョン)</string> <string name="pref_theme_e_altblack">黒(別バージョン)</string>
<string name="pref_theme_e_white"></string> <string name="pref_theme_e_white"></string>
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desert</string> <string name="pref_theme_e_desert">Desert</string>
<string name="pref_theme_e_jungle">Jungle</string> <string name="pref_theme_e_jungle">Jungle</string>
<string name="pref_theme_e_monet">Monet (システム)</string> <string name="pref_theme_e_monet">Monet (システム)</string>
<string name="pref_theme_e_monetlight">Monet (ライト)</string> <string name="pref_theme_e_monetlight">Monet (ライト)</string>
<string name="pref_theme_e_monetdark">Monet (ダーク)</string> <string name="pref_theme_e_monetdark">Monet (ダーク)</string>
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> --> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_swipe_dist_e_very_short">短い</string> <string name="pref_swipe_dist_e_very_short">短い</string>
<string name="pref_swipe_dist_e_short">やや短い</string> <string name="pref_swipe_dist_e_short">やや短い</string>
<string name="pref_swipe_dist_e_default">普通</string> <string name="pref_swipe_dist_e_default">普通</string>
<string name="pref_swipe_dist_e_far">やや長い</string> <string name="pref_swipe_dist_e_far">やや長い</string>
<string name="pref_swipe_dist_e_very_far">長い</string> <string name="pref_swipe_dist_e_very_far">長い</string>
<string name="pref_key_horizontal_space">キー間の左右の間隔</string> <string name="pref_key_horizontal_space">キー間の左右の間隔</string>
<string name="pref_key_vertical_space">キー間の上下の間隔</string> <string name="pref_key_vertical_space">キー間の上下の間隔</string>
<string name="pref_border_config_title">キー形状の設定</string> <string name="pref_border_config_title">キー形状の設定</string>
<string name="pref_border_width_title">縁取り</string> <string name="pref_border_width_title">縁取り</string>
<string name="pref_corners_radius_title">丸み</string> <string name="pref_corners_radius_title">丸み</string>
<string name="pref_circle_sensitivity_title">円形ジェスチャーの感度</string> <string name="pref_circle_sensitivity_title">円形ジェスチャーの感度</string>
<string name="pref_circle_sensitivity_e_high"></string> <string name="pref_circle_sensitivity_e_high"></string>
<string name="pref_circle_sensitivity_e_medium"></string> <string name="pref_circle_sensitivity_e_medium"></string>
<string name="pref_circle_sensitivity_e_low"></string> <string name="pref_circle_sensitivity_e_low"></string>
<string name="pref_circle_sensitivity_e_disabled">無効</string> <string name="pref_circle_sensitivity_e_disabled">無効</string>
<string name="key_action_next">次へ</string> <string name="key_action_next">次へ</string>
<string name="key_action_done">完了</string> <string name="key_action_done">完了</string>
<string name="key_action_go">実行</string> <string name="key_action_go">実行</string>
<string name="key_action_prev">戻る</string> <string name="key_action_prev">戻る</string>
<string name="key_action_search">検索</string> <string name="key_action_search">検索</string>
<string name="key_action_send">送信</string> <string name="key_action_send">送信</string>
<string name="launcher_button_imesettings">キーボードを有効化</string> <string name="launcher_button_imesettings">キーボードを有効化</string>
<string name="launcher_button_imepicker">キーボードを選択</string> <string name="launcher_button_imepicker">キーボードを選択</string>
<string name="launcher_description">このアプリは仮想キーボードです。下のボタンからシステム設定を開いてUnexpected Keyboardを有効化してください。</string> <string name="launcher_description">このアプリは仮想キーボードです。下のボタンからシステム設定を開いてUnexpected Keyboardを有効化してください。</string>
<string name="launcher_sourcecode">このアプリはオープンソースのフリーウェアです。GitHubでソースコードを入手したり、不具合を報告したりできます。</string> <string name="launcher_sourcecode">このアプリはオープンソースのフリーウェアです。GitHubでソースコードを入手したり、不具合を報告したりできます。</string>
<string name="launcher_tryhere">有効化されている場合、ここでキーボードを試すことができます。</string> <string name="launcher_tryhere">有効化されている場合、ここでキーボードを試すことができます。</string>
<string name="launcher_tryhere_hint">文字を入力</string> <string name="launcher_tryhere_hint">文字を入力</string>
<string name="key_descr_capslock">Caps Lock</string> <string name="key_descr_capslock">Caps Lock</string>
<string name="key_descr_compose">Compose</string> <string name="key_descr_compose">Compose</string>
<string name="key_descr_switch_greekmath">ギリシャ文字と数学記号</string> <string name="key_descr_switch_greekmath">ギリシャ文字と数学記号</string>
<string name="key_descr_change_method">キーボードの切替</string> <string name="key_descr_change_method">キーボードの切替</string>
<string name="key_descr_voice_typing">音声入力</string> <string name="key_descr_voice_typing">音声入力</string>
<string name="key_descr_copy">コピー</string> <string name="key_descr_copy">コピー</string>
<string name="key_descr_paste">貼り付け</string> <string name="key_descr_paste">貼り付け</string>
<string name="key_descr_cut">切り取り</string> <string name="key_descr_cut">切り取り</string>
<string name="key_descr_selectAll">すべて選択</string> <string name="key_descr_selectAll">すべて選択</string>
<string name="key_descr_pasteAsPlainText">書式なしで貼り付け</string> <string name="key_descr_shareText">テキストを共有</string>
<string name="key_descr_undo">元に戻す</string> <string name="key_descr_pasteAsPlainText">書式なしで貼り付け</string>
<string name="key_descr_redo">やり直し</string> <string name="key_descr_undo">元に戻す</string>
<string name="key_descr_ª">序数標識</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_º">序数標識</string>
<string name="key_descr_subscript">付き文字</string> <string name="key_descr_superscript">付き文字</string>
<string name="key_descr_page_up">Page Up</string> <string name="key_descr_subscript">下付き文字</string>
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_up">Page Up</string>
<string name="key_descr_home">Home</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_end">End</string> <string name="key_descr_home">Home</string>
<string name="key_descr_clipboard">クリップボード</string> <string name="key_descr_end">End</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> --> <string name="key_descr_clipboard">クリップボード</string>
<!-- <string name="key_descr_dead_key">Dead key</string> --> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="key_descr_zwj">Zero width joiner</string> --> <string name="clipboard_history_heading">最近コピーしたテキスト</string>
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> --> <string name="clipboard_pin_heading">お気に入り</string>
<!-- <string name="key_descr_nbsp">Non-breaking space</string> --> <string name="clipboard_remove_confirm">クリップボードから削除しますか?</string>
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> --> <string name="clipboard_remove_confirmed">はい</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">最近コピーしたテキスト</string>
<string name="clipboard_pin_heading">お気に入り</string>
<string name="clipboard_remove_confirm">クリップボードから削除しますか?</string>
<string name="clipboard_remove_confirmed">はい</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<!-- <string name="app_name_debug">Unexpected Keyboard (Debug)</string> --> <!-- <string name="app_name_debug">Unexpected Keyboard (Debug)</string> -->
<string name="short_description">개발자들을 위한 가벼운 가상 키보드.</string> <string name="short_description">개발자들을 위한 가벼운 가상 키보드.</string>
<string name="store_description">주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.\n\n이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.\n지금은 일상적인 용도로도 완벽합니다.\n\n이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다.</string> <string name="store_description">"주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.
<string name="pref_portrait">세로 화면</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> 이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.
<string name="pref_landscape">가로 화면</string> 지금은 일상적인 용도로도 완벽합니다.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">레이아웃</string> 이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다."</string>
<string name="pref_label_brightness">라벨 밝기 조절</string> <string name="settings_activity_label">Unexpected Keyboard 설정</string>
<string name="pref_keyboard_opacity">키보드 배경 불투명도 조절</string> <string name="pref_portrait">세로 화면</string>
<string name="pref_key_opacity">키 불투명도 조절</string> <string name="pref_landscape">가로 화면</string>
<string name="pref_key_activated_opacity">누른 키 불투명도 조절</string> <string name="pref_category_layout">레이아웃</string>
<string name="pref_layout_e_system">시스템 세팅</string> <string name="pref_label_brightness">라벨 밝기 조절</string>
<string name="pref_layout_e_custom">사용자 정의 레이아웃</string> <string name="pref_keyboard_opacity">키보드 배경 불투명도 조절</string>
<string name="pref_layouts_add">대체 레이아웃 추가</string> <string name="pref_key_opacity">키 불투명도 조절</string>
<string name="pref_layouts_item">레이아웃 %1$d: %2$s</string> <string name="pref_key_activated_opacity">누른 키 불투명도 조절</string>
<string name="pref_layouts_remove_custom">레이아웃 제거</string> <string name="pref_layout_e_system">시스템 세팅</string>
<string name="pref_custom_layout_title">사용자 정의 레이아웃</string> <string name="pref_layout_e_custom">사용자 정의 레이아웃</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">대체 레이아웃 추가</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">레이아웃 %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">레이아웃 제거</string>
<string name="pref_show_numpad_title">NumPad 표시</string> <string name="pref_custom_layout_title">사용자 정의 레이아웃</string>
<string name="pref_show_numpad_never">안 함</string> <string name="pref_show_numpad_title">NumPad 표시</string>
<string name="pref_show_numpad_landscape">가로 모드에서만</string> <string name="pref_show_numpad_never">안 함</string>
<string name="pref_show_numpad_always">항상</string> <string name="pref_show_numpad_landscape">가로 모드에서만</string>
<string name="pref_number_row_title">숫자 열 표시</string> <string name="pref_show_numpad_always">항상</string>
<string name="pref_number_row_summary">NumPad이 숨겨진 경우 키보드 상단에 숫자 행을 추가합니다.</string> <string name="pref_number_row_title">숫자 열 표시</string>
<string name="pref_numpad_layout">NumPad 레이아웃</string> <string name="pref_number_row_summary">NumPad이 숨겨진 경우 키보드 상단에 숫자 행을 추가합니다.</string>
<string name="pref_numpad_layout_e_high_first">높은 자리수 우선</string> <string name="pref_numpad_layout">NumPad 레이아웃</string>
<string name="pref_numpad_layout_e_low_first">은 자리수 우선</string> <string name="pref_numpad_layout_e_high_first">은 자리수 우선</string>
<string name="pref_extra_keys_title">키보드에 추가 키 설정</string> <string name="pref_numpad_layout_e_low_first">낮은 자리수 우선</string>
<string name="pref_extra_keys_custom">사용자 정의 키 추가</string> <string name="pref_extra_keys_title">키보드에 추가 키 설정</string>
<string name="pref_extra_keys_internal">키보드에 추가할선택</string> <string name="pref_extra_keys_custom">사용자 정의추가</string>
<string name="pref_category_typing">입력</string> <string name="pref_extra_keys_internal">키보드에 추가할 키 선택</string>
<string name="pref_swipe_dist_title">스와이프 범위</string> <string name="pref_category_typing">입력</string>
<string name="pref_swipe_dist_summary">키 모서리 문자의 입력 범위 (%s)</string> <string name="pref_swipe_dist_title">스와이프 범위</string>
<string name="pref_long_timeout_title">길게 누르는 시간</string> <string name="pref_swipe_dist_summary">키 모서리 문자의 입력 범위 (%s)</string>
<string name="pref_long_interval_title">키 반복 간격</string> <string name="pref_long_timeout_title">길게 누르는 시간</string>
<string name="pref_keyrepeat_enabled">보드 입력을 길게 유지할 때 반복</string> <string name="pref_long_interval_title">키 반복 간격</string>
<string name="pref_lock_double_tap_title">쉬프트 키 더블 탭을 통해 대문자 잠금 설정</string> <string name="pref_keyrepeat_enabled">키보드 입력을 길게 유지할 때 반복</string>
<string name="pref_lock_double_tap_summary">modifier를 길게 누르고 있으면 해당 modifier가 잠긴 상태로 유지됩니다.</string> <string name="pref_lock_double_tap_title">쉬프트 키 더블 탭을 통해 대문자 잠금 설정</string>
<string name="pref_category_behavior">동작</string> <string name="pref_lock_double_tap_summary">modifier를 길게 누르고 있으면 해당 modifier가 잠긴 상태로 유지됩니다.</string>
<string name="pref_autocapitalisation_title">자동 대문자 전환</string> <string name="pref_category_behavior">동작</string>
<string name="pref_autocapitalisation_summary">문장의 시작에서 Shift 키를 눌러 대문자 전환합니다.</string> <string name="pref_autocapitalisation_title">자동 대문자 전환</string>
<string name="pref_switch_input_immediate_title">마지막으로 사용한 키보드로 전환</string> <string name="pref_autocapitalisation_summary">문장의 시작에서 Shift 키를 눌러 대문자로 전환합니다.</string>
<string name="pref_switch_input_immediate_summary">키보드 전환 키의 동작 방식입니다.</string> <string name="pref_switch_input_immediate_title">마지막으로 사용한 키보드 전환</string>
<string name="pref_vibrate_custom">사용자 정의 진동</string> <string name="pref_switch_input_immediate_summary">키보드 전환 키의 동작 방식입니다.</string>
<string name="pref_vibrate_duration_title">진동 강도</string> <string name="pref_vibrate_custom">사용자 정의 진동</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">진동 강도</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">Pin 입력 레이아웃</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">숫자를 입력할 때, 날짜와 전화번호를 입력할 때 해당 레이아웃이 사용됩니다.</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">스타일</string>
<string name="pref_category_style">스타일</string> <string name="pref_margin_bottom_title">아래 넓이</string>
<string name="pref_margin_bottom_title">아래 넓</string> <string name="pref_keyboard_height_title">키보드 높</string>
<string name="pref_keyboard_height_title">키보드 높</string> <string name="pref_horizontal_margin_title">양 옆 넓</string>
<string name="pref_horizontal_margin_title">양 옆 넓이</string> <string name="pref_character_size_title">폰트 크기</string>
<string name="pref_character_size_title">폰트 크기</string> <string name="pref_character_size_summary">키보드의 표시되는 폰트 크기 (%.2fx)</string>
<string name="pref_character_size_summary">키보드의 표시되는 폰트 크기 (%.2fx)</string> <string name="pref_theme">테마</string>
<string name="pref_theme">테마</string> <string name="pref_theme_e_system">시스템 테마</string>
<string name="pref_theme_e_system">시스템 테마</string> <string name="pref_theme_e_dark">다크</string>
<string name="pref_theme_e_dark">다크</string> <string name="pref_theme_e_light">라이트</string>
<string name="pref_theme_e_light">라이트</string> <string name="pref_theme_e_black">블랙</string>
<string name="pref_theme_e_black">블랙</string> <string name="pref_theme_e_altblack">대체 블랙</string>
<string name="pref_theme_e_altblack">대체 블랙</string> <string name="pref_theme_e_white">화이트</string>
<string name="pref_theme_e_white">화이트</string> <string name="pref_theme_e_epaper">종이</string>
<string name="pref_theme_e_epaper">종이</string> <string name="pref_theme_e_desert">사막</string>
<string name="pref_theme_e_desert">사막</string> <string name="pref_theme_e_jungle">정글</string>
<string name="pref_theme_e_jungle">정글</string> <string name="pref_theme_e_monet">모네트 (시스템)</string>
<string name="pref_theme_e_monet">모네트 (시스템)</string> <string name="pref_theme_e_monetlight">모네트 (라이트)</string>
<string name="pref_theme_e_monetlight">모네트 (라이트)</string> <string name="pref_theme_e_monetdark">모네트 (다크)</string>
<string name="pref_theme_e_monetdark">모네트 (다크)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> --> <string name="pref_swipe_dist_e_very_short">매우 짧음</string>
<string name="pref_swipe_dist_e_very_short">매우 짧음</string> <string name="pref_swipe_dist_e_short">짧음</string>
<string name="pref_swipe_dist_e_short">짧음</string> <string name="pref_swipe_dist_e_default">보통</string>
<string name="pref_swipe_dist_e_default">보통</string> <string name="pref_swipe_dist_e_far">넓음</string>
<string name="pref_swipe_dist_e_far">넓음</string> <string name="pref_swipe_dist_e_very_far">매우 넓음</string>
<string name="pref_swipe_dist_e_very_far">매우 넓음</string> <string name="pref_key_horizontal_space">키보드 양 옆 간격</string>
<string name="pref_key_horizontal_space">키보드 양 옆 간격</string> <string name="pref_key_vertical_space">키보드 세로 간격</string>
<string name="pref_key_vertical_space">키보드 세로 간격</string> <string name="pref_border_config_title">경계선 사용자 정의</string>
<string name="pref_border_config_title">경계선 사용자 정의</string> <string name="pref_border_width_title">경계선 너비</string>
<string name="pref_border_width_title">경계선 너비</string> <string name="pref_corners_radius_title">모서리 반지름</string>
<string name="pref_corners_radius_title">모서리 반지름</string> <string name="pref_circle_sensitivity_title">원형 제스처 감도</string>
<string name="pref_circle_sensitivity_title">원형 제스처 감도</string> <string name="pref_circle_sensitivity_e_high">높음</string>
<string name="pref_circle_sensitivity_e_high">높음</string> <string name="pref_circle_sensitivity_e_medium">중간</string>
<string name="pref_circle_sensitivity_e_medium">중간</string> <string name="pref_circle_sensitivity_e_low">낮음</string>
<string name="pref_circle_sensitivity_e_low">낮음</string> <string name="pref_circle_sensitivity_e_disabled">사용 안 함</string>
<string name="pref_circle_sensitivity_e_disabled">사용 안 함</string> <string name="key_action_next">다음</string>
<string name="key_action_next">다음</string> <string name="key_action_done">확인</string>
<string name="key_action_done">확인</string> <string name="key_action_go">엔터</string>
<string name="key_action_go">엔터</string> <string name="key_action_prev">이전</string>
<string name="key_action_prev">이전</string> <string name="key_action_search">검색</string>
<string name="key_action_search">검색</string> <string name="key_action_send">보내기</string>
<string name="key_action_send">보내기</string> <string name="launcher_button_imesettings">키보드 활성화</string>
<string name="launcher_button_imesettings">키보드 활성화</string> <string name="launcher_button_imepicker">키보드 선택</string>
<string name="launcher_button_imepicker">키보드 선택</string> <string name="launcher_description">이 앱은 가상 키보드입니다.Unexpected-Keyboard를 클릭하여 시스템 설정으로 이동하고 아래 버튼을 클릭하세요.</string>
<string name="launcher_description">이 앱은 가상 키보드입니다.Unexpected-Keyboard를 클릭하여 시스템 설정으로 이동하고 아래 버튼을 클릭하세요.</string> <string name="launcher_sourcecode">이것은 무료이고 오픈 소스 응용 프로그램입니다. GitHub에서 원본 코드를 찾을 수 있습니다 또는 버그를 신고할 수 있습니다.</string>
<string name="launcher_sourcecode">이것은 무료이고 오픈 소스 응용 프로그램입니다. GitHub에서 원본 코드를 찾을 수 있습니다 또는 버그를 신고할 수 있습니다.</string> <string name="launcher_tryhere">켜면 여기에서 키보드를 시험해 볼 수 있습니다:</string>
<string name="launcher_tryhere">켜면 여기키보드를 시험해 볼 수 있습니다:</string> <string name="launcher_tryhere_hint">여기서 시험해 보기</string>
<string name="launcher_tryhere_hint">여기서 시험해 보기</string> <string name="key_descr_capslock">대문자 잠금</string>
<string name="key_descr_capslock">대문자 잠금</string> <string name="key_descr_compose">구성</string>
<string name="key_descr_compose">구성</string> <string name="key_descr_switch_greekmath">그리스 수학 기호 전환</string>
<string name="key_descr_switch_greekmath">그리스 수학 기호 전환</string> <string name="key_descr_change_method">키보드 전환</string>
<string name="key_descr_change_method">키보드 전환</string> <string name="key_descr_voice_typing">음성 입력</string>
<string name="key_descr_voice_typing">음성 입력</string> <string name="key_descr_copy">복사</string>
<string name="key_descr_copy">복사</string> <string name="key_descr_paste">붙여넣기</string>
<string name="key_descr_paste">붙여넣</string> <string name="key_descr_cut">자르</string>
<string name="key_descr_cut">자르기</string> <string name="key_descr_selectAll">전부 선택</string>
<string name="key_descr_selectAll">전부 선택</string> <string name="key_descr_shareText">텍스트 공유</string>
<string name="key_descr_pasteAsPlainText">일반 텍스트로 붙여넣기</string> <string name="key_descr_pasteAsPlainText">일반 텍스트로 붙여넣기</string>
<string name="key_descr_undo">실행 취소</string> <string name="key_descr_undo">실행 취소</string>
<string name="key_descr_redo">다시 실행</string> <string name="key_descr_redo">다시 실행</string>
<string name="key_descr_ª">순서 표시기</string> <string name="key_descr_ª">순서 표시기</string>
<string name="key_descr_º">순서 표시기</string> <string name="key_descr_º">순서 표시기</string>
<string name="key_descr_superscript">상위 스크립트</string> <string name="key_descr_superscript">상위 스크립트</string>
<string name="key_descr_subscript">하위 스크립트</string> <string name="key_descr_subscript">하위 스크립트</string>
<string name="key_descr_page_up">페이지 위</string> <string name="key_descr_page_up">페이지 위</string>
<string name="key_descr_page_down">페이지 아래</string> <string name="key_descr_page_down">페이지 아래</string>
<string name="key_descr_home"></string> <string name="key_descr_home"></string>
<string name="key_descr_end">종료</string> <string name="key_descr_end">종료</string>
<string name="key_descr_clipboard">클립보드 관리자</string> <string name="key_descr_clipboard">클립보드 관리자</string>
<!-- <string name="key_descr_combining">Combining diacritic</string> --> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="key_descr_dead_key">Dead key</string> --> <string name="clipboard_history_heading">최근에 복사한 텍스트</string>
<!-- <string name="key_descr_zwj">Zero width joiner</string> --> <string name="clipboard_pin_heading">고정</string>
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> --> <string name="clipboard_remove_confirm">이 클립보드를 제거하시겠습니까?</string>
<!-- <string name="key_descr_nbsp">Non-breaking space</string> --> <string name="clipboard_remove_confirmed"></string>
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">최근에 복사한 텍스트</string>
<string name="clipboard_pin_heading">고정</string>
<string name="clipboard_remove_confirm">이 클립보드를 제거하시겠습니까?</string>
<string name="clipboard_remove_confirmed"></string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,131 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (atkļūdošana)</string> <string name="app_name_debug">Unexpected Keyboard (atkļūdošana)</string>
<string name="short_description">Mazizmēra virtuālā Android tastatūra, kurai rūp privātums.</string> <string name="short_description">Mazizmēra un privātumu ievērojoša virtuālā Android tastatūra.</string>
<string name="store_description">Galvenā tastatūras iespēja ir viegli ievadīt vairāk rakstzīmju ar pavilkšanu uz taustiņu stūriem.\n\nSākotnēji šī lietotne tika izstrādāta programmētājiem, kas izmanto Termux.\nTagad tā lieliski piemērota ikdienas lietošanai.\n\nLietotne nesatur reklāmas, neveic nekādus tīkla pieprasījumus, un tās pirmkods ir pieejams visiem.</string> <string name="store_description">"Galvenā iezīme ir iespēja ievadīt vairāk rakstzīmju ar pavilkšanu uz taustiņu stūriem.
<string name="pref_portrait">Stateniski</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Šī lietotne sākotnēji tika izstrādāta programmētājiem, kas izmanto Termux.
<string name="pref_landscape">Līmeniski</string> Tagad lieliski piemērota izmantošanai ikdienā.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Izkārtojums</string> Šī lietotne nesatur reklāmas, neveic nekādus tīkla pieprasījumus, un tās pirmkods ir pieejams visiem."</string>
<string name="pref_label_brightness">Pielāgot iezīmju spilgtumu</string> <string name="settings_activity_label">Unexpected Keyboard iestatījumi</string>
<string name="pref_keyboard_opacity">Pielāgot tastatūras fona necaurredzamību</string> <string name="pref_portrait">Stateniski</string>
<string name="pref_key_opacity">Pielāgot taustiņu necaurredzamību</string> <string name="pref_landscape">Guleniski</string>
<string name="pref_key_activated_opacity">Pielāgot piespiesta taustiņa necaurredzamību</string> <string name="pref_category_layout">Izkārtojums</string>
<string name="pref_layout_e_system">Ierīces iestatījumi</string> <string name="pref_label_brightness">Pielāgot iezīmju spilgtumu</string>
<string name="pref_layout_e_custom">Pielāgots izkārtojums</string> <string name="pref_keyboard_opacity">Pielāgot tastatūras fona necaurredzamību</string>
<string name="pref_layouts_add">Pievienot aizstājējizkārtojumu</string> <string name="pref_key_opacity">Pielāgot taustiņu necaurredzamību</string>
<string name="pref_layouts_item">Izkārtojums %1$d: %2$s</string> <string name="pref_key_activated_opacity">Pielāgot piespiesta taustiņa necaurredzamību</string>
<string name="pref_layouts_remove_custom">Noņemt izkārtojumu</string> <string name="pref_layout_e_system">Ierīces iestatījumi</string>
<string name="pref_custom_layout_title">Pielāgots izkārtojums</string> <string name="pref_layout_e_custom">Pielāgots izkārtojums</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">Pievienot aizstājējizkārtojumu</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">Izkārtojums %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">Noņemt izkārtojumu</string>
<string name="pref_show_numpad_title">Rādīt ciparnīcu</string> <string name="pref_custom_layout_title">Pielāgots izkārtojums</string>
<string name="pref_show_numpad_never">Nekad</string> <string name="pref_show_numpad_title">Rādīt ciparnīcu</string>
<string name="pref_show_numpad_landscape">Tikai līmeniskajā stāvoklī</string> <string name="pref_show_numpad_never">Nekad</string>
<string name="pref_show_numpad_always">Vienmēr</string> <string name="pref_show_numpad_landscape">Tikai guleniskajā skatā</string>
<string name="pref_number_row_title">Rādīt ciparu rindu</string> <string name="pref_show_numpad_always">Vienmēr</string>
<string name="pref_number_row_summary">Pievienot ciparu rindu virs tastatūras, kad ciparnīca ir paslēpta</string> <string name="pref_number_row_title">Rādīt ciparu rindu</string>
<string name="pref_numpad_layout">Ciparnīcas izkārtojums</string> <string name="pref_number_row_summary">Pievienot ciparu rindu virs tastatūras, kad ciparnīca ir paslēpta</string>
<string name="pref_numpad_layout_e_high_first">Lielie cipari augšā</string> <string name="pref_numpad_layout">Ciparnīcas izkārtojums</string>
<string name="pref_numpad_layout_e_low_first">Mazie cipari augšā</string> <string name="pref_numpad_layout_e_high_first">Vispirms lielākie cipari</string>
<string name="pref_extra_keys_title">Pievienot tastatūrai taustiņus</string> <string name="pref_numpad_layout_e_low_first">Vispirms mazākie cipari</string>
<string name="pref_extra_keys_custom">Pievienot pielāgotus taustiņus</string> <string name="pref_extra_keys_title">Pievienot tastatūrai taustiņus</string>
<string name="pref_extra_keys_internal">Atlasīt taustiņus, ko pievienot tastatūrai</string> <string name="pref_extra_keys_custom">Pievienot pielāgotus taustiņus</string>
<string name="pref_category_typing">Rakstīšana</string> <string name="pref_extra_keys_internal">Atlasīt taustiņus, ko pievienot tastatūrai</string>
<string name="pref_swipe_dist_title">Pavilkšanas attālums</string> <string name="pref_category_typing">Rakstīšana</string>
<string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string> <string name="pref_swipe_dist_title">Pavilkšanas attālums</string>
<string name="pref_long_timeout_title">Ilgas piespiešanas noildze</string> <string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string>
<string name="pref_long_interval_title">Laiks starp taustiņa atkārtošanos</string> <string name="pref_long_timeout_title">Ilgas piepiešanas noildze</string>
<string name="pref_keyrepeat_enabled">Taustiņa atkārtošanās ar ilgu piespiešanu</string> <string name="pref_long_interval_title">Taustiņa atkārtošanās aizture</string>
<string name="pref_lock_double_tap_title">Divkāršs piesitiens pārslēdzējam, lai ieslēgtu burtslēgu</string> <string name="pref_keyrepeat_enabled">Taustiņa atkārtošanās ar ilgu piespiešanu</string>
<string name="pref_lock_double_tap_summary">Jebkuru pārveidotāju var slēgt ar tā turēšanu</string> <string name="pref_lock_double_tap_title">Divkāršs piesitiens burtslēgam</string>
<string name="pref_category_behavior">Uzvedība</string> <string name="pref_lock_double_tap_summary">Tā vietā, lai ilstoši piespiestu pārveidotāju</string>
<string name="pref_autocapitalisation_title">Automātiski lielie burti</string> <string name="pref_category_behavior">Uzvedība</string>
<string name="pref_autocapitalisation_summary">Piespiest pārslēdzēju teikuma sākumā</string> <string name="pref_autocapitalisation_title">Automātiski lielie burti</string>
<string name="pref_switch_input_immediate_title">Pārslēgties uz pēdējo izmantoto tastatūru</string> <string name="pref_autocapitalisation_summary">Piespiest Shift teikuma sākumā</string>
<string name="pref_switch_input_immediate_summary">Tastatūras pārslēgšanas taustiņa uzvedība</string> <string name="pref_switch_input_immediate_title">Pārslēgties uz pēdējo izmantoto tastatūru</string>
<string name="pref_vibrate_custom">Pielāgota trīcēšana</string> <string name="pref_switch_input_immediate_summary">Tastatūras pārslēgšanas taustiņa uzvedība</string>
<string name="pref_vibrate_duration_title">Trīcēšanas stiprums</string> <string name="pref_vibrate_custom">Pielāgota trīcēšana</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">Trīcēšanas stiprums</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">Piespraust ievadīšanas izkārtojumu</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">Kad ievada skaitļus, datumus un tālruņa numurus</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Izskata pielāgojumi</string>
<string name="pref_category_style">Izskata pielāgojumi</string> <string name="pref_margin_bottom_title">Apakšējā apmale</string>
<string name="pref_margin_bottom_title">Apakšējā apmale</string> <string name="pref_keyboard_height_title">Tastatūras augstums</string>
<string name="pref_keyboard_height_title">Tastatūras augstums</string> <string name="pref_horizontal_margin_title">Līmeniskā apmale</string>
<string name="pref_horizontal_margin_title">Līmeniskā apmale</string> <string name="pref_character_size_title">Iezīmes izmērs</string>
<string name="pref_character_size_title">Iezīmes izmērs</string> <string name="pref_character_size_summary">Tastatūrā attēloto rakstzīmju izmērs (%.2fx)</string>
<string name="pref_character_size_summary">Tastatūrā attēloto rakstzīmju izmērs (%.2fx)</string> <string name="pref_theme">Izskats</string>
<string name="pref_theme">Izskats</string> <string name="pref_theme_e_system">Ierīces iestatījumi</string>
<string name="pref_theme_e_system">Ierīces iestatījumi</string> <string name="pref_theme_e_dark">Tumšs</string>
<string name="pref_theme_e_dark">Tumšs</string> <string name="pref_theme_e_light">Gaišs</string>
<string name="pref_theme_e_light">Gaišs</string> <string name="pref_theme_e_black">Melns</string>
<string name="pref_theme_e_black">Melns</string> <string name="pref_theme_e_altblack">Citādi melns</string>
<string name="pref_theme_e_altblack">Citādi melns</string> <string name="pref_theme_e_white">Balts</string>
<string name="pref_theme_e_white">Balts</string> <string name="pref_theme_e_epaper">ePapīrs</string>
<string name="pref_theme_e_epaper">ePapīrs</string> <string name="pref_theme_e_desert">Tuksnesis</string>
<string name="pref_theme_e_desert">Tuksnesis</string> <string name="pref_theme_e_jungle">Džungļi</string>
<string name="pref_theme_e_jungle">Džungļi</string> <string name="pref_theme_e_monet">Monē (sistēmas)</string>
<string name="pref_theme_e_monet">Monē (sistēmas)</string> <string name="pref_theme_e_monetlight">Monē (gaišs)</string>
<string name="pref_theme_e_monetlight">Monē (gaišs)</string> <string name="pref_theme_e_monetdark">Monē (tumšs)</string>
<string name="pref_theme_e_monetdark">Monē (tumšs)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_theme_e_rosepine">Sārtā priede</string> <string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string>
<string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string> <string name="pref_swipe_dist_e_short">Tuvs</string>
<string name="pref_swipe_dist_e_short">Tuvs</string> <string name="pref_swipe_dist_e_default">Vidējs</string>
<string name="pref_swipe_dist_e_default">Vidējs</string> <string name="pref_swipe_dist_e_far">Tāls</string>
<string name="pref_swipe_dist_e_far">Tāls</string> <string name="pref_swipe_dist_e_very_far">Ļoti tāls</string>
<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_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_key_vertical_space">Stateniskais attālums starp taustiņiem</string> <string name="pref_border_config_title">Pielāgot apmales</string>
<string name="pref_border_config_title">Pielāgot apmales</string> <string name="pref_border_width_title">Apmales platums</string>
<string name="pref_border_width_title">Apmales platums</string> <string name="pref_corners_radius_title">Stūru rādiuss</string>
<string name="pref_corners_radius_title">Stūru rādiuss</string> <string name="pref_circle_sensitivity_title">Apļveida kustības jutīgums</string>
<string name="pref_circle_sensitivity_title">Apļveida kustības jutīgums</string> <string name="pref_circle_sensitivity_e_high">Augsts</string>
<string name="pref_circle_sensitivity_e_high">Augsts</string> <string name="pref_circle_sensitivity_e_medium">Vidējs</string>
<string name="pref_circle_sensitivity_e_medium">Vidējs</string> <string name="pref_circle_sensitivity_e_low">Zems</string>
<string name="pref_circle_sensitivity_e_low">Zems</string> <string name="pref_circle_sensitivity_e_disabled">Atspējots</string>
<string name="pref_circle_sensitivity_e_disabled">Atspējots</string> <string name="key_action_next">Nākamais</string>
<string name="key_action_next">Nākamais</string> <string name="key_action_done">Darīts</string>
<string name="key_action_done">Darīts</string> <string name="key_action_go">Aiziet</string>
<string name="key_action_go">Aiziet</string> <string name="key_action_prev">Iepriekšējais</string>
<string name="key_action_prev">Iepriekšējais</string> <string name="key_action_search">Meklēt</string>
<string name="key_action_search">Meklēt</string> <string name="key_action_send">Sūtīt</string>
<string name="key_action_send">Sūtīt</string> <string name="launcher_button_imesettings">Iespējot tastatūru</string>
<string name="launcher_button_imesettings">Iespējot tastatūru</string> <string name="launcher_button_imepicker">Izvēlēties tastatūru</string>
<string name="launcher_button_imepicker">Izvēlēties tastatūru</string> <string name="launcher_description">Šī lietotne ir virtuālā tastatūra.
<string name="launcher_description">Šī lietotne ir virtuālā tastatūra. Zemāk esošās pogas nospiešana atvērs sistēmas iestatījumus, lai varētu iespējot Unexpected Keyboard.</string> Ar zemāk esošo pogu var atvērt sistēmas iestatījumus un iespējot Unexpected Keyboard.</string>
<string name="launcher_sourcecode">Šī ir bezmaksas un atvērtā pirmkoda lietotne. GitHub var atrast pirmkodu un ziņot par nepilnībām.</string> <string name="launcher_sourcecode">Šī ir bezmaksas un atvērtā pirmkoda lietotne.
<string name="launcher_tryhere">Pēc iespējošanas šeit var izmēģināt tastatūru:</string> GitHub var atrast pirmkodu un ziņot par nepilnībām.</string>
<string name="launcher_tryhere_hint">Izmēģināt šeit</string> <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="launcher_tryhere_hint">Izmēģināt šeit</string>
<string name="key_descr_compose">Izveidot</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_compose">Izveidot</string>
<string name="key_descr_change_method">Pārslēgt tastatūru</string> <string name="key_descr_switch_greekmath">Grieķu un matemātikas rakstzīmes</string>
<string name="key_descr_voice_typing">Rakstīšana ar balsi</string> <string name="key_descr_change_method">Pārslēgt tastatūru</string>
<string name="key_descr_copy">Ievietot starpliktuvē</string> <string name="key_descr_voice_typing">Rakstīšana ar balsi</string>
<string name="key_descr_paste">Ielīmēt</string> <string name="key_descr_copy">Ievietot starpliktuvē</string>
<string name="key_descr_cut">Izgriezt</string> <string name="key_descr_paste">Ielīmēt</string>
<string name="key_descr_selectAll">Atlasīt visu</string> <string name="key_descr_cut">Izgriezt</string>
<string name="key_descr_pasteAsPlainText">Ielīmēt kā vienkāršu tekstu</string> <string name="key_descr_selectAll">Iezīmēt visu</string>
<string name="key_descr_undo">Atsaukt</string> <string name="key_descr_shareText">Kopīgot tekstu</string>
<string name="key_descr_redo">Atatsaukt</string> <string name="key_descr_pasteAsPlainText">Ielīmēt kā vienkāršu tekstu</string>
<string name="key_descr_ª">Kārtas rādītājs</string> <string name="key_descr_undo">Atsaukt</string>
<string name="key_descr_º">Kārtas rādītājs</string> <string name="key_descr_redo">Atatsaukt</string>
<string name="key_descr_superscript">Augšraksts</string> <string name="key_descr_ª">Kārtas rādītājs</string>
<string name="key_descr_subscript">Apakšraksts</string> <string name="key_descr_º">Kārtas rādītājs</string>
<string name="key_descr_page_up">Augšupšķirt</string> <string name="key_descr_superscript">Augšraksts</string>
<string name="key_descr_page_down">Lejupšķirt</string> <string name="key_descr_subscript">Apakšraksts</string>
<string name="key_descr_home">Sākums</string> <string name="key_descr_page_up">Augšupšķirt</string>
<string name="key_descr_end">Beigas</string> <string name="key_descr_page_down">Lejupšķirt</string>
<string name="key_descr_clipboard">Starpliktuves pārvaldnieks</string> <string name="key_descr_home">Sākums</string>
<string name="key_descr_combining">Apvienojoša diakritiska zīme</string> <string name="key_descr_end">Beigas</string>
<string name="key_descr_dead_key">Klusais taustiņš</string> <string name="key_descr_clipboard">Starpliktuves pārvaldnieks</string>
<string name="key_descr_zwj">Nulles platuma savienotājs</string> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="key_descr_zwnj">Nulles platuma atdalītājs</string> <string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
<string name="key_descr_nbsp">Nedalāma atstarpe</string> <string name="clipboard_pin_heading">Piesprausts</string>
<string name="key_descr_nnbsp">Šaura nedalāma atstarpe</string> <string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> --> <string name="clipboard_remove_confirmed"></string>
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
<string name="clipboard_pin_heading">Piesprausts</string>
<string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>
<string name="clipboard_remove_confirmed"></string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
<string name="short_description">Lichtgewicht en privacy-bewust virtueel toetsenbord voor Android.</string>
<string name="store_description">De belangrijkste functie is dat je meer tekens kunt typen door de toetsen naar de hoeken te vegen.\n\nDeze applicatie is oorspronkelijk ontworpen voor programmeurs die Termux gebruiken.\nNu perfect voor dagelijks gebruik.\n\nDeze applicatie bevat geen advertenties, doet geen netwerkverzoeken en is Open Source.</string>
<string name="pref_portrait">In staande stand</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">In liggende stand</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Lay-out</string>
<string name="pref_label_brightness">Helderheid label aanpassen</string>
<string name="pref_keyboard_opacity">Dekking achtergrond van toetsenbord aanpassen</string>
<string name="pref_key_opacity">Dekking achtergrond toets aanpassen</string>
<string name="pref_key_activated_opacity">Dekking achtergrond ingedrukte toets aanpassen</string>
<string name="pref_layout_e_system">Systeem instellingen</string>
<string name="pref_layout_e_custom">Aangepaste lay-out</string>
<string name="pref_layouts_add">Alternatieve lay-out toevoegen</string>
<string name="pref_layouts_item">Lay-out %1$d: %2$s</string>
<string name="pref_layouts_remove_custom">Lay-out verwijderen</string>
<string name="pref_custom_layout_title">Aangepaste lay-out</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> -->
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> -->
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> -->
<string name="pref_show_numpad_title">Toon NumPad</string>
<string name="pref_show_numpad_never">Nooit</string>
<string name="pref_show_numpad_landscape">Alleen in liggende stand</string>
<string name="pref_show_numpad_always">Altijd</string>
<string name="pref_number_row_title">Toon getallenrij</string>
<string name="pref_number_row_summary">Voeg getallenrij toe aan de bovenkant van het toetsenbord als het Num-Pad verborgen is</string>
<string name="pref_numpad_layout">NumPad lay-out</string>
<string name="pref_numpad_layout_e_high_first">Hoogste cijfers eerst</string>
<string name="pref_numpad_layout_e_low_first">Laagste cijfers eerst</string>
<string name="pref_extra_keys_title">Voeg toetsen toe aan toetsenbord</string>
<string name="pref_extra_keys_custom">Voeg aangepaste toetsen toe</string>
<string name="pref_extra_keys_internal">Selecteer toetsen om aan toetsenbord toe te voegen</string>
<string name="pref_category_typing">Typen</string>
<string name="pref_swipe_dist_title">Veeg afstand</string>
<string name="pref_swipe_dist_summary">Afstand van tekens in de hoeken van de toetsen (%s)</string>
<string name="pref_long_timeout_title">Time-out lang indrukken</string>
<string name="pref_long_interval_title">Toetsherhaalinterval</string>
<string name="pref_keyrepeat_enabled">Toetsherhaling bij lang indrukken</string>
<string name="pref_lock_double_tap_title">Dubbeltikken op shift voor caps lock</string>
<string name="pref_lock_double_tap_summary">Je kunt elke modifier vergrendelen door deze ingedrukt te houden</string>
<string name="pref_category_behavior">Gedrag</string>
<string name="pref_autocapitalisation_title">Automatische starthoofdletter</string>
<string name="pref_autocapitalisation_summary">Druk Shift aan de begin van een zin</string>
<string name="pref_switch_input_immediate_title">Wissel naar het laatst gebruikte toetsenbord</string>
<string name="pref_switch_input_immediate_summary">Gedrag van de toestsenbord-wissel-toets</string>
<string name="pref_vibrate_custom">Aangepaste trilling</string>
<string name="pref_vibrate_duration_title">Trillingsintensiteit</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> -->
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> -->
<!-- <string name="pref_number_entry_layout_number">Number pane</string> -->
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> -->
<string name="pref_category_style">Stijl</string>
<string name="pref_margin_bottom_title">Ondermarge</string>
<string name="pref_keyboard_height_title">Hoogte toetsenbord</string>
<string name="pref_horizontal_margin_title">Hor. marge</string>
<string name="pref_character_size_title">Label afmeting</string>
<string name="pref_character_size_summary">Afmeting van karakters getoond op het toetsenbord (%.2fx)</string>
<string name="pref_theme">Thema</string>
<string name="pref_theme_e_system">Systeem instellingen</string>
<string name="pref_theme_e_dark">Donker</string>
<string name="pref_theme_e_light">Licht</string>
<string name="pref_theme_e_black">Zwart</string>
<string name="pref_theme_e_altblack">Alternatief zwart</string>
<string name="pref_theme_e_white">Wit</string>
<string name="pref_theme_e_epaper">ePapier</string>
<string name="pref_theme_e_desert">Woestijn</string>
<string name="pref_theme_e_jungle">Oerwoud</string>
<string name="pref_theme_e_monet">Monet (Systeem)</string>
<string name="pref_theme_e_monetlight">Monet (Licht)</string>
<string name="pref_theme_e_monetdark">Monet (Donker)</string>
<string name="pref_theme_e_rosepine">Rosé Pine</string>
<string name="pref_swipe_dist_e_very_short">Zeer kort</string>
<string name="pref_swipe_dist_e_short">Kort</string>
<string name="pref_swipe_dist_e_default">Normaal</string>
<string name="pref_swipe_dist_e_far">Ver</string>
<string name="pref_swipe_dist_e_very_far">Zeer ver</string>
<string name="pref_key_horizontal_space">Hor. ruimte tussen toetsen</string>
<string name="pref_key_vertical_space">Vert. ruimte tussen toetsen</string>
<string name="pref_border_config_title">Randen aanpassen</string>
<string name="pref_border_width_title">Randbreedte</string>
<string name="pref_corners_radius_title">Hoekstraal</string>
<string name="pref_circle_sensitivity_title">Gevoeligheid cirkelbewegingen</string>
<string name="pref_circle_sensitivity_e_high">Hoog</string>
<string name="pref_circle_sensitivity_e_medium">Medium</string>
<string name="pref_circle_sensitivity_e_low">Laag</string>
<string name="pref_circle_sensitivity_e_disabled">Uitgeschakeld</string>
<string name="key_action_next">Volgende</string>
<string name="key_action_done">Klaar</string>
<string name="key_action_go">Ga</string>
<string name="key_action_prev">Vorig</string>
<string name="key_action_search">Zoek</string>
<string name="key_action_send">Stuur</string>
<string name="launcher_button_imesettings">Toetsenbord inschakelen</string>
<string name="launcher_button_imepicker">Selecteer toetsenbord</string>
<string name="launcher_description">Deze toepassing is een virtueel toetsenbord. Ga naar de systeeminstellingen door op onderstaande knop te klikken en schakel Unexpected-Keyboard in.</string>
<string name="launcher_sourcecode">Dit is een gratis en open source toepassing. Je kunt de broncode vinden of bugs rapporteren op GitHub.</string>
<string name="launcher_tryhere">Na inschakelen kun je het toetsenbord hier proberen:</string>
<string name="launcher_tryhere_hint">Probeer hier</string>
<string name="key_descr_capslock">Caps lock</string>
<string name="key_descr_compose">Stel samen</string>
<string name="key_descr_switch_greekmath">Griekse &amp; math. symbolen</string>
<string name="key_descr_change_method">Wissel toetsenbord</string>
<string name="key_descr_voice_typing">Spraakgestuurd typen</string>
<string name="key_descr_copy">Kopieer</string>
<string name="key_descr_paste">Plak</string>
<string name="key_descr_cut">Knip</string>
<string name="key_descr_selectAll">Selecteer alles</string>
<string name="key_descr_pasteAsPlainText">Plak als platte tekst</string>
<string name="key_descr_undo">Maak ongedaan</string>
<string name="key_descr_redo">Do opnieuw</string>
<string name="key_descr_ª">Rangtelwoord Indicatie</string>
<string name="key_descr_º">Rangtelwoord Indicatie</string>
<string name="key_descr_superscript">Superscript</string>
<string name="key_descr_subscript">Subscript</string>
<string name="key_descr_page_up">Pagina Omhoog</string>
<string name="key_descr_page_down">Pagina Omlaag</string>
<string name="key_descr_home">Thuis</string>
<string name="key_descr_end">Einde</string>
<string name="key_descr_clipboard">Klembord beheerder</string>
<string name="key_descr_combining">Diakritische tekens combineren</string>
<string name="key_descr_dead_key">Dode toets</string>
<string name="key_descr_zwj">Zero width joiner</string>
<string name="key_descr_zwnj">Zero width non-joiner</string>
<string name="key_descr_nbsp">Niet-onderbrekende spatie</string>
<string name="key_descr_nnbsp">Smalle niet-onderbrekende spatie</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Recentelijk gekopieerde tekst</string>
<string name="clipboard_pin_heading">Vastgemaakt</string>
<string name="clipboard_remove_confirm">Verwijder dit klembord?</string>
<string name="clipboard_remove_confirmed">Ja</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (debug)</string> <string name="app_name_debug">Unexpected Keyboard (debug)</string>
<string name="short_description">Lekka i dbająca o prywatność klawiatura wirtualna dla Androida.</string> <string name="short_description">Lekka i dbająca o prywatność klawiatura wirtualna dla Androida.</string>
<string name="store_description">Główną cechą tej klawiatury jest możliwość wprowadzania więcej znaków poprzez przesuwanie po klawiszach do ich rogów.\n\nTa aplikacja została pierwotnie zaprojektowana z myślą o programistach używających Termuxa.\nObecnie nadaje się doskonale do codziennego użytku.\n\nAplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źródłowy jest dostępny publicznie.</string> <string name="store_description">"Główną cechą tej klawiatury jest możliwość wprowadzania więcej znaków poprzez przesuwanie po klawiszach do ich rogów.
<string name="pref_portrait">W widoku pionowym</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Ta aplikacja została pierwotnie zaprojektowana z myślą o programistach używających Termuxa.
<string name="pref_landscape">W widoku poziomym</string> Obecnie nadaje się doskonale do codziennego użytku.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Układ</string> Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źródłowy jest dostępny publicznie."</string>
<string name="pref_label_brightness">Dostosuj jasność znaków</string> <string name="settings_activity_label">Ustawienia Unexpected Keyboard</string>
<string name="pref_keyboard_opacity">Nieprzezroczystość tła klawiatury</string> <string name="pref_portrait">W widoku pionowym</string>
<string name="pref_key_opacity">Nieprzezroczystość klawisza</string> <string name="pref_landscape">W widoku poziomym</string>
<string name="pref_key_activated_opacity">Nieprzezroczystość naciśniętego klawisza</string> <string name="pref_category_layout">Układ</string>
<string name="pref_layout_e_system">Systemowy</string> <string name="pref_label_brightness">Dostosuj jasność znaków</string>
<string name="pref_layout_e_custom">Własny układ</string> <string name="pref_keyboard_opacity">Nieprzezroczystość tła klawiatury</string>
<string name="pref_layouts_add">Dodaj dodatkowy układ</string> <string name="pref_key_opacity">Nieprzezroczystość klawisza</string>
<string name="pref_layouts_item">Układ %1$d: %2$s</string> <string name="pref_key_activated_opacity">Nieprzezroczystość naciśniętego klawisza</string>
<string name="pref_layouts_remove_custom">Usuń układ</string> <string name="pref_layout_e_system">Systemowy</string>
<string name="pref_custom_layout_title">Własny układ</string> <string name="pref_layout_e_custom">Własny układ</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">Dodaj dodatkowy układ</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">Układ %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">Usuń układ</string>
<string name="pref_show_numpad_title">Pokaż klawiaturę numeryczną</string> <string name="pref_custom_layout_title">Własny układ</string>
<string name="pref_show_numpad_never">Nigdy</string> <string name="pref_show_numpad_title">Pokaż klawiaturę numeryczną</string>
<string name="pref_show_numpad_landscape">Tylko w orientacji poziomej</string> <string name="pref_show_numpad_never">Nigdy</string>
<string name="pref_show_numpad_always">Zawsze</string> <string name="pref_show_numpad_landscape">Tylko w orientacji poziomej</string>
<string name="pref_number_row_title">Pokaż rząd cyfr</string> <string name="pref_show_numpad_always">Zawsze</string>
<string name="pref_number_row_summary">Dodaj rząd cyfr na górze klawiatury, kiedy klaw. numeryczna jest schowana</string> <string name="pref_number_row_title">Pokaż rząd cyfr</string>
<string name="pref_numpad_layout">Układ klawiatury numerycznej</string> <string name="pref_number_row_summary">Dodaj rząd cyfr na górze klawiatury, kiedy klaw. numeryczna jest schowana</string>
<string name="pref_numpad_layout_e_high_first">Od największej cyfry</string> <string name="pref_numpad_layout">Układ klawiatury numerycznej</string>
<string name="pref_numpad_layout_e_low_first">Od najmniejszej cyfry</string> <string name="pref_numpad_layout_e_high_first">Od największej cyfry</string>
<string name="pref_extra_keys_title">Dodaj klawisze do klawiatury</string> <string name="pref_numpad_layout_e_low_first">Od najmniejszej cyfry</string>
<string name="pref_extra_keys_custom">Dodaj niestandardowe klawisze</string> <string name="pref_extra_keys_title">Dodaj klawisze do klawiatury</string>
<string name="pref_extra_keys_internal">Wybierz klawisze, które chcesz dodać do klawiatury</string> <string name="pref_extra_keys_custom">Dodaj niestandardowe klawisze</string>
<string name="pref_category_typing">Pisanie</string> <string name="pref_extra_keys_internal">Wybierz klawisze, które chcesz dodać do klawiatury</string>
<string name="pref_swipe_dist_title">Odległość przesuwania</string> <string name="pref_category_typing">Pisanie</string>
<string name="pref_swipe_dist_summary">Odległość znaków od rogów klawiszy (%s)</string> <string name="pref_swipe_dist_title">Odległość przesuwania</string>
<string name="pref_long_timeout_title">Opóźnienie przytrzymania klawisza</string> <string name="pref_swipe_dist_summary">Odległość znaków od rogów klawiszy (%s)</string>
<string name="pref_long_interval_title">Czas pomiędzy powtórzeniem klawisza</string> <string name="pref_long_timeout_title">Opóźnienie przytrzymania klawisza</string>
<string name="pref_keyrepeat_enabled">Powtarzanie klawisza po przytrzymaniu</string> <string name="pref_long_interval_title">Czas pomiędzy powtórzeniem klawisza</string>
<string name="pref_lock_double_tap_title">Naciśnij Shift podwójnie, aby włączyć caps lock</string> <string name="pref_keyrepeat_enabled">Powtarzanie klawisza po przytrzymaniu</string>
<string name="pref_lock_double_tap_summary">Możesz zablokować modyfikator poprzez jego długie naciśnięcie</string> <string name="pref_lock_double_tap_title">Naciśnij Shift podwójnie, aby włączyć caps lock</string>
<string name="pref_category_behavior">Zachowanie</string> <string name="pref_lock_double_tap_summary">Możesz zablokować modyfikator poprzez jego długie naciśnięcie</string>
<string name="pref_autocapitalisation_title">Automatyczne wielkie litery</string> <string name="pref_category_behavior">Zachowanie</string>
<string name="pref_autocapitalisation_summary">Naciśnij Shift na początku zdania</string> <string name="pref_autocapitalisation_title">Automatyczne wielkie litery</string>
<string name="pref_switch_input_immediate_title">Przełącz na ostatnio używaną klawiaturę</string> <string name="pref_autocapitalisation_summary">Naciśnij Shift na początku zdania</string>
<string name="pref_switch_input_immediate_summary">Działanie klawisza przełączającego klawiaturę</string> <string name="pref_switch_input_immediate_title">Przełącz na ostatnio używaną klawiaturę</string>
<string name="pref_vibrate_custom">Własna wibracja</string> <string name="pref_switch_input_immediate_summary">Działanie klawisza przełączającego klawiaturę</string>
<string name="pref_vibrate_duration_title">Intensywność wibracji</string> <string name="pref_vibrate_custom">Własna wibracja</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">Intensywność wibracji</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">Układ klawiatury PIN</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">Podczas wpisywania liczb, dat i numerów telefonu</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Styl</string>
<string name="pref_category_style">Styl</string> <string name="pref_margin_bottom_title">Margines dolny</string>
<string name="pref_margin_bottom_title">Margines dolny</string> <string name="pref_keyboard_height_title">Wysokość klawiatury</string>
<string name="pref_keyboard_height_title">Wysokość klawiatury</string> <string name="pref_horizontal_margin_title">Margines poziomy</string>
<string name="pref_horizontal_margin_title">Margines poziomy</string> <string name="pref_character_size_title">Wielkość znaku</string>
<string name="pref_character_size_title">Wielkość znaku</string> <string name="pref_character_size_summary">Wielkość znaków widocznych na klawiaturze (%.2fx)</string>
<string name="pref_character_size_summary">Wielkość znaków widocznych na klawiaturze (%.2fx)</string> <string name="pref_theme">Motyw</string>
<string name="pref_theme">Motyw</string> <string name="pref_theme_e_system">Systemowy</string>
<string name="pref_theme_e_system">Systemowy</string> <string name="pref_theme_e_dark">Ciemny</string>
<string name="pref_theme_e_dark">Ciemny</string> <string name="pref_theme_e_light">Jasny</string>
<string name="pref_theme_e_light">Jasny</string> <string name="pref_theme_e_black">Czarny</string>
<string name="pref_theme_e_black">Czarny</string> <string name="pref_theme_e_altblack">Alternatywny Czarny</string>
<string name="pref_theme_e_altblack">Alternatywny Czarny</string> <string name="pref_theme_e_white">Biały</string>
<string name="pref_theme_e_white">Biały</string> <string name="pref_theme_e_epaper">e-paper</string>
<string name="pref_theme_e_epaper">e-paper</string> <string name="pref_theme_e_desert">Pustynny</string>
<string name="pref_theme_e_desert">Pustynny</string> <string name="pref_theme_e_jungle">Dżunglowy</string>
<string name="pref_theme_e_jungle">Dżunglowy</string> <string name="pref_theme_e_monet">Monet (Systemowy)</string>
<string name="pref_theme_e_monet">Monet (Systemowy)</string> <string name="pref_theme_e_monetlight">Monet (Jasny)</string>
<string name="pref_theme_e_monetlight">Monet (Jasny)</string> <string name="pref_theme_e_monetdark">Monet (Ciemny)</string>
<string name="pref_theme_e_monetdark">Monet (Ciemny)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_theme_e_rosepine">Rosé Pine</string> <string name="pref_swipe_dist_e_very_short">Bardzo mała</string>
<string name="pref_swipe_dist_e_very_short">Bardzo mała</string> <string name="pref_swipe_dist_e_short">Mała</string>
<string name="pref_swipe_dist_e_short">Mała</string> <string name="pref_swipe_dist_e_default">Normalna</string>
<string name="pref_swipe_dist_e_default">Normalna</string> <string name="pref_swipe_dist_e_far">Duża</string>
<string name="pref_swipe_dist_e_far">Duża</string> <string name="pref_swipe_dist_e_very_far">Bardzo duża</string>
<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_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_key_vertical_space">Odległość pomiędzy klawiszami w pionie</string> <string name="pref_border_config_title">Dostosuj krawędzie</string>
<string name="pref_border_config_title">Dostosuj krawędzie</string> <string name="pref_border_width_title">Grubość krawedzi</string>
<string name="pref_border_width_title">Grubość krawedzi</string> <string name="pref_corners_radius_title">Promień rogów</string>
<string name="pref_corners_radius_title">Promień rogów</string> <string name="pref_circle_sensitivity_title">Czułość gestu koła</string>
<string name="pref_circle_sensitivity_title">Czułość gestu koła</string> <string name="pref_circle_sensitivity_e_high">Wysoka</string>
<string name="pref_circle_sensitivity_e_high">Wysoka</string> <string name="pref_circle_sensitivity_e_medium">Średnia</string>
<string name="pref_circle_sensitivity_e_medium">Średnia</string> <string name="pref_circle_sensitivity_e_low">Mała</string>
<string name="pref_circle_sensitivity_e_low">Niska</string> <string name="pref_circle_sensitivity_e_disabled">Wyłączona</string>
<string name="pref_circle_sensitivity_e_disabled">Wyłączona</string> <string name="key_action_next">Dalej</string>
<string name="key_action_next">Dalej</string> <string name="key_action_done">OK</string>
<string name="key_action_done">OK</string> <string name="key_action_go">Przejdź</string>
<string name="key_action_go">Przejdź</string> <string name="key_action_prev">Wstecz</string>
<string name="key_action_prev">Wstecz</string> <string name="key_action_search">Szukaj</string>
<string name="key_action_search">Szukaj</string> <string name="key_action_send">Wyślij</string>
<string name="key_action_send">Wyślij</string> <string name="launcher_button_imesettings">Włącz klawiaturę</string>
<string name="launcher_button_imesettings">Włącz klawiaturę</string> <string name="launcher_button_imepicker">Wybierz klawiaturę</string>
<string name="launcher_button_imepicker">Wybierz klawiaturę</string> <string name="launcher_description">Ta aplikacja jest klawiaturą ekranową. Naciśnij poniższy przycisk, aby przejść do ustawień systemu i włącz Unexpected-Keyboard.</string>
<string name="launcher_description">Ta aplikacja jest klawiaturą ekranową. Naciśnij poniższy przycisk, aby przejść do ustawień systemu i włącz Unexpected-Keyboard.</string> <string name="launcher_sourcecode">Jest to darmowa aplikacja o otwartym kodzie źródłowym. Możesz zobaczyć kod źródłowy oraz zgłosić błedy na Githubie.</string>
<string name="launcher_sourcecode">Jest to darmowa aplikacja o otwartym kodzie źródłowym. Możesz zobaczyć kod źródłowy oraz zgłosić błedy na Githubie.</string> <string name="launcher_tryhere">Po jej włączeniu, możesz wypróbować klawiaturę tutaj:</string>
<string name="launcher_tryhere">Po jej włączeniu, możesz wypróbować klawiaturę tutaj:</string> <string name="launcher_tryhere_hint">Wypróbuj tutaj</string>
<string name="launcher_tryhere_hint">Wypróbuj tutaj</string> <string name="key_descr_capslock">Caps lock</string>
<string name="key_descr_capslock">Caps lock</string> <string name="key_descr_compose">Komponuj</string>
<string name="key_descr_compose">Komponuj</string> <string name="key_descr_switch_greekmath">Symbole greckie i matematyczne</string>
<string name="key_descr_switch_greekmath">Symbole greckie i matematyczne</string> <string name="key_descr_change_method">Przełącz klawiaturę</string>
<string name="key_descr_change_method">Przełącz klawiaturę</string> <string name="key_descr_voice_typing">Pisanie głosowe</string>
<string name="key_descr_voice_typing">Pisanie głosowe</string> <string name="key_descr_copy">Kopiuj</string>
<string name="key_descr_copy">Kopiuj</string> <string name="key_descr_paste">Wklej</string>
<string name="key_descr_paste">Wklej</string> <string name="key_descr_cut">Wytnij</string>
<string name="key_descr_cut">Wytnij</string> <string name="key_descr_selectAll">Zaznacz wszystko</string>
<string name="key_descr_selectAll">Zaznacz wszystko</string> <string name="key_descr_shareText">Udostępnij tekst</string>
<string name="key_descr_pasteAsPlainText">Wklej sam tekst</string> <string name="key_descr_pasteAsPlainText">Wklej sam tekst</string>
<string name="key_descr_undo">Cofnij</string> <string name="key_descr_undo">Cofnij</string>
<string name="key_descr_redo">Ponów</string> <string name="key_descr_redo">Ponów</string>
<string name="key_descr_ª">Wskaźnik porządkowy (żeński)</string> <string name="key_descr_ª">Wskaźnik porządkowy (żeński)</string>
<string name="key_descr_º">Wskaźnik porządkowy (męski)</string> <string name="key_descr_º">Wskaźnik porządkowy (męski)</string>
<string name="key_descr_superscript">Indeks górny</string> <string name="key_descr_superscript">Indeks górny</string>
<string name="key_descr_subscript">Indeks dolny</string> <string name="key_descr_subscript">Indeks dolny</string>
<string name="key_descr_page_up">Page Up</string> <string name="key_descr_page_up">Page Up</string>
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Zarządzanie schowkiem</string> <string name="key_descr_clipboard">Zarządzanie schowkiem</string>
<string name="key_descr_combining">Składający znak diakrytyczny</string> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="key_descr_dead_key">Martwy klawisz</string> <string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
<string name="key_descr_zwj">Łącznik zerowej szerokości (ZWJ)</string> <string name="clipboard_pin_heading">Przypięte</string>
<string name="key_descr_zwnj">Rozdzielający łącznik zerowej szerokości (ZWNJ)</string> <string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>
<string name="key_descr_nbsp">Spacja niełamiąca</string> <string name="clipboard_remove_confirmed">Tak</string>
<string name="key_descr_nnbsp">Wąska spacja niełamiąca</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
<string name="clipboard_pin_heading">Przypięte</string>
<string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>
<string name="clipboard_remove_confirmed">Tak</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Teclado Unexpected</string> <string name="app_name_release">Teclado Unexpected</string>
<string name="app_name_debug">Teclado Unexpected (Depuração)</string> <string name="app_name_debug">Teclado Unexpected</string>
<string name="short_description">Um teclado virtual leve para desenvolvedores.</string> <string name="short_description">Um teclado virtual leve para desenvolvedores.</string>
<string name="store_description">A principal característica é que você pode digitar mais caracteres deslizando as teclas para os cantos.\n\nO app foi criado originalmente para desenvolvedores que usam Termux.\nAgora aperfeiçoado para o uso diário.\n\nEste aplicativo não contém anúncios, não faz nenhuma solicitação de rede e é Open Source.</string> <string name="store_description">"A principal característica é que você pode digitar mais caracteres deslizando as teclas para os cantos.
<string name="pref_portrait">No modo retrato</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> O app foi criado originalmente para desenvolvedores que usam Termux.
<string name="pref_landscape">No modo paisagem</string> Agora aperfeiçoado para o uso diário.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Layout</string> Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e é Open Source."</string>
<string name="pref_label_brightness">Ajustar brilho dos rótulos</string> <string name="settings_activity_label">Configurações</string>
<string name="pref_keyboard_opacity">Ajustar opacidade do fundo do teclado</string> <string name="pref_portrait">No modo retrato</string>
<string name="pref_key_opacity">Ajustar opacidade das teclas</string> <string name="pref_landscape">No modo paisagem</string>
<string name="pref_key_activated_opacity">Ajustar opacidade das teclas pressionadas</string> <string name="pref_category_layout">Layout</string>
<string name="pref_layout_e_system">Mesmo do sistema</string> <string name="pref_label_brightness">Ajustar brilho dos rótulos</string>
<string name="pref_layout_e_custom">Layout personalizado</string> <string name="pref_keyboard_opacity">Ajustar opacidade do fundo do teclado</string>
<string name="pref_layouts_add">Adicione um layout alternativo</string> <string name="pref_key_opacity">Ajustar opacidade das teclas</string>
<string name="pref_layouts_item">Layout %1$d: %2$s</string> <string name="pref_key_activated_opacity">Ajustar opacidade das teclas pressionadas</string>
<string name="pref_layouts_remove_custom">Remover layout</string> <string name="pref_layout_e_system">Mesmo do sistema</string>
<string name="pref_custom_layout_title">Layout personalizado</string> <string name="pref_layout_e_custom">Layout personalizado</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">Adicione um layout alternativo</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">Layout %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">Remover layout</string>
<string name="pref_show_numpad_title">Mostrar Teclado Numérico</string> <string name="pref_custom_layout_title">Layout personalizado</string>
<string name="pref_show_numpad_never">Nunca</string> <string name="pref_show_numpad_title">Mostrar Teclado Numérico</string>
<string name="pref_show_numpad_landscape">Somente no modo paisagem</string> <string name="pref_show_numpad_never">Nunca</string>
<string name="pref_show_numpad_always">Sempre</string> <string name="pref_show_numpad_landscape">Somente no modo paisagem</string>
<string name="pref_number_row_title">Mostrar fileira de números</string> <string name="pref_show_numpad_always">Sempre</string>
<string name="pref_number_row_summary">Adicionar uma linha de números no topo do teclado quando o teclado numérico estiver oculto</string> <string name="pref_number_row_title">Mostrar fileira de números</string>
<string name="pref_numpad_layout">Layout do teclado numérico</string> <string name="pref_number_row_summary">Adicionar uma linha de números no topo do teclado quando o teclado numérico estiver oculto</string>
<string name="pref_numpad_layout_e_high_first">Dígitos maiores primeiro</string> <string name="pref_numpad_layout">Layout do teclado numérico</string>
<string name="pref_numpad_layout_e_low_first">Dígitos menores primeiro</string> <string name="pref_numpad_layout_e_high_first">Dígitos maiores primeiro</string>
<string name="pref_extra_keys_title">Adicionar teclas ao teclado</string> <string name="pref_numpad_layout_e_low_first">Dígitos menores primeiro</string>
<string name="pref_extra_keys_custom">Adicionar teclas customizadas</string> <string name="pref_extra_keys_title">Adicionar teclas ao teclado</string>
<string name="pref_extra_keys_internal">Selecione teclas para serem adicionadas ao teclado</string> <string name="pref_extra_keys_custom">Adicionar teclas customizadas</string>
<string name="pref_category_typing">Digitação</string> <string name="pref_extra_keys_internal">Selecione teclas para serem adicionadas ao teclado</string>
<string name="pref_swipe_dist_title">Distância a deslizar</string> <string name="pref_category_typing">Digitação</string>
<string name="pref_swipe_dist_summary">Distância até acionar os cantos das teclas (%s)</string> <string name="pref_swipe_dist_title">Distância a deslizar</string>
<string name="pref_long_timeout_title">Tempo de pressionamento</string> <string name="pref_swipe_dist_summary">Distância até acionar os cantos das teclas (%s)</string>
<string name="pref_long_interval_title">Intervalo de repetição de tecla</string> <string name="pref_long_timeout_title">Tempo de pressionamento</string>
<string name="pref_keyrepeat_enabled">Repetir tecla ao pressionar</string> <string name="pref_long_interval_title">Intervalo de repetição de tecla</string>
<string name="pref_lock_double_tap_title">Tecle duas vezes no shift para travá-lo acionado</string> <string name="pref_keyrepeat_enabled">Repetir tecla ao pressionar</string>
<string name="pref_lock_double_tap_summary">Ao invés de apertar e segurar por um tempo</string> <string name="pref_lock_double_tap_title">Tecle duas vezes no shift para travá-lo acionado</string>
<string name="pref_category_behavior">Comportamento</string> <string name="pref_lock_double_tap_summary">Ao invés de apertar e segurar por um tempo</string>
<string name="pref_autocapitalisation_title">Capitalização automática</string> <string name="pref_category_behavior">Comportamento</string>
<string name="pref_autocapitalisation_summary">Aciona o shift no início de cada frase</string> <string name="pref_autocapitalisation_title">Capitalização automática</string>
<string name="pref_switch_input_immediate_title">Alternar para o último teclado usado</string> <string name="pref_autocapitalisation_summary">Aciona o shift no início de cada frase</string>
<string name="pref_switch_input_immediate_summary">Comportamento da tecla de troca de teclado</string> <string name="pref_switch_input_immediate_title">Alternar para o último teclado usado</string>
<string name="pref_vibrate_custom">Vibração personalizada</string> <string name="pref_switch_input_immediate_summary">Comportamento da tecla de troca de teclado</string>
<string name="pref_vibrate_duration_title">Intensidade da vibração</string> <string name="pref_vibrate_custom">Vibração personalizada</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">Intensidade da vibração</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">Layout PIN</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">Quando digitando números, datas ou números de telefone</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Estilo</string>
<string name="pref_category_style">Estilo</string> <string name="pref_margin_bottom_title">Margem inferior</string>
<string name="pref_margin_bottom_title">Margem inferior</string> <string name="pref_keyboard_height_title">Altura do teclado</string>
<string name="pref_keyboard_height_title">Altura do teclado</string> <string name="pref_horizontal_margin_title">Margem horizontal</string>
<string name="pref_horizontal_margin_title">Margem horizontal</string> <string name="pref_character_size_title">Tamanho dos indicadores</string>
<string name="pref_character_size_title">Tamanho dos indicadores</string> <string name="pref_character_size_summary">Tamanho dos caracteres visíveis no teclado (%.2fx)</string>
<string name="pref_character_size_summary">Tamanho dos caracteres visíveis no teclado (%.2fx)</string> <string name="pref_theme">Tema</string>
<string name="pref_theme">Tema</string> <string name="pref_theme_e_system">Mesmo do sistema</string>
<string name="pref_theme_e_system">Mesmo do sistema</string> <string name="pref_theme_e_dark">Escuro</string>
<string name="pref_theme_e_dark">Escuro</string> <string name="pref_theme_e_light">Claro</string>
<string name="pref_theme_e_light">Claro</string> <string name="pref_theme_e_black">Preto</string>
<string name="pref_theme_e_black">Preto</string> <string name="pref_theme_e_altblack">Preto Alternativo</string>
<string name="pref_theme_e_altblack">Preto Alternativo</string> <string name="pref_theme_e_white">Branco</string>
<string name="pref_theme_e_white">Branco</string> <string name="pref_theme_e_epaper">Papel Eletrônico</string>
<string name="pref_theme_e_epaper">Papel Eletrônico</string> <string name="pref_theme_e_desert">Deserto</string>
<string name="pref_theme_e_desert">Deserto</string> <string name="pref_theme_e_jungle">Selva</string>
<string name="pref_theme_e_jungle">Selva</string> <string name="pref_theme_e_monet">Monet (Sistema)</string>
<string name="pref_theme_e_monet">Monet (Sistema)</string> <string name="pref_theme_e_monetlight">Monet (Claro)</string>
<string name="pref_theme_e_monetlight">Monet (Claro)</string> <string name="pref_theme_e_monetdark">Monet (Escuro)</string>
<string name="pref_theme_e_monetdark">Monet (Escuro)</string> <string name="pref_theme_e_rosepine">Rosé Pine</string>
<string name="pref_theme_e_rosepine">Rosé Pine</string> <string name="pref_swipe_dist_e_very_short">Bem curta</string>
<string name="pref_swipe_dist_e_very_short">Bem curta</string> <string name="pref_swipe_dist_e_short">Curta</string>
<string name="pref_swipe_dist_e_short">Curta</string> <string name="pref_swipe_dist_e_default">Normal</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_far">Longa</string>
<string name="pref_swipe_dist_e_far">Longa</string> <string name="pref_swipe_dist_e_very_far">Bem longa</string>
<string name="pref_swipe_dist_e_very_far">Bem longa</string> <string name="pref_key_horizontal_space">Distância horizontal entre teclas</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_key_vertical_space">Distância vertical entre teclas</string> <string name="pref_border_config_title">Personalizar bordas</string>
<string name="pref_border_config_title">Personalizar bordas</string> <string name="pref_border_width_title">Largura de borda</string>
<string name="pref_border_width_title">Largura de borda</string> <string name="pref_corners_radius_title">Arredondamento de cantos</string>
<string name="pref_corners_radius_title">Arredondamento de cantos</string> <string name="pref_circle_sensitivity_title">Sensibilidade do gesto circular</string>
<string name="pref_circle_sensitivity_title">Sensibilidade do gesto circular</string> <string name="pref_circle_sensitivity_e_high">Alta</string>
<string name="pref_circle_sensitivity_e_high">Alta</string> <string name="pref_circle_sensitivity_e_medium">Média</string>
<string name="pref_circle_sensitivity_e_medium">Média</string> <string name="pref_circle_sensitivity_e_low">Baixa</string>
<string name="pref_circle_sensitivity_e_low">Baixa</string> <string name="pref_circle_sensitivity_e_disabled">Desativada</string>
<string name="pref_circle_sensitivity_e_disabled">Desativada</string> <string name="key_action_next">Próximo</string>
<string name="key_action_next">Próximo</string> <string name="key_action_done">Pronto</string>
<string name="key_action_done">Pronto</string> <string name="key_action_go">Ir</string>
<string name="key_action_go">Ir</string> <string name="key_action_prev">Anterior</string>
<string name="key_action_prev">Anterior</string> <string name="key_action_search">Buscar</string>
<string name="key_action_search">Buscar</string> <string name="key_action_send">Enviar</string>
<string name="key_action_send">Enviar</string> <string name="launcher_button_imesettings">Ativar teclado</string>
<string name="launcher_button_imesettings">Ativar teclado</string> <string name="launcher_button_imepicker">Selecionar teclado</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_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_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="launcher_tryhere">Após ativar, experimente aqui:</string> <string name="launcher_tryhere_hint">Experimente aqui</string>
<string name="launcher_tryhere_hint">Experimente aqui</string> <string name="key_descr_capslock">Caps lock</string>
<string name="key_descr_capslock">Caps lock</string> <string name="key_descr_compose">Compor</string>
<string name="key_descr_compose">Compor</string> <string name="key_descr_switch_greekmath">Grego e símbolos matemáticos</string>
<string name="key_descr_switch_greekmath">Grego e símbolos matemáticos</string> <string name="key_descr_change_method">Trocar de teclado</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_voice_typing">Digitação por voz</string> <string name="key_descr_copy">Copiar</string>
<string name="key_descr_copy">Copiar</string> <string name="key_descr_paste">Colar</string>
<string name="key_descr_paste">Colar</string> <string name="key_descr_cut">Recortar</string>
<string name="key_descr_cut">Recortar</string> <string name="key_descr_selectAll">Selecionar tudo</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> <string name="key_descr_pasteAsPlainText">Colar texto não formatado</string>
<string name="key_descr_undo">Desfazer</string> <string name="key_descr_undo">Desfazer</string>
<string name="key_descr_redo">Refazer</string> <string name="key_descr_redo">Refazer</string>
<string name="key_descr_ª">Indicador Ordinal</string> <string name="key_descr_ª">Indicador Ordinal</string>
<string name="key_descr_º">Indicador Ordinal</string> <string name="key_descr_º">Indicador Ordinal</string>
<string name="key_descr_superscript">Sobrescrito</string> <string name="key_descr_superscript">Sobrescrito</string>
<string name="key_descr_subscript">Subscrito</string> <string name="key_descr_subscript">Subscrito</string>
<string name="key_descr_page_up">Page Up</string> <string name="key_descr_page_up">Page Up</string>
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Área de transferência</string> <string name="key_descr_clipboard">Área de transferência</string>
<string name="key_descr_combining">Combinação de diacríticos</string> <string name="key_descr_combining">Combinação de diacríticos</string>
<string name="key_descr_dead_key">Tecla morta</string> <string name="clipboard_history_heading">Textos recém copiados</string>
<string name="key_descr_zwj">Junta de largura zero</string> <string name="clipboard_pin_heading">Fixados</string>
<string name="key_descr_zwnj">Sem junta de largura zero</string> <string name="clipboard_remove_confirm">Remover esta cópia?</string>
<string name="key_descr_nbsp">Espaço não separável</string> <string name="clipboard_remove_confirmed">Sim</string>
<string name="key_descr_nnbsp">Espaço não separável estreito</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Textos recém copiados</string>
<string name="clipboard_pin_heading">Fixados</string>
<string name="clipboard_remove_confirm">Remover esta cópia?</string>
<string name="clipboard_remove_confirmed">Sim</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Tastatură Unexpected (depanare)</string> <string name="app_name_debug">Tastatură Unexpected (depanare)</string>
<string name="short_description">Tastatură virtuală pentru Android, ușoară și respectuoasă cu viața privată.</string> <string name="short_description">Tastatură virtuală pentru Android, ușoară și respectuoasă cu viața privată.</string>
<string name="store_description">Funcționalitatea principală este accesul rapid la o mulțime de caractere ASCII prin glisarea către colțurile tastelor.\n\nAceastă aplicație a fost concepută inițial pentru programatori care folosec Termux.\nEste perfectă pentru uzul cotidian.\n\nAceastă aplicație nu conține publicitate, nu folosește rețeaua deloc și e Open Source.</string> <string name="store_description">"Funcționalitatea principală este accesul rapid la o mulțime de caractere ASCII prin glisarea către colțurile tastelor.
<string name="pref_portrait">În mod portret</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Această aplicație a fost concepută inițial pentru programatori care folosec Termux.
<string name="pref_landscape">În mod panoramă</string> Este perfectă pentru uzul cotidian.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Aspect</string> Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e Open Source."</string>
<string name="pref_label_brightness">Modifică luminozitatea denumirii</string> <string name="settings_activity_label">Setări Tastatură Unexpected</string>
<string name="pref_keyboard_opacity">Modifică opacitatea fundalului tastaturii</string> <string name="pref_portrait">În mod portret</string>
<string name="pref_key_opacity">Modifică opacitatea tastelor</string> <string name="pref_landscape">În mod panoramă</string>
<string name="pref_key_activated_opacity">Modifică opacitatea tastei apăsate</string> <string name="pref_category_layout">Aspect</string>
<string name="pref_layout_e_system">Setări de Sistem</string> <string name="pref_label_brightness">Modifică luminozitatea denumirii</string>
<string name="pref_layout_e_custom">Aranjament personalizat</string> <string name="pref_keyboard_opacity">Modifică opacitatea fundalului tastaturii</string>
<!-- <string name="pref_layouts_add">Add an alternate layout</string> --> <string name="pref_key_opacity">Modifică opacitatea tastelor</string>
<!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> --> <string name="pref_key_activated_opacity">Modifică opacitatea tastei apăsate</string>
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> --> <string name="pref_layout_e_system">Setări de Sistem</string>
<string name="pref_custom_layout_title">Aranjament personalizat</string> <string name="pref_layout_e_custom">Aranjament personalizat</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
<string name="pref_show_numpad_title">Arată NumPad</string> <string name="pref_custom_layout_title">Aranjament personalizat</string>
<string name="pref_show_numpad_never">Niciodată</string> <string name="pref_show_numpad_title">Arată NumPad</string>
<string name="pref_show_numpad_landscape">Doar în mod panoramă</string> <string name="pref_show_numpad_never">Niciodată</string>
<string name="pref_show_numpad_always">Întotdeanuna</string> <string name="pref_show_numpad_landscape">Doar în mod panoramă</string>
<string name="pref_number_row_title">Arată rândul cu numere</string> <string name="pref_show_numpad_always">Întotdeanuna</string>
<string name="pref_number_row_summary">Adaugă un rând deasupra tastaturii când numpad-ul este ascuns</string> <string name="pref_number_row_title">Arată rândul cu numere</string>
<string name="pref_numpad_layout">Aspect NumPad</string> <string name="pref_number_row_summary">Adaugă un rând deasupra tastaturii când numpad-ul este ascuns</string>
<string name="pref_numpad_layout_e_high_first">Mai întâi cifrele mari</string> <string name="pref_numpad_layout">Aspect NumPad</string>
<string name="pref_numpad_layout_e_low_first">Mai întâi cifrele mici</string> <string name="pref_numpad_layout_e_high_first">Mai întâi cifrele mari</string>
<string name="pref_extra_keys_title">Adaugă taste pe tastatură</string> <string name="pref_numpad_layout_e_low_first">Mai întâi cifrele mici</string>
<!-- <string name="pref_extra_keys_custom">Add custom keys</string> --> <string name="pref_extra_keys_title">Adaugă taste pe tastatură</string>
<!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> --> <!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
<string name="pref_category_typing">Tipărire</string> <!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
<string name="pref_swipe_dist_title">Distanța de glisare</string> <string name="pref_category_typing">Tipărire</string>
<string name="pref_swipe_dist_summary">Distanța dintre caracterele din colțurile tastelor (%s)</string> <string name="pref_swipe_dist_title">Distanța de glisare</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_swipe_dist_summary">Distanța dintre caracterele din colțurile tastelor (%s)</string>
<string name="pref_long_interval_title">Intervalul de repetare a tastelor</string> <!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_long_interval_title">Intervalul de repetare a tastelor</string>
<string name="pref_lock_double_tap_title">Apăsare dublă pe Shift activează Caps Lock</string> <!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_lock_double_tap_summary">Puteți activa orice modificator, ținându-l apăsat</string> <string name="pref_lock_double_tap_title">Apăsare dublă pe Shift activează Caps Lock</string>
<string name="pref_category_behavior">Comportament</string> <string name="pref_lock_double_tap_summary">Puteți activa orice modificator, ținându-l apăsat</string>
<string name="pref_autocapitalisation_title">Scriere automată cu majuscule</string> <string name="pref_category_behavior">Comportament</string>
<string name="pref_autocapitalisation_summary">Autoapăsare Shift la începutul fiecărei propoziții</string> <string name="pref_autocapitalisation_title">Scriere automată cu majuscule</string>
<string name="pref_switch_input_immediate_title">Schimbă la ultima tastatură folosită</string> <string name="pref_autocapitalisation_summary">Autoapăsare Shift la începutul fiecărei propoziții</string>
<string name="pref_switch_input_immediate_summary">Comportamentul tastei pentru schimbarea tastaturii</string> <string name="pref_switch_input_immediate_title">Schimbă la ultima tastatură folosită</string>
<!-- <string name="pref_vibrate_custom">Custom vibration</string> --> <string name="pref_switch_input_immediate_summary">Comportamentul tastei pentru schimbarea tastaturii</string>
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> --> <!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Stil</string>
<string name="pref_category_style">Stil</string> <string name="pref_margin_bottom_title">Marginea de jos</string>
<string name="pref_margin_bottom_title">Marginea de jos</string> <string name="pref_keyboard_height_title">Înălțimea tastaturii</string>
<string name="pref_keyboard_height_title">Înălțimea tastaturii</string> <string name="pref_horizontal_margin_title">Marginea orizontală</string>
<string name="pref_horizontal_margin_title">Marginea orizontală</string> <string name="pref_character_size_title">Dimensiunea simbolurilor</string>
<string name="pref_character_size_title">Dimensiunea simbolurilor</string> <string name="pref_character_size_summary">Dimensiumea caracterelor afișate pe tastatură (%.2fx)</string>
<string name="pref_character_size_summary">Dimensiumea caracterelor afișate pe tastatură (%.2fx)</string> <string name="pref_theme">Tema</string>
<string name="pref_theme">Tema</string> <string name="pref_theme_e_system">Setări de sistem</string>
<string name="pref_theme_e_system">Setări de sistem</string> <string name="pref_theme_e_dark">Întunecată</string>
<string name="pref_theme_e_dark">Întunecată</string> <string name="pref_theme_e_light">Luminoasă</string>
<string name="pref_theme_e_light">Luminoasă</string> <string name="pref_theme_e_black">Neagră</string>
<string name="pref_theme_e_black">Neagră</string> <string name="pref_theme_e_altblack">Negru Alternativ</string>
<string name="pref_theme_e_altblack">Negru Alternativ</string> <string name="pref_theme_e_white">Albă</string>
<string name="pref_theme_e_white">Albă</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_epaper">ePaper</string> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> --> <!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> --> <!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> --> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> --> <string name="pref_swipe_dist_e_very_short">Foarte apropiată</string>
<string name="pref_swipe_dist_e_very_short">Foarte apropiată</string> <string name="pref_swipe_dist_e_short">Apropiată</string>
<string name="pref_swipe_dist_e_short">Apropiată</string> <string name="pref_swipe_dist_e_default">Normală</string>
<string name="pref_swipe_dist_e_default">Normală</string> <string name="pref_swipe_dist_e_far">Depărtată</string>
<string name="pref_swipe_dist_e_far">Depărtată</string> <string name="pref_swipe_dist_e_very_far">Foarte depărtată</string>
<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_horizontal_space">Distanța orizontală dintre taste</string> <string name="pref_key_vertical_space">Distanța verticală dintre taste</string>
<string name="pref_key_vertical_space">Distanța verticală dintre taste</string> <!-- <string name="pref_border_config_title">Customize borders</string> -->
<!-- <string name="pref_border_config_title">Customize borders</string> --> <!-- <string name="pref_border_width_title">Border Width</string> -->
<!-- <string name="pref_border_width_title">Border Width</string> --> <!-- <string name="pref_corners_radius_title">Corner radius</string> -->
<!-- <string name="pref_corners_radius_title">Corner radius</string> --> <!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="key_action_next">Următor</string>
<string name="key_action_next">Următor</string> <string name="key_action_done">Gata</string>
<string name="key_action_done">Gata</string> <string name="key_action_go">Go</string>
<string name="key_action_go">Go</string> <string name="key_action_prev">Precedent</string>
<string name="key_action_prev">Precedent</string> <string name="key_action_search">Caută</string>
<string name="key_action_search">Caută</string> <string name="key_action_send">Trimite</string>
<string name="key_action_send">Trimite</string> <string name="launcher_button_imesettings">Activează tastatura</string>
<string name="launcher_button_imesettings">Activează tastatura</string> <!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
<!-- <string name="launcher_button_imepicker">Select keyboard</string> --> <string name="launcher_description">Această aplicație este o tastatură virtuală. Accesați setările sistemului făcând clic pe butonul de mai jos și activați tastatura Unexpected.</string>
<string name="launcher_description">Această aplicație este o tastatură virtuală. Accesați setările sistemului făcând clic pe butonul de mai jos și activați tastatura Unexpected.</string> <string name="launcher_sourcecode">Aceasta este o aplicație gratuită și open source. Puteți găsi codul sursă sau raporta erori folosind link-ul Github.</string>
<string name="launcher_sourcecode">Aceasta este o aplicație gratuită și open source. Puteți găsi codul sursă sau raporta erori folosind link-ul Github.</string> <string name="launcher_tryhere">După activare, puteți să încercați tastatura aici:</string>
<string name="launcher_tryhere">După activare, puteți să încercați tastatura aici:</string> <!-- <string name="launcher_tryhere_hint">Try here</string> -->
<!-- <string name="launcher_tryhere_hint">Try here</string> --> <!-- <string name="key_descr_capslock">Caps lock</string> -->
<!-- <string name="key_descr_capslock">Caps lock</string> --> <!-- <string name="key_descr_compose">Compose</string> -->
<!-- <string name="key_descr_compose">Compose</string> --> <!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> -->
<!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> --> <!-- <string name="key_descr_change_method">Switch keyboard</string> -->
<!-- <string name="key_descr_change_method">Switch keyboard</string> --> <!-- <string name="key_descr_voice_typing">Voice typing</string> -->
<!-- <string name="key_descr_voice_typing">Voice typing</string> --> <!-- <string name="key_descr_copy">Copy</string> -->
<!-- <string name="key_descr_copy">Copy</string> --> <!-- <string name="key_descr_paste">Paste</string> -->
<!-- <string name="key_descr_paste">Paste</string> --> <!-- <string name="key_descr_cut">Cut</string> -->
<!-- <string name="key_descr_cut">Cut</string> --> <!-- <string name="key_descr_selectAll">Select all</string> -->
<!-- <string name="key_descr_selectAll">Select all</string> --> <!-- <string name="key_descr_shareText">Share text</string> -->
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> --> <!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
<!-- <string name="key_descr_undo">Undo</string> --> <!-- <string name="key_descr_undo">Undo</string> -->
<!-- <string name="key_descr_redo">Redo</string> --> <!-- <string name="key_descr_redo">Redo</string> -->
<!-- <string name="key_descr_ª">Ordinal Indicator</string> --> <!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
<!-- <string name="key_descr_º">Ordinal Indicator</string> --> <!-- <string name="key_descr_º">Ordinal Indicator</string> -->
<!-- <string name="key_descr_superscript">Superscript</string> --> <!-- <string name="key_descr_superscript">Superscript</string> -->
<!-- <string name="key_descr_subscript">Subscript</string> --> <!-- <string name="key_descr_subscript">Subscript</string> -->
<!-- <string name="key_descr_page_up">Page Up</string> --> <!-- <string name="key_descr_page_up">Page Up</string> -->
<!-- <string name="key_descr_page_down">Page Down</string> --> <!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> --> <!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> --> <!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> --> <!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> --> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="key_descr_dead_key">Dead key</string> --> <!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="key_descr_zwj">Zero width joiner</string> --> <!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> --> <!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="key_descr_nbsp">Non-breaking space</string> --> <!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard item?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (отладка)</string> <string name="app_name_debug">Unexpected Keyboard (отладка)</string>
<string name="short_description">Легкая клавиатура для пользователей, заботящихся о конфиденциальности.</string> <string name="short_description">Легкая клавиатура для пользователей, заботящихся о конфиденциальности.</string>
<string name="store_description">Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.\n\nПриложение изначально было разработано для использования с Termux.\nНа данный момент оно также удобно в повседневном использовании.\n\nПриложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код.</string> <string name="store_description">"Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.
<string name="pref_portrait">В портретном режиме</string>
<string name="pref_portrait_unfolded">В развернутом портретном режиме</string> Приложение изначально было разработано для использования с Termux.
<string name="pref_landscape">В ландшафтном режиме</string> На данный момент оно также удобно в повседневном использовании.
<string name="pref_landscape_unfolded">В развернутом ландшафтном режиме</string>
<string name="pref_category_layout">Расположение</string> Приложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код."</string>
<string name="pref_label_brightness">Изменить яркость клавиатуры</string> <string name="settings_activity_label">Настройки Unexpected Keyboard</string>
<string name="pref_keyboard_opacity">Изменить прозрачность фона</string> <string name="pref_portrait">В портретном режиме</string>
<string name="pref_key_opacity">Изменить прозрачность клавиш</string> <string name="pref_landscape">В ландшафтном режиме</string>
<string name="pref_key_activated_opacity">Изменить прозрачность нажатой клавиши</string> <string name="pref_category_layout">Расположение</string>
<string name="pref_layout_e_system">Системные настройки</string> <string name="pref_label_brightness">Изменить яркость клавиатуры</string>
<string name="pref_layout_e_custom">Пользовательская раскладка</string> <string name="pref_keyboard_opacity">Изменить прозрачность фона</string>
<string name="pref_layouts_add">Добавить альтернативную раскладку</string> <string name="pref_key_opacity">Изменить прозрачность клавиш</string>
<string name="pref_layouts_item">Раскладка %1$d: %2$s</string> <string name="pref_key_activated_opacity">Изменить прозрачность нажатой клавиши</string>
<string name="pref_layouts_remove_custom">Удалить раскладку</string> <string name="pref_layout_e_system">Системные настройки</string>
<string name="pref_custom_layout_title">Пользовательская раскладка</string> <string name="pref_layout_e_custom">Пользовательская раскладка</string>
<string name="pref_show_number_row_no_number_row">Без ряда цифр</string> <string name="pref_layouts_add">Добавить альтернативную раскладку</string>
<string name="pref_show_number_row_no_symbols">Ряд цифр без символов</string> <string name="pref_layouts_item">Раскладка %1$d: %2$s</string>
<string name="pref_show_number_row_symbols">Ряд цифр с символами</string> <string name="pref_layouts_remove_custom">Удалить раскладку</string>
<string name="pref_show_numpad_title">Показывать цифровой блок</string> <string name="pref_custom_layout_title">Пользовательская раскладка</string>
<string name="pref_show_numpad_never">Никогда</string> <string name="pref_show_numpad_title">Показывать цифровой блок</string>
<string name="pref_show_numpad_landscape">Только в ландшафтном режиме</string> <string name="pref_show_numpad_never">Никогда</string>
<string name="pref_show_numpad_always">Всегда</string> <string name="pref_show_numpad_landscape">Только в ландшафтном режиме</string>
<string name="pref_number_row_title">Показывать цифры</string> <string name="pref_show_numpad_always">Всегда</string>
<string name="pref_number_row_summary">Добавить ряд цифр над клавиатурой, когда цифровой блок не активен</string> <string name="pref_number_row_title">Показывать цифры</string>
<string name="pref_numpad_layout">Раскладка цифрового блока</string> <string name="pref_number_row_summary">Добавить ряд цифр над клавиатурой, когда цифровой блок не активен</string>
<string name="pref_numpad_layout_e_high_first">Старшие цифры сверху</string> <string name="pref_numpad_layout">Раскладка цифрового блока</string>
<string name="pref_numpad_layout_e_low_first">Младшие цифры сверху</string> <string name="pref_numpad_layout_e_high_first">Старшие цифры сверху</string>
<string name="pref_extra_keys_title">Добавить клавиши на клавиатуру</string> <string name="pref_numpad_layout_e_low_first">Младшие цифры сверху</string>
<string name="pref_extra_keys_custom">Добавить пользовательские клавиши</string> <string name="pref_extra_keys_title">Добавить клавиши на клавиатуру</string>
<string name="pref_extra_keys_internal">Выберите клавиши для добавления на клавиатуру</string> <string name="pref_extra_keys_custom">Добавить пользовательские клавиши</string>
<string name="pref_category_typing">Набор текста</string> <string name="pref_extra_keys_internal">Выберите клавиши для добавления на клавиатуру</string>
<string name="pref_swipe_dist_title">Длина жеста</string> <string name="pref_category_typing">Набор текста</string>
<string name="pref_swipe_dist_summary">Расстояние между символами в углах клавиш (%s)</string> <string name="pref_swipe_dist_title">Длина жеста</string>
<string name="pref_long_timeout_title">Задержка долгого нажатия</string> <string name="pref_swipe_dist_summary">Расстояние между символами в углах клавиш (%s)</string>
<string name="pref_long_interval_title">Интервал повтора клавиш</string> <string name="pref_long_timeout_title">Задержка долгого нажатия</string>
<string name="pref_keyrepeat_enabled">Повтор клавиши при долгом нажатии</string> <string name="pref_long_interval_title">Интервал повтора клавиш</string>
<string name="pref_lock_double_tap_title">CapsLock двойным нажатием Shift</string> <string name="pref_keyrepeat_enabled">Повтор клавиши при долгом нажатии</string>
<string name="pref_lock_double_tap_summary">Также можно активировать модификатор долгим нажатием</string> <string name="pref_lock_double_tap_title">CapsLock двойным нажатием Shift</string>
<string name="pref_category_behavior">Поведение</string> <string name="pref_lock_double_tap_summary">Также можно активировать модификатор долгим нажатием</string>
<string name="pref_autocapitalisation_title">Автоматическая смена регистра</string> <string name="pref_category_behavior">Поведение</string>
<string name="pref_autocapitalisation_summary">Автоматическое нажатие Shift в начале каждого предложения</string> <string name="pref_autocapitalisation_title">Автоматическая смена регистра</string>
<string name="pref_switch_input_immediate_title">Активировать предыдущую клавиатуру</string> <string name="pref_autocapitalisation_summary">Автоматическое нажатие Shift в начале каждого предложения</string>
<string name="pref_switch_input_immediate_summary">Поведение клавиши переключения клавиатуры</string> <string name="pref_switch_input_immediate_title">Активировать предыдущую клавиатуру</string>
<string name="pref_vibrate_custom">Настройка вибрации</string> <string name="pref_switch_input_immediate_summary">Поведение клавиши переключения клавиатуры</string>
<string name="pref_vibrate_duration_title">Интенсивность вибрации</string> <string name="pref_vibrate_custom">Настройка вибрации</string>
<string name="pref_number_entry_title">Раскладка для ввода цифр, дат и телефонных номеров</string> <string name="pref_vibrate_duration_title">Интенсивность вибрации</string>
<string name="pref_number_entry_layout_pin">Ввод PIN-кодов</string> <string name="pref_pin_entry_enabled_title">Закрепить раскладку</string>
<string name="pref_number_entry_layout_number">Цифровая панель</string> <string name="pref_pin_entry_enabled_summary">При вводе чисел, дат и телефонных номеров</string>
<string name="pref_number_entry_layout_normal">Основная раскладка</string> <string name="pref_category_style">Стиль</string>
<string name="pref_category_style">Стиль</string> <string name="pref_margin_bottom_title">Нижняя граница поля</string>
<string name="pref_margin_bottom_title">Нижняя граница поля</string> <string name="pref_keyboard_height_title">Высота клавиатуры</string>
<string name="pref_keyboard_height_title">Высота клавиатуры</string> <string name="pref_horizontal_margin_title">Горизонтальное поле</string>
<string name="pref_horizontal_margin_title">Горизонтальное поле</string> <string name="pref_character_size_title">Размер символов</string>
<string name="pref_character_size_title">Размер символов</string> <string name="pref_character_size_summary">Размер символов, отображаемых на клавиатуре (%.2fx)</string>
<string name="pref_character_size_summary">Размер символов, отображаемых на клавиатуре (%.2fx)</string> <string name="pref_theme">Тема</string>
<string name="pref_theme">Тема</string> <string name="pref_theme_e_system">Системная</string>
<string name="pref_theme_e_system">Системная</string> <string name="pref_theme_e_dark">Темная</string>
<string name="pref_theme_e_dark">Темная</string> <string name="pref_theme_e_light">Светлая</string>
<string name="pref_theme_e_light">Светлая</string> <string name="pref_theme_e_black">Черная</string>
<string name="pref_theme_e_black">Черная</string> <string name="pref_theme_e_altblack">Альтернативная черная</string>
<string name="pref_theme_e_altblack">Альтернативная черная</string> <string name="pref_theme_e_white">Белая</string>
<string name="pref_theme_e_white">Белая</string> <string name="pref_theme_e_epaper">Электронная бумага</string>
<string name="pref_theme_e_epaper">Электронная бумага</string> <string name="pref_theme_e_desert">Пустыня</string>
<string name="pref_theme_e_desert">Пустыня</string> <string name="pref_theme_e_jungle">Джунгли</string>
<string name="pref_theme_e_jungle">Джунгли</string> <string name="pref_theme_e_monet">Моне (системная)</string>
<string name="pref_theme_e_monet">Моне (системная)</string> <string name="pref_theme_e_monetlight">Моне (светлая)</string>
<string name="pref_theme_e_monetlight">Моне (светлая)</string> <string name="pref_theme_e_monetdark">Моне (темная)</string>
<string name="pref_theme_e_monetdark">Моне (темная)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_theme_e_rosepine">Розовая сосна</string> <string name="pref_swipe_dist_e_very_short">Очень короткая</string>
<string name="pref_swipe_dist_e_very_short">Очень короткая</string> <string name="pref_swipe_dist_e_short">Короткая</string>
<string name="pref_swipe_dist_e_short">Короткая</string> <string name="pref_swipe_dist_e_default">Обычная</string>
<string name="pref_swipe_dist_e_default">Обычная</string> <string name="pref_swipe_dist_e_far">Длинная</string>
<string name="pref_swipe_dist_e_far">Длинная</string> <string name="pref_swipe_dist_e_very_far">Очень длинная</string>
<string name="pref_swipe_dist_e_very_far">Очень длинная</string> <string name="pref_key_horizontal_space">Горизонтальное расстояние между клавишами</string>
<string name="pref_key_horizontal_space">Горизонтальное расстояние между клавишами</string> <string name="pref_key_vertical_space">Расстояние по вертикали между клавишами</string>
<string name="pref_key_vertical_space">Расстояние по вертикали между клавишами</string> <string name="pref_border_config_title">Настройка рамки</string>
<string name="pref_border_config_title">Настройка рамки</string> <string name="pref_border_width_title">Ширина рамки</string>
<string name="pref_border_width_title">Ширина рамки</string> <string name="pref_corners_radius_title">Радиус скругления</string>
<string name="pref_corners_radius_title">Радиус скругления</string> <string name="pref_circle_sensitivity_title">Чувствительность круговых жестов</string>
<string name="pref_circle_sensitivity_title">Чувствительность круговых жестов</string> <string name="pref_circle_sensitivity_e_high">Высокая</string>
<string name="pref_circle_sensitivity_e_high">Высокая</string> <string name="pref_circle_sensitivity_e_medium">Средняя</string>
<string name="pref_circle_sensitivity_e_medium">Средняя</string> <string name="pref_circle_sensitivity_e_low">Низкая</string>
<string name="pref_circle_sensitivity_e_low">Низкая</string> <string name="pref_circle_sensitivity_e_disabled">Отключено</string>
<string name="pref_circle_sensitivity_e_disabled">Отключено</string> <string name="key_action_next">Вперед</string>
<string name="key_action_next">Вперед</string> <string name="key_action_done">Ввод</string>
<string name="key_action_done">Ввод</string> <string name="key_action_go">Перейти</string>
<string name="key_action_go">Перейти</string> <string name="key_action_prev">Назад</string>
<string name="key_action_prev">Назад</string> <string name="key_action_search">Поиск</string>
<string name="key_action_search">Поиск</string> <string name="key_action_send">Отправить</string>
<string name="key_action_send">Отправить</string> <string name="launcher_button_imesettings">Включение клавиатуры</string>
<string name="launcher_button_imesettings">Включение клавиатуры</string> <string name="launcher_button_imepicker">Выбор клавиатуры</string>
<string name="launcher_button_imepicker">Выбор клавиатуры</string> <string name="launcher_description">Данное приложение является виртуальной клавиатурой. Зайдите в настройки, нажав кнопку внизу, и активируйте Unexpected Keyboard.</string>
<string name="launcher_description">Данное приложение является виртуальной клавиатурой. Зайдите в настройки, нажав кнопку внизу, и активируйте Unexpected Keyboard.</string> <string name="launcher_sourcecode">Это бесплатное приложение с открытым исходным кодом. Вы можете изучить код или сообщить об ошибках по ссылке GitHub.</string>
<string name="launcher_sourcecode">Это бесплатное приложение с открытым исходным кодом. Вы можете изучить код или сообщить об ошибках по ссылке GitHub.</string> <string name="launcher_tryhere">После активации вы сможете попробовать клавиатуру прямо здесь:</string>
<string name="launcher_tryhere">После активации вы сможете попробовать клавиатуру прямо здесь:</string> <string name="launcher_tryhere_hint">Попробуйте здесь</string>
<string name="launcher_tryhere_hint">Попробуйте здесь</string> <string name="key_descr_capslock">CapsLock</string>
<string name="key_descr_capslock">CapsLock</string> <string name="key_descr_compose">Compose</string>
<string name="key_descr_compose">Compose</string> <string name="key_descr_switch_greekmath">Греческие и математические символы</string>
<string name="key_descr_switch_greekmath">Греческие и математические символы</string> <string name="key_descr_change_method">Переключение клавиатуры</string>
<string name="key_descr_change_method">Переключение клавиатуры</string> <string name="key_descr_voice_typing">Голосовой ввод</string>
<string name="key_descr_voice_typing">Голосовой ввод</string> <string name="key_descr_copy">Копировать</string>
<string name="key_descr_copy">Копировать</string> <string name="key_descr_paste">Вставить</string>
<string name="key_descr_paste">Вставить</string> <string name="key_descr_cut">Вырезать</string>
<string name="key_descr_cut">Вырезать</string> <string name="key_descr_selectAll">Выбрать все</string>
<string name="key_descr_selectAll">Выбрать все</string> <string name="key_descr_shareText">Поделиться текстом</string>
<string name="key_descr_pasteAsPlainText">Вставить как простой текст</string> <string name="key_descr_pasteAsPlainText">Вставить как простой текст</string>
<string name="key_descr_undo">Отменить</string> <string name="key_descr_undo">Отменить</string>
<string name="key_descr_redo">Повторить</string> <string name="key_descr_redo">Повторить</string>
<string name="key_descr_ª">Порядковый индикатор</string> <string name="key_descr_ª">Порядковый индикатор</string>
<string name="key_descr_º">Порядковый индикатор</string> <string name="key_descr_º">Порядковый индикатор</string>
<string name="key_descr_superscript">Надстрочные</string> <string name="key_descr_superscript">Надстрочные</string>
<string name="key_descr_subscript">Подстрочные</string> <string name="key_descr_subscript">Подстрочные</string>
<string name="key_descr_page_up">Страница вверх</string> <string name="key_descr_page_up">Страница вверх</string>
<string name="key_descr_page_down">Страница вниз</string> <string name="key_descr_page_down">Страница вниз</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Менеджер буфера обмена</string> <string name="key_descr_clipboard">Менеджер буфера обмена</string>
<string name="key_descr_combining">Сочетание диакритических знаков</string> <string name="key_descr_combining">Сочетание диакритических знаков</string>
<string name="key_descr_dead_key">Немая клавиша</string> <string name="clipboard_history_heading">Недавно скопированный текст</string>
<string name="key_descr_zwj">Соединитель нулевой ширины</string> <string name="clipboard_pin_heading">Закреплено</string>
<string name="key_descr_zwnj">Разделитель нулевой ширины</string> <string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>
<string name="key_descr_nbsp">Неразрывный пробел</string> <string name="clipboard_remove_confirmed">Да</string>
<string name="key_descr_nnbsp">Узкий неразрывный пробел</string>
<string name="key_descr_delete_word">Удалить слово</string>
<string name="key_descr_forward_delete_word">Удалить слово справа</string>
<string name="key_descr_gesture">Жест</string>
<string name="clipboard_history_heading">Недавно скопированный текст</string>
<string name="clipboard_pin_heading">Закреплено</string>
<string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>
<string name="clipboard_remove_confirmed">Да</string>
<string name="toast_no_voice_input">Приложение для голосового ввода не установлено</string>
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (debug)</string> <string name="app_name_debug">Unexpected Keyboard (debug)</string>
<string name="short_description">Android için hafif ve güvenlik odaklı bir sanal klavye uygulaması.</string> <string name="short_description">Android için hafif ve güvenlik odaklı bir sanal klavye uygulaması.</string>
<string name="store_description">Bu uygulama özünde tuşların kenarlarından kaydırarak daha fazla karakter yazabilmek amacıyla geliştirildi.\n\nBu uygulama aslında Termux kullanıcıları için geliştirildi.\nArtık gündelik kullanım için de uygun.\n\nBu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz.</string> <string name="store_description">"Bu uygulama özünde tuşların kenarlarından kaydırarak daha fazla karakter yazabilmek amacıyla geliştirildi.
<string name="pref_portrait">Portre modunda</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Bu uygulama aslında Termux kullanıcıları için geliştirildi.
<string name="pref_landscape">Manzara modunda</string> Artık gündelik kullanım için de uygun.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Tuş düzeni</string> Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</string>
<string name="pref_label_brightness">Etiket parlaklığını ayarla</string> <string name="settings_activity_label">Unexpected Keyboard Ayarları</string>
<string name="pref_keyboard_opacity">Klavye arkaplanı opaklığını ayarla</string> <string name="pref_portrait">Portre modunda</string>
<string name="pref_key_opacity">Tuş opaklığını ayarla</string> <string name="pref_landscape">Manzara modunda</string>
<string name="pref_key_activated_opacity">Tuşa basıldığındaki opaklığı ayarla</string> <string name="pref_category_layout">Tuş düzeni</string>
<string name="pref_layout_e_system">Sistem ayarlarını kullan</string> <string name="pref_label_brightness">Adjust label brightness</string>
<string name="pref_layout_e_custom">Özel tuş düeni</string> <string name="pref_keyboard_opacity">Klavye arkaplanı opaklığını ayarla</string>
<string name="pref_layouts_add">Alternatif bir tuş düzeni ekle</string> <string name="pref_key_opacity">Tuş opaklığını ayarla</string>
<string name="pref_layouts_item">Tuş düzeni %1$d: %2$s</string> <string name="pref_key_activated_opacity">Tuşa basıldığındaki opaklığı ayarla</string>
<string name="pref_layouts_remove_custom">Tuş düzenini kaldır</string> <string name="pref_layout_e_system">Sistem ayarlarını kullan</string>
<string name="pref_custom_layout_title">Özel tuş düzeni</string> <string name="pref_layout_e_custom">Özel tuş düeni</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">Alternatif bir tuş düzeni ekle</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">Tuş düzeni %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">Tuş düzenini kaldır</string>
<string name="pref_show_numpad_title">NumPadi göster</string> <string name="pref_custom_layout_title">Özel tuş düzeni</string>
<string name="pref_show_numpad_never">Asla</string> <string name="pref_show_numpad_title">NumPadi göster</string>
<string name="pref_show_numpad_landscape">Sadece manzara modunda</string> <string name="pref_show_numpad_never">Asla</string>
<string name="pref_show_numpad_always">Her zaman</string> <string name="pref_show_numpad_landscape">Sadece manzara modunda</string>
<string name="pref_number_row_title">Rakam satırını göster</string> <string name="pref_show_numpad_always">Her zaman</string>
<string name="pref_number_row_summary">NumPad gizlendiğinde klavyenin üstüne rakam satırı ekle</string> <string name="pref_number_row_title">Rakam satırını göster</string>
<string name="pref_numpad_layout">NumPad düzeni</string> <string name="pref_number_row_summary">NumPad gizlendiğinde klavyenin üstüne rakam satırı ekle</string>
<string name="pref_numpad_layout_e_high_first">9dan 1e</string> <string name="pref_numpad_layout">NumPad düzeni</string>
<string name="pref_numpad_layout_e_low_first">1den 9a</string> <string name="pref_numpad_layout_e_high_first">9dan 1e</string>
<string name="pref_extra_keys_title">Tuş ekle</string> <string name="pref_numpad_layout_e_low_first">1den 9a</string>
<string name="pref_extra_keys_custom">Özel tuş ekle</string> <string name="pref_extra_keys_title">Tuş ekle</string>
<string name="pref_extra_keys_internal">Klavyeye eklenecek tuşları seçin</string> <string name="pref_extra_keys_custom">Özel tuş ekle</string>
<string name="pref_category_typing">Yazma</string> <string name="pref_extra_keys_internal">Klavyeye eklenecek tuşları seçin</string>
<string name="pref_swipe_dist_title">Kaydırma mesafesi</string> <string name="pref_category_typing">Yazma</string>
<string name="pref_swipe_dist_summary">Tuşların köşelerinden kaydırma mesafesi (%s)</string> <string name="pref_swipe_dist_title">Kaydırma mesafesi</string>
<string name="pref_long_timeout_title">Uzun basma süresi</string> <string name="pref_swipe_dist_summary">Tuşların köşelerinden kaydırma mesafesi (%s)</string>
<string name="pref_long_interval_title">Tuşların tekrarlama sıklığı</string> <string name="pref_long_timeout_title">Uzun basma süresi</string>
<string name="pref_keyrepeat_enabled">Uzun basınca tuş tekrarlamaları</string> <string name="pref_long_interval_title">Tuşların tekrarlama sıklığı</string>
<string name="pref_lock_double_tap_title">CapsLock için Shift tuşuna çift bas</string> <string name="pref_keyrepeat_enabled">Uzun basınca tuş tekrarlamaları</string>
<string name="pref_lock_double_tap_summary">Uzun basarak CapsLock açılabilir</string> <string name="pref_lock_double_tap_title">CapsLock için Shift tuşuna çift bas</string>
<string name="pref_category_behavior">Klavye davranışı</string> <string name="pref_lock_double_tap_summary">Uzun basarak CapsLock açılabilir</string>
<string name="pref_autocapitalisation_title">Otomatik büyük harf</string> <string name="pref_category_behavior">Klavye davranışı</string>
<string name="pref_autocapitalisation_summary">Noktadan sonra ve her cümlenin başında büyük harf yapar</string> <string name="pref_autocapitalisation_title">Otomatik büyük harf</string>
<string name="pref_switch_input_immediate_title">Son kullanılan klavyeye geç</string> <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_summary">Klavye değistirme tuşunun davranışını belirler</string> <string name="pref_switch_input_immediate_title">Son kullanılan klavyeye geç</string>
<string name="pref_vibrate_custom">Özel titreşim</string> <string name="pref_switch_input_immediate_summary">Klavye değistirme tuşunun davranışını belirler</string>
<string name="pref_vibrate_duration_title">Titreşim yoğunluğu</string> <string name="pref_vibrate_custom">Özel titreşim</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">Titreşim yoğunluğu</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">NumPad</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">Sayıları, tarihleri ve telefon numaralarını yazarken</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Tarz</string>
<string name="pref_category_style">Tarz</string> <string name="pref_margin_bottom_title">Alt boşluk</string>
<string name="pref_margin_bottom_title">Alt boşluk</string> <string name="pref_keyboard_height_title">Klavye yüksekliği</string>
<string name="pref_keyboard_height_title">Klavye yüksekliği</string> <string name="pref_horizontal_margin_title">Yatay boşluk</string>
<string name="pref_horizontal_margin_title">Yatay boşluk</string> <string name="pref_character_size_title">Etiket boyutu</string>
<string name="pref_character_size_title">Etiket boyutu</string> <string name="pref_character_size_summary">Klavye üzerindeki karakterlerin boyutu (%.2fx)</string>
<string name="pref_character_size_summary">Klavye üzerindeki karakterlerin boyutu (%.2fx)</string> <string name="pref_theme">Tema</string>
<string name="pref_theme">Tema</string> <string name="pref_theme_e_system">Sistem Temasını Kullan</string>
<string name="pref_theme_e_system">Sistem Temasını Kullan</string> <string name="pref_theme_e_dark">Koyu</string>
<string name="pref_theme_e_dark">Koyu</string> <string name="pref_theme_e_light">Aydınlık</string>
<string name="pref_theme_e_light">Aydınlık</string> <string name="pref_theme_e_black">Siyah</string>
<string name="pref_theme_e_black">Siyah</string> <string name="pref_theme_e_altblack">Alternatif Siyah</string>
<string name="pref_theme_e_altblack">Alternatif Siyah</string> <string name="pref_theme_e_white">Beyaz</string>
<string name="pref_theme_e_white">Beyaz</string> <string name="pref_theme_e_epaper">E-Kağıt</string>
<string name="pref_theme_e_epaper">E-Kağıt</string> <string name="pref_theme_e_desert">Çöl</string>
<string name="pref_theme_e_desert">Çöl</string> <string name="pref_theme_e_jungle">Orman</string>
<string name="pref_theme_e_jungle">Orman</string> <string name="pref_theme_e_monet">Monet (Sisteme uyarla)</string>
<string name="pref_theme_e_monet">Monet (Sisteme uyarla)</string> <string name="pref_theme_e_monetlight">Monet (ık)</string>
<string name="pref_theme_e_monetlight">Monet (ık)</string> <string name="pref_theme_e_monetdark">Monet (Koyu)</string>
<string name="pref_theme_e_monetdark">Monet (Koyu)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_theme_e_rosepine">Gül Çamı(Rosé Pine)</string> <string name="pref_swipe_dist_e_very_short">Çok kısa</string>
<string name="pref_swipe_dist_e_very_short">Çok kısa</string> <string name="pref_swipe_dist_e_short">Kısa</string>
<string name="pref_swipe_dist_e_short">Kısa</string> <string name="pref_swipe_dist_e_default">Normal</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_far">Uzun</string>
<string name="pref_swipe_dist_e_far">Uzun</string> <string name="pref_swipe_dist_e_very_far">Çok uzun</string>
<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_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_key_vertical_space">Tuşlar arasındaki dikey boşluk</string> <string name="pref_border_config_title">Çerçeveyi özelleştir</string>
<string name="pref_border_config_title">Çerçeveyi özelleştir</string> <string name="pref_border_width_title">Çerçeve kalınlığı</string>
<string name="pref_border_width_title">Çerçeve kalınlığı</string> <string name="pref_corners_radius_title">Kenar yumuşaklığı</string>
<string name="pref_corners_radius_title">Kenar yumuşaklığı</string> <string name="pref_circle_sensitivity_title">Dairesel hareket hassasiyeti</string>
<string name="pref_circle_sensitivity_title">Dairesel hareket hassasiyeti</string> <string name="pref_circle_sensitivity_e_high">Yüksek</string>
<string name="pref_circle_sensitivity_e_high">Yüksek</string> <string name="pref_circle_sensitivity_e_medium">Orta</string>
<string name="pref_circle_sensitivity_e_medium">Orta</string> <string name="pref_circle_sensitivity_e_low">Düşük</string>
<string name="pref_circle_sensitivity_e_low">Düşük</string> <string name="pref_circle_sensitivity_e_disabled">Devre dışı</string>
<string name="pref_circle_sensitivity_e_disabled">Devre dışı</string> <string name="key_action_next">Sonraki</string>
<string name="key_action_next">Sonraki</string> <string name="key_action_done">Tamam</string>
<string name="key_action_done">Tamam</string> <string name="key_action_go">ileri</string>
<string name="key_action_go">ileri</string> <string name="key_action_prev">Önceki</string>
<string name="key_action_prev">Önceki</string> <string name="key_action_search">Ara</string>
<string name="key_action_search">Ara</string> <string name="key_action_send">Gönder</string>
<string name="key_action_send">Gönder</string> <string name="launcher_button_imesettings">Ayarlarda aktif et</string>
<string name="launcher_button_imesettings">Ayarlarda aktif et</string> <string name="launcher_button_imepicker">Klavye Seç</string>
<string name="launcher_button_imepicker">Klavye Seç</string> <string name="launcher_description">Bu uygulama bir sanal klavye uygulamasıdır. Aşağıdaki butona basarak sistem ayarlarında etkinleştiriniz.</string>
<string name="launcher_description">Bu uygulama bir sanal klavye uygulamasıdır. Aşağıdaki butona basarak sistem ayarlarında etkinleştiriniz.</string> <string name="launcher_sourcecode">Bu uygulama ücretsiz ve açık kaynaklıdır. Kaynak koduna erişmek veya bir hata raporlamak için GitHub</string>
<string name="launcher_sourcecode">Bu uygulama ücretsiz ve açık kaynaklıdır. Kaynak koduna erişmek veya bir hata raporlamak için GitHub\'a ulaşabilirsiniz.</string> <string name="launcher_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string>
<string name="launcher_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string> <string name="launcher_tryhere_hint">Burada dene</string>
<string name="launcher_tryhere_hint">Burada dene</string> <string name="key_descr_capslock">CapsLock</string>
<string name="key_descr_capslock">CapsLock</string> <string name="key_descr_compose">Oluştur</string>
<string name="key_descr_compose">Oluştur</string> <string name="key_descr_switch_greekmath">Greek &amp; math sembolleri</string>
<string name="key_descr_switch_greekmath">Greek &amp; math sembolleri</string> <string name="key_descr_change_method">Klavye değiştir</string>
<string name="key_descr_change_method">Klavye değiştir</string> <string name="key_descr_voice_typing">Sesle yazma</string>
<string name="key_descr_voice_typing">Sesle yazma</string> <string name="key_descr_copy">Kopyala</string>
<string name="key_descr_copy">Kopyala</string> <string name="key_descr_paste">Yapıştır</string>
<string name="key_descr_paste">Yapıştır</string> <string name="key_descr_cut">Kes</string>
<string name="key_descr_cut">Kes</string> <string name="key_descr_selectAll">Tümünü seç</string>
<string name="key_descr_selectAll">Tümünü seç</string> <string name="key_descr_shareText">Metni paylaş</string>
<string name="key_descr_pasteAsPlainText">Düz metin olarak yapıştır</string> <string name="key_descr_pasteAsPlainText">Düz metin olarak yapıştır</string>
<string name="key_descr_undo">Geri al</string> <string name="key_descr_undo">Geri al</string>
<string name="key_descr_redo">İleri al</string> <string name="key_descr_redo">İleri al</string>
<string name="key_descr_ª">Sıralı göstergesi</string> <string name="key_descr_ª">Sıralı göstergesi</string>
<string name="key_descr_º">Sıralı göstergesi</string> <string name="key_descr_º">Sıralı göstergesi</string>
<string name="key_descr_superscript">Süperscript</string> <string name="key_descr_superscript">Süperscript</string>
<string name="key_descr_subscript">Anascript</string> <string name="key_descr_subscript">Anascript</string>
<string name="key_descr_page_up">Yukarı</string> <string name="key_descr_page_up">Yukarı</string>
<string name="key_descr_page_down">Aşağı</string> <string name="key_descr_page_down">Aşağı</string>
<string name="key_descr_home">BAŞ(Sol yön tuşu)</string> <string name="key_descr_home">BAŞ(Sol yön tuşu)</string>
<string name="key_descr_end">SON(Sağ yön tuşu)</string> <string name="key_descr_end">SON(Sağ yön tuşu)</string>
<string name="key_descr_clipboard">Pano</string> <string name="key_descr_clipboard">Pano</string>
<string name="key_descr_combining">Aksanları birleştir</string> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="key_descr_dead_key">Boş tuş</string> <string name="clipboard_history_heading">Son kopyalanan metin</string>
<string name="key_descr_zwj">Sıfır genişlikli birleştirici</string> <string name="clipboard_pin_heading">Sabitlendi</string>
<string name="key_descr_zwnj">Sıfır genişlikte birleştirmeyen</string> <string name="clipboard_remove_confirm">Bu sabitlemeyi sil</string>
<string name="key_descr_nbsp">Kırılmaz boşluk</string> <string name="clipboard_remove_confirmed">Evet</string>
<string name="key_descr_nnbsp">Dar kırılmaz boşluk</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Son kopyalanan metin</string>
<string name="clipboard_pin_heading">Sabitlendi</string>
<string name="clipboard_remove_confirm">Bu panodan silinsin mi?</string>
<string name="clipboard_remove_confirmed">Evet</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (Налагодження)</string> <string name="app_name_debug">Unexpected Keyboard (Налагодження)</string>
<string name="short_description">Легка та конфіденційна віртуальна клавіатура для Android.</string> <string name="short_description">Легка та конфіденційна віртуальна клавіатура для Android.</string>
<string name="store_description">Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.\n\nЦя програма спочатку була розроблена для програмістів, які використовують Termux.\nТепер ідеально підходить для щоденного використання.\n\nЦя програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код.</string> <string name="store_description">"Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.
<string name="pref_portrait">У портретному режимі</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Ця програма спочатку була розроблена для програмістів, які використовують Termux.
<string name="pref_landscape">У альбомному режимі</string> Тепер ідеально підходить для щоденного використання.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Макет</string> Ця програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код."</string>
<string name="pref_label_brightness">Налаштувати яскравість символів</string> <string name="settings_activity_label">Unexpected Keyboard Налаштування</string>
<string name="pref_keyboard_opacity">Налаштувати прозорість фону клавіатури</string> <string name="pref_portrait">У портретному режимі</string>
<string name="pref_key_opacity">Налаштувати прозорість клавіш</string> <string name="pref_landscape">У альбомному режимі</string>
<string name="pref_key_activated_opacity">Налаштувати прозорість натиснутої клавіші</string> <string name="pref_category_layout">Макет</string>
<string name="pref_layout_e_system">Системні налаштування</string> <string name="pref_label_brightness">Налаштувати яскравість символів</string>
<string name="pref_layout_e_custom">Власний макет</string> <string name="pref_keyboard_opacity">Налаштувати прозорість фону клавіатури</string>
<string name="pref_layouts_add">Додати альтернативний макет</string> <string name="pref_key_opacity">Налаштувати прозорість клавіш</string>
<string name="pref_layouts_item">Макет %1$d: %2$s</string> <string name="pref_key_activated_opacity">Налаштувати прозорість натиснутої клавіші</string>
<string name="pref_layouts_remove_custom">Видалити макет</string> <string name="pref_layout_e_system">Системні налаштування</string>
<string name="pref_custom_layout_title">Власний макет</string> <string name="pref_layout_e_custom">Власний макет</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">Додати альтернативний макет</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">Макет %1$d: %2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">Видалити макет</string>
<string name="pref_show_numpad_title">Показувати числову клавіатуру</string> <string name="pref_custom_layout_title">Власний макет</string>
<string name="pref_show_numpad_never">Ніколи</string> <string name="pref_show_numpad_title">Показувати числову клавіатуру </string>
<string name="pref_show_numpad_landscape">Тільки в альбомному режимі</string> <string name="pref_show_numpad_never">Ніколи</string>
<string name="pref_show_numpad_always">Завжди</string> <string name="pref_show_numpad_landscape">Тільки в альбомному режимі</string>
<string name="pref_number_row_title">Показувати рядок чисел</string> <string name="pref_show_numpad_always">Завжди</string>
<string name="pref_number_row_summary">Додати рядок чисел у верхній частині клавіатури, коли числову клавіатуру приховано</string> <string name="pref_number_row_title">Показувати рядок чисел</string>
<string name="pref_numpad_layout">Макет числової клавіатури</string> <string name="pref_number_row_summary">Додати рядок чисел у верхній частині клавіатури, коли числову клавіатуру приховано</string>
<string name="pref_numpad_layout_e_high_first">Від найбільшої цифри</string> <string name="pref_numpad_layout">Макет числової клавіатури</string>
<string name="pref_numpad_layout_e_low_first">Від найменшої цифри</string> <string name="pref_numpad_layout_e_high_first">Від найбільшої цифри</string>
<string name="pref_extra_keys_title">Додати клавіші до клавіатури</string> <string name="pref_numpad_layout_e_low_first">Від найменшої цифри</string>
<string name="pref_extra_keys_custom">Додайте власні клавіші</string> <string name="pref_extra_keys_title">Додати клавіші до клавіатури</string>
<string name="pref_extra_keys_internal">Виберіть клавіші, які потрібно додати до клавіатури</string> <string name="pref_extra_keys_custom">Додайте власні клавіші</string>
<string name="pref_category_typing">Введення</string> <string name="pref_extra_keys_internal">Виберіть клавіші, які потрібно додати до клавіатури</string>
<string name="pref_swipe_dist_title">Відстань проведення</string> <string name="pref_category_typing">Введення</string>
<string name="pref_swipe_dist_summary">Відстань між символами в кутах клавіш (%s)</string> <string name="pref_swipe_dist_title">Відстань проведення</string>
<string name="pref_long_timeout_title">Час очікування тривалого натискання</string> <string name="pref_swipe_dist_summary">Відстань між символами в кутах клавіш (%s)</string>
<string name="pref_long_interval_title">Інтервал повторення клавіш</string> <string name="pref_long_timeout_title">Час очікування тривалого натискання</string>
<string name="pref_keyrepeat_enabled">Повторення клавіші при тривалому натисканні</string> <string name="pref_long_interval_title">Інтервал повторення клавіш</string>
<string name="pref_lock_double_tap_title">Двічі торкніться Shift для Caps Lock</string> <string name="pref_keyrepeat_enabled">Повторення клавіші при тривалому натисканні</string>
<string name="pref_lock_double_tap_summary">Ви можете заблокувати будь-який модифікатор, утримуючи його</string> <string name="pref_lock_double_tap_title">Двічі торкніться Shift для Caps Lock</string>
<string name="pref_category_behavior">Поведінка</string> <string name="pref_lock_double_tap_summary">Ви можете заблокувати будь-який модифікатор, утримуючи його</string>
<string name="pref_autocapitalisation_title">Автоматичне введення великих літер</string> <string name="pref_category_behavior">Поведінка</string>
<string name="pref_autocapitalisation_summary">Натиснути Shift на початку речення</string> <string name="pref_autocapitalisation_title">Автоматичне введення великих літер</string>
<string name="pref_switch_input_immediate_title">Перейти до останньої використаної клавіатури</string> <string name="pref_autocapitalisation_summary">Натиснути Shift на початку речення</string>
<string name="pref_switch_input_immediate_summary">Поведінка клавіші перемикання клавіатури</string> <string name="pref_switch_input_immediate_title">Перейти до останньої використаної клавіатури</string>
<string name="pref_vibrate_custom">Спеціальна вібрація</string> <string name="pref_switch_input_immediate_summary">Поведінка клавіші перемикання клавіатури</string>
<string name="pref_vibrate_duration_title">Інтенсивність вібрації</string> <string name="pref_vibrate_custom">Спеціальна вібрація</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">Інтенсивність вібрації</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">Макет введення PIN-коду</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">При наборі чисел, дат і номерів телефонів</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Стиль</string>
<string name="pref_category_style">Стиль</string> <string name="pref_margin_bottom_title">Поле знизу</string>
<string name="pref_margin_bottom_title">Поле знизу</string> <string name="pref_keyboard_height_title">Висота клавіатури</string>
<string name="pref_keyboard_height_title">Висота клавіатури</string> <string name="pref_horizontal_margin_title">Горизонтальне поле</string>
<string name="pref_horizontal_margin_title">Горизонтальне поле</string> <string name="pref_character_size_title">Розмір символів</string>
<string name="pref_character_size_title">Розмір символів</string> <string name="pref_character_size_summary">Розмір символів, що відображаються на клавіатурі (%.2fx)</string>
<string name="pref_character_size_summary">Розмір символів, що відображаються на клавіатурі (%.2fx)</string> <string name="pref_theme">Тема</string>
<string name="pref_theme">Тема</string> <string name="pref_theme_e_system">Налаштування системи</string>
<string name="pref_theme_e_system">Налаштування системи</string> <string name="pref_theme_e_dark">Темна</string>
<string name="pref_theme_e_dark">Темна</string> <string name="pref_theme_e_light">Світла</string>
<string name="pref_theme_e_light">Світла</string> <string name="pref_theme_e_black">Чорна</string>
<string name="pref_theme_e_black">Чорна</string> <string name="pref_theme_e_altblack">Альтернативний чорний</string>
<string name="pref_theme_e_altblack">Альтернативний чорний</string> <string name="pref_theme_e_white">Біла</string>
<string name="pref_theme_e_white">Біла</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_desert">Пустеля</string>
<string name="pref_theme_e_desert">Пустеля</string> <string name="pref_theme_e_jungle">Джунглі</string>
<string name="pref_theme_e_jungle">Джунглі</string> <string name="pref_theme_e_monet">Моне (Системна)</string>
<string name="pref_theme_e_monet">Моне (Системна)</string> <string name="pref_theme_e_monetlight">Моне (Світла)</string>
<string name="pref_theme_e_monetlight">Моне (Світла)</string> <string name="pref_theme_e_monetdark">Моне (Темна)</string>
<string name="pref_theme_e_monetdark">Моне (Темна)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_theme_e_rosepine">Рожева сосна</string> <string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string> <string name="pref_swipe_dist_e_short">Коротка</string>
<string name="pref_swipe_dist_e_short">Коротка</string> <string name="pref_swipe_dist_e_default">Звичайна</string>
<string name="pref_swipe_dist_e_default">Звичайна</string> <string name="pref_swipe_dist_e_far">Далека</string>
<string name="pref_swipe_dist_e_far">Далека</string> <string name="pref_swipe_dist_e_very_far">Дуже далека</string>
<string name="pref_swipe_dist_e_very_far">Дуже далека</string> <string name="pref_key_horizontal_space">Горизонтальна відстань між клавішами</string>
<string name="pref_key_horizontal_space">Горизонтальна відстань між клавішами</string> <string name="pref_key_vertical_space">Вертикальна відстань між клавішами</string>
<string name="pref_key_vertical_space">Вертикальна відстань між клавішами</string> <string name="pref_border_config_title">Налаштувати межі</string>
<string name="pref_border_config_title">Налаштувати межі</string> <string name="pref_border_width_title">Ширина межі</string>
<string name="pref_border_width_title">Ширина межі</string> <string name="pref_corners_radius_title">Радіус кута</string>
<string name="pref_corners_radius_title">Радіус кута</string> <string name="pref_circle_sensitivity_title">Чутливість до колових жестів</string>
<string name="pref_circle_sensitivity_title">Чутливість до колових жестів</string> <string name="pref_circle_sensitivity_e_high">Висока</string>
<string name="pref_circle_sensitivity_e_high">Висока</string> <string name="pref_circle_sensitivity_e_medium">Середня</string>
<string name="pref_circle_sensitivity_e_medium">Середня</string> <string name="pref_circle_sensitivity_e_low">Низька</string>
<string name="pref_circle_sensitivity_e_low">Низька</string> <string name="pref_circle_sensitivity_e_disabled">Вимкнено</string>
<string name="pref_circle_sensitivity_e_disabled">Вимкнено</string> <string name="key_action_next">Далі</string>
<string name="key_action_next">Далі</string> <string name="key_action_done">Готово</string>
<string name="key_action_done">Готово</string> <string name="key_action_go">Іти</string>
<string name="key_action_go">Іти</string> <string name="key_action_prev">Назад</string>
<string name="key_action_prev">Назад</string> <string name="key_action_search">Пошук</string>
<string name="key_action_search">Пошук</string> <string name="key_action_send">Надіслати</string>
<string name="key_action_send">Надіслати</string> <string name="launcher_button_imesettings">Увімкнути клавіатуру</string>
<string name="launcher_button_imesettings">Увімкнути клавіатуру</string> <string name="launcher_button_imepicker">Вибрати клавіатуру</string>
<string name="launcher_button_imepicker">Вибрати клавіатуру</string> <string name="launcher_description">Ця програма є віртуальною клавіатурою. Перейдіть до системних налаштувань, натиснувши кнопку нижче, і ввімкніть Unexpected-Keyboard.</string>
<string name="launcher_description">Ця програма є віртуальною клавіатурою. Перейдіть до системних налаштувань, натиснувши кнопку нижче, і ввімкніть Unexpected-Keyboard.</string> <string name="launcher_sourcecode">Це безкоштовна програма з відкритим кодом. Ви можете знайти початковий код або повідомити про помилки на GitHub.</string>
<string name="launcher_sourcecode">Це безкоштовна програма з відкритим кодом. Ви можете знайти початковий код або повідомити про помилки на GitHub.</string> <string name="launcher_tryhere">Після ввімкнення ви можете спробувати клавіатуру тут:</string>
<string name="launcher_tryhere">Після ввімкнення ви можете спробувати клавіатуру тут:</string> <string name="launcher_tryhere_hint">Спробуйте тут</string>
<string name="launcher_tryhere_hint">Спробуйте тут</string> <string name="key_descr_capslock">Caps lock</string>
<string name="key_descr_capslock">Caps lock</string> <string name="key_descr_compose">Compose</string>
<string name="key_descr_compose">Compose</string> <string name="key_descr_switch_greekmath">Грецькі та математичні символи</string>
<string name="key_descr_switch_greekmath">Грецькі та математичні символи</string> <string name="key_descr_change_method">Переключити клавіатуру</string>
<string name="key_descr_change_method">Переключити клавіатуру</string> <string name="key_descr_voice_typing">Голосове введення</string>
<string name="key_descr_voice_typing">Голосове введення</string> <string name="key_descr_copy">Копіювати</string>
<string name="key_descr_copy">Копіювати</string> <string name="key_descr_paste">Вставити</string>
<string name="key_descr_paste">Вставити</string> <string name="key_descr_cut">Вирізати</string>
<string name="key_descr_cut">Вирізати</string> <string name="key_descr_selectAll">Вибрати все</string>
<string name="key_descr_selectAll">Вибрати все</string> <string name="key_descr_shareText">Поділитися текстом</string>
<string name="key_descr_pasteAsPlainText">Вставити як звичайний текст</string> <string name="key_descr_pasteAsPlainText">Вставити як звичайний текст</string>
<string name="key_descr_undo">Відмінити</string> <string name="key_descr_undo">Відмінити</string>
<string name="key_descr_redo">Повторити</string> <string name="key_descr_redo">Повторити</string>
<string name="key_descr_ª">Жіночий порядковий вказівник</string> <string name="key_descr_ª">Жіночий порядковий вказівник</string>
<string name="key_descr_º">Чоловічий порядковий вказівник</string> <string name="key_descr_º">Чоловічий порядковий вказівник</string>
<string name="key_descr_superscript">Верхній індекс</string> <string name="key_descr_superscript">Верхній індекс</string>
<string name="key_descr_subscript">Нижній індекс</string> <string name="key_descr_subscript">Нижній індекс</string>
<string name="key_descr_page_up">Page Up</string> <string name="key_descr_page_up">Page Up</string>
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Менеджер буфера обміну</string> <string name="key_descr_clipboard">Менеджер буфера обміну</string>
<string name="key_descr_combining">Комбінування діакритики</string> <string name="key_descr_combining">Комбінування діакритики</string>
<string name="key_descr_dead_key">Мертва клавіша</string> <string name="clipboard_history_heading">Нещодавно скопійований текст</string>
<string name="key_descr_zwj">З\'єднувач нульової ширини</string> <string name="clipboard_pin_heading">Закріплено</string>
<string name="key_descr_zwnj">Разділювач нульової ширини</string> <string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>
<string name="key_descr_nbsp">Нерозривний пробіл</string> <string name="clipboard_remove_confirmed">Так</string>
<string name="key_descr_nnbsp">Вузький нерозривний пробіл</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">Нещодавно скопійований текст</string>
<string name="clipboard_pin_heading">Закріплено</string>
<string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>
<string name="clipboard_remove_confirmed">Так</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (gỡ lỗi)</string> <string name="app_name_debug">Unexpected Keyboard (gỡ lỗi)</string>
<string name="short_description">Bàn phím ảo gọn nhẹ và tôn trọng quyền riêng tư cho Android.</string> <string name="short_description">Bàn phím ảo gọn nhẹ và tôn trọng quyền riêng tư cho Android.</string>
<string name="store_description">Chức năng chính là dễ dàng gõ nhiều ký tự bằng cách kéo phím về góc của nó.\n\nỨng dụng này ban đầu được thiết kế cho các lập trình viên dùng Termux.\nBây giờ đã hoàn hảo cho việc sử dụng hàng ngày.\n\nỨng dụng này không chứa quảng cáo, không cần đến mạng, và có mã nguồn mở.</string> <string name="store_description">"Chức năng chính là dễ dàng gõ nhiều ký tự bằng cách kéo phím về góc của nó.
<string name="pref_portrait">Trong chế độ chân dung</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> Ứng dụng này ban đầu được thiết kế cho các lập trình viên dùng Termux.
<string name="pref_landscape">Trong chế độ phong cảnh</string> Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Bố cục</string> Ứng dụng này không chứa quảng cáo, không cần đến mạng, và có mã nguồn mở."</string>
<string name="pref_label_brightness">Tùy chỉnh độ sáng của phím</string> <string name="settings_activity_label">Cài đặt Unexpected Keyboard</string>
<string name="pref_keyboard_opacity">Tùy chỉnh độ trong suốt của bàn phím</string> <string name="pref_portrait">Trong chế độ chân dung</string>
<string name="pref_key_opacity">Tùy chỉnh độ trong suốt của phím</string> <string name="pref_landscape">Trong chế độ phong cảnh</string>
<string name="pref_key_activated_opacity">Tùy chỉnh độ trong suốt của phím khi nhấn</string> <string name="pref_category_layout">Bố cục</string>
<string name="pref_layout_e_system">Hệ thống</string> <string name="pref_label_brightness">Tùy chỉnh độ sáng của phím</string>
<string name="pref_layout_e_custom">Tùy chỉnh bố cục</string> <string name="pref_keyboard_opacity">Tùy chỉnh độ trong suốt của bàn phím</string>
<!-- <string name="pref_layouts_add">Add an alternate layout</string> --> <string name="pref_key_opacity">Tùy chỉnh độ trong suốt của phím</string>
<!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> --> <string name="pref_key_activated_opacity">Tùy chỉnh độ trong suốt của phím khi nhấn</string>
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> --> <string name="pref_layout_e_system">Hệ thống</string>
<string name="pref_custom_layout_title">Tùy chỉnh bố cục</string> <string name="pref_layout_e_custom">Tùy chỉnh bố cục</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
<string name="pref_show_numpad_title">Hiện NumPad</string> <string name="pref_custom_layout_title">Tùy chỉnh bố cục</string>
<string name="pref_show_numpad_never">Không bao giờ</string> <string name="pref_show_numpad_title">Hiện NumPad</string>
<string name="pref_show_numpad_landscape">Chỉ trong chế độ phong cảnh</string> <string name="pref_show_numpad_never">Không bao giờ</string>
<string name="pref_show_numpad_always">Luôn luôn</string> <string name="pref_show_numpad_landscape">Chỉ trong chế độ phong cảnh</string>
<string name="pref_number_row_title">Hiện số dòng</string> <string name="pref_show_numpad_always">Luôn luôn</string>
<string name="pref_number_row_summary">Hiện số dòng trên đầu bàn phím khi NumPad ẩn</string> <string name="pref_number_row_title">Hiện số dòng</string>
<string name="pref_numpad_layout">Bố cục NumPad</string> <string name="pref_number_row_summary">Hiện số dòng trên đầu bàn phím khi NumPad ẩn</string>
<string name="pref_numpad_layout_e_high_first">Slớn nhất trước</string> <string name="pref_numpad_layout">Bcục NumPad</string>
<string name="pref_numpad_layout_e_low_first">Số nhỏ nhất trước</string> <string name="pref_numpad_layout_e_high_first">Số lớn nhất trước</string>
<string name="pref_extra_keys_title">Thêm phím vào bàn phím</string> <string name="pref_numpad_layout_e_low_first">Số nhỏ nhất trước</string>
<!-- <string name="pref_extra_keys_custom">Add custom keys</string> --> <string name="pref_extra_keys_title">Thêm phím vào bàn phím</string>
<!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> --> <!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
<string name="pref_category_typing"></string> <!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
<string name="pref_swipe_dist_title">Khoảng cách vuốt</string> <string name="pref_category_typing"></string>
<string name="pref_swipe_dist_summary">Khoảng cách giữa các ký tự ở góc phím (%s)</string> <string name="pref_swipe_dist_title">Khoảng cách vuốt</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_swipe_dist_summary">Khoảng cách giữa các ký tự ở góc phím (%s)</string>
<string name="pref_long_interval_title">Khoảng thời gian lặp phím</string> <!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_long_interval_title">Khoảng thời gian lặp phím</string>
<string name="pref_lock_double_tap_title">Nhấn hai lần Shift để bật Caps Lock</string> <!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_lock_double_tap_summary">Bạn có thể khóa phím hỗ trợ bằng cách giữ vào nó</string> <string name="pref_lock_double_tap_title">Nhấn hai lần Shift để bật Caps Lock</string>
<!-- <string name="pref_category_behavior">Behavior</string> --> <string name="pref_lock_double_tap_summary">Bạn có thể khóa phím hỗ trợ bằng cách giữ vào nó</string>
<string name="pref_autocapitalisation_title">Tự động viết hoa</string> <!-- <string name="pref_category_behavior">Behavior</string> -->
<string name="pref_autocapitalisation_summary">Nhấn Shift ở đầu câu</string> <string name="pref_autocapitalisation_title">Tự động viết hoa</string>
<!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> --> <string name="pref_autocapitalisation_summary">Nhấn Shift ở đầu câu</string>
<!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> --> <!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> -->
<!-- <string name="pref_vibrate_custom">Custom vibration</string> --> <!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> -->
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> --> <!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">Kiểu cách</string>
<string name="pref_category_style">Kiểu cách</string> <string name="pref_margin_bottom_title">Căn lề dưới</string>
<string name="pref_margin_bottom_title">Căn lề dưới</string> <string name="pref_keyboard_height_title">Chiều cao bàn phím</string>
<string name="pref_keyboard_height_title">Chiều cao bàn phím</string> <string name="pref_horizontal_margin_title">Căn lề chiều ngang</string>
<string name="pref_horizontal_margin_title">Căn lề chiều ngang</string> <string name="pref_character_size_title">Kích cỡ ký tự phím</string>
<string name="pref_character_size_title">Kích cỡ ký tự phím</string> <string name="pref_character_size_summary">Kích cỡ các ký tự hiển thị trên bàn phím (%.2fx)</string>
<string name="pref_character_size_summary">Kích cỡ các ký tự hiển thị trên bàn phím (%.2fx)</string> <string name="pref_theme">Chủ đề</string>
<string name="pref_theme">Chủ đề</string> <string name="pref_theme_e_system">Hệ thống</string>
<string name="pref_theme_e_system">Hệ thống</string> <string name="pref_theme_e_dark">Tối</string>
<string name="pref_theme_e_dark">Tối</string> <string name="pref_theme_e_light">Sáng</string>
<string name="pref_theme_e_light">Sáng</string> <string name="pref_theme_e_black">Đen</string>
<string name="pref_theme_e_black">Đen</string> <!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> --> <string name="pref_theme_e_white">Trắng</string>
<string name="pref_theme_e_white">Trắng</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_epaper">ePaper</string> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> --> <!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> --> <!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> --> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> --> <string name="pref_swipe_dist_e_very_short">Rất gần</string>
<string name="pref_swipe_dist_e_very_short">Rất gần</string> <string name="pref_swipe_dist_e_short">Gần</string>
<string name="pref_swipe_dist_e_short">Gần</string> <string name="pref_swipe_dist_e_default">Trungbình</string>
<string name="pref_swipe_dist_e_default">Trungbình</string> <string name="pref_swipe_dist_e_far">Xa</string>
<string name="pref_swipe_dist_e_far">Xa</string> <string name="pref_swipe_dist_e_very_far">Rất xa</string>
<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_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_key_vertical_space">Khoảng cách giữa các phím theo chiều dọc</string> <!-- <string name="pref_border_config_title">Customize borders</string> -->
<!-- <string name="pref_border_config_title">Customize borders</string> --> <!-- <string name="pref_border_width_title">Border Width</string> -->
<!-- <string name="pref_border_width_title">Border Width</string> --> <!-- <string name="pref_corners_radius_title">Corner radius</string> -->
<!-- <string name="pref_corners_radius_title">Corner radius</string> --> <!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="key_action_next">Tiếp</string>
<string name="key_action_next">Tiếp</string> <string name="key_action_done">Xong</string>
<string name="key_action_done">Xong</string> <string name="key_action_go">Đi</string>
<string name="key_action_go">Đi</string> <string name="key_action_prev">Trước</string>
<string name="key_action_prev">Trước</string> <string name="key_action_search">Tìm</string>
<string name="key_action_search">Tìm</string> <string name="key_action_send">Gửi</string>
<string name="key_action_send">Gửi</string> <!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> --> <!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
<!-- <string name="launcher_button_imepicker">Select keyboard</string> --> <!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> --> <!-- <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> -->
<!-- <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> --> <!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> --> <!-- <string name="launcher_tryhere_hint">Try here</string> -->
<!-- <string name="launcher_tryhere_hint">Try here</string> --> <!-- <string name="key_descr_capslock">Caps lock</string> -->
<!-- <string name="key_descr_capslock">Caps lock</string> --> <!-- <string name="key_descr_compose">Compose</string> -->
<!-- <string name="key_descr_compose">Compose</string> --> <!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> -->
<!-- <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> --> <!-- <string name="key_descr_change_method">Switch keyboard</string> -->
<!-- <string name="key_descr_change_method">Switch keyboard</string> --> <!-- <string name="key_descr_voice_typing">Voice typing</string> -->
<!-- <string name="key_descr_voice_typing">Voice typing</string> --> <!-- <string name="key_descr_copy">Copy</string> -->
<!-- <string name="key_descr_copy">Copy</string> --> <!-- <string name="key_descr_paste">Paste</string> -->
<!-- <string name="key_descr_paste">Paste</string> --> <!-- <string name="key_descr_cut">Cut</string> -->
<!-- <string name="key_descr_cut">Cut</string> --> <!-- <string name="key_descr_selectAll">Select all</string> -->
<!-- <string name="key_descr_selectAll">Select all</string> --> <!-- <string name="key_descr_shareText">Share text</string> -->
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> --> <!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
<!-- <string name="key_descr_undo">Undo</string> --> <!-- <string name="key_descr_undo">Undo</string> -->
<!-- <string name="key_descr_redo">Redo</string> --> <!-- <string name="key_descr_redo">Redo</string> -->
<!-- <string name="key_descr_ª">Ordinal Indicator</string> --> <!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
<!-- <string name="key_descr_º">Ordinal Indicator</string> --> <!-- <string name="key_descr_º">Ordinal Indicator</string> -->
<!-- <string name="key_descr_superscript">Superscript</string> --> <!-- <string name="key_descr_superscript">Superscript</string> -->
<!-- <string name="key_descr_subscript">Subscript</string> --> <!-- <string name="key_descr_subscript">Subscript</string> -->
<!-- <string name="key_descr_page_up">Page Up</string> --> <!-- <string name="key_descr_page_up">Page Up</string> -->
<!-- <string name="key_descr_page_down">Page Down</string> --> <!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> --> <!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> --> <!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> --> <!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="key_descr_combining">Combining diacritic</string> --> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<!-- <string name="key_descr_dead_key">Dead key</string> --> <!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="key_descr_zwj">Zero width joiner</string> --> <!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="key_descr_zwnj">Zero width non-joiner</string> --> <!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="key_descr_nbsp">Non-breaking space</string> --> <!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<!-- <string name="key_descr_nnbsp">Narrow non-breaking space</string> -->
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard item?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,138 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (debug)</string> <string name="app_name_debug">Unexpected Keyboard (debug)</string>
<string name="short_description">适用于 Android 的轻量级、注重隐私的虚拟键盘。</string> <string name="short_description">适用于 Android 的轻量级、注重隐私的虚拟键盘。</string>
<string name="store_description">此应用的主要功能是,通过将按键沿四角滑动,您可以输入更多字符。\n\n此应用最初是为使用 Termux 的程序员而设计的。\n现在对于日常使用来说也很完美。\n\n此应用没有广告不会发送任何网络请求而且是开源的。</string> <string name="store_description">"此应用的主要功能是,通过将按键沿四角滑动,您可以输入更多字符。
<string name="pref_portrait">在竖屏模式下</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> 此应用最初是为使用 Termux 的程序员而设计的。
<string name="pref_landscape">在横屏模式下</string> 现在对于日常使用来说也很完美。
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">布局</string> 此应用没有广告,不会发送任何网络请求,而且是开源的。"</string>
<string name="pref_label_brightness">调整字母亮度</string> <string name="settings_activity_label">Unexpected Keyboard 设置</string>
<string name="pref_keyboard_opacity">调整键盘背景透明度</string> <string name="pref_portrait">在竖屏模式下</string>
<string name="pref_key_opacity">调整按键透明度</string> <string name="pref_landscape">在横屏模式下</string>
<string name="pref_key_activated_opacity">调整按下的按键的透明度</string> <string name="pref_category_layout">布局</string>
<string name="pref_layout_e_system">系统设置</string> <string name="pref_label_brightness">调整字母亮度</string>
<string name="pref_layout_e_custom">自定义布局</string> <string name="pref_keyboard_opacity">调整键盘背景透明度</string>
<string name="pref_layouts_add">添加其他布局</string> <string name="pref_key_opacity">调整按键透明度</string>
<string name="pref_layouts_item">布局 %1$d%2$s</string> <string name="pref_key_activated_opacity">调整按下的按键的透明度</string>
<string name="pref_layouts_remove_custom">移除布局</string> <string name="pref_layout_e_system">系统设置</string>
<string name="pref_custom_layout_title">自定义布局</string> <string name="pref_layout_e_custom">自定义布局</string>
<!-- <string name="pref_show_number_row_no_number_row">No number row</string> --> <string name="pref_layouts_add">添加其他布局</string>
<!-- <string name="pref_show_number_row_no_symbols">Number row without symbols</string> --> <string name="pref_layouts_item">布局 %1$d%2$s</string>
<!-- <string name="pref_show_number_row_symbols">Number row with symbols</string> --> <string name="pref_layouts_remove_custom">移除布局</string>
<string name="pref_show_numpad_title">显示数字小键盘</string> <string name="pref_custom_layout_title">自定义布局</string>
<string name="pref_show_numpad_never">从不</string> <string name="pref_show_numpad_title">显示数字小键盘</string>
<string name="pref_show_numpad_landscape">只在横屏显示</string> <string name="pref_show_numpad_never">从不</string>
<string name="pref_show_numpad_always">一直显示</string> <string name="pref_show_numpad_landscape">只在横屏显示</string>
<string name="pref_number_row_title">显示数字行</string> <string name="pref_show_numpad_always">一直显示</string>
<string name="pref_number_row_summary">当数字小键盘隐藏时,在键盘上方显示数字按键</string> <string name="pref_number_row_title">显示数字</string>
<string name="pref_numpad_layout">数字小键盘布局</string> <string name="pref_number_row_summary">数字小键盘隐藏时,在键盘上方显示数字按键</string>
<string name="pref_numpad_layout_e_high_first">数字在上方</string> <string name="pref_numpad_layout">数字小键盘布局</string>
<string name="pref_numpad_layout_e_low_first">数字在上方</string> <string name="pref_numpad_layout_e_high_first">数字在上方</string>
<string name="pref_extra_keys_title">选择要显示的按键</string> <string name="pref_numpad_layout_e_low_first">小数字在上方</string>
<string name="pref_extra_keys_custom">添加自定义按键</string> <string name="pref_extra_keys_title">选择要显示的按键</string>
<string name="pref_extra_keys_internal">选择要添加到键盘的按键</string> <string name="pref_extra_keys_custom">添加自定义按键</string>
<string name="pref_category_typing">输入</string> <string name="pref_extra_keys_internal">选择要添加到键盘的按键</string>
<string name="pref_swipe_dist_title">滑动触发距离</string> <string name="pref_category_typing">输入</string>
<string name="pref_swipe_dist_summary">输入按键四角的符号需要滑动的距离 (%s)</string> <string name="pref_swipe_dist_title">滑动触发距离</string>
<string name="pref_long_timeout_title">长按触发延时</string> <string name="pref_swipe_dist_summary">输入按键四角的符号需要滑动的距离 (%s)</string>
<string name="pref_long_interval_title">长按后每次重复输入的时间间隔</string> <!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
<string name="pref_keyrepeat_enabled">长按重复输入</string> <string name="pref_long_interval_title">长按后每次重复输入的时间间隔</string>
<string name="pref_lock_double_tap_title">双击 Shift 键锁定大写</string> <!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
<string name="pref_lock_double_tap_summary">任何时候长按修饰键均可将其锁定</string> <string name="pref_lock_double_tap_title">双击 Shift 键锁定大写</string>
<string name="pref_category_behavior">行为</string> <string name="pref_lock_double_tap_summary">任何时候长按修饰键均可将其锁定</string>
<string name="pref_autocapitalisation_title">句首自动大写</string> <string name="pref_category_behavior">行为</string>
<string name="pref_autocapitalisation_summary">在句子的开头自动按下Shift</string> <string name="pref_autocapitalisation_title">句首自动大写</string>
<string name="pref_switch_input_immediate_title">切换到最近使用的键盘</string> <string name="pref_autocapitalisation_summary">在句子的开头自动按下Shift</string>
<string name="pref_switch_input_immediate_summary">切换键盘按钮的行为</string> <string name="pref_switch_input_immediate_title">切换到最近使用的键盘</string>
<string name="pref_vibrate_custom">自定义振动</string> <string name="pref_switch_input_immediate_summary">切换键盘按钮的行为</string>
<string name="pref_vibrate_duration_title">振动强度</string> <string name="pref_vibrate_custom">自定义振动</string>
<!-- <string name="pref_number_entry_title">Layout when typing numbers, dates and phone numbers</string> --> <string name="pref_vibrate_duration_title">振动强度</string>
<!-- <string name="pref_number_entry_layout_pin">PIN Entry</string> --> <string name="pref_pin_entry_enabled_title">数字输入布局</string>
<!-- <string name="pref_number_entry_layout_number">Number pane</string> --> <string name="pref_pin_entry_enabled_summary">输入数字、日期与电话号码时</string>
<!-- <string name="pref_number_entry_layout_normal">Use the main layout</string> --> <string name="pref_category_style">样式</string>
<string name="pref_category_style">样式</string> <string name="pref_margin_bottom_title">键盘下边距</string>
<string name="pref_margin_bottom_title">键盘下边距</string> <string name="pref_keyboard_height_title">键盘高度</string>
<string name="pref_keyboard_height_title">键盘高度</string> <string name="pref_horizontal_margin_title">键盘左右边距</string>
<string name="pref_horizontal_margin_title">键盘左右边距</string> <string name="pref_character_size_title">字符大小</string>
<string name="pref_character_size_title">字符大小</string> <string name="pref_character_size_summary">按键上显示的字符大小 (%.2fx)</string>
<string name="pref_character_size_summary">按键上显示的字符的大小 (%.2fx)</string> <string name="pref_theme">主题</string>
<string name="pref_theme">主题</string> <string name="pref_theme_e_system">跟随系统设置</string>
<string name="pref_theme_e_system">跟随系统设置</string> <string name="pref_theme_e_dark">暗色</string>
<string name="pref_theme_e_dark"></string> <string name="pref_theme_e_light"></string>
<string name="pref_theme_e_light"></string> <string name="pref_theme_e_black"></string>
<string name="pref_theme_e_black">黑色</string> <string name="pref_theme_e_altblack">黑色带边框</string>
<string name="pref_theme_e_altblack">黑色带边框</string> <string name="pref_theme_e_white">白色</string>
<string name="pref_theme_e_white">白色</string> <string name="pref_theme_e_epaper">白色带边框</string>
<string name="pref_theme_e_epaper">白色带边框</string> <string name="pref_theme_e_desert">沙漠</string>
<string name="pref_theme_e_desert">沙漠</string> <string name="pref_theme_e_jungle">雨林</string>
<string name="pref_theme_e_jungle">雨林</string> <!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<string name="pref_theme_e_monet">莫奈(系统)</string> <!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<string name="pref_theme_e_monetlight">莫奈(浅色)</string> <!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<string name="pref_theme_e_monetdark">莫奈(深色)</string> <!-- <string name="pref_theme_e_rosepine">Rosé Pine</string> -->
<string name="pref_theme_e_rosepine">桃红松韵Rosé Pine</string> <string name="pref_swipe_dist_e_very_short">非常短</string>
<string name="pref_swipe_dist_e_very_short">非常</string> <string name="pref_swipe_dist_e_short"></string>
<string name="pref_swipe_dist_e_short"></string> <string name="pref_swipe_dist_e_default">中(默认)</string>
<string name="pref_swipe_dist_e_default">中(默认)</string> <string name="pref_swipe_dist_e_far"></string>
<string name="pref_swipe_dist_e_far"></string> <string name="pref_swipe_dist_e_very_far">非常</string>
<string name="pref_swipe_dist_e_very_far">非常长</string> <string name="pref_key_horizontal_space">按键的左右边距</string>
<string name="pref_key_horizontal_space">按键的左右边距</string> <string name="pref_key_vertical_space">按键的上下边距</string>
<string name="pref_key_vertical_space">按键的上下边距</string> <string name="pref_border_config_title">自定义边界</string>
<string name="pref_border_config_title">自定义边界</string> <string name="pref_border_width_title">边界宽度</string>
<string name="pref_border_width_title">边界宽度</string> <string name="pref_corners_radius_title">圆角半径</string>
<string name="pref_corners_radius_title">圆角半径</string> <!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
<string name="pref_circle_sensitivity_title">环形手势灵敏度</string> <!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
<string name="pref_circle_sensitivity_e_high"></string> <!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
<string name="pref_circle_sensitivity_e_medium"></string> <!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
<string name="pref_circle_sensitivity_e_low"></string> <!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
<string name="pref_circle_sensitivity_e_disabled">禁用</string> <string name="key_action_next">下一项</string>
<string name="key_action_next">下一项</string> <string name="key_action_done">完成</string>
<string name="key_action_done">完成</string> <string name="key_action_go">前往</string>
<string name="key_action_go">前往</string> <string name="key_action_prev">上一项</string>
<string name="key_action_prev">上一项</string> <string name="key_action_search">搜索</string>
<string name="key_action_search">搜索</string> <string name="key_action_send">发送</string>
<string name="key_action_send">发送</string> <string name="launcher_button_imesettings">启用键盘</string>
<string name="launcher_button_imesettings">启用键盘</string> <string name="launcher_button_imepicker">选择键盘</string>
<string name="launcher_button_imepicker">选择键盘</string> <string name="launcher_description">这是一个虚拟键盘软件。点击按钮进入系统设置,然后启用 Unexpected-Keyboard 即可使用。</string>
<string name="launcher_description">这是一个虚拟键盘软件。点击按钮进入系统设置,然后启用 Unexpected-Keyboard 即可使用</string> <string name="launcher_sourcecode">这是一个免费且开源的软件。你可以在 GitHub 上找到源代码或反馈问题</string>
<string name="launcher_sourcecode">这是一个免费且开源的软件。你可以在 GitHub 上找到源代码或反馈问题。</string> <string name="launcher_tryhere">启用键盘后,可以在这里测试效果:</string>
<string name="launcher_tryhere">启用键盘后,可以在这里测试效果:</string> <string name="launcher_tryhere_hint">在这里测试</string>
<string name="launcher_tryhere_hint">在这里测试</string> <string name="key_descr_capslock">大写锁定</string>
<string name="key_descr_capslock">大写锁定</string> <string name="key_descr_compose">Compose</string>
<string name="key_descr_compose">字符组合键</string> <string name="key_descr_switch_greekmath">希腊 &amp; 数学符号</string>
<string name="key_descr_switch_greekmath">希腊 &amp; 数学符号</string> <string name="key_descr_change_method">切换键盘</string>
<string name="key_descr_change_method">切换键盘</string> <string name="key_descr_voice_typing">语音输入</string>
<string name="key_descr_voice_typing">语音输入</string> <string name="key_descr_copy">复制</string>
<string name="key_descr_copy">复制</string> <string name="key_descr_paste">粘贴</string>
<string name="key_descr_paste">粘贴</string> <string name="key_descr_cut">剪切</string>
<string name="key_descr_cut">剪切</string> <string name="key_descr_selectAll">全选</string>
<string name="key_descr_selectAll">全选</string> <string name="key_descr_shareText">分享文本</string>
<string name="key_descr_pasteAsPlainText">粘贴为纯文本</string> <string name="key_descr_pasteAsPlainText">粘贴为纯文本</string>
<string name="key_descr_undo">撤销</string> <string name="key_descr_undo">撤销</string>
<string name="key_descr_redo">重做</string> <string name="key_descr_redo">重做</string>
<string name="key_descr_ª">次序标志</string> <string name="key_descr_ª">次序标志</string>
<string name="key_descr_º">次序标志</string> <string name="key_descr_º">次序标志</string>
<string name="key_descr_superscript">上标</string> <string name="key_descr_superscript">上标</string>
<string name="key_descr_subscript">下标</string> <string name="key_descr_subscript">下标</string>
<string name="key_descr_page_up">上一页</string> <string name="key_descr_page_up">上一页</string>
<string name="key_descr_page_down">下一页</string> <string name="key_descr_page_down">下一页</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">管理剪贴板</string> <!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<string name="key_descr_combining">组合用附加符号</string> <!-- <string name="key_descr_combining">Combining diacritic</string> -->
<string name="key_descr_dead_key">前置组合键</string> <!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<string name="key_descr_zwj">零宽连字符</string> <!-- <string name="clipboard_pin_heading">Pinned</string> -->
<string name="key_descr_zwnj">零宽连字符</string> <!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<string name="key_descr_nbsp">不间断空格</string> <!-- <string name="clipboard_remove_confirmed">Yes</string> -->
<string name="key_descr_nnbsp">窄距不间断空格</string>
<!-- <string name="key_descr_delete_word">Delete a word</string> -->
<!-- <string name="key_descr_forward_delete_word">Delete a word on the right</string> -->
<!-- <string name="key_descr_gesture">Gesture</string> -->
<string name="clipboard_history_heading">最近剪贴内容</string>
<string name="clipboard_pin_heading">已固定</string>
<string name="clipboard_remove_confirm">确定移除此剪贴内容?</string>
<string name="clipboard_remove_confirmed">确定</string>
<!-- <string name="toast_no_voice_input">No voice typing app installed</string> -->
</resources> </resources>

View File

@@ -1,15 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string-array name="pref_show_number_row_values">
<item>no_number_row</item>
<item>no_symbols</item>
<item>symbols</item>
</string-array>
<string-array name="pref_show_number_row_entries">
<item>@string/pref_show_number_row_no_number_row</item>
<item>@string/pref_show_number_row_no_symbols</item>
<item>@string/pref_show_number_row_symbols</item>
</string-array>
<string-array name="pref_show_numpad_values"> <string-array name="pref_show_numpad_values">
<item>never</item> <item>never</item>
<item>landscape</item> <item>landscape</item>
@@ -84,24 +74,4 @@
<item>4</item> <item>4</item>
<item>12</item> <item>12</item>
</string-array> </string-array>
<string-array name="pref_number_entry_entries">
<item>@string/pref_number_entry_layout_pin</item>
<item>@string/pref_number_entry_layout_number</item>
<item>@string/pref_number_entry_layout_normal</item>
</string-array>
<string-array name="pref_number_entry_values">
<item>pin</item>
<item>number</item>
<item>normal</item>
</string-array>
<string-array name="pref_slider_sensitivity_entries">
<item>@string/pref_slider_sensitivity_slow</item>
<item>@string/pref_slider_sensitivity_medium</item>
<item>@string/pref_slider_sensitivity_fast</item>
</string-array>
<string-array name="pref_slider_sensitivity_values">
<item>60</item>
<item>30</item>
<item>15</item>
</string-array>
</resources> </resources>

View File

@@ -16,12 +16,9 @@
<item>armenian_ph_am</item> <item>armenian_ph_am</item>
<item>beng_national</item> <item>beng_national</item>
<item>beng_provat</item> <item>beng_provat</item>
<item>cyrl_fcuzhen_mn</item>
<item>cyrl_jcuken_as</item>
<item>cyrl_jcuken_kk</item> <item>cyrl_jcuken_kk</item>
<item>cyrl_jcuken_ru</item> <item>cyrl_jcuken_ru</item>
<item>cyrl_jcuken_uk</item> <item>cyrl_jcuken_uk</item>
<item>cyrl_lynyertdz_mk</item>
<item>cyrl_lynyertz_sr</item> <item>cyrl_lynyertz_sr</item>
<item>cyrl_ueishsht</item> <item>cyrl_ueishsht</item>
<item>cyrl_yaverti</item> <item>cyrl_yaverti</item>
@@ -43,9 +40,6 @@
<item>latn_bepo_fr</item> <item>latn_bepo_fr</item>
<item>latn_bone</item> <item>latn_bone</item>
<item>latn_neo2</item> <item>latn_neo2</item>
<item>latn_qwerty_apl</item>
<item>latn_qwerty_az</item>
<item>latn_qwerty_bqn</item>
<item>latn_qwerty_br</item> <item>latn_qwerty_br</item>
<item>latn_qwerty_cy</item> <item>latn_qwerty_cy</item>
<item>latn_qwerty_cz</item> <item>latn_qwerty_cz</item>
@@ -56,12 +50,9 @@
<item>latn_qwerty_gb</item> <item>latn_qwerty_gb</item>
<item>latn_qwerty_haw</item> <item>latn_qwerty_haw</item>
<item>latn_qwerty_hu</item> <item>latn_qwerty_hu</item>
<item>latn_qwerty_is</item>
<item>latn_qwerty_jp</item> <item>latn_qwerty_jp</item>
<item>latn_qwerty_kk</item> <item>latn_qwerty_kk</item>
<item>latn_qwerty_lt</item>
<item>latn_qwerty_lv</item> <item>latn_qwerty_lv</item>
<item>latn_qwerty_mt</item>
<item>latn_qwerty_no</item> <item>latn_qwerty_no</item>
<item>latn_qwerty_pl</item> <item>latn_qwerty_pl</item>
<item>latn_qwerty_ro</item> <item>latn_qwerty_ro</item>
@@ -70,7 +61,6 @@
<item>latn_qwerty_sr</item> <item>latn_qwerty_sr</item>
<item>latn_qwerty_tly</item> <item>latn_qwerty_tly</item>
<item>latn_qwerty_tr</item> <item>latn_qwerty_tr</item>
<item>latn_qwerty_uz</item>
<item>latn_qwerty_vi</item> <item>latn_qwerty_vi</item>
<item>latn_qwertz</item> <item>latn_qwertz</item>
<item>latn_qwertz_cz</item> <item>latn_qwertz_cz</item>
@@ -83,7 +73,6 @@
<item>latn_qwertz_sq</item> <item>latn_qwertz_sq</item>
<item>latn_workman_us</item> <item>latn_workman_us</item>
<item>shaw_imperial_en</item> <item>shaw_imperial_en</item>
<item>sinhala_phonetic</item>
<item>tamil_default</item> <item>tamil_default</item>
<item>urdu_phonetic_ur</item> <item>urdu_phonetic_ur</item>
<item>custom</item> <item>custom</item>
@@ -103,12 +92,9 @@
<item>Armenian</item> <item>Armenian</item>
<item>বাংলা (জাতীয়)</item> <item>বাংলা (জাতীয়)</item>
<item>বাংলা (প্রভাত)</item> <item>বাংলা (প্রভাত)</item>
<item>ФЦУЖЭН (Монгол)</item>
<item>ЈЦУКЕН (Всисловѣнск)</item>
<item>ЙЦУКЕН (Қазақша)</item> <item>ЙЦУКЕН (Қазақша)</item>
<item>ЙЦУКЕН (Русский)</item> <item>ЙЦУКЕН (Русский)</item>
<item>ЙЦУКЕН (Українська)</item> <item>ЙЦУКЕН (Українська)</item>
<item>ЉЊЕРТЅ (Македонски)</item>
<item>ЉЊЕРТЗ (Српски)</item> <item>ЉЊЕРТЗ (Српски)</item>
<item>УЕИШЩ (Български, БДС)</item> <item>УЕИШЩ (Български, БДС)</item>
<item>ЯВЕРТЪ</item> <item>ЯВЕРТЪ</item>
@@ -124,15 +110,12 @@
<item>두벌식 (Korean)</item> <item>두벌식 (Korean)</item>
<item>Hebrew 1</item> <item>Hebrew 1</item>
<item>Hebrew 2</item> <item>Hebrew 2</item>
<item>ಕನ್ನಡ - Kannada</item> <item>ಕನ್ನಡ</item>
<item>AZERTY (Belgian)</item> <item>AZERTY (Belgian)</item>
<item>AZERTY (Français)</item> <item>AZERTY (Français)</item>
<item>BEPO (Français)</item> <item>BEPO (Français)</item>
<item>Bone</item> <item>Bone</item>
<item>Neo 2</item> <item>Neo 2</item>
<item>QWERTY (APL)</item>
<item>QWERTY (Azərbaycanca)</item>
<item>QWERTY (BQN)</item>
<item>QWERTY (Brasileiro)</item> <item>QWERTY (Brasileiro)</item>
<item>QWERTY (Welsh)</item> <item>QWERTY (Welsh)</item>
<item>QWERTY (Czech)</item> <item>QWERTY (Czech)</item>
@@ -143,12 +126,9 @@
<item>QWERTY (UK)</item> <item>QWERTY (UK)</item>
<item>QWERTY (Hawaiian)</item> <item>QWERTY (Hawaiian)</item>
<item>QWERTY (Magyar)</item> <item>QWERTY (Magyar)</item>
<item>QWERTY (Íslenska)</item>
<item>QWERTY (Japan)</item> <item>QWERTY (Japan)</item>
<item>QWERTY (Qazaqşa)</item> <item>QWERTY (Qazaqşa)</item>
<item>QWERTY (Lietuviškai)</item>
<item>QWERTY (Latvian)</item> <item>QWERTY (Latvian)</item>
<item>QWERTY (Malti)</item>
<item>QWERTY (Norwegian)</item> <item>QWERTY (Norwegian)</item>
<item>QWERTY (Polski)</item> <item>QWERTY (Polski)</item>
<item>QWERTY (Română)</item> <item>QWERTY (Română)</item>
@@ -157,7 +137,6 @@
<item>QWERTY (Srpski, latinica)</item> <item>QWERTY (Srpski, latinica)</item>
<item>QWERTY (Talysh New Latin)</item> <item>QWERTY (Talysh New Latin)</item>
<item>QWERTY (Türkçe)</item> <item>QWERTY (Türkçe)</item>
<item>QWERTY (Oʻzbekcha)</item>
<item>QWERTY (Vietnamese)</item> <item>QWERTY (Vietnamese)</item>
<item>QWERTZ</item> <item>QWERTZ</item>
<item>QWERTZ (Czech)</item> <item>QWERTZ (Czech)</item>
@@ -170,7 +149,6 @@
<item>QWERTZ (Albanian)</item> <item>QWERTZ (Albanian)</item>
<item>WORKMAN (US)</item> <item>WORKMAN (US)</item>
<item>Shaw Imperial</item> <item>Shaw Imperial</item>
<item>සිංහල</item>
<item>தமிழ்</item> <item>தமிழ்</item>
<item>Urdu Phonetic</item> <item>Urdu Phonetic</item>
<item>@string/pref_layout_e_custom</item> <item>@string/pref_layout_e_custom</item>
@@ -190,12 +168,9 @@
<item>@xml/armenian_ph_am</item> <item>@xml/armenian_ph_am</item>
<item>@xml/beng_national</item> <item>@xml/beng_national</item>
<item>@xml/beng_provat</item> <item>@xml/beng_provat</item>
<item>@xml/cyrl_fcuzhen_mn</item>
<item>@xml/cyrl_jcuken_as</item>
<item>@xml/cyrl_jcuken_kk</item> <item>@xml/cyrl_jcuken_kk</item>
<item>@xml/cyrl_jcuken_ru</item> <item>@xml/cyrl_jcuken_ru</item>
<item>@xml/cyrl_jcuken_uk</item> <item>@xml/cyrl_jcuken_uk</item>
<item>@xml/cyrl_lynyertdz_mk</item>
<item>@xml/cyrl_lynyertz_sr</item> <item>@xml/cyrl_lynyertz_sr</item>
<item>@xml/cyrl_ueishsht</item> <item>@xml/cyrl_ueishsht</item>
<item>@xml/cyrl_yaverti</item> <item>@xml/cyrl_yaverti</item>
@@ -217,9 +192,6 @@
<item>@xml/latn_bepo_fr</item> <item>@xml/latn_bepo_fr</item>
<item>@xml/latn_bone</item> <item>@xml/latn_bone</item>
<item>@xml/latn_neo2</item> <item>@xml/latn_neo2</item>
<item>@xml/latn_qwerty_apl</item>
<item>@xml/latn_qwerty_az</item>
<item>@xml/latn_qwerty_bqn</item>
<item>@xml/latn_qwerty_br</item> <item>@xml/latn_qwerty_br</item>
<item>@xml/latn_qwerty_cy</item> <item>@xml/latn_qwerty_cy</item>
<item>@xml/latn_qwerty_cz</item> <item>@xml/latn_qwerty_cz</item>
@@ -230,12 +202,9 @@
<item>@xml/latn_qwerty_gb</item> <item>@xml/latn_qwerty_gb</item>
<item>@xml/latn_qwerty_haw</item> <item>@xml/latn_qwerty_haw</item>
<item>@xml/latn_qwerty_hu</item> <item>@xml/latn_qwerty_hu</item>
<item>@xml/latn_qwerty_is</item>
<item>@xml/latn_qwerty_jp</item> <item>@xml/latn_qwerty_jp</item>
<item>@xml/latn_qwerty_kk</item> <item>@xml/latn_qwerty_kk</item>
<item>@xml/latn_qwerty_lt</item>
<item>@xml/latn_qwerty_lv</item> <item>@xml/latn_qwerty_lv</item>
<item>@xml/latn_qwerty_mt</item>
<item>@xml/latn_qwerty_no</item> <item>@xml/latn_qwerty_no</item>
<item>@xml/latn_qwerty_pl</item> <item>@xml/latn_qwerty_pl</item>
<item>@xml/latn_qwerty_ro</item> <item>@xml/latn_qwerty_ro</item>
@@ -244,7 +213,6 @@
<item>@xml/latn_qwerty_sr</item> <item>@xml/latn_qwerty_sr</item>
<item>@xml/latn_qwerty_tly</item> <item>@xml/latn_qwerty_tly</item>
<item>@xml/latn_qwerty_tr</item> <item>@xml/latn_qwerty_tr</item>
<item>@xml/latn_qwerty_uz</item>
<item>@xml/latn_qwerty_vi</item> <item>@xml/latn_qwerty_vi</item>
<item>@xml/latn_qwertz</item> <item>@xml/latn_qwertz</item>
<item>@xml/latn_qwertz_cz</item> <item>@xml/latn_qwertz_cz</item>
@@ -257,7 +225,6 @@
<item>@xml/latn_qwertz_sq</item> <item>@xml/latn_qwertz_sq</item>
<item>@xml/latn_workman_us</item> <item>@xml/latn_workman_us</item>
<item>@xml/shaw_imperial_en</item> <item>@xml/shaw_imperial_en</item>
<item>@xml/sinhala_phonetic</item>
<item>@xml/tamil_default</item> <item>@xml/tamil_default</item>
<item>@xml/urdu_phonetic_ur</item> <item>@xml/urdu_phonetic_ur</item>
<item>-1</item> <item>-1</item>

View File

@@ -1,142 +1,129 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name_release">Unexpected Keyboard</string> <string name="app_name_release">Unexpected Keyboard</string>
<string name="app_name_debug">Unexpected Keyboard (Debug)</string> <string name="app_name_debug">Unexpected Keyboard (Debug)</string>
<string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string> <string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string>
<string name="store_description">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string> <string name="store_description">"The main feature is that you can type more characters by swiping the keys towards the corners.
<string name="pref_portrait">In portrait mode</string>
<string name="pref_portrait_unfolded">In portrait mode unfolded</string> This application was originally designed for programmers using Termux.
<string name="pref_landscape">In landscape mode</string> Now perfect for everyday use.
<string name="pref_landscape_unfolded">In landscape mode unfolded</string>
<string name="pref_category_layout">Layout</string> This application contains no ads, doesn't make any network requests and is Open Source."</string>
<string name="pref_label_brightness">Adjust label brightness</string> <string name="settings_activity_label">Unexpected Keyboard Settings</string>
<string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> <string name="pref_portrait">In portrait mode</string>
<string name="pref_key_opacity">Adjust key opacity</string> <string name="pref_landscape">In landscape mode</string>
<string name="pref_key_activated_opacity">Adjust pressed key opacity</string> <string name="pref_category_layout">Layout</string>
<string name="pref_layout_e_system">System settings</string> <string name="pref_label_brightness">Adjust label brightness</string>
<string name="pref_layout_e_custom">Custom layout</string> <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string>
<string name="pref_layouts_add">Add an alternate layout</string> <string name="pref_key_opacity">Adjust key opacity</string>
<string name="pref_layouts_item">Layout %1$d: %2$s</string> <string name="pref_key_activated_opacity">Adjust pressed key opacity</string>
<string name="pref_layouts_remove_custom">Remove layout</string> <string name="pref_layout_e_system">System settings</string>
<string name="pref_custom_layout_title">Custom layout</string> <string name="pref_layout_e_custom">Custom layout</string>
<string name="pref_show_number_row_no_number_row">No number row</string> <string name="pref_layouts_add">Add an alternate layout</string>
<string name="pref_show_number_row_no_symbols">Number row without symbols</string> <string name="pref_layouts_item">Layout %1$d: %2$s</string>
<string name="pref_show_number_row_symbols">Number row with symbols</string> <string name="pref_layouts_remove_custom">Remove layout</string>
<string name="pref_show_numpad_title">Show NumPad</string> <string name="pref_custom_layout_title">Custom layout</string>
<string name="pref_show_numpad_never">Never</string> <string name="pref_show_numpad_title">Show NumPad</string>
<string name="pref_show_numpad_landscape">Only in landscape mode</string> <string name="pref_show_numpad_never">Never</string>
<string name="pref_show_numpad_always">Always</string> <string name="pref_show_numpad_landscape">Only in landscape mode</string>
<string name="pref_number_row_title">Show number row</string> <string name="pref_show_numpad_always">Always</string>
<string name="pref_number_row_summary">Add a number row at the top of the keyboard when the numpad is hidden</string> <string name="pref_number_row_title">Show number row</string>
<string name="pref_numpad_layout">NumPad layout</string> <string name="pref_number_row_summary">Add a number row at the top of the keyboard when the numpad is hidden</string>
<string name="pref_numpad_layout_e_high_first">High digits first</string> <string name="pref_numpad_layout">NumPad layout</string>
<string name="pref_numpad_layout_e_low_first">Low digits first</string> <string name="pref_numpad_layout_e_high_first">High digits first</string>
<string name="pref_extra_keys_title">Add keys to the keyboard</string> <string name="pref_numpad_layout_e_low_first">Low digits first</string>
<string name="pref_extra_keys_custom">Add custom keys</string> <string name="pref_extra_keys_title">Add keys to the keyboard</string>
<string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> <string name="pref_extra_keys_custom">Add custom keys</string>
<string name="pref_category_typing">Typing</string> <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string>
<string name="pref_swipe_dist_title">Swiping distance</string> <string name="pref_category_typing">Typing</string>
<string name="pref_swipe_dist_summary">Distance of characters in the corners of the keys (%s)</string> <string name="pref_swipe_dist_title">Swiping distance</string>
<string name="pref_long_timeout_title">Long press timeout</string> <string name="pref_swipe_dist_summary">Distance of characters in the corners of the keys (%s)</string>
<string name="pref_long_interval_title">Key repeat interval</string> <string name="pref_long_timeout_title">Long press timeout</string>
<string name="pref_keyrepeat_enabled">Key repeat on long press</string> <string name="pref_long_interval_title">Key repeat interval</string>
<string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> <string name="pref_keyrepeat_enabled">Key repeat on long press</string>
<string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string> <string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string>
<string name="pref_category_behavior">Behavior</string> <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string>
<string name="pref_autocapitalisation_title">Automatic capitalisation</string> <string name="pref_category_behavior">Behavior</string>
<string name="pref_autocapitalisation_summary">Press Shift at the beginning of a sentence</string> <string name="pref_autocapitalisation_title">Automatic capitalisation</string>
<string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> <string name="pref_autocapitalisation_summary">Press Shift at the beginning of a sentence</string>
<string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string>
<string name="pref_vibrate_custom">Custom vibration</string> <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string>
<string name="pref_vibrate_duration_title">Vibration intensity</string> <string name="pref_vibrate_custom">Custom vibration</string>
<string name="pref_number_entry_title">Layout when typing numbers, dates, and phone numbers</string> <string name="pref_vibrate_duration_title">Vibration intensity</string>
<string name="pref_number_entry_layout_pin">PIN Entry</string> <string name="pref_pin_entry_enabled_title">Pin entry layout</string>
<string name="pref_number_entry_layout_number">Number pane</string> <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string>
<string name="pref_number_entry_layout_normal">Use the main layout</string> <string name="pref_category_style">Style</string>
<string name="pref_category_style">Style</string> <string name="pref_margin_bottom_title">Margin bottom</string>
<string name="pref_margin_bottom_title">Margin bottom</string> <string name="pref_keyboard_height_title">Keyboard height</string>
<string name="pref_keyboard_height_title">Keyboard height</string> <string name="pref_horizontal_margin_title">Horizontal margin</string>
<string name="pref_horizontal_margin_title">Horizontal margin</string> <string name="pref_character_size_title">Label size</string>
<string name="pref_character_size_title">Label size</string> <string name="pref_character_size_summary">Size of characters displayed on the keyboard (%.2fx)</string>
<string name="pref_character_size_summary">Size of characters displayed on the keyboard (%.2fx)</string> <string name="pref_theme">Theme</string>
<string name="pref_theme">Theme</string> <string name="pref_theme_e_system">System settings</string>
<string name="pref_theme_e_system">System settings</string> <string name="pref_theme_e_dark">Dark</string>
<string name="pref_theme_e_dark">Dark</string> <string name="pref_theme_e_light">Light</string>
<string name="pref_theme_e_light">Light</string> <string name="pref_theme_e_black">Black</string>
<string name="pref_theme_e_black">Black</string> <string name="pref_theme_e_altblack">Alternative Black</string>
<string name="pref_theme_e_altblack">Alternative Black</string> <string name="pref_theme_e_white">White</string>
<string name="pref_theme_e_white">White</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_desert">Desert</string>
<string name="pref_theme_e_desert">Desert</string> <string name="pref_theme_e_jungle">Jungle</string>
<string name="pref_theme_e_jungle">Jungle</string> <string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monet">Monet (System)</string> <string name="pref_theme_e_monetlight">Monet (Light)</string>
<string name="pref_theme_e_monetlight">Monet (Light)</string> <string name="pref_theme_e_monetdark">Monet (Dark)</string>
<string name="pref_theme_e_monetdark">Monet (Dark)</string> <string name="pref_theme_e_rosepine">Rosé Pine</string>
<string name="pref_theme_e_rosepine">Rosé Pine</string> <string name="pref_swipe_dist_e_very_short">Very short</string>
<string name="pref_swipe_dist_e_very_short">Very short</string> <string name="pref_swipe_dist_e_short">Short</string>
<string name="pref_swipe_dist_e_short">Short</string> <string name="pref_swipe_dist_e_default">Normal</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_far">Far</string>
<string name="pref_swipe_dist_e_far">Far</string> <string name="pref_swipe_dist_e_very_far">Very far</string>
<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_horizontal_space">Horizontal spacing between the keys</string> <string name="pref_key_vertical_space">Vertical spacing between the keys</string>
<string name="pref_key_vertical_space">Vertical spacing between the keys</string> <string name="pref_border_config_title">Customize borders</string>
<string name="pref_border_config_title">Customize borders</string> <string name="pref_border_width_title">Border Width</string>
<string name="pref_border_width_title">Border Width</string> <string name="pref_corners_radius_title">Corner radius</string>
<string name="pref_corners_radius_title">Corner radius</string> <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string>
<string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> <string name="pref_circle_sensitivity_e_high">High</string>
<string name="pref_circle_sensitivity_e_high">High</string> <string name="pref_circle_sensitivity_e_medium">Medium</string>
<string name="pref_circle_sensitivity_e_medium">Medium</string> <string name="pref_circle_sensitivity_e_low">Low</string>
<string name="pref_circle_sensitivity_e_low">Low</string> <string name="pref_circle_sensitivity_e_disabled">Disabled</string>
<string name="pref_circle_sensitivity_e_disabled">Disabled</string> <string name="key_action_next">Next</string>
<string name="pref_slider_sensitivity_title">Space bar slider sensitivity</string> <string name="key_action_done">Done</string>
<string name="pref_slider_sensitivity_slow">Slow</string> <string name="key_action_go">Go</string>
<string name="pref_slider_sensitivity_medium">Medium</string> <string name="key_action_prev">Prev</string>
<string name="pref_slider_sensitivity_fast">Fast</string> <string name="key_action_search">Search</string>
<string name="key_action_next">Next</string> <string name="key_action_send">Send</string>
<string name="key_action_done">Done</string> <string name="launcher_button_imesettings">Enable keyboard</string>
<string name="key_action_go">Go</string> <string name="launcher_button_imepicker">Select keyboard</string>
<string name="key_action_prev">Prev</string> <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string>
<string name="key_action_search">Search</string> <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string>
<string name="key_action_send">Send</string> <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string>
<string name="launcher_button_imesettings">Enable keyboard</string> <string name="launcher_tryhere_hint">Try here</string>
<string name="launcher_button_imepicker">Select keyboard</string> <string name="key_descr_capslock">Caps lock</string>
<string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> <string name="key_descr_compose">Compose</string>
<string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> <string name="key_descr_switch_greekmath">Greek &amp; math symbols</string>
<string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> <string name="key_descr_change_method">Switch keyboard</string>
<string name="launcher_tryhere_hint">Try here</string> <string name="key_descr_voice_typing">Voice typing</string>
<string name="key_descr_capslock">Caps lock</string> <string name="key_descr_copy">Copy</string>
<string name="key_descr_compose">Compose</string> <string name="key_descr_paste">Paste</string>
<string name="key_descr_switch_greekmath">Greek &amp; math symbols</string> <string name="key_descr_cut">Cut</string>
<string name="key_descr_change_method">Switch keyboard</string> <string name="key_descr_selectAll">Select all</string>
<string name="key_descr_voice_typing">Voice typing</string> <string name="key_descr_shareText">Share text</string>
<string name="key_descr_copy">Copy</string> <string name="key_descr_pasteAsPlainText">Paste as plain text</string>
<string name="key_descr_paste">Paste</string> <string name="key_descr_undo">Undo</string>
<string name="key_descr_cut">Cut</string> <string name="key_descr_redo">Redo</string>
<string name="key_descr_selectAll">Select all</string> <string name="key_descr_ª">Ordinal Indicator</string>
<string name="key_descr_pasteAsPlainText">Paste as plain text</string> <string name="key_descr_º">Ordinal Indicator</string>
<string name="key_descr_undo">Undo</string> <string name="key_descr_superscript">Superscript</string>
<string name="key_descr_redo">Redo</string> <string name="key_descr_subscript">Subscript</string>
<string name="key_descr_ª">Ordinal Indicator</string> <string name="key_descr_page_up">Page Up</string>
<string name="key_descr_º">Ordinal Indicator</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_superscript">Superscript</string> <string name="key_descr_home">Home</string>
<string name="key_descr_subscript">Subscript</string> <string name="key_descr_end">End</string>
<string name="key_descr_page_up">Page Up</string> <string name="key_descr_clipboard">Clipboard manager</string>
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_combining">Combining diacritic</string>
<string name="key_descr_home">Home</string> <string name="clipboard_history_heading">Recently copied text</string>
<string name="key_descr_end">End</string> <string name="clipboard_pin_heading">Pinned</string>
<string name="key_descr_clipboard">Clipboard manager</string> <string name="clipboard_remove_confirm">Remove this clipboard?</string>
<string name="key_descr_combining">Combining diacritic</string> <string name="clipboard_remove_confirmed">Yes</string>
<string name="key_descr_dead_key">Dead key</string>
<string name="key_descr_zwj">Zero width joiner</string>
<string name="key_descr_zwnj">Zero width non-joiner</string>
<string name="key_descr_nbsp">Non-breaking space</string>
<string name="key_descr_nnbsp">Narrow non-breaking space</string>
<string name="key_descr_delete_word">Delete a word</string>
<string name="key_descr_forward_delete_word">Delete a word on the right</string>
<string name="key_descr_gesture">Gesture</string>
<string name="clipboard_history_heading">Recently copied text</string>
<string name="clipboard_pin_heading">Pinned</string>
<string name="clipboard_remove_confirm">Remove this clipboard item?</string>
<string name="clipboard_remove_confirmed">Yes</string>
<string name="toast_no_voice_input">No voice typing app installed</string>
</resources> </resources>

View File

@@ -181,27 +181,27 @@
</style> </style>
<style name="MonetLight" parent="@style/BaseTheme"> <style name="MonetLight" parent="@style/BaseTheme">
<item name="android:isLightTheme">true</item> <item name="android:isLightTheme">true</item>
<item name="colorKeyboard">@android:color/system_neutral1_100</item> <item name="colorKeyboard">@android:color/system_accent1_100</item>
<item name="colorKey">@android:color/system_neutral1_50</item> <item name="colorKey">@android:color/system_accent1_0</item>
<item name="colorKeyActivated">?colorKeyboard</item> <item name="colorKeyActivated">@android:color/system_accent1_300</item>
<item name="colorLabel">@android:color/system_neutral1_800</item> <item name="colorLabel">@android:color/system_accent1_1000</item>
<item name="colorLabelActivated">@android:color/system_accent1_400</item> <item name="colorLabelActivated">@android:color/system_accent1_1000</item>
<item name="colorLabelLocked">@android:color/system_accent1_600</item> <item name="colorLabelLocked">@android:color/system_accent1_500</item>
<item name="colorSubLabel">@android:color/system_neutral1_500</item> <item name="colorSubLabel">@android:color/system_accent1_900</item>
<item name="emoji_button_bg">?colorKeyActivated</item> <item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">?colorKeyboard</item> <item name="emoji_color">@android:color/system_accent1_1000</item>
</style> </style>
<style name="MonetDark" parent="@style/BaseTheme"> <style name="MonetDark" parent="@style/BaseTheme">
<item name="android:isLightTheme">false</item> <item name="android:isLightTheme">false</item>
<item name="colorKeyboard">@android:color/system_neutral1_900</item> <item name="colorKeyboard">@android:color/system_neutral1_900</item>
<item name="colorKey">@android:color/system_neutral1_800</item> <item name="colorKey">@android:color/system_accent2_800</item>
<item name="colorKeyActivated">?colorKeyboard</item> <item name="colorKeyActivated">@android:color/system_accent1_800</item>
<item name="colorLabel">@android:color/system_neutral1_0</item> <item name="colorLabel">@android:color/system_neutral1_0</item>
<item name="colorLabelActivated">@android:color/system_accent1_400</item> <item name="colorLabelActivated">@android:color/system_accent1_400</item>
<item name="colorLabelLocked">@android:color/system_accent1_600</item> <item name="colorLabelLocked">@android:color/system_accent1_100</item>
<item name="colorSubLabel">@android:color/system_neutral1_400</item> <item name="colorSubLabel">@android:color/system_neutral1_300</item>
<item name="emoji_button_bg">?colorKeyActivated</item> <item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">?colorKeyboard</item> <item name="emoji_color">@android:color/system_neutral1_900</item>
</style> </style>
<style name="RosePine" parent="BaseTheme"> <style name="RosePine" parent="BaseTheme">
<item name="android:isLightTheme">false</item> <item name="android:isLightTheme">false</item>

View File

@@ -6,6 +6,9 @@
<dimen name="emoji_text_size">28dp</dimen> <dimen name="emoji_text_size">28dp</dimen>
<dimen name="clipboard_view_height">300dp</dimen> <dimen name="clipboard_view_height">300dp</dimen>
<dimen name="pref_button_size">28dp</dimen> <dimen name="pref_button_size">28dp</dimen>
<!-- Margin needed to accomodate the gesture nav bar on Android 15. Found in
[core/res/res/values/dimens.xml]. -->
<dimen name="bottom_inset_min">48dp</dimen>
<!-- Will be overwritten automatically by Gradle for the debug build variant --> <!-- Will be overwritten automatically by Gradle for the debug build variant -->
<bool name="debug_logs">false</bool> <bool name="debug_logs">false</bool>
</resources> </resources>

View File

@@ -2,7 +2,7 @@
<row height="0.95"> <row height="0.95">
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key3="loc switch_clipboard" key4="switch_numeric"/> <key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key3="loc switch_clipboard" key4="switch_numeric"/>
<key width="1.1" key0="fn" key1="loc alt" key2="loc 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"/> <key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
<key width="1.1" key0="loc compose" 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.1" key0="loc compose" 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"/> <key width="1.7" key0="enter" key1="loc voice_typing" key2="action"/>
</row> </row>

View File

@@ -3,7 +3,7 @@
<keyboard bottom_row="false"> <keyboard bottom_row="false">
<row height="0.95"> <row height="0.95">
<key key0="switch_back_clipboard"/> <key key0="switch_back_clipboard"/>
<key width="3" key0="space" key5="cursor_left" key6="cursor_right"/> <key width="3" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
<key key0="backspace" key2="delete"/> <key key0="backspace" key2="delete"/>
<key key0="enter" key2="action"/> <key key0="enter" key2="action"/>
</row> </row>

View File

@@ -3,7 +3,7 @@
<keyboard bottom_row="false"> <keyboard bottom_row="false">
<row height="0.95"> <row height="0.95">
<key key0="switch_back_emoji"/> <key key0="switch_back_emoji"/>
<key width="3" key0="space" key5="cursor_left" key6="cursor_right"/> <key width="3" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
<key key0="backspace" key2="delete"/> <key key0="backspace" key2="delete"/>
<key key0="enter" key2="action"/> <key key0="enter" key2="action"/>
</row> </row>

View File

@@ -6,7 +6,7 @@
<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="τ" key1="⌉" key2="∡" key4="⊷"/> <key key0="τ" key1="⌉" key2="∡" key4="⊷"/>
<key key0="ψ" key1="∥" key2="⊢" key3="≪" key4="7"/> <key key0="ψ" key1="∥" key3="≪" key4="7"/>
<key key0="υ" key1="⌀" key2="⟨" key3="≡" key4="8"/> <key key0="υ" key1="⌀" key2="⟨" key3="≡" key4="8"/>
<key key0="ι" key1="∞" key2="⟩" key3="≫" key4="9"/> <key key0="ι" key1="∞" key2="⟩" key3="≫" key4="9"/>
<key key0="ο" key1="∝" key3="□"/> <key key0="ο" key1="∝" key3="□"/>
@@ -17,7 +17,7 @@
<key key0="σ" key3="←" key4="∂"/> <key key0="σ" key3="←" key4="∂"/>
<key key0="δ" key3="↓" key4="∫"/> <key key0="δ" key3="↓" key4="∫"/>
<key key0="φ" key3="→" key4="∃"/> <key key0="φ" key3="→" key4="∃"/>
<key key0="γ" key3="∋" key4="∈"/> <key key0="γ" key4="∈"/>
<key key0="η" key1="⊕" key4="4"/> <key key0="η" key1="⊕" key4="4"/>
<key key0="ξ" key1="⊖" key3="" key4="5"/> <key key0="ξ" key1="⊖" key3="" key4="5"/>
<key key0="κ" key1="⊙" key3="" key4="6"/> <key key0="κ" key1="⊙" key3="" key4="6"/>

View File

@@ -6,7 +6,6 @@
<subtype android:label="%s" android:languageTag="ar" android:imeSubtypeLocale="ar" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=arabic,default_layout=arab_pc_hindu"/> <subtype android:label="%s" android:languageTag="ar" android:imeSubtypeLocale="ar" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=arabic,default_layout=arab_pc_hindu"/>
<subtype android:label="%s" android:languageTag="ar" android:imeSubtypeLocale="ar_TN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=arabic,default_layout=arab_pc"/> <subtype android:label="%s" android:languageTag="ar" android:imeSubtypeLocale="ar_TN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=arabic,default_layout=arab_pc"/>
<subtype android:label="%s" android:languageTag="ay" android:imeSubtypeLocale="ay_AM" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=armenian,default_layout=armenian_ph_am"/> <subtype android:label="%s" android:languageTag="ay" android:imeSubtypeLocale="ay_AM" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=armenian,default_layout=armenian_ph_am"/>
<subtype android:label="%s" android:languageTag="az" android:imeSubtypeLocale="az_AZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_az,extra_keys=accent_trema:ü:ö@w|accent_cedille:ç:ş@s|ğ@g|ı@k|ə@l"/>
<subtype android:label="%s" android:languageTag="be" android:imeSubtypeLocale="be_BY" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_jcuken_ru,extra_keys=ґ|є|і|ї|ў"/> <subtype android:label="%s" android:languageTag="be" android:imeSubtypeLocale="be_BY" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_jcuken_ru,extra_keys=ґ|є|і|ї|ў"/>
<subtype android:label="%s" android:languageTag="bg" android:imeSubtypeLocale="bg_BG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_ueishsht,extra_keys=€"/> <subtype android:label="%s" android:languageTag="bg" android:imeSubtypeLocale="bg_BG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_ueishsht,extra_keys=€"/>
<subtype android:label="%s" android:languageTag="bn" android:imeSubtypeLocale="bn_BD" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=৳"/> <subtype android:label="%s" android:languageTag="bn" android:imeSubtypeLocale="bn_BD" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=৳"/>
@@ -16,38 +15,32 @@
<subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_de,extra_keys=accent_trema:ä:ö:ü@u|ß|€"/> <subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_de,extra_keys=accent_trema:ä:ö:ü@u|ß|€"/>
<subtype android:label="%s" android:languageTag="de-BE" android:imeSubtypeLocale="de_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_be,extra_keys=accent_grave:è@f|accent_aigu:á:é:í:ó:ú:ý:j́@d|accent_circonflexe:ê@f|accent_cedille:ç@c|accent_trema@u|€"/> <subtype android:label="%s" android:languageTag="de-BE" android:imeSubtypeLocale="de_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_be,extra_keys=accent_grave:è@f|accent_aigu:á:é:í:ó:ú:ý:j́@d|accent_circonflexe:ê@f|accent_cedille:ç@c|accent_trema@u|€"/>
<subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£@l|€"/> <subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£@l|€"/>
<subtype android:label="%s" android:languageTag="en" android:imeSubtypeLocale="en_NG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=₦"/>
<subtype android:label="%s" android:languageTag="en-AU" android:imeSubtypeLocale="en_AU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/> <subtype android:label="%s" android:languageTag="en-AU" android:imeSubtypeLocale="en_AU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="en-CA" android:imeSubtypeLocale="en_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/> <subtype android:label="%s" android:languageTag="en-CA" android:imeSubtypeLocale="en_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£@l"/> <subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£@l"/>
<subtype android:label="%s" android:languageTag="en-IN" android:imeSubtypeLocale="en_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/> <subtype android:label="%s" android:languageTag="en-IN" android:imeSubtypeLocale="en_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/> <subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_es,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_tilde:ñ@n|accent_grave@f|accent_trema@u|€"/> <subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_es,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_tilde:ñ@n|accent_grave@f|accent_trema@u|€"/>
<subtype android:label="%s" android:languageTag="et" android:imeSubtypeLocale="et_EE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_et,extra_keys=accent_trema:ä:ö:ü@u|accent_tilde:õ@o|accent_caron:š:ž@s|€"/>
<subtype android:label="%s" android:languageTag="fa" android:imeSubtypeLocale="fa_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_pc_ir"/> <subtype android:label="%s" android:languageTag="fa" android:imeSubtypeLocale="fa_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_pc_ir"/>
<subtype android:label="%s" android:languageTag="fr-BE" android:imeSubtypeLocale="fr_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_be,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:ê@f|accent_cedille:ç@c|accent_trema@u|€"/> <subtype android:label="%s" android:languageTag="fr-BE" android:imeSubtypeLocale="fr_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_be,extra_keys=accent_grave:è@f|accent_aigu:á:é:í:ó:ú:ý:j́@d|accent_circonflexe:ê@f|accent_cedille:ç@c|accent_trema@u|€"/>
<subtype android:label="%s" android:languageTag="fr-CA" android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:â:ê:ô@f|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@u"/> <subtype android:label="%s" android:languageTag="fr-CA" android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:â:ê:ô@f|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@u"/>
<subtype android:label="%s" android:languageTag="fr-CH" android:imeSubtypeLocale="fr_CH" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_fr_ch,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:â:ê:ô@o|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@u|€"/> <subtype android:label="%s" android:languageTag="fr-CH" android:imeSubtypeLocale="fr_CH" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_fr_ch,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:â:ê:ô@o|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@u|€"/>
<subtype android:label="%s" android:languageTag="fr-FR" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è@d|accent_aigu:é@d|accent_circonflexe:â:ê:ô@o|accent_cedille:ç@c|accent_trema:ë:ï:ü@l|€"/> <subtype android:label="%s" android:languageTag="fr-FR" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è@d|accent_aigu:é@d|accent_circonflexe:â:ê:ô@o|accent_cedille:ç@c|accent_trema:ë:ï:ü@l|€"/>
<subtype android:label="%s" android:languageTag="ga" android:imeSubtypeLocale="ga_IE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_ga,extra_keys=accent_aigu:á:é:í:ó:ú@k|accent_dot_above@l"/> <subtype android:label="%s" android:languageTag="ga" android:imeSubtypeLocale="ga_IE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_ga,extra_keys=accent_aigu:á:é:í:ó:ú@k|accent_dot_above@l"/>
<subtype android:label="%s" android:languageTag="ha" android:imeSubtypeLocale="ha_NG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=₦|ɓ|ɗ|ƙ||ƴ|r̃"/>
<subtype android:label="%s" android:languageTag="haw" android:imeSubtypeLocale="haw_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_haw,extra_keys=ʻ@l|accent_macron:ā:ē:ī:ō:ū@m"/> <subtype android:label="%s" android:languageTag="haw" android:imeSubtypeLocale="haw_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_haw,extra_keys=ʻ@l|accent_macron:ā:ē:ī:ō:ū@m"/>
<subtype android:label="%s" android:languageTag="he" android:imeSubtypeLocale="he_IL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hebrew,default_layout=hebr_1_il,extra_keys=₪@r|€"/> <subtype android:label="%s" android:languageTag="he" android:imeSubtypeLocale="he_IL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hebrew,default_layout=hebr_1_il,extra_keys=₪@r|€"/>
<subtype android:label="%s" android:languageTag="hi" android:imeSubtypeLocale="hi_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/> <subtype android:label="%s" android:languageTag="hi" android:imeSubtypeLocale="hi_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_trema:ö:ü@u|accent_ogonek@s|accent_double_aigu:ő:ű@k|€"/> <subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_trema:ö:ü@u|accent_ogonek@s|accent_double_aigu:ő:ű@k|€"/>
<subtype android:label="%s" android:languageTag="ig" android:imeSubtypeLocale="ig_NG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=₦|ṅ|ọ|ụ"/> <subtype android:label="%s" android:languageTag="is" android:imeSubtypeLocale="is_IS" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=ð|þ|æ|accent_trema:ö@o|accent_aigu:á:é:í:ó:ú:ý@d"/>
<subtype android:label="%s" android:languageTag="is" android:imeSubtypeLocale="is_IS" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_is,extra_keys=ð|þ|æ|accent_trema:ö@o|accent_aigu:á:é:í:ó:ú:ý@d|accent_circonflexe|accent_ring|accent_grave"/>
<subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_grave:à:è:ì:ò:ù@f|accent_aigu:é:ó@d|accent_circonflexe:î@f|€|ə"/> <subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_grave:à:è:ì:ò:ù@f|accent_aigu:é:ó@d|accent_circonflexe:î@f|€|ə"/>
<subtype android:label="%s" android:languageTag="ja" android:imeSubtypeLocale="ja_JP" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_jp"/>
<subtype android:label="%s" android:languageTag="ka-GE" android:imeSubtypeLocale="ka_GE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=georgian_mes"/> <subtype android:label="%s" android:languageTag="ka-GE" android:imeSubtypeLocale="ka_GE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=georgian_mes"/>
<subtype android:label="%s" android:languageTag="kk" android:imeSubtypeLocale="kk_KZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_kk"/> <subtype android:label="%s" android:languageTag="kk" android:imeSubtypeLocale="kk_KZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_kk"/>
<subtype android:label="%s" android:languageTag="kn" android:imeSubtypeLocale="kn_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=kannada,default_layout=kann_kannada"/> <subtype android:label="%s" android:languageTag="kn" android:imeSubtypeLocale="kn_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=kannada,default_layout=kann_kannada"/>
<subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hangul,default_layout=latn_qwerty_us"/> <subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hangul,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lt,extra_keys=accent_ogonek:ą:ę:į:ų@s|accent_caron:č:š:ž@f|accent_dot_above:ė@s|accent_macron:ū@o|€"/> <subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_ogonek:ą:ę:į:ų@s|accent_caron:č:š:ž@f|accent_dot_above:ė@s|accent_macron:ū@o|€"/>
<subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lv,extra_keys=accent_macron:ā:ē:ī:ū@o|accent_caron:č:š:ž@f|accent_ogonek:ķ:ļ:ņ@s|accent_cedille:ģ@c|€"/> <subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lv,extra_keys=accent_macron:ā:ē:ī:ū@o|accent_caron:č:š:ž@f|accent_ogonek:ķ:ļ:ņ@s|accent_cedille:ģ@c|€"/>
<subtype android:label="%s" android:languageTag="mk" android:imeSubtypeLocale="mk" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_lynyertdz_mk,extra_keys=ѕ|ѓ|ќ|ѝ|ѐ|љ|њ|џ|„|“|€"/>
<subtype android:label="%s" android:languageTag="mn" android:imeSubtypeLocale="mn_MN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_fcuzhen_mn,extra_keys=ү|ө"/>
<subtype android:label="%s" android:languageTag="mr" android:imeSubtypeLocale="mr_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/> <subtype android:label="%s" android:languageTag="mr" android:imeSubtypeLocale="mr_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
<subtype android:label="%s" android:languageTag="mt" android:imeSubtypeLocale="mt_MT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_mt,extra_keys=accent_grave:à:è:ì:ò:ù|accent_dot_above:ċ:ż:ġ|ħ"/>
<subtype android:label="%s" android:languageTag="ne" android:imeSubtypeLocale="ne_NE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/> <subtype android:label="%s" android:languageTag="ne" android:imeSubtypeLocale="ne_NE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
<subtype android:label="%s" android:languageTag="nl-BE" android:imeSubtypeLocale="nl_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_be,extra_keys=accent_grave:è@f|accent_aigu:á:é:í:ó:ú:ý:j́@d|accent_circonflexe:ê@f|accent_cedille:ç@c|accent_trema@u|€"/> <subtype android:label="%s" android:languageTag="nl-BE" android:imeSubtypeLocale="nl_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_be,extra_keys=accent_grave:è@f|accent_aigu:á:é:í:ó:ú:ý:j́@d|accent_circonflexe:ê@f|accent_cedille:ç@c|accent_trema@u|€"/>
<subtype android:label="%s" android:languageTag="no" android:imeSubtypeLocale="no_NO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=€|æ@a|å@a|ø@o|accent_aigu:é:ó@d|accent_grave:è:ò:ù@f|accent_circonflexe:ê:ô@f"/> <subtype android:label="%s" android:languageTag="no" android:imeSubtypeLocale="no_NO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=€|æ@a|å@a|ø@o|accent_aigu:é:ó@d|accent_grave:è:ò:ù@f|accent_circonflexe:ê:ô@f"/>
@@ -55,7 +48,6 @@
<subtype android:label="%s" android:languageTag="pt" android:imeSubtypeLocale="pt_BR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_pt,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_cedille:ç@c|accent_circonflexe:â:ê:ô@f|accent_grave:à:ò@f|accent_tilde:ã:õ@n|€|ª|º"/> <subtype android:label="%s" android:languageTag="pt" android:imeSubtypeLocale="pt_BR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_pt,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_cedille:ç@c|accent_circonflexe:â:ê:ô@f|accent_grave:à:ò@f|accent_tilde:ã:õ@n|€|ª|º"/>
<subtype android:label="%s" android:languageTag="ro" android:imeSubtypeLocale="ro_RO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_ro,extra_keys=ă|â|î|ș|ț|€|$"/> <subtype android:label="%s" android:languageTag="ro" android:imeSubtypeLocale="ro_RO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_ro,extra_keys=ă|â|î|ș|ț|€|$"/>
<subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_ru"/> <subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_ru"/>
<subtype android:label="%s" android:languageTag="si" android:imeSubtypeLocale="si_LK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=sinhala,default_layout=sinhala_phonetic,extra_keys=₨"/>
<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:ě:ř:ž:š:č:ň:ď:ľ:ť@f|accent_ring:ů@s|accent_circonflexe:ô@f|accent_trema:ä:ü:ö@u|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý@d"/> <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:ě:ř:ž:š:č:ň:ď:ľ:ť@f|accent_ring:ů@s|accent_circonflexe:ô@f|accent_trema:ä:ü:ö@u|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý@d"/>
<subtype android:label="%s" android:languageTag="sq" android:imeSubtypeLocale="sq_AL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sq"/> <subtype android:label="%s" android:languageTag="sq" android:imeSubtypeLocale="sq_AL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sq"/>
<subtype android:label="%s" android:languageTag="sr" android:imeSubtypeLocale="sr_" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_lynyertz_sr"/> <subtype android:label="%s" android:languageTag="sr" android:imeSubtypeLocale="sr_" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_lynyertz_sr"/>
@@ -65,7 +57,5 @@
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_hamvaj_tly"/> <subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_hamvaj_tly"/>
<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:ç:ş@c|accent_trema:ö:ü@u|accent_circonflexe:â:î:û@f|₺|ı|ğ"/> <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:ç:ş@c|accent_trema:ö:ü@u|accent_circonflexe:â:î:û@f|₺|ı|ğ"/>
<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="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="uz" android:imeSubtypeLocale="uz_UZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_uz,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"/> <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"/>
<subtype android:label="%s" android:languageTag="yo" android:imeSubtypeLocale="yo_NG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=₦|ẹ|ọ|ṣ"/>
</input-method> </input-method>

View File

@@ -1,14 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- See [number_row_no_symbols.xml] for the number row with no symbols. -->
<row height="0.75"> <row height="0.75">
<key key0="1" se="!"/> <key key0="1"/>
<key key0="2" se="@"/> <key key0="2"/>
<key key0="3" se="#"/> <key key0="3"/>
<key key0="4" se="$"/> <key key0="4"/>
<key key0="5" se="%"/> <key key0="5"/>
<key key0="6" sw="^"/> <key key0="6"/>
<key key0="7" sw="&amp;"/> <key key0="7"/>
<key key0="8" sw="*"/> <key key0="8"/>
<key key0="9" sw="("/> <key key0="9"/>
<key key0="0" sw=")"/> <key key0="0"/>
</row> </row>

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<row height="0.75">
<key key0="1"/>
<key key0="2"/>
<key key0="3"/>
<key key0="4"/>
<key key0="5"/>
<key key0="6"/>
<key key0="7"/>
<key key0="8"/>
<key key0="9"/>
<key key0="0"/>
</row>

View File

@@ -10,7 +10,7 @@
<key shift="1.0" key0="4" indication="GHI"/> <key shift="1.0" key0="4" indication="GHI"/>
<key key0="5" indication="JKL"/> <key key0="5" indication="JKL"/>
<key key0="6" indication="MNO"/> <key key0="6" indication="MNO"/>
<key key0="(" key1="paste" key2="=" key3=":" key4="-"/> <key key0="(" key2="=" key3=":" key4="-"/>
</row> </row>
<row> <row>
<key shift="1.0" key0="7" indication="PQRS"/> <key shift="1.0" key0="7" indication="PQRS"/>

View File

@@ -8,14 +8,13 @@
</PreferenceCategory> </PreferenceCategory>
<juloo.keyboard2.prefs.ExtraKeysPreference android:title="@string/pref_extra_keys_internal"/> <juloo.keyboard2.prefs.ExtraKeysPreference android:title="@string/pref_extra_keys_internal"/>
</PreferenceScreen> </PreferenceScreen>
<ListPreference android:key="number_row" android:title="@string/pref_number_row_title" android:summary="%s" android:defaultValue="no_number_row" android:entries="@array/pref_show_number_row_entries" android:entryValues="@array/pref_show_number_row_values"/> <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"/> <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"/>
<ListPreference android:key="numpad_layout" android:title="@string/pref_numpad_layout" android:summary="%s" android:defaultValue="high_first" android:entries="@array/pref_numpad_layout_entries" android:entryValues="@array/pref_numpad_layout_values"/> <ListPreference android:key="numpad_layout" android:title="@string/pref_numpad_layout" android:summary="%s" android:defaultValue="high_first" android:entries="@array/pref_numpad_layout_entries" android:entryValues="@array/pref_numpad_layout_values"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/pref_category_typing"> <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"/> <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"/>
<ListPreference android:key="circle_sensitivity" android:title="@string/pref_circle_sensitivity_title" android:summary="%s" android:defaultValue="2" android:entries="@array/pref_circle_sensitivity_entries" android:entryValues="@array/pref_circle_sensitivity_values"/> <ListPreference android:key="circle_sensitivity" android:title="@string/pref_circle_sensitivity_title" android:summary="%s" android:defaultValue="2" android:entries="@array/pref_circle_sensitivity_entries" android:entryValues="@array/pref_circle_sensitivity_values"/>
<ListPreference android:key="slider_sensitivity" android:title="@string/pref_slider_sensitivity_title" android:summary="%s" android:defaultValue="30" android:entries="@array/pref_slider_sensitivity_entries" android:entryValues="@array/pref_slider_sensitivity_values"/>
<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_timeout" android:title="@string/pref_long_timeout_title" android:summary="%sms" android:defaultValue="600" min="50" max="2000"/>
<CheckBoxPreference android:key="keyrepeat_enabled" android:title="@string/pref_keyrepeat_enabled" android:defaultValue="true"/> <CheckBoxPreference android:key="keyrepeat_enabled" android:title="@string/pref_keyrepeat_enabled" android:defaultValue="true"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="longpress_interval" android:dependency="keyrepeat_enabled" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/> <juloo.keyboard2.prefs.IntSlideBarPreference android:key="longpress_interval" android:dependency="keyrepeat_enabled" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/>
@@ -26,7 +25,7 @@
<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"/> <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"/>
<CheckBoxPreference android:key="vibrate_custom" android:title="@string/pref_vibrate_custom" android:defaultValue="false"/> <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"/> <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"/>
<ListPreference android:key="number_entry_layout" android:title="@string/pref_number_entry_title" android:summary="%s" android:defaultValue="pin" android:entries="@array/pref_number_entry_entries" android:entryValues="@array/pref_number_entry_values"/> <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>
<PreferenceCategory android:title="@string/pref_category_style"> <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"/> <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"/>
@@ -37,20 +36,14 @@
<PreferenceScreen android:title="@string/pref_margin_bottom_title"> <PreferenceScreen android:title="@string/pref_margin_bottom_title">
<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_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"/> <juloo.keyboard2.prefs.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_unfolded" android:title="@string/pref_portrait_unfolded" android:summary="%sdp" android:defaultValue="7" min="0" max="100"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="margin_bottom_landscape_unfolded" android:title="@string/pref_landscape_unfolded" android:summary="%sdp" android:defaultValue="3" min="0" max="100"/>
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen android:title="@string/pref_keyboard_height_title"> <PreferenceScreen android:title="@string/pref_keyboard_height_title">
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height" android:title="@string/pref_portrait" android:summary="%s%%" android:defaultValue="35" min="10" max="100"/> <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"/> <juloo.keyboard2.prefs.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_unfolded" android:title="@string/pref_portrait_unfolded" android:summary="%s%%" android:defaultValue="35" min="10" max="50"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height_landscape_unfolded" android:title="@string/pref_landscape_unfolded" android:summary="%s%%" android:defaultValue="50" min="20" max="65"/>
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen android:title="@string/pref_horizontal_margin_title"> <PreferenceScreen android:title="@string/pref_horizontal_margin_title">
<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_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"/> <juloo.keyboard2.prefs.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_unfolded" android:title="@string/pref_portrait_unfolded" android:summary="%sdp" android:defaultValue="3" min="0" max="30"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_landscape_unfolded" android:title="@string/pref_landscape_unfolded" android:summary="%sdp" android:defaultValue="28" min="0" max="200"/>
</PreferenceScreen> </PreferenceScreen>
<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.15" min="0.75" max="1.5"/> <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.15" 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_vertical_margin" android:title="@string/pref_key_vertical_space" android:summary="%s%%" android:defaultValue="1.5" min="0" max="5"/>

View File

@@ -5,42 +5,14 @@
let let
jdk = pkgs.openjdk17; jdk = pkgs.openjdk17;
build_tools_version = "34.0.0"; build_tools_version = "33.0.1";
android = pkgs.androidenv.composeAndroidPackages { android = pkgs.androidenv.composeAndroidPackages {
buildToolsVersions = [ build_tools_version ]; buildToolsVersions = [ build_tools_version ];
platformVersions = [ "35" ]; platformVersions = [ "34" ];
abiVersions = [ "armeabi-v7a" ]; abiVersions = [ "armeabi-v7a" ];
inherit repoJson;
}; };
# Ensure we have the needed system images
repoJson = pkgs.fetchurl {
url =
"https://raw.githubusercontent.com/NixOS/nixpkgs/ebc7402410a3ce2d25622137c190d4ab83945c10/pkgs/development/mobile/androidenv/repo.json";
hash = "sha256-4/0FMyxM+7d66qfhlY3A10RIe6j6VrW8DIilH2eQyzc=";
};
emulators = let
mk_emulator = { platformVersion, device ? "pixel_6", abiVersion ? "x86_64", systemImageType ? "default" }:
pkgs.androidenv.emulateApp rec {
name = "emulator_api${platformVersion}";
inherit platformVersion abiVersion systemImageType;
androidAvdFlags = "--device ${device}";
sdkExtraArgs = { inherit repoJson; };
};
# Allow to install several emulators in the same environment
link_emulator = version_name: args: {
name = "bin/emulate_android_${version_name}";
path = "${mk_emulator args}/bin/run-test-emulator";
};
in pkgs.linkFarm "emulator" [
(link_emulator "5" { platformVersion = "21"; })
# (link_emulator "14" { platformVersion = "34"; })
# There's no 'default' image for Android 15
(link_emulator "15" { platformVersion = "35"; systemImageType = "google_apis"; })
];
ANDROID_SDK_ROOT = "${android.androidsdk}/libexec/android-sdk"; ANDROID_SDK_ROOT = "${android.androidsdk}/libexec/android-sdk";
gradle = pkgs.gradle.override { java = jdk; }; gradle = pkgs.gradle.override { java = jdk; };
@@ -55,14 +27,8 @@ let
''; '';
in pkgs.mkShell { in pkgs.mkShell {
buildInputs = [ buildInputs =
pkgs.findutils [ pkgs.findutils pkgs.fontforge jdk android.androidsdk gradle_wrapped ];
pkgs.fontforge
jdk
android.androidsdk
gradle_wrapped
emulators
];
JAVA_HOME = jdk.home; JAVA_HOME = jdk.home;
inherit ANDROID_SDK_ROOT; inherit ANDROID_SDK_ROOT;
} }

View File

@@ -1,4 +1,4 @@
import textwrap, sys, re, string, json, os, string import textwrap, sys, re, string, json, os
from array import array from array import array
# Compile compose sequences from Xorg's format or from JSON files into an # Compile compose sequences from Xorg's format or from JSON files into an
@@ -21,20 +21,6 @@ def parse_keysymdef_h(fname):
yield (m.group(1), chr(int(m.group(2), 16))) yield (m.group(1), chr(int(m.group(2), 16)))
dropped_sequences = 0 dropped_sequences = 0
warning_count = 0
# [s] is a list of strings
def seq_to_str(s, result=None):
msg = "+".join(s)
return msg if result is None else msg + " = " + result
# Print a warning. If [seq] is passed, it is prepended to the message.
def warn(msg, seq=None, result=None):
global warning_count
if seq is not None:
msg = f"Sequence {seq_to_str(seq, result=result)} {msg}"
print(f"Warning: {msg}", file=sys.stderr)
warning_count += 1
# Parse XKB's Compose.pre files # Parse XKB's Compose.pre files
def parse_sequences_file_xkb(fname, xkb_char_extra_names): def parse_sequences_file_xkb(fname, xkb_char_extra_names):
@@ -124,7 +110,7 @@ def parse_sequences_file_json(fname):
tree = json.loads(strip_cstyle_comments(inp)) tree = json.loads(strip_cstyle_comments(inp))
return list(tree_to_seqs(tree, [])) return list(tree_to_seqs(tree, []))
except Exception as e: except Exception as e:
warn("Failed parsing '%s': %s" % (fname, str(e))) print("Failed parsing '%s': %s" % (fname, str(e)), file=sys.stderr)
# Format of the sequences file is determined by its extension # Format of the sequences file is determined by its extension
def parse_sequences_file(fname, xkb_char_extra_names={}): def parse_sequences_file(fname, xkb_char_extra_names={}):
@@ -177,9 +163,9 @@ def add_sequences_to_trie(seqs, trie):
for seq, result in seqs: for seq, result in seqs:
if not add_seq_to_trie(seq, result): if not add_seq_to_trie(seq, result):
dropped_sequences += 1 dropped_sequences += 1
warn("Sequence collide: '%s' and '%s = %s'" % ( print("Sequence collide: '%s' and '%s = %s'" % (
existing_sequence_to_str(seq), existing_sequence_to_str(seq),
"".join(seq), result)) "".join(seq), result), file=sys.stderr)
# Compile the trie into a state machine. # Compile the trie into a state machine.
def make_automata(tries): def make_automata(tries):
@@ -236,32 +222,6 @@ def print_automata(automata):
print("%3d %8s %d" % (i, s, e), file=sys.stderr) print("%3d %8s %d" % (i, s, e), file=sys.stderr)
i += 1 i += 1
# Report warnings about the compose sequences
def check_for_warnings(tries):
def get(seq):
t = tries
for c in seq:
if c not in t:
return None
t = t[c]
return t if type(t) == str else None
# Check that compose+Upper+Upper have an equivalent compose+Upper+Lower or compose+Lower+Lower
for c1 in string.ascii_uppercase:
for c2 in string.ascii_uppercase:
seq = [c1, c2]
seq_l = [c1, c2.lower()]
seq_ll = [c1.lower(), c2.lower()]
r = get(seq)
r_l = get(seq_l)
r_ll = get(seq_ll)
if r is not None:
ll_warning = f" (but {seq_to_str(seq_ll)} = {r_ll} exists)" if r_ll is not None else ""
if r_l is None:
if r != r_ll:
warn(f"has no lower case equivalent {seq_to_str(seq_l)}{ll_warning}", seq=seq, result=r)
elif r != r_l:
warn(f"is not the same as {seq_to_str(seq_l)} = {r_l}{ll_warning}", seq=seq, result=r)
def batched(ar, n): def batched(ar, n):
i = 0 i = 0
while i + n < len(ar): while i + n < len(ar):
@@ -330,10 +290,7 @@ for fname in sorted(sys.argv[1:]):
sequences = parse_sequences_file(fname) sequences = parse_sequences_file(fname)
add_sequences_to_trie(sequences, tries.setdefault(tname, {})) add_sequences_to_trie(sequences, tries.setdefault(tname, {}))
total_sequences += len(sequences) total_sequences += len(sequences)
check_for_warnings(tries["compose"])
entry_states, automata = make_automata(tries) entry_states, automata = make_automata(tries)
gen_java(entry_states, automata) gen_java(entry_states, automata)
print("Compiled %d sequences into %d states. Dropped %d sequences." % (total_sequences, len(automata), dropped_sequences), file=sys.stderr)
print("Compiled %d sequences into %d states. Dropped %d sequences. Generated %d warnings." % (total_sequences, len(automata), dropped_sequences, warning_count), file=sys.stderr)
# print_automata(automata) # print_automata(automata)

View File

@@ -1,59 +1,26 @@
{ {
",": { ",": {
"г": "ӻ", "г": "ӻ",
"Г": "Ӻ",
"к": "ӄ", "к": "ӄ",
"К": "Ӄ",
"л": "ԓ", "л": "ԓ",
"Л": "Ԓ",
"н": "ӈ", "н": "ӈ",
"Н": "Ӈ",
"х": "ӽ", "х": "ӽ",
"Х": "Ӽ", "ѧ": "ӊ"
"ѧ": "ӊ",
"Ѧ": "Ӊ"
}, },
".": { ".": {
"г": "ӷ", "г": "ӷ",
"Г": "Ӷ",
"ж": "җ", "ж": "җ",
"Ж": "Җ",
"й": "ҋ", "й": "ҋ",
"Й": "Ҋ",
"к": "қ", "к": "қ",
"К": "Қ",
"л": "ԯ", "л": "ԯ",
"Л": "Ԯ",
"м": "ӎ", "м": "ӎ",
"М": "Ӎ",
"н": "ӊ", "н": "ӊ",
"Н": "Ӊ",
"х": "ҳ", "х": "ҳ",
"Х": "Ҳ",
"ч": "ҷ", "ч": "ҷ",
"Ч": "Ҷ", "і": "ї"
"і": "ї",
"І": "Ї"
},
"А": {
"Е": "Ӕ",
"е": "Ӕ",
"Э": "Ә",
"э": "Ә",
"У": "Ѡ",
"у": "Ѡ",
"Ы": "Ѣ",
"ы": "Ѣ",
"Ь": "Ꙙ",
"ь": "Ꙙ",
"Ꙋ": "Ꙍ",
"ꙋ": "Ꙍ",
"Ꙑ": "Ѣ",
"ꙑ": "Ѣ"
}, },
"а": { "а": {
"е": "ӕ", "е": "ѣ",
"э": "ә",
"у": "ѡ", "у": "ѡ",
"ч": "combining_aigu", "ч": "combining_aigu",
"ы": "ѣ", "ы": "ѣ",
@@ -64,18 +31,6 @@
"б": { "б": {
"ч": "combining_slavonic_psili" "ч": "combining_slavonic_psili"
}, },
"Г": {
",": "Ӻ",
".": "Ӷ",
"Й": "Ғ",
"й": "Ғ",
"К": "Ґ",
"к": "Ґ",
"Х": "Ҁ",
"х": "Ҁ",
"Ј": "Ғ",
"ј": "Ғ"
},
"г": { "г": {
",": "ӻ", ",": "ӻ",
".": "ӷ", ".": "ӷ",
@@ -84,20 +39,6 @@
"х": "ҁ", "х": "ҁ",
"ј": "ғ" "ј": "ғ"
}, },
"Д": {
"Е": "Ꙉ",
"е": "Ꙉ",
"Ж": "Џ",
"ж": "Џ",
"З": "Ꙃ",
"з": "Ꙃ",
"Й": "Ꙉ",
"й": "Ꙉ",
"Ј": "Ꙉ",
"ј": "Ꙉ",
"Ѥ": "Ђ",
"ѥ": "Ђ"
},
"д": { "д": {
"е": "ꙉ", "е": "ꙉ",
"ж": "џ", "ж": "џ",
@@ -109,48 +50,20 @@
"е": { "е": {
"ч": "combining_trema" "ч": "combining_trema"
}, },
"Ж": {
".": "Җ"
},
"ж": { "ж": {
".": "җ" ".": "җ"
}, },
"З": {
"Ф": "Ҙ",
"ф": "Ҙ"
},
"з": { "з": {
"ф": "ҙ" "ф": "ҙ"
}, },
"И": {
"И": "Ӣ",
"и": "Ӣ",
"У": "Ѵ",
"у": "Ѵ"
},
"и": { "и": {
"и": "ӣ", "и": "ӣ",
"у": "ѵ" "у": "ѵ"
}, },
"Й": {
".": "Ҋ"
},
"й": { "й": {
".": "ҋ", ".": "ҋ",
"ч": "combining_breve" "ч": "combining_breve"
}, },
"К": {
",": "Ӄ",
".": "Қ",
"Г": "Ґ",
"г": "Ґ",
"С": "Ѯ",
"с": "Ѯ",
"Х": "Ҁ",
"х": "Ҁ",
"Ш": "Ѯ",
"ш": "Ѯ"
},
"к": { "к": {
",": "ӄ", ",": "ӄ",
".": "қ", ".": "қ",
@@ -159,80 +72,32 @@
"х": "ҁ", "х": "ҁ",
"ш": "ѯ" "ш": "ѯ"
}, },
"Л": {
",": "Ԓ",
".": "Ԯ",
"Ь": "Љ",
"ь": "Љ"
},
"л": { "л": {
",": "ԓ", ",": "ԓ",
".": "ԯ", ".": "ԯ",
"ь": "љ" "ь": "љ"
}, },
"М": {
".": "Ӎ"
},
"м": { "м": {
".": "ӎ" ".": "ӎ"
}, },
"Н": {
",": "Ӈ",
"·": "Ԩ",
"Ь": "Њ",
"ь": "Њ"
},
"н": { "н": {
",": "ӈ", ",": "ӈ",
"·": "ԩ", "·": "ԩ",
"ч": "combining_titlo", "ч": "combining_titlo",
"ь": "њ" "ь": "њ"
}, },
"О": {
"Т": "Ѿ",
"т": "Ѿ",
"У": "Ѹ",
"у": "Ѹ"
},
"о": { "о": {
"т": "ѿ", "т": "ѿ",
"у": "ѹ", "у": "ѹ",
"ч": "combining_inverted_breve" "ч": "combining_inverted_breve"
}, },
"П": {
"С": "Ѱ",
"с": "Ѱ"
},
"п": { "п": {
"с": "ѱ" "с": "ѱ"
}, },
"Т": {
"Й": "Ћ",
"й": "Ћ",
"Ф": "Ѳ",
"ф": "Ѳ",
"Ј": "Ћ",
"ј": "Ћ",
"С": "Ц",
"с": "Ц"
},
"т": { "т": {
"й": "ћ", "й": "ћ",
"ф": "ѳ", "ф": "ѳ",
"ј": "ћ", "ј": "ћ"
"с": "ц"
},
"У": {
"И": "Ѵ",
"и": "Ѵ",
"Й": "Ў",
"й": "Ў",
"У": "Ӯ",
"у": "Ӯ",
"І": "Ѵ",
"і": "Ѵ",
"Ј": "Ў",
"ј": "Ў"
}, },
"у": { "у": {
"и": "ѵ", "и": "ѵ",
@@ -242,18 +107,11 @@
"і": "ѵ", "і": "ѵ",
"ј": "ў" "ј": "ў"
}, },
"Х": {
",": "Ӽ",
".": "Ҳ"
},
"х": { "х": {
",": "ӽ", ",": "ӽ",
".": "ҳ", ".": "ҳ",
"ч": "combining_slavonic_dasia" "ч": "combining_slavonic_dasia"
}, },
"Ч": {
".": "Ҷ"
},
"ч": { "ч": {
".": "ҷ", ".": "ҷ",
"а": "combining_aigu", "а": "combining_aigu",
@@ -271,52 +129,21 @@
"ј": "combining_breve", "ј": "combining_breve",
"ѧ": "combining_vzmet" "ѧ": "combining_vzmet"
}, },
"Ш": {
"Т": "Щ",
"т": "Щ"
},
"ш": { "ш": {
"т": "щ" "т": "щ"
}, },
"ъ": { "ъ": {
"ч": "combining_vertical_tilde" "ч": "combining_vertical_tilde"
}, },
"Ю": {
"А": "Ꙗ",
"а": "Ꙗ",
"Е": "Ѥ",
"е": "Ѥ",
"Э": "Ꙓ",
"э": "Ꙓ",
"І": "Ї",
"і": "Ї",
"О": "Ё",
"о": "Ё",
"М": "Ѭ",
"м": "Ѭ",
"Н": "Ѩ",
"н": "Ѩ",
"Ь": "Ꙝ",
"ь": "Ꙝ"
},
"ю": { "ю": {
"а": "", "а": "",
"е": "ѥ", "е": "ё",
"э": "ꙓ",
"і": "ї",
"о": "ё",
"м": "ѭ", "м": "ѭ",
"н": "ѩ", "н": "ѩ",
"ч": "combining_grave", "ч": "combining_grave"
"ь": "ꙝ"
}, },
"І": { "я": {
"\"": "Ї", "ь": ""
".": "Ї",
"У": "Ѵ",
"у": "Ѵ",
"І": "Ӣ",
"і": "Ӣ"
}, },
"і": { "і": {
"\"": "ї", "\"": "ї",
@@ -324,21 +151,11 @@
"у": "ѵ", "у": "ѵ",
"і": "ӣ" "і": "ӣ"
}, },
"Ј": {
"А": "Ꙗ",
"а": "Ꙗ",
"Ѣ": "Ꙝ",
"ѣ": "Ꙝ"
},
"ј": { "ј": {
"а": "ꙗ", "а": "ꙗ",
"ч": "combining_breve", "ч": "combining_breve",
"ѣ": "ꙝ" "ѣ": "ꙝ"
}, },
"Ѡ": {
"Т": "Ѿ",
"т": "Ѿ"
},
"ѡ": { "ѡ": {
"т": "ѿ" "т": "ѿ"
}, },

View File

@@ -7,60 +7,5 @@
"\\": { "\\": {
"n": "\\n", "n": "\\n",
"t": "\\t" "t": "\\t"
},
"n": {
"g": {
"~": "n͠g"
}
},
"N": {
"g": {
"~": "N͠g"
},
"g": "Ŋ",
"n": ""
},
"g": {
"~": "g̃",
"u": "Ğ"
},
"A": {
"a": "Å",
"e": "Æ",
"t": "@"
},
"a": {
"E": "Æ"
},
"O": {
"e": "Œ"
},
"S": {
"s": "ẞ"
},
"I": {
"j": "IJ"
},
"D": {
"h": "Ð"
},
"E": {
"e": "Ə"
},
"Q": {
"q": ""
},
"R": {
"r": ""
},
"t": {
"z": "ꜩ"
},
"T": {
"h": "Þ",
"z": "Ꜩ"
},
"Z": {
"z": ""
} }
} }

View File

@@ -78,6 +78,7 @@
"": "", "": "",
"∩": "⋂", "∩": "⋂",
"∃": "∄", "∃": "∄",
"∈": "∉",
"∫": "∮", "∫": "∮",
"Π": "∏", "Π": "∏",
"Σ": "∑", "Σ": "∑",
@@ -88,16 +89,6 @@
"⊃": "⊇", "⊃": "⊇",
"±": "∓", "±": "∓",
// APL
"": "⍶",
"⍵": "⍹",
"⋄": "⌺",
"⍝": "⍧",
"∆": "⍙",
"∇": "⍢",
"": "⍡",
"⎕": "⍞",
// hebrew niqqud // hebrew niqqud
"ק": "qamats", // kamatz "ק": "qamats", // kamatz
"ר": "hataf_qamats", // reduced kamatz "ר": "hataf_qamats", // reduced kamatz
@@ -196,15 +187,12 @@
// Cyrillic // Cyrillic
"ꙑ": "ы", "ꙑ": "ы",
"ы": "ꙑ", "ы": "ꙑ",
"г": "ґ",
"д": "ҙ",
"ш": "ѱ", "ш": "ѱ",
"з": "ꙁ", "з": "ꙁ",
"и": "і", "и": "і",
"і": "и", "і": "и",
"я": "ꙗ", "я": "ꙗ",
"": "я", "е": "ѥ",
"е": "ѣ",
"ѡ": "ꙍ", "ѡ": "ꙍ",
"о": "ѻ", "о": "ѻ",
"а": "ѣ", "а": "ѣ",
@@ -212,26 +200,22 @@
"ъ": "ь", "ъ": "ь",
"ь": "ъ", "ь": "ъ",
"й": "ј", "й": "ј",
"ј": "й",
"ꙉ": "ђ", "ꙉ": "ђ",
"ђ": "ꙉ",
"ч": "ћ", "ч": "ћ",
"ћ": "ч",
"ҁ": "қ", "ҁ": "қ",
"қ": "ҁ", "қ": "ҁ",
"џ": "ҷ", "џ": "ҷ",
"ҷ": "џ", "ҷ": "џ",
"ф": "ѳ", "ј": "й",
"у": "ꙋ", "у": "ꙋ",
"м": "ѫ", "м": "ѫ",
"н": "ѧ", "н": "ѧ",
"с": "ѕ", "с": "ѕ",
"л": "ԯ", "л": "ԯ",
"ԓ": "ԯ", "ԓ": "ԯ",
"\ua67d": "combining_cyrillic_titlo", // combining_cyrillic_payerok "\ua67d": "\u0483",
"\u0487": "combining_cyrillic_vzmet", // combining_cyrillic_pokrytie "\u0487": "\ua66f",
"ӈ": "ԩ", "ӈ": "ԩ",
"х": "һ",
// Arabic // Arabic
":": "zwnj", ":": "zwnj",
@@ -239,12 +223,8 @@
"\u064F": "ۆ", // combining_dammah "\u064F": "ۆ", // combining_dammah
"\u0650": "ێ", // combining_kasra "\u0650": "ێ", // combining_kasra
"ر": "ڕ", "ر": "ڕ",
"د": "ذ",
"ژ": "ظ",
"ب": "ٮ", "ب": "ٮ",
"ت": "ط",
"ه": "ھ", "ه": "ھ",
"ھ": "ه",
"ث": "پ", "ث": "پ",
"ز": "ژ", "ز": "ژ",
"غ": "گ", "غ": "گ",
@@ -266,17 +246,7 @@
"ة": "combining_fatha", "ة": "combining_fatha",
"إ": "combining_hamza_below", "إ": "combining_hamza_below",
"ۆ": "combining_arabic_v", "ۆ": "combining_arabic_v",
"و": "ڡ", "س": "ـ",
"م": "ـ",
"س": "ص",
"ش": "ض",
"ف": "ڤ", "ف": "ڤ",
"ن": "ں", "ن": "ں"
// Tamil
"ய": ":௰",
"ஒ": ":ௐ",
"ள": ":௱",
"ச": ":௲",
"வ": ":௳"
} }

View File

@@ -18,13 +18,6 @@
"┐": "╗", "┐": "╗",
"─": "═", "─": "═",
"│": "║", "│": "║",
"∈": "∉",
"∋": "∌",
"⊂": "⊄",
"⊃": "⊅",
"⊆": "⊈",
"⊇": "⊉",
// superscript // superscript
"ᵃ": "ᴬ", "ᵃ": "ᴬ",
"ᵇ": "ᴮ", "ᵇ": "ᴮ",
@@ -49,22 +42,18 @@
"ʷ": "ᵂ", "ʷ": "ᵂ",
"ᶾ": "ᴣ", "ᶾ": "ᴣ",
"ᵠ": "ᶲ", "ᵠ": "ᶲ",
// german eszett has an uppercase, but because it is uncommon, java doesn't know about it // german eszett has an uppercase, but because it is uncommon, java doesn't know about it
"ß": "ẞ", "ß": "ẞ",
// these characters don't have a preapplied uppercase version, so we use combining characters // these characters don't have a preapplied uppercase version, so we use combining characters
"ẗ": "T\u0308", "ẗ": "T\u0308",
"ẘ": "W\u030A", "ẘ": "W\u030A",
"ẙ": "Y\u030A", "ẙ": "Y\u030A",
"ǰ": "J\u030C", "ǰ": "J\u030C",
"ȷ": "J\u0307", "ȷ": "J\u0307",
// In Turkish, upper case of 'iı' is 'İI' but Java's toUpperCase will // In Turkish, upper case of 'iı' is 'İI' but Java's toUpperCase will
// return 'II'. To make 'İ' accessible, make it the shift of 'ı'. This // return 'II'. To make 'İ' accessible, make it the shift of 'ı'. This
// has the inconvenient of swapping i and ı on the keyboard. // has the inconvenient of swapping i and ı on the keyboard.
"ı": "İ", "ı": "İ",
"₹": "₨", "₹": "₨",
// Gujarati alternate characters // Gujarati alternate characters
"અ": "આ", "અ": "આ",
@@ -91,9 +80,13 @@
"લ": "ળ", "લ": "ળ",
"સ": "શ", "સ": "શ",
"હ": "", "હ": "",
// Tamil alternate characters // Tamil alternate characters
"௹": "₨", "௹": "₨",
"ய": ":௰",
"ஒ": ":ௐ",
"ள": ":௱",
"ச": ":௲",
"வ": ":௳",
// Modern Hindi and Sanskrit // Modern Hindi and Sanskrit
"अ": "आ", "अ": "आ",
@@ -125,14 +118,5 @@
"ॢ": "ॣ", "ॢ": "ॣ",
"॒": "॑", "॒": "॑",
"ॅ": "ॲ", "ॅ": "ॲ",
"ॉ": "ऑ", "ॉ": "ऑ"
// Mathematical symbols
"\uD835": {
"\uDD68": "𝕎", // 𝕨𝕎
"\uDD69": "𝕏", // 𝕩𝕏
"\uDD57": "𝔽", // 𝕗𝔽
"\uDD58": "𝔾", // 𝕘𝔾
"\uDD64": "𝕊" // 𝕤𝕊
}
} }

View File

@@ -1,6 +1,7 @@
package juloo.keyboard2; package juloo.keyboard2;
import android.os.Handler; import android.os.Handler;
import android.os.Looper;
import android.text.InputType; import android.text.InputType;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
@@ -26,9 +27,9 @@ public final class Autocapitalisation
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES |
InputType.TYPE_TEXT_FLAG_CAP_WORDS; InputType.TYPE_TEXT_FLAG_CAP_WORDS;
public Autocapitalisation(Handler h, Callback cb) public Autocapitalisation(Looper looper, Callback cb)
{ {
_handler = h; _handler = new Handler(looper);
_callback = cb; _callback = cb;
} }
@@ -87,24 +88,6 @@ public final class Autocapitalisation
callback_now(true); callback_now(true);
} }
/** Pause auto capitalisation until [unpause()] is called. */
public boolean pause()
{
boolean was_enabled = _enabled;
stop();
_enabled = false;
return was_enabled;
}
/** Continue auto capitalisation after [pause()] was called. Argument is the
output of [pause()]. */
public void unpause(boolean was_enabled)
{
_enabled = was_enabled;
_should_update_caps_mode = true;
callback_now(true);
}
public static interface Callback public static interface Callback
{ {
public void update_shift_state(boolean should_enable, boolean should_disable); public void update_shift_state(boolean should_enable, boolean should_disable);
@@ -149,7 +132,7 @@ public final class Autocapitalisation
_should_disable_shift = might_disable; _should_disable_shift = might_disable;
// The callback must be delayed because [getCursorCapsMode] would sometimes // The callback must be delayed because [getCursorCapsMode] would sometimes
// be called before the editor finished handling the previous event. // be called before the editor finished handling the previous event.
_handler.postDelayed(delayed_callback, 50); _handler.postDelayed(delayed_callback, 1);
} }
/** Like [callback] but runs immediately. */ /** Like [callback] but runs immediately. */

View File

@@ -49,7 +49,7 @@ public final class ClipboardHistoryService
/** The maximum size limits the amount of user data stored in memory but also /** The maximum size limits the amount of user data stored in memory but also
gives a sense to the user that the history is not persisted and can be gives a sense to the user that the history is not persisted and can be
forgotten as soon as the app stops. */ forgotten as soon as the app stops. */
public static final int MAX_HISTORY_SIZE = 6; public static final int MAX_HISTORY_SIZE = 3;
/** Time in ms until history entries expire. */ /** Time in ms until history entries expire. */
public static final long HISTORY_TTL_MS = 5 * 60 * 1000; public static final long HISTORY_TTL_MS = 5 * 60 * 1000;

View File

@@ -4,22 +4,29 @@ import java.util.Arrays;
public final class ComposeKey public final class ComposeKey
{ {
/** Apply the pending compose sequence to [kv]. Returns [null] if no sequence /** Apply the pending compose sequence to [kv]. */
matched. */
public static KeyValue apply(int state, KeyValue kv) public static KeyValue apply(int state, KeyValue kv)
{ {
switch (kv.getKind()) switch (kv.getKind())
{ {
case Char: case Char:
return apply(state, kv.getChar()); KeyValue res = apply(state, kv.getChar());
case String: // Grey-out characters not part of any sequence.
return apply(state, kv.getString()); if (res == null)
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
return res;
/* These keys are not greyed. */
case Event:
case Modifier:
case Compose_pending:
return kv;
/* Other keys cannot be part of sequences. */
default:
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
} }
return null;
} }
/** Apply the pending compose sequence to char [c]. Returns [null] if no /** Apply the pending compose sequence to char [c]. */
sequence matched. */
public static KeyValue apply(int prev, char c) public static KeyValue apply(int prev, char c)
{ {
char[] states = ComposeKeyData.states; char[] states = ComposeKeyData.states;
@@ -42,25 +49,6 @@ public final class ComposeKey
return KeyValue.makeCharKey((char)next_header); return KeyValue.makeCharKey((char)next_header);
} }
/** Apply each char of a string to a sequence. Returns [null] if no sequence
matched. */
public static KeyValue apply(int prev, String s)
{
final int len = s.length();
int i = 0;
if (len == 0) return null;
while (true)
{
KeyValue k = apply(prev, s.charAt(i));
i++;
if (k == null) return null;
if (i >= len) return k;
if (k.getKind() != KeyValue.Kind.Compose_pending)
return null; // Found a final state before the end of [s].
prev = k.getPendingCompose();
}
}
/** The state machine is comprised of two arrays. /** The state machine is comprised of two arrays.
The [states] array represents the different states and the associated The [states] array represents the different states and the associated

View File

@@ -24,108 +24,103 @@ public final class ComposeKeyData
"y\u00e2\u00ea\u00f3\u00f6\u00fa\u0103\u014d\u01a1\u01b0\u00e3\u1ebd\u0129\u00f1\u00f5\u0169\u1e7d\u1ef9\u1e4f\u1eb5\u0000*acehijklmnostuwxy~\u00b0\u00ed\u00f5\u00f9\u00fa\u0101\u014d\u016b\u01d4\u03b9\u03c5\u03cd\u03d2\u0430\u0436\u0437\u0438\u043e\u0443\u0447\u044b\u044d\u04d9\u04e9\u1f7a\u1fe6\u2207\u2363\u00e4\uFFFF\u0063\u0308" + "y\u00e2\u00ea\u00f3\u00f6\u00fa\u0103\u014d\u01a1\u01b0\u00e3\u1ebd\u0129\u00f1\u00f5\u0169\u1e7d\u1ef9\u1e4f\u1eb5\u0000*acehijklmnostuwxy~\u00b0\u00ed\u00f5\u00f9\u00fa\u0101\u014d\u016b\u01d4\u03b9\u03c5\u03cd\u03d2\u0430\u0436\u0437\u0438\u043e\u0443\u0447\u044b\u044d\u04d9\u04e9\u1f7a\u1fe6\u2207\u2363\u00e4\uFFFF\u0063\u0308" +
"\u00eb\u1e27\u00ef\uFFFF\u006a\u0308\uFFFF\u006b\u0308\uFFFF\u006c\u0308\uFFFF\u006d\u0308\uFFFF\u006e\u0308\u00f6\uFFFF\u0073\u0308\u1e97\u00fc\u1e85\u1e8d\u00ff\u2368\u2364\u03ca\u03cb\u03b0\u03d4\u04d3\u04dd\u04df\u04e5\u04e7\u04f1\u04f5\u04f9\u04ed\u04db\u1fe2\u1fe7\u2362\u0000 !\"#%'()*+,-./01234578:;<" + "\u00eb\u1e27\u00ef\uFFFF\u006a\u0308\uFFFF\u006b\u0308\uFFFF\u006c\u0308\uFFFF\u006d\u0308\uFFFF\u006e\u0308\u00f6\uFFFF\u0073\u0308\u1e97\u00fc\u1e85\u1e8d\u00ff\u2368\u2364\u03ca\u03cb\u03b0\u03d4\u04d3\u04dd\u04df\u04e5\u04e7\u04f1\u04f5\u04f9\u04ed\u04db\u1fe2\u1fe7\u2362\u0000 !\"#%'()*+,-./01234578:;<" +
"=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnoprstuvwxyz{|~\u00a8\u00af\u00b4\u00b8\u00f7\u02d8\u0391\u0395\u0397" + "=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnoprstuvwxyz{|~\u00a8\u00af\u00b4\u00b8\u00f7\u02d8\u0391\u0395\u0397" +
"\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0406\u0408\u0410\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0421\u0422\u0423\u0425\u0427\u0428\u042e\u0430\u0431\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0442\u0443\u0445\u0447\u0448\u044a\u044e\u0456\u0458\u0460\u0461\u0467\u05b4\u05b7\u05b8\u05b9\u05bc\u05bf\u05c1\u05c2\u0627\u062a\u062c" + "\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0415\u0417\u041d\u0421\u0430\u0431\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0442\u0443\u0445\u0447\u0448\u044a\u044e\u044f\u0456\u0458\u0461\u0467\u05b4\u05b7\u05b8\u05b9\u05bc\u05bf\u05c1\u05c2\u0627\u062a\u062c\u062d\u062f\u0633\u0634\u0639\u063a\u0641\u0642\u0644\u0646\u0647\u0648\u064a\u0653\u0654\u0655\u0667\u0668\u06cc" +
"\u062d\u062f\u0633\u0634\u0639\u063a\u0641\u0642\u0644\u0646\u0647\u0648\u064a\u0653\u0654\u0655\u0667\u0668\u06cc\u06f7\u06f8\u093c\u09bc\u09c7\u0a3c\u0b3c\u0b47\u0bc6\u0bc7\u0bd7\u0c46\u0cbf\u0cc6\u0cca\u0d46\u0d47\u0dd9\u0ddc\u0f71\u0f90\u0f92\u0f9c\u0fa1\u0fa6\u0fab\u0fb2\u0fb3\u0fb5\u0fb7\u102e\u1100\u1102\u1103\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110e\u1111\u1112\u1121\u1132\u113c\u113e\u114e\u1150\u1161\u1163" + "\u06f7\u06f8\u093c\u09bc\u09c7\u0a3c\u0b3c\u0b47\u0bc6\u0bc7\u0bd7\u0c46\u0cbf\u0cc6\u0cca\u0d46\u0d47\u0dd9\u0ddc\u0f71\u0f90\u0f92\u0f9c\u0fa1\u0fa6\u0fab\u0fb2\u0fb3\u0fb5\u0fb7\u102e\u1100\u1102\u1103\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110e\u1111\u1112\u1121\u1132\u113c\u113e\u114e\u1150\u1161\u1163\u1165\u1167\u1169\u116a\u116d\u116e\u116f\u1172\u1173\u1174\u1175\u119e\u11a8\u11aa\u11ab\u11ae\u11af\u11b0\u11b1" +
"\u1165\u1167\u1169\u116a\u116d\u116e\u116f\u1172\u1173\u1174\u1175\u119e\u11a8\u11aa\u11ab\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b7\u11b8\u11ba\u11bc\u11c1\u11c2\u11ce\u11dd\u11ec\u11f0\u2190\u2191\u2192\u2193\u2203\u2206\u2207\u2208\u220a\u220b\u2218\u2223\u2225\u2227\u2228\u2229\u222a\u223c\u2243\u2248\u224d\u2260\u2261\u2264\u2265\u2272\u2273\u2276\u2277\u227a\u227b\u227c\u227d\u2282\u2283\u2286\u2287\u2291\u2292\u22a3\u22a4" + "\u11b2\u11b3\u11b7\u11b8\u11ba\u11bc\u11c1\u11c2\u11ce\u11dd\u11ec\u11f0\u2190\u2191\u2192\u2193\u2203\u2206\u2207\u2208\u220a\u220b\u2218\u2223\u2225\u2227\u2228\u2229\u222a\u223c\u2243\u2248\u224d\u2260\u2261\u2264\u2265\u2272\u2273\u2276\u2277\u227a\u227b\u227c\u227d\u2282\u2283\u2286\u2287\u2291\u2292\u22a3\u22a4\u22a5\u22a8\u22a9\u22ab\u22b2\u22b3\u22b4\u22b5\u22c4\u2373\u2375\u237a\u2395\u25cb\u2add\u0000 (," +
"\u22a5\u22a8\u22a9\u22ab\u22b2\u22b3\u22b4\u22b5\u22c4\u2373\u2375\u237a\u2395\u25cb\u2add\u0000 (,-.<>_\u00a0\u02d8\u00b8~\u2008\u02c7^\u00af\u0000!+?ABDEHIKLMNORSTUVWYZ^abdehiklmnorstuv" + "-.<>_\u00a0\u02d8\u00b8~\u2008\u02c7^\u00af\u0000!+?ABDEHIKLMNORSTUVWYZ^abdehiklmnorstuvwyz\u01a0\u01a1\u01af\u01b0\u00a1\u0000OUou\u1ee2\u1ef0\u203d\u1ea0\u1e04\u1e0c" +
"wyz\u01a0\u01a1\u01af\u01b0\u00a1\u0000OUou\u1ee2\u1ef0\u203d\u1ea0\u1e04\u1e0c\u1eb8\u1e24\u1eca\u1e32\u1e36\u1e42\u1e46\u1ecc\u1e5a\u1e62\u1e6c\u1ee4\u1e7e\u1e88\u1ef4\u1e92\u00a6\u0000 \"',<>AEHIOUWXY_aehiotuwxy~\u00af\u00b4\u00d5\u00f5\u016a\u016b\u0399\u03a5" + "\u1eb8\u1e24\u1eca\u1e32\u1e36\u1e42\u1e46\u1ecc\u1e5a\u1e62\u1e6c\u1ee4\u1e7e\u1e88\u1ef4\u1e92\u00a6\u0000 \"',<>AEHIOUWXY_aehiotuwxy~\u00af\u00b4\u00d5\u00f5\u016a\u016b\u0399\u03a5\u03b9\u03c5\u03d2\u0406\u0410\u0415\u0416\u0417\u0418\u041e\u0423\u0427\u042b\u042d\u0430\u0435\u0436\u0437\u0438" +
"\u03b9\u03c5\u03d2\u0406\u0410\u0415\u0416\u0417\u0418\u041e\u0423\u0427\u042b\u042d\u0430\u0435\u0436\u0437\u0438\u043e\u0443\u0447\u044b\u044d\u0456\u04d8\u04d9\u04e8\u04e9\u00a8\u0344\u201e\u201c\u201d\u00c4\u00cb\u1e26\u00cf\u00d6\u00dc\u1e84\u1e8c\u0178\u0000Uu\u1e7a\u1e7b\u0000Oo\u1e4e\u0000Uu\u03aa\u03ab\u0407\u04d2\u0401\u04dc\u04de\u04e4\u04e6\u04f0\u04f4\u04f8\u04ec\u0451\u0457\u04da\u04ea" + "\u043e\u0443\u0447\u044b\u044d\u0456\u04d8\u04d9\u04e8\u04e9\u00a8\u0344\u201e\u201c\u201d\u00c4\u00cb\u1e26\u00cf\u00d6\u00dc\u1e84\u1e8c\u0178\u0000Uu\u1e7a\u1e7b\u0000Oo\u1e4e\u0000Uu\u03aa\u03ab\u0407\u04d2\u0401\u04dc\u04de\u04e4\u04e6\u04f0\u04f4\u04f8\u04ec\u0451\u0457\u04da\u04ea\u0000#ESbefq\u266f\u266b\u266c\u266d\u266a\u266e\u2669\u0000o\u2030\u0000" +
"\u0000#ESbefq\u266f\u266b\u266c\u266d\u266a\u266e\u2669\u0000o\u2030\u0000\"'()+,/<>ACEGIJKLMNOPRSUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5" + "\"'()+,/<>ACEGIJKLMNOPRSUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102" +
"\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u2395\u0000 I" + "\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u2395\u0000 IUiu\u03b9\u03c5\u0385\u1e2e\u01d7\u0390\u00b4\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1" +
"Uiu\u03b9\u03c5\u0385\u1e2e\u01d7\u0390\u00b4\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0d\u1f1d\u1f2d\u1f3d\u1f4d\u1f5d\u1f6d\u1f05\u1f15\u1f25\u1f35\u1f45\u1f55\u1f65\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0c\u1f1c\u1f2c\u1f3c\u1f4c\u1f6c\u1f04\u1f14\u1f24\u1f34\u1f44\u1f54\u1f64\u0000OUou\u1eda" + "\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0d\u1f1d\u1f2d\u1f3d\u1f4d\u1f5d\u1f6d\u1f05\u1f15\u1f25\u1f35\u1f45\u1f55\u1f65\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0c\u1f1c\u1f2c\u1f3c\u1f4c\u1f6c\u1f04\u1f14\u1f24\u1f34\u1f44\u1f54\u1f64\u0000OUou\u1eda\u1ee8\u201a\u0000Oo\u01fe\u2018\u2019\u00c1\u0106\u00c9\u01f4\u00cd\uFFFF\u004a\u0301\u1e30\u0139\u1e3e" +
"\u1ee8\u201a\u0000Oo\u01fe\u2018\u2019\u00c1\u0106\u00c9\u01f4\u00cd\uFFFF\u004a\u0301\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000AEOaeo\u1ea4\u1ebe\u1ed0\u0000EOeo\u1e16\u1e52\u0000Aa\u1eae\u0000OUou\u1e4c\u1e78\u0000EOeo\u0000Cc\u1e08\u01fa\u01fc\u0386\u0388\u0389\u038a\u038c" + "\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000AEOaeo\u1ea4\u1ebe\u1ed0\u0000EOeo\u1e16\u1e52\u0000Aa\u1eae\u0000OUou\u1e4c\u1e78\u0000EOeo\u0000Cc\u1e08\u01fa\u01fc\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u03ce\uFFFF\u0410\u0301\u0403\uFFFF\u0415\u0301\uFFFF\u0418\u0301\u040c\uFFFF\u041e\u0301\uFFFF\u0420" +
"\u038e\u038f\u03ce\uFFFF\u0410\u0301\u0403\uFFFF\u0415\u0301\uFFFF\u0418\u0301\u040c\uFFFF\u041e\u0301\uFFFF\u0420\u0301\uFFFF\u0423\u0301\uFFFF\u042b\u0301\uFFFF\u042d\u0301\uFFFF\u042e\u0301\uFFFF\u042f\u0301\uFFFF\u0440\u0301\u235e\u0000 ()-0123456789ABCDEFGHIJKLMNOPQR" + "\u0301\uFFFF\u0423\u0301\uFFFF\u042b\u0301\uFFFF\u042d\u0301\uFFFF\u042e\u0301\uFFFF\u042f\u0301\uFFFF\u0440\u0301\u235e\u0000 ()-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk" +
"STUVWXYZabcdefghijklmnopqrstuvwxyz\u0391\u0395\u0397\u0399\u039f\u03a1\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u30a2\u30a4\u30a6\u30a8\u30aa\u30ab\u30ad\u30af" + "lmnopqrstuvwxyz\u0391\u0395\u0397\u0399\u039f\u03a1\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u30a2\u30a4\u30a6\u30a8\u30aa\u30ab\u30ad\u30af\u30b1\u30b3\u30b5\u30b7\u30b9\u30bb\u30bd\u30bf\u30c1\u30c4\u30c6\u30c8\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d2" +
"\u30b1\u30b3\u30b5\u30b7\u30b9\u30bb\u30bd\u30bf\u30c1\u30c4\u30c6\u30c8\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d2\u30d5\u30d8\u30db\u30de\u30df\u30e0\u30e1\u30e2\u30e4\u30e6\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ef\u30f0\u30f1\u30f2\u4e00\u4e03\u4e09\u4e0a\u4e0b\u4e2d\u4e5d\u4e8c\u4e94\u4f01\u4f11\u512a\u516b\u516d\u5199\u52b4\u533b\u5341\u5354\u5370\u53f3\u540d\u56db\u571f\u591c\u5973\u5b66\u5b97\u5de6\u65e5\u6708\u6709\u6728" + "\u30d5\u30d8\u30db\u30de\u30df\u30e0\u30e1\u30e2\u30e4\u30e6\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ef\u30f0\u30f1\u30f2\u4e00\u4e03\u4e09\u4e0a\u4e0b\u4e2d\u4e5d\u4e8c\u4e94\u4f01\u4f11\u512a\u516b\u516d\u5199\u52b4\u533b\u5341\u5354\u5370\u53f3\u540d\u56db\u571f\u591c\u5973\u5b66\u5b97\u5de6\u65e5\u6708\u6709\u6728\u682a\u6b63\u6c34\u6ce8\u706b\u7279\u7537\u76e3\u793e\u795d\u79d8\u8ca1\u8cc7\u9069\u91d1\u9805[\u0000)" +
"\u682a\u6b63\u6c34\u6ce8\u706b\u7279\u7537\u76e3\u793e\u795d\u79d8\u8ca1\u8cc7\u9069\u91d1\u9805[\u0000)\uFFFF\ud83c\udd2f{\u0000)\u24ea\u0000)0123456789\u2460\u0000)\u2469\u0000)\u246a\u0000)\u246b\u0000)\u246c\u0000)\u246d\u0000)\u246e\u0000)\u246f\u0000)\u2470\u0000)\u2471\u0000)\u2472\u0000)0" + "\uFFFF\ud83c\udd2f{\u0000)\u24ea\u0000)0123456789\u2460\u0000)\u2469\u0000)\u246a\u0000)\u246b\u0000)\u246c\u0000)\u246d\u0000)\u246e\u0000)\u246f\u0000)\u2470\u0000)\u2471\u0000)\u2472\u0000)0123456789\u2461\u0000)\u2473\u0000)\u3251\u0000)\u3252" +
"123456789\u2461\u0000)\u2473\u0000)\u3251\u0000)\u3252\u0000)\u3253\u0000)\u3254\u0000)\u3255\u0000)\u3256\u0000)\u3257\u0000)\u3258\u0000)\u3259\u0000)0123456789\u2462\u0000)\u325a\u0000)\u325b\u0000)\u325c\u0000)\u325d\u0000)\u325e\u0000)\u325f\u0000" + "\u0000)\u3253\u0000)\u3254\u0000)\u3255\u0000)\u3256\u0000)\u3257\u0000)\u3258\u0000)\u3259\u0000)0123456789\u2462\u0000)\u325a\u0000)\u325b\u0000)\u325c\u0000)\u325d\u0000)\u325e\u0000)\u325f\u0000)\u32b1\u0000)\u32b2\u0000)\u32b3\u0000)\u32b4\u0000)012345" +
")\u32b1\u0000)\u32b2\u0000)\u32b3\u0000)\u32b4\u0000)0123456789\u2463\u0000)\u32b5\u0000)\u32b6\u0000)\u32b7\u0000)\u32b8\u0000)\u32b9\u0000)\u32ba\u0000)\u32bb\u0000)\u32bc\u0000)\u32bd\u0000)\u32be\u0000)0\u2464\u0000)\u32bf\u0000)\u2465\u0000)\u2466\u0000)\u2467\u0000)" + "6789\u2463\u0000)\u32b5\u0000)\u32b6\u0000)\u32b7\u0000)\u32b8\u0000)\u32b9\u0000)\u32ba\u0000)\u32bb\u0000)\u32bc\u0000)\u32bd\u0000)\u32be\u0000)0\u2464\u0000)\u32bf\u0000)\u2465\u0000)\u2466\u0000)\u2467\u0000)\u2468\u0000)\u24b6\u0000)\u24b7\u0000)\u24b8\u0000)\u24b9\u0000)\u24ba\u0000)\u24bb" +
"\u2468\u0000)\u24b6\u0000)\u24b7\u0000)\u24b8\u0000)\u24b9\u0000)\u24ba\u0000)\u24bb\u0000)\u24bc\u0000)\u24bd\u0000)\u24be\u0000)\u24bf\u0000)\u24c0\u0000)\u24c1\u0000)\u24c2\u0000)\u24c3\u0000)\u24c4\u0000)\u24c5\u0000)\u24c6\u0000)\u24c7\u0000)\u24c8\u0000)\u24c9\u0000)\u24ca\u0000)\u24cb\u0000)\u24cc\u0000)" + "\u0000)\u24bc\u0000)\u24bd\u0000)\u24be\u0000)\u24bf\u0000)\u24c0\u0000)\u24c1\u0000)\u24c2\u0000)\u24c3\u0000)\u24c4\u0000)\u24c5\u0000)\u24c6\u0000)\u24c7\u0000)\u24c8\u0000)\u24c9\u0000)\u24ca\u0000)\u24cb\u0000)\u24cc\u0000)\u24cd\u0000)\u24ce\u0000)\u24cf\u0000)\u24d0\u0000)\u24d1\u0000)\u24d2\u0000)\u24d3" +
"\u24cd\u0000)\u24ce\u0000)\u24cf\u0000)\u24d0\u0000)\u24d1\u0000)\u24d2\u0000)\u24d3\u0000)\u24d4\u0000)\u24d5\u0000)\u24d6\u0000)\u24d7\u0000)\u24d8\u0000)\u24d9\u0000)\u24da\u0000)\u24db\u0000)\u24dc\u0000)\u24dd\u0000)\u24de\u0000)\u24df\u0000)\u24e0\u0000)\u24e1\u0000)\u24e2\u0000)\u24e3\u0000)\u24e4\u0000)" + "\u0000)\u24d4\u0000)\u24d5\u0000)\u24d6\u0000)\u24d7\u0000)\u24d8\u0000)\u24d9\u0000)\u24da\u0000)\u24db\u0000)\u24dc\u0000)\u24dd\u0000)\u24de\u0000)\u24df\u0000)\u24e0\u0000)\u24e1\u0000)\u24e2\u0000)\u24e3\u0000)\u24e4\u0000)\u24e5\u0000)\u24e6\u0000)\u24e7\u0000)\u24e8\u0000)\u24e9\u1f09\u1f19\u1f29\u1f39\u1f49\u1fec" +
"\u24e5\u0000)\u24e6\u0000)\u24e7\u0000)\u24e8\u0000)\u24e9\u1f09\u1f19\u1f29\u1f39\u1f49\u1fec\u1f59\u1f69\u1f01\u1f11\u1f21\u1f31\u1f41\u1fe5\u1f51\u1f61\u0000)\u1161\u3260\u0000)\u326e\u0000)\u1161\u3261\u0000)\u326f\u0000)\u1161\u3262\u0000)\u3270\u0000)\u1161\u3263\u0000)\u3271\u0000)\u1161\u3264\u0000)\u3272\u0000)\u1161\u3265\u0000)\u3273\u0000" + "\u1f59\u1f69\u1f01\u1f11\u1f21\u1f31\u1f41\u1fe5\u1f51\u1f61\u0000)\u1161\u3260\u0000)\u326e\u0000)\u1161\u3261\u0000)\u326f\u0000)\u1161\u3262\u0000)\u3270\u0000)\u1161\u3263\u0000)\u3271\u0000)\u1161\u3264\u0000)\u3272\u0000)\u1161\u3265\u0000)\u3273\u0000)\u1161\u3266\u0000)\u3274\u0000)\u1161\u3267\u0000)\u3275\u0000)\u1161\u3268\u0000)" +
")\u1161\u3266\u0000)\u3274\u0000)\u1161\u3267\u0000)\u3275\u0000)\u1161\u3268\u0000)\u3276\u0000)\u1161\u3269\u0000)\u3277\u0000)\u1161\u326a\u0000)\u3278\u0000)\u1161\u326b\u0000)\u3279\u0000)\u1161\u326c\u0000)\u327a\u0000)\u1161\u326d\u0000)\u327b\u0000)\u32d0\u0000)\u32d1\u0000)\u32d2\u0000)\u32d3\u0000)\u32d4\u0000)" + "\u3276\u0000)\u1161\u3269\u0000)\u3277\u0000)\u1161\u326a\u0000)\u3278\u0000)\u1161\u326b\u0000)\u3279\u0000)\u1161\u326c\u0000)\u327a\u0000)\u1161\u326d\u0000)\u327b\u0000)\u32d0\u0000)\u32d1\u0000)\u32d2\u0000)\u32d3\u0000)\u32d4\u0000)\u32d5\u0000)\u32d6\u0000)\u32d7\u0000)\u32d8\u0000)\u32d9\u0000)\u32da\u0000)\u32db" +
"\u32d5\u0000)\u32d6\u0000)\u32d7\u0000)\u32d8\u0000)\u32d9\u0000)\u32da\u0000)\u32db\u0000)\u32dc\u0000)\u32dd\u0000)\u32de\u0000)\u32df\u0000)\u32e0\u0000)\u32e1\u0000)\u32e2\u0000)\u32e3\u0000)\u32e4\u0000)\u32e5\u0000)\u32e6\u0000)\u32e7\u0000)\u32e8\u0000)\u32e9\u0000)\u32ea\u0000)\u32eb\u0000)\u32ec\u0000)" + "\u0000)\u32dc\u0000)\u32dd\u0000)\u32de\u0000)\u32df\u0000)\u32e0\u0000)\u32e1\u0000)\u32e2\u0000)\u32e3\u0000)\u32e4\u0000)\u32e5\u0000)\u32e6\u0000)\u32e7\u0000)\u32e8\u0000)\u32e9\u0000)\u32ea\u0000)\u32eb\u0000)\u32ec\u0000)\u32ed\u0000)\u32ee\u0000)\u32ef\u0000)\u32f0\u0000)\u32f1\u0000)\u32f2\u0000)\u32f3" +
"\u32ed\u0000)\u32ee\u0000)\u32ef\u0000)\u32f0\u0000)\u32f1\u0000)\u32f2\u0000)\u32f3\u0000)\u32f4\u0000)\u32f5\u0000)\u32f6\u0000)\u32f7\u0000)\u32f8\u0000)\u32f9\u0000)\u32fa\u0000)\u32fb\u0000)\u32fc\u0000)\u32fd\u0000)\u32fe\u0000)\u3280\u0000)\u3286\u0000)\u3282\u0000)\u32a4\u0000)\u32a6\u0000)\u32a5\u0000)" + "\u0000)\u32f4\u0000)\u32f5\u0000)\u32f6\u0000)\u32f7\u0000)\u32f8\u0000)\u32f9\u0000)\u32fa\u0000)\u32fb\u0000)\u32fc\u0000)\u32fd\u0000)\u32fe\u0000)\u3280\u0000)\u3286\u0000)\u3282\u0000)\u32a4\u0000)\u32a6\u0000)\u32a5\u0000)\u3288\u0000)\u3281\u0000)\u3284\u0000)\u32ad\u0000)\u32a1\u0000)\u329d\u0000)\u3287" +
"\u3288\u0000)\u3281\u0000)\u3284\u0000)\u32ad\u0000)\u32a1\u0000)\u329d\u0000)\u3287\u0000)\u3285\u0000)\u32a2\u0000)\u3298\u0000)\u32a9\u0000)\u3289\u0000)\u32af\u0000)\u329e\u0000)\u32a8\u0000)\u3294\u0000)\u3283\u0000)\u328f\u0000)\u32b0\u0000)\u329b\u0000)\u32ab\u0000)\u32aa\u0000)\u32a7\u0000)\u3290\u0000)" + "\u0000)\u3285\u0000)\u32a2\u0000)\u3298\u0000)\u32a9\u0000)\u3289\u0000)\u32af\u0000)\u329e\u0000)\u32a8\u0000)\u3294\u0000)\u3283\u0000)\u328f\u0000)\u32b0\u0000)\u329b\u0000)\u32ab\u0000)\u32aa\u0000)\u32a7\u0000)\u3290\u0000)\u328a\u0000)\u3292\u0000)\u328d\u0000)\u3291\u0000)\u32a3\u0000)\u328c\u0000)\u329f" +
"\u328a\u0000)\u3292\u0000)\u328d\u0000)\u3291\u0000)\u32a3\u0000)\u328c\u0000)\u329f\u0000)\u328b\u0000)\u3295\u0000)\u329a\u0000)\u32ac\u0000)\u3293\u0000)\u3297\u0000)\u3299\u0000)\u3296\u0000)\u32ae\u0000)\u329c\u0000)\u328e\u0000)\u32a0\u0000)-\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9" + "\u0000)\u328b\u0000)\u3295\u0000)\u329a\u0000)\u32ac\u0000)\u3293\u0000)\u3297\u0000)\u3299\u0000)\u3296\u0000)\u32ae\u0000)\u329c\u0000)\u328e\u0000)\u32a0\u0000)-\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9]}\u1f08\u1f18\u1f28\u1f38\u1f48\u1f68\u1f00\u1f10\u1f20\u1f30\u1f40\u1fe4\u1f50\u1f60\u0000'0" +
"]}\u1f08\u1f18\u1f28\u1f38\u1f48\u1f68\u1f00\u1f10\u1f20\u1f30\u1f40\u1fe4\u1f50\u1f60\u0000'0AUau\u00a8\u25cb\u0000Aa\u00c5\u016e\u235f\u0000+-OUou#\u00b1\u01a0\u01af\u0000 \"',-ACDEGHIKLNORSTUacdeghikl" + "AUau\u00a8\u25cb\u0000Aa\u00c5\u016e\u235f\u0000+-OUou#\u00b1\u01a0\u01af\u0000 \"',-ACDEGHIKLNORSTUacdeghiklnorstu\u0433\u043a\u043b\u043d\u0445\u0467\u00ac\u0104\u00c7\u1e10\u0118\u0122\u1e28" +
"norstu\u0413\u041a\u041b\u041d\u0425\u0433\u043a\u043b\u043d\u0445\u0466\u0467\u00ac\u0104\u00c7\u1e10\u0118\u0122\u1e28\u012e\u0136\u013b\u0145\u01ea\u0156\u015e\u0162\u0172\u04fa\u04c3\u0512\u04c7\u04fc\u04fb\u04c4\u0513\u04c8\u04fd\u04c9\u04ca\u0000 ()+,-./:>ADEIKLOU\\^_adei" + "\u012e\u0136\u013b\u0145\u01ea\u0156\u015e\u0162\u0172\u04fb\u04c4\u0513\u04c8\u04fd\u04ca\u0000 ()+,-./:>ADEIKLOU\\^_adeilou\u2191\u2193\u25cb\u0000 -.\u00ad\u2014\u2013\u0000Ee\uFFFF\u0116\u0304\uFFFF\u0117\u0304\u233f\u00f7\u0100\u0110\u0112\u012a\u20ad\u00a3\u014c" +
"lou\u2191\u2193\u25cb\u0000 -.\u00ad\u2014\u2013\u0000Ee\uFFFF\u0116\u0304\uFFFF\u0117\u0304\u233f\u00f7\u0100\u0110\u0112\u012a\u20ad\u00a3\u014c\u016a\u2340\u2212\u234f\u2356\u2296\u0000 !'-.:<=>ABCDEFGHIMNOPRSTWXYZ^abcd" + "\u016a\u2340\u2212\u234f\u2356\u2296\u0000 !'-.:<=>ABCDEFGHIMNOPRSTWXYZ^abcdefghimnoprstwxyz\u00b4\u015a\u015b\u0160\u0161\u017f\u0433\u0436\u0439\u043a\u043b\u043c\u043d\u0445\u0447" +
"efghimnoprstwxyz\u00b4\u015a\u015b\u0160\u0161\u017f\u0406\u0413\u0416\u0419\u041a\u041b\u041c\u041d\u0425\u0427\u0433\u0436\u0439\u043a\u043b\u043c\u043d\u0445\u0447\u0456\u1e62\u1e63\u25cb\u02d9\u0000Ss\u1e68\u0000Ss\u1e64\u00b7\u2026\u2235\u2039\u2022\u203a\u0226\u1e02\u010a\u1e0a\u0116\u1e1e\u0120\u1e22\u0130\u1e40\u1e44\u022e" + "\u0456\u1e62\u1e63\u25cb\u02d9\u0000Ss\u1e68\u0000Ss\u1e64\u00b7\u2026\u2235\u2039\u2022\u203a\u0226\u1e02\u010a\u1e0a\u0116\u1e1e\u0120\u1e22\u0130\u1e40\u1e44\u022e\u1e56\u1e58\u1e60\u1e6a\u1e86\u1e8a\u1e8e\u017b\u0000Ss\u1e66\u04f7\u0497\u048b\u049b\u052f\u04ce\u04b3\u04b7\u2299\u0000-/<=BCDGHILOTZ^bcdg" +
"\u1e56\u1e58\u1e60\u1e6a\u1e86\u1e8a\u1e8e\u017b\u0000Ss\u1e66\u04f6\u0496\u048a\u049a\u052e\u04cd\u04b2\u04b6\u04f7\u0497\u048b\u049b\u052f\u04ce\u04b3\u04b7\u2299\u0000-/<=BCDGHILOTZ^bcdghilmotuvz\u0294\u0413\u041a\u0433\u043a\u04ae\u04af\u2190\u2192\u2194\u2395\\\u2260\u0243" + "hilmotuvz\u0294\u0413\u041a\u0433\u043a\u04ae\u04af\u2190\u2192\u2194\u2395\\\u2260\u0243\u20a1\u01e4\u0126\u0197\u0141\u00d8\u0166\u01b5|\u00a2\u20a5\u00b5\u221a\u02a1\u0492\u049e\u0493\u049f\u04b0\u219a\u219b\u21ae\u2341\u0000*3~\u2189\u236c\u0000123456789^\u00000\u2152\u00bd\u2153\u00bc\u2155\u2159\u2150" +
"\u20a1\u01e4\u0126\u0197\u0141\u00d8\u0166\u01b5|\u00a2\u20a5\u00b5\u221a\u02a1\u0492\u049e\u0493\u049f\u04b0\u219a\u219b\u21ae\u2341\u0000*3~\u2189\u236c\u0000123456789^\u00000\u2152\u00bd\u2153\u00bc\u2155\u2159\u2150\u215b\u2151\u000035^\u2154\u2156\u0000458^\u00be\u2157\u215c\u00005\u2158\u000068\u215a" + "\u215b\u2151\u000035^\u2154\u2156\u0000458^\u00be\u2157\u215c\u00005\u2158\u000068\u215a\u215d\u00008\u215e\u00008\u221e\u0000()-.\u2395\u2639\u263a\u2234\u2360\u0000 AEIOSTU_aeiostu\u02db\u0218\u021a\u236e\u0219\u021b\u0000 \"'-/3<=" +
"\u215d\u00008\u215e\u00008\u221e\u0000()-.\u2395\u2639\u263a\u2234\u2360\u0000 AEIOSTU_aeiostu\u02db\u0218\u021a\u236e\u0219\u021b\u0000 \"'-/3<=>CDELNRSTZ_cdelnrstz\u2395\u226e\u2665" + ">CDELNRSTZ_cdelnrstz\u2395\u226e\u2665\u00ab\u2264\u22c4\u010c\u010e\u011a\u013d\u0147\u0158\u0160\u0164\u017d\u2343\u0000/<>CELNOPRTUWY^_cdeopruvy\u0415\u0417\u0421\u0423\u0437\u0443\u2395\u21d0\u21d2\u20ac" +
"\u00ab\u2264\u22c4\u010c\u010e\u011a\u013d\u0147\u0158\u0160\u0164\u017d\u2343\u0000/<>CELNOPRTUWY^_cdeopruvy\u0415\u0417\u0421\u0423\u0437\u0443\u2395\u21d0\u21d2\u20ac\u20a4\u20a6\u0150\u20bd\u20b9\u20ae\u0170\u20a9\u00a5\u21d1\u2261\u20ab\u21d3\u04f2\u2338\u0000 \"'/<=>" + "\u20a4\u20a6\u0150\u20bd\u20b9\u20ae\u0170\u20a9\u00a5\u21d1\u2261\u20ab\u21d3\u04f2\u2338\u0000 \"'/<=>AEIOU_aeiou\u00a8\u2395\u226f\u2265\u00bb\u00c2\u00ca\u00ce\u00d4\u00db\u2369\u2344\u0000!+?AEIOUY\\^abeiouy\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102" +
"AEIOU_aeiou\u00a8\u2395\u226f\u2265\u00bb\u00c2\u00ca\u00ce\u00d4\u00db\u2369\u2344\u0000!+?AEIOUY\\^abeiouy\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u2395\u2e18\u0000OUou\u1ede\u1eec\u00bf\u1ea2\u1eba\u1ec8\u1ece\u1ee6\u1ef6\u262d\u0000" + "\u0103\u01a0\u01a1\u01af\u01b0\u2395\u2e18\u0000OUou\u1ede\u1eec\u00bf\u1ea2\u1eba\u1ec8\u1ece\u1ee6\u1ef6\u262d\u0000AEOaeo\u1ea8\u1ec2\u1ed4\u0000Aa\u1eb2\u2370\u0000\"'(*,-;>AET^_`~\u00a8\u00b4\u0102\u00c6@\u00c0\u00c3\u0000.|\u0e3f\u0000',./<=C" +
"AEOaeo\u1ea8\u1ec2\u1ed4\u0000Aa\u1eb2\u2370\u0000\"'(*,-;>AET^_`aet~\u00a8\u00b4\u0102\u00c6@\u00c0\u00c3\u0000.|\u0e3f\u0000',./<=CEOr|\u2102\u20a0\u00a9\u20a2\u20b5\u0000,-.<Hh\u00d0\u0000\"'" + "EOr|\u2102\u20a0\u00a9\u20a2\u20b5\u0000,-.<H\u00d0\u0000\"',-.;<=>E^_`\u00a8\u00b4\u018f\u00c8\u0000.Uilr\uFFFF\ud83d\udd95\uFFFF\ufb03\uFFFF\ufb04\u20a3\u0000(,.TU|\u02d8\u011e>\u20b2\u0000,\u0000\"',-.;>J^_" +
",-.;<=>E^_`e\u00a8\u00b4\u018f\u00c8\u0000.Uilr\uFFFF\ud83d\udd95\uFFFF\ufb03\uFFFF\ufb04\u20a3\u0000(,.TU|\u02d8\u011e>\u20b2\u0000,\u0000\"',-.;>J^_`j~\u00a8\u00b4\u0132\u00cc\u0128\u0000'\u00b4\u0000,-\u0000',-" + "`j~\u00a8\u00b4\u0132\u00cc\u0128\u0000'\u00b4\u0000,-\u0000',-/<=LTV\u0000A\u0000P\uFFFF\ud83d\udd96<\u0000.\u0000',<=GNOo~\u014a\u2115\u2116\u00d1\u0000\"',-/;>ACERSXY^_`~\u00a8\u00b4\u0152\u00ae\u00a7" +
"/<=LTV\u0000A\u0000P\uFFFF\ud83d\udd96<\u0000.\u0000',<=GNOgno~\u014a\u2115\u2116\u00d1\u0000\"',-/;>ACERSXY^_`e~\u00a8\u00b4\u0152\u00ae\u00a7\u00a4\u262e\u00d2\u00d5\u0000!.=Pt\u00b6\u20a7\u0000Qq" + "\u00a4\u262e\u00d2\u00d5\u0000!.=Pt\u00b6\u20a7\u0000Q\u211a\u0000',<=ORs\u211d\u20a8\u0000!',.;<MOS|\u2120\u1e9e$\u0000,-./;<=HM\u00de\u2122\u0000 !\"'*,-;>AEGIOU^_`ae" +
"\u211a\u0000',<=ORrs\u211d\u20a8\u0000!',.;<MOSs|\u2120\u1e9e$\u0000,-./;<=HMhz\u00de\u2122\uFFFF\ua728\u0000 !\"'*,-;>AEGIOU^_`aegiou~\u00a8\u00b4\u00b8" + "giou~\u00a8\u00b4\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000,\u0000Ee\u1e1c\u0000Aa\u1eb6\u0114\u012c\u014e\u016c\u00d9\u0103\u0115\u011f\u012d\u014f\u016d\u0168\u0000Ee\u1fb8\u1fd8\u1fe8\u1fb0\u1fd0\u1fe0\u04d0\u04d6\u04c1\u0419\u040e\u04d1\u04d7\u04c2\u0439\u045e\u0000Lcsz\u0000=" +
"\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000,\u0000Ee\u1e1c\u0000Aa\u1eb6\u0114\u012c\u014e\u016c\u00d9\u0103\u0115\u011f\u012d\u014f\u016d\u0168\u0000Ee\u1fb8\u1fd8\u1fe8\u1fb0\u1fd0\u1fe0\u04d0\u04d6\u04c1\u0419\u040e\u04d1\u04d7\u04c2\u0439\u045e\u0000Lcsz\u0000=^\u0174\u0000O\u0000\"'=" + "^\u0174\u0000O\u0000\"'=^\u00a8\u00b4\u0176\u0000'.<Z\u2124\u0000]\u2337\u0000-?not\u2395\u25cb\uFFFF\\\u006e\u0000/\uFFFF\ud83d\ude4c\uFFFF\\\u0074\u2342\u2349\u0000[\u0000!()+-./0123456789=ACEGHIJOS" +
"^\u00a8\u00b4\u0176\u0000'.<Zz\u2124\u0000]\u2337\u0000-?not\u2395\u25cb\uFFFF\\\u006e\u0000/\uFFFF\ud83d\ude4c\uFFFF\\\u0074\u2342\u2349\u0000[\u0000!()+-./0123456789=ACEGHIJOSUWYZ_ac" + "UWYZ_aceghijosuwyz|\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1eb8\u1eb9\u1ecc\u1ecd\u2212\u4e00\u4e01\u4e09\u4e0a\u4e0b\u4e19\u4e2d\u4e59\u4e8c\u4eba\u56db\u5730\u5929\u7532\u0000AEOaeo\u1eac\u1ec6\u1ed8\u0108\u011c\u0124\u0134\u015c\u1e90\u0000ahijl" +
"eghijosuwyz|\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1eb8\u1eb9\u1ecc\u1ecd\u2212\u4e00\u4e01\u4e09\u4e0a\u4e0b\u4e19\u4e2d\u4e59\u4e8c\u4eba\u56db\u5730\u5929\u7532\u0000AEOaeo\u1eac\u1ec6\u1ed8\u0108\u011c\u0124\u0134\u015c\u1e90\u0000ahijlnorswxy" + "norswxy\u0263\u0266\u0279\u027b\u0281\u0295\u02e4\uFFFF\u0410\u0302\uFFFF\u0415\u0302\uFFFF\u0418\u0302\uFFFF\u041e\u0302\uFFFF\u0420\u0302\uFFFF\u0423\u0302\uFFFF\u0440\u0302\u3192\u319c\u3194\u3196\u3198\u319b\u3197\u319a\u3193\u319f\u3195\u319e\u319d\u3199\u0000 !\"'()+-.0123456789;<=" +
"\u0263\u0266\u0279\u027b\u0281\u0295\u02e4\uFFFF\u0410\u0302\uFFFF\u0415\u0302\uFFFF\u0418\u0302\uFFFF\u041e\u0302\uFFFF\u0420\u0302\uFFFF\u0423\u0302\uFFFF\u0440\u0302\u3192\u319c\u3194\u3196\u3198\u319b\u3197\u319a\u3193\u319f\u3195\u319e\u319d\u3199\u0000 !\"'()+-.0123456789;<=>AEGIOU" + ">AEGIOUY^_aegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u2206\u220a\u2212\u2218\u2260\u2282\u2283\u22a5\u22c4\u2373\u2375\u237a\u25cb\u0000LRlr\u1e38\u1e5c" +
"Y^_aegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u2206\u220a\u2212\u2218\u2260\u2282\u2283\u22a5\u22c4\u2373\u2375\u237a\u25cb\u0000LRlr\u1e38\u1e5c\u0000AOUaou" + "\u0000AOUaou\u01de\u022a\u01d5\u2358\u0000AEOaeo\u01e0\u0230\u0000Oo\u01ec\u1e20\u0232\u0000Oo\u022c\u01e2\u1fb9\u1fd9\u1fe9\uFFFF\u0410\u0304\uFFFF\u0415\u0304\u04e2\uFFFF\u041e\u0304\uFFFF\u0420\u0304\u04ee\uFFFF\u0430\u0304\uFFFF\u0435\u0304\uFFFF\u043e\u0304\uFFFF\u0440\u0304\u2359\u2377\u235b\u2262\u2286\u2287\u234a\u235a\u2378\u2379\u2376\u235c" +
"\u01de\u022a\u01d5\u2358\u0000AEOaeo\u01e0\u0230\u0000Oo\u01ec\u1e20\u0232\u0000Oo\u022c\u01e2\u1fb9\u1fd9\u1fe9\uFFFF\u0410\u0304\uFFFF\u0415\u0304\u04e2\uFFFF\u041e\u0304\uFFFF\u0420\u0304\u04ee\uFFFF\u0430\u0304\uFFFF\u0435\u0304\uFFFF\u043e\u0304\uFFFF\u0440\u0304\u2359\u2377\u235b\u2262\u2286\u2287\u234a\u235a\u2378\u2379\u2376\u235c\u0000\"()+AE" + "\u0000\"()+AEINOUWY^_`abeinouwy\u00af\u00c2\u00ca\u00d4\u00dc\u00e2\u00ea\u00f4\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u0000U" +
"INOUWY^_`abeinouwy\u00af\u00c2\u00ca\u00d4\u00dc\u00e2\u00ea\u00f4\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u0000Uu\u03b9\u03c5\u01db\u1fd2\u0000\u0391" + "u\u03b9\u03c5\u01db\u1fd2\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0b\u1f1b\u1f2b\u1f3b\u1f4b\u1f5b\u1f6b\u1f03\u1f13\u1f23\u1f33\u1f43\u1f53\u1f63\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0a\u1f1a\u1f2a\u1f3a\u1f4a\u1f6a\u1f02\u1f12\u1f22\u1f32\u1f42\u1f52\u1f62\u0000OUou\u1edc\u1eea\u01f8\u1e80\u1ef2\u0000" +
"\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0b\u1f1b\u1f2b\u1f3b\u1f4b\u1f5b\u1f6b\u1f03\u1f13\u1f23\u1f33\u1f43\u1f53\u1f63\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0a\u1f1a\u1f2a\u1f3a\u1f4a\u1f6a\u1f02\u1f12\u1f22\u1f32\u1f42\u1f52\u1f62\u0000OUou\u1edc\u1eea\u01f8\u1e80\u1ef2\u0000AEOaeo\u1ea6" + "AEOaeo\u1ea6\u1ec0\u1ed2\u0000EOeo\u1e14\u1e50\u0000\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\uFFFF\u0410\u030f\uFFFF\u0415\u030f\uFFFF\u0418\u030f\uFFFF\u041e\u030f\uFFFF\u0420\u030f\uFFFF\u0423\u030f\u0000Aa\u1eb0\u0000EOeo\u1fba\u1fc8\u1fca\u1fda\u1ff8\u1fea\u1ffa\uFFFF\u0410\u0300\u0400\u040d\uFFFF\u041e\u0300\uFFFF" +
"\u1ec0\u1ed2\u0000EOeo\u1e14\u1e50\u0000\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\uFFFF\u0410\u030f\uFFFF\u0415\u030f\uFFFF\u0418\u030f\uFFFF\u041e\u030f\uFFFF\u0420\u030f\uFFFF\u0423\u030f\u0000Aa\u1eb0\u0000EOeo\u1fba\u1fc8\u1fca\u1fda\u1ff8\u1fea\u1ffa\uFFFF\u0410\u0300\u0400\u040d\uFFFF\u041e\u0300\uFFFF\u0420\u0300\uFFFF\u0423\u0300\uFFFF\u0430" + "\u0420\u0300\uFFFF\u0423\u0300\uFFFF\u0430\u0300\uFFFF\u043e\u0300\uFFFF\u0440\u0300\uFFFF\u0443\u0300\u0000\"'(*,-;>^_`ae~\u00a8\u00b4\u00e6\u0000!,.AEGIOUaegiou\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000Aa\u0000" +
"\u0300\uFFFF\u043e\u0300\uFFFF\u0440\u0300\uFFFF\u0443\u0300\u0000\"'(*,-;>E^_`ae~\u00a8\u00b4\u00e6\u0000!,.AEGIOUaegiou\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000Aa\u0000Ee\u0000Ee\u0000" + "Ee\u0000Ee\u0000\"',./<=ACDEGHIKLNORSTUZacdeghijklnorstuz|\u00dc\u00fc\u0000Uu\u01d9\u01cd\u01e6\u021e\u01cf\u01e8\u01d1\u01d3\u0000,-.<=hi\u00f0\u2300\u0000\"" +
"\"',./<=ACDEGHIKLNORSTUZacdeghijklnorstuz|\u00dc\u00fc\u0000Uu\u01d9\u01cd\u01e6\u021e\u01cf\u01e8\u01d1\u01d3\u0000,-.<=hi\u00f0\u2300\u0000\"',-.;<" + "',-.;<=>^_`e\u00a8\u00b4\u0259\u0000.Sfils\u017f\uFFFF\ufb00\uFFFF\ufb01\uFFFF\ufb02\u0000(,.Ut\u02d8\u0000,\u0000\"',-.;>^_`j~\u00a8\u00b4\u0133\u0000'\u00b4\u0000,k\u0138\u0000',-/<tv\u0000./" +
"=>^_`e\u00a8\u00b4\u0259\u0000.Sfils\u017f\uFFFF\ufb00\uFFFF\ufb01\uFFFF\ufb02\u0000(,.Utu~\u02d8\uFFFF\u0067\u0303\u0000,\u0000\"',-.;>^_`j~\u00a8\u00b4\u0133\u0000'\u00b4\u0000,k\u0138\u0000',-/<tv\u0000./u" + "u\u0000',<g~\u014b\u0000\"',-/;>AU^_`aceorsuwxy~\u00a8\u00b4\u0153\u0000!.=o\u0000o\uFFFF\ud83d\udca9\u0000',<=\u0000!',.;<mos\u00b8\u00df\u0000,-./;<hm\u00fe" +
"\u0000',<g~\u014b\u0000\"',-/;>AU^_`aceorsuwxy~\u00a8\u00b4\u0153\u0000!.=o\u0000o\uFFFF\ud83d\udca9\u0000',<=\u0000!',.;<mos\u00b8\u00df\u0000,-./;<hmz\u00fe" + "\u0000\"'*,-/;>AEGIOU^_`aegiou~\u00a8\u00b4\u0000/ACDEGHIKNORSTUZacdeghijklnorstuz|\u0000^\u0000ox\u00d7\u0000\"'=" +
"\uFFFF\ua729\u0000\"'*,-/;>AEGIOU^_`aegiou~\u00a8\u00b4\u0000/ACDEGHIKNORSTUZacdeghijklnorstuz|\u0000^\u0000ox\u00d7\u0000\"" + "^\u00a8\u00b4\u0000'.<\u0000}\u2205\u0000-=BCGS^cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000\"()+0AEINOUVY^abeinouvy|~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102" +
"'=^\u00a8\u00b4\u0000'.<\u0000}\u2205\u0000-=BCGS^cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000\"()+0AEINOUVY^abeinouvy|~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea" + "\u0103\u01a0\u01a1\u01af\u01b0\u03b1\u03b7\u03b9\u03c5\u03c9\u2207\u2227\u2228\u0000\u03b9\u03c5\u1fd7\u0000\u0391\u0397\u0399\u03a5\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0f\u1f2f\u1f3f\u1f5f\u1f6f\u1f07\u1f27\u1f37\u1f57\u1f67\u0000\u0391\u0397\u0399\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0e\u1f2e\u1f3e\u1f6e\u1f06\u1f26\u1f36\u1f56\u1f66\u0000OUou\u1ee0\u1eee\u1ebc\u1e7c\u1ef8\u0000AEOa" +
"\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u03b1\u03b7\u03b9\u03c5\u03c9\u2207\u2227\u2228\u0000\u03b9\u03c5\u1fd7\u0000\u0391\u0397\u0399\u03a5\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0f\u1f2f\u1f3f\u1f5f\u1f6f\u1f07\u1f27\u1f37\u1f57\u1f67\u0000\u0391\u0397\u0399\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0e\u1f2e\u1f3e\u1f6e\u1f06\u1f26\u1f36\u1f56\u1f66\u0000OUou\u1ee0\u1eee\u1ebc\u1e7c\u1ef8\u0000AE" + "eo\u1eaa\u1ec4\u1ed6\u0000Aa\u1eb4\u2248\u1fb6\u1fc6\u1fd6\u1fe6\u1ff6\u236b\u2372\u2371\u0000'*>AEIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u1fed\u1fc1\u2361\u2365\u0000!\".;AEGIOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6" +
"Oaeo\u1eaa\u1ec4\u1ed6\u0000Aa\u1eb4\u2248\u1fb6\u1fc6\u1fd6\u1fe6\u1ff6\u236b\u2372\u2371\u0000'*>AEIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u1fed\u1fc1\u2361\u2365\u0000!\".;AEGIOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc" + "\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000LRlr\u0000AOUaou\u0000AOao\u0000Oo\u0000Oo\u2351\u0000\"()+,/ACEGIJKLMNOPR" +
"\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000LRlr\u0000AOUaou\u0000AOao\u0000Oo\u0000Oo\u2351\u0000\"()+,/ACEGIJKLMNO" + "SUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9" +
"PRSUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5" + "\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u0000IUiu\u03b9\u03c5\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000OUou\u0000Cc\u0000" +
"\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u0000IUiu\u03b9\u03c5\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000OUou\u0000C" + "Oo\u0000AEOaeo\u0000EOeo\u0000Aa\u0000OUou\u0000EOeo\u0000Cc\u0000CDEGHKLNRSTcdeghklnrst\u0228\u0000\u2395\u2339\u0000Gg\u0000'\u0000'\u0000'\u0000\"'\u0000'\u0000" +
"c\u0000Oo\u0000AEOaeo\u0000EOeo\u0000Aa\u0000OUou\u0000EOeo\u0000Cc\u0000CDEGHKLNRSTcdeghklnrst\u0228\u0000\u2395\u2339\u0000Gg\u0000'\u0000'\u0000'\u0000\"'\u0000" + "\"'\u0000'\u0000'\u0000'\u0000'\u0000\"'()`~\u00b4\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8d\u1f9d\u1fad\u1f85\u1f95\u1fa5\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8c\u1f9c\u1fac\u1f84\u1f94\u1fa4\u1fb4\u1fc4\u1ff4\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f89\u1f99\u1fa9\u1f81\u1f91\u1fa1" +
"'\u0000\"'\u0000'\u0000'\u0000'\u0000'\u0000\"'()`~\u00b4\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8d\u1f9d\u1fad\u1f85\u1f95\u1fa5\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8c\u1f9c\u1fac\u1f84\u1f94\u1fa4\u1fb4\u1fc4\u1ff4\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f89\u1f99\u1fa9\u1f81" + "\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f88\u1f98\u1fa8\u1f80\u1f90\u1fa0\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8b\u1f9b\u1fab\u1f83\u1f93\u1fa3\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8a\u1f9a\u1faa\u1f82\u1f92\u1fa2\u1fb2\u1fc2\u1ff2\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8f\u1f9f\u1faf\u1f87\u1f97\u1fa7\u0000\u0391\u0397\u03a9\u03b1" +
"\u1f91\u1fa1\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f88\u1f98\u1fa8\u1f80\u1f90\u1fa0\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8b\u1f9b\u1fab\u1f83\u1f93\u1fa3\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8a\u1f9a\u1faa\u1f82\u1f92\u1fa2\u1fb2\u1fc2\u1ff2\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8f\u1f9f\u1faf\u1f87\u1f97\u1fa7\u0000\u0391\u0397" + "\u03b7\u03c9\u1f8e\u1f9e\u1fae\u1f86\u1f96\u1fa6\u1fb7\u1fc7\u1ff7\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1fbc\u1fcc\u1ffc\u1fb3\u1fc3\u1ff3\u0000'\u0000\"'\u0000'\u0000=\u0000=\u0000\u041e\u043e\u0000=\u0000\u0435\u0443\u0447\u044b\u044c\ua64b\ua651\u0463\u0461\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e" +
"\u03a9\u03b1\u03b7\u03c9\u1f8e\u1f9e\u1fae\u1f86\u1f96\u1fa6\u1fb7\u1fc7\u1ff7\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1fbc\u1fcc\u1ffc\u1fb3\u1fc3\u1ff3\u0000'\u0000\"'\u0000'\u0000\".\u0406\u0423\u0443\u0456\u0474\u0000\u0410\u0430\u0462\u0463\uFFFF\ua656\uFFFF\ua65c\u0000\u0415\u0423\u042b\u042c\u042d\u0435\u0443\u044b" + "\u0067\u005f\u0061\u0069\u0067\u0075\uFFFF\ua659\uFFFF\ua64d\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0070\u0073\u0069\u006c\u0069\u0000,.\u0439\u043a\u0445\u0458\u0491\u0481\u0000\u0435\u0436\u0437\u0439\u0458\u0465\uFFFF\ua649\u045f\uFFFF\ua643\u0452\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f" +
"\u044c\u044d\ua64a\ua64b\ua650\ua651\u04d4\u0460\u0462\uFFFF\ua658\u04d8\uFFFF\ua64c\u0000,.\u0408\u0419\u041a\u0425\u0439\u043a\u0445\u0458\u0490\u0480\u0000\u0408\u0415\u0416\u0417\u0419\u0435\u0436\u0437\u0439\u0458\u0464\u0465\uFFFF\ua648\u040f\uFFFF\ua642\u0402\u0000=\u0000.\u0000=\u0424\u0444\u0498\u0000\u0418\u0423\u0438\u0443\u0000.\u0000,.\u0413\u0421\u0425\u0428\u0433\u0441\u0445" + "\u0074\u0072\u0065\u006d\u0061\u0000.\u0000=\u0444\u0499\u0000\u0438\u0443\u0475\u0000.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0062\u0072\u0065\u0076\u0065\u0000,.\u0433\u0441\u0445\u0448\u046f\u0000,.\u044c\u0459\u0000.\u0000,\u00b7\u0447\u044c\u0529\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0069\u0074\u006c\u006f\u045a" +
"\u0448\u046e\u0000,.\u042c\u044c\u0409\u0000.\u0000,\u00b7\u041e\u042c\u043e\u044c\u0528\u040a\u0000\u0422\u0423\u0442\u0443\u047e\u0478\u0000\u0421\u0441\u0470\u0000=\u0000\u0408\u0419\u0421\u0424\u0439\u0441\u0444\u0458\u040b\u0426\u0472\u0000\u0406\u0408\u0418\u0419\u0423\u0438\u0439\u0443\u0456\u0458\u0000,.\u0000.\u0000\u0422\u0442\u0429\u0000\u0406\u0410\u0415\u041c\u041d\u041e\u042c" + "\u0000\u0442\u0443\u0447\u047f\u0479\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0062\u0072\u0065\u0076\u0065\u0000\u0430\u0441\u0471\u0000\u0439\u0444\u0458\u045b\u0473\u0000\u0438\u0439\u0443\u0447\u0456\u0458\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u006f\u006b\u0072\u0079\u0074\u0069\u0065\u0000,.\u0447\uFFFF" +
"\u042d\u0430\u0435\u043c\u043d\u043e\u044c\u044d\u0456\u0464\u046c\u0468\uFFFF\ua652\u0000\u0435\u0443\u0447\u044b\u044c\u044d\ua64b\ua651\u04d5\u0461\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0069\u0067\u0075\u0463\uFFFF\ua659\u04d9\uFFFF\ua64d\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0070\u0073\u0069\u006c" + "\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0064\u0061\u0073\u0069\u0061\u0000.\u0430\u0431\u0435\u0439\u043d\u043e\u0443\u0445\u0447\u044a\u044e\u0458\u0467\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u0061\u0079\u0065\u0072\u006f\u006b\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u0065\u0072\u0074" +
"\u0069\u0000,.\u0439\u043a\u0445\u0458\u0491\u0481\u0000\u0435\u0436\u0437\u0439\u0458\u0465\uFFFF\ua649\u045f\uFFFF\ua643\u0452\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0072\u0065\u006d\u0061\u0000.\u0000=\u0444\u0499\u0000\u0438\u0443\u0475\u0000.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0062\u0072\u0065\u0076\u0065\u0000," + "\u0069\u0063\u0061\u006c\u005f\u0074\u0069\u006c\u0064\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0067\u0072\u0061\u0076\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u007a\u006d\u0065\u0074\u0000\u0442\u0449\u0000\u0447\u0000\u0430\u0435\u043c\u043d\u0447\uFFFF\ua653\u046d\u0469\u0000\u044c\uFFFF\ua65d\u0000\".\u0443\u0456\u0000\u0430\u0447\u0463\uFFFF\ua657" +
".\u0433\u0441\u0445\u0448\u046f\u0000,.\u044c\u0459\u0000.\u0000,\u00b7\u0447\u044c\u0529\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0069\u0074\u006c\u006f\u045a\u0000\u0442\u0443\u0447\u047f\u0479\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0062\u0072\u0065\u0076\u0065\u0000\u0430\u0441\u0471\u0000" + "\u0000\u0442\u0000\u0447\u0000\u05d9\uFFFF\ufb1d\u0000\u05d0\u05f2\uFFFF\ufb2e\uFFFF\ufb1f\u0000\u05d0\uFFFF\ufb2f\u0000\u05d5\uFFFF\ufb4b\u0000\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d8\u05d9\u05da\u05db\u05dc\u05de\u05e0\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u05ea\uFFFF\ufb30\uFFFF\ufb31\uFFFF\ufb32\uFFFF\ufb33\uFFFF\ufb34\uFFFF\ufb35\uFFFF\ufb36\uFFFF\ufb38\uFFFF\ufb39\uFFFF\ufb3a\uFFFF\ufb3b\uFFFF\ufb3c\uFFFF\ufb3e" +
"\u0439\u0441\u0444\u0458\u045b\u0446\u0473\u0000\u0438\u0439\u0443\u0447\u0456\u0458\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u006f\u006b\u0072\u0079\u0074\u0069\u0065\u0000,.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0064\u0061\u0073\u0069\u0061\u0000.\u0430\u0431\u0435\u0439\u043d\u043e\u0443\u0445" + "\uFFFF\ufb40\uFFFF\ufb41\uFFFF\ufb43\uFFFF\ufb44\uFFFF\ufb46\uFFFF\ufb47\uFFFF\ufb48\uFFFF\ufb49\uFFFF\ufb4a\u0000\u05d1\u05db\u05e4\uFFFF\ufb4c\uFFFF\ufb4d\uFFFF\ufb4e\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2c\uFFFF\ufb2a\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2d\uFFFF\ufb2b\u0000\u0627\u0639\u0648\u064a\u0667\u06cc\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f" +
"\u0447\u044a\u044e\u0458\u0467\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u0061\u0079\u0065\u0072\u006f\u006b\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u0065\u0072\u0074\u0069\u0063\u0061\u006c\u005f\u0074\u0069\u006c\u0064\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0067\u0072\u0061\u0076\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069" + "\u0061\u0062\u006f\u0076\u0065\u0623\u06c9\u063d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0062\u0065\u006c\u006f\u0077\u0000\u062f\u0631\u0634\u0646\u0637\u0691\u062b\u0679\u0000\u0634\u0686\u0000\u062d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0075\u006b\u0075\u006e\u0000\u062a\u0632\u06f7\u0630\u0695\u0000\u0634\u0635\u0000\u062a\u0000\u0627" +
"\u006e\u0067\u005f\u0076\u007a\u006d\u0065\u0074\u0000\u0442\u0449\u0000\u0447\u0000\u0430\u0435\u043c\u043d\u043e\u0447\u044c\u044d\u0456\uFFFF\ua657\u0465\u046d\u0469\uFFFF\ua65d\uFFFF\ua653\u0000\".\u0443\u0456\u0000\u0430\u0447\u0463\u0000\u0422\u0442\u0000\u0442\u0000\u0447\u0000\u05d9\uFFFF\ufb1d\u0000\u05d0\u05f2\uFFFF\ufb2e\uFFFF\ufb1f\u0000\u05d0\uFFFF\ufb2f\u0000\u05d5\uFFFF\ufb4b\u0000\u05d0\u05d1\u05d2\u05d3" + "\u0647\u0648\u064a\u0667\u0668\u06cc\u06f7\u06f8\u0625\u06c0\u0624\u0626\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0062\u0065\u006c\u006f\u0077\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0061\u0062\u006f\u0076\u0065\u0000\u0643\u06a9\u06af\u0000\u0648\u06a1\u0000\u0648\u06ca\u0000\u0644\u0667\u06f7\uFFFF\u0063" +
"\u05d4\u05d5\u05d6\u05d8\u05d9\u05da\u05db\u05dc\u05de\u05e0\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u05ea\uFFFF\ufb30\uFFFF\ufb31\uFFFF\ufb32\uFFFF\ufb33\uFFFF\ufb34\uFFFF\ufb35\uFFFF\ufb36\uFFFF\ufb38\uFFFF\ufb39\uFFFF\ufb3a\uFFFF\ufb3b\uFFFF\ufb3c\uFFFF\ufb3e\uFFFF\ufb40\uFFFF\ufb41\uFFFF\ufb43\uFFFF\ufb44\uFFFF\ufb46\uFFFF\ufb47\uFFFF\ufb48\uFFFF\ufb49\uFFFF\ufb4a\u0000\u05d1\u05db\u05e4\uFFFF\ufb4c\uFFFF\ufb4d\uFFFF\ufb4e" + "\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0068\u0061\u0064\u0064\u0061\u0068\u06b5\u0000\u062a\u0647\u0648\u064a\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f" +
"\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2c\uFFFF\ufb2a\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2d\uFFFF\ufb2b\u0000\u0627\u0639\u0648\u064a\u0667\u06cc\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0061\u0062\u006f\u0076\u0065\u0623\u06c9\u063d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0062\u0065\u006c\u006f" + "\u006b\u0061\u0073\u0072\u0061\u0074\u0061\u006e\u0000 \u062a\u0639\u0646\u0647\u0648\u064a\u06cc\u06d5\u0629\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u06c6\u06ce\u0000\u062b\u0639\u0641\u0646\u0648\u0667\u0668\u06f7\u06f8\u06cb\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0068\u0000 \u0627\u0639\u0646\u064a\u0667" +
"\u0077\u0000\u062f\u0631\u0634\u0646\u0637\u0691\u062b\u0679\u0000\u0634\u0686\u0000\u062d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0075\u006b\u0075\u006e\u0000\u062a\u0632\u06f7\u0630\u0695\u0000\u0634\u0635\u0000\u062a\u0000\u0627\u0647\u0648\u064a\u0667\u0668\u06cc\u06f7\u06f8\u0625\u06c0\u0624\u0626\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061" + "\u0668\u06f7\u06f8\u06d2\u0649\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0000\u0627\u0622\u0000\u0627\u0648\u064a\u06c1\u06d2\u06d5\u06c2\u06d3\u0000\u0627\u0000\u0627\u0631\u0639\u0644\u0648\u064a\u0667\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0076\u0000\u0639\u0648\u064a\u0668\u06cc\uFFFF\u0063\u006f" +
"\u005f\u0062\u0065\u006c\u006f\u0077\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0061\u0062\u006f\u0076\u0065\u0000\u0643\u06a9\u06af\u0000\u0648\u06a1\u0000\u0648\u06ca\u0000\u0644\u0667\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0068\u0061\u0064\u0064\u0061\u0068\u06b5\u0000\u062a\u0647\u0648\u064a\u06cc\uFFFF\u0063\u006f\u006d\u0062" + "\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0076\u0000 \u0627\u0639\u0646\u0667\u0668\u06cc\u06f7\u06f8\u0000\u0627\u0631\u0639\u0644\u0648\u064a\u06cc\u06f7\u0000\u0639\u0648\u064a\u06cc\u06f8\u0000\u0915\u0916\u0917\u091c\u0921\u0922\u0928\u092b\u092f\u0930\u0933\u0958\u0959\u095a\u095b\u095c\u095d\u0929\u095e\u095f\u0931" +
"\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0074\u0061\u006e\u0000 \u062a\u0639\u0646\u0647\u0648\u064a\u06cc\u06d5\u0629\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e" + "\u0934\u0000\u09a1\u09a2\u09af\u09dc\u09dd\u09df\u0000\u09be\u09d7\u09cb\u09cc\u0000\u0a16\u0a17\u0a1c\u0a2b\u0a32\u0a38\u0a59\u0a5a\u0a5b\u0a5e\u0a33\u0a36\u0000\u0b21\u0b22\u0b5c\u0b5d\u0000\u0b3e\u0b56\u0b57\u0b4b\u0b48\u0b4c\u0000\u0bbe\u0bd7\u0bca\u0bcc\u0000\u0bbe\u0bcb\u0000\u0b92\u0b94\u0000\u0c56\u0c48\u0000\u0cd5\u0cc0\u0000\u0cc2\u0cd5\u0cd6\u0cca\u0cc7\u0cc8\u0000\u0cd5\u0ccb\u0000\u0d3e\u0d57\u0d4a\u0d4c\u0000\u0d3e" +
"\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u06c6\u06ce\u0000\u062b\u0639\u0641\u0646\u0648\u0667\u0668\u06f7\u06f8\u06cb\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0068\u0000 \u0627\u0639\u0646\u064a\u0667\u0668\u06f7\u06f8\u06d2\u0649\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0000\u0627\u0622\u0000\u0627\u0648\u064a" + "\u0d4b\u0000\u0dca\u0dcf\u0ddf\u0dda\u0ddc\u0dde\u0000\u0dca\u0ddd\u0000\u0f72\u0f74\u0f80\u0f73\u0f75\u0f81\u0000\u0fb5\u0fb9\u0000\u0fb7\u0f93\u0000\u0fb7\u0f9d\u0000\u0fb7\u0fa2\u0000\u0fb7\u0fa7\u0000\u0fb7\u0fac\u0000\u0f80\u0f76\u0000\u0f80\u0f78\u0000\u0f40\u0f69\u0000\u0f42\u0f4c\u0f51\u0f56\u0f5b\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0000\u1025\u1026\u0000\u1100\u1101\u0000\u1100\u1102\u1103\u1107\u1113\u1114\u1115\u1116\u0000" +
"\u06c1\u06d2\u06d5\u06c2\u06d3\u0000\u0627\u0000\u0627\u0631\u0639\u0644\u0648\u064a\u0667\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0076\u0000\u0639\u0648\u064a\u0668\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0076\u0000 \u0627" + "\u1100\u1103\u1117\u1104\u0000\u1102\u1105\u110b\u1112\u1118\u1119\u111b\u111a\u0000\u1107\u110b\u111c\u111d\u0000\u1100\u1102\u1103\u1107\u1109\u110a\u110b\u110c\u110e\u1110\u1111\u112b\u112d\u112f\u1132\u1136\u111e\u111f\u1120\u1108\u1121\u1125\u112b\u1127\u1128\u1129\u112a\u112c\u1122\u1123\u1124\u1126\u0000\u110b\u0000\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110a\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u111e\u112d\u112e" +
"\u0639\u0646\u0667\u0668\u06cc\u06f7\u06f8\u0000\u0627\u0631\u0639\u0644\u0648\u064a\u06cc\u06f7\u0000\u0639\u0648\u064a\u06cc\u06f8\u0000\u0915\u0916\u0917\u091c\u0921\u0922\u0928\u092b\u092f\u0930\u0933\u0958\u0959\u095a\u095b\u095c\u095d\u0929\u095e\u095f\u0931\u0934\u0000\u09a1\u09a2\u09af\u09dc\u09dd\u09df\u0000\u09be\u09d7\u09cb\u09cc\u0000\u0a16\u0a17\u0a1c\u0a2b\u0a32\u0a38\u0a59\u0a5a\u0a5b\u0a5e\u0a33\u0a36\u0000\u0b21" + "\u112f\u1130\u1131\u1132\u110a\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u1133\u0000\u1109\u0000\u1100\u1103\u1106\u1107\u1109\u110b\u110c\u110e\u1110\u1111\u1140\u1141\u1142\u1143\u1144\u1145\u1147\u1148\u1149\u114a\u114b\u1146\u0000\u110b\u110c\u114d\u110d\u0000\u110f\u1112\u1152\u1153\u0000\u1107\u110b\u1156\u1157\u0000\u1112\u1158\u0000\u1100\u1103\u1107\u1109\u110c\u0000\u1100\u0000\u113c\u113d\u0000\u113e\u113f\u0000" +
"\u0b22\u0b5c\u0b5d\u0000\u0b3e\u0b56\u0b57\u0b4b\u0b48\u0b4c\u0000\u0bbe\u0bd7\u0bca\u0bcc\u0000\u0bbe\u0bcb\u0000\u0b92\u0b94\u0000\u0c56\u0c48\u0000\u0cd5\u0cc0\u0000\u0cc2\u0cd5\u0cd6\u0cca\u0cc7\u0cc8\u0000\u0cd5\u0ccb\u0000\u0d3e\u0d57\u0d4a\u0d4c\u0000\u0d3e\u0d4b\u0000\u0dca\u0dcf\u0ddf\u0dda\u0ddc\u0dde\u0000\u0dca\u0ddd\u0000\u0f72\u0f74\u0f80\u0f73\u0f75\u0f81\u0000\u0fb5\u0fb9\u0000\u0fb7\u0f93\u0000\u0fb7\u0f9d\u0000" + "\u114e\u114f\u0000\u1150\u1151\u0000\u1169\u116e\u1175\u1176\u1177\u1162\u0000\u1169\u116d\u1175\u1178\u1179\u1164\u0000\u1169\u116e\u1173\u1175\u117a\u117b\u117c\u1166\u0000\u1169\u116e\u1175\u117d\u117e\u1168\u0000\u1161\u1162\u1165\u1166\u1168\u1169\u116e\u1175\u116a\u116b\u117f\u1180\u1181\u1182\u1183\u116c\u0000\u1175\u0000\u1163\u1164\u1167\u1169\u1175\u1184\u1185\u1186\u1187\u1188\u0000\u1161\u1162\u1165\u1166\u1168\u116e" +
"\u0fb7\u0fa2\u0000\u0fb7\u0fa7\u0000\u0fb7\u0fac\u0000\u0f80\u0f76\u0000\u0f80\u0f78\u0000\u0f40\u0f69\u0000\u0f42\u0f4c\u0f51\u0f56\u0f5b\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0000\u1025\u1026\u0000\u1100\u1101\u0000\u1100\u1102\u1103\u1107\u1113\u1114\u1115\u1116\u0000\u1100\u1103\u1117\u1104\u0000\u1102\u1105\u110b\u1112\u1118\u1119\u111b\u111a\u0000\u1107\u110b\u111c\u111d\u0000\u1100\u1102\u1103\u1107\u1109\u110a\u110b\u110c\u110e" + "\u1175\u117c\u1189\u118a\u116f\u1170\u118c\u118d\u1171\u118b\u0000\u1173\u1175\u0000\u1161\u1165\u1166\u1167\u1168\u116e\u1175\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u0000\u116e\u1173\u1175\u1195\u1196\u1174\u0000\u116e\u1197\u0000\u1161\u1163\u1169\u116e\u1173\u119e\u1198\u1199\u119a\u119b\u119c\u119d\u0000\u1165\u116e\u1175\u119e\u119f\u11a0\u11a1\u11a2\u0000\u11a8\u11af\u11ba\u11e7\u11a9\u11c3\u11aa\u11c4\u0000\u11a8\u0000" +
"\u1110\u1111\u112b\u112d\u112f\u1132\u1136\u111e\u111f\u1120\u1108\u1121\u1125\u112b\u1127\u1128\u1129\u112a\u112c\u1122\u1123\u1124\u1126\u0000\u110b\u0000\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110a\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u111e\u112d\u112e\u112f\u1130\u1131\u1132\u110a\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u1133\u0000\u1109\u0000\u1100\u1103\u1106\u1107\u1109\u110b\u110c\u110e\u1110\u1111\u1140" + "\u11a8\u11ae\u11ba\u11bd\u11c0\u11c2\u11eb\u11c5\u11c6\u11c7\u11ac\u11c9\u11ad\u11c8\u0000\u11a8\u11af\u11ca\u11cb\u0000\u11a8\u11aa\u11ab\u11ae\u11af\u11b7\u11b8\u11b9\u11ba\u11bb\u11bf\u11c0\u11c1\u11c2\u11da\u11dd\u11e5\u11e6\u11eb\u11f9\u11b0\u11cc\u11cd\u11ce\u11d0\u11b1\u11b2\u11d3\u11b3\u11d6\u11d8\u11b4\u11b5\u11b6\u11d1\u11d2\u11d4\u11d5\u11d7\u11d9\u0000\u11ba\u0000\u11a8\u11ba\u0000\u11ba\u11bc\u11c2\u0000\u11ba\u0000" +
"\u1141\u1142\u1143\u1144\u1145\u1147\u1148\u1149\u114a\u114b\u1146\u0000\u110b\u110c\u114d\u110d\u0000\u110f\u1112\u1152\u1153\u0000\u1107\u110b\u1156\u1157\u0000\u1112\u1158\u0000\u1100\u1103\u1107\u1109\u110c\u0000\u1100\u0000\u113c\u113d\u0000\u113e\u113f\u0000\u114e\u114f\u0000\u1150\u1151\u0000\u1169\u116e\u1175\u1176\u1177\u1162\u0000\u1169\u116d\u1175\u1178\u1179\u1164\u0000\u1169\u116e\u1173\u1175\u117a\u117b\u117c\u1166" + "\u11a8\u11af\u11b8\u11ba\u11bb\u11bc\u11be\u11c2\u11eb\u11da\u11db\u11dc\u11dd\u11de\u11e2\u11e0\u11e1\u11df\u0000\u11af\u11ba\u11bc\u11c1\u11c2\u11e3\u11b9\u11e6\u11e4\u11e5\u0000\u11a8\u11ae\u11af\u11b8\u11ba\u11e7\u11e8\u11e9\u11ea\u11bb\u0000\u11a8\u11a9\u11bc\u11bf\u11ec\u11ed\u11ee\u11ef\u0000\u11b8\u11bc\u11f3\u11f4\u0000\u11ab\u11af\u11b7\u11b8\u11f5\u11f6\u11f7\u11f8\u0000\u11c2\u11cf\u0000\u11ba\u0000\u11a8\u0000\u11ba" +
"\u0000\u1169\u116e\u1175\u117d\u117e\u1168\u0000\u1161\u1162\u1165\u1166\u1168\u1169\u116e\u1175\u116a\u116b\u117f\u1180\u1181\u1182\u1183\u116c\u0000\u1175\u0000\u1163\u1164\u1167\u1169\u1175\u1184\u1185\u1186\u1187\u1188\u0000\u1161\u1162\u1165\u1166\u1168\u116e\u1175\u117c\u1189\u118a\u116f\u1170\u118c\u118d\u1171\u118b\u0000\u1173\u1175\u0000\u1161\u1165\u1166\u1167\u1168\u116e\u1175\u118e\u118f\u1190\u1191\u1192\u1193\u1194" + "\u11eb\u11f1\u11f2\u0000|\u2395\u2347\u0000-\u2395\u2350\u0000|\u2395\u2348\u0000-\u2395\u2357\u0000/\u2204\u0000_|\u2395\u234d\u0000|~\u00a8\u2395\u2354\u0000/\u2209\u0000_\u0000/\u220c\u0000_\u00a8\u2229\u22a4\u22a5\u2395\u25cb\u235d\u2355\u234e\u233b\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2353\u0000~\u2227\u2395\u234c\u0000\u2218" +
"\u0000\u116e\u1173\u1175\u1195\u1196\u1174\u0000\u116e\u1197\u0000\u1161\u1163\u1169\u116e\u1173\u119e\u1198\u1199\u119a\u119b\u119c\u119d\u0000\u1165\u116e\u1175\u119e\u119f\u11a0\u11a1\u11a2\u0000\u11a8\u11af\u11ba\u11e7\u11a9\u11c3\u11aa\u11c4\u0000\u11a8\u0000\u11a8\u11ae\u11ba\u11bd\u11c0\u11c2\u11eb\u11c5\u11c6\u11c7\u11ac\u11c9\u11ad\u11c8\u0000\u11a8\u11af\u11ca\u11cb\u0000\u11a8\u11aa\u11ab\u11ae\u11af\u11b7\u11b8\u11b9" + "\u0000|\u0000/\u2241\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u236f\u0000/\u0000/\u2270\u0000/\u2271\u0000/\u2274\u0000/\u2275\u0000/\u2278\u0000/\u2279\u0000/\u2280\u0000/\u2281\u0000/\u22e0\u0000/\u22e1\u0000/_|\u2284\u0000/_\u2285\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000" +
"\u11ba\u11bb\u11bf\u11c0\u11c1\u11c2\u11da\u11dd\u11e5\u11e6\u11eb\u11f9\u11b0\u11cc\u11cd\u11ce\u11d0\u11b1\u11b2\u11d3\u11b3\u11d6\u11d8\u11b4\u11b5\u11b6\u11d1\u11d2\u11d4\u11d5\u11d7\u11d9\u0000\u11ba\u0000\u11a8\u11ba\u0000\u11ba\u11bc\u11c2\u0000\u11ba\u0000\u11a8\u11af\u11b8\u11ba\u11bb\u11bc\u11be\u11c2\u11eb\u11da\u11db\u11dc\u11dd\u11de\u11e2\u11e0\u11e1\u11df\u0000\u11af\u11ba\u11bc\u11c1\u11c2\u11e3\u11b9\u11e6\u11e4" + "/\u22ac\u0000\u00a8\u00af\u2218\u22a5\u2336\u0000_\u2218\u22a4\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000/\u22ec\u0000/\u22ed\u0000_\u2395\u233a\u0000_\u0000_\u0000_\u0000'/:<=>?\\\u00f7\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u233c\u0000*-.\\_" +
"\u11e5\u0000\u11a8\u11ae\u11af\u11b8\u11ba\u11e7\u11e8\u11e9\u11ea\u11bb\u0000\u11a8\u11a9\u11bc\u11bf\u11ec\u11ed\u11ee\u11ef\u0000\u11b8\u11bc\u11f3\u11f4\u0000\u11ab\u11af\u11b7\u11b8\u11f5\u11f6\u11f7\u11f8\u0000\u11c2\u11cf\u0000\u11ba\u0000\u11a8\u0000\u11ba\u11eb\u11f1\u11f2\u0000|\u2395\u2347\u0000-\u2395\u2350\u0000|\u2395\u2348\u0000-\u2395\u2357\u0000/\u2204\u0000_|\u2395\u234d\u0000" + "|\u00a8\u2218\u2395\u0000/\u2adc\u0000 !\"%'()*,-.0123456789:<=>?[]^_abcehlopruyz{|}\u00a3\u00a7\u00b1\u00d7\u0398\u03a0\u03a3\u03b2\u03b3\u03b5\u03b8\u03ba\u03c0\u03c1\u03c3\u03c5\u03c6\u0430\u0435" +
"|~\u00a8\u2395\u2354\u0000/\u2209\u0000_\u0000/\u220c\u0000_\u00a8\u2229\u22a4\u22a5\u2395\u25cb\u235d\u2355\u234e\u233b\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2353\u0000~\u2227\u2395\u234c\u0000\u2218\u0000|\u0000/\u2241\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u236f\u0000/\u0000/\u2270\u0000/\u2271\u0000/" + "\u0437\u0438\u0439\u043b\u043c\u043d\u043e\u0441\u0443\u0447\u0448\u044a\u044b\u044c\u044d\u044f\u0456\u0458\u045f\u0461\u0481\u0487\u049b\u04b7\u04c8\u0513\u05d1\u05d3\u05d5\u05d6\u05d7\u05dd\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u0625\u0626\u0627\u0628\u0629\u062b\u062d\u0631\u0632\u0633\u0635\u0637\u0639\u063a\u063d\u0641\u0642\u0643\u0644\u0646\u0647\u064a\u064f\u0650\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668" +
"\u2274\u0000/\u2275\u0000/\u2278\u0000/\u2279\u0000/\u2280\u0000/\u2281\u0000/\u22e0\u0000/\u22e1\u0000/_|\u2284\u0000/_\u2285\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000/\u22ac\u0000\u00a8\u00af\u2218\u22a5\u2336\u0000_\u2218\u22a4\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000" + "\u0669\u06a1\u06a9\u06c6\u06c9\u06cc\u06ce\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0901\u0902\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090f\u0910\u0913\u0914\u0915\u0916\u0917\u0918\u091a\u091b\u091c\u091d\u091f\u0921\u0922\u0923\u0925\u0926\u0928\u092a\u092b\u092c\u092f\u0930\u0933\u0935\u0936\u0937\u093c\u093d\u093e\u093f\u0940\u0941\u0943\u0947\u0948\u094b\u094c\u0953\u0956\u0962\u0964\u0970\u2020" +
"/\u22ec\u0000/\u22ed\u0000_\u2395\u233a\u0000_\u0000_\u0000_\u0000'/:<=>?\\\u00f7\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u233c\u0000*-.\\_|\u00a8\u2218\u2395\u0000/\u2adc\u0000 !\"%'()*,-.012345678" + "\u20ac\u20b9\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u2203\u2208\u2227\u2228\u2229\u222a\u222b\u2282\u2283\u22b7\ua649\ua651\ua67d\uFFFF\u006e\u0062\u0073\u0070\uFFFF\u0066\u0031\u0030\uFFFF\u0066\u0031\uFFFF\u0066\u0032\uFFFF\u0066\u0033\uFFFF\u0066\u0034\uFFFF\u0066\u0035\uFFFF\u0066\u0036\uFFFF\u0066\u0037\uFFFF\u0066\u0038\uFFFF\u0066\u0039\uFFFF\u007a\u0077\u006e\u006a\u20b1\u20b4\u20bf\uFFFF\u0072\u0065" +
"9:<=>?[]^_abcehlopruyz{|}\u00a3\u00a7\u00b1\u00d7\u0398\u03a0\u03a3\u03b2\u03b3\u03b5\u03b8\u03ba\u03c0\u03c1\u03c3\u03c5\u03c6\u0430\u0433\u0434\u0435\u0437\u0438\u0439\u043b\u043c\u043d\u043e\u0441\u0443\u0444\u0445\u0447\u0448\u044a\u044b\u044c\u044d\u044f\u0452\u0456\u0458\u045b\u045f\u0461\u0481\u0487" + "\u006d\u006f\u0076\u0065\u0064\u2213\u2219\u03f4\u220f\u2211\u03d0\u0263\u03f5\u03d1\u03f0\u03d6\u03f1\u03c2\u03d2\u03d5\u0465\uFFFF\ua641\u0456\u0458\u046b\u0467\u047b\u0455\uFFFF\ua64b\u044c\uFFFF\ua651\u044a\u0454\u0438\uFFFF\ua66f\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0073\u0065\u0067\u006f\u006c\uFFFF\u0064\u0061\u0067\u0065\u0073\u0068\uFFFF\u0068\u006f\u006c\u0061\u006d\uFFFF\u0071\u0075\u0062\u0075\u0074\u0073\uFFFF" +
"\u049b\u04b7\u04c8\u0513\u05d1\u05d3\u05d5\u05d6\u05d7\u05dd\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062d\u062f\u0631\u0632\u0633\u0634\u0635\u0637\u0639\u063a\u063d\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u064a\u064f\u0650\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0698\u06a1\u06a9\u06be\u06c6\u06c9\u06cc\u06ce\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7" + "\u0068\u0069\u0072\u0069\u0071\uFFFF\u0072\u0061\u0066\u0065\uFFFF\u0073\u0065\u0067\u006f\u006c\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0070\u0061\u0074\u0061\u0068\uFFFF\u0070\u0061\u0074\u0061\u0068\uFFFF\u0074\u0073\u0065\u0072\u0065\uFFFF\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0073\u0068\u0065\u0076\u0061\u066e\u067e\u06c1\u0698\u0640\u0636" +
"\u06f8\u06f9\u0901\u0902\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090f\u0910\u0913\u0914\u0915\u0916\u0917\u0918\u091a\u091b\u091c\u091d\u091f\u0921\u0922\u0923\u0925\u0926\u0928\u092a\u092b\u092c\u092f\u0930\u0933\u0935\u0936\u0937\u093c\u093d\u093e\u093f\u0940\u0941\u0943\u0947\u0948\u094b\u094c\u0953\u0956\u0962\u0964\u0970\u0b92\u0b9a\u0baf\u0bb3\u0bb5\u2020\u20ac\u20b9\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197" + "\u0638\u0621\u06a4\u063a\u06a9\u06ba\u06be\u06cc\u0643\u064a\u0900\u0955\u0972\u0911\u0973\u0974\u0976\u0977\u0960\u0961\u090d\u090e\u0912\u0975\u097b\u097c\uFFFF\u0936\u094d\u091a\u0979\u0978\u097e\uFFFF\u0924\u094d\u0930\uFFFF\u0926\u094d\u0930\uFFFF\u092a\u094d\u0930\u097f\u097a\uFFFF\u0936\u094d\u0930\uFFFF\u0915\u094d\u0937\u094e\u097d\u0949\u093a\u093b\u0904\u0944\u0945\u0946\u094a\u094f\u0954\u0957\u0963\u0965\u0971\u21d4" +
"\u2198\u2199\u2203\u2206\u2207\u2227\u2228\u2229\u222a\u222b\u2282\u2283\u22a4\u22b7\u22c4\u235d\u2375\u237a\u2395\ua649\ua651\ua657\ua67d\uFFFF\u006e\u0062\u0073\u0070\uFFFF\u0066\u0031\u0030\uFFFF\u0066\u0031\uFFFF\u0066\u0032\uFFFF\u0066\u0033\uFFFF\u0066\u0034\uFFFF\u0066\u0035\uFFFF\u0066\u0036\uFFFF\u0066\u0037\uFFFF\u0066\u0038\uFFFF\u0066\u0039\uFFFF\u007a\u0077\u006e\u006a\u20b1\u20b4\u20bf\uFFFF\u0072\u0065\u006d\u006f" + "\u21d5\u21d6\u21d7\u21d8\u21d9\u22c0\u22c1\u22c2\u22c3\u222e\u22b6\u044b\u0483\u00000123456789\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u00000123456789\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u00000123456789\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb" +
"\u0076\u0065\u0064\u2213\u2219\u03f4\u220f\u2211\u03d0\u0263\u03f5\u03d1\u03f0\u03d6\u03f1\u03c2\u03d2\u03d5\uFFFF\ua641\u0456\u0458\u046b\u0467\u047b\u0455\uFFFF\ua64b\u04bb\u044c\uFFFF\ua651\u044a\u0454\u0438\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0063\u0079\u0072\u0069\u006c\u006c\u0069\u0063\u005f\u0076\u007a\u006d\u0065\u0074\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0073\u0065\u0067\u006f" + "\u0aec\u0aed\u0aee\u0aef\u00000123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u00000123456789\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u00000123456789\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u00000123" +
"\u006c\uFFFF\u0064\u0061\u0067\u0065\u0073\u0068\uFFFF\u0068\u006f\u006c\u0061\u006d\uFFFF\u0071\u0075\u0062\u0075\u0074\u0073\uFFFF\u0068\u0069\u0072\u0069\u0071\uFFFF\u0072\u0061\u0066\u0065\uFFFF\u0073\u0065\u0067\u006f\u006c\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0070\u0061\u0074\u0061\u0068\uFFFF\u0070\u0061\u0074\u0061\u0068\uFFFF\u0074\u0073\u0065\u0072\u0065\uFFFF\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0068\u0061" + "456789\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0000\u00df\u0131\u01f0\u0237\u02b0\u02b2\u02b3\u02b7\u02e1\u0905\u0907\u0909\u090b\u090c\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0924\u0926\u0928\u092c\u092e\u0932\u0938\u0939\u093f\u0941\u0943\u0945\u0947\u0949\u094b\u0952\u0962\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa4\u0aa6\u0aa8\u0aaa\u0aac" +
"\u0074\u0061\u0066\u005f\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0073\u0068\u0065\u0076\u0061\u066e\u067e\u06c1\u0698\u0636\u0638\u0621\u06a4\u063a\u06a9\u0640\u06ba\u06be\u06cc\u0643\u0647\u064a\u0900\u0955\u0972\u0911\u0973\u0974\u0976\u0977\u0960\u0961\u090d\u090e\u0912\u0975\u097b\u097c\uFFFF\u0936\u094d\u091a\u0979\u0978\u097e\uFFFF\u0924\u094d\u0930\uFFFF\u0926\u094d\u0930\uFFFF\u092a\u094d\u0930\u097f\u097a\uFFFF\u0936" + "\u0aae\u0ab2\u0ab8\u0ab9\u0abf\u0ac1\u0ac7\u0acb\u0b92\u0b9a\u0baf\u0bb3\u0bb5\u0bf9\u1d43\u1d47\u1d48\u1d49\u1d4d\u1d4f\u1d50\u1d52\u1d56\u1d57\u1d58\u1d5b\u1d60\u1d9c\u1da0\u1dbe\u1e97\u1e98\u1e99\u2071\u207f\u20b9\u2190\u2191\u2192\u2193\u2196\u2197\u2198\u2199\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\uFFFF\u004a\u030c\uFFFF\u004a\u0307\u1d34\u1d36\u1d3f\u1d42\u1d38\u0906\u0908\u090a\u0910\u0914\u0916" +
"\u094d\u0930\uFFFF\u0915\u094d\u0937\u094e\u097d\u0949\u093a\u093b\u0904\u0944\u0945\u0946\u094a\u094f\u0954\u0957\u0963\u0965\u0971\uFFFF\u0bd0\uFFFF\u0bf2\uFFFF\u0bf0\uFFFF\u0bf1\uFFFF\u0bf3\u21d4\u21d5\u21d6\u21d7\u21d8\u21d9\u22c0\u22c1\u22c2\u22c3\u222e\u22b6\u044b\u044f\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0063\u0079\u0072\u0069\u006c\u006c\u0069\u0063\u005f\u0074\u0069\u0074\u006c\u006f\u0000" + "\u0918\u091b\u091d\u0920\u0922\u0925\u0927\u0923\u092d\u0902\u0933\u0936\u0903\u0940\u0942\u0948\u094c\u0951\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b\u0a9d\u0aa0\u0aa2\u0aa5\u0aa7\u0aa3\u0aab\u0aad\u0a82\u0ab3\u0ab6\u0a83\u0ac0\u0ac2\u0ac8\u0acc\uFFFF\u0bd0\uFFFF\u0bf2\uFFFF\u0bf0\uFFFF\u0bf1\uFFFF\u0bf3\u1d2c\u1d2e\u1d30\u1d31\u1d33\u1d37\u1d39\u1d3c\u1d3e\u1d40\u1d41\u2c7d\u1db2\uFFFF\ua7f2\uFFFF\ua7f3\u1d23\uFFFF\u0054" +
"0123456789\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u00000123456789\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u00000123456789\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0000012345678" + "\u0308\uFFFF\u0057\u030a\uFFFF\u0059\u030a\u1d35\u1d3a\u2550\u2551\u2554\u2557\u255a\u255d\u2560\u2563\u2566\u2569\u256c").toCharArray();
"9\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u00000123456789\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u00000123456789\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u00000123456789\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed" +
"\u0bee\u0bef\u0000\u00df\u0131\u01f0\u0237\u02b0\u02b2\u02b3\u02b7\u02e1\u0905\u0907\u0909\u090b\u090c\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0924\u0926\u0928\u092c\u092e\u0932\u0938\u0939\u093f\u0941\u0943\u0945\u0947\u0949\u094b\u0952\u0962\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa4\u0aa6\u0aa8\u0aaa\u0aac\u0aae\u0ab2\u0ab8\u0ab9\u0abf\u0ac1\u0ac7\u0acb\u0bf9\u1d43\u1d47\u1d48\u1d49\u1d4d" +
"\u1d4f\u1d50\u1d52\u1d56\u1d57\u1d58\u1d5b\u1d60\u1d9c\u1da0\u1dbe\u1e97\u1e98\u1e99\u2071\u207f\u20b9\u2190\u2191\u2192\u2193\u2196\u2197\u2198\u2199\u2208\u220b\u2282\u2283\u2286\u2287\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\ud835\uFFFF\u004a\u030c\uFFFF\u004a\u0307\u1d34\u1d36\u1d3f\u1d42\u1d38\u0906\u0908\u090a\u0910\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0925\u0927\u0923\u092d\u0902\u0933\u0936" +
"\u0903\u0940\u0942\u0948\u094c\u0951\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b\u0a9d\u0aa0\u0aa2\u0aa5\u0aa7\u0aa3\u0aab\u0aad\u0a82\u0ab3\u0ab6\u0a83\u0ac0\u0ac2\u0ac8\u0acc\u1d2c\u1d2e\u1d30\u1d31\u1d33\u1d37\u1d39\u1d3c\u1d3e\u1d40\u1d41\u2c7d\u1db2\uFFFF\ua7f2\uFFFF\ua7f3\u1d23\uFFFF\u0054\u0308\uFFFF\u0057\u030a\uFFFF\u0059\u030a\u1d35\u1d3a\u2550\u2551\u2554\u2557\u255a\u255d\u2560\u2563\u2566\u2569\u256c\u0000\udd57" +
"\udd58\udd64\udd68\udd69\uFFFF\ud835\udd3d\uFFFF\ud835\udd3e\uFFFF\ud835\udd4a\uFFFF\ud835\udd4e\uFFFF\ud835\udd4f").toCharArray();
public static final char[] edges = public static final char[] edges =
("\u0001\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0059\u005a\u005b\\\u005d\u005e\u005f\u0060\u0061\u0062\u0063\u0064\u0067\u0068\u006b\u006e\u006f\u0072\u0075\u0078\u007b\u007e\u0081\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + ("\u0001\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0059\u005a\u005b\\\u005d\u005e\u005f\u0060\u0061\u0062\u0063\u0064\u0067\u0068\u006b\u006e\u006f\u0072\u0075\u0078\u007b\u007e\u0081\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
@@ -145,110 +140,105 @@ public final class ComposeKeyData
"\u0356\u043f\u0440\u035a\u0441\u0442\u0443\u0444\u0445\u0354\u0446\u0447\u0448\u0357\u0358\u0359\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0460\u0461\u0462\u0463\u0464\u0465\u0466\u0467\u0468\u0469\u046a\u046b\u046d\u046e\u046f\u0470\u0471\u0472\u0473\u0462\u0474\u0475\u0476\u0477\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + "\u0356\u043f\u0440\u035a\u0441\u0442\u0443\u0444\u0445\u0354\u0446\u0447\u0448\u0357\u0358\u0359\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0460\u0461\u0462\u0463\u0464\u0465\u0466\u0467\u0468\u0469\u046a\u046b\u046d\u046e\u046f\u0470\u0471\u0472\u0473\u0462\u0474\u0475\u0476\u0477\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0012\u048a\u048b\u048c\u048d\u048e\u048f\u0490" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0012\u048a\u048b\u048c\u048d\u048e\u048f\u0490" +
"\u0491\u0180\u0199\u0052\u0492\u005b\u0493\u032d\u02ff\u0300\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u04c3\u04c4\u04c5\u04c8\u04c9\u04ca\u04cb\u04ce\u04d1\u04d4\u04d7\u04da\u04db\u04de\u04df\u04e0\u04e1\u04e2\u04e3\u04e4\u0050\u0492\u02c5\u0054\u032b\u032e\u032f\u0115\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u04f2\u00cf\u04f3\u04f4\u04f5\u0001\u0001\u0003\u0000\u0000" + "\u0491\u0180\u0199\u0052\u0492\u005b\u0493\u032d\u02ff\u0300\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u04c3\u04c4\u04c5\u04c8\u04c9\u04ca\u04cb\u04ce\u04d1\u04d4\u04d7\u04da\u04db\u04de\u04df\u04e0\u04e1\u04e2\u04e3\u04e4\u0050\u0492\u02c5\u0054\u032b\u032e\u032f\u0115\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u04f2\u00cf\u04f3\u04f4\u04f5\u0001\u0001\u0003\u0000\u0000" +
"\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0149\u063f\u0650\u069c\u0708\u0717\u071a\u084f\u0c07\u0c28\u0c37\u0c42\u0c8e\u0ccd\u0d55\u0d97\u0d9d\u0db3\u0db9\u0dc1\u0dc4\u0dc9\u0dcc\u0dcf\u0dd9\u0df0" + "\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0136\u062c\u063d\u0689\u06f5\u0704\u0707\u083c\u0bf4\u0c15\u0c24\u0c2f\u0c6f\u0cae\u0d24\u0d66\u0d6c\u0d82\u0d88\u0d90\u0d93\u0d98\u0d9b\u0d9e\u0da8\u0dbf" +
"\u0e1d\u0e50\u0e6f\u0eae\u0ec8\u0ecc\u0edd\u0ee5\u0ef8\u0f06\u0f11\u0f13\u0f26\u0f29\u0f2c\u0f3e\u0f40\u0f50\u0f6d\u0f75\u0f79\u0f84\u0f93\u0fa3\u0ff9\u0ffe\u1002\u1004\u100c\u1013\u1016\u102b\u102d\u10c2\u1169\u1252\u1265\u128f\u12c6\u12d0\u12e1\u12ef\u12fb\u12fd\u130d\u1310\u1314\u131c\u1320\u1327\u1342\u134c\u1351\u135d\u136a\u1385\u13a8\u13aa\u13ae\u13b5\u13b9\u13bc\u13d8\u1454\u146f\u14be\u1580\u1598\u159b\u159e\u15a0\u15a2" + "\u0dec\u0e1f\u0e3e\u0e7d\u0e94\u0e98\u0ea9\u0eb0\u0ec2\u0ed0\u0edb\u0edd\u0ef0\u0ef3\u0ef6\u0f08\u0f0a\u0f18\u0f34\u0f3c\u0f3f\u0f49\u0f57\u0f63\u0fb9\u0fbe\u0fc2\u0fc4\u0fcc\u0fd2\u0fd5\u0fea\u0fec\u1081\u1128\u1211\u1223\u124d\u1284\u128e\u129f\u12ad\u12b4\u12b6\u12c6\u12c9\u12cd\u12d5\u12d9\u12e0\u12fb\u1305\u130a\u1316\u1320\u133b\u135e\u1360\u1364\u136b\u136f\u1372\u138e\u140a\u1425\u1474\u1536\u154e\u1551\u1554\u1556\u1558" +
"\u15a4\u15a7\u15a9\u15ac\u15ae\u15b0\u15b2\u15b4\u165f\u1661\u1664\u1666\u166e\u1677\u168e\u169b\u16ae\u16b0\u16b2\u16b7\u16bc\u16be\u16ca\u16d0\u16d2\u16db\u16e2\u16e6\u16e8\u16f4\u16ff\u1702\u1704\u1708\u171e\u173e\u1759\u1762\u176f\u1781\u1783\u1787\u178b\u179e\u17a6\u17ab\u17ad\u17c4\u17e3\u17e7\u17ef\u1809\u1826\u1880\u1883\u1885\u1898\u189d\u18a1\u18a4\u18a6\u18a8\u18ac\u18b3\u18b7\u18bb\u18fe\u1908\u1912\u191c\u1951\u195a" + "\u155a\u155d\u155f\u1562\u1564\u1566\u1568\u156a\u1615\u1617\u161a\u161c\u161e\u1620\u1623\u1625\u1642\u165d\u1666\u1673\u1685\u1687\u168b\u168f\u16a2\u16aa\u16af\u16b1\u16c8\u16e7\u16eb\u16f1\u170b\u1728\u1782\u1785\u1787\u1791\u1795\u179a\u17a0\u17a2\u17a4\u17a8\u17af\u17b3\u17b7\u17fa\u1804\u180e\u1818\u184d\u1856\u1859\u186b\u1871\u1874\u1876\u18b0\u18b4\u18b7\u18ba\u18d1\u1910\u192d\u1949\u1965\u1968\u1971\u1973\u198f\u19b1" +
"\u195d\u196f\u1975\u1978\u197a\u19b4\u19b8\u19bb\u19be\u19d5\u1a14\u1a31\u1a4d\u1a69\u1a6c\u1a75\u1a77\u1a93\u1ab5\u1abf\u1ac8\u1ace\u1ae5\u1aec\u1af1\u1afe\u1b03\u1b0a\u1b0f\u1b12\u1b15\u1b18\u1b1b\u1b22\u1b25\u1b2a\u1b2d\u1b34\u1b37\u1b3e\u1b41\u1b44\u1b47\u1b4a\u1b4d\u1b50\u1b53\u1b56\u1b59\u1b64\u1b67\u1b6a\u1b73\u1b78\u1b81\u1b86\u1ba7\u1ba9\u1bca\u1bcc\u1be3\u1be8\u1bed\u1bf2\u1bf5\u1bfb\u1bfd\u1c00\u1c03\u1c06\u1c09\u1c10" + "\u19bb\u19c4\u19ca\u19e1\u19e8\u19ed\u19fa\u19ff\u1a06\u1a0b\u1a0e\u1a11\u1a14\u1a17\u1a1e\u1a21\u1a26\u1a29\u1a30\u1a33\u1a3a\u1a3d\u1a40\u1a43\u1a46\u1a49\u1a4c\u1a4f\u1a52\u1a55\u1a60\u1a63\u1a66\u1a6f\u1a74\u1a7d\u1a82\u1aa3\u1aa5\u1ac6\u1ac8\u1adf\u1ae4\u1ae9\u1aee\u1af1\u1af7\u1af9\u1afc\u1aff\u1b02\u1b05\u1b0c\u1b13\u1b1c\u1b23\u1b34\u1b36\u1b41\u1b52\u1b55\u1b64\u1b6b\u1b6e\u1b7b\u1b84\u1b8d\u1b8f\u1b9e\u1ba3\u1bcc\u1bce" +
"\u1c17\u1c20\u1c27\u1c38\u1c3a\u1c45\u1c56\u1c59\u1c68\u1c6f\u1c72\u1c7f\u1c88\u1c91\u1c93\u1ca2\u1ca7\u1cd0\u1cd2\u1cd5\u1cd9\u1cdb\u1cee\u1cf9\u1d04\u1d0d\u1d12\u1d1b\u1d1e\u1d20\u1d22\u1d27\u1d2b\u1d2f\u1d33\u1d37\u1d3a\u1d3f\u1d45\u1d48\u1d4a\u1d4d\u1d5a\u1d5d\u1d60\u1d65\u1d6a\u1d6c\u1d6e\u1d71\u1d74\u1d77\u1d7a\u1d7e\u1d80\u1d83\u1d86\u1d89\u1d8c\u1d8f\u1d92\u1d95\u1d98\u1d9b\u1d9e\u1da3\u1da7\u1daa\u1dad\u1db0\u1db3\u1db6" + "\u1bd1\u1bd5\u1bd7\u1bea\u1bf5\u1c00\u1c09\u1c0e\u1c17\u1c1a\u1c1c\u1c1e\u1c23\u1c27\u1c2b\u1c2f\u1c33\u1c36\u1c3b\u1c41\u1c44\u1c46\u1c49\u1c56\u1c59\u1c5c\u1c61\u1c66\u1c68\u1c6a\u1c6d\u1c70\u1c73\u1c76\u1c7a\u1c7c\u1c7f\u1c82\u1c85\u1c88\u1c8b\u1c8e\u1c91\u1c94\u1c97\u1c9a\u1c9f\u1ca3\u1ca6\u1ca9\u1cac\u1caf\u1cb2\u1cb8\u1cbc\u1cbf\u1cc2\u1cc5\u1cc8\u1ccb\u1cce\u1cd1\u1cd5\u1cd7\u1cd9\u1cdb\u1cf2\u1cfc\u0009\u0635\u0636\u0637" +
"\u1dbc\u1dc0\u1dc3\u1dc6\u1dc9\u1dcc\u1dcf\u1dd2\u1dd5\u1dd9\u1ddb\u1ddd\u1ddf\u1df6\u1e00\u0009\u0648\u0649\u064a\u064b\u064c\u064d\u064e\u064f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u067f\u0680\u0687\u0688\u0689\u068a\u068b\u068c\u068d\u068e\u068f\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069a\u069b\u023e\u023f\u0240\u0241\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d" + "\u0638\u0639\u063a\u063b\u063c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u066c\u066d\u0674\u0675\u0676\u0677\u0678\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u023e\u023f\u0240\u0241\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u0672\u0252\u0673\u0253\u0001\u0005\u0672\u0673\u0252\u0253\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u024e\u024f\u0250\u0685\u0252\u0686\u0253\u0001\u0005\u0685\u0686\u0252\u0253\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0041\u06dd\u06dd\u06de\u06df\u06e0\u06e1\u06e2\u06e3\u06e4\u06e5\u06e6\u06e7\u06e8\u06e9\u06ea\u06eb\u04c4\u04c8\u04c9\u04ca\u04da\u04de\u04df\u04e0\u04e1\u04e2\u06f0\u06f4\u06de\u06f3\u0492\u06ee\u06ef\u06f7\u06f8" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0041\u06ca\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u06d3\u06d4\u06d5\u06d6\u06d7\u06d8\u04c4\u04c8\u04c9\u04ca\u04da\u04de\u04df\u04e0\u04e1\u04e2\u06dd\u06e1\u06cb\u06e0\u0492\u06db\u06dc\u06e4\u06e5\u04e5\u04e6\u04e8\u06e6\u06e7\u06e8\u06e9\u06ea\u06eb\u06ec\u06ed\u06ee\u06ef\u06f0\u04e9\u06f1\u04ea\u04eb\u04ec" +
"\u04e5\u04e6\u04e8\u06f9\u06fa\u06fb\u06fc\u06fd\u06fe\u06ff\u0700\u0701\u0702\u0703\u04e9\u0704\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u0705\u0706\u04f2\u0707\u00cf\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u06ee\u06ef\u0001\u0001\u0003\u06f3\u0492\u0001\u0003\u06ee\u06ef\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + "\u04ed\u04ee\u04ef\u04f0\u04f1\u06f2\u06f3\u04f2\u06f4\u00cf\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u06db\u06dc\u0001\u0001\u0003\u06e0\u0492\u0001\u0003\u06db\u06dc\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u06fd\u06fe\u06ff\u0700\u0701\u0702\u0703\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0706\u0001\u007b" +
"\u0008\u0710\u0711\u0712\u0713\u0714\u0715\u0716\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0719\u0001\u007b\u0795\u07a1\u07a2\u07bf\u07da\u07e1\u07e2\u07e6\u07e7\u07e8\u07e9\u07ea\u07eb\u07ec\u07ed\u07f0\u07f1\u07f2\u07f3\u07f4\u07f5\u07f6\u07f7\u07f8\u07f9\u07fa\u07fb\u07fc\u0806\u0037\u080d\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u0811\u0818\u081d\u0803\u0821" + "\u0782\u078e\u078f\u07ac\u07c7\u07ce\u07cf\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u07e9\u07f3\u0037\u07fa\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u07fe\u0805\u080a\u07f0\u080e\u080f\u080d\u07f1\u078b\u07f2\u0803\u07d2\u078c\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u07fd" +
"\u0822\u0820\u0804\u079e\u0805\u0816\u07e5\u079f\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0810\u0055\u080b\u0059\u080c\u005a\u0817\u005b\u07df\\\u07e0\u005d\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u005e\u005f\u0060\u0061\u0062\u0063\u082a\u082b\u082e\u082f\u0832\u0835\u0836\u0839\u083c\u083f\u0842\u0845\u0848\u0064\u0067\u0068\u006b\u006e\u006f\u084b\u0072\u0075\u0078\u007b\u007e\u084e\u0008\u079d\u079e" + "\u0055\u07f8\u0059\u07f9\u005a\u0804\u005b\u07cc\\\u07cd\u005d\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u005e\u005f\u0060\u0061\u0062\u0063\u0817\u0818\u081b\u081c\u081f\u0822\u0823\u0826\u0829\u082c\u082f\u0832\u0835\u0064\u0067\u0068\u006b\u006e\u006f\u0838\u0072\u0075\u0078\u007b\u007e\u083b\u0008\u078a\u078b\u078c\u0050\u0054\u078d\u04e7\u0001\u0001\u0001\u0001\u0001\u000f\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5" +
"\u079f\u0050\u0054\u07a0\u04e7\u0001\u0001\u0001\u0001\u0001\u000f\u07b1\u07b2\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u07ba\u07bb\u07bc\u07bd\u07be\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u07df\u07e0\\\u005d\u0001" + "\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u07ba\u07bb\u07bc\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u07cc\u07cd\\\u005d\u0001\u0001\u0001\u0003\u07d2\u0053\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001" +
"\u0001\u0001\u0003\u07e5\u0053\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0803\u0804\u0805\u004b\u004f\u0051\u0001\u0001\u0001\u0005\u080b\u080c\u0059\u005a\u0001\u0001\u0003\u0810\u0055\u0001\u0005\u0816\u0817\u0052\u005b\u0001\u0001\u0005\u080b\u080c\u0059\u005a\u0003\u0820\u004e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u07f0\u07f1\u07f2\u004b\u004f\u0051\u0001\u0001\u0001\u0005\u07f8\u07f9\u0059\u005a\u0001\u0001\u0003\u07fd\u0055\u0001\u0005\u0803\u0804\u0052\u005b\u0001\u0001\u0005\u07f8\u07f9\u0059\u005a\u0003\u080d\u004e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000" +
"\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u00c1\u0649\u0910\u0911\u0916\u0917\u091a\u0945\u0970\u099b\u09c6\u09cd\u09d0\u09d3\u09d6\u09d9\u09dc\u09df\u09e2\u09e5\u09e8\u09eb\u09ee\u09f1\u09f4\u09f7\u09fa\u09fd\u0a00\u0a03\u0a06\u0a09\u0a0c" + "\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u00c1\u0636\u08fd\u08fe\u0903\u0904\u0907\u0932\u095d\u0988\u09b3\u09ba\u09bd\u09c0\u09c3\u09c6\u09c9\u09cc\u09cf\u09d2\u09d5\u09d8\u09db\u09de\u09e1\u09e4\u09e7\u09ea\u09ed\u09f0\u09f3\u09f6\u09f9\u09fc\u09ff\u0a02\u0a05\u0a08\u0a0b\u0a0e\u0a11\u0a14\u0a17\u0a1a\u0a1d\u0a20\u0a23\u0a26\u0a29\u0a2c\u0a2f\u0a32" +
"\u0a0f\u0a12\u0a15\u0a18\u0a1b\u0a1e\u0a21\u0a24\u0a27\u0a2a\u0a2d\u0a30\u0a33\u0a36\u0a39\u0a3c\u0a3f\u0a42\u0a45\u0a48\u0a4b\u0a4e\u0a51\u0a54\u0a57\u0a5a\u0a5d\u0a60\u0a63\u0a66\u0a69\u0a6c\u0a6f\u0a72\u0a75\u0a76\u0a77\u0a78\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a81\u0a82\u0a83\u0a84\u0a85\u0a8c\u0a93\u0a9a\u0aa1\u0aa8\u0aaf\u0ab6\u0abd\u0ac4\u0acb\u0ad2\u0ad9\u0ae0\u0ae7\u0aea\u0aed\u0af0\u0af3\u0af6\u0af9\u0afc" + "\u0a35\u0a38\u0a3b\u0a3e\u0a41\u0a44\u0a47\u0a4a\u0a4d\u0a50\u0a53\u0a56\u0a59\u0a5c\u0a5f\u0a62\u0a63\u0a64\u0a65\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a70\u0a71\u0a72\u0a79\u0a80\u0a87\u0a8e\u0a95\u0a9c\u0aa3\u0aaa\u0ab1\u0ab8\u0abf\u0ac6\u0acd\u0ad4\u0ad7\u0ada\u0add\u0ae0\u0ae3\u0ae6\u0ae9\u0aec\u0aef\u0af2\u0af5\u0af8\u0afb\u0afe\u0b01\u0b04\u0b07\u0b0a\u0b0d\u0b10\u0b13\u0b16\u0b19\u0b1c\u0b1f\u0b22" +
"\u0aff\u0b02\u0b05\u0b08\u0b0b\u0b0e\u0b11\u0b14\u0b17\u0b1a\u0b1d\u0b20\u0b23\u0b26\u0b29\u0b2c\u0b2f\u0b32\u0b35\u0b38\u0b3b\u0b3e\u0b41\u0b44\u0b47\u0b4a\u0b4d\u0b50\u0b53\u0b56\u0b59\u0b5c\u0b5f\u0b62\u0b65\u0b68\u0b6b\u0b6e\u0b71\u0b74\u0b77\u0b7a\u0b7d\u0b80\u0b83\u0b86\u0b89\u0b8c\u0b8f\u0b92\u0b95\u0b98\u0b9b\u0b9e\u0ba1\u0ba4\u0ba7\u0baa\u0bad\u0bb0\u0bb3\u0bb6\u0bb9\u0bbc\u0bbf\u0bc2\u0bc5\u0bc8\u0bcb\u0bce\u0bd1\u0bd4" + "\u0b25\u0b28\u0b2b\u0b2e\u0b31\u0b34\u0b37\u0b3a\u0b3d\u0b40\u0b43\u0b46\u0b49\u0b4c\u0b4f\u0b52\u0b55\u0b58\u0b5b\u0b5e\u0b61\u0b64\u0b67\u0b6a\u0b6d\u0b70\u0b73\u0b76\u0b79\u0b7c\u0b7f\u0b82\u0b85\u0b88\u0b8b\u0b8e\u0b91\u0b94\u0b97\u0b9a\u0b9d\u0ba0\u0ba3\u0ba6\u0ba9\u0bac\u0baf\u0bb2\u0bb5\u0bb8\u0bbb\u0bbe\u0bc1\u0bc4\u0bc7\u0bca\u0bcd\u0bd0\u0bd3\u0bd6\u0bd9\u0bdc\u0bdf\u0be2\u0be5\u0be8\u0beb\u0bee\u0bf1\u0001\u0002\u0900" +
"\u0bd7\u0bda\u0bdd\u0be0\u0be3\u0be6\u0be9\u0bec\u0bef\u0bf2\u0bf5\u0bf8\u0bfb\u0bfe\u0c01\u0c04\u0001\u0002\u0913\u0003\u0000\u0000\u0001\u0002\u0919\u0001\u000c\u0926\u0927\u092a\u092d\u0930\u0933\u0936\u0939\u093c\u093f\u0942\u0001\u0002\u0929\u0001\u0002\u092c\u0001\u0002\u092f\u0001\u0002\u0932\u0001\u0002\u0935\u0001\u0002\u0938\u0001\u0002\u093b\u0001\u0002\u093e\u0001\u0002\u0941\u0001\u0002\u0944\u0001\u000c\u0951\u0952" + "\u0003\u0000\u0000\u0001\u0002\u0906\u0001\u000c\u0913\u0914\u0917\u091a\u091d\u0920\u0923\u0926\u0929\u092c\u092f\u0001\u0002\u0916\u0001\u0002\u0919\u0001\u0002\u091c\u0001\u0002\u091f\u0001\u0002\u0922\u0001\u0002\u0925\u0001\u0002\u0928\u0001\u0002\u092b\u0001\u0002\u092e\u0001\u0002\u0931\u0001\u000c\u093e\u093f\u0942\u0945\u0948\u094b\u094e\u0951\u0954\u0957\u095a\u0001\u0002\u0941\u0001\u0002\u0944\u0001\u0002\u0947\u0001" +
"\u0955\u0958\u095b\u095e\u0961\u0964\u0967\u096a\u096d\u0001\u0002\u0954\u0001\u0002\u0957\u0001\u0002\u095a\u0001\u0002\u095d\u0001\u0002\u0960\u0001\u0002\u0963\u0001\u0002\u0966\u0001\u0002\u0969\u0001\u0002\u096c\u0001\u0002\u096f\u0001\u000c\u097c\u097d\u0980\u0983\u0986\u0989\u098c\u098f\u0992\u0995\u0998\u0001\u0002\u097f\u0001\u0002\u0982\u0001\u0002\u0985\u0001\u0002\u0988\u0001\u0002\u098b\u0001\u0002\u098e\u0001\u0002" + "\u0002\u094a\u0001\u0002\u094d\u0001\u0002\u0950\u0001\u0002\u0953\u0001\u0002\u0956\u0001\u0002\u0959\u0001\u0002\u095c\u0001\u000c\u0969\u096a\u096d\u0970\u0973\u0976\u0979\u097c\u097f\u0982\u0985\u0001\u0002\u096c\u0001\u0002\u096f\u0001\u0002\u0972\u0001\u0002\u0975\u0001\u0002\u0978\u0001\u0002\u097b\u0001\u0002\u097e\u0001\u0002\u0981\u0001\u0002\u0984\u0001\u0002\u0987\u0001\u000c\u0994\u0995\u0998\u099b\u099e\u09a1\u09a4" +
"\u0991\u0001\u0002\u0994\u0001\u0002\u0997\u0001\u0002\u099a\u0001\u000c\u09a7\u09a8\u09ab\u09ae\u09b1\u09b4\u09b7\u09ba\u09bd\u09c0\u09c3\u0001\u0002\u09aa\u0001\u0002\u09ad\u0001\u0002\u09b0\u0001\u0002\u09b3\u0001\u0002\u09b6\u0001\u0002\u09b9\u0001\u0002\u09bc\u0001\u0002\u09bf\u0001\u0002\u09c2\u0001\u0002\u09c5\u0001\u0003\u09c9\u09ca\u0001\u0002\u09cc\u0001\u0002\u09cf\u0001\u0002\u09d2\u0001\u0002\u09d5\u0001\u0002\u09d8" + "\u09a7\u09aa\u09ad\u09b0\u0001\u0002\u0997\u0001\u0002\u099a\u0001\u0002\u099d\u0001\u0002\u09a0\u0001\u0002\u09a3\u0001\u0002\u09a6\u0001\u0002\u09a9\u0001\u0002\u09ac\u0001\u0002\u09af\u0001\u0002\u09b2\u0001\u0003\u09b6\u09b7\u0001\u0002\u09b9\u0001\u0002\u09bc\u0001\u0002\u09bf\u0001\u0002\u09c2\u0001\u0002\u09c5\u0001\u0002\u09c8\u0001\u0002\u09cb\u0001\u0002\u09ce\u0001\u0002\u09d1\u0001\u0002\u09d4\u0001\u0002\u09d7\u0001" +
"\u0001\u0002\u09db\u0001\u0002\u09de\u0001\u0002\u09e1\u0001\u0002\u09e4\u0001\u0002\u09e7\u0001\u0002\u09ea\u0001\u0002\u09ed\u0001\u0002\u09f0\u0001\u0002\u09f3\u0001\u0002\u09f6\u0001\u0002\u09f9\u0001\u0002\u09fc\u0001\u0002\u09ff\u0001\u0002\u0a02\u0001\u0002\u0a05\u0001\u0002\u0a08\u0001\u0002\u0a0b\u0001\u0002\u0a0e\u0001\u0002\u0a11\u0001\u0002\u0a14\u0001\u0002\u0a17\u0001\u0002\u0a1a\u0001\u0002\u0a1d\u0001\u0002\u0a20" + "\u0002\u09da\u0001\u0002\u09dd\u0001\u0002\u09e0\u0001\u0002\u09e3\u0001\u0002\u09e6\u0001\u0002\u09e9\u0001\u0002\u09ec\u0001\u0002\u09ef\u0001\u0002\u09f2\u0001\u0002\u09f5\u0001\u0002\u09f8\u0001\u0002\u09fb\u0001\u0002\u09fe\u0001\u0002\u0a01\u0001\u0002\u0a04\u0001\u0002\u0a07\u0001\u0002\u0a0a\u0001\u0002\u0a0d\u0001\u0002\u0a10\u0001\u0002\u0a13\u0001\u0002\u0a16\u0001\u0002\u0a19\u0001\u0002\u0a1c\u0001\u0002\u0a1f\u0001" +
"\u0001\u0002\u0a23\u0001\u0002\u0a26\u0001\u0002\u0a29\u0001\u0002\u0a2c\u0001\u0002\u0a2f\u0001\u0002\u0a32\u0001\u0002\u0a35\u0001\u0002\u0a38\u0001\u0002\u0a3b\u0001\u0002\u0a3e\u0001\u0002\u0a41\u0001\u0002\u0a44\u0001\u0002\u0a47\u0001\u0002\u0a4a\u0001\u0002\u0a4d\u0001\u0002\u0a50\u0001\u0002\u0a53\u0001\u0002\u0a56\u0001\u0002\u0a59\u0001\u0002\u0a5c\u0001\u0002\u0a5f\u0001\u0002\u0a62\u0001\u0002\u0a65\u0001\u0002\u0a68" + "\u0002\u0a22\u0001\u0002\u0a25\u0001\u0002\u0a28\u0001\u0002\u0a2b\u0001\u0002\u0a2e\u0001\u0002\u0a31\u0001\u0002\u0a34\u0001\u0002\u0a37\u0001\u0002\u0a3a\u0001\u0002\u0a3d\u0001\u0002\u0a40\u0001\u0002\u0a43\u0001\u0002\u0a46\u0001\u0002\u0a49\u0001\u0002\u0a4c\u0001\u0002\u0a4f\u0001\u0002\u0a52\u0001\u0002\u0a55\u0001\u0002\u0a58\u0001\u0002\u0a5b\u0001\u0002\u0a5e\u0001\u0002\u0a61\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0002\u0a6b\u0001\u0002\u0a6e\u0001\u0002\u0a71\u0001\u0002\u0a74\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0a88\u0a89\u0001\u0002\u0a8b\u0001\u0003\u0a8f\u0a90\u0001\u0002\u0a92\u0001\u0003\u0a96\u0a97\u0001\u0002\u0a99\u0001\u0003\u0a9d\u0a9e\u0001\u0002\u0aa0\u0001\u0003\u0aa4\u0aa5\u0001\u0002\u0aa7\u0001\u0003\u0aab\u0aac\u0001\u0002\u0aae\u0001\u0003" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0a75\u0a76\u0001\u0002\u0a78\u0001\u0003\u0a7c\u0a7d\u0001\u0002\u0a7f\u0001\u0003\u0a83\u0a84\u0001\u0002\u0a86\u0001\u0003\u0a8a\u0a8b\u0001\u0002\u0a8d\u0001\u0003\u0a91\u0a92\u0001\u0002\u0a94\u0001\u0003\u0a98\u0a99\u0001\u0002\u0a9b\u0001\u0003\u0a9f\u0aa0\u0001\u0002\u0aa2\u0001\u0003\u0aa6\u0aa7\u0001\u0002\u0aa9\u0001\u0003\u0aad\u0aae\u0001\u0002\u0ab0" +
"\u0ab2\u0ab3\u0001\u0002\u0ab5\u0001\u0003\u0ab9\u0aba\u0001\u0002\u0abc\u0001\u0003\u0ac0\u0ac1\u0001\u0002\u0ac3\u0001\u0003\u0ac7\u0ac8\u0001\u0002\u0aca\u0001\u0003\u0ace\u0acf\u0001\u0002\u0ad1\u0001\u0003\u0ad5\u0ad6\u0001\u0002\u0ad8\u0001\u0003\u0adc\u0add\u0001\u0002\u0adf\u0001\u0003\u0ae3\u0ae4\u0001\u0002\u0ae6\u0001\u0002\u0ae9\u0001\u0002\u0aec\u0001\u0002\u0aef\u0001\u0002\u0af2\u0001\u0002\u0af5\u0001\u0002\u0af8" + "\u0001\u0003\u0ab4\u0ab5\u0001\u0002\u0ab7\u0001\u0003\u0abb\u0abc\u0001\u0002\u0abe\u0001\u0003\u0ac2\u0ac3\u0001\u0002\u0ac5\u0001\u0003\u0ac9\u0aca\u0001\u0002\u0acc\u0001\u0003\u0ad0\u0ad1\u0001\u0002\u0ad3\u0001\u0002\u0ad6\u0001\u0002\u0ad9\u0001\u0002\u0adc\u0001\u0002\u0adf\u0001\u0002\u0ae2\u0001\u0002\u0ae5\u0001\u0002\u0ae8\u0001\u0002\u0aeb\u0001\u0002\u0aee\u0001\u0002\u0af1\u0001\u0002\u0af4\u0001\u0002\u0af7\u0001" +
"\u0001\u0002\u0afb\u0001\u0002\u0afe\u0001\u0002\u0b01\u0001\u0002\u0b04\u0001\u0002\u0b07\u0001\u0002\u0b0a\u0001\u0002\u0b0d\u0001\u0002\u0b10\u0001\u0002\u0b13\u0001\u0002\u0b16\u0001\u0002\u0b19\u0001\u0002\u0b1c\u0001\u0002\u0b1f\u0001\u0002\u0b22\u0001\u0002\u0b25\u0001\u0002\u0b28\u0001\u0002\u0b2b\u0001\u0002\u0b2e\u0001\u0002\u0b31\u0001\u0002\u0b34\u0001\u0002\u0b37\u0001\u0002\u0b3a\u0001\u0002\u0b3d\u0001\u0002\u0b40" + "\u0002\u0afa\u0001\u0002\u0afd\u0001\u0002\u0b00\u0001\u0002\u0b03\u0001\u0002\u0b06\u0001\u0002\u0b09\u0001\u0002\u0b0c\u0001\u0002\u0b0f\u0001\u0002\u0b12\u0001\u0002\u0b15\u0001\u0002\u0b18\u0001\u0002\u0b1b\u0001\u0002\u0b1e\u0001\u0002\u0b21\u0001\u0002\u0b24\u0001\u0002\u0b27\u0001\u0002\u0b2a\u0001\u0002\u0b2d\u0001\u0002\u0b30\u0001\u0002\u0b33\u0001\u0002\u0b36\u0001\u0002\u0b39\u0001\u0002\u0b3c\u0001\u0002\u0b3f\u0001" +
"\u0001\u0002\u0b43\u0001\u0002\u0b46\u0001\u0002\u0b49\u0001\u0002\u0b4c\u0001\u0002\u0b4f\u0001\u0002\u0b52\u0001\u0002\u0b55\u0001\u0002\u0b58\u0001\u0002\u0b5b\u0001\u0002\u0b5e\u0001\u0002\u0b61\u0001\u0002\u0b64\u0001\u0002\u0b67\u0001\u0002\u0b6a\u0001\u0002\u0b6d\u0001\u0002\u0b70\u0001\u0002\u0b73\u0001\u0002\u0b76\u0001\u0002\u0b79\u0001\u0002\u0b7c\u0001\u0002\u0b7f\u0001\u0002\u0b82\u0001\u0002\u0b85\u0001\u0002\u0b88" + "\u0002\u0b42\u0001\u0002\u0b45\u0001\u0002\u0b48\u0001\u0002\u0b4b\u0001\u0002\u0b4e\u0001\u0002\u0b51\u0001\u0002\u0b54\u0001\u0002\u0b57\u0001\u0002\u0b5a\u0001\u0002\u0b5d\u0001\u0002\u0b60\u0001\u0002\u0b63\u0001\u0002\u0b66\u0001\u0002\u0b69\u0001\u0002\u0b6c\u0001\u0002\u0b6f\u0001\u0002\u0b72\u0001\u0002\u0b75\u0001\u0002\u0b78\u0001\u0002\u0b7b\u0001\u0002\u0b7e\u0001\u0002\u0b81\u0001\u0002\u0b84\u0001\u0002\u0b87\u0001" +
"\u0001\u0002\u0b8b\u0001\u0002\u0b8e\u0001\u0002\u0b91\u0001\u0002\u0b94\u0001\u0002\u0b97\u0001\u0002\u0b9a\u0001\u0002\u0b9d\u0001\u0002\u0ba0\u0001\u0002\u0ba3\u0001\u0002\u0ba6\u0001\u0002\u0ba9\u0001\u0002\u0bac\u0001\u0002\u0baf\u0001\u0002\u0bb2\u0001\u0002\u0bb5\u0001\u0002\u0bb8\u0001\u0002\u0bbb\u0001\u0002\u0bbe\u0001\u0002\u0bc1\u0001\u0002\u0bc4\u0001\u0002\u0bc7\u0001\u0002\u0bca\u0001\u0002\u0bcd\u0001\u0002\u0bd0" + "\u0002\u0b8a\u0001\u0002\u0b8d\u0001\u0002\u0b90\u0001\u0002\u0b93\u0001\u0002\u0b96\u0001\u0002\u0b99\u0001\u0002\u0b9c\u0001\u0002\u0b9f\u0001\u0002\u0ba2\u0001\u0002\u0ba5\u0001\u0002\u0ba8\u0001\u0002\u0bab\u0001\u0002\u0bae\u0001\u0002\u0bb1\u0001\u0002\u0bb4\u0001\u0002\u0bb7\u0001\u0002\u0bba\u0001\u0002\u0bbd\u0001\u0002\u0bc0\u0001\u0002\u0bc3\u0001\u0002\u0bc6\u0001\u0002\u0bc9\u0001\u0002\u0bcc\u0001\u0002\u0bcf\u0001" +
"\u0001\u0002\u0bd3\u0001\u0002\u0bd6\u0001\u0002\u0bd9\u0001\u0002\u0bdc\u0001\u0002\u0bdf\u0001\u0002\u0be2\u0001\u0002\u0be5\u0001\u0002\u0be8\u0001\u0002\u0beb\u0001\u0002\u0bee\u0001\u0002\u0bf1\u0001\u0002\u0bf4\u0001\u0002\u0bf7\u0001\u0002\u0bfa\u0001\u0002\u0bfd\u0001\u0002\u0c00\u0001\u0002\u0c03\u0001\u0002\u0c06\u0001\u0011\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27" + "\u0002\u0bd2\u0001\u0002\u0bd5\u0001\u0002\u0bd8\u0001\u0002\u0bdb\u0001\u0002\u0bde\u0001\u0002\u0be1\u0001\u0002\u0be4\u0001\u0002\u0be7\u0001\u0002\u0bea\u0001\u0002\u0bed\u0001\u0002\u0bf0\u0001\u0002\u0bf3\u0001\u0011\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0d\u0c0e\u0c0f\u0c10\u0c11\u0c12\u0c13\u0c14\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u0c1e\u0351" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u0c31\u0351\u0c34\u0c35\u0362\u0363\u04c3\u0c36\u0003\u0821\u004c\u0001\u0001\u0001\u0007\u0c3e\u0c3f\u0c40\u0c41\u02fd\u02fe\u0001\u0001\u0001\u0001\u0030\u064a\u06df\u07e1\u064a\u0c72\u0c73\u0c74\u0c75\u0c76\u0c77\u0c78\u0c79\u0c7a\u0c7b\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u033f\u013e\u013f\u0340\u0141\u0142\u0341\u0143\u0144" + "\u0c21\u0c22\u0362\u0363\u04c3\u0c23\u0003\u080e\u004c\u0001\u0001\u0001\u0007\u0c2b\u0c2c\u0c2d\u0c2e\u02fd\u02fe\u0001\u0001\u0001\u0001\u002a\u0637\u06cc\u07ce\u0637\u0c59\u0c5a\u0c5b\u0c5c\u0c5d\u0c5e\u0c5f\u0c60\u0c61\u0c62\u0c63\u0c64\u0c65\u0c66\u0c67\u0c68\u033f\u013e\u013f\u0340\u0141\u0142\u0341\u0143\u0144\u0145\u0342\u0146\u0147\u0148\u0343\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0145\u0342\u0146\u0147\u0148\u0343\u0c82\u0c83\u0c84\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u064b\u0916\u0c19\u0c3f\u0c72\u0cae\u0cb5\u0cbe\u0cbf\u0095\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc5\u0cc6\u0cc7\u0cc8\u064f\u0cc9\u031e\u00b7\u031f\u0321" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0638\u0903\u0c06\u0c2c\u0c59\u0c8f\u0c96\u0c9f\u0ca0\u0095\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0ca9\u063c\u0caa\u031e\u00b7\u031f\u0321\u0ca6\u0325\u0329\u0cab\u0cac\u0cad\u0004\u0c93\u0c94\u0c95\u0001\u0001\u0001\u0003\u0c99\u0c9c\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0cc5\u0325\u0329\u0cca\u0ccb\u0ccc\u0004\u0cb2\u0cb3\u0cb4\u0001\u0001\u0001\u0003\u0cb8\u0cbb\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0050\u0d1d\u0d1e\u0d22\u0d26\u0d27\u0d28\u0d29\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3b\u0d3c\u0d3d\u0d3e\u0d3f\u0d26\u01ed\u01ee\u01ef\u01f0" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0046\u0cf4\u0cf5\u0cf9\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d02\u0d03\u0d04\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0d\u0d0e\u0d0f\u0d10\u0d11\u0d12\u0d13\u0d14\u0d15\u0d16\u0cfd\u01ed\u01ee\u01ef\u01f0\u01f1\u01f2\u01f3\u01f4\u01f5\u01fd\u01fe\u01ff\u0200\u0204\u0205\u0206\u020d\u020e\u020f\u0210\u0d17\u0cfc\u0081\u0d1a\u012f\u0214\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0c6e\u0d21\u0d22" +
"\u01f1\u01f2\u01f3\u01f4\u01f5\u01fd\u01fe\u01ff\u0200\u0204\u0205\u0206\u020d\u020e\u020f\u0210\u0d40\u0d25\u0081\u0d43\u012f\u0214\u06f9\u0d44\u0d45\u0d46\u0d47\u0d48\u0d49\u0c8c\u0d4a\u0d4b\u0d4c\u0d4d\u0d4e\u0d4f\u0d50\u0d51\u0c8d\u0d52\u0d53\u0705\u0d21\u0215\u0d54\u0001\u0003\u0d21\u0215\u0001\u0003\u0d25\u0081\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + "\u06f2\u0cf8\u0215\u0d23\u0001\u0003\u0cf8\u0215\u0001\u0003\u0cfc\u0081\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0cfc\u0081\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0028\u0c9f\u0d4c\u0d4c\u0d4d\u0d4e\u0d4f\u0ca2\u0d50\u0d51\u0d52\u0d53\u0d54\u0d55\u0d56\u0d57\u00b4\u0d58\u00b7\u00ba" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0d25\u0081\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0028\u0cbe\u0d7d\u0d7d\u0d7e\u0d7f\u0d80\u0cc1\u0d81\u0d82\u0d83\u0d84\u0d85\u0d86\u0d87\u0d88\u00b4\u0d89\u00b7\u00ba\u00bb\u00bc\u0380\u0d8a\u0383\u00c6\u0d8b\u0d8c\u00c9\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u00ce\u0d93\u0d94\u0d95\u0d96\u0001\u0001\u0001" + "\u00bb\u00bc\u0380\u0d59\u0383\u00c6\u0d5a\u0d5b\u00c9\u0d5c\u0d5d\u0d5e\u0d5f\u0d60\u0d61\u00ce\u0d62\u0d63\u0d64\u0d65\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0351\u0d6a\u0d6b\u0001\u0001\u000b\u0d77\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0432\u0002\u0d79\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0351\u0d9b\u0d9c\u0001\u0001\u000b\u0da8\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db2\u0432\u0002\u0daa\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0db7\u0db8\u0433\u0001\u0001\u0005\u0dbe\u0dbf\u0dc0\u0434\u0001\u0001\u0001\u0002\u0dc3\u0001\u0003\u0dc7\u0dc8\u0001" + "\u0001\u0001\u0004\u0d86\u0d87\u0433\u0001\u0001\u0005\u0d8d\u0d8e\u0d8f\u0434\u0001\u0001\u0001\u0002\u0d92\u0001\u0003\u0d96\u0d97\u0001\u0001\u0002\u0d9a\u0001\u0002\u0d9d\u0001\u0006\u0da4\u0da5\u0ca0\u0da6\u0da7\u0001\u0001\u0001\u0001\u0011\u0db9\u0c5a\u0c5d\u0c60\u0c64\u0dba\u0dbb\u0c68\u0dbc\u033f\u0340\u0341\u0342\u0dbd\u0dbe\u0343\u0001\u0001\u0001\u0001\u0001\u0001\u001e\u063a\u06cd\u07d3\u0093\u0ddd\u0dde\u0ddf\u0de0" +
"\u0001\u0002\u0dcb\u0001\u0002\u0dce\u0001\u0006\u0dd5\u0dd6\u0cbf\u0dd7\u0dd8\u0001\u0001\u0001\u0001\u0011\u0dea\u0c73\u0c76\u0c79\u0c7d\u0deb\u0dec\u0c81\u0ded\u033f\u0340\u0341\u0342\u0dee\u0def\u0343\u0001\u0001\u0001\u0001\u0001\u0001\u001e\u064d\u06e0\u07e6\u0093\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e11\u0105\u0106\u0107\u010d\u010e\u0110\u0111\u0112\u0114\u0e1c\u0001\u0001" + "\u0de1\u0de2\u0de3\u0de4\u0de5\u0de6\u0de7\u0de8\u0de9\u0dea\u0de0\u0105\u0106\u0107\u010d\u010e\u0110\u0111\u0112\u0114\u0deb\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0021\u0d4d\u0e0d\u0e0e\u0e0f\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e0f\u0e1b\u0e0f\u026b\u0e13\u0e14\u026c\u0e1c\u0e18\u0e0f\u0e13\u0e0f\u0e1d\u0e13\u0270\u0e1e\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0021\u0d7e\u0e3e\u0e3f\u0e40\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e40\u0e4c\u0e40\u026b\u0e44\u0e45\u026c\u0e4d\u0e49\u0e40\u0e44\u0e40\u0e4e\u0e44\u0270\u0e4f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u064e\u06e1\u07e7\u0e65\u0e12\u0e66\u0e67" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u063b\u06ce\u07d4\u0e34\u0de1\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e3b\u0e35\u0170\u0172\u0175\u0177\u0178\u0e3c\u0e3d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0e5e\u0e5f\u0e66\u0e67\u0e68\u0e69\u0e6a\u0e6b\u0e6c\u0e6d\u0e6e\u02e7\u0e78\u02e8\u02e9\u02ea\u02eb\u02ec\u0e75\u0e76\u0e77\u0196\u0198\u0185\u0e7b" +
"\u0e68\u0e69\u0e6a\u0e6b\u0e6c\u0e66\u0170\u0172\u0175\u0177\u0178\u0e6d\u0e6e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0e8f\u0e90\u0e97\u0e98\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u02e7\u0ea9\u02e8\u02e9\u02ea\u02eb\u02ec\u0ea6\u0ea7\u0ea8\u0196\u0198\u0185\u0eac\u02ed\u0e95\u02ee\u0e96\u02ef\u0ead\u0001\u0005\u0e95\u0e96\u02ee\u02ef\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007" + "\u02ed\u0e64\u02ee\u0e65\u02ef\u0e7c\u0001\u0005\u0e64\u0e65\u02ee\u02ef\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0e75\u0e76\u0e77\u0196\u0198\u0185\u0001\u0001\u0001\u0003\u0e7b\u02ed\u0001\u0001\u0012\u06cf\u07d5\u0e8f\u0c21\u0c5a\u0ca1\u0c5a\u0e37\u0c21\u0e90\u0e91\u0e37\u0ca1\u0e92\u0e93\u06cf\u07d5\u0001\u0001\u0001\u0001\u0001\u0003\u0d04\u0e97\u0001\u000c\u07d6\u0c5b\u0d05\u0d4f\u0de2\u0e0f\u0ea4" +
"\u0ea6\u0ea7\u0ea8\u0196\u0198\u0185\u0001\u0001\u0001\u0003\u0eac\u02ed\u0001\u0001\u0015\u06e2\u07e8\u0ec3\u0c34\u0c73\u0cc0\u0c73\u0e68\u0c34\u0ec4\u0ec5\u0e68\u0cc0\u0ec6\u0c34\u0ec4\u0ec5\u0ec7\u06e2\u07e8\u0001\u0001\u0001\u0001\u0001\u0003\u0d2d\u0ecb\u0001\u000c\u07e9\u0c74\u0d2e\u0d80\u0e13\u0e40\u0ed8\u0ed9\u0eda\u0edb\u0edc\u0001\u0001\u0001\u0001\u0001\u0007\u0c75\u0cc1\u0d2f\u0e14\u0ee4\u0ee4\u0001\u0011\u06e3\u07ea" + "\u0ea5\u0ea6\u0ea7\u0ea8\u0001\u0001\u0001\u0001\u0001\u0006\u0c5c\u0ca2\u0d06\u0de3\u0eaf\u0001\u0010\u06d0\u07d7\u0c5d\u0ca3\u0d07\u0c5d\u0de4\u0e0f\u0e38\u0ec0\u0e38\u0ca3\u0ec1\u06d0\u07d7\u0001\u0001\u0006\u0d08\u0ec8\u0ecb\u0ecd\u0ecf\u0003\u0000\u0000\u0002\u0000\u0002\u0000\u0001\u0008\u0ed8\u0c5e\u0d09\u0ed9\u0ed8\u0eda\u0ed8\u0001\u0001\u0001\u0002\u0c5f\u0010\u06d2\u07d9\u0c60\u0ca4\u0d0b\u0c60\u0e39\u0eed\u0e39\u0ca4" +
"\u0c76\u0cc2\u0d30\u0c76\u0e15\u0e40\u0e69\u0ef6\u0e69\u0cc2\u0ef7\u0ef6\u06e3\u07ea\u0001\u0001\u0006\u0d31\u0efe\u0f01\u0f03\u0f05\u0003\u0000\u0000\u0002\u0000\u0002\u0000\u0001\u0008\u0f0e\u0c77\u0d32\u0f0f\u0f0e\u0f10\u0f0e\u0001\u0001\u0001\u0002\u0c78\u0010\u06e5\u07ec\u0c79\u0cc3\u0d34\u0c79\u0e6a\u0f23\u0e6a\u0cc3\u0f24\u0f23\u0f25\u06e5\u07ec\u0001\u0001\u0001\u0003\u07ed\u07ed\u0003\u0c7a\u0cc4\n\u07f1\u0c7b\u0cc5" + "\u0eee\u0eed\u0eef\u06d2\u07d9\u0001\u0001\u0001\u0003\u07da\u07da\u0003\u0c61\u0ca5\n\u07de\u0c62\u0ca6\u0d53\u0de5\u0e10\u0f00\u0f07\u0d57\u0002\u0f02\u0002\u0f04\u0003\u0000\u0000\u0001\u0002\u0d0c\n\u07e0\u0c63\u0de6\u0e11\u0f14\u0f15\u0f16\u0f16\u0f17\u0001\u0001\u0001\u0001\u0015\u06d3\u07e1\u0c64\u0ca7\u0d54\u0c64\u0e3a\u09c8\u0ea6\u0f2d\u0f2e\u0f2f\u0f30\u0f31\u0e3a\u0ca7\u0f32\u0f33\u06d3\u07e1\u0001\u0001\u0001" +
"\u0d84\u0e16\u0e41\u0f36\u0f3d\u0d88\u0002\u0f38\u0002\u0f3a\u0003\u0000\u0000\u0001\u0002\u0d35\u000c\u07f3\u0c7c\u0e17\u0e42\u0f4c\u0f4d\u0f4e\u0f4c\u0f4d\u0f4e\u0f4f\u0001\u0001\u0001\u0001\u0016\u06e6\u07f4\u0c7d\u0cc6\u0d85\u0c7d\u0e6b\u09db\u0eda\u0f66\u0f67\u0f68\u0f69\u0f6a\u0e6b\u0cc6\u0f6b\u0f66\u0f6c\u06e6\u07f4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u0f73\u0d38\u0e44\u0f73\u0f74\u0001\u0001\u0003\u0f78\u0f78" + "\u0001\u0001\u0001\u0001\u0006\u0f3a\u0d0f\u0e13\u0f3a\u0f3b\u0001\u0001\u0002\u0f3e\u0001\u0008\u07e3\u0c65\u0de7\u0e14\u0f2e\u0f47\u0f48\u0001\u0001\u000b\u0f2f\u07e4\u0c66\u0d11\u0dba\u0de8\u0f54\u0f2f\u0f55\u0f56\u0001\u0001\u0001\n\u0c67\u0d55\u0d12\u0d55\u0dbb\u0de9\u0e15\u0f61\u0f62\u0001\u0001\u002d\u0f90\u0f96\u06d4\u07e5\u0c22\u0c68\u0ca8\u0c68\u0e3b\u0e8f\u0f9a\u0ed8\u0f9b\u0f9c\u0f9d\u0e3b\u0ca8\u0f9e\u0f9f\u0fa0" +
"\u0001\u0009\u07f6\u0c7e\u0e18\u0e45\u0f67\u0f82\u0f82\u0f83\u0001\u0001\u000c\u0f68\u07f7\u0c7f\u0d3a\u0deb\u0e19\u0f90\u0f68\u0f91\u0f91\u0f92\u0001\u0001\u0001\u000c\u0c80\u0d86\u0d3b\u0d86\u0dec\u0e1a\u0e46\u0f9f\u0fa0\u0f9f\u0fa1\u0001\u0001\u0002\u0000\u002d\u0fd0\u0fd6\u06e7\u07f8\u0c35\u0c81\u0cc7\u0c81\u0e6c\u0ec3\u0fda\u0f0e\u0fdb\u0fdc\u0fdd\u0e6c\u0cc7\u0fde\u0fdf\u0fe0\u0fe1\u0fe2\u0fe3\u0fe4\u0fe5\u06e7\u07f8\u0fe6" + "\u0fa1\u0fa2\u0fa3\u0fa4\u0fa5\u06d4\u07e5\u0fa6\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0002\u0f92\u0003\u0f95\u0149\u0001\u0003\u0f99\u0251\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0f95\u0149\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0d57\u0de2\u0de8\u0dea\u0003\u0e17" +
"\u0fe9\u0fea\u0feb\u0fec\u0fed\u0fee\u0fef\u0ff0\u0ff1\u0ff2\u0ff3\u0ff4\u0ff5\u0ff6\u0ff7\u0ff8\u0002\u0fd2\u0003\u0fd5\u0149\u0001\u0003\u0fd9\u0251\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0fd5\u0149\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0d88\u0e13\u0e19\u0e1b\u0003\u0e48\u1001\u0001\u0002\u0f69\u0007\u06ea\u07fa\u0e49" + "\u0fc1\u0001\u0002\u0f30\u0007\u06d7\u07e7\u0e18\u0fcb\u06d7\u07e7\u0001\u0005\u07e8\u0d16\u0dea\u0fd1\u0001\u0002\u0fd4\u0001\u0008\u0ca9\u0e6d\u0fdd\u0fe0\u0fe5\u0fe8\u0fe9\u0003\u0000\u0000\u0002\u0fe2\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0002\u0fd4\u004e\u103a\u042d\u042e\u042f\u0430\u0cfd\u0d57\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u0e37\u1044\u0e38\u1045\u1046\u0e39\u1047\u0e3a\u1048" +
"\u100b\u06ea\u07fa\u0001\u0006\u07fb\u0d3f\u0e1b\u1012\u1012\u0001\u0002\u1015\u0001\u0008\u0cc8\u0e9e\u101e\u1021\u1026\u1029\u102a\u0003\u0000\u0000\u0002\u1023\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0002\u1015\u004e\u107b\u042d\u042e\u042f\u0430\u0d26\u0d88\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u0e68\u1085\u0e69\u1086\u1087\u0e6a\u1088\u0e6b\u1089\u0e6c\u1001\u100b\u108a\u108b\u0170\u0171" + "\u0e3b\u0fc1\u0fcb\u1049\u104a\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0184\u0178\u0179\u017d\u017e\u0097\u105e\u1061\u1064\u1067\u106a\u106d\u0186\u0189\u018c\u018f\u1070\u0192\u1042\u0197\u1043\u019a\u0430\u1073\u1074\u1075\u1076\u1077\u1078\u1079\u107a\u107b\u107c\u107d\u107e\u107f\u1080\u0007\u1041\u1042\u1043\u0195\u0197\u019a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0013\u0352\u035a\u0441\u0442\u0444" +
"\u0172\u0173\u0174\u0175\u0176\u0177\u0184\u0178\u0179\u017d\u017e\u0097\u109f\u10a2\u10a5\u10a8\u10ab\u10ae\u0186\u0189\u018c\u018f\u10b1\u0192\u1083\u0197\u1084\u019a\u0430\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u0007\u1082\u1083\u1084\u0195\u0197\u019a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0013\u0352\u035a\u0441\u0442\u0444\u0354\u0353\u0357\u0358\u044c\u044d\u044e" + "\u0354\u0353\u0357\u0358\u044c\u044d\u044e\u045b\u045d\u0463\u0464\u0465\u105d\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0058\u063c\u10d9\u10e0\u10ea\u03b6\u03b7\u03b8\u03b9\u10eb\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u10f4\u0de0\u03c4" +
"\u045b\u045d\u0463\u0464\u0465\u109e\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0058\u064f\u111a\u1121\u112b\u03b6\u03b7\u03b8\u03b9\u112c\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u1135\u0e11\u03c4\u0e66\u0cc0\u0cc2\u1139\u0cc3\u0cc6\u0cc7" + "\u0e35\u0ca1\u0ca3\u10f8\u0ca4\u0ca7\u0ca8\u10f9\u063c\u063c\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u10fa\u10e7\u10fe\u10fd\u10e8\u10e9\u032b\u032c\u032d\u032e\u032f\u10f2\u0212\u10ff\u1100\u1101\u0331\u0332\u0333\u1102\u1105\u1108\u1109\u110c\u110f\u1110\u1113\u0334\u1116\u1119\u0335\u10de\u0336\u10df\u0337\u111c\u111d\u03b9\u111e\u111f\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u0005\u10de\u10df\u0336\u0337\u0001\u0001" +
"\u113a\u064f\u064f\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u113b\u1128\u113f\u113e\u1129\u112a\u032b\u032c\u032d\u032e\u032f\u1133\u0212\u1140\u1141\u1142\u0331\u0332\u0333\u1143\u1146\u1149\u114a\u114d\u1150\u1151\u1154\u0334\u1157\u115a\u0335\u111f\u0336\u1120\u0337\u115d\u115e\u03b9\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u0005\u111f\u1120\u0336\u0337\u0001\u0001\u0007\u1128\u1129\u112a\u032b\u032e\u032f" + "\u0007\u10e7\u10e8\u10e9\u032b\u032e\u032f\u0001\u0001\u0001\u0001\u0007\u10f2\u0c99\u10f3\u0212\u0c9c\u0213\u0001\u0001\u0003\u10f7\u0330\u0001\u0001\u0001\u0003\u10fd\u032d\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0007\u1133\u0cb8\u1134\u0212\u0cbb\u0213\u0001\u0001\u0003\u1138\u0330\u0001\u0001\u0001\u0003\u113e\u032d\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0046\u11af\u11b6\u11d3\u11ee\u0ec6\u0ef7" + "\u0046\u116e\u1175\u1192\u11ad\u0e92\u0ec1\u0eee\u11b4\u0f32\u0f9e\u11b5\u11b6\u11b7\u11c1\u11c8\u02b7\u11e7\u02b8\u02b9\u02ba\u02bb\u02bf\u02c0\u02c1\u11eb\u11be\u11bf\u11c0\u1173\u017f\u0181\u0182\u02c5\u11ea\u02c6\u11c6\u02c7\u11c7\u02c8\u11b2\u02c9\u11b3\u02ca\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u02d1\u02d2\u02d3\u02d4\u02d5\u02d6\u02d7\u11f7\u11fa\u11fb\u11fc\u11ff\u1202\u1205\u02d8\u02d9\u1208\u120b\u120e\u0005\u1173" +
"\u0f24\u11f5\u0f6b\u0fde\u11f6\u11f7\u11f8\u1202\u1209\u02b7\u1228\u02b8\u02b9\u02ba\u02bb\u02bf\u02c0\u02c1\u122c\u11ff\u1200\u1201\u11b4\u017f\u0181\u0182\u02c5\u122b\u02c6\u1207\u02c7\u1208\u02c8\u11f3\u02c9\u11f4\u02ca\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u02d1\u02d2\u02d3\u02d4\u02d5\u02d6\u02d7\u1238\u123b\u123c\u123d\u1240\u1243\u1246\u02d8\u02d9\u1249\u124c\u124f\u0005\u11b4\u02c5\u11b5\u04f3\u0001\u0001\u000f\u11c5" + "\u02c5\u1174\u04f3\u0001\u0001\u000f\u1184\u1185\u1186\u1187\u1188\u1189\u118a\u118b\u118c\u118d\u118e\u118f\u1190\u1191\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u11a0\u11a1\u11a2\u11a3\u11a4\u11a5\u11a6\u11a7\u11a8\u11a9\u11aa\u11ab\u11ac\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u11b2\u11b3\u02c9\u02ca\u0001\u0001\u0001\u0001\u0001\u0007" +
"\u11c6\u11c7\u11c8\u11c9\u11ca\u11cb\u11cc\u11cd\u11ce\u11cf\u11d0\u11d1\u11d2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u11f3\u11f4\u02c9\u02ca\u0001\u0001\u0001\u0001\u0001\u0007\u11ff\u1200\u1201\u017f\u0181\u0182\u0001" + "\u11be\u11bf\u11c0\u017f\u0181\u0182\u0001\u0001\u0001\u0005\u11c6\u11c7\u02c7\u02c8\u0001\u0001\r\u11d5\u11d8\u11db\u11de\u11e1\u11e4\u0285\u0288\u028b\u028e\u0291\u0294\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u11ea\u02c6\u0001\u0005\u11c6\u11c7\u02c7\u02c8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0003\u0000\u0000\u0003" +
"\u0001\u0001\u0005\u1207\u1208\u02c7\u02c8\u0001\u0001\r\u1216\u1219\u121c\u121f\u1222\u1225\u0285\u0288\u028b\u028e\u0291\u0294\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u122b\u02c6\u0001\u0005\u1207\u1208\u02c7\u02c8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000" + "\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0011\u04c4\u0037\u0f9f\u0362\u033f\u031e\u033f\u0170\u0170\u031e\u02b7\u0362\u1222\u048a\u04c4\u0037\u0001\u0021\u1244\u1247\u01ee\u0e8f\u0f9a\u0ed8\u0f9b\u0f9c\u0f9d\u0f9f\u0fa0\u0fa1\u0fa2\u0fa3\u0fa4\u124a\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0003\u0f99\u0251\u0003" +
"\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0012\u04c4\u0037\u0fdf\u0362\u033f\u031e\u033f\u0170\u0ec4\u0170\u031e\u02b7\u0362\u1264\u048a\u04c4\u0037\u0001\u0021\u1286\u1289\u01ee\u0ec3\u0fda\u0f0e\u0fdb\u0fdc\u0fdd\u0fdf\u0fe0\u0fe1\u0fe2\u0fe3\u0fe4\u128c\u0fe9\u0fea\u0feb\u0fec\u0fed\u0fee\u0fef\u0ff0\u0ff1\u0ff2\u0ff3\u0ff4\u0ff5\u0ff6\u0ff7\u0ff8\u0003\u0fd9\u0251\u0003\u0fd5\u0149\u0003\u0fd5\u0149\u002c" + "\u0f95\u0149\u0003\u0f95\u0149\u002c\u1279\u0038\u013e\u01ef\u0d58\u0105\u0e0f\u127d\u0de2\u0de3\u0de4\u127e\u127f\u1280\u1281\u0de5\u0de6\u1282\u0de7\u0de8\u0de9\u1283\u0dea\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0d58\u127c\u0115\u0003\u127c\u0115\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u013f\u00b7\u01f0\u0106\u0e1b\u128c\u128d\u0001\u0001\u0010\u04c8" +
"\u12bb\u0038\u013e\u01ef\u0d89\u0105\u0e40\u12bf\u0e13\u0e14\u0e15\u12c0\u12c1\u12c2\u12c3\u0e16\u0e17\u12c4\u0e18\u0e19\u0e1a\u12c5\u0e1b\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0d89\u12be\u0115\u0003\u12be\u0115\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u013f\u00b7\u01f0\u0106\u0e4c\u12ce\u12cf\u0001\u0001\u0010\u04c8\u0039\u0340\u031f\u01f1\u0340\u0107" + "\u0039\u0340\u031f\u01f1\u0340\u0107\u0e0f\u0172\u0172\u031f\u02b8\u129e\u04c8\u0039\u0001\u0007\u01f2\u12a6\u12a7\u12a9\u12ab\u12a6\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0007\u0fa1\u0141\u01f3\u0fa1\u0ed9\u0fa1\u0002\u0142\u000f\u04ca\u003b\u0341\u0321\u01f5\u0341\u0175\u0175\u0321\u02b9\u12c5\u048c\u04ca\u003b\u0001\u0003\u003c\u003c\u0003\u0143\u12cc\u0001\u0008\u0040\u0144\u0ca6\u0380\u010d\u0f07\u0d57\u0004\u01fd\u0d59" +
"\u0e40\u0172\u0172\u031f\u02b8\u12e0\u04c8\u0039\u0001\u0007\u01f2\u12e8\u12e9\u12eb\u12ed\u12e8\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0009\u0fe1\u0141\u01f3\u0fe1\u0f0f\u0f0e\u12f8\u0fe1\u0003\u0000\u0000\u0002\u0142\u000f\u04ca\u003b\u0341\u0321\u01f5\u0341\u0175\u0175\u0321\u02b9\u130c\u048c\u04ca\u003b\u0001\u0003\u003c\u003c\u0003\u0143\u1313\u0001\u0008\u0040\u0144\u0cc5\u0380\u010d\u0f3d\u0d88\u0004\u01fd\u0d8a\u0d8b" + "\u0d5a\u0006\u0042\u0145\u010e\u12df\u048d\u0001\u001a\u04da\u0043\u0342\u0325\u0383\u0342\u0177\u0c21\u0c22\u0177\u0325\u02bb\u0362\u0ea6\u12fa\u0351\u0f2e\u0f2f\u0363\u0364\u0f30\u0365\u048e\u04da\u0043\u0001\u0005\u0f3a\u0200\u0e13\u1300\u0002\u1302\u0003\u0000\u0000\u0005\u0045\u0146\u0110\u0e14\u000b\u0f2f\u0046\u0147\u0205\u0dbd\u0111\u0f54\u0f2f\u1315\u0147\u0001\u0009\u0148\u00c6\u0206\u00c6\u0dbe\u0112\u131f\u0f62\u0001" +
"\u0006\u0042\u0145\u010e\u1326\u048d\u0001\u001a\u04da\u0043\u0342\u0325\u0383\u0342\u0177\u0c34\u0c35\u0177\u0325\u02bb\u0362\u0eda\u1341\u0351\u0f67\u0f68\u0363\u0364\u0f69\u0365\u048e\u04da\u0043\u0001\u0005\u0f73\u0200\u0e44\u1347\u0002\u1349\u0003\u0000\u0000\u0005\u0045\u0146\u0110\u0e45\u000b\u0f68\u0046\u0147\u0205\u0dee\u0111\u0f90\u0f68\u135c\u0147\u0001\n\u0148\u00c6\u0206\u00c6\u0def\u0112\u1367\u0fa0\u1368\u0001" + "\u001b\u04df\u0047\u0363\u0343\u0329\u0d5a\u0343\u0178\u0e8f\u0f9a\u0ed8\u0f9b\u0f9c\u0f9d\u0178\u0329\u02bf\u0f9f\u0fa0\u0fa1\u0fa2\u0fa3\u0fa4\u048f\u04df\u0047\u0023\u0d5b\u127d\u0de2\u0de3\u0de4\u127e\u127f\u1280\u1281\u0de6\u1282\u0de7\u0de8\u0de9\u1283\u0dea\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u0d57\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0091\u0002\u0179\u0003\u0f30\u1363\u0001\u0007\u04e2\u0049\u0e18" +
"\u0002\u0000\u001b\u04df\u0047\u0363\u0343\u0329\u0d8b\u0343\u0178\u0ec3\u0fda\u0f0e\u0fdb\u0fdc\u0fdd\u0178\u0329\u02bf\u0fdf\u0fe0\u0fe1\u0fe2\u0fe3\u0fe4\u048f\u04df\u0047\u0023\u0d8c\u12bf\u0e13\u0e14\u0e15\u12c0\u12c1\u12c2\u12c3\u0e17\u12c4\u0e18\u0e19\u0e1a\u12c5\u0e1b\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u0d88\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0091\u0002\u0179\u0003\u0f69\u13ad\u0001\u0007\u04e2" + "\u017d\u04e2\u0049\u0004\u004a\u0210\u0114\u0002\u1371\u0001\u0012\u1384\u1385\u0e97\u0ea8\u0eda\u0f56\u0097\u0d58\u0091\u1386\u1387\u1388\u1389\u138a\u138b\u138c\u138d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u13bd\u13c1\u13d6\u13e9\u0d6b\u0e93\u13f0\u0eef\u0f17\u0f33\u0fa5\u13f1\u13f2\u13f3\u048a\u13fd\u048b\u048c\u048d\u048e\u048f\u0490\u0491\u1386\u1401\u04e3\u13fa\u13fb\u13fc\u0180\u0199\u0183\u1400" +
"\u0049\u0e49\u017d\u04e2\u0049\u0004\u004a\u0210\u0114\u0002\u13bb\u0001\u0012\u13ce\u13cf\u0ecb\u0edc\u0f10\u0f92\u0097\u0d89\u0091\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u13d6\u13d7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u1407\u140b\u1420\u1433\u0d9c\u0ec7\u143a\u0f25\u0f4f\u0f6c\u0fe5\u143b\u143c\u143d\u048a\u1447\u048b\u048c\u048d\u048e\u048f\u0490\u0491\u13d0\u144b\u04e3\u1444\u1445\u1446\u0180\u0199" + "\u0493\u13ee\u02ff\u13ef\u0300\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u0003\u13c0\u04f4\u0001\u000b\u13cc\u13cd\u13ce\u13cf\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u13e7\u13e8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u13ee\u13ef\u02ff\u0300\u0001\u0001\u0001\u0001\u0001\u0007\u13fa\u13fb\u13fc\u0180" +
"\u0183\u144a\u0493\u1438\u02ff\u1439\u0300\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u0003\u140a\u04f4\u0001\u000b\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u141d\u141e\u141f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u142a\u142b\u142c\u142d\u142e\u142f\u1430\u1431\u1432\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1438\u1439\u02ff\u0300\u0001\u0001\u0001\u0001\u0001\u0007\u1444\u1445" + "\u0199\u0183\u0001\u0001\u0001\u0003\u1400\u0493\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u078a\u04c3\u0e3c\u06cf\u06d0\u06d2\u06d3\u06d4\u06d7\u1421\u04c4\u04c8\u04ca\u04da\u04df\u04e2\u1422\u078a\u04f5\u04e4\u1423\u1424\u0001\u0001\u0001\u0001\u0037\u145c\u1461\u1468\u146d\u0ca1\u0ca3\u10f8\u0ca4\u0ca7\u0ca8\u10f9\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u1470\u10e7\u10fe\u10fd\u10e8\u10e9\u032b\u032c" +
"\u1446\u0180\u0199\u0183\u0001\u0001\u0001\u0003\u144a\u0493\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u079d\u04c3\u0e6d\u06e2\u06e3\u06e5\u06e6\u06e7\u06ea\u146b\u04c4\u04c8\u04ca\u04da\u04df\u04e2\u146c\u079d\u04f5\u04e4\u146d\u146e\u0001\u0001\u0001\u0001\u0037\u14a6\u14ab\u14b2\u14b7\u0cc0\u0cc2\u1139\u0cc3\u0cc6\u0cc7\u113a\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u14ba\u1128\u113f\u113e\u1129\u112a" + "\u032d\u032e\u032f\u10f2\u0212\u10ff\u1100\u1101\u0331\u0332\u0333\u1102\u1105\u1108\u1109\u110c\u110f\u1110\u1113\u0334\u1116\u1119\u0335\u10de\u0336\u10df\u0337\u1473\u0005\u10de\u10df\u0336\u0337\u0007\u10e7\u10e8\u10e9\u032b\u032e\u032f\u0005\u10f2\u10f3\u0212\u0213\u0003\u10f7\u0330\u0003\u10fd\u032d\u0001\u0077\u14eb\u14f2\u1501\u150f\u1514\u1517\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3" +
"\u032b\u032c\u032d\u032e\u032f\u1133\u0212\u1140\u1141\u1142\u0331\u0332\u0333\u1143\u1146\u1149\u114a\u114d\u1150\u1151\u1154\u0334\u1157\u115a\u0335\u111f\u0336\u1120\u0337\u14bd\u0005\u111f\u1120\u0336\u0337\u0007\u1128\u1129\u112a\u032b\u032e\u032f\u0005\u1133\u1134\u0212\u0213\u0003\u1138\u0330\u0003\u113e\u032d\u0001\u0077\u1535\u153c\u154b\u1559\u155e\u1561\u07e8\u07e9\u07ea\u07eb\u07ec\u07ed\u07f0\u07f1\u07f2\u07f3\u07f4" + "\u07e4\u07e5\u07e6\u07e7\u07e8\u151a\u1521\u0037\u1526\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u1529\u152e\u1533\u07f0\u080e\u080f\u080d\u07f1\u078b\u07f2\u0803\u07d2\u078c\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u07fd\u0055\u07f8\u0059\u07f9\u005a\u0804\u005b\u07cc\\\u07cd\u005d\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u005e\u005f\u0060\u0061" +
"\u07f5\u07f6\u07f7\u07f8\u07f9\u07fa\u07fb\u1564\u156b\u0037\u1570\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u1573\u1578\u157d\u0803\u0821\u0822\u0820\u0804\u079e\u0805\u0816\u07e5\u079f\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0810\u0055\u080b\u0059\u080c\u005a\u0817\u005b\u07df\\\u07e0\u005d\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u005e\u005f" + "\u0062\u0063\u0817\u0818\u081b\u081c\u081f\u0822\u0823\u0826\u0829\u082c\u082f\u0832\u0835\u0064\u0067\u0068\u006b\u006e\u006f\u0838\u0072\u0075\u0078\u007b\u007e\u0007\u078b\u078c\u0050\u0054\u078d\u04e7\u000f\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u000e\u07ba\u07bb\u07bc\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u0005\u07cc\u07cd\\\u005d\u0003\u080d\u004e\u0003" +
"\u0060\u0061\u0062\u0063\u082a\u082b\u082e\u082f\u0832\u0835\u0836\u0839\u083c\u083f\u0842\u0845\u0848\u0064\u0067\u0068\u006b\u006e\u006f\u084b\u0072\u0075\u0078\u007b\u007e\u0007\u079e\u079f\u0050\u0054\u07a0\u04e7\u000f\u07b1\u07b2\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u07ba\u07bb\u07bc\u07bd\u07be\u000e\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u0005\u07df\u07e0\\\u005d\u0003\u0820" + "\u07d2\u0053\u0007\u07f0\u07f1\u07f2\u004b\u004f\u0051\u0005\u07f8\u07f9\u0059\u005a\u0003\u07fd\u0055\u0005\u0803\u0804\u0052\u005b\u0005\u07f8\u07f9\u0059\u005a\u0003\u080d\u004e\u0017\u0c5b\u0c5c\u154d\u0c5e\u0c5f\u0c61\u0c62\u0c63\u0c65\u0c66\u0c67\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u0001\u0002\u1550\u0001\u0003\u0ed8\u0fa1\u0002\u0810\u0002\u0811\u0002\u0812\u0003\u06e4\u0813\u0002\u0814\u0003" +
"\u004e\u0003\u07e5\u0053\u0007\u0803\u0804\u0805\u004b\u004f\u0051\u0005\u080b\u080c\u0059\u005a\u0003\u0810\u0055\u0005\u0816\u0817\u0052\u005b\u0005\u080b\u080c\u0059\u005a\u0003\u0820\u004e\u0017\u0c74\u0c75\u1597\u0c77\u0c78\u0c7a\u0c7b\u0c7c\u0c7e\u0c7f\u0c80\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u0001\u0002\u159a\u0001\u0003\u0f0e\u0fe1\u0002\u0823\u0002\u0824\u0002\u0825\u0003\u06f7\u0826\u0002" + "\u06e5\u0815\u0002\u0816\u0002\u005e\u0002\u005f\u0002\u0060\u000e\u04e5\u1578\u159b\u15a8\u15b5\u15d8\u15fb\u160f\u1610\u1611\u1612\u1613\u1614\u0006\u157e\u158b\u1598\u1599\u159a\u0007\u1585\u1586\u1587\u1588\u1589\u158a\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1592\u1593\u1594\u1595\u1596\u1597\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15a2\u15a3\u15a4\u15a5\u15a6\u15a7\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0827\u0003\u06f8\u0828\u0002\u0829\u0002\u005e\u0002\u005f\u0002\u0060\u000e\u04e5\u15c2\u15e5\u15f2\u15ff\u1622\u1645\u1659\u165a\u165b\u165c\u165d\u165e\u0006\u15c8\u15d5\u15e2\u15e3\u15e4\u0007\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15ec\u15ed\u15ee\u15ef\u15f0\u15f1\u0001\u0001\u0001\u0001" + "\u0007\u15af\u15b0\u15b1\u15b2\u15b3\u15b4\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u15bb\u15c8\u15d5\u15d6\u15d7\u0007\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u15de\u15eb\u15f8\u15f9\u15fa\u0007\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15f2\u15f3\u15f4\u15f5" +
"\u0001\u0001\u0007\u15f9\u15fa\u15fb\u15fc\u15fd\u15fe\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1605\u1612\u161f\u1620\u1621\u0007\u160c\u160d\u160e\u160f\u1610\u1611\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1619\u161a\u161b\u161c\u161d\u161e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1628\u1635\u1642\u1643\u1644\u0007\u162f\u1630\u1631\u1632\u1633\u1634\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u163c\u163d" + "\u15f6\u15f7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1601\u1608\u1598\u1599\u159a\u0007\u1585\u1586\u1587\u1588\u1589\u158a\u0007\u1592\u1593\u1594\u1595\u1596\u1597\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0062\u0003\u04e6\u0063\u0002\u0817\u0002\u0e0f\u0002\u0e13\u0003\u0f16\u0f16\u0002\u0e0f\u0008\u162d\u162e\u162f\u162d\u163e\u1640\u162d\u0001\u0001\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u163e\u163f\u1640\u1641\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u164b\u1652\u15e2\u15e3\u15e4\u0007\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u0007\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0062\u0003\u04e6\u0063\u0002\u082a\u0007\u06f9\u06f9\u1149\u166d\u166d\u1149\u0001\u0005\u1673\u1673\u1675\u1675\u0002\u0000\u0002\u0000\u000f\u1686\u1687\u1688\u1689\u168b\u1686\u1687\u1688" + "\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0002\u0000\u0002\u1644\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0c69\u0d1b\u0d5f\u1664\u1665\u0d5f\u0001\u0001\u0007\u166d\u166f\u1670\u166d\u166d\u1672\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u1675\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u1689\u168b\u168c\u168c\u1688\u1688\u0001\u0001\u0001\u0002\u0000\u0001\u0002\u0000\u000b\u0c82\u0d44\u0d8e\u0d8e\u1699\u169a\u0d8e\u1699\u169a\u0d8e\u0001\u0001\r\u16a8\u16a8\u16aa\u16ab\u16a8\u16a8\u16aa\u16ab\u16a8\u16a8\u16ad\u16ad\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u0e40\u0002\u0d45\u0004\u0e44\u16b6\u16b6\u0001\u0005\u1149\u166d\u1149\u166d\u0002\u0d46\u000b\u0c83\u0d47\u1699\u16c9\u169a\u16c9\u1699\u16c9\u169a" + "\u0000\u0000\u0000\u0000\u0000\u0002\u0d1c\u0003\u0e13\u168a\u0001\u0003\u0334\u168e\u0001\u0003\u0d1d\u1692\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0c6a\u0d1e\u1664\u16a9\u1665\u16a9\u0001\u0004\u0c6b\u0d1f\u16ae\u0001\u0002\u0d20\u0005\u0c6c\u16b6\u16b7\u16c7\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001" +
"\u16c9\u0001\u0005\u0c84\u0d48\u16cf\u16cf\u0001\u0002\u0d49\u0007\u0c85\u16d9\u0f4e\u16da\u0f4e\u16da\u0001\u0001\u0005\u16e0\u16e1\u16e0\u16e1\u0001\u0001\u0003\u16e5\u16e5\u0001\u0002\u0e40\u0009\u16f1\u16f1\u16f2\u16f3\u16f1\u16f2\u16f3\u16f1\u0001\u0001\u0001\u000b\u166d\u0ff3\u166d\u0ff3\u1150\u166d\u0ff3\u1150\u166d\u0ff3\u0003\u0c86\u0d4a\u0002\u0d4b\u0003\u1707\u1707\u0001\u0011\u06f9\u1673\u1719\u171a\u171b\u06fb\u1675" + "\u0004\u16cc\u16cd\u16ce\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0f2f\u16ea\u0001\u0004\u16ef\u16f0\u16ef\u0001\u0001\u0007\u168e\u0fb8\u0335\u16f8\u168e\u0fb8\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0c6d\u0d21\u170f\u0019" +
"\u171c\u1673\u1719\u171a\u171b\u06fb\u1675\u171c\u06f9\u0001\u0001\u0001\u0002\u0000\u0009\u1727\u1728\u1729\u1738\u1739\u173b\u173c\u1738\u0001\u0001\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0001\u0002\u0000\u0002\u1740\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000f\u0d22\u162f\u1644\u1675\u1692\u16b7\u16ce\u16f8\u170f\u1737\u1749\u1762\u1692\u1772\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0007\u0c87\u0d4c\u0d90\u1760\u1761\u0d90\u0001\u0001\u0007\u1769\u176b\u176c\u1769\u1769\u176e\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u1771\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0d4d\u0003\u0e44\u1786\u0001\u0003\u0334\u178a\u0001\u0003\u0d4e\u178e\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0c88" + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u1784\u0001\u0002\u1749\u0006\u178d\u06f1\u178f\u1790\u1762\u0002\u0000\u0001\u0001\u0002\u1793\u0002\u0000\u0005\u06f2\u06f2\u168e\u0334\u0004\u179e\u1692\u1793\u0002\u0000" +
"\u0d4f\u1760\u17a5\u1761\u17a5\u0001\u0004\u0c89\u0d50\u17aa\u0001\u0002\u0d51\u0005\u0c8a\u17b2\u17b3\u17c3\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u17c8\u17c9\u17ca\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0f68\u17e6\u0001\u0005" + "\u0002\u16cc\u0002\u1772\u0002\u17a6\u0002\u0000\u0003\u17ab\u17ad\u0002\u0000\u0002\u0000\u0002\u17b1\u0002\u0000\u0002\u17b5\u0002\u0000\u0017\u17ce\u17d0\u17d2\u17d4\u17d6\u17d8\u17da\u17dc\u17de\u17e0\u17e2\u17e4\u17e6\u17e8\u17ea\u17ec\u17ee\u17f0\u17f2\u17f4\u17f6\u17f8\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000" +
"\u17ec\u17ed\u17ee\u17ec\u0001\u0001\u0001\u0007\u178a\u0ff8\u0335\u17f6\u178a\u0ff8\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0c8b\u0d52\u180d\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000f\u0d53\u1729\u1740\u1771\u178e\u17b3\u17ca\u17f6\u180d" + "\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u17fe\u1800\u1802\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u1808\u180c\u180a\u0002\u180a\u0002\u0000\u0002\u0000\u0004\u1812\u1816\u1814\u0002\u1814\u0002\u0000\u0002\u0000\u0008\u1820\u1835\u1836\u1837\u1838\u1837\u1838\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u1835\u1847\u1860\u178e\u1870\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + "\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u1852\u1853\u1854\u1855\u0001\u0001\u0001\u0001\u0002\u1858\u0001\u0002\u185b\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u1853\u186f\u1870\u0001\u0001\u0002\u1873\u0001\u0002\u1854\n\u1880" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u1882\u0001\u0002\u1847\n\u188f\u1891\u1892\u1893\u0704\u1860\u1894\u1896\u0705\u0002\u0000\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0005\u0705\u0705\u178a\u0334\u0004\u188f\u178e\u1894\u0003\u16e0\u16e0\u0002\u17c8\u0002\u1870\u0002\u18aa\u0002\u0000\u0003\u18af\u18b1\u0002\u0000\u0002\u0000\u0002\u18b5\u0002\u0000\u0002\u18b9\u0002\u0000\u0017\u18d2\u18d4\u18d6\u18d8" + "\u1881\u1882\u1883\u1884\u189a\u1883\u1884\u189a\u0001\u0001\u0001\u0001\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u18b3\u18b3\u0001\u0002\u18b6\u0001\u0002\u18b9\u0001\u0004\u18be\u18d0\u18d0\u0012\u0000" +
"\u18da\u18dc\u18de\u18e0\u18e2\u18e4\u18e6\u18e8\u18ea\u18ec\u18ee\u18f0\u18f2\u18f4\u18f6\u18f8\u18fa\u18fc\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u1902\u1904\u1906\u0002\u0000\u0002\u0000\u0002\u0000" + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u1855\u18d7\u18ea\u18fd\u18fd\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0004\u190c\u1910\u190e\u0002\u190e\u0002\u0000\u0002\u0000\u0004\u1916\u191a\u1918\u0002\u1918\u0002\u0000\u0002\u0000\u0008\u1924\u1939\u193a\u193b\u193c\u193b\u193c\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0009\u1919\u191a\u1881\u18d7\u191b\u192b\u192c\u192c\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\n\u1937\u1882\u18b6\u18ea\u1938\u192b\u1836\u192b\u1836\u0001\u0011\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1953\u1954\u1883\u18fd\u1955\u192c" +
"\u0000\u0005\u1956\u1957\u1958\u1959\u0001\u0001\u0001\u0001\u0002\u195c\u0001\u0002\u195f\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u1957\u1973\u1974\u0001\u0001\u0002\u1977\u0001\u0002\u1958\n\u1984\u1985\u1986\u1987\u1988\u199e\u1987\u1988\u199e\u0001\u0001\u0001\u0001\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + "\u1837\u192c\u1837\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u1967\u0001\u0007\u1835\u1882\u1883\u196f\u1970\u1881\u0001\u0001\u0002\u1880\u0009\u1838\u1870\u1884\u18d0\u192b\u192c\u197c\u192c\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u189a\u1836\u1837\u1995\u1837\u001c\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u19b7\u19b7\u0001\u0002\u19ba\u0001\u0002\u19bd\u0001\u0004\u19c2\u19d4\u19d4\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u1959\u19db\u19ee\u1a01\u1a01\u0013\u0000\u0000\u0000\u0000" + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1953\u1954\u1883\u18fd\u192c\u1837\u1955\u192c\u1837\u0009\u1838\u1870\u1884\u18d0\u192b\u192c\u192c\u197c\u0006\u189a\u1836\u1837\u1837\u1995\u000c\u19d6\u19d7\u19d8\u19d9\u19da\u19db\u19dc\u19dd\u19de\u19df\u19e0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0009\u1a1d\u1a1e\u1985\u19db\u1a1f\u1a2f\u1a30\u1a30\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + "\u0001\u0004\u19e5\u19e6\u19e7\u0001\u0001\u0001\u0003\u19eb\u19ec\u0001\u0001\u0007\u19f4\u19f5\u19f6\u19f7\u19f8\u19f9\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u19fd\u19fe\u0001\u0001\u0004\u1a03\u1a04\u1a05\u0001\u0001\u0001\u0003\u1a09\u1a0a\u0001\u0001\u0002\u1a0d\u0001\u0002\u1a10\u0001\u0002\u1a13\u0001\u0002\u1a16\u0001\u0004\u1a1b\u1a1c\u1a1d\u0001\u0001\u0001\u0002\u1a20\u0001\u0003\u1a24\u1a25\u0001\u0001\u0002\u1a28" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\n\u1a3b\u1986\u19ba\u19ee\u1a3c\u1a2f\u193a\u1a2f\u193a\u0001\u0011\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1a57\u1a58\u1987\u1a01\u1a59\u1a30\u193b\u1a30\u193b\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u1a6b\u0001\u0007\u1939\u1986\u1987" + "\u0001\u0004\u1a2d\u1a2e\u1a2f\u0001\u0001\u0001\u0002\u1a32\u0001\u0004\u1a37\u1a38\u1a39\u0001\u0001\u0001\u0002\u1a3c\u0001\u0002\u1a3f\u0001\u0002\u1a42\u0001\u0002\u1a45\u0001\u0002\u1a48\u0001\u0002\u1a4b\u0001\u0002\u1a4e\u0001\u0002\u1a51\u0001\u0002\u1a54\u0001\u0006\u1a5b\u1a5c\u1a5d\u1a5e\u1a5f\u0001\u0001\u0001\u0001\u0001\u0002\u1a62\u0001\u0002\u1a65\u0001\u0005\u1a6b\u1a6c\u1a6d\u1a6e\u0001\u0001\u0001\u0001\u0003" +
"\u1a73\u1a74\u1985\u0001\u0001\u0002\u1984\u0009\u193c\u1974\u1988\u19d4\u1a2f\u1a30\u1a80\u1a30\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u199e\u193a\u193b\u1a99\u193b\u001c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1a57\u1a58" + "\u1a72\u1a73\u0001\u0001\u0005\u1a79\u1a7a\u1a7b\u1a7c\u0001\u0001\u0001\u0001\u0003\u1a80\u1a81\u0001\u0001\u0011\u1a93\u1a94\u1a95\u1a96\u1a97\u1a98\u1a99\u1a9a\u1a9b\u1a9c\u1a9d\u1a9e\u1a9f\u1aa0\u1aa1\u1aa2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1a9e\u0011\u1ab6\u1ab7\u1ab8\u1ab9\u1aba\u1abb\u1abc\u1abd\u1abe\u1abf\u1ac0\u1ac1\u1ac2\u1ac3\u1ac4\u1ac5\u0001\u0001" +
"\u1987\u1a01\u1a30\u193b\u1a59\u1a30\u193b\u0009\u193c\u1974\u1988\u19d4\u1a2f\u1a30\u1a30\u1a80\u0006\u199e\u193a\u193b\u193b\u1a99\u000c\u1ada\u1adb\u1adc\u1add\u1ade\u1adf\u1ae0\u1ae1\u1ae2\u1ae3\u1ae4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1ae9\u1aea\u1aeb\u0001\u0001\u0001\u0003\u1aef\u1af0\u0001\u0001\u0007\u1af8\u1af9\u1afa\u1afb\u1afc\u1afd\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1b01" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1abd\u000c\u1ad4\u1ad5\u1ad6\u1ad7\u1ad8\u1ad9\u1ada\u1adb\u1adc\u1add\u1ade\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1ae2\u1ae3\u0001\u0001\u0003\u1ae7\u1ae8\u0001\u0001\u0003\u1aec\u1aed\u0001\u0001\u0002\u1af0\u0001\u0006\u1a9f\u1aa0\u1aa1\u1a98\u1aa2\u0002\u1ac5\u0002\u1afb\u0001\u0002\u1afe\u0001\u0002" +
"\u1b02\u0001\u0001\u0004\u1b07\u1b08\u1b09\u0001\u0001\u0001\u0003\u1b0d\u1b0e\u0001\u0001\u0002\u1b11\u0001\u0002\u1b14\u0001\u0002\u1b17\u0001\u0002\u1b1a\u0001\u0004\u1b1f\u1b20\u1b21\u0001\u0001\u0001\u0002\u1b24\u0001\u0003\u1b28\u1b29\u0001\u0001\u0002\u1b2c\u0001\u0004\u1b31\u1b32\u1b33\u0001\u0001\u0001\u0002\u1b36\u0001\u0004\u1b3b\u1b3c\u1b3d\u0001\u0001\u0001\u0002\u1b40\u0001\u0002\u1b43\u0001\u0002\u1b46\u0001\u0002" + "\u1b01\u0001\u0002\u1b04\u0001\u0004\u1b09\u1b0a\u1b0b\u0001\u0001\u0001\u0004\u1b10\u1b11\u1b12\u0001\u0001\u0001\u0005\u1b18\u1b19\u1b1a\u1b1b\u0001\u0001\u0001\u0001\u0004\u1b20\u1b21\u1b22\u0001\u0001\u0001\u0009\u1b2c\u1b2d\u1b2e\u1b2f\u1b30\u1b31\u1b32\u1b33\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1b2d\u0006\u1b3c\u1b3d\u1b3e\u1b3f\u1b40\u0001\u0001\u0001\u0001\u0001\u0009\u1b4a\u1b4b\u1b4c\u1b4d\u1b4e\u1b4f" +
"\u1b49\u0001\u0002\u1b4c\u0001\u0002\u1b4f\u0001\u0002\u1b52\u0001\u0002\u1b55\u0001\u0002\u1b58\u0001\u0006\u1b5f\u1b60\u1b61\u1b62\u1b63\u0001\u0001\u0001\u0001\u0001\u0002\u1b66\u0001\u0002\u1b69\u0001\u0005\u1b6f\u1b70\u1b71\u1b72\u0001\u0001\u0001\u0001\u0003\u1b76\u1b77\u0001\u0001\u0005\u1b7d\u1b7e\u1b7f\u1b80\u0001\u0001\u0001\u0001\u0003\u1b84\u1b85\u0001\u0001\u0011\u1b97\u1b98\u1b99\u1b9a\u1b9b\u1b9c\u1b9d\u1b9e\u1b9f" + "\u1b50\u1b51\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1b51\u1b4d\u0008\u1b5d\u1b5e\u1b5f\u1b60\u1b61\u1b62\u1b63\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1b68\u1b69\u1b6a\u0001\u0001\u0001\u0002\u1b6d\u0001\u0007\u1b75\u1b76\u1b77\u1b78\u1b79\u1b7a\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1b80\u1b81\u1b82\u1b83\u0001\u0001\u0001\u0001\u0005\u1b89\u1b8a\u1b8b\u1b8c\u0001\u0001\u0001\u0001\u0002\u1b8c\u0008" +
"\u1ba0\u1ba1\u1ba2\u1ba3\u1ba4\u1ba5\u1ba6\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1ba2\u0011\u1bba\u1bbb\u1bbc\u1bbd\u1bbe\u1bbf\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1bc1\u000c\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2" + "\u1b97\u1b98\u1b99\u1b9a\u1b9b\u1b9c\u1b9d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1ba1\u1ba2\u0001\u0001\u0015\u1bb8\u1bb9\u1bba\u1bbb\u1bbc\u1bbd\u1bbe\u1bbf\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1bb9\u0003\u1bc6\u1bc7\u0004\u1bbf\u1bc9\u1bc8\u0002\u1bc1\n" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1be6\u1be7\u0001\u0001\u0003\u1beb\u1bec\u0001\u0001\u0003\u1bf0\u1bf1\u0001\u0001\u0002\u1bf4\u0001\u0006\u1ba3\u1ba4\u1ba5\u1b9c\u1ba6\u0002\u1bc9\u0002\u1bff\u0001\u0002\u1c02\u0001\u0002\u1c05\u0001\u0002\u1c08\u0001\u0004\u1c0d\u1c0e\u1c0f\u0001\u0001\u0001\u0004\u1c14\u1c15\u1c16\u0001\u0001\u0001\u0005\u1c1c\u1c1d\u1c1e\u1c1f\u0001\u0001\u0001\u0001" + "\u1be1\u1be2\u1be3\u1be4\u1be5\u1be6\u1be7\u1be8\u1be9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1bf0\u1bf1\u1bf2\u1bf3\u1bf4\u0001\u0001\u0001\u0001\u0001\u0006\u1bfb\u1bfc\u1bfd\u1bfe\u1bff\u0001\u0001\u0001\u0001\u0001\u0005\u1c05\u1c06\u1c07\u1c08\u0001\u0001\u0001\u0001\u0003\u1c0c\u1c0d\u0001\u0001\u0005\u1c13\u1c14\u1c15\u1c16\u0001\u0001\u0001\u0001\u0002\u1c19\u0001\u0002\u1be5\u0002\u1c06\u0003\u1c21" +
"\u0004\u1c24\u1c25\u1c26\u0001\u0001\u0001\u0009\u1c30\u1c31\u1c32\u1c33\u1c34\u1c35\u1c36\u1c37\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1c31\u0006\u1c40\u1c41\u1c42\u1c43\u1c44\u0001\u0001\u0001\u0001\u0001\u0009\u1c4e\u1c4f\u1c50\u1c51\u1c52\u1c53\u1c54\u1c55\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1c55\u1c51\u0008\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + "\u1c22\u0001\u0001\u0003\u1387\u1c26\u0001\u0003\u0cab\u1c2a\u0001\u0003\u1388\u1c2e\u0001\u0003\u0cac\u1c32\u0001\u0002\u1c35\u0001\u0004\u111c\u1389\u1c3a\u0001\u0005\u138a\u1407\u04f5\u1c40\u0001\u0002\u1c43\u0001\u0002\u111d\u0002\u1c48\u0001\u0008\u111e\u04e4\u1c51\u1c52\u1c53\u1c54\u1c55\u0001\u0001\u0001\u0001\u0001\u0002\u1c58\u0001\u0002\u1c5b\u0001\u0004\u1408\u0de1\u1c60\u0001\u0004\u1409\u0de1\u1c65\u0001\u0002\u1c51" +
"\u0004\u1c6c\u1c6d\u1c6e\u0001\u0001\u0001\u0002\u1c71\u0001\u0007\u1c79\u1c7a\u1c7b\u1c7c\u1c7d\u1c7e\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1c84\u1c85\u1c86\u1c87\u0001\u0001\u0001\u0001\u0005\u1c8d\u1c8e\u1c8f\u1c90\u0001\u0001\u0001\u0001\u0002\u1c90\u0008\u1c9b\u1c9c\u1c9d\u1c9e\u1c9f\u1ca0\u1ca1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1ca5\u1ca6\u0001\u0001\u0015\u1cbc\u1cbd\u1cbe\u1cbf\u1cc0\u1cc1\u1cc2\u1cc3" + "\u0002\u138b\u0002\u1c6c\u0001\u0002\u1c6f\u0001\u0002\u1c72\u0001\u0002\u1c75\u0001\u0003\u111f\u1c79\u0001\u0002\u111f\u0002\u1c7e\u0001\u0002\u1c81\u0001\u0002\u1c84\u0001\u0002\u1c87\u0001\u0002\u1c8a\u0001\u0002\u1c8d\u0001\u0002\u1c90\u0001\u0002\u1c93\u0001\u0002\u1c96\u0001\u0002\u1c99\u0001\u0004\u1c9e\u1120\u138c\u0001\u0003\u1ca2\u1121\u0001\u0002\u1ca5\u0001\u0002\u1ca8\u0001\u0002\u1cab\u0001\u0002\u1cae\u0001\u0002" +
"\u1cc4\u1cc5\u1cc6\u1cc7\u1cc8\u1cc9\u1cca\u1ccb\u1ccc\u1ccd\u1cce\u1ccf\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1cbd\u0003\u1cca\u1ccb\u0004\u1cc3\u1ccd\u1ccc\u0002\u1cc5\n\u1ce5\u1ce6\u1ce7\u1ce8\u1ce9\u1cea\u1ceb\u1cec\u1ced\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1cf4\u1cf5\u1cf6\u1cf7\u1cf8\u0001\u0001\u0001\u0001" + "\u1cb1\u0001\u0005\u1423\u1473\u1c52\u1cb7\u0001\u0004\u1122\u1c53\u1cb7\u0002\u1cbe\u0001\u0002\u1cc1\u0001\u0002\u1cc4\u0001\u0002\u1cc7\u0001\u0002\u1cca\u0001\u0002\u1ccd\u0001\u0002\u1cd0\u0001\u0003\u1123\u1cd4\u0001\u0002\u1124\u0002\u1125\u0002\u1126\u0016\u083b\u0d65\u0da7\u0deb\u0e1e\u0e3d\u0e7c\u0fe8\u1550\u1c26\u1c2a\u1c2e\u1c32\u1c3a\u1c40\u1c54\u1c60\u1c65\u1c79\u1cd4\u1cf1\u0001\n\u0c23\u0cad\u0d23\u0fe9\u1127" +
"\u0001\u0006\u1cff\u1d00\u1d01\u1d02\u1d03\u0001\u0001\u0001\u0001\u0001\u0005\u1d09\u1d0a\u1d0b\u1d0c\u0001\u0001\u0001\u0001\u0003\u1d10\u1d11\u0001\u0001\u0005\u1d17\u1d18\u1d19\u1d1a\u0001\u0001\u0001\u0001\u0002\u1d1d\u0001\u0002\u1ce9\u0002\u1d0a\u0003\u1d25\u1d26\u0001\u0001\u0003\u13d1\u1d2a\u0001\u0003\u0cca\u1d2e\u0001\u0003\u13d2\u1d32\u0001\u0003\u0ccb\u1d36\u0001\u0002\u1d39\u0001\u0004\u115d\u13d3\u1d3e\u0001\u0005" + "\u138d\u1424\u1c55\u1cf1\u0002\u1cfe\u0001\u00ea\u1de9\u066c\u06cc\u0706\u07ce\u06cd\u06ce\u0351\u0cfd\u0c95\u0cfe\u1dee\u1df2\u1df5\u1df8\u1dfb\u1dfe\u1e01\u1e04\u1e07\u1e0a\u1e0d\u0ddf\u1401\u0e36\u0e66\u07d3\u07d4\u0c59\u0c94\u1222\u1e12\u0d58\u0e0f\u1e13\u0ca6\u12fa\u0e13\u0e14\u0d5a\u0e18\u1e14\u0d00\u0688\u0d02\u1e15\u0f3a\u1e1d\u1e1e\u1e1f\u1e20\u1e21\u1e22\u1e23\u1e24\u1e25\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u162d\u1e2c" +
"\u13d4\u1451\u04f5\u1d44\u0001\u0002\u1d47\u0001\u0002\u115e\u0002\u1d4c\u0001\u0008\u115f\u04e4\u1d55\u1d56\u1d57\u1d58\u1d59\u0001\u0001\u0001\u0001\u0001\u0002\u1d5c\u0001\u0002\u1d5f\u0001\u0004\u1452\u0e12\u1d64\u0001\u0004\u1453\u0e12\u1d69\u0001\u0002\u1d55\u0002\u13d5\u0002\u1d70\u0001\u0002\u1d73\u0001\u0002\u1d76\u0001\u0002\u1d79\u0001\u0003\u1160\u1d7d\u0001\u0002\u1160\u0002\u1d82\u0001\u0002\u1d85\u0001\u0002\u1d88" + "\u1e2d\u1e2f\u1e30\u0d1f\u1e31\u1e32\u1e33\u1e34\u1e35\u16ef\u16ea\u1e37\u1e38\u1e3a\u1e3b\u179e\u1e3c\u0fb7\u0d22\u1640\u0d1e\u1e3d\u1665\u166f\u16b6\u0d1f\u1e3f\u1e4b\u1e52\u1e58\u1e5f\u1e65\u1e6a\u1e70\u1e7c\u1e82\u1e88\u1e8f\u1e9c\u1884\u189a\u1967\u1ea2\u191b\u1ea3\u1ea4\u1870\u1ea5\u1ea6\u1ea7\u1ea8\u1ea9\u18b3\u1995\u1eaa\u1eab\u1eac\u18d0\u1ead\u1eae\u1eaf\u192b\u192c\u1dee\u1df2\u1df5\u1df8\u1dfb\u1dfe\u1e01\u1e04\u1e07" +
"\u0001\u0002\u1d8b\u0001\u0002\u1d8e\u0001\u0002\u1d91\u0001\u0002\u1d94\u0001\u0002\u1d97\u0001\u0002\u1d9a\u0001\u0002\u1d9d\u0001\u0004\u1da2\u1161\u13d6\u0001\u0003\u1da6\u1162\u0001\u0002\u1da9\u0001\u0002\u1dac\u0001\u0002\u1daf\u0001\u0002\u1db2\u0001\u0002\u1db5\u0001\u0005\u146d\u14bd\u1d56\u1dbb\u0001\u0004\u1163\u1d57\u1dbb\u0002\u1dc2\u0001\u0002\u1dc5\u0001\u0002\u1dc8\u0001\u0002\u1dcb\u0001\u0002\u1dce\u0001\u0002" + "\u1e0a\u1938\u1eb0\u197c\u1995\u1eb1\u1955\u1dee\u1df2\u1df5\u1df8\u1dfb\u1dfe\u1e01\u1e04\u1e07\u1e0a\u1eb2\u1eb3\u1eb4\u1eb5\u1eb6\u1eb7\u1eb8\u1eb9\u1eba\u1ebb\u1ebc\u1ebd\u1ebe\u1ebf\u19d6\u19d7\u19d8\u1ec0\u1ec1\u1ec2\u19d9\u1ec6\u1ec7\u19da\u19db\u1ec8\u1ec9\u1ecd\u19dc\u1ed1\u19dd\u1ed5\u19de\u19df\u19e0\u1ed6\u1ed7\u1edb\u1edf\u1ee0\u1ee1\u1ee2\u1ee3\u1ee4\u1ee5\u1ee6\u1ee7\u1ee8\u1ee9\u1eea\u1eeb\u1eec\u1eed\u1eee\u1385" +
"\u1dd1\u0001\u0002\u1dd4\u0001\u0003\u1164\u1dd8\u0001\u0002\u1165\u0002\u1166\u0002\u1167\u0016\u084e\u0d96\u0dd8\u0e1c\u0e4f\u0e6e\u0ead\u1029\u159a\u1d2a\u1d2e\u1d32\u1d36\u1d3e\u1d44\u1d58\u1d64\u1d69\u1d7d\u1dd8\u1df5\u0001\n\u0c36\u0ccc\u0d54\u102a\u1168\u13d7\u146e\u1d59\u1df5\u0002\u1e02\u0001\u0104\u1f07\u067f\u06df\u0719\u07e1\u06e0\u06e1\u0351\u0d26\u0cb4\u0d27\u1f0c\u1f10\u1f13\u1f16\u1f19\u1f1c\u1f1f\u1f22\u1f25" + "\u1e15\u0f48\u0e0d\u0e19\u0e0e\u0e1c\u1eef\u1ef0\u1ef1\u1ef2\u1ef3\u1ef4\u1c35\u1c43\u1ef5\u1ef6\u1ef7\u1ef8\u1ef9\u1120\u1121\u1efa\u1672\u1efb\u1efc\u0005\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0008\u0000\u0000" +
"\u1f28\u1f2b\u0e10\u144b\u0e67\u0e97\u07e6\u07e7\u0c72\u0cb3\u1264\u1f30\u0d89\u0e40\u1f31\u0cc5\u1341\u0e44\u0e45\u0d8b\u0e49\u1f32\u0d29\u069b\u0d2b\u1f33\u0f73\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f46\u1f47\u1f48\u1f49\u1738\u1760\u1786\u1738\u1f4a\u1f4c\u1f4d\u0d50\u1f4e\u1f4f\u1f50\u1f51\u1f52\u17ee\u1f54\u17ec\u17e6\u1f55\u1f56\u1f58\u1f59\u188f\u1769\u1f5a\u0ff7\u1f5b\u0d53\u173c\u0d4f\u1f5c" + "\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0002\u0000\u0001\u0001\u0001\u0002\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006" +
"\u1761\u176b\u17b2\u0d50\u1f75\u1f81\u1f88\u1f8e\u1f95\u1f9b\u1fa0\u1fa6\u1fb2\u1fb8\u1fbe\u1fc5\u1fd2\u1988\u199e\u1a6b\u1fd8\u1a1f\u1956\u1fd9\u1fda\u1973\u1974\u1fdb\u1977\u1fdc\u1fdc\u1fdd\u1fde\u19b7\u1a99\u1fdf\u1fe0\u1fe1\u19d4\u1fe2\u1fe3\u1fe4\u19ba\u1fe5\u1a2f\u1a30\u1f0c\u1f10\u1f13\u1f16\u1f19\u1f1c\u1f1f\u1f22\u1f25\u1f28\u1fdd\u1a3c\u1fe6\u1fe7\u1a80\u1a99\u1fe8\u1a59\u1f0c\u1f10\u1f13\u1f16\u1f19\u1f1c\u1f1f\u1f22" + "\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u1f25\u1f28\u1fe9\u1fea\u1feb\u1fec\u1fed\u1fee\u1fef\u1ff0\u1ff1\u1ff2\u1ff3\u1ff4\u1ff5\u1ff6\u1ada\u1adb\u1adc\u1ff7\u1ff8\u1ff9\u1add\u1ffd\u1ffe\u1ade\u1adf\u1fff\u2000\u2004\u1ae0\u2008\u1ae1\u200c\u1ae2\u1ae3\u1ae4\u200d\u200e\u2012\u2016\u2017\u2018\u2019\u201a\u201b\u201c\u201d\u201e\u201f\u2020\u2021\u2022\u2023\u2024\u2025\u2026\u2028\u202a\u202c\u202e\u13cf\u1f33\u0f83\u0e3e\u0e4a\u0e3f\u0e4d\u2030\u2031\u2032\u2033" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u2034\u2035\u1d39\u115d\u04f5\u2036\u2037\u2038\u2039\u203a\u1161\u1162\u146d\u203b\u1dd8\u13d6\u1166\u1167\u084e\u176e\u203c\u203d\u203e\u0005\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0008\u0000\u0000\u0000\u0000" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f10\u1f11\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f1d\u1f1e\u1f1f\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f38\u1f39\u1f3a\u1f3b\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" + "\u0001\u0001\u0001\u0001\u000b\u1f47\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f4e\u1f4f\u1f50\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f5c\u1f5d\u1f5e\u1f5f\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f86\u1f87\u1f88\u1f89" +
"\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\r\u0000\u0000" + "\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u006f\u0f55\u0d0b\u1fff\u2002\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u200c\u1eba\u1ebb\u200d\u200e\u200f\u2010\u2011\u2012\u2013\u2014\u2015\u2016\u2017\u2018\u2019\u201a\u201b\u201c\u201d\u201e\u1ee5\u1eb4\u201f\u1eb5\u2020\u2021\u1eec\u2022\u2023\u2024\u2025\u2026\u2027\u2028\u2029\u202a\u202b\u202c\u202d\u202e\u202f\u2030\u2031" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0004\u0000" + "\u2032\u2033\u2034\u2035\u2036\u2037\u2038\u2039\u203a\u203c\u203e\u2040\u2042\u0f48\u2044\u2045\u2046\u2047\u2048\u2049\u204a\u204b\u204c\u204d\u204e\u204f\u2050\u2051\u2053\u2055\u2056\u2059\u205c\u205f\u2060\u0f48\u0e0d\u0e19\u0e0e\u0e1c\u1ef1\u1ef2\u1ef3\u1ef4\u2061\u2062\u2063\u2064\u2065\u2066\u2067\u2068\u2069\u206a\u206b\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b" + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0001\u0003\u0000" +
"\u2062\u2063\u2064\u2065\u2066\u2067\u2068\u2069\u206a\u206b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u2077\u2078\u2079\u207a\u207b\u207c\u207d\u207e\u207f\u2080\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u208c\u208d\u208e\u208f\u2090\u2091\u2092\u2093\u2094\u2095\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u20a1\u20a2\u20a3\u20a4\u20a5\u20a6\u20a7\u20a8\u20a9" + "\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001").toCharArray();
"\u20aa\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb\u20bc\u20bd\u20be\u20bf\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u20cb\u20cc\u20cd\u20ce\u20cf\u20d0\u20d1\u20d2\u20d3\u20d4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u20e0\u20e1\u20e2\u20e3\u20e4\u20e5\u20e6\u20e7\u20e8\u20e9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0071\u0f91\u0d34\u215b\u215e\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u1ff1\u1ff2\u2169\u216a\u216b\u216c\u216d\u216e\u216f\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217a\u201c\u1feb\u217b\u1fec\u217c\u217d\u2023\u217e\u217f\u2180\u2181\u2182\u2183\u2184\u2185\u2186\u2187\u2188\u2189\u218a\u218b\u218c\u218d\u218e\u218f\u2190\u2191\u2192\u2193\u2194\u2195\u0f83\u2196\u2197\u2198\u2199\u219a" +
"\u219b\u219c\u219d\u219e\u219f\u21a0\u21a1\u21a2\u21a3\u21a5\u21a7\u21a8\u21ab\u21ae\u21b1\u21b2\u0f83\u0e3e\u0e4a\u0e3f\u0e4d\u2032\u2033\u2034\u2035\u1d47\u1d4c\u1da2\u1da6\u1da9\u1dac\u21b3\u21b4\u21b5\u21b6\u21b7\u21b8\u21b9\u21ba\u21bb\u21bc\u21bd\u21be\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u21c4" +
"\u21c7\u21ca\u21cd\u21d0\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000").toCharArray();
public static final int accent_aigu = 1; public static final int accent_aigu = 1;
public static final int accent_arrows = 130; public static final int accent_arrows = 130;
@@ -274,13 +264,13 @@ public final class ComposeKeyData
public static final int accent_tilde = 1144; public static final int accent_tilde = 1144;
public static final int accent_trema = 1172; public static final int accent_trema = 1172;
public static final int compose = 1270; public static final int compose = 1270;
public static final int fn = 7683; public static final int fn = 7423;
public static final int numpad_bengali = 8279; public static final int numpad_bengali = 7933;
public static final int numpad_devanagari = 8300; public static final int numpad_devanagari = 7954;
public static final int numpad_gujarati = 8321; public static final int numpad_gujarati = 7975;
public static final int numpad_hindu = 8342; public static final int numpad_hindu = 7996;
public static final int numpad_kannada = 8363; public static final int numpad_kannada = 8017;
public static final int numpad_persian = 8384; public static final int numpad_persian = 8038;
public static final int numpad_tamil = 8405; public static final int numpad_tamil = 8059;
public static final int shift = 8426; public static final int shift = 8080;
} }

View File

@@ -5,24 +5,20 @@ import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.KeyEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import juloo.keyboard2.prefs.CustomExtraKeysPreference; import juloo.keyboard2.prefs.CustomExtraKeysPreference;
import juloo.keyboard2.prefs.ExtraKeysPreference; import juloo.keyboard2.prefs.ExtraKeysPreference;
import juloo.keyboard2.prefs.LayoutsPreference; import juloo.keyboard2.prefs.LayoutsPreference;
public final class Config public final class Config
{ {
/**
* Width of the Android phones is around 300-600dp in portrait, 600-1400dp in landscape,
* depending on the user's size settings.
*
* 600 dp seems a reasonable midpoint to determine whether the current orientation of the device is "wide"
* (landsacpe, tablet, unfolded foldable etc.) or not, to switch to a different layout.
*/
public static final int WIDE_DEVICE_THRESHOLD = 600;
private final SharedPreferences _prefs; private final SharedPreferences _prefs;
// From resources // From resources
@@ -32,6 +28,10 @@ public final class Config
public final float labelTextSize; public final float labelTextSize;
public final float sublabelTextSize; public final float sublabelTextSize;
public final KeyboardData.Row bottom_row;
public final KeyboardData.Row number_row;
public final KeyboardData num_pad;
// From preferences // From preferences
/** [null] represent the [system] layout. */ /** [null] represent the [system] layout. */
public List<KeyboardData> layouts; public List<KeyboardData> layouts;
@@ -39,7 +39,6 @@ public final class Config
// From the 'numpad_layout' option, also apply to the numeric pane. // From the 'numpad_layout' option, also apply to the numeric pane.
public boolean inverse_numpad = false; public boolean inverse_numpad = false;
public boolean add_number_row; public boolean add_number_row;
public boolean number_row_symbols;
public float swipe_dist_px; public float swipe_dist_px;
public float slide_step_px; public float slide_step_px;
// Let the system handle vibration when false. // Let the system handle vibration when false.
@@ -50,8 +49,7 @@ public final class Config
public long longPressInterval; public long longPressInterval;
public boolean keyrepeat_enabled; public boolean keyrepeat_enabled;
public float margin_bottom; public float margin_bottom;
public int keyboardHeightPercent; public float keyHeight;
public int screenHeightPixels;
public float horizontal_margin; public float horizontal_margin;
public float key_vertical_margin; public float key_vertical_margin;
public float key_horizontal_margin; public float key_horizontal_margin;
@@ -66,7 +64,7 @@ public final class Config
public int theme; // Values are R.style.* public int theme; // Values are R.style.*
public boolean autocapitalisation; public boolean autocapitalisation;
public boolean switch_input_immediate; public boolean switch_input_immediate;
public NumberLayout selected_number_layout; public boolean pin_entry_enabled;
public boolean borderConfig; public boolean borderConfig;
public int circle_sensitivity; public int circle_sensitivity;
public boolean clipboard_history_enabled; public boolean clipboard_history_enabled;
@@ -82,14 +80,13 @@ public final class Config
public final IKeyEventHandler handler; public final IKeyEventHandler handler;
public boolean orientation_landscape = false; public boolean orientation_landscape = false;
public boolean foldable_unfolded = false;
public boolean wide_screen = false;
/** Index in 'layouts' of the currently used layout. See /** Index in 'layouts' of the currently used layout. See
[get_current_layout()] and [set_current_layout()]. */ [get_current_layout()] and [set_current_layout()]. */
int current_layout_narrow; int current_layout_portrait;
int current_layout_wide; int current_layout_landscape;
public int bottomInsetMin;
private Config(SharedPreferences prefs, Resources res, IKeyEventHandler h, Boolean foldableUnfolded) private Config(SharedPreferences prefs, Resources res, IKeyEventHandler h)
{ {
_prefs = prefs; _prefs = prefs;
// static values // static values
@@ -97,8 +94,18 @@ public final class Config
keyPadding = res.getDimension(R.dimen.key_padding); keyPadding = res.getDimension(R.dimen.key_padding);
labelTextSize = 0.33f; labelTextSize = 0.33f;
sublabelTextSize = 0.22f; sublabelTextSize = 0.22f;
try
{
number_row = KeyboardData.load_number_row(res);
bottom_row = KeyboardData.load_bottom_row(res);
num_pad = KeyboardData.load_num_pad(res);
}
catch (Exception e)
{
throw new RuntimeException(e.getMessage()); // Not recoverable
}
// from prefs // from prefs
refresh(res, foldableUnfolded); refresh(res);
// initialized later // initialized later
shouldOfferVoiceTyping = false; shouldOfferVoiceTyping = false;
actionLabel = null; actionLabel = null;
@@ -111,12 +118,13 @@ public final class Config
/* /*
** Reload prefs ** Reload prefs
*/ */
public void refresh(Resources res, Boolean foldableUnfolded) public void refresh(Resources res)
{ {
DisplayMetrics dm = res.getDisplayMetrics(); DisplayMetrics dm = res.getDisplayMetrics();
orientation_landscape = res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; orientation_landscape = res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
foldable_unfolded = foldableUnfolded; // 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;
float characterSizeScale = 1.f; float characterSizeScale = 1.f;
String show_numpad_s = _prefs.getString("show_numpad", "never"); String show_numpad_s = _prefs.getString("show_numpad", "never");
show_numpad = "always".equals(show_numpad_s); show_numpad = "always".equals(show_numpad_s);
@@ -124,18 +132,16 @@ public final class Config
{ {
if ("landscape".equals(show_numpad_s)) if ("landscape".equals(show_numpad_s))
show_numpad = true; show_numpad = true;
keyboardHeightPercent = _prefs.getInt(foldable_unfolded ? "keyboard_height_landscape_unfolded" : "keyboard_height_landscape", 50); keyboardHeightPercent = _prefs.getInt("keyboard_height_landscape", 50);
characterSizeScale = 1.25f; characterSizeScale = 1.25f;
} }
else else
{ {
keyboardHeightPercent = _prefs.getInt(foldable_unfolded ? "keyboard_height_unfolded" : "keyboard_height", 35); keyboardHeightPercent = _prefs.getInt("keyboard_height", 35);
} }
layouts = LayoutsPreference.load_from_preferences(res, _prefs); layouts = LayoutsPreference.load_from_preferences(res, _prefs);
inverse_numpad = _prefs.getString("numpad_layout", "default").equals("low_first"); inverse_numpad = _prefs.getString("numpad_layout", "default").equals("low_first");
String number_row = _prefs.getString("number_row", "no_number_row"); add_number_row = _prefs.getBoolean("number_row", false);
add_number_row = !number_row.equals("no_number_row");
number_row_symbols = number_row.equals("symbols");
// The baseline for the swipe distance correspond to approximately the // The baseline for the swipe distance correspond to approximately the
// width of a key in portrait mode, as most layouts have 10 columns. // width of a key in portrait mode, as most layouts have 10 columns.
// Multipled by the DPI ratio because most swipes are made in the diagonals. // Multipled by the DPI ratio because most swipes are made in the diagonals.
@@ -144,8 +150,7 @@ public final class Config
float swipe_scaling = Math.min(dm.widthPixels, dm.heightPixels) / 10.f * dpi_ratio; float swipe_scaling = Math.min(dm.widthPixels, dm.heightPixels) / 10.f * dpi_ratio;
float swipe_dist_value = Float.valueOf(_prefs.getString("swipe_dist", "15")); float swipe_dist_value = Float.valueOf(_prefs.getString("swipe_dist", "15"));
swipe_dist_px = swipe_dist_value / 25.f * swipe_scaling; swipe_dist_px = swipe_dist_value / 25.f * swipe_scaling;
float slider_sensitivity = Float.valueOf(_prefs.getString("slider_sensitivity", "30")) / 100.f; slide_step_px = 0.2f * swipe_scaling;
slide_step_px = slider_sensitivity * swipe_scaling;
vibrate_custom = _prefs.getBoolean("vibrate_custom", false); vibrate_custom = _prefs.getBoolean("vibrate_custom", false);
vibrate_duration = _prefs.getInt("vibrate_duration", 20); vibrate_duration = _prefs.getInt("vibrate_duration", 20);
longPressTimeout = _prefs.getInt("longpress_timeout", 600); longPressTimeout = _prefs.getInt("longpress_timeout", 600);
@@ -164,7 +169,9 @@ public final class Config
borderConfig = _prefs.getBoolean("border_config", false); borderConfig = _prefs.getBoolean("border_config", false);
customBorderRadius = _prefs.getInt("custom_border_radius", 0) / 100.f; customBorderRadius = _prefs.getInt("custom_border_radius", 0) / 100.f;
customBorderLineWidth = get_dip_pref(dm, "custom_border_line_width", 0); customBorderLineWidth = get_dip_pref(dm, "custom_border_line_width", 0);
screenHeightPixels = dm.heightPixels; // Do not substract key_vertical_margin from keyHeight because this is done
// during rendering.
keyHeight = dm.heightPixels * keyboardHeightPercent / 100 / 4;
horizontal_margin = horizontal_margin =
get_dip_pref_oriented(dm, "horizontal_margin", 3, 28); get_dip_pref_oriented(dm, "horizontal_margin", 3, 28);
double_tap_lock_shift = _prefs.getBoolean("lock_double_tap", false); double_tap_lock_shift = _prefs.getBoolean("lock_double_tap", false);
@@ -176,32 +183,30 @@ public final class Config
switch_input_immediate = _prefs.getBoolean("switch_input_immediate", false); switch_input_immediate = _prefs.getBoolean("switch_input_immediate", false);
extra_keys_param = ExtraKeysPreference.get_extra_keys(_prefs); extra_keys_param = ExtraKeysPreference.get_extra_keys(_prefs);
extra_keys_custom = CustomExtraKeysPreference.get(_prefs); extra_keys_custom = CustomExtraKeysPreference.get(_prefs);
selected_number_layout = NumberLayout.of_string(_prefs.getString("number_entry_layout", "pin")); pin_entry_enabled = _prefs.getBoolean("pin_entry_enabled", true);
current_layout_narrow = _prefs.getInt("current_layout_portrait", 0); current_layout_portrait = _prefs.getInt("current_layout_portrait", 0);
current_layout_wide = _prefs.getInt("current_layout_landscape", 0); current_layout_landscape = _prefs.getInt("current_layout_landscape", 0);
circle_sensitivity = Integer.valueOf(_prefs.getString("circle_sensitivity", "2")); circle_sensitivity = Integer.valueOf(_prefs.getString("circle_sensitivity", "2"));
clipboard_history_enabled = _prefs.getBoolean("clipboard_history_enabled", false); clipboard_history_enabled = _prefs.getBoolean("clipboard_history_enabled", false);
bottomInsetMin = Utils.is_navigation_bar_gestural(res) ?
float screen_width_dp = dm.widthPixels / dm.density; (int)res.getDimension(R.dimen.bottom_inset_min) : 0;
wide_screen = screen_width_dp >= WIDE_DEVICE_THRESHOLD;
} }
public int get_current_layout() public int get_current_layout()
{ {
return (wide_screen) return (orientation_landscape)
? current_layout_wide : current_layout_narrow; ? current_layout_landscape : current_layout_portrait;
} }
public void set_current_layout(int l) public void set_current_layout(int l)
{ {
if (wide_screen) if (orientation_landscape)
current_layout_wide = l; current_layout_landscape = l;
else else
current_layout_narrow = l; current_layout_portrait = l;
SharedPreferences.Editor e = _prefs.edit(); SharedPreferences.Editor e = _prefs.edit();
e.putInt("current_layout_portrait", current_layout_narrow); e.putInt("current_layout_portrait", current_layout_portrait);
e.putInt("current_layout_landscape", current_layout_wide); e.putInt("current_layout_landscape", current_layout_landscape);
e.apply(); e.apply();
} }
@@ -211,6 +216,190 @@ public final class Config
_prefs.edit().putBoolean("clipboard_history_enabled", e).commit(); _prefs.edit().putBoolean("clipboard_history_enabled", e).commit();
} }
KeyValue action_key()
{
// Update the name to avoid caching in KeyModifier
return (actionLabel == null) ? null : KeyValue.makeActionKey(actionLabel);
}
/** Update the layout according to the configuration.
* - Remove the switching key if it isn't needed
* - Remove "localized" keys from other locales (not in 'extra_keys')
* - Replace the action key to show the right label
* - Swap the enter and action keys
* - Add the optional numpad and number row
* - Add the extra keys
*/
public KeyboardData modify_layout(KeyboardData kw)
{
final KeyValue action_key = action_key();
// Extra keys are removed from the set as they are encountered during the
// first iteration then automatically added.
final Map<KeyValue, KeyboardData.PreferredPos> extra_keys = new HashMap<KeyValue, KeyboardData.PreferredPos>();
final Set<KeyValue> remove_keys = new HashSet<KeyValue>();
// Make sure the config key is accessible to avoid being locked in a custom
// layout.
extra_keys.put(KeyValue.getKeyByName("config"), KeyboardData.PreferredPos.ANYWHERE);
extra_keys.putAll(extra_keys_param);
extra_keys.putAll(extra_keys_custom);
if (extra_keys_subtype != null && kw.locale_extra_keys)
{
Set<KeyValue> present = new HashSet<KeyValue>();
present.addAll(kw.getKeys().keySet());
present.addAll(extra_keys_param.keySet());
present.addAll(extra_keys_custom.keySet());
extra_keys_subtype.compute(extra_keys,
new ExtraKeys.Query(kw.script, present));
}
KeyboardData.Row added_number_row = null;
if (add_number_row && !show_numpad)
added_number_row = modify_number_row(number_row, kw);
if (added_number_row != null)
remove_keys.addAll(added_number_row.getKeys(0).keySet());
if (kw.bottom_row)
kw = kw.insert_row(bottom_row, kw.rows.size());
kw = kw.mapKeys(new KeyboardData.MapKeyValues() {
public KeyValue apply(KeyValue key, boolean localized)
{
boolean is_extra_key = extra_keys.containsKey(key);
if (is_extra_key)
extra_keys.remove(key);
if (localized && !is_extra_key)
return null;
if (remove_keys.contains(key))
return null;
switch (key.getKind())
{
case Event:
switch (key.getEvent())
{
case CHANGE_METHOD_PICKER:
if (switch_input_immediate)
return KeyValue.getKeyByName("change_method_prev");
return key;
case ACTION:
return (swapEnterActionKey && action_key != null) ?
KeyValue.getKeyByName("enter") : action_key;
case SWITCH_FORWARD:
return (layouts.size() > 1) ? key : null;
case SWITCH_BACKWARD:
return (layouts.size() > 2) ? key : null;
case SWITCH_VOICE_TYPING:
case SWITCH_VOICE_TYPING_CHOOSER:
return shouldOfferVoiceTyping ? key : null;
}
break;
case Keyevent:
switch (key.getKeyevent())
{
case KeyEvent.KEYCODE_ENTER:
return (swapEnterActionKey && action_key != null) ? action_key : key;
}
break;
case Modifier:
switch (key.getModifier())
{
case SHIFT:
if (double_tap_lock_shift)
return key.withFlags(key.getFlags() | KeyValue.FLAG_LOCK);
}
break;
}
return key;
}
});
if (show_numpad)
kw = kw.addNumPad(modify_numpad(num_pad, kw));
if (extra_keys.size() > 0)
kw = kw.addExtraKeys(extra_keys.entrySet().iterator());
if (added_number_row != null)
kw = kw.insert_row(added_number_row, 0);
return kw;
}
/** Handle the numpad layout. The [main_kw] is used to adapt the numpad to
the main layout's script. */
public KeyboardData modify_numpad(KeyboardData kw, KeyboardData main_kw)
{
final KeyValue action_key = action_key();
final int map_digit = KeyModifier.modify_numpad_script(main_kw.numpad_script);
return kw.mapKeys(new KeyboardData.MapKeyValues() {
public KeyValue apply(KeyValue key, boolean localized)
{
switch (key.getKind())
{
case Event:
switch (key.getEvent())
{
case ACTION:
return (swapEnterActionKey && action_key != null) ?
KeyValue.getKeyByName("enter") : action_key;
}
break;
case Keyevent:
switch (key.getKeyevent())
{
case KeyEvent.KEYCODE_ENTER:
return (swapEnterActionKey && action_key != null) ? action_key : key;
}
break;
case Char:
char prev_c = key.getChar();
char c = prev_c;
if (inverse_numpad)
c = inverse_numpad_char(c);
if (map_digit != -1)
{
KeyValue modified = ComposeKey.apply(map_digit, c);
if (modified != null) // Was modified by script
return modified;
}
if (prev_c != c) // Was inverted
return key.withChar(c);
break;
}
return key;
}
});
}
static KeyboardData.MapKeyValues numpad_script_map(String numpad_script)
{
final int map_digit = KeyModifier.modify_numpad_script(numpad_script);
if (map_digit == -1)
return null;
return new KeyboardData.MapKeyValues() {
public KeyValue apply(KeyValue key, boolean localized)
{
switch (key.getKind())
{
case Char:
KeyValue modified = ComposeKey.apply(map_digit, key.getChar());
if (modified != null)
return modified;
break;
}
return key;
}
};
}
/** Modify the pin entry layout. [main_kw] is used to map the digits into the
same script. */
public KeyboardData modify_pinentry(KeyboardData kw, KeyboardData main_kw)
{
KeyboardData.MapKeyValues m = numpad_script_map(main_kw.numpad_script);
return m == null ? kw : kw.mapKeys(m);
}
/** Modify the number row according to [main_kw]'s script. */
public KeyboardData.Row modify_number_row(KeyboardData.Row row,
KeyboardData main_kw)
{
KeyboardData.MapKeyValues m = numpad_script_map(main_kw.numpad_script);
return m == null ? row : row.mapKeys(m);
}
private float get_dip_pref(DisplayMetrics dm, String pref_name, float def) private float get_dip_pref(DisplayMetrics dm, String pref_name, float def)
{ {
float value; float value;
@@ -224,13 +413,7 @@ public final class Config
/** [get_dip_pref] depending on orientation. */ /** [get_dip_pref] depending on orientation. */
float get_dip_pref_oriented(DisplayMetrics dm, String pref_base_name, float def_port, float def_land) float get_dip_pref_oriented(DisplayMetrics dm, String pref_base_name, float def_port, float def_land)
{ {
final String suffix; String suffix = orientation_landscape ? "_landscape" : "_portrait";
if (foldable_unfolded) {
suffix = orientation_landscape ? "_landscape_unfolded" : "_portrait_unfolded";
} else {
suffix = orientation_landscape ? "_landscape" : "_portrait";
}
float def = orientation_landscape ? def_land : def_port; float def = orientation_landscape ? def_land : def_port;
return get_dip_pref(dm, pref_base_name + suffix, def); return get_dip_pref(dm, pref_base_name + suffix, def);
} }
@@ -263,14 +446,27 @@ public final class Config
} }
} }
char inverse_numpad_char(char c)
{
switch (c)
{
case '7': return '1';
case '8': return '2';
case '9': return '3';
case '1': return '7';
case '2': return '8';
case '3': return '9';
default: return c;
}
}
private static Config _globalConfig = null; private static Config _globalConfig = null;
public static void initGlobalConfig(SharedPreferences prefs, Resources res, public static void initGlobalConfig(SharedPreferences prefs, Resources res,
IKeyEventHandler handler, Boolean foldableUnfolded) IKeyEventHandler handler)
{ {
migrate(prefs); migrate(prefs);
_globalConfig = new Config(prefs, res, handler, foldableUnfolded); _globalConfig = new Config(prefs, res, handler);
LayoutModifier.init(_globalConfig, res);
} }
public static Config globalConfig() public static Config globalConfig()
@@ -292,7 +488,7 @@ public final class Config
/** Config migrations. */ /** Config migrations. */
private static int CONFIG_VERSION = 3; private static int CONFIG_VERSION = 1;
public static void migrate(SharedPreferences prefs) public static void migrate(SharedPreferences prefs)
{ {
@@ -304,7 +500,7 @@ public final class Config
e.putInt("version", CONFIG_VERSION); e.putInt("version", CONFIG_VERSION);
// Migrations might run on an empty [prefs] for new installs, in this case // Migrations might run on an empty [prefs] for new installs, in this case
// they set the default values of complex options. // they set the default values of complex options.
switch (saved_version) switch (saved_version) // Fallback switch
{ {
case 0: case 0:
// Primary, secondary and custom layout options are merged into the new // Primary, secondary and custom layout options are merged into the new
@@ -318,17 +514,7 @@ public final class Config
if (custom_layout != null && !custom_layout.equals("")) if (custom_layout != null && !custom_layout.equals(""))
l.add(LayoutsPreference.CustomLayout.parse(custom_layout)); l.add(LayoutsPreference.CustomLayout.parse(custom_layout));
LayoutsPreference.save_to_preferences(e, l); LayoutsPreference.save_to_preferences(e, l);
// Fallthrough
case 1: case 1:
boolean add_number_row = prefs.getBoolean("number_row", false);
e.putString("number_row", add_number_row ? "no_symbols" : "no_number_row");
// Fallthrough
case 2:
if (!prefs.contains("number_entry_layout")) {
e.putString("number_entry_layout", prefs.getBoolean("pin_entry_enabled", true) ? "pin" : "number");
}
// Fallthrough
case 3:
default: break; default: break;
} }
e.apply(); e.apply();

View File

@@ -51,14 +51,8 @@ public class Emoji
if ((line = reader.readLine()) != null) if ((line = reader.readLine()) != null)
{ {
String[] tokens = line.split(" "); String[] tokens = line.split(" ");
int last = 0; for (int i = 0; i < tokens.length-1; i++)
for (int i = 1; i < tokens.length; i++) _groups.add(_all.subList(Integer.parseInt(tokens[i]), Integer.parseInt(tokens[i+1])));
{
int next = Integer.parseInt(tokens[i]);
_groups.add(_all.subList(last, next));
last = next;
}
_groups.add(_all.subList(last, _all.size()));
} }
} }
catch (IOException e) { Logs.exn("Emoji.init() failed", e); } catch (IOException e) { Logs.exn("Emoji.init() failed", e); }

View File

@@ -1,62 +0,0 @@
package juloo.keyboard2;
import android.content.Context;
import android.content.pm.PackageManager;
import androidx.window.java.layout.WindowInfoTrackerCallbackAdapter;
import androidx.window.layout.DisplayFeature;
import androidx.window.layout.FoldingFeature;
import androidx.window.layout.WindowInfoTracker;
import androidx.window.layout.WindowLayoutInfo;
import androidx.core.util.Consumer;
public class FoldStateTracker {
private final Consumer<WindowLayoutInfo> _innerListener;
private final WindowInfoTrackerCallbackAdapter _windowInfoTracker;
private FoldingFeature _foldingFeature = null;
private Runnable _changedCallback = null;
public FoldStateTracker(Context context) {
_windowInfoTracker =
new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(context));
_innerListener = new LayoutStateChangeCallback();
_windowInfoTracker.addWindowLayoutInfoListener(context, Runnable::run, _innerListener);
}
public static boolean isFoldableDevice(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE);
}
public boolean isUnfolded() {
// FoldableFeature is only present when the device is unfolded. Otherwise, it's removed.
// A weird decision from Google, but that's how it works:
// https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarAdapter.kt;l=187?q=SidecarAdapter
return _foldingFeature != null;
}
public void close() {
_windowInfoTracker.removeWindowLayoutInfoListener(_innerListener);
}
public void setChangedCallback(Runnable _changedCallback) {
this._changedCallback = _changedCallback;
}
class LayoutStateChangeCallback implements Consumer<WindowLayoutInfo> {
@Override
public void accept(WindowLayoutInfo newLayoutInfo) {
FoldingFeature old = _foldingFeature;
_foldingFeature = null;
for (DisplayFeature feature: newLayoutInfo.getDisplayFeatures()) {
if (feature instanceof FoldingFeature) {
_foldingFeature = (FoldingFeature) feature;
}
}
if (old != _foldingFeature && _changedCallback != null) {
_changedCallback.run();
}
}
}
}

View File

@@ -2,9 +2,7 @@ package juloo.keyboard2;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.os.Looper; import android.os.Looper;
import android.os.Handler;
import android.text.InputType; import android.text.InputType;
import android.view.KeyCharacterMap;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedText;
@@ -29,10 +27,10 @@ public final class KeyEventHandler
[setSelection] could be used instead. */ [setSelection] could be used instead. */
boolean _move_cursor_force_fallback = false; boolean _move_cursor_force_fallback = false;
public KeyEventHandler(IReceiver recv) public KeyEventHandler(Looper looper, IReceiver recv)
{ {
_recv = recv; _recv = recv;
_autocap = new Autocapitalisation(recv.getHandler(), _autocap = new Autocapitalisation(looper,
this.new Autocapitalisation_callback()); this.new Autocapitalisation_callback());
_mods = Pointers.Modifiers.EMPTY; _mods = Pointers.Modifiers.EMPTY;
} }
@@ -41,7 +39,12 @@ public final class KeyEventHandler
public void started(EditorInfo info) public void started(EditorInfo info)
{ {
_autocap.started(info, _recv.getCurrentInputConnection()); _autocap.started(info, _recv.getCurrentInputConnection());
_move_cursor_force_fallback = should_move_cursor_force_fallback(info); // 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. */ /** Selection has been updated. */
@@ -73,11 +76,6 @@ public final class KeyEventHandler
case Compose_pending: case Compose_pending:
_autocap.stop(); _autocap.stop();
break; break;
case Slider:
// Don't wait for the next key_up and move the cursor right away. This
// is called after the trigger distance have been travelled.
handle_slider(key.getSlider(), key.getSliderRepeat(), true);
break;
default: break; default: break;
} }
} }
@@ -98,9 +96,11 @@ public final class KeyEventHandler
case Keyevent: send_key_down_up(key.getKeyevent()); break; case Keyevent: send_key_down_up(key.getKeyevent()); break;
case Modifier: break; case Modifier: break;
case Editing: handle_editing_key(key.getEditing()); break; case Editing: handle_editing_key(key.getEditing()); break;
case Compose_pending: _recv.set_compose_pending(true); break; case Compose_pending:
case Slider: handle_slider(key.getSlider(), key.getSliderRepeat(), false); break; _recv.set_compose_pending(true);
case Macro: evaluate_macro(key.getMacro()); break; break;
case Cursor_move: move_cursor(key.getCursorMove()); break;
case Complex: send_complex_key(key.getComplexKind(), key.getComplex()); break;
} }
update_meta_state(old_mods); update_meta_state(old_mods);
} }
@@ -147,11 +147,11 @@ public final class KeyEventHandler
if (down) if (down)
{ {
_meta_state = _meta_state | meta_flags; _meta_state = _meta_state | meta_flags;
send_keyevent(KeyEvent.ACTION_DOWN, eventCode, _meta_state); send_keyevent(KeyEvent.ACTION_DOWN, eventCode);
} }
else else
{ {
send_keyevent(KeyEvent.ACTION_UP, eventCode, _meta_state); send_keyevent(KeyEvent.ACTION_UP, eventCode);
_meta_state = _meta_state & ~meta_flags; _meta_state = _meta_state & ~meta_flags;
} }
} }
@@ -182,28 +182,23 @@ public final class KeyEventHandler
} }
} }
/*
* Don't set KeyEvent.FLAG_SOFT_KEYBOARD.
*/
void send_key_down_up(int keyCode) void send_key_down_up(int keyCode)
{ {
send_key_down_up(keyCode, _meta_state); send_keyevent(KeyEvent.ACTION_DOWN, keyCode);
send_keyevent(KeyEvent.ACTION_UP, keyCode);
} }
/** Ignores currently pressed system modifiers. */ void send_keyevent(int eventAction, int eventCode)
void send_key_down_up(int keyCode, int metaState)
{
send_keyevent(KeyEvent.ACTION_DOWN, keyCode, metaState);
send_keyevent(KeyEvent.ACTION_UP, keyCode, metaState);
}
void send_keyevent(int eventAction, int eventCode, int metaState)
{ {
InputConnection conn = _recv.getCurrentInputConnection(); InputConnection conn = _recv.getCurrentInputConnection();
if (conn == null) if (conn == null)
return; return;
conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, _meta_state));
metaState, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE));
if (eventAction == KeyEvent.ACTION_UP) if (eventAction == KeyEvent.ACTION_UP)
_autocap.event_sent(eventCode, metaState); _autocap.event_sent(eventCode, _meta_state);
} }
void send_text(CharSequence text) void send_text(CharSequence text)
@@ -224,14 +219,24 @@ public final class KeyEventHandler
conn.performContextMenuAction(id); conn.performContextMenuAction(id);
} }
void send_complex_key(KeyValue.Complex.Kind kind, KeyValue.Complex val)
{
switch (kind)
{
case StringWithSymbol:
send_text(((KeyValue.Complex.StringWithSymbol)val).str);
break;
}
}
@SuppressLint("InlinedApi") @SuppressLint("InlinedApi")
void handle_editing_key(KeyValue.Editing ev) void handle_editing_key(KeyValue.Editing ev)
{ {
switch (ev) switch (ev)
{ {
case COPY: if(is_selection_not_empty()) send_context_menu_action(android.R.id.copy); break; case COPY: send_context_menu_action(android.R.id.copy); break;
case PASTE: send_context_menu_action(android.R.id.paste); break; case PASTE: send_context_menu_action(android.R.id.paste); break;
case CUT: if(is_selection_not_empty()) send_context_menu_action(android.R.id.cut); break; case CUT: send_context_menu_action(android.R.id.cut); break;
case SELECT_ALL: send_context_menu_action(android.R.id.selectAll); break; case SELECT_ALL: send_context_menu_action(android.R.id.selectAll); break;
case SHARE: send_context_menu_action(android.R.id.shareText); break; case SHARE: send_context_menu_action(android.R.id.shareText); break;
case PASTE_PLAIN: send_context_menu_action(android.R.id.pasteAsPlainText); break; case PASTE_PLAIN: send_context_menu_action(android.R.id.pasteAsPlainText); break;
@@ -240,9 +245,6 @@ public final class KeyEventHandler
case REPLACE: send_context_menu_action(android.R.id.replaceText); break; case REPLACE: send_context_menu_action(android.R.id.replaceText); break;
case ASSIST: send_context_menu_action(android.R.id.textAssist); break; case ASSIST: send_context_menu_action(android.R.id.textAssist); break;
case AUTOFILL: send_context_menu_action(android.R.id.autofill); break; case AUTOFILL: send_context_menu_action(android.R.id.autofill); break;
case DELETE_WORD: send_key_down_up(KeyEvent.KEYCODE_DEL, KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON); break;
case FORWARD_DELETE_WORD: send_key_down_up(KeyEvent.KEYCODE_FORWARD_DEL, KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON); break;
case SELECTION_CANCEL: cancel_selection(); break;
} }
} }
@@ -260,20 +262,6 @@ public final class KeyEventHandler
return conn.getExtractedText(_move_cursor_req, 0); return conn.getExtractedText(_move_cursor_req, 0);
} }
/** [r] might be negative, in which case the direction is reversed. */
void handle_slider(KeyValue.Slider s, int r, boolean key_down)
{
switch (s)
{
case Cursor_left: move_cursor(-r); break;
case Cursor_right: move_cursor(r); break;
case Cursor_up: move_cursor_vertical(-r); break;
case Cursor_down: move_cursor_vertical(r); break;
case Selection_cursor_left: move_cursor_sel(r, true, key_down); break;
case Selection_cursor_right: move_cursor_sel(r, false, key_down); break;
}
}
/** Move the cursor right or left, if possible without sending key events. /** Move the cursor right or left, if possible without sending key events.
Unlike arrow keys, the selection is not removed even if shift is not on. 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 Falls back to sending arrow keys events if the editor do not support
@@ -284,199 +272,49 @@ public final class KeyEventHandler
if (conn == null) if (conn == null)
return; return;
ExtractedText et = get_cursor_pos(conn); ExtractedText et = get_cursor_pos(conn);
if (et != null && can_set_selection(conn)) int system_mods =
{
int sel_start = et.selectionStart;
int sel_end = et.selectionEnd;
// Continue expanding the selection even if shift is not pressed
if (sel_end != sel_start)
{
sel_end += d;
if (sel_end == sel_start) // Avoid making the selection empty
sel_end += d;
}
else
{
sel_end += d;
// Leave 'sel_start' where it is if shift is pressed
if ((_meta_state & KeyEvent.META_SHIFT_ON) == 0)
sel_start = sel_end;
}
if (conn.setSelection(sel_start, sel_end))
return; // Fallback to sending key events if [setSelection] failed
}
move_cursor_fallback(d);
}
/** Move one of the two side of a selection. If [sel_left] is true, the left
position is moved, otherwise the right position is moved. */
void move_cursor_sel(int d, boolean sel_left, boolean key_down)
{
InputConnection conn = _recv.getCurrentInputConnection();
if (conn == null)
return;
ExtractedText et = get_cursor_pos(conn);
if (et != null && can_set_selection(conn))
{
int sel_start = et.selectionStart;
int sel_end = et.selectionEnd;
// Reorder the selection when the slider has just been pressed. The
// selection might have been reversed if one end crossed the other end
// with a previous slider.
if (key_down && sel_start > sel_end)
{
sel_start = et.selectionEnd;
sel_end = et.selectionStart;
}
do
{
if (sel_left)
sel_start += d;
else
sel_end += d;
// Move the cursor twice if moving it once would make the selection
// empty and stop selection mode.
} while (sel_start == sel_end);
if (conn.setSelection(sel_start, sel_end))
return; // Fallback to sending key events if [setSelection] failed
}
move_cursor_fallback(d);
}
/** Returns whether the selection can be set using [conn.setSelection()].
This can happen on Termux or when system modifiers are activated for
example. */
boolean can_set_selection(InputConnection conn)
{
final int system_mods =
KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON | KeyEvent.META_META_ON; KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON | KeyEvent.META_META_ON;
return !_move_cursor_force_fallback && (_meta_state & system_mods) == 0; // Fallback to sending key events
if (_move_cursor_force_fallback || et == null
|| (_meta_state & system_mods) != 0)
{
move_cursor_fallback(d);
return;
}
int sel_start = et.selectionStart;
int sel_end = et.selectionEnd;
// Continue expanding the selection even if shift is not pressed
if (sel_end != sel_start)
{
sel_end += d;
if (sel_end == sel_start) // Avoid making the selection empty
sel_end += d;
}
else
{
sel_end += d;
// Leave 'sel_start' where it is if shift is pressed
if ((_meta_state & KeyEvent.META_SHIFT_ON) == 0)
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) void move_cursor_fallback(int d)
{ {
if (d < 0) while (d < 0)
send_key_down_up_repeat(KeyEvent.KEYCODE_DPAD_LEFT, -d);
else
send_key_down_up_repeat(KeyEvent.KEYCODE_DPAD_RIGHT, d);
}
/** Move the cursor up and down. This sends UP and DOWN key events that might
make the focus exit the text box. */
void move_cursor_vertical(int d)
{
if (d < 0)
send_key_down_up_repeat(KeyEvent.KEYCODE_DPAD_UP, -d);
else
send_key_down_up_repeat(KeyEvent.KEYCODE_DPAD_DOWN, d);
}
void evaluate_macro(KeyValue[] keys)
{
if (keys.length == 0)
return;
// Ignore modifiers that are activated at the time the macro is evaluated
mods_changed(Pointers.Modifiers.EMPTY);
evaluate_macro_loop(keys, 0, Pointers.Modifiers.EMPTY, _autocap.pause());
}
/** Evaluate the macro asynchronously to make sure event are processed in the
right order. */
void evaluate_macro_loop(final KeyValue[] keys, int i, Pointers.Modifiers mods, final boolean autocap_paused)
{
boolean should_delay = false;
KeyValue kv = KeyModifier.modify(keys[i], mods);
if (kv != null)
{ {
if (kv.hasFlagsAny(KeyValue.FLAG_LATCH)) send_key_down_up(KeyEvent.KEYCODE_DPAD_LEFT);
{ d++;
// Non-special latchable keys clear latched modifiers
if (!kv.hasFlagsAny(KeyValue.FLAG_SPECIAL))
mods = Pointers.Modifiers.EMPTY;
mods = mods.with_extra_mod(kv);
}
else
{
key_down(kv, false);
key_up(kv, mods);
mods = Pointers.Modifiers.EMPTY;
}
should_delay = wait_after_macro_key(kv);
} }
i++; while (d > 0)
if (i >= keys.length) // Stop looping
{ {
_autocap.unpause(autocap_paused); send_key_down_up(KeyEvent.KEYCODE_DPAD_RIGHT);
d--;
} }
else if (should_delay)
{
// Add a delay before sending the next key to avoid race conditions
// causing keys to be handled in the wrong order. Notably, KeyEvent keys
// handling is scheduled differently than the other edit functions.
final int i_ = i;
final Pointers.Modifiers mods_ = mods;
_recv.getHandler().postDelayed(new Runnable() {
public void run()
{
evaluate_macro_loop(keys, i_, mods_, autocap_paused);
}
}, 1000/30);
}
else
evaluate_macro_loop(keys, i, mods, autocap_paused);
}
boolean wait_after_macro_key(KeyValue kv)
{
switch (kv.getKind())
{
case Keyevent:
case Editing:
case Event:
return true;
case Slider:
return _move_cursor_force_fallback;
default:
return false;
}
}
/** Repeat calls to [send_key_down_up]. */
void send_key_down_up_repeat(int event_code, int repeat)
{
while (repeat-- > 0)
send_key_down_up(event_code);
}
void cancel_selection()
{
InputConnection conn = _recv.getCurrentInputConnection();
if (conn == null)
return;
ExtractedText et = get_cursor_pos(conn);
if (et == null) return;
final int curs = et.selectionStart;
// Notify the receiver as Android's [onUpdateSelection] is not triggered.
if (conn.setSelection(curs, curs));
_recv.selection_state_changed(false);
}
boolean is_selection_not_empty()
{
InputConnection conn = _recv.getCurrentInputConnection();
if (conn == null) return false;
return (conn.getSelectedText(0) != null);
}
/** Workaround some apps which answers to [getExtractedText] but do not react
to [setSelection] while returning [true]. */
boolean should_move_cursor_force_fallback(EditorInfo info)
{
// This catch Acode: which sets several variations at once.
if ((info.inputType & InputType.TYPE_MASK_VARIATION & InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0)
return true;
// Godot editor: Doesn't handle setSelection() but returns true.
return info.packageName.startsWith("org.godotengine.editor");
} }
public static interface IReceiver public static interface IReceiver
@@ -484,9 +322,7 @@ public final class KeyEventHandler
public void handle_event_key(KeyValue.Event ev); public void handle_event_key(KeyValue.Event ev);
public void set_shift_state(boolean state, boolean lock); public void set_shift_state(boolean state, boolean lock);
public void set_compose_pending(boolean pending); public void set_compose_pending(boolean pending);
public void selection_state_changed(boolean selection_is_ongoing);
public InputConnection getCurrentInputConnection(); public InputConnection getCurrentInputConnection();
public Handler getHandler();
} }
class Autocapitalisation_callback implements Autocapitalisation.Callback class Autocapitalisation_callback implements Autocapitalisation.Callback

View File

@@ -8,8 +8,8 @@ public final class KeyModifier
{ {
/** The optional modmap takes priority over modifiers usual behaviors. Set to /** The optional modmap takes priority over modifiers usual behaviors. Set to
[null] to disable. */ [null] to disable. */
private static Modmap _modmap = null; private static KeyboardData.Modmap _modmap = null;
public static void set_modmap(Modmap mm) public static void set_modmap(KeyboardData.Modmap mm)
{ {
_modmap = mm; _modmap = mm;
} }
@@ -36,7 +36,7 @@ public final class KeyModifier
case Modifier: case Modifier:
return modify(k, mod.getModifier()); return modify(k, mod.getModifier());
case Compose_pending: case Compose_pending:
return apply_compose_pending(mod.getPendingCompose(), k); return ComposeKey.apply(mod.getPendingCompose(), k);
case Hangul_initial: case Hangul_initial:
if (k.equals(mod)) // Allow typing the initial in letter form if (k.equals(mod)) // Allow typing the initial in letter form
return KeyValue.makeStringKey(k.getString(), KeyValue.FLAG_GREYED); return KeyValue.makeStringKey(k.getString(), KeyValue.FLAG_GREYED);
@@ -82,7 +82,6 @@ public final class KeyModifier
case HOOK_ABOVE: return apply_compose(k, ComposeKeyData.accent_hook_above); case HOOK_ABOVE: return apply_compose(k, ComposeKeyData.accent_hook_above);
case DOUBLE_GRAVE: return apply_compose(k, ComposeKeyData.accent_double_grave); case DOUBLE_GRAVE: return apply_compose(k, ComposeKeyData.accent_double_grave);
case ARROW_RIGHT: return apply_combining_char(k, "\u20D7"); case ARROW_RIGHT: return apply_combining_char(k, "\u20D7");
case SELECTION_MODE: return apply_selection_mode(k);
default: return k; default: return k;
} }
} }
@@ -123,44 +122,30 @@ public final class KeyModifier
} }
} }
/** Keys that do not match any sequence are greyed. */
private static KeyValue apply_compose_pending(int state, KeyValue kv)
{
switch (kv.getKind())
{
case Char:
case String:
KeyValue res = ComposeKey.apply(state, kv);
// Grey-out characters not part of any sequence.
if (res == null)
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
return res;
/* Tapping compose again exits the pending sequence. */
case Compose_pending:
return KeyValue.getKeyByName("compose_cancel");
/* These keys are not greyed. */
case Event:
case Modifier:
return kv;
/* Other keys cannot be part of sequences. */
default:
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
}
}
/** Apply the given compose state or fallback to the dead_char. */ /** Apply the given compose state or fallback to the dead_char. */
private static KeyValue apply_compose_or_dead_char(KeyValue k, int state, char dead_char) private static KeyValue apply_compose_or_dead_char(KeyValue k, int state, char dead_char)
{ {
KeyValue r = ComposeKey.apply(state, k); switch (k.getKind())
if (r != null) {
return r; case Char:
char c = k.getChar();
KeyValue r = ComposeKey.apply(state, c);
if (r != null)
return r;
}
return apply_dead_char(k, dead_char); return apply_dead_char(k, dead_char);
} }
private static KeyValue apply_compose(KeyValue k, int state) private static KeyValue apply_compose(KeyValue k, int state)
{ {
KeyValue r = ComposeKey.apply(state, k); switch (k.getKind())
return (r != null) ? r : k; {
case Char:
KeyValue r = ComposeKey.apply(state, k.getChar());
if (r != null)
return r;
}
return k;
} }
private static KeyValue apply_dead_char(KeyValue k, char dead_char) private static KeyValue apply_dead_char(KeyValue k, char dead_char)
@@ -190,23 +175,22 @@ public final class KeyModifier
{ {
if (_modmap != null) if (_modmap != null)
{ {
KeyValue mapped = _modmap.get(Modmap.M.Shift, k); KeyValue mapped = _modmap.shift.get(k);
if (mapped != null) if (mapped != null)
return mapped; return mapped;
} }
KeyValue r = ComposeKey.apply(ComposeKeyData.shift, k);
if (r != null)
return r;
switch (k.getKind()) switch (k.getKind())
{ {
case Char: case Char:
char kc = k.getChar(); char kc = k.getChar();
KeyValue r = ComposeKey.apply(ComposeKeyData.shift, kc);
if (r != null)
return r;
char c = Character.toUpperCase(kc); char c = Character.toUpperCase(kc);
return (kc == c) ? k : k.withChar(c); return (kc == c) ? k : k.withChar(c);
case String: case String:
String ks = k.getString(); String s = Utils.capitalize_string(k.getString());
String s = Utils.capitalize_string(ks); return KeyValue.makeStringKey(s, k.getFlags());
return s.equals(ks) ? k : KeyValue.makeStringKey(s, k.getFlags());
default: return k; default: return k;
} }
} }
@@ -215,7 +199,7 @@ public final class KeyModifier
{ {
if (_modmap != null) if (_modmap != null)
{ {
KeyValue mapped = _modmap.get(Modmap.M.Fn, k); KeyValue mapped = _modmap.fn.get(k);
if (mapped != null) if (mapped != null)
return mapped; return mapped;
} }
@@ -223,13 +207,11 @@ public final class KeyModifier
switch (k.getKind()) switch (k.getKind())
{ {
case Char: case Char:
case String: KeyValue r = ComposeKey.apply(ComposeKeyData.fn, k.getChar());
KeyValue r = ComposeKey.apply(ComposeKeyData.fn, k);
return (r != null) ? r : k; return (r != null) ? r : k;
case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break; case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break;
case Event: name = apply_fn_event(k.getEvent()); break; case Event: name = apply_fn_event(k.getEvent()); break;
case Placeholder: name = apply_fn_placeholder(k.getPlaceholder()); break; case Placeholder: name = apply_fn_placeholder(k.getPlaceholder()); break;
case Editing: name = apply_fn_editing(k.getEditing()); break;
} }
return (name == null) ? k : KeyValue.getKeyByName(name); return (name == null) ? k : KeyValue.getKeyByName(name);
} }
@@ -275,21 +257,11 @@ public final class KeyModifier
} }
} }
private static String apply_fn_editing(KeyValue.Editing p)
{
switch (p)
{
case UNDO: return "redo";
case PASTE: return "pasteAsPlainText";
default: return null;
}
}
private static KeyValue apply_ctrl(KeyValue k) private static KeyValue apply_ctrl(KeyValue k)
{ {
if (_modmap != null) if (_modmap != null)
{ {
KeyValue mapped = _modmap.get(Modmap.M.Ctrl, k); KeyValue mapped = _modmap.ctrl.get(k);
// Do not return the modified character right away, first turn it into a // Do not return the modified character right away, first turn it into a
// key event. // key event.
if (mapped != null) if (mapped != null)
@@ -367,58 +339,10 @@ public final class KeyModifier
/** Modify a key affected by a round-trip or a clockwise circle gesture. */ /** Modify a key affected by a round-trip or a clockwise circle gesture. */
private static KeyValue apply_gesture(KeyValue k) private static KeyValue apply_gesture(KeyValue k)
{ {
KeyValue modified = apply_shift(k); KeyValue shifted = apply_shift(k);
if (modified != null && !modified.equals(k)) if (shifted == null || shifted.equals(k))
return modified; return apply_fn(k);
modified = apply_fn(k); return shifted;
if (modified != null && !modified.equals(k))
return modified;
String name = null;
switch (k.getKind())
{
case Modifier:
switch (k.getModifier())
{
case SHIFT: name = "capslock"; break;
}
break;
case Keyevent:
switch (k.getKeyevent())
{
case KeyEvent.KEYCODE_DEL: name = "delete_word"; break;
case KeyEvent.KEYCODE_FORWARD_DEL: name = "forward_delete_word"; break;
}
break;
}
return (name == null) ? k : KeyValue.getKeyByName(name);
}
private static KeyValue apply_selection_mode(KeyValue k)
{
String name = null;
switch (k.getKind())
{
case Char:
switch (k.getChar())
{
case ' ': name = "selection_cancel"; break;
}
break;
case Slider:
switch (k.getSlider())
{
case Cursor_left: name = "selection_cursor_left"; break;
case Cursor_right: name = "selection_cursor_right"; break;
}
break;
case Keyevent:
switch (k.getKeyevent())
{
case KeyEvent.KEYCODE_ESCAPE: name = "selection_cancel"; break;
}
break;
}
return (name == null) ? k : KeyValue.getKeyByName(name);
} }
/** Compose the precomposed initial with the medial [kv]. */ /** Compose the precomposed initial with the medial [kv]. */

View File

@@ -59,7 +59,6 @@ public final class KeyValue implements Comparable<KeyValue>
BREVE, BREVE,
BAR, BAR,
FN, FN,
SELECTION_MODE,
} // Last is be applied first } // Last is be applied first
public static enum Editing public static enum Editing
@@ -76,15 +75,11 @@ public final class KeyValue implements Comparable<KeyValue>
SHARE, SHARE,
ASSIST, ASSIST,
AUTOFILL, AUTOFILL,
DELETE_WORD,
FORWARD_DELETE_WORD,
SELECTION_CANCEL,
} }
public static enum Placeholder public static enum Placeholder
{ {
REMOVED, REMOVED,
COMPOSE_CANCEL,
F11, F11,
F12, F12,
SHINDOT, SHINDOT,
@@ -95,54 +90,56 @@ public final class KeyValue implements Comparable<KeyValue>
public static enum Kind public static enum Kind
{ {
Char, Keyevent, Event, Compose_pending, Hangul_initial, Hangul_medial, Char, String, Keyevent, Event, Compose_pending, Hangul_initial,
Modifier, Editing, Placeholder, Hangul_medial, Modifier, Editing, Placeholder,
String, // [_payload] is also the string to output, value is unused. Cursor_move, // Value is encoded as a 16-bit integer.
Slider, // [_payload] is a [KeyValue.Slider], value is slider repeatition. Complex, // [_payload] is a [KeyValue.Complex], value is [Complex.Kind].
Macro, // [_payload] is a [KeyValue.Macro], value is unused.
} }
private static final int FLAGS_OFFSET = 20; private static final int FLAGS_OFFSET = 19;
private static final int KIND_OFFSET = 28; private static final int KIND_OFFSET = 28;
// Key stay activated when pressed once. // Behavior flags.
public static final int FLAG_LATCH = (1 << FLAGS_OFFSET << 0); public static final int FLAG_LATCH = (1 << FLAGS_OFFSET << 0);
// Key can be locked by typing twice when enabled in settings // Key can be locked by typing twice
public static final int FLAG_DOUBLE_TAP_LOCK = (1 << FLAGS_OFFSET << 1); public static final int FLAG_LOCK = (1 << FLAGS_OFFSET << 1);
// Special keys are not repeated. // Special keys are not repeated and don't clear latched modifiers.
// Special latchable keys don't clear latched modifiers.
public static final int FLAG_SPECIAL = (1 << FLAGS_OFFSET << 2); public static final int FLAG_SPECIAL = (1 << FLAGS_OFFSET << 2);
// Whether the symbol should be greyed out. For example, keys that are not // Whether the symbol should be greyed out. For example, keys that are not
// part of the pending compose sequence. // part of the pending compose sequence.
public static final int FLAG_GREYED = (1 << FLAGS_OFFSET << 3); public static final int FLAG_GREYED = (1 << FLAGS_OFFSET << 3);
// The special font is required to render this key. // Rendering flags.
public static final int FLAG_KEY_FONT = (1 << FLAGS_OFFSET << 4); public static final int FLAG_KEY_FONT = (1 << FLAGS_OFFSET << 4); // special font file
// 25% smaller symbols public static final int FLAG_SMALLER_FONT = (1 << FLAGS_OFFSET << 5); // 25% smaller symbols
public static final int FLAG_SMALLER_FONT = (1 << FLAGS_OFFSET << 5); public static final int FLAG_SECONDARY = (1 << FLAGS_OFFSET << 6); // dimmer
// Dimmer symbol // Used by [Pointers].
public static final int FLAG_SECONDARY = (1 << FLAGS_OFFSET << 6);
// Free: (1 << FLAGS_OFFSET << 7) // Free: (1 << FLAGS_OFFSET << 7)
// Free: (1 << FLAGS_OFFSET << 8)
// Ranges for the different components // Ranges for the different components
private static final int FLAGS_BITS = (0b11111111 << FLAGS_OFFSET); // 8 bits wide private static final int FLAGS_BITS =
FLAG_LATCH | FLAG_LOCK | FLAG_SPECIAL | FLAG_GREYED | FLAG_KEY_FONT |
FLAG_SMALLER_FONT | FLAG_SECONDARY;
private static final int KIND_BITS = (0b1111 << KIND_OFFSET); // 4 bits wide private static final int KIND_BITS = (0b1111 << KIND_OFFSET); // 4 bits wide
private static final int VALUE_BITS = 0b11111111111111111111; // 20 bits wide private static final int VALUE_BITS = ~(FLAGS_BITS | KIND_BITS); // 20 bits wide
static static
{ {
check((FLAGS_BITS & KIND_BITS) == 0); // No overlap with kind check((FLAGS_BITS & KIND_BITS) == 0); // No overlap
check(~(FLAGS_BITS | KIND_BITS) == VALUE_BITS); // No overlap with value
check((FLAGS_BITS | KIND_BITS | VALUE_BITS) == ~0); // No holes check((FLAGS_BITS | KIND_BITS | VALUE_BITS) == ~0); // No holes
// No kind is out of range // No kind is out of range
check((((Kind.values().length - 1) << KIND_OFFSET) & ~KIND_BITS) == 0); check((((Kind.values().length - 1) << KIND_OFFSET) & ~KIND_BITS) == 0);
} }
/** [_payload.toString()] is the symbol that is rendered on the keyboard. */ /**
private final Comparable _payload; * The symbol that is rendered on the keyboard as a [String].
* Except for keys of kind:
* - [String], this is also the string to output.
* - [Complex], this is an instance of [KeyValue.Complex].
*/
private final Object _payload;
/** This field encodes three things: Kind (KIND_BITS), flags (FLAGS_BITS) and /** This field encodes three things: Kind, flags and value. */
value (VALUE_BITS).
The meaning of the value depends on the kind. */
private final int _code; private final int _code;
public Kind getKind() public Kind getKind()
@@ -164,7 +161,9 @@ public final class KeyValue implements Comparable<KeyValue>
When [getKind() == Kind.String], also the string to send. */ When [getKind() == Kind.String], also the string to send. */
public String getString() public String getString()
{ {
return _payload.toString(); if (getKind() == Kind.Complex)
return ((Complex)_payload).getSymbol();
return (String)_payload;
} }
/** Defined only when [getKind() == Kind.Char]. */ /** Defined only when [getKind() == Kind.Char]. */
@@ -216,29 +215,28 @@ public final class KeyValue implements Comparable<KeyValue>
return (_code & VALUE_BITS); return (_code & VALUE_BITS);
} }
/** Defined only when [getKind() == Kind.Slider]. */ /** Defined only when [getKind() == Kind.Cursor_move]. */
public Slider getSlider() public short getCursorMove()
{ {
return (Slider)_payload; return (short)(_code & VALUE_BITS);
} }
/** Defined only when [getKind() == Kind.Slider]. */ /** Defined only when [getKind() == Kind.Complex]. */
public int getSliderRepeat() public Complex getComplex()
{ {
return ((int)(short)(_code & VALUE_BITS)); return (Complex)_payload;
} }
/** Defined only when [getKind() == Kind.Macro]. */ /** Defined only when [getKind() == Kind.Complex]. */
public KeyValue[] getMacro() public Complex.Kind getComplexKind()
{ {
return ((Macro)_payload).keys; return Complex.Kind.values()[(_code & VALUE_BITS)];
} }
/* Update the char and the symbol. */ /* Update the char and the symbol. */
public KeyValue withChar(char c) public KeyValue withChar(char c)
{ {
return new KeyValue(String.valueOf(c), Kind.Char, c, return new KeyValue(String.valueOf(c), Kind.Char, c, getFlags());
getFlags() & ~(FLAG_KEY_FONT | FLAG_SMALLER_FONT));
} }
public KeyValue withKeyevent(int code) public KeyValue withKeyevent(int code)
@@ -248,31 +246,7 @@ public final class KeyValue implements Comparable<KeyValue>
public KeyValue withFlags(int f) public KeyValue withFlags(int f)
{ {
return new KeyValue(_payload, _code, _code, f); return new KeyValue(_payload, (_code & KIND_BITS), (_code & VALUE_BITS), f);
}
public KeyValue withSymbol(String symbol)
{
int flags = getFlags() & ~(FLAG_KEY_FONT | FLAG_SMALLER_FONT);
switch (getKind())
{
case Char:
case Keyevent:
case Event:
case Compose_pending:
case Hangul_initial:
case Hangul_medial:
case Modifier:
case Editing:
case Placeholder:
if (symbol.length() > 1)
flags |= FLAG_SMALLER_FONT;
return new KeyValue(symbol, _code, _code, flags);
case Macro:
return makeMacro(symbol, getMacro(), flags);
default:
return makeMacro(symbol, new KeyValue[]{ this }, flags);
}
} }
@Override @Override
@@ -281,7 +255,6 @@ public final class KeyValue implements Comparable<KeyValue>
return sameKey((KeyValue)obj); return sameKey((KeyValue)obj);
} }
@Override
public int compareTo(KeyValue snd) public int compareTo(KeyValue snd)
{ {
// Compare the kind and value first, then the flags. // Compare the kind and value first, then the flags.
@@ -291,9 +264,9 @@ public final class KeyValue implements Comparable<KeyValue>
d = _code - snd._code; d = _code - snd._code;
if (d != 0) if (d != 0)
return d; return d;
// Calls [compareTo] assuming that if [_code] matches, then [_payload] are if (getKind() == Kind.Complex)
// of the same class. return ((Complex)_payload).compareTo((Complex)snd._payload);
return _payload.compareTo(snd._payload); return ((String)_payload).compareTo((String)snd._payload);
} }
/** Type-safe alternative to [equals]. */ /** Type-safe alternative to [equals]. */
@@ -301,7 +274,7 @@ public final class KeyValue implements Comparable<KeyValue>
{ {
if (snd == null) if (snd == null)
return false; return false;
return _code == snd._code && _payload.compareTo(snd._payload) == 0; return _code == snd._code && _payload.equals(snd._payload);
} }
@Override @Override
@@ -316,15 +289,19 @@ public final class KeyValue implements Comparable<KeyValue>
return "[KeyValue " + getKind().toString() + "+" + getFlags() + "+" + value + " \"" + getString() + "\"]"; return "[KeyValue " + getKind().toString() + "+" + getFlags() + "+" + value + " \"" + getString() + "\"]";
} }
private KeyValue(Comparable p, int kind, int value, int flags) private KeyValue(Object p, int kind, int value, int flags)
{ {
if (p == null)
throw new NullPointerException("KeyValue payload cannot be null");
_payload = p; _payload = p;
_code = (kind & KIND_BITS) | (flags & FLAGS_BITS) | (value & VALUE_BITS); _code = (kind & KIND_BITS) | (flags & FLAGS_BITS) | (value & VALUE_BITS);
} }
public KeyValue(Comparable p, Kind k, int v, int f) public KeyValue(Complex p, Complex.Kind value, int flags)
{
this((Object)p, (Kind.Complex.ordinal() << KIND_OFFSET), value.ordinal(),
flags);
}
public KeyValue(String p, Kind k, int v, int f)
{ {
this(p, (k.ordinal() << KIND_OFFSET), v, f); this(p, (k.ordinal() << KIND_OFFSET), v, f);
} }
@@ -336,7 +313,7 @@ public final class KeyValue implements Comparable<KeyValue>
private static KeyValue charKey(int symbol, char c, int flags) private static KeyValue charKey(int symbol, char c, int flags)
{ {
return charKey(String.valueOf((char)symbol), c, flags | FLAG_KEY_FONT); return charKey(String.valueOf((char)symbol), c, flags);
} }
private static KeyValue modifierKey(String symbol, Modifier m, int flags) private static KeyValue modifierKey(String symbol, Modifier m, int flags)
@@ -394,12 +371,13 @@ public final class KeyValue implements Comparable<KeyValue>
return editingKey(String.valueOf((char)symbol), action, FLAG_KEY_FONT); return editingKey(String.valueOf((char)symbol), action, FLAG_KEY_FONT);
} }
/** A key that slides the property specified by [s] by the amount specified /** A key that moves the cursor [d] times to the right. If [d] is negative,
with [repeatition]. */ it moves the cursor [abs(d)] times to the left. */
public static KeyValue sliderKey(Slider s, int repeatition) public static KeyValue cursorMoveKey(int d)
{ {
// Casting to a short then back to a int to preserve the sign bit. int symbol = (d < 0) ? 0xE008 : 0xE006;
return new KeyValue(s, Kind.Slider, (short)repeatition & 0xFFFF, return new KeyValue(String.valueOf((char)symbol), Kind.Cursor_move,
((short)d) & 0xFFFF,
FLAG_SPECIAL | FLAG_SECONDARY | FLAG_KEY_FONT); FLAG_SPECIAL | FLAG_SECONDARY | FLAG_KEY_FONT);
} }
@@ -409,12 +387,6 @@ public final class KeyValue implements Comparable<KeyValue>
return new KeyValue("", Kind.Placeholder, id.ordinal(), 0); return new KeyValue("", Kind.Placeholder, id.ordinal(), 0);
} }
private static KeyValue placeholderKey(int symbol, Placeholder id, int flags)
{
return new KeyValue(String.valueOf((char)symbol), Kind.Placeholder,
id.ordinal(), flags | FLAG_KEY_FONT);
}
public static KeyValue makeStringKey(String str) public static KeyValue makeStringKey(String str)
{ {
return makeStringKey(str, 0); return makeStringKey(str, 0);
@@ -483,11 +455,10 @@ public final class KeyValue implements Comparable<KeyValue>
return new KeyValue(str, Kind.String, 0, flags | FLAG_SMALLER_FONT); return new KeyValue(str, Kind.String, 0, flags | FLAG_SMALLER_FONT);
} }
public static KeyValue makeMacro(String symbol, KeyValue[] keys, int flags) public static KeyValue makeStringKeyWithSymbol(String str, String symbol, int flags)
{ {
if (symbol.length() > 1) return new KeyValue(new Complex.StringWithSymbol(str, symbol),
flags |= FLAG_SMALLER_FONT; Complex.Kind.StringWithSymbol, flags);
return new KeyValue(new Macro(keys, symbol), Kind.Macro, 0, flags);
} }
/** Make a modifier key for passing to [KeyModifier]. */ /** Make a modifier key for passing to [KeyModifier]. */
@@ -496,24 +467,25 @@ public final class KeyValue implements Comparable<KeyValue>
return new KeyValue("", Kind.Modifier, mod.ordinal(), 0); return new KeyValue("", Kind.Modifier, mod.ordinal(), 0);
} }
/** Return a key by its name. If the given name doesn't correspond to any public static KeyValue parseKeyDefinition(String str)
special key, it is parsed with [KeyValueParser]. */
public static KeyValue getKeyByName(String name)
{ {
KeyValue k = getSpecialKeyByName(name); if (str.length() < 2 || str.charAt(0) != ':')
if (k != null) return makeStringKey(str);
return k;
try try
{ {
return KeyValueParser.parse(name); return KeyValueParser.parse(str);
} }
catch (KeyValueParser.ParseError _e) catch (KeyValueParser.ParseError _e)
{ {
return makeStringKey(name); return makeStringKey(str);
} }
} }
public static KeyValue getSpecialKeyByName(String name) /**
* Return a key by its name. If the given name doesn't correspond to a key
* defined in this function, it is passed to [parseStringKey] as a fallback.
*/
public static KeyValue getKeyByName(String name)
{ {
switch (name) switch (name)
{ {
@@ -526,7 +498,7 @@ public final class KeyValue implements Comparable<KeyValue>
case "\\\\": return makeStringKey("\\"); case "\\\\": return makeStringKey("\\");
/* Modifiers and dead-keys */ /* Modifiers and dead-keys */
case "shift": return modifierKey(0xE00A, Modifier.SHIFT, FLAG_DOUBLE_TAP_LOCK); case "shift": return modifierKey(0xE00A, Modifier.SHIFT, 0);
case "ctrl": return modifierKey("Ctrl", Modifier.CTRL, 0); case "ctrl": return modifierKey("Ctrl", Modifier.CTRL, 0);
case "alt": return modifierKey("Alt", Modifier.ALT, 0); case "alt": return modifierKey("Alt", Modifier.ALT, 0);
case "accent_aigu": return diacritic(0xE050, Modifier.AIGU); case "accent_aigu": return diacritic(0xE050, Modifier.AIGU);
@@ -602,8 +574,6 @@ public final class KeyValue implements Comparable<KeyValue>
case "combining_kasratan": return makeCharKey(0xE219, '\u064D', 0); case "combining_kasratan": return makeCharKey(0xE219, '\u064D', 0);
case "combining_dammatan": return makeCharKey(0xE220, '\u064C', 0); case "combining_dammatan": return makeCharKey(0xE220, '\u064C', 0);
case "combining_alef_below": return makeCharKey(0xE221, '\u0656', 0); case "combining_alef_below": return makeCharKey(0xE221, '\u0656', 0);
case "combining_kavyka": return makeCharKey(0xE222, '\uA67C', 0);
case "combining_palatalization": return makeCharKey(0xE223, '\u0484', 0);
/* Special event keys */ /* Special event keys */
case "config": return eventKey(0xE004, Event.CONFIG, FLAG_SMALLER_FONT); case "config": return eventKey(0xE004, Event.CONFIG, FLAG_SMALLER_FONT);
@@ -627,9 +597,9 @@ public final class KeyValue implements Comparable<KeyValue>
case "esc": return keyeventKey("Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT); case "esc": return keyeventKey("Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT);
case "enter": return keyeventKey(0xE00E, KeyEvent.KEYCODE_ENTER, 0); case "enter": return keyeventKey(0xE00E, KeyEvent.KEYCODE_ENTER, 0);
case "up": return keyeventKey(0xE005, KeyEvent.KEYCODE_DPAD_UP, 0); case "up": return keyeventKey(0xE005, KeyEvent.KEYCODE_DPAD_UP, 0);
case "right": return keyeventKey(0xE006, KeyEvent.KEYCODE_DPAD_RIGHT, FLAG_SMALLER_FONT); case "right": return keyeventKey(0xE006, KeyEvent.KEYCODE_DPAD_RIGHT, 0);
case "down": return keyeventKey(0xE007, KeyEvent.KEYCODE_DPAD_DOWN, 0); case "down": return keyeventKey(0xE007, KeyEvent.KEYCODE_DPAD_DOWN, 0);
case "left": return keyeventKey(0xE008, KeyEvent.KEYCODE_DPAD_LEFT, FLAG_SMALLER_FONT); case "left": return keyeventKey(0xE008, KeyEvent.KEYCODE_DPAD_LEFT, 0);
case "page_up": return keyeventKey(0xE002, KeyEvent.KEYCODE_PAGE_UP, 0); case "page_up": return keyeventKey(0xE002, KeyEvent.KEYCODE_PAGE_UP, 0);
case "page_down": return keyeventKey(0xE003, KeyEvent.KEYCODE_PAGE_DOWN, 0); case "page_down": return keyeventKey(0xE003, KeyEvent.KEYCODE_PAGE_DOWN, 0);
case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, FLAG_SMALLER_FONT); case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, FLAG_SMALLER_FONT);
@@ -656,7 +626,7 @@ public final class KeyValue implements Comparable<KeyValue>
/* Spaces */ /* Spaces */
case "\\t": return charKey("\\t", '\t', 0); // Send the tab character case "\\t": return charKey("\\t", '\t', 0); // Send the tab character
case "\\n": return charKey("\\n", '\n', 0); // Send the newline character case "\\n": return charKey("\\n", '\n', 0); // Send the newline character
case "space": return charKey(0xE00D, ' ', FLAG_SMALLER_FONT | FLAG_GREYED); case "space": return charKey(0xE00D, ' ', FLAG_KEY_FONT | FLAG_SMALLER_FONT | FLAG_GREYED);
case "nbsp": return charKey("\u237d", '\u00a0', FLAG_SMALLER_FONT); case "nbsp": return charKey("\u237d", '\u00a0', FLAG_SMALLER_FONT);
case "nnbsp": return charKey("\u2423", '\u202F', FLAG_SMALLER_FONT); case "nnbsp": return charKey("\u2423", '\u202F', FLAG_SMALLER_FONT);
@@ -700,9 +670,9 @@ public final class KeyValue implements Comparable<KeyValue>
case "meteg": return charKey("\u05DE\u05BD", '\u05BD', 0); // or siluq or sof-pasuq case "meteg": return charKey("\u05DE\u05BD", '\u05BD', 0); // or siluq or sof-pasuq
case "meteg_placeholder": return placeholderKey(Placeholder.METEG); case "meteg_placeholder": return placeholderKey(Placeholder.METEG);
/* intending/preventing ligature - supported by many scripts*/ /* intending/preventing ligature - supported by many scripts*/
case "zwj": return charKey(0xE019, '\u200D', 0); // zero-width joiner (provides ligature) case "zwj": return charKey("zwj", '\u200D', 0); // zero-width joiner (provides ligature)
case "zwnj": case "zwnj":
case "halfspace": return charKey(0xE018, '\u200C', 0); // zero-width non joiner case "halfspace": return charKey("", '\u200C', 0); // zero-width non joiner
/* Editing keys */ /* Editing keys */
case "copy": return editingKey(0xE030, Editing.COPY); case "copy": return editingKey(0xE030, Editing.COPY);
@@ -713,23 +683,15 @@ public final class KeyValue implements Comparable<KeyValue>
case "pasteAsPlainText": return editingKey(0xE035, Editing.PASTE_PLAIN); case "pasteAsPlainText": return editingKey(0xE035, Editing.PASTE_PLAIN);
case "undo": return editingKey(0xE036, Editing.UNDO); case "undo": return editingKey(0xE036, Editing.UNDO);
case "redo": return editingKey(0xE037, Editing.REDO); case "redo": return editingKey(0xE037, Editing.REDO);
case "delete_word": return editingKey(0xE01B, Editing.DELETE_WORD); case "cursor_left": return cursorMoveKey(-1);
case "forward_delete_word": return editingKey(0xE01C, Editing.FORWARD_DELETE_WORD); case "cursor_right": return cursorMoveKey(1);
case "cursor_left": return sliderKey(Slider.Cursor_left, 1);
case "cursor_right": return sliderKey(Slider.Cursor_right, 1);
case "cursor_up": return sliderKey(Slider.Cursor_up, 1);
case "cursor_down": return sliderKey(Slider.Cursor_down, 1);
case "selection_cancel": return editingKey("Esc", Editing.SELECTION_CANCEL, FLAG_SMALLER_FONT);
case "selection_cursor_left": return sliderKey(Slider.Selection_cursor_left, -1); // Move the left side of the selection
case "selection_cursor_right": return sliderKey(Slider.Selection_cursor_right, 1);
// These keys are not used // These keys are not used
case "replaceText": return editingKey("repl", Editing.REPLACE); case "replaceText": return editingKey("repl", Editing.REPLACE);
case "textAssist": return editingKey(0xE038, Editing.ASSIST); case "textAssist": return editingKey(0xE038, Editing.ASSIST);
case "autofill": return editingKey("auto", Editing.AUTOFILL); case "autofill": return editingKey("auto", Editing.AUTOFILL);
/* The compose key */ /* The compose key */
case "compose": return makeComposePending(0xE016, ComposeKeyData.compose, FLAG_SECONDARY); case "compose": return makeComposePending(0xE016, ComposeKeyData.compose, FLAG_SECONDARY | FLAG_SMALLER_FONT | FLAG_SPECIAL);
case "compose_cancel": return placeholderKey(0xE01A, Placeholder.COMPOSE_CANCEL, FLAG_SECONDARY);
/* Placeholder keys */ /* Placeholder keys */
case "removed": return placeholderKey(Placeholder.REMOVED); case "removed": return placeholderKey(Placeholder.REMOVED);
@@ -771,42 +733,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "": case "": case "": case "":
return makeStringKey(name, FLAG_SMALLER_FONT); return makeStringKey(name, FLAG_SMALLER_FONT);
/* Sinhala letters to reduced size */ /* The key is not one of the special ones. */
case "": case "": case "": case "": case "": default: return parseKeyDefinition(name);
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "": case "": case "":
/* Astrological numbers */
case "": case "": case "": case "": case "":
case "": case "": case "": case "": case "":
case "": case "":
/* Diacritics */
case "\u0d81": case "\u0d82": case "\u0d83": case "\u0dca":
case "\u0dcf": case "\u0dd0": case "\u0dd1": case "\u0dd2":
case "\u0dd3": case "\u0dd4": case "\u0dd6": case "\u0dd8":
case "\u0dd9": case "\u0dda": case "\u0ddb": case "\u0ddc":
case "\u0ddd": case "\u0dde": case "\u0ddf":
/* Archaic digits */
case "𑇡": case "𑇢": case "𑇣": case "𑇤": case "𑇥":
case "𑇦": case "𑇧": case "𑇨": case "𑇩": case "𑇪":
case "𑇫": case "𑇬": case "𑇭": case "𑇮": case "𑇯":
case "𑇰": case "𑇱": case "𑇲": case "𑇳": case "𑇴":
/* Exta */
case "": case "": // Rupee is not exclusively Sinhala sign
return makeStringKey(name, FLAG_SMALLER_FONT);
/* Internal keys */
case "selection_mode": return makeInternalModifier(Modifier.SELECTION_MODE);
default: return null;
} }
} }
@@ -817,50 +745,48 @@ public final class KeyValue implements Comparable<KeyValue>
throw new RuntimeException("Assertion failure"); throw new RuntimeException("Assertion failure");
} }
public static enum Slider public static abstract class Complex
{ {
Cursor_left(0xE008), public abstract String getSymbol();
Cursor_right(0xE006),
Cursor_up(0xE005),
Cursor_down(0xE007),
Selection_cursor_left(0xE008),
Selection_cursor_right(0xE006);
final String symbol; /** [compareTo] can assume that [snd] is an instance of the same class. */
public abstract int compareTo(Complex snd);
Slider(int symbol_) public boolean equals(Object snd)
{ {
symbol = String.valueOf((char)symbol_); if (snd instanceof Complex)
return compareTo((Complex)snd) == 0;
return false;
} }
@Override /** [hashCode] will be called on this class. */
public String toString() { return symbol; }
};
public static final class Macro implements Comparable<Macro> /** The kind is stored in the [value] field of the key. */
{ public static enum Kind
public final KeyValue[] keys;
private final String _symbol;
public Macro(KeyValue[] keys_, String sym_)
{ {
keys = keys_; StringWithSymbol,
_symbol = sym_;
} }
public String toString() { return _symbol; } public static final class StringWithSymbol extends Complex
@Override
public int compareTo(Macro snd)
{ {
int d = keys.length - snd.keys.length; public final String str;
if (d != 0) return d; private final String _symbol;
for (int i = 0; i < keys.length; i++)
public StringWithSymbol(String _str, String _sym)
{ {
d = keys[i].compareTo(snd.keys[i]); str = _str;
if (d != 0) return d; _symbol = _sym;
}
public String getSymbol() { return _symbol; }
public int compareTo(Complex _snd)
{
StringWithSymbol snd = (StringWithSymbol)_snd;
int d = str.compareTo(snd.str);
if (d != 0) return d;
return _symbol.compareTo(snd._symbol);
} }
return _symbol.compareTo(snd._symbol);
} }
}; };
} }

View File

@@ -1,22 +1,14 @@
package juloo.keyboard2; package juloo.keyboard2;
import java.util.ArrayList;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
Parse a key definition. The syntax for a key definition is: Parse a key definition. The syntax for a key definition is:
- [(symbol):(key_action)]
- [:(kind) (attributes):(payload)]. - [:(kind) (attributes):(payload)].
- If [str] doesn't start with a [:] character, it is interpreted as an - If [str] doesn't start with a [:] character, it is interpreted as an
arbitrary string key. arbitrary string key.
[key_action] is:
- ['Arbitrary string']
- [(key_action),(key_action),...]
- [keyevent:(code)]
- [(key_name)]
For the different kinds and attributes, see doc/Possible-key-values.md. For the different kinds and attributes, see doc/Possible-key-values.md.
Examples: Examples:
@@ -26,234 +18,103 @@ Examples:
*/ */
public final class KeyValueParser public final class KeyValueParser
{ {
static Pattern KEYDEF_TOKEN; static Pattern START_PAT;
static Pattern ATTR_PAT;
static Pattern QUOTED_PAT; static Pattern QUOTED_PAT;
static Pattern PAYLOAD_START_PAT;
static Pattern WORD_PAT; static Pattern WORD_PAT;
static public KeyValue parse(String input) throws ParseError static public KeyValue parse(String str) throws ParseError
{ {
int symbol_ends = 0; String symbol = null;
final int input_len = input.length(); int flags = 0;
while (symbol_ends < input_len && input.charAt(symbol_ends) != ':')
symbol_ends++;
if (symbol_ends == 0) // Old syntax
return Starting_with_colon.parse(input);
if (symbol_ends == input_len) // String key
return KeyValue.makeStringKey(input);
String symbol = input.substring(0, symbol_ends);
init(); init();
Matcher m = KEYDEF_TOKEN.matcher(input); // Kind
m.region(symbol_ends + 1, input_len); Matcher m = START_PAT.matcher(str);
KeyValue first_key = parse_key_def(m); if (!m.lookingAt())
if (!parse_comma(m)) // Input is a single key def with a specified symbol parseError("Expected kind, for example \":str ...\".", m);
return first_key.withSymbol(symbol); String kind = m.group(1);
// Input is a macro // Attributes
ArrayList<KeyValue> keydefs = new ArrayList<KeyValue>(); while (true)
keydefs.add(first_key);
do { keydefs.add(parse_key_def(m)); }
while (parse_comma(m));
return KeyValue.makeMacro(symbol, keydefs.toArray(new KeyValue[]{}), 0);
}
static void init()
{
if (KEYDEF_TOKEN != null)
return;
KEYDEF_TOKEN = Pattern.compile("'|,|keyevent:|(?:[^\\\\',]+|\\\\.)+");
QUOTED_PAT = Pattern.compile("((?:[^'\\\\]+|\\\\')*)'");
WORD_PAT = Pattern.compile("[a-zA-Z0-9_]+|.");
}
static KeyValue key_by_name_or_str(String str)
{
KeyValue k = KeyValue.getSpecialKeyByName(str);
if (k != null)
return k;
return KeyValue.makeStringKey(str);
}
static KeyValue parse_key_def(Matcher m) throws ParseError
{
if (!match(m, KEYDEF_TOKEN))
parseError("Expected key definition", m);
String token = m.group(0);
switch (token)
{ {
case "'": return parse_string_keydef(m); if (!match(m, ATTR_PAT))
case ",": parseError("Unexpected comma", m); return null; break;
case "keyevent:": return parse_keyevent_keydef(m); String attr_name = m.group(1);
default: return key_by_name_or_str(remove_escaping(token)); String attr_value = parseSingleQuotedString(m);
switch (attr_name)
{
case "flags":
flags = parseFlags(attr_value, m);
break;
case "symbol":
symbol = attr_value;
break;
default:
parseError("Unknown attribute "+attr_name, m);
}
} }
// Payload
if (!match(m, PAYLOAD_START_PAT))
parseError("Unexpected character", m);
String payload;
switch (kind)
{
case "str":
payload = parseSingleQuotedString(m);
if (symbol == null)
return KeyValue.makeStringKey(payload, flags);
return KeyValue.makeStringKeyWithSymbol(payload, symbol, flags);
case "char":
payload = parsePayloadWord(m);
if (payload.length() != 1)
parseError("Expected a single character payload", m);
return KeyValue.makeCharKey(payload.charAt(0), symbol, flags);
case "keyevent":
payload = parsePayloadWord(m);
int eventcode = 0;
try { eventcode = Integer.parseInt(payload); }
catch (Exception _e)
{ parseError("Expected an integer payload", m); }
if (symbol == null)
symbol = String.valueOf(eventcode);
return KeyValue.keyeventKey(symbol, eventcode, flags);
default: break;
}
parseError("Unknown kind '"+kind+"'", m, 1);
return null; // Unreachable
} }
static KeyValue parse_string_keydef(Matcher m) throws ParseError static String parseSingleQuotedString(Matcher m) throws ParseError
{ {
if (!match(m, QUOTED_PAT)) if (!match(m, QUOTED_PAT))
parseError("Unterminated quoted string", m); parseError("Expected quoted string", m);
return KeyValue.makeStringKey(remove_escaping(m.group(1))); return m.group(1).replace("\\'", "'");
} }
static KeyValue parse_keyevent_keydef(Matcher m) throws ParseError static String parsePayloadWord(Matcher m) throws ParseError
{ {
if (!match(m, WORD_PAT)) if (!match(m, WORD_PAT))
parseError("Expected keyevent code", m); parseError("Expected a word after ':' made of [a-zA-Z0-9_]", m);
int eventcode = 0; return m.group(0);
try { eventcode = Integer.parseInt(m.group(0)); }
catch (Exception _e)
{ parseError("Expected an integer payload", m); }
return KeyValue.keyeventKey("", eventcode, 0);
} }
/** Returns [true] if the next token is a comma, [false] if it is the end of the input. Throws an error otherwise. */ static int parseFlags(String s, Matcher m) throws ParseError
static boolean parse_comma(Matcher m) throws ParseError
{ {
if (!match(m, KEYDEF_TOKEN)) int flags = 0;
return false; for (String f : s.split(","))
String token = m.group(0); {
if (!token.equals(",")) switch (f)
parseError("Expected comma instead of '"+ token + "'", m);
return true;
}
static String remove_escaping(String s)
{
if (!s.contains("\\"))
return s;
StringBuilder out = new StringBuilder(s.length());
final int len = s.length();
int prev = 0, i = 0;
for (; i < len; i++)
if (s.charAt(i) == '\\')
{ {
out.append(s, prev, i); case "dim": flags |= KeyValue.FLAG_SECONDARY; break;
prev = i + 1; case "small": flags |= KeyValue.FLAG_SMALLER_FONT; break;
default: parseError("Unknown flag "+f, m);
} }
out.append(s, prev, i);
return out.toString();
}
/**
Parse a key definition starting with a [:]. This is the old syntax and is
kept for compatibility.
*/
final static class Starting_with_colon
{
static Pattern START_PAT;
static Pattern ATTR_PAT;
static Pattern QUOTED_PAT;
static Pattern PAYLOAD_START_PAT;
static Pattern WORD_PAT;
static public KeyValue parse(String str) throws ParseError
{
String symbol = null;
int flags = 0;
init();
// Kind
Matcher m = START_PAT.matcher(str);
if (!m.lookingAt())
parseError("Expected kind, for example \":str ...\".", m);
String kind = m.group(1);
// Attributes
while (true)
{
if (!match(m, ATTR_PAT))
break;
String attr_name = m.group(1);
String attr_value = parseSingleQuotedString(m);
switch (attr_name)
{
case "flags":
flags = parseFlags(attr_value, m);
break;
case "symbol":
symbol = attr_value;
break;
default:
parseError("Unknown attribute "+attr_name, m);
}
}
// Payload
if (!match(m, PAYLOAD_START_PAT))
parseError("Unexpected character", m);
String payload;
switch (kind)
{
case "str":
payload = parseSingleQuotedString(m);
if (symbol == null)
return KeyValue.makeStringKey(payload, flags);
return KeyValue.makeStringKey(payload, flags).withSymbol(symbol);
case "char":
payload = parsePayloadWord(m);
if (payload.length() != 1)
parseError("Expected a single character payload", m);
return KeyValue.makeCharKey(payload.charAt(0), symbol, flags);
case "keyevent":
payload = parsePayloadWord(m);
int eventcode = 0;
try { eventcode = Integer.parseInt(payload); }
catch (Exception _e)
{ parseError("Expected an integer payload", m); }
if (symbol == null)
symbol = String.valueOf(eventcode);
return KeyValue.keyeventKey(symbol, eventcode, flags);
default: break;
}
parseError("Unknown kind '"+kind+"'", m, 1);
return null; // Unreachable
}
static String parseSingleQuotedString(Matcher m) throws ParseError
{
if (!match(m, QUOTED_PAT))
parseError("Expected quoted string", m);
return m.group(1).replace("\\'", "'");
}
static String parsePayloadWord(Matcher m) throws ParseError
{
if (!match(m, WORD_PAT))
parseError("Expected a word after ':' made of [a-zA-Z0-9_]", m);
return m.group(0);
}
static int parseFlags(String s, Matcher m) throws ParseError
{
int flags = 0;
for (String f : s.split(","))
{
switch (f)
{
case "dim": flags |= KeyValue.FLAG_SECONDARY; break;
case "small": flags |= KeyValue.FLAG_SMALLER_FONT; break;
default: parseError("Unknown flag "+f, m);
}
}
return flags;
}
static boolean match(Matcher m, Pattern pat)
{
try { m.region(m.end(), m.regionEnd()); } catch (Exception _e) {}
m.usePattern(pat);
return m.lookingAt();
}
static void init()
{
if (START_PAT != null)
return;
START_PAT = Pattern.compile(":(\\w+)");
ATTR_PAT = Pattern.compile("\\s*(\\w+)\\s*=");
QUOTED_PAT = Pattern.compile("'(([^'\\\\]+|\\\\')*)'");
PAYLOAD_START_PAT = Pattern.compile("\\s*:");
WORD_PAT = Pattern.compile("[a-zA-Z0-9_]*");
} }
return flags;
} }
static boolean match(Matcher m, Pattern pat) static boolean match(Matcher m, Pattern pat)
@@ -263,6 +124,17 @@ public final class KeyValueParser
return m.lookingAt(); return m.lookingAt();
} }
static void init()
{
if (START_PAT != null)
return;
START_PAT = Pattern.compile(":(\\w+)");
ATTR_PAT = Pattern.compile("\\s*(\\w+)\\s*=");
QUOTED_PAT = Pattern.compile("'(([^'\\\\]+|\\\\')*)'");
PAYLOAD_START_PAT = Pattern.compile("\\s*:");
WORD_PAT = Pattern.compile("[a-zA-Z0-9_]*");
}
static void parseError(String msg, Matcher m) throws ParseError static void parseError(String msg, Matcher m) throws ParseError
{ {
parseError(msg, m, m.regionStart()); parseError(msg, m, m.regionStart());
@@ -273,7 +145,8 @@ public final class KeyValueParser
StringBuilder msg_ = new StringBuilder("Syntax error"); StringBuilder msg_ = new StringBuilder("Syntax error");
try try
{ {
msg_.append(" at token '").append(m.group(0)).append("'"); char c = m.group(0).charAt(0);
msg_.append(" at character '").append(c).append("'");
} catch (IllegalStateException _e) {} } catch (IllegalStateException _e) {}
msg_.append(" at position "); msg_.append(" at position ");
msg_.append(i); msg_.append(i);

View File

@@ -6,7 +6,6 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.inputmethodservice.InputMethodService; import android.inputmethodservice.InputMethodService;
import android.os.Build.VERSION; import android.os.Build.VERSION;
import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.text.InputType; import android.text.InputType;
import android.util.Log; import android.util.Log;
@@ -39,12 +38,9 @@ public class Keyboard2 extends InputMethodService
private ViewGroup _emojiPane = null; private ViewGroup _emojiPane = null;
private ViewGroup _clipboard_pane = null; private ViewGroup _clipboard_pane = null;
public int actionId; // Action performed by the Action key. public int actionId; // Action performed by the Action key.
private Handler _handler;
private Config _config; private Config _config;
private FoldStateTracker _foldStateTracker;
/** Layout currently visible before it has been modified. */ /** Layout currently visible before it has been modified. */
KeyboardData current_layout_unmodified() KeyboardData current_layout_unmodified()
{ {
@@ -66,7 +62,7 @@ public class Keyboard2 extends InputMethodService
{ {
if (_currentSpecialLayout != null) if (_currentSpecialLayout != null)
return _currentSpecialLayout; return _currentSpecialLayout;
return LayoutModifier.modify_layout(current_layout_unmodified()); return _config.modify_layout(current_layout_unmodified());
} }
void setTextLayout(int l) void setTextLayout(int l)
@@ -96,13 +92,13 @@ public class Keyboard2 extends InputMethodService
/** Load a layout that contains a numpad. */ /** Load a layout that contains a numpad. */
KeyboardData loadNumpad(int layout_id) KeyboardData loadNumpad(int layout_id)
{ {
return LayoutModifier.modify_numpad(KeyboardData.load(getResources(), layout_id), return _config.modify_numpad(KeyboardData.load(getResources(), layout_id),
current_layout_unmodified()); current_layout_unmodified());
} }
KeyboardData loadPinentry(int layout_id) KeyboardData loadPinentry(int layout_id)
{ {
return LayoutModifier.modify_pinentry(KeyboardData.load(getResources(), layout_id), return _config.modify_pinentry(KeyboardData.load(getResources(), layout_id),
current_layout_unmodified()); current_layout_unmodified());
} }
@@ -111,24 +107,14 @@ public class Keyboard2 extends InputMethodService
{ {
super.onCreate(); super.onCreate();
SharedPreferences prefs = DirectBootAwarePreferences.get_shared_preferences(this); SharedPreferences prefs = DirectBootAwarePreferences.get_shared_preferences(this);
_handler = new Handler(getMainLooper()); _keyeventhandler = new KeyEventHandler(getMainLooper(), this.new Receiver());
_keyeventhandler = new KeyEventHandler(this.new Receiver()); Config.initGlobalConfig(prefs, getResources(), _keyeventhandler);
_foldStateTracker = new FoldStateTracker(this);
Config.initGlobalConfig(prefs, getResources(), _keyeventhandler, _foldStateTracker.isUnfolded());
prefs.registerOnSharedPreferenceChangeListener(this); prefs.registerOnSharedPreferenceChangeListener(this);
_config = Config.globalConfig(); _config = Config.globalConfig();
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard); _keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
_keyboardView.reset(); _keyboardView.reset();
Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs)); Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs));
ClipboardHistoryService.on_startup(this, _keyeventhandler); ClipboardHistoryService.on_startup(this, _keyeventhandler);
_foldStateTracker.setChangedCallback(() -> { refresh_config(); });
}
@Override
public void onDestroy() {
super.onDestroy();
_foldStateTracker.close();
} }
private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm) private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm)
@@ -245,7 +231,7 @@ public class Keyboard2 extends InputMethodService
private void refresh_config() private void refresh_config()
{ {
int prev_theme = _config.theme; int prev_theme = _config.theme;
_config.refresh(getResources(), _foldStateTracker.isUnfolded()); _config.refresh(getResources());
refreshSubtypeImm(); refreshSubtypeImm();
// Refreshing the theme config requires re-creating the views // Refreshing the theme config requires re-creating the views
if (prev_theme != _config.theme) if (prev_theme != _config.theme)
@@ -265,9 +251,9 @@ public class Keyboard2 extends InputMethodService
case InputType.TYPE_CLASS_NUMBER: case InputType.TYPE_CLASS_NUMBER:
case InputType.TYPE_CLASS_PHONE: case InputType.TYPE_CLASS_PHONE:
case InputType.TYPE_CLASS_DATETIME: case InputType.TYPE_CLASS_DATETIME:
if (_config.selected_number_layout == NumberLayout.PIN) if (_config.pin_entry_enabled)
return loadPinentry(R.xml.pin); return loadPinentry(R.xml.pin);
else if (_config.selected_number_layout == NumberLayout.NUMBER) else
return loadNumpad(R.xml.numeric); return loadNumpad(R.xml.numeric);
default: default:
break; break;
@@ -295,7 +281,6 @@ public class Keyboard2 extends InputMethodService
((ViewGroup)parent).removeView(v); ((ViewGroup)parent).removeView(v);
super.setInputView(v); super.setInputView(v);
updateSoftInputWindowLayoutParams(); updateSoftInputWindowLayoutParams();
v.requestApplyInsets();
} }
@@ -307,16 +292,14 @@ public class Keyboard2 extends InputMethodService
private void updateSoftInputWindowLayoutParams() { private void updateSoftInputWindowLayoutParams() {
final Window window = getWindow().getWindow(); final Window window = getWindow().getWindow();
// On API >= 35, Keyboard2View behaves as edge-to-edge // On API >= 30, Keyboard2View behaves as edge-to-edge
// APIs 30 to 34 have visual artifact when edge-to-edge is enabled if (VERSION.SDK_INT >= 30)
if (VERSION.SDK_INT >= 35)
{ {
WindowManager.LayoutParams wattrs = window.getAttributes(); WindowManager.LayoutParams wattrs = window.getAttributes();
wattrs.layoutInDisplayCutoutMode = wattrs.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
// Allow to draw behind system bars // Allow to draw behind system bars
wattrs.setFitInsetsTypes(0); wattrs.setFitInsetsTypes(0);
window.setDecorFitsSystemWindows(false);
} }
updateLayoutHeightOf(window, ViewGroup.LayoutParams.MATCH_PARENT); updateLayoutHeightOf(window, ViewGroup.LayoutParams.MATCH_PARENT);
final View inputArea = window.findViewById(android.R.id.inputArea); final View inputArea = window.findViewById(android.R.id.inputArea);
@@ -375,8 +358,6 @@ public class Keyboard2 extends InputMethodService
{ {
super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, candidatesStart, candidatesEnd); super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, candidatesStart, candidatesEnd);
_keyeventhandler.selection_updated(oldSelStart, newSelStart); _keyeventhandler.selection_updated(oldSelStart, newSelStart);
if ((oldSelStart == oldSelEnd) != (newSelStart == newSelEnd))
_keyboardView.set_selection_state(newSelStart != newSelEnd);
} }
@Override @Override
@@ -495,20 +476,10 @@ public class Keyboard2 extends InputMethodService
_keyboardView.set_compose_pending(pending); _keyboardView.set_compose_pending(pending);
} }
public void selection_state_changed(boolean selection_is_ongoing)
{
_keyboardView.set_selection_state(selection_is_ongoing);
}
public InputConnection getCurrentInputConnection() public InputConnection getCurrentInputConnection()
{ {
return Keyboard2.this.getCurrentInputConnection(); return Keyboard2.this.getCurrentInputConnection();
} }
public Handler getHandler()
{
return _handler;
}
} }
private IBinder getConnectionToken() private IBinder getConnectionToken()

View File

@@ -42,17 +42,11 @@ public class Keyboard2View extends View
private Config _config; private Config _config;
private float _keyWidth; private float _keyWidth;
private float _mainLabelSize;
private float _subLabelSize;
private float _marginRight; private float _marginRight;
private float _marginLeft; private float _marginLeft;
private float _marginBottom; private float _marginBottom;
private int _insets_left = 0;
private int _insets_right = 0;
private int _insets_bottom = 0;
private Theme _theme; private Theme _theme;
private Theme.Computed _tc;
private static RectF _tmpRect = new RectF(); private static RectF _tmpRect = new RectF();
@@ -110,6 +104,11 @@ public class Keyboard2View extends View
_keyboard = kw; _keyboard = kw;
_shift_kv = KeyValue.getKeyByName("shift"); _shift_kv = KeyValue.getKeyByName("shift");
_shift_key = _keyboard.findKeyWithValue(_shift_kv); _shift_key = _keyboard.findKeyWithValue(_shift_kv);
if (_shift_key == null)
{
_shift_kv = _shift_kv.withFlags(_shift_kv.getFlags() | KeyValue.FLAG_LOCK);
_shift_key = _keyboard.findKeyWithValue(_shift_kv);
}
_compose_kv = KeyValue.getKeyByName("compose"); _compose_kv = KeyValue.getKeyByName("compose");
_compose_key = _keyboard.findKeyWithValue(_compose_kv); _compose_key = _keyboard.findKeyWithValue(_compose_kv);
KeyModifier.set_modmap(_keyboard.modmap); KeyModifier.set_modmap(_keyboard.modmap);
@@ -144,13 +143,6 @@ public class Keyboard2View extends View
set_fake_ptr_latched(_compose_key, _compose_kv, pending, false); set_fake_ptr_latched(_compose_key, _compose_kv, pending, false);
} }
/** Called from [Keybard2.onUpdateSelection]. */
public void set_selection_state(boolean selection_state)
{
set_fake_ptr_latched(KeyboardData.Key.EMPTY,
KeyValue.getKeyByName("selection_mode"), selection_state, true);
}
public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods) public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods)
{ {
return KeyModifier.modify(k, mods); return KeyModifier.modify(k, mods);
@@ -232,7 +224,7 @@ public class Keyboard2View extends View
return null; return null;
for (KeyboardData.Row row : _keyboard.rows) for (KeyboardData.Row row : _keyboard.rows)
{ {
y += (row.shift + row.height) * _tc.row_height; y += (row.shift + row.height) * _config.keyHeight;
if (ty < y) if (ty < y)
return row; return row;
} }
@@ -267,27 +259,55 @@ public class Keyboard2View extends View
public void onMeasure(int wSpec, int hSpec) public void onMeasure(int wSpec, int hSpec)
{ {
int width; int width;
DisplayMetrics dm = getContext().getResources().getDisplayMetrics(); int insets_left = 0;
width = dm.widthPixels; int insets_right = 0;
_marginLeft = Math.max(_config.horizontal_margin, _insets_left); int insets_bottom = 0;
_marginRight = Math.max(_config.horizontal_margin, _insets_right); // LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS is set in [Keyboard2#updateSoftInputWindowLayoutParams].
_marginBottom = _config.margin_bottom + _insets_bottom; // and keyboard is allowed do draw behind status/navigation bars
_keyWidth = (width - _marginLeft - _marginRight) / _keyboard.keysWidth; if (VERSION.SDK_INT >= 30)
_tc = new Theme.Computed(_theme, _config, _keyWidth, _keyboard); {
// Compute the size of labels based on the width or the height of keys. The WindowMetrics metrics =
// margin around keys is taken into account. Keys normal aspect ratio is ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE))
// assumed to be 3/2 for a 10 columns layout. It's generally more, the .getCurrentWindowMetrics();
// width computation is useful when the keyboard is unusually high. width = metrics.getBounds().width();
float labelBaseSize = Math.min( WindowInsets wi = metrics.getWindowInsets();
_tc.row_height - _tc.vertical_margin, int insets_types =
(width / 10 - _tc.horizontal_margin) * 3/2 WindowInsets.Type.statusBars()
) * _config.characterSize; | WindowInsets.Type.displayCutout()
_mainLabelSize = labelBaseSize * _config.labelTextSize; | WindowInsets.Type.mandatorySystemGestures()
_subLabelSize = labelBaseSize * _config.sublabelTextSize; | WindowInsets.Type.navigationBars();
Insets insets = wi.getInsets(insets_types);
insets_left = insets.left;
insets_right = insets.right;
// On API 35, the keyboard is allowed to draw under the
// button-navigation bar but on lower APIs, it must be discounted from
// the width.
if (VERSION.SDK_INT < 35)
{
Insets nav_insets = wi.getInsets(WindowInsets.Type.navigationBars());
width -= nav_insets.left + nav_insets.right;
insets_left -= nav_insets.left;
insets_right -= nav_insets.right;
}
// [insets.bottom] doesn't take into account the buttons that appear in
// the gesture navigation bar when the IME is showing so ensure a minimum
// of margin is added.
if (VERSION.SDK_INT >= 35)
insets_bottom = Math.max(insets.bottom, _config.bottomInsetMin);
}
else
{
DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
width = dm.widthPixels;
}
int height = int height =
(int)(_tc.row_height * _keyboard.keysHeight (int)(_config.keyHeight * _keyboard.keysHeight
+ _config.marginTop + _marginBottom); + _config.marginTop + _marginBottom);
setMeasuredDimension(width, height); setMeasuredDimension(width, height);
_marginLeft = Math.max(_config.horizontal_margin, insets_left);
_marginRight = Math.max(_config.horizontal_margin, insets_right);
_marginBottom = _config.margin_bottom + insets_bottom;
_keyWidth = (width - _marginLeft - _marginRight) / _keyboard.keysWidth;
} }
@Override @Override
@@ -307,22 +327,6 @@ public class Keyboard2View extends View
} }
} }
@Override
public WindowInsets onApplyWindowInsets(WindowInsets wi)
{
// LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS is set in [Keyboard2#updateSoftInputWindowLayoutParams] for SDK_INT >= 35.
if (VERSION.SDK_INT < 35)
return wi;
int insets_types =
WindowInsets.Type.systemBars()
| WindowInsets.Type.displayCutout();
Insets insets = wi.getInsets(insets_types);
_insets_left = insets.left;
_insets_right = insets.right;
_insets_bottom = insets.bottom;
return WindowInsets.CONSUMED;
}
/** Horizontal and vertical position of the 9 indexes. */ /** Horizontal and vertical position of the 9 indexes. */
static final Paint.Align[] LABEL_POSITION_H = new Paint.Align[]{ static final Paint.Align[] LABEL_POSITION_H = new Paint.Align[]{
Paint.Align.CENTER, Paint.Align.LEFT, Paint.Align.RIGHT, Paint.Align.LEFT, Paint.Align.CENTER, Paint.Align.LEFT, Paint.Align.RIGHT, Paint.Align.LEFT,
@@ -341,30 +345,37 @@ public class Keyboard2View extends View
{ {
// Set keyboard background opacity // Set keyboard background opacity
getBackground().setAlpha(_config.keyboardOpacity); getBackground().setAlpha(_config.keyboardOpacity);
float y = _tc.margin_top; // Set keys opacity
_theme.keyBgPaint.setAlpha(_config.keyOpacity);
_theme.keyDownBgPaint.setAlpha(_config.keyActivatedOpacity);
_theme.keyBorderPaint.setAlpha(_config.keyOpacity);
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) for (KeyboardData.Row row : _keyboard.rows)
{ {
y += row.shift * _tc.row_height; y += row.shift * _config.keyHeight;
float x = _marginLeft + _tc.margin_left; float x = _marginLeft + key_horizontal_margin / 2;
float keyH = row.height * _tc.row_height - _tc.vertical_margin; float keyH = row.height * _config.keyHeight - key_vertical_margin;
for (KeyboardData.Key k : row.keys) for (KeyboardData.Key k : row.keys)
{ {
x += k.shift * _keyWidth; x += k.shift * _keyWidth;
float keyW = _keyWidth * k.width - _tc.horizontal_margin; float keyW = _keyWidth * k.width - key_horizontal_margin;
boolean isKeyDown = _pointers.isKeyDown(k); boolean isKeyDown = _pointers.isKeyDown(k);
Theme.Computed.Key tc_key = isKeyDown ? _tc.key_activated : _tc.key; drawKeyFrame(canvas, x, y, keyW, keyH, isKeyDown);
drawKeyFrame(canvas, x, y, keyW, keyH, tc_key);
if (k.keys[0] != null) if (k.keys[0] != null)
drawLabel(canvas, k.keys[0], keyW / 2f + x, y, keyH, isKeyDown, tc_key); drawLabel(canvas, k.keys[0], keyW / 2f + x, y, keyH, isKeyDown);
for (int i = 1; i < 9; i++) for (int i = 1; i < 9; i++)
{ {
if (k.keys[i] != null) if (k.keys[i] != null)
drawSubLabel(canvas, k.keys[i], x, y, keyW, keyH, i, isKeyDown, tc_key); drawSubLabel(canvas, k.keys[i], x, y, keyW, keyH, i, isKeyDown);
} }
drawIndication(canvas, k, x, y, keyW, keyH, _tc); drawIndication(canvas, k, x, y, keyW, keyH);
x += _keyWidth * k.width; x += _keyWidth * k.width;
} }
y += row.height * _tc.row_height; y += row.height * _config.keyHeight;
} }
} }
@@ -376,32 +387,42 @@ public class Keyboard2View extends View
/** Draw borders and background of the key. */ /** Draw borders and background of the key. */
void drawKeyFrame(Canvas canvas, float x, float y, float keyW, float keyH, void drawKeyFrame(Canvas canvas, float x, float y, float keyW, float keyH,
Theme.Computed.Key tc) boolean isKeyDown)
{ {
float r = tc.border_radius; float r = _theme.keyBorderRadius;
float w = tc.border_width; if (_config.borderConfig)
r = _config.customBorderRadius * _keyWidth;
float w = (_config.borderConfig) ? _config.customBorderLineWidth : _theme.keyBorderWidth;
float padding = w / 2.f; float padding = w / 2.f;
if (isKeyDown)
w = _theme.keyBorderWidthActivated;
_tmpRect.set(x + padding, y + padding, x + keyW - padding, y + keyH - padding); _tmpRect.set(x + padding, y + padding, x + keyW - padding, y + keyH - padding);
canvas.drawRoundRect(_tmpRect, r, r, tc.bg_paint); canvas.drawRoundRect(_tmpRect, r, r,
isKeyDown ? _theme.keyDownBgPaint : _theme.keyBgPaint);
if (w > 0.f) if (w > 0.f)
{ {
_theme.keyBorderPaint.setStrokeWidth(w);
float overlap = r - r * 0.85f + w; // sin(45°) float overlap = r - r * 0.85f + w; // sin(45°)
drawBorder(canvas, x, y, x + overlap, y + keyH, tc.border_left_paint, tc); drawBorder(canvas, x, y, x + overlap, y + keyH, _theme.keyBorderColorLeft);
drawBorder(canvas, x + keyW - overlap, y, x + keyW, y + keyH, tc.border_right_paint, tc); drawBorder(canvas, x + keyW - overlap, y, x + keyW, y + keyH, _theme.keyBorderColorRight);
drawBorder(canvas, x, y, x + keyW, y + overlap, tc.border_top_paint, tc); drawBorder(canvas, x, y, x + keyW, y + overlap, _theme.keyBorderColorTop);
drawBorder(canvas, x, y + keyH - overlap, x + keyW, y + keyH, tc.border_bottom_paint, tc); drawBorder(canvas, x, y + keyH - overlap, x + keyW, y + keyH, _theme.keyBorderColorBottom);
} }
} }
/** Clip to draw a border at a time. This allows to call [drawRoundRect] /** Clip to draw a border at a time. This allows to call [drawRoundRect]
several time with the same parameters but a different Paint. */ several time with the same parameters but a different Paint. */
void drawBorder(Canvas canvas, float clipl, float clipt, float clipr, void drawBorder(Canvas canvas, float clipl, float clipt, float clipr,
float clipb, Paint paint, Theme.Computed.Key tc) float clipb, int color)
{ {
float r = tc.border_radius; Paint p = _theme.keyBorderPaint;
float r = _theme.keyBorderRadius;
if (_config.borderConfig)
r = _config.customBorderRadius * _keyWidth;
canvas.save(); canvas.save();
canvas.clipRect(clipl, clipt, clipr, clipb); canvas.clipRect(clipl, clipt, clipr, clipb);
canvas.drawRoundRect(_tmpRect, r, r, paint); p.setColor(color);
canvas.drawRoundRect(_tmpRect, r, r, p);
canvas.restore(); canvas.restore();
} }
@@ -426,28 +447,32 @@ public class Keyboard2View extends View
return sublabel ? _theme.subLabelColor : _theme.labelColor; return sublabel ? _theme.subLabelColor : _theme.labelColor;
} }
private void drawLabel(Canvas canvas, KeyValue kv, float x, float y, private void drawLabel(Canvas canvas, KeyValue kv, float x, float y, float keyH, boolean isKeyDown)
float keyH, boolean isKeyDown, Theme.Computed.Key tc)
{ {
kv = modifyKey(kv, _mods); kv = modifyKey(kv, _mods);
if (kv == null) if (kv == null)
return; return;
float textSize = scaleTextSize(kv, true); float textSize = scaleTextSize(kv, _config.labelTextSize, keyH);
Paint p = tc.label_paint(kv.hasFlagsAny(KeyValue.FLAG_KEY_FONT), labelColor(kv, isKeyDown, false), textSize); Paint p = _theme.labelPaint(kv.hasFlagsAny(KeyValue.FLAG_KEY_FONT));
p.setColor(labelColor(kv, isKeyDown, false));
p.setAlpha(_config.labelBrightness);
p.setTextSize(textSize);
canvas.drawText(kv.getString(), x, (keyH - p.ascent() - p.descent()) / 2f + y, p); canvas.drawText(kv.getString(), x, (keyH - p.ascent() - p.descent()) / 2f + y, p);
} }
private void drawSubLabel(Canvas canvas, KeyValue kv, float x, float y, private void drawSubLabel(Canvas canvas, KeyValue kv, float x, float y,
float keyW, float keyH, int sub_index, boolean isKeyDown, float keyW, float keyH, int sub_index, boolean isKeyDown)
Theme.Computed.Key tc)
{ {
Paint.Align a = LABEL_POSITION_H[sub_index]; Paint.Align a = LABEL_POSITION_H[sub_index];
Vertical v = LABEL_POSITION_V[sub_index]; Vertical v = LABEL_POSITION_V[sub_index];
kv = modifyKey(kv, _mods); kv = modifyKey(kv, _mods);
if (kv == null) if (kv == null)
return; return;
float textSize = scaleTextSize(kv, false); float textSize = scaleTextSize(kv, _config.sublabelTextSize, keyH);
Paint p = tc.sublabel_paint(kv.hasFlagsAny(KeyValue.FLAG_KEY_FONT), labelColor(kv, isKeyDown, true), textSize, a); Paint p = _theme.subLabelPaint(kv.hasFlagsAny(KeyValue.FLAG_KEY_FONT), a);
p.setColor(labelColor(kv, isKeyDown, true));
p.setAlpha(_config.labelBrightness);
p.setTextSize(textSize);
float subPadding = _config.keyPadding; float subPadding = _config.keyPadding;
if (v == Vertical.CENTER) if (v == Vertical.CENTER)
y += (keyH - p.ascent() - p.descent()) / 2f; y += (keyH - p.ascent() - p.descent()) / 2f;
@@ -466,20 +491,40 @@ public class Keyboard2View extends View
} }
private void drawIndication(Canvas canvas, KeyboardData.Key k, float x, private void drawIndication(Canvas canvas, KeyboardData.Key k, float x,
float y, float keyW, float keyH, Theme.Computed tc) float y, float keyW, float keyH)
{ {
if (k.indication == null || k.indication.equals("")) boolean special_font = false;
String indic;
int indic_length;
float text_size;
if (k.indication != null)
{
indic = k.indication;
indic_length = indic.length();
text_size = keyH * _config.sublabelTextSize * _config.characterSize;
}
else if (k.anticircle != null)
{
indic = k.anticircle.getString();
// 3 character limit like regular labels
indic_length = Math.min(indic.length(), 3);
special_font = k.anticircle.hasFlagsAny(KeyValue.FLAG_KEY_FONT);
text_size = scaleTextSize(k.anticircle, _config.sublabelTextSize, keyH);
}
else
{
return; return;
Paint p = tc.indication_paint; }
p.setTextSize(_subLabelSize); Paint p = _theme.indicationPaint(special_font);
canvas.drawText(k.indication, 0, k.indication.length(), p.setColor(_theme.subLabelColor);
p.setTextSize(text_size);
canvas.drawText(indic, 0, indic_length,
x + keyW / 2f, (keyH - p.ascent() - p.descent()) * 4/5 + y, p); x + keyW / 2f, (keyH - p.ascent() - p.descent()) * 4/5 + y, p);
} }
private float scaleTextSize(KeyValue k, boolean main_label) private float scaleTextSize(KeyValue k, float rel_size, float keyH)
{ {
float smaller_font = k.hasFlagsAny(KeyValue.FLAG_SMALLER_FONT) ? 0.75f : 1.f; float smaller_font = k.hasFlagsAny(KeyValue.FLAG_SMALLER_FONT) ? 0.75f : 1.f;
float label_size = main_label ? _mainLabelSize : _subLabelSize; return keyH * rel_size * smaller_font * _config.characterSize;
return label_size * smaller_font;
} }
} }

View File

@@ -31,8 +31,6 @@ public final class KeyboardData
public final String name; public final String name;
/** Whether the bottom row should be added. */ /** Whether the bottom row should be added. */
public final boolean bottom_row; public final boolean bottom_row;
/** Whether the number row is included in the layout and thus another one shouldn't be added. */
public final boolean embedded_number_row;
/** Whether extra keys from [method.xml] should be added to this layout. */ /** Whether extra keys from [method.xml] should be added to this layout. */
public final boolean locale_extra_keys; public final boolean locale_extra_keys;
/** Position of every keys on the layout, see [getKeys()]. */ /** Position of every keys on the layout, see [getKeys()]. */
@@ -177,9 +175,14 @@ public final class KeyboardData
private static Map<Integer, KeyboardData> _layoutCache = new HashMap<Integer, KeyboardData>(); private static Map<Integer, KeyboardData> _layoutCache = new HashMap<Integer, KeyboardData>();
public static Row load_row(Resources res, int res_id) throws Exception public static Row load_bottom_row(Resources res) throws Exception
{ {
return parse_row(res.getXml(res_id)); return parse_row(res.getXml(R.xml.bottom_row));
}
public static Row load_number_row(Resources res) throws Exception
{
return parse_row(res.getXml(R.xml.number_row));
} }
public static KeyboardData load_num_pad(Resources res) throws Exception public static KeyboardData load_num_pad(Resources res) throws Exception
@@ -236,7 +239,6 @@ public final class KeyboardData
if (!expect_tag(parser, "keyboard")) if (!expect_tag(parser, "keyboard"))
throw error(parser, "Expected tag <keyboard>"); throw error(parser, "Expected tag <keyboard>");
boolean bottom_row = attribute_bool(parser, "bottom_row", true); boolean bottom_row = attribute_bool(parser, "bottom_row", true);
boolean embedded_number_row = attribute_bool(parser, "embedded_number_row", false);
boolean locale_extra_keys = attribute_bool(parser, "locale_extra_keys", true); boolean locale_extra_keys = attribute_bool(parser, "locale_extra_keys", true);
float specified_kw = attribute_float(parser, "width", 0f); float specified_kw = attribute_float(parser, "width", 0f);
String script = parser.getAttributeValue(null, "script"); String script = parser.getAttributeValue(null, "script");
@@ -260,14 +262,14 @@ public final class KeyboardData
case "modmap": case "modmap":
if (modmap != null) if (modmap != null)
throw error(parser, "Multiple '<modmap>' are not allowed"); throw error(parser, "Multiple '<modmap>' are not allowed");
modmap = parse_modmap(parser); modmap = Modmap.parse(parser);
break; break;
default: default:
throw error(parser, "Expecting tag <row>, got <" + parser.getName() + ">"); throw error(parser, "Expecting tag <row>, got <" + parser.getName() + ">");
} }
} }
float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows); float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows);
return new KeyboardData(rows, kw, modmap, script, numpad_script, name, bottom_row, embedded_number_row, locale_extra_keys); return new KeyboardData(rows, kw, modmap, script, numpad_script, name, bottom_row, locale_extra_keys);
} }
private static float compute_max_width(List<Row> rows) private static float compute_max_width(List<Row> rows)
@@ -286,7 +288,7 @@ public final class KeyboardData
} }
protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc, protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc,
String npsc, String name_, boolean bottom_row_, boolean embedded_number_row_, boolean locale_extra_keys_) String npsc, String name_, boolean bottom_row_, boolean locale_extra_keys_)
{ {
float kh = 0.f; float kh = 0.f;
for (Row r : rows_) for (Row r : rows_)
@@ -299,7 +301,6 @@ public final class KeyboardData
keysWidth = Math.max(kw, 1f); keysWidth = Math.max(kw, 1f);
keysHeight = kh; keysHeight = kh;
bottom_row = bottom_row_; bottom_row = bottom_row_;
embedded_number_row = embedded_number_row_;
locale_extra_keys = locale_extra_keys_; locale_extra_keys = locale_extra_keys_;
} }
@@ -307,7 +308,7 @@ public final class KeyboardData
protected KeyboardData(KeyboardData src, List<Row> rows) protected KeyboardData(KeyboardData src, List<Row> rows)
{ {
this(rows, compute_max_width(rows), src.modmap, src.script, this(rows, compute_max_width(rows), src.modmap, src.script,
src.numpad_script, src.name, src.bottom_row, src.embedded_number_row, src.locale_extra_keys); src.numpad_script, src.name, src.bottom_row, src.locale_extra_keys);
} }
public static class Row public static class Row
@@ -336,13 +337,9 @@ public final class KeyboardData
int status; int status;
float h = attribute_float(parser, "height", 1f); float h = attribute_float(parser, "height", 1f);
float shift = attribute_float(parser, "shift", 0f); float shift = attribute_float(parser, "shift", 0f);
float scale = attribute_float(parser, "scale", 0f);
while (expect_tag(parser, "key")) while (expect_tag(parser, "key"))
keys.add(Key.parse(parser)); keys.add(Key.parse(parser));
Row row = new Row(keys, h, shift); return new Row(keys, h, shift);
if (scale > 0f)
row = row.updateWidth(scale);
return row;
} }
public Row copy() public Row copy()
@@ -404,6 +401,9 @@ public final class KeyboardData
public final float width; public final float width;
/** Extra empty space on the left of the key. */ /** Extra empty space on the left of the key. */
public final float shift; public final float shift;
/** Keys 2 and 3 are repeated as the finger moves laterally on the key.
Used for the left and right arrow keys on the space bar. */
public final boolean slider;
/** String printed on the keys. It has no other effect. */ /** String printed on the keys. It has no other effect. */
public final String indication; public final String indication;
@@ -411,18 +411,17 @@ public final class KeyboardData
public static final int F_LOC = 1; public static final int F_LOC = 1;
public static final int ALL_FLAGS = F_LOC; public static final int ALL_FLAGS = F_LOC;
protected Key(KeyValue[] ks, KeyValue antic, int f, float w, float s, String i) protected Key(KeyValue[] ks, KeyValue antic, int f, float w, float s, boolean sl, String i)
{ {
keys = ks; keys = ks;
anticircle = antic; anticircle = antic;
keysflags = f; keysflags = f;
width = Math.max(w, 0f); width = Math.max(w, 0f);
shift = Math.max(s, 0f); shift = Math.max(s, 0f);
slider = sl;
indication = i; indication = i;
} }
static final Key EMPTY = new Key(new KeyValue[9], null, 0, 1.f, 1.f, null);
/** Read a key value attribute that have a synonym. Having both synonyms /** Read a key value attribute that have a synonym. Having both synonyms
present at the same time is an error. present at the same time is an error.
Returns [null] if the attributes are not present. */ Returns [null] if the attributes are not present. */
@@ -488,10 +487,11 @@ public final class KeyboardData
KeyValue anticircle = parse_nonloc_key_attr(parser, "anticircle"); KeyValue anticircle = parse_nonloc_key_attr(parser, "anticircle");
float width = attribute_float(parser, "width", 1f); float width = attribute_float(parser, "width", 1f);
float shift = attribute_float(parser, "shift", 0.f); float shift = attribute_float(parser, "shift", 0.f);
boolean slider = attribute_bool(parser, "slider", false);
String indication = parser.getAttributeValue(null, "indication"); String indication = parser.getAttributeValue(null, "indication");
while (parser.next() != XmlPullParser.END_TAG) while (parser.next() != XmlPullParser.END_TAG)
continue; continue;
return new Key(ks, anticircle, keysflags, width, shift, indication); return new Key(ks, anticircle, keysflags, width, shift, slider, indication);
} }
/** Whether key at [index] as [flag]. */ /** Whether key at [index] as [flag]. */
@@ -503,7 +503,8 @@ public final class KeyboardData
/** New key with the width multiplied by 's'. */ /** New key with the width multiplied by 's'. */
public Key scaleWidth(float s) public Key scaleWidth(float s)
{ {
return new Key(keys, anticircle, keysflags, width * s, shift, indication); return new Key(keys, anticircle, keysflags, width * s, shift, slider,
indication);
} }
public void getKeys(Map<KeyValue, KeyPos> dst, int row, int col) public void getKeys(Map<KeyValue, KeyPos> dst, int row, int col)
@@ -524,12 +525,12 @@ public final class KeyboardData
for (int j = 0; j < keys.length; j++) ks[j] = keys[j]; for (int j = 0; j < keys.length; j++) ks[j] = keys[j];
ks[i] = kv; ks[i] = kv;
int flags = (keysflags & ~(ALL_FLAGS << i)); int flags = (keysflags & ~(ALL_FLAGS << i));
return new Key(ks, anticircle, flags, width, shift, indication); return new Key(ks, anticircle, flags, width, shift, slider, indication);
} }
public Key withShift(float s) public Key withShift(float s)
{ {
return new Key(keys, anticircle, keysflags, width, s, indication); return new Key(keys, anticircle, keysflags, width, s, slider, indication);
} }
public boolean hasValue(KeyValue kv) public boolean hasValue(KeyValue kv)
@@ -555,38 +556,57 @@ public final class KeyboardData
for (int i = 0; i < ks.length; i++) for (int i = 0; i < ks.length; i++)
if (k.keys[i] != null) if (k.keys[i] != null)
ks[i] = apply(k.keys[i], k.keyHasFlag(i, Key.F_LOC)); ks[i] = apply(k.keys[i], k.keyHasFlag(i, Key.F_LOC));
return new Key(ks, k.anticircle, k.keysflags, k.width, k.shift, k.indication); return new Key(ks, k.anticircle, k.keysflags, k.width, k.shift, k.slider, k.indication);
} }
} }
public static Modmap parse_modmap(XmlPullParser parser) throws Exception public static class Modmap
{ {
Modmap mm = new Modmap(); public final Map<KeyValue, KeyValue> shift;
while (next_tag(parser)) public final Map<KeyValue, KeyValue> fn;
public final Map<KeyValue, KeyValue> ctrl;
public Modmap(Map<KeyValue, KeyValue> s, Map<KeyValue, KeyValue> f, Map<KeyValue, KeyValue> c)
{ {
Modmap.M m; shift = s;
switch (parser.getName()) fn = f;
{ ctrl = c;
case "shift": m = Modmap.M.Shift; break;
case "fn": m = Modmap.M.Fn; break;
case "ctrl": m = Modmap.M.Ctrl; break;
default:
throw error(parser, "Expecting tag <shift> or <fn>, got <" +
parser.getName() + ">");
}
parse_modmap_mapping(parser, mm, m);
} }
return mm;
}
private static void parse_modmap_mapping(XmlPullParser parser, Modmap mm, public static Modmap parse(XmlPullParser parser) throws Exception
Modmap.M m) throws Exception {
{ HashMap<KeyValue, KeyValue> shift = new HashMap<KeyValue, KeyValue>();
KeyValue a = KeyValue.getKeyByName(parser.getAttributeValue(null, "a")); HashMap<KeyValue, KeyValue> fn = new HashMap<KeyValue, KeyValue>();
KeyValue b = KeyValue.getKeyByName(parser.getAttributeValue(null, "b")); HashMap<KeyValue, KeyValue> ctrl = new HashMap<KeyValue, KeyValue>();
while (parser.next() != XmlPullParser.END_TAG) while (next_tag(parser))
continue; {
mm.add(m, a, b); switch (parser.getName())
{
case "shift":
parse_mapping(parser, shift);
break;
case "fn":
parse_mapping(parser, fn);
break;
case "ctrl":
parse_mapping(parser, ctrl);
break;
default:
throw error(parser, "Expecting tag <shift> or <fn>, got <" + parser.getName() + ">");
}
}
return new Modmap(shift, fn, ctrl);
}
private static void parse_mapping(XmlPullParser parser, Map<KeyValue, KeyValue> dst) throws Exception
{
KeyValue a = KeyValue.getKeyByName(parser.getAttributeValue(null, "a"));
KeyValue b = KeyValue.getKeyByName(parser.getAttributeValue(null, "b"));
while (parser.next() != XmlPullParser.END_TAG)
continue;
dst.put(a, b);
}
} }
/** Position of a key on the layout. */ /** Position of a key on the layout. */

View File

@@ -42,7 +42,6 @@ public class LauncherActivity extends Activity implements Handler.Callback
if (VERSION.SDK_INT >= 28) if (VERSION.SDK_INT >= 28)
_tryhere_area.addOnUnhandledKeyEventListener( _tryhere_area.addOnUnhandledKeyEventListener(
this.new Tryhere_OnUnhandledKeyEventListener()); this.new Tryhere_OnUnhandledKeyEventListener());
_handler = new Handler(getMainLooper(), this);
} }
@Override @Override
@@ -53,7 +52,7 @@ public class LauncherActivity extends Activity implements Handler.Callback
_animations.add(find_anim(R.id.launcher_anim_swipe)); _animations.add(find_anim(R.id.launcher_anim_swipe));
_animations.add(find_anim(R.id.launcher_anim_round_trip)); _animations.add(find_anim(R.id.launcher_anim_round_trip));
_animations.add(find_anim(R.id.launcher_anim_circle)); _animations.add(find_anim(R.id.launcher_anim_circle));
_handler.removeMessages(0); _handler = new Handler(getMainLooper(), this);
_handler.sendEmptyMessageDelayed(0, 500); _handler.sendEmptyMessageDelayed(0, 500);
} }

View File

@@ -1,218 +0,0 @@
package juloo.keyboard2;
import android.content.res.Resources;
import android.view.KeyEvent;
import java.util.TreeMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public final class LayoutModifier
{
static Config globalConfig;
static KeyboardData.Row bottom_row;
static KeyboardData.Row number_row_no_symbols;
static KeyboardData.Row number_row_symbols;
static KeyboardData num_pad;
/** Update the layout according to the configuration.
* - Remove the switching key if it isn't needed
* - Remove "localized" keys from other locales (not in 'extra_keys')
* - Replace the action key to show the right label
* - Swap the enter and action keys
* - Add the optional numpad and number row
* - Add the extra keys
*/
public static KeyboardData modify_layout(KeyboardData kw)
{
// Extra keys are removed from the set as they are encountered during the
// first iteration then automatically added.
final TreeMap<KeyValue, KeyboardData.PreferredPos> extra_keys = new TreeMap<KeyValue, KeyboardData.PreferredPos>();
final Set<KeyValue> remove_keys = new HashSet<KeyValue>();
// Make sure the config key is accessible to avoid being locked in a custom
// layout.
extra_keys.put(KeyValue.getKeyByName("config"), KeyboardData.PreferredPos.ANYWHERE);
extra_keys.putAll(globalConfig.extra_keys_param);
extra_keys.putAll(globalConfig.extra_keys_custom);
// Number row and numpads are added after the modification pass to allow
// removing the number keys from the main layout.
KeyboardData.Row added_number_row = null;
KeyboardData added_numpad = null;
if (globalConfig.show_numpad)
{
added_numpad = modify_numpad(num_pad, kw);
remove_keys.addAll(added_numpad.getKeys().keySet());
}
else if (globalConfig.add_number_row && !kw.embedded_number_row) // The numpad removes the number row
{
added_number_row = modify_number_row(globalConfig.number_row_symbols ? number_row_symbols : number_row_no_symbols, kw);
remove_keys.addAll(added_number_row.getKeys(0).keySet());
}
// Add the bottom row before computing the extra keys
if (kw.bottom_row)
kw = kw.insert_row(bottom_row, kw.rows.size());
// Compose keys to add to the layout
// 'extra_keys_keyset' reflects changes made to 'extra_keys'
Set<KeyValue> extra_keys_keyset = extra_keys.keySet();
// 'kw_keys' contains the keys present on the layout without any extra keys
Set<KeyValue> kw_keys = kw.getKeys().keySet();
if (globalConfig.extra_keys_subtype != null && kw.locale_extra_keys)
{
Set<KeyValue> present = new HashSet<KeyValue>(kw_keys);
present.addAll(extra_keys_keyset);
globalConfig.extra_keys_subtype.compute(extra_keys,
new ExtraKeys.Query(kw.script, present));
}
kw = kw.mapKeys(new KeyboardData.MapKeyValues() {
public KeyValue apply(KeyValue key, boolean localized)
{
if (localized && !extra_keys.containsKey(key))
return null;
if (remove_keys.contains(key))
return null;
return modify_key(key);
}
});
if (added_numpad != null)
kw = kw.addNumPad(added_numpad);
// Add extra keys that are not on the layout (including 'loc' keys)
extra_keys_keyset.removeAll(kw_keys);
if (extra_keys.size() > 0)
kw = kw.addExtraKeys(extra_keys.entrySet().iterator());
// Avoid adding extra keys to the number row
if (added_number_row != null)
kw = kw.insert_row(added_number_row, 0);
return kw;
}
/** Handle the numpad layout. The [main_kw] is used to adapt the numpad to
the main layout's script. */
public static KeyboardData modify_numpad(KeyboardData kw, KeyboardData main_kw)
{
final int map_digit = KeyModifier.modify_numpad_script(main_kw.numpad_script);
return kw.mapKeys(new KeyboardData.MapKeyValues() {
public KeyValue apply(KeyValue key, boolean localized)
{
switch (key.getKind())
{
case Char:
char prev_c = key.getChar();
char c = prev_c;
if (globalConfig.inverse_numpad)
c = inverse_numpad_char(c);
if (map_digit != -1)
{
KeyValue modified = ComposeKey.apply(map_digit, c);
if (modified != null) // Was modified by script
return modified;
}
if (prev_c != c) // Was inverted
return key.withChar(c);
return key; // Don't fallback into [modify_key]
}
return modify_key(key);
}
});
}
/** Modify the pin entry layout. [main_kw] is used to map the digits into the
same script. */
public static KeyboardData modify_pinentry(KeyboardData kw, KeyboardData main_kw)
{
KeyboardData.MapKeyValues m = numpad_script_map(main_kw.numpad_script);
return m == null ? kw : kw.mapKeys(m);
}
/** Modify the number row according to [main_kw]'s script. */
static KeyboardData.Row modify_number_row(KeyboardData.Row row,
KeyboardData main_kw)
{
KeyboardData.MapKeyValues m = numpad_script_map(main_kw.numpad_script);
return m == null ? row : row.mapKeys(m);
}
static KeyboardData.MapKeyValues numpad_script_map(String numpad_script)
{
final int map_digit = KeyModifier.modify_numpad_script(numpad_script);
if (map_digit == -1)
return null;
return new KeyboardData.MapKeyValues() {
public KeyValue apply(KeyValue key, boolean localized)
{
KeyValue modified = ComposeKey.apply(map_digit, key);
return (modified != null) ? modified : key;
}
};
}
/** Modify keys on the main layout and on the numpad according to the config.
*/
static KeyValue modify_key(KeyValue orig)
{
switch (orig.getKind())
{
case Event:
switch (orig.getEvent())
{
case CHANGE_METHOD_PICKER:
if (globalConfig.switch_input_immediate)
return KeyValue.getKeyByName("change_method_prev");
break;
case ACTION:
if (globalConfig.actionLabel == null)
return null; // Remove the action key
if (globalConfig.swapEnterActionKey)
return KeyValue.getKeyByName("enter");
return KeyValue.makeActionKey(globalConfig.actionLabel);
case SWITCH_FORWARD:
return (globalConfig.layouts.size() > 1) ? orig : null;
case SWITCH_BACKWARD:
return (globalConfig.layouts.size() > 2) ? orig : null;
case SWITCH_VOICE_TYPING:
case SWITCH_VOICE_TYPING_CHOOSER:
return globalConfig.shouldOfferVoiceTyping ? orig : null;
}
break;
case Keyevent:
switch (orig.getKeyevent())
{
case KeyEvent.KEYCODE_ENTER:
if (globalConfig.swapEnterActionKey && globalConfig.actionLabel != null)
return KeyValue.makeActionKey(globalConfig.actionLabel);
break;
}
break;
}
return orig;
}
static char inverse_numpad_char(char c)
{
switch (c)
{
case '7': return '1';
case '8': return '2';
case '9': return '3';
case '1': return '7';
case '2': return '8';
case '3': return '9';
default: return c;
}
}
public static void init(Config globalConfig_, Resources res)
{
globalConfig = globalConfig_;
try
{
number_row_no_symbols = KeyboardData.load_row(res, R.xml.number_row_no_symbols);
number_row_symbols = KeyboardData.load_row(res, R.xml.number_row);
bottom_row = KeyboardData.load_row(res, R.xml.bottom_row);
num_pad = KeyboardData.load_num_pad(res);
}
catch (Exception e)
{
throw new RuntimeException(e.getMessage()); // Not recoverable
}
}
}

View File

@@ -1,33 +0,0 @@
package juloo.keyboard2;
import java.lang.reflect.Array;
import java.util.Map;
import java.util.TreeMap;
/** Stores key combinations that are applied by [KeyModifier]. */
public final class Modmap
{
public enum M { Shift, Fn, Ctrl }
Map<KeyValue, KeyValue>[] _map;
public Modmap()
{
_map = (Map<KeyValue, KeyValue>[])Array.newInstance(TreeMap.class,
M.values().length);
}
public void add(M m, KeyValue a, KeyValue b)
{
int i = m.ordinal();
if (_map[i] == null)
_map[i] = new TreeMap<KeyValue, KeyValue>();
_map[i].put(a, b);
}
public KeyValue get(M m, KeyValue a)
{
Map<KeyValue, KeyValue> mm = _map[m.ordinal()];
return (mm == null) ? null : mm.get(a);
}
}

View File

@@ -1,17 +0,0 @@
package juloo.keyboard2;
public enum NumberLayout {
PIN,
NUMBER,
NORMAL;
public static NumberLayout of_string(String name)
{
switch (name)
{
case "number": return NUMBER;
case "normal": return NORMAL;
case "pin": default: return PIN;
}
}
}

View File

@@ -16,7 +16,7 @@ public final class Pointers implements Handler.Callback
public static final int FLAG_P_LATCHABLE = 1; public static final int FLAG_P_LATCHABLE = 1;
public static final int FLAG_P_LATCHED = (1 << 1); public static final int FLAG_P_LATCHED = (1 << 1);
public static final int FLAG_P_FAKE = (1 << 2); public static final int FLAG_P_FAKE = (1 << 2);
public static final int FLAG_P_DOUBLE_TAP_LOCK = (1 << 3); public static final int FLAG_P_LOCKABLE = (1 << 3);
public static final int FLAG_P_LOCKED = (1 << 4); public static final int FLAG_P_LOCKED = (1 << 4);
public static final int FLAG_P_SLIDING = (1 << 5); public static final int FLAG_P_SLIDING = (1 << 5);
/** Clear latched (only if also FLAG_P_LATCHABLE set). */ /** Clear latched (only if also FLAG_P_LATCHABLE set). */
@@ -86,10 +86,10 @@ public final class Pointers implements Handler.Callback
/** The key must not be already latched . */ /** The key must not be already latched . */
void add_fake_pointer(KeyboardData.Key key, KeyValue kv, boolean locked) void add_fake_pointer(KeyboardData.Key key, KeyValue kv, boolean locked)
{ {
int flags = pointer_flags_of_kv(kv) | FLAG_P_FAKE | FLAG_P_LATCHED; Pointer ptr = new Pointer(-1, key, kv, 0.f, 0.f, Modifiers.EMPTY);
ptr.flags = FLAG_P_FAKE | FLAG_P_LATCHED;
if (locked) if (locked)
flags |= FLAG_P_LOCKED; ptr.flags |= FLAG_P_LOCKED;
Pointer ptr = new Pointer(-1, key, kv, 0.f, 0.f, Modifiers.EMPTY, flags);
_ptrs.add(ptr); _ptrs.add(ptr);
_handler.onPointerFlagsChanged(false); _handler.onPointerFlagsChanged(false);
} }
@@ -108,10 +108,7 @@ public final class Pointers implements Handler.Callback
{ {
// No existing pointer, latch the key. // No existing pointer, latch the key.
if (latched) if (latched)
{
add_fake_pointer(key, kv, lock); add_fake_pointer(key, kv, lock);
_handler.onPointerFlagsChanged(false);
}
} }
else if ((ptr.flags & FLAG_P_FAKE) == 0) else if ((ptr.flags & FLAG_P_FAKE) == 0)
{} // Key already latched but not by a fake ptr, do nothing. {} // Key already latched but not by a fake ptr, do nothing.
@@ -121,7 +118,6 @@ public final class Pointers implements Handler.Callback
removePtr(ptr); removePtr(ptr);
if (latched) if (latched)
add_fake_pointer(key, kv, lock); add_fake_pointer(key, kv, lock);
_handler.onPointerFlagsChanged(false);
} }
else if ((ptr.flags & FLAG_P_LOCKED) != 0) else if ((ptr.flags & FLAG_P_LOCKED) != 0)
{} // Existing ptr is locked but [lock] is false, do not continue. {} // Existing ptr is locked but [lock] is false, do not continue.
@@ -157,8 +153,7 @@ public final class Pointers implements Handler.Callback
if (latched != null) // Already latched if (latched != null) // Already latched
{ {
removePtr(ptr); // Remove dupplicate removePtr(ptr); // Remove dupplicate
// Toggle lockable key, except if it's a fake pointer if ((latched.flags & FLAG_P_LOCKABLE) != 0) // Toggle lockable key
if ((latched.flags & (FLAG_P_FAKE | FLAG_P_DOUBLE_TAP_LOCK)) == FLAG_P_DOUBLE_TAP_LOCK)
lockPointer(latched, false); lockPointer(latched, false);
else // Otherwise, unlatch else // Otherwise, unlatch
{ {
@@ -209,7 +204,7 @@ public final class Pointers implements Handler.Callback
// The other key already "own" the latched modifiers and will clear them. // The other key already "own" the latched modifiers and will clear them.
Modifiers mods = getModifiers(isOtherPointerDown()); Modifiers mods = getModifiers(isOtherPointerDown());
KeyValue value = _handler.modifyKey(key.keys[0], mods); KeyValue value = _handler.modifyKey(key.keys[0], mods);
Pointer ptr = make_pointer(pointerId, key, value, x, y, mods); Pointer ptr = new Pointer(pointerId, key, value, x, y, mods);
_ptrs.add(ptr); _ptrs.add(ptr);
startLongPress(ptr); startLongPress(ptr);
_handler.onPointerDown(value, false); _handler.onPointerDown(value, false);
@@ -223,7 +218,7 @@ public final class Pointers implements Handler.Callback
* [direction] is an int between [0] and [15] that represent 16 sections of a * [direction] is an int between [0] and [15] that represent 16 sections of a
* circle, clockwise, starting at the top. * circle, clockwise, starting at the top.
*/ */
static KeyValue getKeyAtDirection(KeyboardData.Key k, int direction) KeyValue getKeyAtDirection(KeyboardData.Key k, int direction)
{ {
return k.keys[DIRECTION_TO_INDEX[direction]]; return k.keys[DIRECTION_TO_INDEX[direction]];
} }
@@ -238,8 +233,7 @@ public final class Pointers implements Handler.Callback
private KeyValue getNearestKeyAtDirection(Pointer ptr, int direction) private KeyValue getNearestKeyAtDirection(Pointer ptr, int direction)
{ {
KeyValue k; KeyValue k;
// [i] is [0, -1, +1, ..., -3, +3], scanning 43% of the circle's area, // [i] is [0, -1, 1, -2, 2, ...]
// centered on the initial swipe direction.
for (int i = 0; i > -4; i = (~i>>31) - i) for (int i = 0; i > -4; i = (~i>>31) - i)
{ {
int d = (direction + i + 16) % 16; int d = (direction + i + 16) % 16;
@@ -247,15 +241,7 @@ public final class Pointers implements Handler.Callback
// that is removed by [_handler]. Triggers side effects. // that is removed by [_handler]. Triggers side effects.
k = _handler.modifyKey(getKeyAtDirection(ptr.key, d), ptr.modifiers); k = _handler.modifyKey(getKeyAtDirection(ptr.key, d), ptr.modifiers);
if (k != null) if (k != null)
{
// When the nearest key is a slider, it is only selected if it's placed
// within 18% of the original swipe direction.
// This reduces accidental swipes on the slider and allow typing circle
// gestures without being interrupted by the slider.
if (k.getKind() == KeyValue.Kind.Slider && Math.abs(i) >= 2)
continue;
return k; return k;
}
} }
return null; return null;
} }
@@ -267,7 +253,7 @@ public final class Pointers implements Handler.Callback
return; return;
if (ptr.hasFlagsAny(FLAG_P_SLIDING)) if (ptr.hasFlagsAny(FLAG_P_SLIDING))
{ {
ptr.sliding.onTouchMove(ptr, x, y); ptr.sliding.onTouchMove(ptr, x);
return; return;
} }
@@ -307,9 +293,13 @@ public final class Pointers implements Handler.Callback
ptr.value = new_value; ptr.value = new_value;
ptr.flags = pointer_flags_of_kv(new_value); ptr.flags = pointer_flags_of_kv(new_value);
// Start sliding mode // Sliding mode is entered when key5 or key6 is down on a slider key.
if (new_value.getKind() == KeyValue.Kind.Slider) if (ptr.key.slider &&
startSliding(ptr, x, y, dx, dy, new_value); (new_value.equals(ptr.key.getKeyValue(5))
|| new_value.equals(ptr.key.getKeyValue(6))))
{
startSliding(ptr, x);
}
_handler.onPointerDown(new_value, true); _handler.onPointerDown(new_value, true);
} }
@@ -325,7 +315,6 @@ public final class Pointers implements Handler.Callback
ptr.value = apply_gesture(ptr, ptr.gesture.get_gesture()); ptr.value = apply_gesture(ptr, ptr.gesture.get_gesture());
restartLongPress(ptr); restartLongPress(ptr);
ptr.flags = 0; // Special behaviors are ignored during a gesture. ptr.flags = 0; // Special behaviors are ignored during a gesture.
_handler.onPointerFlagsChanged(true); // Vibrate
} }
} }
} }
@@ -379,7 +368,7 @@ public final class Pointers implements Handler.Callback
/** Make a pointer into the locked state. */ /** Make a pointer into the locked state. */
private void lockPointer(Pointer ptr, boolean shouldVibrate) private void lockPointer(Pointer ptr, boolean shouldVibrate)
{ {
ptr.flags = (ptr.flags & ~FLAG_P_DOUBLE_TAP_LOCK) | FLAG_P_LOCKED; ptr.flags = (ptr.flags & ~FLAG_P_LOCKABLE) | FLAG_P_LOCKED;
_handler.onPointerFlagsChanged(shouldVibrate); _handler.onPointerFlagsChanged(shouldVibrate);
} }
@@ -463,20 +452,15 @@ public final class Pointers implements Handler.Callback
// Sliding // Sliding
/** When sliding is ongoing, key events are handled by the [Slider] class. void startSliding(Pointer ptr, float x)
[kv] must be of kind [Slider]. */
void startSliding(Pointer ptr, float x, float y, float dx, float dy, KeyValue kv)
{ {
int r = kv.getSliderRepeat();
int dirx = dx < 0 ? -r : r;
int diry = dy < 0 ? -r : r;
stopLongPress(ptr); stopLongPress(ptr);
ptr.flags |= FLAG_P_SLIDING; ptr.flags |= FLAG_P_SLIDING;
ptr.sliding = new Sliding(x, y, dirx, diry, kv.getSlider()); ptr.sliding = new Sliding(x);
} }
/** Return the [FLAG_P_*] flags that correspond to pressing [kv]. */ /** Return the [FLAG_P_*] flags that correspond to pressing [kv]. */
int pointer_flags_of_kv(KeyValue kv) static int pointer_flags_of_kv(KeyValue kv)
{ {
int flags = 0; int flags = 0;
if (kv.hasFlagsAny(KeyValue.FLAG_LATCH)) if (kv.hasFlagsAny(KeyValue.FLAG_LATCH))
@@ -486,9 +470,8 @@ public final class Pointers implements Handler.Callback
flags |= FLAG_P_CLEAR_LATCHED | FLAG_P_CANT_LOCK; flags |= FLAG_P_CLEAR_LATCHED | FLAG_P_CANT_LOCK;
flags |= FLAG_P_LATCHABLE; flags |= FLAG_P_LATCHABLE;
} }
if (_config.double_tap_lock_shift && if (kv.hasFlagsAny(KeyValue.FLAG_LOCK))
kv.hasFlagsAny(KeyValue.FLAG_DOUBLE_TAP_LOCK)) flags |= FLAG_P_LOCKABLE;
flags |= FLAG_P_DOUBLE_TAP_LOCK;
return flags; return flags;
} }
@@ -529,13 +512,6 @@ public final class Pointers implements Handler.Callback
// Pointers // Pointers
Pointer make_pointer(int p, KeyboardData.Key k, KeyValue v, float x, float y,
Modifiers m)
{
int flags = (v == null) ? 0 : pointer_flags_of_kv(v);
return new Pointer(p, k, v, x, y, m, flags);
}
private static final class Pointer private static final class Pointer
{ {
/** -1 when latched. */ /** -1 when latched. */
@@ -557,7 +533,7 @@ public final class Pointers implements Handler.Callback
/** [null] when not in sliding mode. */ /** [null] when not in sliding mode. */
public Sliding sliding; public Sliding sliding;
public Pointer(int p, KeyboardData.Key k, KeyValue v, float x, float y, Modifiers m, int f) public Pointer(int p, KeyboardData.Key k, KeyValue v, float x, float y, Modifiers m)
{ {
pointerId = p; pointerId = p;
key = k; key = k;
@@ -566,7 +542,7 @@ public final class Pointers implements Handler.Callback
downX = x; downX = x;
downY = y; downY = y;
modifiers = m; modifiers = m;
flags = f; flags = (v == null) ? 0 : pointer_flags_of_kv(v);
timeoutWhat = -1; timeoutWhat = -1;
sliding = null; sliding = null;
} }
@@ -582,60 +558,34 @@ public final class Pointers implements Handler.Callback
/** Accumulated distance since last event. */ /** Accumulated distance since last event. */
float d = 0.f; float d = 0.f;
/** The slider speed changes depending on the pointer speed. */ /** The slider speed changes depending on the pointer speed. */
float speed = 0.5f; float speed = 1.f;
/** Coordinate of the last move. */ /** Coordinate of the last move. */
float last_x; float last_x;
float last_y; /** [System.currentTimeMillis()] at the time of the last move. */
/** [System.currentTimeMillis()] at the time of the last move. Equals to long last_move_ms;
[-1] when the sliding hasn't started yet. */
long last_move_ms = -1;
/** The property which is being slided. */
KeyValue.Slider slider;
/** Direction of the initial movement, positive if sliding to the right and
negative if sliding to the left. */
int direction_x;
int direction_y;
public Sliding(float x, float y, int dirx, int diry, KeyValue.Slider s) public Sliding(float x)
{ {
last_x = x; last_x = x;
last_y = y; last_move_ms = System.currentTimeMillis();
slider = s;
direction_x = dirx;
direction_y = diry;
} }
static final float SPEED_SMOOTHING = 0.7f; static final float SPEED_SMOOTHING = 0.7f;
/** Avoid absurdly large values. */ /** Avoid absurdly large values. */
static final float SPEED_MAX = 4.f; static final float SPEED_MAX = 4.f;
/** Make vertical sliders slower. The intention is to make the up/down
slider slower, as we have less visibility and do smaller movements in
that direction. */
static final float SPEED_VERTICAL_MULT = 0.5f;
public void onTouchMove(Pointer ptr, float x, float y) public void onTouchMove(Pointer ptr, float x)
{ {
// Start sliding only after the pointer has travelled an other distance. d += (x - last_x) * speed / _config.slide_step_px;
// This allows to trigger the slider movements only once with a short update_speed(x);
// swipe.
float travelled = Math.abs(x - last_x) + Math.abs(y - last_y);
if (last_move_ms == -1)
{
if (travelled < (_config.swipe_dist_px + _config.slide_step_px))
return;
last_move_ms = System.currentTimeMillis();
}
d += ((x - last_x) * speed * direction_x
+ (y - last_y) * speed * SPEED_VERTICAL_MULT * direction_y)
/ _config.slide_step_px;
update_speed(travelled, x, y);
// Send an event when [abs(d)] exceeds [1]. // Send an event when [abs(d)] exceeds [1].
int d_ = (int)d; int d_ = (int)d;
if (d_ != 0) if (d_ != 0)
{ {
d -= d_; d -= d_;
_handler.onPointerHold(KeyValue.sliderKey(slider, d_), int key_index = (d_ < 0) ? 5 : 6;
ptr.modifiers); ptr.value = _handler.modifyKey(ptr.key.keys[key_index], ptr.modifiers);
send_key(ptr, Math.abs(d_));
} }
} }
@@ -648,18 +598,43 @@ public final class Pointers implements Handler.Callback
_handler.onPointerFlagsChanged(false); _handler.onPointerFlagsChanged(false);
} }
/** Send the pressed key [n] times. */
void send_key(Pointer ptr, int n)
{
if (ptr.value == null)
return;
// Avoid looping if possible to avoid lag while sliding fast
KeyValue multiplied = multiply_key(ptr.value, n);
if (multiplied != null)
_handler.onPointerHold(multiplied, ptr.modifiers);
else
for (int i = 0; i < n; i++)
_handler.onPointerHold(ptr.value, ptr.modifiers);
}
/** Return a key performing the same action as [kv] but [n] times. Returns
[null] if [kv] cannot be multiplied. */
KeyValue multiply_key(KeyValue kv, int n)
{
switch (kv.getKind())
{
case Cursor_move:
return KeyValue.cursorMoveKey(kv.getCursorMove() * n);
}
return null;
}
/** [speed] is computed from the elapsed time and distance traveled /** [speed] is computed from the elapsed time and distance traveled
between two move events. Exponential smoothing is used to smooth out between two move events. Exponential smoothing is used to smooth out
the noise. Sets [last_move_ms] and [last_pos]. */ the noise. Sets [last_move_ms] and [last_x]. */
void update_speed(float travelled, float x, float y) void update_speed(float x)
{ {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
float instant_speed = Math.min(SPEED_MAX, float instant_speed = Math.min(SPEED_MAX,
travelled / (float)(now - last_move_ms) + 1.f); Math.abs(x - last_x) / (float)(now - last_move_ms) + 1.f);
speed = speed + (instant_speed - speed) * SPEED_SMOOTHING; speed = speed + (instant_speed - speed) * SPEED_SMOOTHING;
last_move_ms = now; last_move_ms = now;
last_x = x; last_x = x;
last_y = y;
} }
} }

View File

@@ -23,14 +23,6 @@ public class SettingsActivity extends PreferenceActivity
} }
catch (Exception _e) { fallbackEncrypted(); return; } catch (Exception _e) { fallbackEncrypted(); return; }
addPreferencesFromResource(R.xml.settings); addPreferencesFromResource(R.xml.settings);
boolean foldableDevice = FoldStateTracker.isFoldableDevice(this);
findPreference("margin_bottom_portrait_unfolded").setEnabled(foldableDevice);
findPreference("margin_bottom_landscape_unfolded").setEnabled(foldableDevice);
findPreference("horizontal_margin_portrait_unfolded").setEnabled(foldableDevice);
findPreference("horizontal_margin_landscape_unfolded").setEnabled(foldableDevice);
findPreference("keyboard_height_unfolded").setEnabled(foldableDevice);
findPreference("keyboard_height_landscape_unfolded").setEnabled(foldableDevice);
} }
void fallbackEncrypted() void fallbackEncrypted()

View File

@@ -9,11 +9,9 @@ import android.util.AttributeSet;
public class Theme public class Theme
{ {
// Key colors public final Paint keyBgPaint = new Paint();
public final int colorKey; public final Paint keyDownBgPaint = new Paint();
public final int colorKeyActivated; public final Paint keyBorderPaint = new Paint();
// Label colors
public final int lockedColor; public final int lockedColor;
public final int activatedColor; public final int activatedColor;
public final int labelColor; public final int labelColor;
@@ -21,7 +19,6 @@ public class Theme
public final int secondaryLabelColor; public final int secondaryLabelColor;
public final int greyedLabelColor; public final int greyedLabelColor;
// Key borders
public final float keyBorderRadius; public final float keyBorderRadius;
public final float keyBorderWidth; public final float keyBorderWidth;
public final float keyBorderWidthActivated; public final float keyBorderWidthActivated;
@@ -33,12 +30,19 @@ public class Theme
public final int colorNavBar; public final int colorNavBar;
public final boolean isLightNavBar; public final boolean isLightNavBar;
private final Paint _keyLabelPaint;
private final Paint _specialKeyLabelPaint;
private final Paint _keySubLabelPaint;
private final Paint _specialKeySubLabelPaint;
private final Paint _indicationPaint;
private final Paint _specialIndicationPaint;
public Theme(Context context, AttributeSet attrs) public Theme(Context context, AttributeSet attrs)
{ {
getKeyFont(context); // _key_font will be accessed
TypedArray s = context.getTheme().obtainStyledAttributes(attrs, R.styleable.keyboard, 0, 0); TypedArray s = context.getTheme().obtainStyledAttributes(attrs, R.styleable.keyboard, 0, 0);
colorKey = s.getColor(R.styleable.keyboard_colorKey, 0); int colorKey = s.getColor(R.styleable.keyboard_colorKey, 0);
colorKeyActivated = s.getColor(R.styleable.keyboard_colorKeyActivated, 0); keyBgPaint.setColor(colorKey);
keyDownBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKeyActivated, 0));
// colorKeyboard = s.getColor(R.styleable.keyboard_colorKeyboard, 0); // colorKeyboard = s.getColor(R.styleable.keyboard_colorKeyboard, 0);
colorNavBar = s.getColor(R.styleable.keyboard_navigationBarColor, 0); colorNavBar = s.getColor(R.styleable.keyboard_navigationBarColor, 0);
isLightNavBar = s.getBoolean(R.styleable.keyboard_windowLightNavigationBar, false); isLightNavBar = s.getBoolean(R.styleable.keyboard_windowLightNavigationBar, false);
@@ -53,11 +57,37 @@ public class Theme
keyBorderRadius = s.getDimension(R.styleable.keyboard_keyBorderRadius, 0); keyBorderRadius = s.getDimension(R.styleable.keyboard_keyBorderRadius, 0);
keyBorderWidth = s.getDimension(R.styleable.keyboard_keyBorderWidth, 0); keyBorderWidth = s.getDimension(R.styleable.keyboard_keyBorderWidth, 0);
keyBorderWidthActivated = s.getDimension(R.styleable.keyboard_keyBorderWidthActivated, 0); keyBorderWidthActivated = s.getDimension(R.styleable.keyboard_keyBorderWidthActivated, 0);
keyBorderPaint.setStyle(Paint.Style.STROKE);
keyBorderColorLeft = s.getColor(R.styleable.keyboard_keyBorderColorLeft, colorKey); keyBorderColorLeft = s.getColor(R.styleable.keyboard_keyBorderColorLeft, colorKey);
keyBorderColorTop = s.getColor(R.styleable.keyboard_keyBorderColorTop, colorKey); keyBorderColorTop = s.getColor(R.styleable.keyboard_keyBorderColorTop, colorKey);
keyBorderColorRight = s.getColor(R.styleable.keyboard_keyBorderColorRight, colorKey); keyBorderColorRight = s.getColor(R.styleable.keyboard_keyBorderColorRight, colorKey);
keyBorderColorBottom = s.getColor(R.styleable.keyboard_keyBorderColorBottom, colorKey); keyBorderColorBottom = s.getColor(R.styleable.keyboard_keyBorderColorBottom, colorKey);
s.recycle(); s.recycle();
_keyLabelPaint = initLabelPaint(Paint.Align.CENTER, null);
_keySubLabelPaint = initLabelPaint(Paint.Align.LEFT, null);
Typeface specialKeyFont = getKeyFont(context);
_specialKeyLabelPaint = initLabelPaint(Paint.Align.CENTER, specialKeyFont);
_specialKeySubLabelPaint = initLabelPaint(Paint.Align.LEFT, specialKeyFont);
_indicationPaint = initLabelPaint(Paint.Align.CENTER, null);
_specialIndicationPaint = initLabelPaint(Paint.Align.CENTER, specialKeyFont);
}
public Paint labelPaint(boolean special_font)
{
Paint p = special_font ? _specialKeyLabelPaint : _keyLabelPaint;
return p;
}
public Paint subLabelPaint(boolean special_font, Paint.Align align)
{
Paint p = special_font ? _specialKeySubLabelPaint : _keySubLabelPaint;
p.setTextAlign(align);
return p;
}
public Paint indicationPaint(boolean special_font)
{
return special_font ? _specialIndicationPaint : _indicationPaint;
} }
/** Interpolate the 'value' component toward its opposite by 'alpha'. */ /** Interpolate the 'value' component toward its opposite by 'alpha'. */
@@ -70,7 +100,7 @@ public class Theme
return Color.HSVToColor(hsv); return Color.HSVToColor(hsv);
} }
Paint initIndicationPaint(Paint.Align align, Typeface font) Paint initLabelPaint(Paint.Align align, Typeface font)
{ {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextAlign(align); paint.setTextAlign(align);
@@ -87,116 +117,4 @@ public class Theme
_key_font = Typeface.createFromAsset(context.getAssets(), "special_font.ttf"); _key_font = Typeface.createFromAsset(context.getAssets(), "special_font.ttf");
return _key_font; return _key_font;
} }
public static final class Computed
{
public final float vertical_margin;
public final float horizontal_margin;
public final float margin_top;
public final float margin_left;
public final float row_height;
public final Paint indication_paint;
public final Key key;
public final Key key_activated;
public Computed(Theme theme, Config config, float keyWidth, KeyboardData layout)
{
// Rows height is proportional to the keyboard height, meaning it doesn't
// change for layouts with more or less rows. 3.95 is the usual height of
// a layout in KeyboardData unit. The keyboard will be higher if the
// layout has more rows and smaller if it has less because rows stay the
// same height.
row_height = Math.min(
config.screenHeightPixels * config.keyboardHeightPercent / 100 / 3.95f,
config.screenHeightPixels / layout.keysHeight);
vertical_margin = config.key_vertical_margin * row_height;
horizontal_margin = config.key_horizontal_margin * keyWidth;
// Add half of the key margin on the left and on the top as it's also
// added on the right and on the bottom of every keys.
margin_top = config.marginTop + vertical_margin / 2;
margin_left = horizontal_margin / 2;
key = new Key(theme, config, keyWidth, false);
key_activated = new Key(theme, config, keyWidth, true);
indication_paint = init_label_paint(config, null);
indication_paint.setColor(theme.subLabelColor);
}
public static final class Key
{
public final Paint bg_paint = new Paint();
public final Paint border_left_paint;
public final Paint border_top_paint;
public final Paint border_right_paint;
public final Paint border_bottom_paint;
public final float border_width;
public final float border_radius;
final Paint _label_paint;
final Paint _special_label_paint;
final Paint _sublabel_paint;
final Paint _special_sublabel_paint;
final int _label_alpha_bits;
public Key(Theme theme, Config config, float keyWidth, boolean activated)
{
bg_paint.setColor(activated ? theme.colorKeyActivated : theme.colorKey);
if (config.borderConfig)
{
border_radius = config.customBorderRadius * keyWidth;
border_width = config.customBorderLineWidth;
}
else
{
border_radius = theme.keyBorderRadius;
border_width = activated ? theme.keyBorderWidthActivated : theme.keyBorderWidth;
}
bg_paint.setAlpha(activated ? config.keyActivatedOpacity : config.keyOpacity);
border_left_paint = init_border_paint(config, border_width, theme.keyBorderColorLeft);
border_top_paint = init_border_paint(config, border_width, theme.keyBorderColorTop);
border_right_paint = init_border_paint(config, border_width, theme.keyBorderColorRight);
border_bottom_paint = init_border_paint(config, border_width, theme.keyBorderColorBottom);
_label_paint = init_label_paint(config, null);
_special_label_paint = init_label_paint(config, _key_font);
_sublabel_paint = init_label_paint(config, null);
_special_sublabel_paint = init_label_paint(config, _key_font);
_label_alpha_bits = (config.labelBrightness & 0xFF) << 24;
}
public Paint label_paint(boolean special_font, int color, float text_size)
{
Paint p = special_font ? _special_label_paint : _label_paint;
p.setColor((color & 0x00FFFFFF) | _label_alpha_bits);
p.setTextSize(text_size);
return p;
}
public Paint sublabel_paint(boolean special_font, int color, float text_size, Paint.Align align)
{
Paint p = special_font ? _special_sublabel_paint : _sublabel_paint;
p.setColor((color & 0x00FFFFFF) | _label_alpha_bits);
p.setTextSize(text_size);
p.setTextAlign(align);
return p;
}
}
static Paint init_border_paint(Config config, float border_width, int color)
{
Paint p = new Paint();
p.setAlpha(config.keyOpacity);
p.setStyle(Paint.Style.STROKE);
p.setStrokeWidth(border_width);
p.setColor(color);
return p;
}
static Paint init_label_paint(Config config, Typeface font)
{
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setTextAlign(Paint.Align.CENTER);
if (font != null)
p.setTypeface(font);
return p;
}
}
} }

View File

@@ -49,4 +49,14 @@ public final class Utils
out.append(buff, 0, l); out.append(buff, 0, l);
return out.toString(); return out.toString();
} }
/** Whether the thin gesture-navigation bar is used.
https://stackoverflow.com/questions/36514167/how-to-really-get-the-navigation-bar-height-in-android
*/
public static boolean is_navigation_bar_gestural(Resources res)
{
// core/java/android/view/WindowManagerPolicyConstants.java
int res_id = res.getIdentifier("config_navBarInteractionMode", "integer", "android");
return (res_id > 0 && res.getInteger(res_id) == 2);
}
} }

Some files were not shown because too many files have changed in this diff Show More