mirror of
https://github.com/Julow/Unexpected-Keyboard.git
synced 2025-08-18 07:30:24 +02:00
Compare commits
61 Commits
manifest-s
...
korean-nor
Author | SHA1 | Date | |
---|---|---|---|
|
3cb92fce84 | ||
|
1cbaa7106c | ||
|
fe0f82436a | ||
|
5c19140609 | ||
|
47e2009da4 | ||
|
b33bcd8865 | ||
|
c41a098924 | ||
|
8cd868ba76 | ||
|
07f9c1ffaa | ||
|
9a07149efc | ||
|
0594127575 | ||
|
a9f9bbec19 | ||
|
35d1ebeab5 | ||
|
0739c6bd2c | ||
|
a1de69bcc4 | ||
|
5e5937b0f4 | ||
|
ce38a4f151 | ||
|
0e0c761a92 | ||
|
940cf0deb8 | ||
|
c2d5b14261 | ||
|
ebda7b2c3e | ||
|
39f6d294fb | ||
|
8b5d971fb5 | ||
|
8c7559d8f6 | ||
|
d7e5040873 | ||
|
b29a344cd0 | ||
|
b8e673b614 | ||
|
bae82d6ed8 | ||
|
f913051dca | ||
|
dac702ad0b | ||
|
f2f6ef0627 | ||
|
6389d58553 | ||
|
e40558677e | ||
|
ae270b36f4 | ||
|
146d520325 | ||
|
065d9520e5 | ||
|
bb60ed9b13 | ||
|
d56e4d129e | ||
|
e9f734b6cc | ||
|
63e7ac2e94 | ||
|
8c29073260 | ||
|
38deb810f9 | ||
|
d8beda411d | ||
|
d96577963e | ||
|
f369b5d90b | ||
|
f4d88cc087 | ||
|
d5676d683f | ||
|
332413ed3c | ||
|
93d8af4505 | ||
|
f74e5a9f73 | ||
|
6513c21144 | ||
|
79aec5b9bc | ||
|
be053b082c | ||
|
5ce89d1b4b | ||
|
82a9774f5a | ||
|
5d1a503210 | ||
|
d1aa59768d | ||
|
2c52e94e0b | ||
|
3adf95a4c9 | ||
|
44f39059e4 | ||
|
bbc6226839 |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
||||
srcs/juloo.keyboard2/ComposeKeyData.java -diff
|
19
.github/workflows/check-layouts.yml
vendored
19
.github/workflows/check-layouts.yml
vendored
@@ -1,19 +1,26 @@
|
||||
name: Check layouts
|
||||
|
||||
# Runs 'gen_layouts.py' and checks that the generated file were uptodate.
|
||||
# This doesn't run 'check_layout.py'.
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
check-layouts:
|
||||
gen-layouts:
|
||||
name: Generated files
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- run: python3 gen_layouts.py
|
||||
- name: Check that the generated layouts.xml is uptodate, run python3 gen_layouts.py otherwise
|
||||
- name: "Check that the generated 'layouts.xml' is uptodate, otherwise run 'python3 gen_layouts.py'"
|
||||
run: git diff --exit-code
|
||||
check-layouts:
|
||||
name: check_layout.output
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v4
|
||||
- run: python3 check_layout.py
|
||||
- name: "Check that the generated 'check_layout.output' is uptodate, otherwise run 'python3 check_layout.py'"
|
||||
run: git diff --exit-code
|
||||
|
6
.github/workflows/check-translations.yml
vendored
6
.github/workflows/check-translations.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- run: python3 sync_translations.py
|
||||
- name: Check that strings files are uptodate, run python3 sync_translations.py otherwise
|
||||
run: git diff --exit-code
|
||||
- name: "Check that strings files are uptodate, otherwise run 'python3 sync_translations.py'"
|
||||
run: git add -N . && git diff --exit-code
|
||||
|
11
.github/workflows/make-apk.yml
vendored
11
.github/workflows/make-apk.yml
vendored
@@ -9,17 +9,18 @@ jobs:
|
||||
Build-Apk:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-java@v3
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'zulu' # See 'Supported distributions' for available options
|
||||
java-version: '17'
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: Restore debug keystore from GitHub Secrets
|
||||
run: |
|
||||
# Check if exist and use the secret named DEBUG_KEYSTORE
|
||||
# The contents of the secret can be obtained -
|
||||
# from the debug.keystore.asc from you local folder (refer to CONTRIBUTING.md#Using the local debug.keystore on the Github CI actions)
|
||||
# from the debug.keystore.asc from you local folder
|
||||
# (refer to CONTRIBUTING.md Using the local debug.keystore on the Github CI actions)
|
||||
if [[ ! "${{ secrets.DEBUG_KEYSTORE }}" = "" ]]; then
|
||||
echo "${{ secrets.DEBUG_KEYSTORE }}" > "debug.keystore.asc"
|
||||
if [[ -s "debug.keystore.asc" ]]; then
|
||||
@@ -28,7 +29,7 @@ jobs:
|
||||
fi
|
||||
fi
|
||||
- name: Build debug APK
|
||||
uses: gradle/gradle-build-action@v2
|
||||
uses: gradle/gradle-build-action@v3
|
||||
env:
|
||||
DEBUG_KEYSTORE: "debug.keystore"
|
||||
DEBUG_KEYSTORE_PASSWORD: debug0
|
||||
@@ -42,7 +43,7 @@ jobs:
|
||||
artifact="${artifact//\//-}" # replace slashes
|
||||
echo "artifact=${artifact}" >> $GITHUB_ENV
|
||||
- name: Upload debug APK
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: "${{env.artifact}} debug_apk"
|
||||
path: build/outputs/apk/debug/*.apk
|
||||
|
@@ -1,5 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:hardwareAccelerated="false">
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||
|
||||
<application android:label="@string/app_name" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:hardwareAccelerated="false">
|
||||
<service android:name="juloo.keyboard2.Keyboard2" android:label="@string/app_name" android:permission="android.permission.BIND_INPUT_METHOD" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
@@ -12,15 +15,13 @@
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="juloo.keyboard2.LauncherActivity" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/appTheme" android:exported="true" android:directBootAware="true">
|
||||
<activity android:name="juloo.keyboard2.LauncherActivity" android:icon="@mipmap/ic_launcher" android:theme="@style/appTheme" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||
|
||||
<!-- To query enabled input methods for voice IME detection -->
|
||||
<queries>
|
||||
|
@@ -110,6 +110,10 @@ Run `./gradlew checkKeyboardLayouts` to check some properties about your
|
||||
layout. This will change the file `check_layout.output`, which you should
|
||||
commit.
|
||||
|
||||
Layouts are CC0 licensed by default. If you do not want your layout to be
|
||||
released into the public domain, add a copyright notice at the top of the file
|
||||
and a mention in `srcs/layouts/LICENSE`.
|
||||
|
||||
#### Adding a programming layout
|
||||
|
||||
A programming layout must contain all ASCII characters.
|
||||
@@ -174,15 +178,13 @@ default translation in `res/values/strings.xml`, which contain the structure of
|
||||
the file and the English strings.
|
||||
|
||||
To check that `strings.xml` is formatted correctly, run
|
||||
`./gradlew syncTranslations`. This will modify your files.
|
||||
`python sync_translations.py`. This will modify your files.
|
||||
|
||||
The store description is found in `metadata/android/<locale>/`,
|
||||
`short_description.txt` and `full_description.txt`.
|
||||
The short description must not exceed 80 characters.
|
||||
Store descriptions in `metadata/` are updated automatically.
|
||||
Translating changelogs is not useful.
|
||||
|
||||
The app name might be partially translated, the "Unexpected" word should remain
|
||||
untranslated.
|
||||
untranslated if possible.
|
||||
|
||||
As translations need to be updated regularly, you can subscribe to this issue
|
||||
to receive a notification when an update is needed:
|
||||
|
3
FUNDING.yml
Normal file
3
FUNDING.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
github: [ Julow ]
|
||||
liberapay: Julow
|
||||
custom: [ "https://paypal.me/JulesAguillon" ]
|
@@ -18,6 +18,8 @@ Now perfect for everyday use.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source.
|
||||
|
||||
Usage: to apply the symbols located in the corners of each key, slide your finger in the direction of the symbols. For example, the Settings are opened by sliding in the left down corner.
|
||||
|
||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/1.png" alt="Screenshot-1" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/2.png" alt="Screenshot-2"/> | <img src="/metadata/android/en-US/images/phoneScreenshots/3.png" alt="Screenshot-3"/> |
|
||||
| --- | --- | --- |
|
||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
|
||||
|
Binary file not shown.
27
build.gradle
27
build.gradle
@@ -8,10 +8,10 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
applicationId "juloo.keyboard2"
|
||||
minSdk 4
|
||||
minSdk 11
|
||||
targetSdkVersion 33
|
||||
versionCode 37
|
||||
versionName "1.25.0"
|
||||
versionCode 39
|
||||
versionName "1.27.0"
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
@@ -77,10 +77,14 @@ android {
|
||||
sourceCompatibility JavaVersion.VERSION_1_7
|
||||
targetCompatibility JavaVersion.VERSION_1_7
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
// Translation are already checked by 'syncTranslations'
|
||||
disable 'MissingTranslation'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
}
|
||||
|
||||
tasks.register('buildKeyboardFont') {
|
||||
@@ -103,6 +107,7 @@ tasks.withType(Test).configureEach {
|
||||
dependsOn 'genLayoutsList'
|
||||
dependsOn 'checkKeyboardLayouts'
|
||||
dependsOn 'syncTranslations'
|
||||
dependsOn 'compileComposeSequences'
|
||||
}
|
||||
|
||||
tasks.register('genLayoutsList') {
|
||||
@@ -133,6 +138,19 @@ tasks.register('syncTranslations') {
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('compileComposeSequences') {
|
||||
def out = "srcs/juloo.keyboard2/ComposeKeyData.java"
|
||||
println "\nGenerating ${out}"
|
||||
exec {
|
||||
def sequences = new File(projectDir, "srcs/compose").listFiles().findAll {
|
||||
it.name.endsWith(".pre") || it.name.endsWith(".json")
|
||||
}
|
||||
workingDir = projectDir
|
||||
commandLine("python", "srcs/compose/compile.py", *sequences)
|
||||
standardOutput = new FileOutputStream("${projectDir}/${out}")
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named("preBuild") {
|
||||
dependsOn += "initDebugKeystore"
|
||||
dependsOn += "copyRawQwertyUS"
|
||||
@@ -162,6 +180,7 @@ tasks.register('copyLayoutDefinitions')
|
||||
{
|
||||
copy {
|
||||
from "srcs/layouts"
|
||||
include "*.xml"
|
||||
into "build/generated-resources/xml"
|
||||
}
|
||||
}
|
||||
|
@@ -2,6 +2,10 @@
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# arab_hamvaj_tly
|
||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], _, `, {, |, }
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# arab_pc
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
||||
1 warnings
|
||||
@@ -46,6 +50,10 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
||||
# grek_qwerty
|
||||
Duplicate keys: ;
|
||||
1 warnings
|
||||
# guj_phonetic_in
|
||||
Duplicate keys: ટ, ડ
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# hang_dubeolsik_kr
|
||||
0 warnings
|
||||
# hebr_1_il
|
||||
@@ -61,7 +69,7 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
||||
1 warnings
|
||||
# latn_bone
|
||||
Layout includes some ASCII punctuation but not all, missing: $
|
||||
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc end, loc home, loc page_down, loc page_up, loc switch_greekmath, loc voice_typing, switch_backward
|
||||
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_greekmath, loc voice_typing, switch_backward
|
||||
2 warnings
|
||||
# latn_colemak
|
||||
Some keys contain whitespaces, unexpected: ́
|
||||
@@ -69,8 +77,7 @@ Some keys contain whitespaces, unexpected: ́
|
||||
# latn_dvorak
|
||||
0 warnings
|
||||
# latn_neo2
|
||||
Layout redefines the bottom row but some important keys are missing, missing: loc end, loc home, loc page_down, loc page_up
|
||||
1 warnings
|
||||
0 warnings
|
||||
# latn_qwerty_br
|
||||
0 warnings
|
||||
# latn_qwerty_cz
|
||||
@@ -78,6 +85,8 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
||||
1 warnings
|
||||
# latn_qwerty_es
|
||||
0 warnings
|
||||
# latn_qwerty_gb
|
||||
0 warnings
|
||||
# latn_qwerty_hu
|
||||
0 warnings
|
||||
# latn_qwerty_lv
|
||||
@@ -91,6 +100,13 @@ Layout doesn't define some important keys, missing: f11_placeholder, f12_placeho
|
||||
# latn_qwerty_se
|
||||
Duplicate keys: !, ', ,, -, ., ?
|
||||
1 warnings
|
||||
# latn_qwerty_sk
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_qwerty_tly
|
||||
Duplicate keys: a, c, j, q
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
||||
2 warnings
|
||||
# latn_qwerty_tr
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
|
7
metadata/android/en-US/changelogs/38.txt
Normal file
7
metadata/android/en-US/changelogs/38.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
The custom vibration setting is back.
|
||||
Allow to hide the keyboard switching key.
|
||||
Fixed modifier keys in some development apps.
|
||||
Updated translations.
|
||||
Bug fixes and general improvements.
|
||||
|
||||
Many thanks to the contributors: @abb128, @marciozomb13, @RetrogisusDEV, @Sestowner, @vedamanavi, @krtsgnr7230
|
6
metadata/android/en-US/changelogs/39.txt
Normal file
6
metadata/android/en-US/changelogs/39.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
New layouts: QWERTY (Slovak), Gujarati phonetic
|
||||
Add Linux Compose key to type a variety of characters using known combinations.
|
||||
Fixed localized numpad and number row.
|
||||
Many improvements and bug fixes.
|
||||
|
||||
Huge thanks to the contributors: @Yogesh-B, @ChasmSolacer, @matthiakl, @Sestowner, @RyanGibb, @BogdanLata, @RetrogisusDEV, @V6lhost, @ErrrorMaxx, @sdrapha, @vedamanavi
|
@@ -3,4 +3,4 @@ La característica principal es que hay acceso a más caractéres deslizando hac
|
||||
Esta aplicación fue originalmente diseñada para programadores que usaran Termux.
|
||||
Ahora es perfecta para uso cotidiano.
|
||||
|
||||
La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta.
|
||||
La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta.
|
||||
|
1
metadata/android/pl-PL/title.txt
Normal file
1
metadata/android/pl-PL/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Unexpected Keyboard
|
1
metadata/android/ro/title.txt
Normal file
1
metadata/android/ro/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Unexpected Keyboard
|
1
metadata/android/tr-TR/title.txt
Normal file
1
metadata/android/tr-TR/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Unexpected Keyboard
|
6
metadata/android/uk/full_description.txt
Normal file
6
metadata/android/uk/full_description.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.
|
||||
|
||||
Ця програма спочатку була розроблена для програмістів, які використовують Termux.
|
||||
Тепер ідеально підходить для щоденного використання.
|
||||
|
||||
Ця програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код.
|
1
metadata/android/uk/short_description.txt
Normal file
1
metadata/android/uk/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Легка та конфіденційна віртуальна клавіатура для Android.
|
1
metadata/android/uk/title.txt
Normal file
1
metadata/android/uk/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Unexpected Keyboard
|
1
metadata/android/vi/title.txt
Normal file
1
metadata/android/vi/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Unexpected Keyboard
|
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<EditText android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dp"/>
|
||||
<EditText android:id="@+id/text" android:inputType="text" android:importantForAutofill="no" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dp"/>
|
||||
</LinearLayout>
|
||||
|
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true">
|
||||
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">
|
||||
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical">
|
||||
<TextView style="@style/paragraph" android:text="@string/launcher_description"/>
|
||||
<Button style="@style/paragraph" android:text="@string/launcher_button_imesettings" android:onClick="launch_imesettings" android:layout_width="wrap_content"/>
|
||||
<Button style="@style/paragraph" android:text="@string/launcher_button_imepicker" android:onClick="launch_imepicker" android:layout_width="wrap_content"/>
|
||||
<VideoView android:id="@+id/launcher_intro_video" android:layout_width="240dp" android:layout_height="wrap_content" android:layout_gravity="center"/>
|
||||
<TextView android:id="@+id/launcher_tryhere_text" style="@style/paragraph" android:text="@string/launcher_tryhere"/>
|
||||
<EditText android:id="@+id/launcher_tryhere_area" style="@style/paragraph" android:inputType="text"/>
|
||||
<EditText android:id="@+id/launcher_tryhere_area" style="@style/paragraph" android:inputType="text" android:hint="@string/launcher_tryhere_hint" android:importantForAutofill="no"/>
|
||||
<TextView style="@style/paragraph" android:text="@string/launcher_sourcecode"/>
|
||||
<TextView style="@style/paragraph" android:text="https://github.com/Julow/Unexpected-Keyboard" android:autoLink="web" android:linksClickable="true"/>
|
||||
</LinearLayout>
|
||||
|
2544
res/raw/emojis.txt
2544
res/raw/emojis.txt
File diff suppressed because it is too large
Load Diff
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Klávesnice Unexpected</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="store_description">"Hlavní funkcí je možnost psát více znaků posunutím kláves směrem k rohům.
|
||||
|
||||
Tato aplikace byla původně navržena pro programátory používající Termux.
|
||||
Nyní je ideální pro každodenní použití.
|
||||
|
||||
Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je Open Source."</string>
|
||||
<string name="settings_activity_label">Nastavení Klávesnice Unexpected</string>
|
||||
<string name="pref_portrait">V režimu na výšku</string>
|
||||
<string name="pref_landscape">V režimu na šířku</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Přidat klávesy do klávesnice</string>
|
||||
<string name="pref_extra_keys_custom">Přidat vlastní klávesy</string>
|
||||
<string name="pref_extra_keys_internal">Výbrané klávesy k přidaní do klávesnice</string>
|
||||
<string name="pref_second_layout_title">Vedlejší rozvržení</string>
|
||||
<string name="pref_second_layout_none">Žádné</string>
|
||||
<string name="pref_category_typing">Psaní</string>
|
||||
<string name="pref_swipe_dist_title">Vzdálenost posunutí prstem</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>
|
||||
@@ -42,8 +47,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Stiskne Shift na začátku věty</string>
|
||||
<string name="pref_switch_input_immediate_title">Přepnout na posledně užívanou klávesnici</string>
|
||||
<string name="pref_switch_input_immediate_summary">Jak bude klávesa pro přepnutí klávesnice reagovat</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_vibrate_custom">Vlastní vibrace</string>
|
||||
<string name="pref_vibrate_duration_title">Síla vibrace</string>
|
||||
<string name="pref_pin_entry_enabled_title">Rozvržení zadávání PIN kódu</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Automaticky při psaní čísel, datumů a telefonních čísel</string>
|
||||
<string name="pref_category_style">Styl</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Velmi dlouhá</string>
|
||||
<string name="pref_key_horizontal_space">Horizontální mezery mezi klávesami</string>
|
||||
<string name="pref_key_vertical_space">Vertikální mezery mezi klávesami</string>
|
||||
<string name="pref_border_config_title">Přizpůsobit okraje</string>
|
||||
<string name="pref_border_width_title">Šířka okraje</string>
|
||||
<string name="pref_corners_radius_title">Poloměr okraje</string>
|
||||
<string name="key_action_next">Další</string>
|
||||
<string name="key_action_done">Dokončit</string>
|
||||
<string name="key_action_go">Spustit</string>
|
||||
@@ -80,9 +88,11 @@
|
||||
<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_tryhere">Po aktivaci můžete klávesnici rovnou vyzkoušet zde:</string>
|
||||
<string name="launcher_tryhere_hint">Zkoušejte zde</string>
|
||||
<string name="key_descr_capslock">Caps lock</string>
|
||||
<string name="key_descr_compose">Compose</string>
|
||||
<string name="key_descr_switch_greekmath">Řecké a matematické symboly</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_change_method">Přepnout klávesnici</string>
|
||||
<string name="key_descr_voice_typing">Hlasové zadávání</string>
|
||||
<string name="key_descr_copy">Kopírovat</string>
|
||||
<string name="key_descr_paste">Vložit</string>
|
||||
@@ -100,5 +110,4 @@
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="pref_category_advanced">Pokročilé</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (Debug)</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.
|
||||
|
||||
Die Anwendung wurde ursprünglich für das Programmieren in Termux entwickelt.
|
||||
Mittlerweile ist sie auch für den täglichen Gebrauch perfekt geeignet.
|
||||
|
||||
Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quelloffen."</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard - Einstellungen</string>
|
||||
<string name="pref_portrait">Im Hochformatmodus</string>
|
||||
<string name="pref_landscape">Im Querformatmodus</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Zusätzliche Zeichen zur Tastatur hinzufügen</string>
|
||||
<string name="pref_extra_keys_custom">Benutzerdefinierte Tasten hinzufügen</string>
|
||||
<string name="pref_extra_keys_internal">Tasten auswählen, die der Tastatur hinzugefügt werden sollen</string>
|
||||
<string name="pref_second_layout_title">Zweites Layout</string>
|
||||
<string name="pref_second_layout_none">Keines</string>
|
||||
<string name="pref_category_typing">Tippen</string>
|
||||
<string name="pref_swipe_dist_title">Länge der Wischgeste</string>
|
||||
<string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string>
|
||||
@@ -42,8 +47,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Umschalttaste am Satzanfang aktivieren</string>
|
||||
<string name="pref_switch_input_immediate_title">Sofort zur nächsten Tastatur wechseln</string>
|
||||
<string name="pref_switch_input_immediate_summary">Verhalten der Tastaturumschalttaste</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_vibrate_custom">Benutzerdefinierte Vibration</string>
|
||||
<string name="pref_vibrate_duration_title">Vibrationsstärke</string>
|
||||
<string name="pref_pin_entry_enabled_title">PIN-Eingabe-Layout</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Für die Nummern-, Datums- und Telefonnummern-Eingabe</string>
|
||||
<string name="pref_category_style">Design</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Sehr weit</string>
|
||||
<string name="pref_key_horizontal_space">Horizontaler Abstand zwischen den Tasten</string>
|
||||
<string name="pref_key_vertical_space">Vertikaler Abstand zwischen den Tasten</string>
|
||||
<string name="pref_border_config_title">Ränder anpassen</string>
|
||||
<string name="pref_border_width_title">Randbreite</string>
|
||||
<string name="pref_corners_radius_title">Radius der Ecken</string>
|
||||
<string name="key_action_next">Nächstes</string>
|
||||
<string name="key_action_done">Fertig</string>
|
||||
<string name="key_action_go">Los</string>
|
||||
@@ -80,9 +88,11 @@
|
||||
<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_tryhere">Nach Aktivierung kannst du die Tastatur hier ausprobieren:</string>
|
||||
<string name="launcher_tryhere_hint">Hier ausprobieren</string>
|
||||
<string name="key_descr_capslock">Feststelltaste</string>
|
||||
<string name="key_descr_compose">Compose-Taste</string>
|
||||
<string name="key_descr_switch_greekmath">Griechische & mathematische Symbole</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_change_method">Tastatur wechseln</string>
|
||||
<string name="key_descr_voice_typing">Spracheingabe</string>
|
||||
<string name="key_descr_copy">Kopieren</string>
|
||||
<string name="key_descr_paste">Einfügen</string>
|
||||
@@ -100,5 +110,4 @@
|
||||
<string name="key_descr_page_down">Bild ab</string>
|
||||
<string name="key_descr_home">Pos1</string>
|
||||
<string name="key_descr_end">Ende</string>
|
||||
<string name="pref_category_advanced">Erweitert</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</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="store_description">"La característica principal es que hay acceso a más caractéres deslizando hacia las esquinas de las teclas.
|
||||
|
||||
Esta aplicación fue originalmente diseñada para programadores que usaran Termux.
|
||||
Ahora es perfecta para uso cotidiano.
|
||||
|
||||
La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta."</string>
|
||||
<string name="settings_activity_label">Ajustes de Unexpected Keyboard</string>
|
||||
<string name="pref_portrait">En modo vertical</string>
|
||||
<string name="pref_landscape">En modo horizontal</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Agregar teclas</string>
|
||||
<string name="pref_extra_keys_custom">Agregar teclas personalizadas</string>
|
||||
<string name="pref_extra_keys_internal">Selecciona teclas para agregar al teclado</string>
|
||||
<string name="pref_second_layout_title">Formato secundario</string>
|
||||
<string name="pref_second_layout_none">Ninguno</string>
|
||||
<string name="pref_category_typing">Escritura</string>
|
||||
<string name="pref_swipe_dist_title">Distancia de deslizamiento</string>
|
||||
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las teclas (%s)</string>
|
||||
@@ -42,8 +47,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Presionar Mayús al principio de una oración</string>
|
||||
<string name="pref_switch_input_immediate_title">Cambiar al último teclado usado</string>
|
||||
<string name="pref_switch_input_immediate_summary">Comportamiento de la tecla para cambiar diseño</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_vibrate_custom">Vibración personalizada</string>
|
||||
<string name="pref_vibrate_duration_title">Intensidad de vibración</string>
|
||||
<string name="pref_pin_entry_enabled_title">Diseño de introducción de PIN</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Para escribir cifras, fechas y números telefónicos</string>
|
||||
<string name="pref_category_style">Estilo</string>
|
||||
@@ -67,8 +72,11 @@
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
<string name="pref_swipe_dist_e_far">Larga</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Muy larga</string>
|
||||
<string name="pref_key_horizontal_space">Espaciado horizontal entre las teclas</string>
|
||||
<string name="pref_key_vertical_space">Espaciado vertical entre las teclas</string>
|
||||
<string name="pref_key_horizontal_space">Espacio horizontal 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_width_title">Ancho de bordes</string>
|
||||
<string name="pref_corners_radius_title">Radio de rincones</string>
|
||||
<string name="key_action_next">Siguiente</string>
|
||||
<string name="key_action_done">Hecho</string>
|
||||
<string name="key_action_go">Ir</string>
|
||||
@@ -80,9 +88,11 @@
|
||||
<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_tryhere">Tras habilitarlo, puedes probar el teclado en este campo:</string>
|
||||
<string name="launcher_tryhere_hint">Intentar aquí</string>
|
||||
<string name="key_descr_capslock">Bloq Mayús</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_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_change_method">Cambiar teclado</string>
|
||||
<string name="key_descr_voice_typing">Dictado por voz</string>
|
||||
<string name="key_descr_copy">Copiar</string>
|
||||
<string name="key_descr_paste">Pegar</string>
|
||||
@@ -100,5 +110,4 @@
|
||||
<string name="key_descr_page_down">Re Pág</string>
|
||||
<string name="key_descr_home">Inicio</string>
|
||||
<string name="key_descr_end">Fin</string>
|
||||
<string name="pref_category_advanced">Avanzado</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">صفحه کلید غیرمنتظره</string>
|
||||
<string name="app_name_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.
|
||||
|
||||
This application was originally designed for programmers using Termux.
|
||||
Now perfect for everyday use.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
|
||||
<string name="settings_activity_label">تنظیمات صفحه کلید غیرمنتظره</string>
|
||||
<string name="pref_portrait">در حالت عمودی</string>
|
||||
<string name="pref_landscape">در حالت افقی</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">افزودن کلیدها به صفحه کلید</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_second_layout_title">طرح دوم</string>
|
||||
<string name="pref_second_layout_none">هیچ</string>
|
||||
<string name="pref_category_typing">درحال نوشتن</string>
|
||||
<string name="pref_swipe_dist_title">فاصله کشیدن</string>
|
||||
<string name="pref_swipe_dist_summary">فاصله حروف از گوشههای کلیدها )(%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">بسیار دور</string>
|
||||
<string name="pref_key_horizontal_space">فاصله افقی بین کلیدها</string>
|
||||
<string name="pref_key_vertical_space">فاصله عمودی بین کلیدها</string>
|
||||
<!-- <string name="pref_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="key_action_next">بعدی</string>
|
||||
<string name="key_action_done">اتمام</string>
|
||||
<string name="key_action_go">برو</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<string name="launcher_description">این برنامه یک صفحه کلید مجازی است. با کلیک روی گزینه زیر به تنظیمات سامانه بروید و صفحه کلید غیرمنتظره را فعال کنید.</string>
|
||||
<string name="launcher_sourcecode">این یک برنامه متن باز و آزاد است. شما میتوانید کد منبع را در گیتهاب پیدا کرده و نیز باگها را گزارش کنید.</string>
|
||||
<string name="launcher_tryhere">بعد از فعالسازی، صفحه کلید را اینجا امتحان کنید:</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 & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
@@ -100,5 +110,4 @@
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">پیشرفته</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</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="store_description">"La fonctionnalité principale est l'accès rapide à plus de caractères en balayant les touches vers les coins.
|
||||
|
||||
Cette application a été conçue à l'origine pour les programmeurs utilisant Termux.
|
||||
Elle est maintenant parfaite pour une utilisation quotidienne.
|
||||
|
||||
Cette application ne contient pas de publicité, n'accède pas au réseau et est Open Source."</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Paramètres</string>
|
||||
<string name="pref_portrait">En mode portrait</string>
|
||||
<string name="pref_landscape">En mode landscape</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Ajouter des touches au clavier</string>
|
||||
<string name="pref_extra_keys_custom">Ajouter des touches personnalisées</string>
|
||||
<string name="pref_extra_keys_internal">Sélectionner les touches à ajouter au clavier</string>
|
||||
<string name="pref_second_layout_title">Disposition secondaire</string>
|
||||
<string name="pref_second_layout_none">Aucune</string>
|
||||
<string name="pref_category_typing">Saisie</string>
|
||||
<string name="pref_swipe_dist_title">Distance de swipe</string>
|
||||
<string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Très longue</string>
|
||||
<string name="pref_key_horizontal_space">Espacement horizontal entre les touches</string>
|
||||
<string name="pref_key_vertical_space">Espacement vertical entre les touches</string>
|
||||
<!-- <string name="pref_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="key_action_next">Suiv.</string>
|
||||
<string name="key_action_done">Fin</string>
|
||||
<string name="key_action_go">Aller</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<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_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string>
|
||||
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
|
||||
<string name="key_descr_capslock">Verrouillage majuscules</string>
|
||||
<!-- <string name="key_descr_compose">Compose</string> -->
|
||||
<string name="key_descr_switch_greekmath">Symboles mathématiques</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Saisie vocale</string>
|
||||
@@ -100,5 +110,4 @@
|
||||
<string name="key_descr_page_down">Page suivante</string>
|
||||
<string name="key_descr_home">Début</string>
|
||||
<string name="key_descr_end">Fin</string>
|
||||
<string name="pref_category_advanced">Avancé</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="short_description">Una Tastiera Virtuale Leggera Per La Programmazione</string>
|
||||
<!-- <string name="store_description">"The main feature is that you can type more characters by swiping the keys towards the corners.
|
||||
|
||||
This application was originally designed for programmers using Termux.
|
||||
Now perfect for everyday use.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
|
||||
<string name="settings_activity_label">Impostazioni di Unexpected Keyboard</string>
|
||||
<!-- <string name="pref_portrait">In portrait mode</string> -->
|
||||
<!-- <string name="pref_landscape">In landscape mode</string> -->
|
||||
@@ -28,8 +35,6 @@
|
||||
<!-- <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_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_second_layout_none">Nessuno</string>
|
||||
<string name="pref_category_typing">Digitando</string>
|
||||
<string name="pref_swipe_dist_title">Distanza swipe</string>
|
||||
<string name="pref_swipe_dist_summary">Distanza dei caratteri negli angoli dei tasti (%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Molto distante</string>
|
||||
<string name="pref_key_horizontal_space">Spazio orizzontale tra i tasti</string>
|
||||
<string name="pref_key_vertical_space">Spazio verticale tra i tasti</string>
|
||||
<!-- <string name="pref_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="key_action_next">Prossimo</string>
|
||||
<string name="key_action_done">Fatto</string>
|
||||
<string name="key_action_go">Vai</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<!-- <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 an 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 & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
@@ -100,5 +110,4 @@
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="pref_category_advanced">Advanced</string> -->
|
||||
</resources>
|
||||
|
@@ -1,7 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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="short_description">개발자들을 위한 가벼운 가상 키보드.</string>
|
||||
<!-- <string name="store_description">"The main feature is that you can type more characters by swiping the keys towards the corners.
|
||||
|
||||
This application was originally designed for programmers using Termux.
|
||||
Now perfect for everyday use.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
|
||||
<string name="settings_activity_label">Unexpected Keyboard 설정</string>
|
||||
<!-- <string name="pref_portrait">In portrait mode</string> -->
|
||||
<!-- <string name="pref_landscape">In landscape mode</string> -->
|
||||
@@ -28,8 +35,6 @@
|
||||
<!-- <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_second_layout_title">Secondary layout</string> -->
|
||||
<!-- <string name="pref_second_layout_none">None</string> -->
|
||||
<string name="pref_category_typing">타자</string>
|
||||
<string name="pref_swipe_dist_title">스와이프 범위</string>
|
||||
<string name="pref_swipe_dist_summary">키 모서리 문자의 입력 범위 (%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">매우 넓음</string>
|
||||
<string name="pref_key_horizontal_space">키보드 양 옆 간격</string>
|
||||
<string name="pref_key_vertical_space">키보드 세로 간격</string>
|
||||
<!-- <string name="pref_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="key_action_next">다음</string>
|
||||
<string name="key_action_done">확인</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<!-- <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 an 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 & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
@@ -100,5 +110,4 @@
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="pref_category_advanced">Advanced</string> -->
|
||||
</resources>
|
||||
|
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="emoji_type_button_height">48dp</dimen>
|
||||
</resources>
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (atkļūdošana)</string>
|
||||
<string name="short_description">Mazizmēra un privātumu ievērojoša virtuālā Android tastatūra.</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.
|
||||
|
||||
Šī lietotne sākotnēji tika izstrādāta programmētājiem, kas izmanto Termux.
|
||||
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."</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard iestatījumi</string>
|
||||
<string name="pref_portrait">Stateniski</string>
|
||||
<string name="pref_landscape">Guleniski</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Pievienot tastatūrai taustiņus</string>
|
||||
<string name="pref_extra_keys_custom">Pievienot pielāgotus taustiņus</string>
|
||||
<string name="pref_extra_keys_internal">Atlasīt taustiņus, ko pievienot tastatūrai</string>
|
||||
<string name="pref_second_layout_title">Otrējais izkārtojums</string>
|
||||
<string name="pref_second_layout_none">Neviens</string>
|
||||
<string name="pref_category_typing">Rakstīšana</string>
|
||||
<string name="pref_swipe_dist_title">Pavilkšanas attālums</string>
|
||||
<string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string>
|
||||
@@ -42,8 +47,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Piespiest Shift teikuma sākumā</string>
|
||||
<string name="pref_switch_input_immediate_title">Pārslēgties uz pēdējo izmantoto tastatūru</string>
|
||||
<string name="pref_switch_input_immediate_summary">Tastatūras pārslēgšanas taustiņa uzvedība</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_vibrate_custom">Pielāgota trīcēšana</string>
|
||||
<string name="pref_vibrate_duration_title">Trīcēšanas stiprums</string>
|
||||
<string name="pref_pin_entry_enabled_title">Piespraust ievadīšanas izkārtojumu</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Kad ievada skaitļus, datumus un tālruņa numurus</string>
|
||||
<string name="pref_category_style">Izskata pielāgojumi</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Ļoti tāls</string>
|
||||
<string name="pref_key_horizontal_space">Līmeniskais attālums starp taustiņiem</string>
|
||||
<string name="pref_key_vertical_space">Stateniskais attālums starp taustiņiem</string>
|
||||
<string name="pref_border_config_title">Pielāgot apmales</string>
|
||||
<string name="pref_border_width_title">Apmales platums</string>
|
||||
<string name="pref_corners_radius_title">Stūru rādiuss</string>
|
||||
<string name="key_action_next">Nākamais</string>
|
||||
<string name="key_action_done">Darīts</string>
|
||||
<string name="key_action_go">Aiziet</string>
|
||||
@@ -82,9 +90,11 @@
|
||||
<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_tryhere">Pēc iespējošanas šeit var izmēģināt tastatūru:</string>
|
||||
<string name="launcher_tryhere_hint">Izmēģināt šeit</string>
|
||||
<string name="key_descr_capslock">Burtslēgs</string>
|
||||
<string name="key_descr_compose">Izveidot</string>
|
||||
<string name="key_descr_switch_greekmath">Grieķu un matemātikas rakstzīmes</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_change_method">Pārslēgt tastatūru</string>
|
||||
<string name="key_descr_voice_typing">Rakstīšana ar balsi</string>
|
||||
<string name="key_descr_copy">Ievietot starpliktuvē</string>
|
||||
<string name="key_descr_paste">Ielīmēt</string>
|
||||
@@ -102,5 +112,4 @@
|
||||
<string name="key_descr_page_down">Lejupšķirt</string>
|
||||
<string name="key_descr_home">Sākums</string>
|
||||
<string name="key_descr_end">Beigas</string>
|
||||
<string name="pref_category_advanced">Papildu</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</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="store_description">"Główną cechą tej klawiatury jest możliwość wprowadzania więcej znaków poprzez przesuwanie po klawiszach do ich rogów.
|
||||
|
||||
Ta aplikacja została pierwotnie zaprojektowana z myślą o programistach używających Termuxa.
|
||||
Obecnie nadaje się doskonale do codziennego użytku.
|
||||
|
||||
Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źródłowy jest dostępny publicznie."</string>
|
||||
<string name="settings_activity_label">Ustawienia Unexpected Keyboard</string>
|
||||
<string name="pref_portrait">W widoku pionowym</string>
|
||||
<string name="pref_landscape">W widoku poziomym</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Dodaj klawisze do klawiatury</string>
|
||||
<string name="pref_extra_keys_custom">Dodaj niestandardowe klawisze</string>
|
||||
<string name="pref_extra_keys_internal">Wybierz klawisze, które chcesz dodać do klawiatury</string>
|
||||
<string name="pref_second_layout_title">Drugi układ</string>
|
||||
<string name="pref_second_layout_none">Żaden</string>
|
||||
<string name="pref_category_typing">Pisanie</string>
|
||||
<string name="pref_swipe_dist_title">Odległość przesuwania</string>
|
||||
<string name="pref_swipe_dist_summary">Odległość znaków od rogów klawiszy (%s)</string>
|
||||
@@ -42,8 +47,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Naciśnij Shift na początku zdania</string>
|
||||
<string name="pref_switch_input_immediate_title">Przełącz na ostatnio używaną klawiaturę</string>
|
||||
<string name="pref_switch_input_immediate_summary">Działanie klawisza przełączającego klawiaturę</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_vibrate_custom">Własna wibracja</string>
|
||||
<string name="pref_vibrate_duration_title">Intensywność wibracji</string>
|
||||
<string name="pref_pin_entry_enabled_title">Układ klawiatury PIN</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Podczas wpisywania liczb, dat i numerów telefonu</string>
|
||||
<string name="pref_category_style">Styl</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Bardzo duża</string>
|
||||
<string name="pref_key_horizontal_space">Odległość pomiędzy klawiszami w poziomie</string>
|
||||
<string name="pref_key_vertical_space">Odległość pomiędzy klawiszami w pionie</string>
|
||||
<string name="pref_border_config_title">Dostosuj krawędzie</string>
|
||||
<string name="pref_border_width_title">Grubość krawedzi</string>
|
||||
<string name="pref_corners_radius_title">Promień rogów</string>
|
||||
<string name="key_action_next">Dalej</string>
|
||||
<string name="key_action_done">OK</string>
|
||||
<string name="key_action_go">Przejdź</string>
|
||||
@@ -80,9 +88,11 @@
|
||||
<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_tryhere">Po jej włączeniu, możesz wypróbować klawiaturę tutaj:</string>
|
||||
<string name="launcher_tryhere_hint">Wypróbuj tutaj</string>
|
||||
<string name="key_descr_capslock">Caps lock</string>
|
||||
<string name="key_descr_compose">Komponuj</string>
|
||||
<string name="key_descr_switch_greekmath">Symbole greckie i matematyczne</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_change_method">Przełącz klawiaturę</string>
|
||||
<string name="key_descr_voice_typing">Pisanie głosowe</string>
|
||||
<string name="key_descr_copy">Kopiuj</string>
|
||||
<string name="key_descr_paste">Wklej</string>
|
||||
@@ -100,5 +110,4 @@
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="pref_category_advanced">Zaawansowane</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Teclado Unexpected</string>
|
||||
<string name="app_name_debug">Teclado Unexpected</string>
|
||||
<string name="short_description">Um teclado virtual leve para desenvolvedores.</string>
|
||||
<!-- <string name="store_description">"The main feature is that you can type more characters by swiping the keys towards the corners.
|
||||
|
||||
This application was originally designed for programmers using Termux.
|
||||
Now perfect for everyday use.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
|
||||
<string name="settings_activity_label">Configurações</string>
|
||||
<string name="pref_portrait">No modo retrato</string>
|
||||
<string name="pref_landscape">No modo paisagem</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Adicionar teclas ao teclado</string>
|
||||
<string name="pref_extra_keys_custom">Adicionar teclas customizadas</string>
|
||||
<string name="pref_extra_keys_internal">Selecione teclas para serem adicionadas ao teclado</string>
|
||||
<string name="pref_second_layout_title">Layout secundário</string>
|
||||
<string name="pref_second_layout_none">Nenhum</string>
|
||||
<string name="pref_category_typing">Digitação</string>
|
||||
<string name="pref_swipe_dist_title">Distância a deslizar</string>
|
||||
<string name="pref_swipe_dist_summary">Distância até acionar os cantos das teclas (%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Bem longo</string>
|
||||
<string name="pref_key_horizontal_space">Distância horizontal entre teclas</string>
|
||||
<string name="pref_key_vertical_space">Distância vertical entre teclas</string>
|
||||
<!-- <string name="pref_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="key_action_next">Próximo</string>
|
||||
<string name="key_action_done">Pronto</string>
|
||||
<string name="key_action_go">Ir</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<string name="launcher_description">Este app é um teclado virtual. Vá para as configurações do sistema clicando no botão abaixo e ative o Teclado Unexpected.</string>
|
||||
<string name="launcher_sourcecode">Este app é gratuito é de código aberto. Você pode consultar o código ou fazer sugestões em Github.</string>
|
||||
<string name="launcher_tryhere">Após ativar, experimente aqui:</string>
|
||||
<!-- <string name="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">Grego & símbolos matemáticos</string>
|
||||
<string name="key_descr_change_method">Trocar de teclado</string>
|
||||
<string name="key_descr_voice_typing">Digitação por voz</string>
|
||||
@@ -100,5 +110,4 @@
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">Avançado</string>
|
||||
</resources>
|
||||
|
@@ -1,7 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name_release">Tastatură Unexpected</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</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="store_description">"Funcționalitatea principală este accesul rapid la o mulțime de caractere ASCII prin glisarea către colțurile tastelor.
|
||||
|
||||
Această aplicație a fost concepută inițial pentru programatori care folosec Termux.
|
||||
Este perfectă pentru uzul cotidian.
|
||||
|
||||
Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e Open Source."</string>
|
||||
<string name="settings_activity_label">Setări Tastatură Unexpected</string>
|
||||
<string name="pref_portrait">În mod portret</string>
|
||||
<string name="pref_landscape">În mod panoramă</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Adaugă taste pe tastatură</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_second_layout_title">Aranjament secundar</string>
|
||||
<string name="pref_second_layout_none">Nimic</string>
|
||||
<string name="pref_category_typing">Tipărire</string>
|
||||
<string name="pref_swipe_dist_title">Distanța de glisare</string>
|
||||
<string name="pref_swipe_dist_summary">Distanța dintre caracterele din colțurile tastelor (%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Foarte depărtată</string>
|
||||
<string name="pref_key_horizontal_space">Distanța orizontală dintre taste</string>
|
||||
<string name="pref_key_vertical_space">Distanța verticală dintre taste</string>
|
||||
<!-- <string name="pref_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="key_action_next">Următor</string>
|
||||
<string name="key_action_done">Gata</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<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_tryhere">După activare, puteți să încercați tastatura aici:</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 & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
@@ -100,5 +110,4 @@
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">Setări avansate</string>
|
||||
</resources>
|
||||
|
@@ -2,7 +2,14 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (отладка)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Настройки</string>
|
||||
<string name="short_description">Легкая клавиатура для пользователей, заботящихся о конфиденциальности.</string>
|
||||
<string name="store_description">"Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.
|
||||
|
||||
Приложение изначально было разработано для использования с Termux.
|
||||
На данный момент оно также удобно в повседневном использовании.
|
||||
|
||||
Приложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код."</string>
|
||||
<string name="settings_activity_label">Настройки Unexpected Keyboard</string>
|
||||
<string name="pref_portrait">В портретном режиме</string>
|
||||
<string name="pref_landscape">В ландшафтном режиме</string>
|
||||
<string name="pref_category_layout">Расположение</string>
|
||||
@@ -12,40 +19,38 @@
|
||||
<string name="pref_key_activated_opacity">Изменить прозрачность нажатой клавиши</string>
|
||||
<string name="pref_layout_e_system">Системные настройки</string>
|
||||
<string name="pref_layout_e_custom">Пользовательская раскладка</string>
|
||||
<!-- <string name="pref_layouts_add">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_layouts_add">Добавить альтернативную раскладку</string>
|
||||
<string name="pref_layouts_item">Раскладка %1$d: %2$s</string>
|
||||
<string name="pref_layouts_remove_custom">Удалить раскладку</string>
|
||||
<string name="pref_custom_layout_title">Пользовательская раскладка</string>
|
||||
<string name="pref_show_numpad_title">Показывать NumPad</string>
|
||||
<string name="pref_show_numpad_title">Показывать цифровой блок</string>
|
||||
<string name="pref_show_numpad_never">Никогда</string>
|
||||
<string name="pref_show_numpad_landscape">Только в ландшафтном режиме</string>
|
||||
<string name="pref_show_numpad_always">Всегда</string>
|
||||
<string name="pref_number_row_title">Показывать номер ряда</string>
|
||||
<string name="pref_number_row_summary">Добавить ряд цифр над клавиатурой, когда numpad не активен</string>
|
||||
<string name="pref_numpad_layout">NumPad раскладка</string>
|
||||
<string name="pref_number_row_title">Показывать цифры</string>
|
||||
<string name="pref_number_row_summary">Добавить ряд цифр над клавиатурой, когда цифровой блок не активен</string>
|
||||
<string name="pref_numpad_layout">Раскладка цифрового блока</string>
|
||||
<string name="pref_numpad_layout_e_high_first">Старшие цифры сверху</string>
|
||||
<string name="pref_numpad_layout_e_low_first">Младшие цифры сверху</string>
|
||||
<string name="pref_extra_keys_title">Добавить клавиши на клавиатуру</string>
|
||||
<!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
|
||||
<!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
|
||||
<string name="pref_second_layout_title">Дополнительная раскладка</string>
|
||||
<string name="pref_second_layout_none">Нет</string>
|
||||
<string name="pref_category_typing">Печать</string>
|
||||
<string name="pref_swipe_dist_title">Расстояние пролистывания</string>
|
||||
<string name="pref_extra_keys_custom">Добавить пользовательские клавиши</string>
|
||||
<string name="pref_extra_keys_internal">Выберите клавиши для добавления на клавиатуру</string>
|
||||
<string name="pref_category_typing">Набор текста</string>
|
||||
<string name="pref_swipe_dist_title">Длина жеста</string>
|
||||
<string name="pref_swipe_dist_summary">Расстояние между символами в углах клавиш (%s)</string>
|
||||
<string name="pref_long_timeout_title">Тайм-аут повтора клавиш</string>
|
||||
<string name="pref_long_timeout_title">Задержка повтора клавиш</string>
|
||||
<string name="pref_long_interval_title">Интервал повтора клавиш</string>
|
||||
<string name="pref_lock_double_tap_title">Двойное нажатие на Shift активирует Caps lock</string>
|
||||
<string name="pref_lock_double_tap_summary">Вы можете активировать модификатор, удерживая клавишу</string>
|
||||
<string name="pref_lock_double_tap_title">Двойное нажатие Shift включает CapsLock</string>
|
||||
<string name="pref_lock_double_tap_summary">Также можно активировать модификатор долгим нажатием</string>
|
||||
<string name="pref_category_behavior">Поведение</string>
|
||||
<string name="pref_autocapitalisation_title">Автоматическая смена регистра</string>
|
||||
<string name="pref_autocapitalisation_summary">Автонажатие Shift в начале каждого предложения</string>
|
||||
<string name="pref_switch_input_immediate_title">Переключаться к последней используемой клавиатуре</string>
|
||||
<string name="pref_autocapitalisation_summary">Автоматическое нажатие Shift в начале каждого предложения</string>
|
||||
<string name="pref_switch_input_immediate_title">Активировать предыдущую клавиатуру</string>
|
||||
<string name="pref_switch_input_immediate_summary">Поведение клавиши переключения клавиатуры</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_vibrate_custom">Настройка вибрации</string>
|
||||
<string name="pref_vibrate_duration_title">Интенсивность вибрации</string>
|
||||
<string name="pref_pin_entry_enabled_title">Закрепить раскладку</string>
|
||||
<string name="pref_pin_entry_enabled_summary">При вводе чисел, дат и телефонных номеров</string>
|
||||
<string name="pref_category_style">Стиль</string>
|
||||
<string name="pref_margin_bottom_title">Нижняя граница поля</string>
|
||||
<string name="pref_keyboard_height_title">Высота клавиатуры</string>
|
||||
@@ -53,52 +58,56 @@
|
||||
<string name="pref_character_size_title">Размер символов</string>
|
||||
<string name="pref_character_size_summary">Размер символов, отображаемых на клавиатуре (%.2fx)</string>
|
||||
<string name="pref_theme">Тема</string>
|
||||
<string name="pref_theme_e_system">Системные настройки</string>
|
||||
<string name="pref_theme_e_system">Системная</string>
|
||||
<string name="pref_theme_e_dark">Темная</string>
|
||||
<string name="pref_theme_e_light">Светлая</string>
|
||||
<string name="pref_theme_e_black">Черная</string>
|
||||
<string name="pref_theme_e_altblack">Альтернативный черный</string>
|
||||
<string name="pref_theme_e_altblack">Альтернативная черная</string>
|
||||
<string name="pref_theme_e_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_swipe_dist_e_very_short">Очень близко</string>
|
||||
<string name="pref_swipe_dist_e_short">Близко</string>
|
||||
<string name="pref_swipe_dist_e_default">Нормально</string>
|
||||
<string name="pref_swipe_dist_e_far">Далеко</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Очень далеко</string>
|
||||
<string name="pref_theme_e_epaper">Электронная бумага</string>
|
||||
<string name="pref_theme_e_desert">Пустыня</string>
|
||||
<string name="pref_theme_e_jungle">Джунгли</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Очень короткая</string>
|
||||
<string name="pref_swipe_dist_e_short">Короткая</string>
|
||||
<string name="pref_swipe_dist_e_default">Обычная</string>
|
||||
<string name="pref_swipe_dist_e_far">Длинная</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Очень длинная</string>
|
||||
<string name="pref_key_horizontal_space">Горизонтальное расстояние между клавишами</string>
|
||||
<string name="pref_key_vertical_space">Расстояние по вертикали между клавишами</string>
|
||||
<string name="key_action_next">Далее</string>
|
||||
<string name="pref_border_config_title">Настройка рамки</string>
|
||||
<string name="pref_border_width_title">Ширина рамки</string>
|
||||
<string name="pref_corners_radius_title">Радиус скругления</string>
|
||||
<string name="key_action_next">Вперед</string>
|
||||
<string name="key_action_done">Ввод</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
<string name="key_action_prev">Предыдущий</string>
|
||||
<string name="key_action_go">Перейти</string>
|
||||
<string name="key_action_prev">Назад</string>
|
||||
<string name="key_action_search">Поиск</string>
|
||||
<string name="key_action_send">Отправить</string>
|
||||
<string name="launcher_button_imesettings">Включить клавиатуру</string>
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_description">Данное приложение является виртуальной клавиатурой. Зайдите в настройки, нажав кнопку внизу и активируйте Unexpected-Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Это бесплатное приложение с открытым исходным кодом. Вы можете изучить код или сообщить об ошибках по ссылке Github.</string>
|
||||
<string name="launcher_tryhere">После активации вы можете попробовать клавиатуру прямо здесь:</string>
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
<!-- <string name="key_descr_cut">Cut</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_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="pref_category_advanced">Расширенные настройки</string>
|
||||
<string name="launcher_button_imesettings">Включение клавиатуры</string>
|
||||
<string name="launcher_button_imepicker">Выбор клавиатуры</string>
|
||||
<string name="launcher_description">Данное приложение является виртуальной клавиатурой. Зайдите в настройки, нажав кнопку внизу, и активируйте Unexpected Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Это бесплатное приложение с открытым исходным кодом. Вы можете изучить код или сообщить об ошибках по ссылке GitHub.</string>
|
||||
<string name="launcher_tryhere">После активации вы сможете попробовать клавиатуру прямо здесь:</string>
|
||||
<string name="launcher_tryhere_hint">Попробуйте здесь</string>
|
||||
<string name="key_descr_capslock">CapsLock</string>
|
||||
<string name="key_descr_compose">Compose</string>
|
||||
<string name="key_descr_switch_greekmath">Греческие и математические символы</string>
|
||||
<string name="key_descr_change_method">Переключение клавиатуры</string>
|
||||
<string name="key_descr_voice_typing">Голосовой ввод</string>
|
||||
<string name="key_descr_copy">Копировать</string>
|
||||
<string name="key_descr_paste">Вставить</string>
|
||||
<string name="key_descr_cut">Вырезать</string>
|
||||
<string name="key_descr_selectAll">Выбрать все</string>
|
||||
<string name="key_descr_shareText">Поделиться текстом</string>
|
||||
<string name="key_descr_pasteAsPlainText">Вставить как простой текст</string>
|
||||
<string name="key_descr_undo">Отменить</string>
|
||||
<string name="key_descr_redo">Повторить</string>
|
||||
<string name="key_descr_ª">Порядковый индикатор</string>
|
||||
<string name="key_descr_º">Порядковый индикатор</string>
|
||||
<string name="key_descr_superscript">Надстрочные</string>
|
||||
<string name="key_descr_subscript">Подстрочные</string>
|
||||
<string name="key_descr_page_up">Страница вверх</string>
|
||||
<string name="key_descr_page_down">Страница вниз</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</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="store_description">"Bu uygulama özünde tuşların kenarlarından kaydırarak daha fazla karakter yazabilmek amacıyla geliştirildi.
|
||||
|
||||
Bu uygulama aslında Termux kullanıcıları için geliştirildi.
|
||||
Artık gündelik kullanım için de uygun.
|
||||
|
||||
Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Ayarları</string>
|
||||
<string name="pref_portrait">Portre modunda</string>
|
||||
<string name="pref_landscape">Manzara modunda</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Tuş ekle</string>
|
||||
<string name="pref_extra_keys_custom">Özel tuş ekle</string>
|
||||
<string name="pref_extra_keys_internal">Klavyeye eklenecek tuşları seçin</string>
|
||||
<string name="pref_second_layout_title">İklncil tuş düzeni</string>
|
||||
<string name="pref_second_layout_none">Hiçbiri</string>
|
||||
<string name="pref_category_typing">Yazma</string>
|
||||
<string name="pref_swipe_dist_title">Kaydırma mesafesi</string>
|
||||
<string name="pref_swipe_dist_summary">Tuşların köşelerinden kaydırma mesafesi (%s)</string>
|
||||
@@ -42,8 +47,8 @@
|
||||
<string name="pref_autocapitalisation_summary">Noktadan sonra ve her cümlenin başında büyük harf yapar</string>
|
||||
<string name="pref_switch_input_immediate_title">Son kullanılan klavyeye geç</string>
|
||||
<string name="pref_switch_input_immediate_summary">Klavye değistirme tuşunun davranışını belirler</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_vibrate_custom">Özel titreşim</string>
|
||||
<string name="pref_vibrate_duration_title">Titreşim yoğunluğu</string>
|
||||
<string name="pref_pin_entry_enabled_title">NumPad</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Sayıları, tarihleri ve telefon numaralarını yazarken</string>
|
||||
<string name="pref_category_style">Tarz</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Çok uzun</string>
|
||||
<string name="pref_key_horizontal_space">Tuşlar arasındaki yatay boşluk</string>
|
||||
<string name="pref_key_vertical_space">Tuşlar arasındaki dikey boşluk</string>
|
||||
<!-- <string name="pref_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="key_action_next">Sonraki</string>
|
||||
<string name="key_action_done">Tamam</string>
|
||||
<string name="key_action_go">ileri</string>
|
||||
@@ -80,9 +88,11 @@
|
||||
<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_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string>
|
||||
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
|
||||
<string name="key_descr_capslock">CapsLock</string>
|
||||
<!-- <string name="key_descr_compose">Compose</string> -->
|
||||
<string name="key_descr_switch_greekmath">Greek & math sembolleri</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</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_copy">Kopyala</string>
|
||||
<string name="key_descr_paste">Yapıştır</string>
|
||||
@@ -100,5 +110,4 @@
|
||||
<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_end">SON(Sağ yön tuşu)</string>
|
||||
<string name="pref_category_advanced">Gelişmiş</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (Налагодження)</string>
|
||||
<string name="short_description">Легка та конфіденційна віртуальна клавіатура для Android.</string>
|
||||
<string name="store_description">"Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.
|
||||
|
||||
Ця програма спочатку була розроблена для програмістів, які використовують Termux.
|
||||
Тепер ідеально підходить для щоденного використання.
|
||||
|
||||
Ця програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код."</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Налаштування</string>
|
||||
<string name="pref_portrait">У портретному режимі</string>
|
||||
<string name="pref_landscape">У альбомному режимі</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Додати клавіші до клавіатури</string>
|
||||
<string name="pref_extra_keys_custom">Додайте власні клавіші</string>
|
||||
<string name="pref_extra_keys_internal">Виберіть клавіші, які потрібно додати до клавіатури</string>
|
||||
<string name="pref_second_layout_title">Додаткова розкладка</string>
|
||||
<string name="pref_second_layout_none">Немає</string>
|
||||
<string name="pref_category_typing">Введення</string>
|
||||
<string name="pref_swipe_dist_title">Відстань проведення</string>
|
||||
<string name="pref_swipe_dist_summary">Відстань між символами в кутах клавіш (%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Дуже далека</string>
|
||||
<string name="pref_key_horizontal_space">Горизонтальна відстань між клавішами</string>
|
||||
<string name="pref_key_vertical_space">Вертикальна відстань між клавішами</string>
|
||||
<string name="pref_border_config_title">Налаштувати межі</string>
|
||||
<string name="pref_border_width_title">Ширина межі</string>
|
||||
<string name="pref_corners_radius_title">Радіус кута</string>
|
||||
<string name="key_action_next">Далі</string>
|
||||
<string name="key_action_done">Готово</string>
|
||||
<string name="key_action_go">Іти</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<string name="launcher_description">Ця програма є віртуальною клавіатурою. Перейдіть до системних налаштувань, натиснувши кнопку нижче, і ввімкніть Unexpected-Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Це безкоштовна програма з відкритим кодом. Ви можете знайти початковий код або повідомити про помилки на GitHub.</string>
|
||||
<string name="launcher_tryhere">Після ввімкнення ви можете спробувати клавіатуру тут:</string>
|
||||
<string name="launcher_tryhere_hint">Спробуйте тут</string>
|
||||
<string name="key_descr_capslock">Caps lock</string>
|
||||
<string name="key_descr_compose">Compose</string>
|
||||
<string name="key_descr_switch_greekmath">Грецькі та математичні символи</string>
|
||||
<string name="key_descr_change_method">Переключити клавіатуру</string>
|
||||
<string name="key_descr_voice_typing">Голосове введення</string>
|
||||
@@ -100,5 +110,4 @@
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="pref_category_advanced">Додаткові</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<resources>
|
||||
<string name="app_name_release">Unexpected Keyboard</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="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ó.
|
||||
|
||||
Ứng dụng này ban đầu được thiết kế cho các lập trình viên dùng Termux.
|
||||
Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
||||
|
||||
Ứ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="settings_activity_label">Cài đặt Unexpected Keyboard</string>
|
||||
<string name="pref_portrait">Trong chế độ chân dung</string>
|
||||
<string name="pref_landscape">Trong chế độ phong cảnh</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">Thêm phím vào bàn phím</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_second_layout_title">Bố cục phụ</string>
|
||||
<string name="pref_second_layout_none">Không</string>
|
||||
<string name="pref_category_typing">Gõ</string>
|
||||
<string name="pref_swipe_dist_title">Khoảng cách vuốt</string>
|
||||
<string name="pref_swipe_dist_summary">Khoảng cách giữa các ký tự ở góc phím (%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Rất xa</string>
|
||||
<string name="pref_key_horizontal_space">Khoảng cách giữa các phím theo chiều ngang</string>
|
||||
<string name="pref_key_vertical_space">Khoảng cách giữa các phím theo chiều dọc</string>
|
||||
<!-- <string name="pref_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="key_action_next">Tiếp</string>
|
||||
<string name="key_action_done">Xong</string>
|
||||
<string name="key_action_go">Đi</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<!-- <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 an 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 & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
@@ -100,5 +110,4 @@
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">Nâng cao</string>
|
||||
</resources>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<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.
|
||||
|
||||
This application was originally designed for programmers using Termux.
|
||||
Now perfect for everyday use.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source."</string> -->
|
||||
<string name="settings_activity_label">Unexpected Keyboard 设置</string>
|
||||
<string name="pref_portrait">在竖屏模式下</string>
|
||||
<string name="pref_landscape">在横屏模式下</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<string name="pref_extra_keys_title">选择要显示的按键</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_second_layout_title">第二键盘布局</string>
|
||||
<string name="pref_second_layout_none">无</string>
|
||||
<string name="pref_category_typing">输入</string>
|
||||
<string name="pref_swipe_dist_title">滑动触发距离</string>
|
||||
<string name="pref_swipe_dist_summary">输入按键四角的符号需要滑动的距离 (%s)</string>
|
||||
@@ -69,6 +74,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">非常长</string>
|
||||
<string name="pref_key_horizontal_space">按键的左右边距</string>
|
||||
<string name="pref_key_vertical_space">按键的上下边距</string>
|
||||
<!-- <string name="pref_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="key_action_next">下一项</string>
|
||||
<string name="key_action_done">完成</string>
|
||||
<string name="key_action_go">前往</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<string name="launcher_description">这是一个虚拟键盘软件。点击按钮进入系统设置,然后启用 Unexpected-Keyboard 即可使用。</string>
|
||||
<string name="launcher_sourcecode">这是一个免费且开源的软件。你可以在 Github 上找到源代码或者反馈 bug。</string>
|
||||
<string name="launcher_tryhere">启用键盘后,可以在这里测试效果:</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 & math symbols</string> -->
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
@@ -100,5 +110,4 @@
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">高级设置</string>
|
||||
</resources>
|
||||
|
@@ -7,6 +7,7 @@
|
||||
<item>latn_colemak</item>
|
||||
<item>latn_dvorak</item>
|
||||
<item>arab_alt</item>
|
||||
<item>arab_hamvaj_tly</item>
|
||||
<item>arab_pc</item>
|
||||
<item>arab_pc_ckb</item>
|
||||
<item>arab_pc_hindu</item>
|
||||
@@ -21,6 +22,7 @@
|
||||
<item>deva_alt</item>
|
||||
<item>deva_inscript</item>
|
||||
<item>grek_qwerty</item>
|
||||
<item>guj_phonetic_in</item>
|
||||
<item>hang_dubeolsik_kr</item>
|
||||
<item>hebr_1_il</item>
|
||||
<item>hebr_2_il</item>
|
||||
@@ -31,12 +33,15 @@
|
||||
<item>latn_qwerty_br</item>
|
||||
<item>latn_qwerty_cz</item>
|
||||
<item>latn_qwerty_es</item>
|
||||
<item>latn_qwerty_gb</item>
|
||||
<item>latn_qwerty_hu</item>
|
||||
<item>latn_qwerty_lv</item>
|
||||
<item>latn_qwerty_no</item>
|
||||
<item>latn_qwerty_pl</item>
|
||||
<item>latn_qwerty_ro</item>
|
||||
<item>latn_qwerty_se</item>
|
||||
<item>latn_qwerty_sk</item>
|
||||
<item>latn_qwerty_tly</item>
|
||||
<item>latn_qwerty_tr</item>
|
||||
<item>latn_qwerty_vi</item>
|
||||
<item>latn_qwertz</item>
|
||||
@@ -55,6 +60,7 @@
|
||||
<item>Colemak</item>
|
||||
<item>Dvorak</item>
|
||||
<item>Arabic Alt</item>
|
||||
<item>Talysh (تالشی همواج)</item>
|
||||
<item>Arabic PC</item>
|
||||
<item>Kurdish (کوردی)</item>
|
||||
<item>Arabic PC (Hindu numerals)</item>
|
||||
@@ -69,6 +75,7 @@
|
||||
<item>देवनागरी (हिंदी)-2</item>
|
||||
<item>देवनागरी (हिंदी)-1</item>
|
||||
<item>QWERTY (Greek)</item>
|
||||
<item>ગુજરાતી ફોનેટિક - Gujarati Phonetic</item>
|
||||
<item>두벌식 (Korean)</item>
|
||||
<item>Hebrew 1</item>
|
||||
<item>Hebrew 2</item>
|
||||
@@ -79,12 +86,15 @@
|
||||
<item>QWERTY (Brasileiro)</item>
|
||||
<item>QWERTY (Czech)</item>
|
||||
<item>QWERTY (Español)</item>
|
||||
<item>QWERTY (UK)</item>
|
||||
<item>QWERTY (Magyar)</item>
|
||||
<item>QWERTY (Latvian)</item>
|
||||
<item>QWERTY (Norwegian)</item>
|
||||
<item>QWERTY (Polski)</item>
|
||||
<item>QWERTY (Română)</item>
|
||||
<item>QWERTY (Swedish)</item>
|
||||
<item>QWERTY (Slovak)</item>
|
||||
<item>QWERTY (Talysh New Latin)</item>
|
||||
<item>QWERTY (Türkçe)</item>
|
||||
<item>QWERTY (Vietnamese)</item>
|
||||
<item>QWERTZ</item>
|
||||
@@ -103,6 +113,7 @@
|
||||
<item>@xml/latn_colemak</item>
|
||||
<item>@xml/latn_dvorak</item>
|
||||
<item>@xml/arab_alt</item>
|
||||
<item>@xml/arab_hamvaj_tly</item>
|
||||
<item>@xml/arab_pc</item>
|
||||
<item>@xml/arab_pc_ckb</item>
|
||||
<item>@xml/arab_pc_hindu</item>
|
||||
@@ -117,6 +128,7 @@
|
||||
<item>@xml/deva_alt</item>
|
||||
<item>@xml/deva_inscript</item>
|
||||
<item>@xml/grek_qwerty</item>
|
||||
<item>@xml/guj_phonetic_in</item>
|
||||
<item>@xml/hang_dubeolsik_kr</item>
|
||||
<item>@xml/hebr_1_il</item>
|
||||
<item>@xml/hebr_2_il</item>
|
||||
@@ -127,12 +139,15 @@
|
||||
<item>@xml/latn_qwerty_br</item>
|
||||
<item>@xml/latn_qwerty_cz</item>
|
||||
<item>@xml/latn_qwerty_es</item>
|
||||
<item>@xml/latn_qwerty_gb</item>
|
||||
<item>@xml/latn_qwerty_hu</item>
|
||||
<item>@xml/latn_qwerty_lv</item>
|
||||
<item>@xml/latn_qwerty_no</item>
|
||||
<item>@xml/latn_qwerty_pl</item>
|
||||
<item>@xml/latn_qwerty_ro</item>
|
||||
<item>@xml/latn_qwerty_se</item>
|
||||
<item>@xml/latn_qwerty_sk</item>
|
||||
<item>@xml/latn_qwerty_tly</item>
|
||||
<item>@xml/latn_qwerty_tr</item>
|
||||
<item>@xml/latn_qwerty_vi</item>
|
||||
<item>@xml/latn_qwertz</item>
|
||||
|
@@ -2,6 +2,13 @@
|
||||
<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.
|
||||
|
||||
This application was originally designed for programmers using Termux.
|
||||
Now perfect for everyday use.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source."</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Settings</string>
|
||||
<string name="pref_portrait">In portrait mode</string>
|
||||
<string name="pref_landscape">In landscape mode</string>
|
||||
@@ -28,8 +35,6 @@
|
||||
<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_second_layout_title">Secondary layout</string>
|
||||
<string name="pref_second_layout_none">None</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>
|
||||
@@ -69,6 +74,9 @@
|
||||
<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="key_action_next">Next</string>
|
||||
<string name="key_action_done">Done</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -80,7 +88,9 @@
|
||||
<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 an 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 & math symbols</string>
|
||||
<string name="key_descr_change_method">Switch keyboard</string>
|
||||
<string name="key_descr_voice_typing">Voice typing</string>
|
||||
@@ -100,6 +110,4 @@
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<!-- Unused -->
|
||||
<string name="pref_category_advanced">Advanced</string>
|
||||
</resources>
|
||||
|
@@ -11,7 +11,8 @@
|
||||
<attr name="colorLabel" format="color"/>
|
||||
<attr name="colorLabelActivated" format="color"/>
|
||||
<attr name="colorLabelLocked" format="color"/>
|
||||
<attr name="secondaryLightOffset" format="float"/>
|
||||
<attr name="secondaryDimming" format="float"/>
|
||||
<attr name="greyedDimming" format="float"/>
|
||||
<!-- Corner labels -->
|
||||
<attr name="colorSubLabel" format="color"/>
|
||||
<!-- Borders -->
|
||||
@@ -38,6 +39,8 @@
|
||||
<item name="keyBorderRadius">5dp</item>
|
||||
<item name="keyBorderWidth">0dp</item>
|
||||
<item name="keyBorderWidthActivated">0dp</item>
|
||||
<item name="secondaryDimming">0.25</item>
|
||||
<item name="greyedDimming">0.5</item>
|
||||
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
|
||||
<item name="emoji_key_text" type="color">?attr/colorLabel</item>
|
||||
</style>
|
||||
@@ -53,7 +56,6 @@
|
||||
<item name="colorLabelActivated">#3399ff</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#cccccc</item>
|
||||
<item name="secondaryLightOffset">-0.2</item>
|
||||
<item name="emoji_button_bg" type="color">#202020</item>
|
||||
<item name="emoji_color" type="color">#ffffff</item>
|
||||
</style>
|
||||
@@ -72,7 +74,6 @@
|
||||
<item name="colorLabelActivated">#0066cc</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="secondaryLightOffset">+0.3</item>
|
||||
<item name="emoji_button_bg">#dedede</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
@@ -91,7 +92,6 @@
|
||||
<item name="colorLabelActivated">#009dff</item>
|
||||
<item name="colorLabelLocked">#00ff26</item>
|
||||
<item name="colorSubLabel">#bbbbbb</item>
|
||||
<item name="secondaryLightOffset">-0.25</item>
|
||||
<item name="keyBorderRadius">1dp</item>
|
||||
<item name="emoji_button_bg">#000000</item>
|
||||
<item name="emoji_color">#ffffff</item>
|
||||
@@ -114,7 +114,6 @@
|
||||
<item name="colorLabelActivated">#0066cc</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="secondaryLightOffset">+0.35</item>
|
||||
<item name="emoji_button_bg">#ffffff</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
@@ -133,7 +132,6 @@
|
||||
<item name="colorLabelActivated">#000000</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="secondaryLightOffset">+0.35</item>
|
||||
<item name="emoji_button_bg">#ffffff</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
@@ -145,7 +143,6 @@
|
||||
<item name="colorLabel">#000000</item>
|
||||
<item name="colorLabelActivated">#ffffff</item>
|
||||
<item name="colorLabelLocked">#e65100</item>
|
||||
<item name="secondaryLightOffset">0.1</item>
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="keyBorderWidth">0.0dip</item>
|
||||
<item name="keyBorderWidthActivated">0.0dip</item>
|
||||
@@ -164,7 +161,6 @@
|
||||
<item name="colorLabel">#000000</item>
|
||||
<item name="colorLabelActivated">#ffffff</item>
|
||||
<item name="colorLabelLocked">#64ffda</item>
|
||||
<item name="secondaryLightOffset">0.0</item>
|
||||
<item name="colorSubLabel">#004d40</item>
|
||||
<item name="keyBorderWidth">0.0dip</item>
|
||||
<item name="keyBorderWidthActivated">0.0dip</item>
|
||||
|
@@ -2,7 +2,6 @@
|
||||
<resources>
|
||||
<dimen name="margin_top">3dp</dimen>
|
||||
<dimen name="key_padding">2dp</dimen>
|
||||
<dimen name="emoji_type_button_height">56dp</dimen>
|
||||
<dimen name="emoji_grid_height">250dp</dimen>
|
||||
<dimen name="emoji_text_size">28dp</dimen>
|
||||
<dimen name="pref_button_size">28dp</dimen>
|
||||
|
@@ -3,6 +3,6 @@
|
||||
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key width="1.1" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>
|
||||
<key width="1.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"/>
|
||||
</row>
|
||||
|
@@ -41,7 +41,7 @@
|
||||
<key width="1.2" key0="fn"/>
|
||||
<key width="2.8" key0="space" key1="superscript" key3="subscript"/>
|
||||
<key width="1.2" key0="0" key2="."/>
|
||||
<key width="1.2" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key width="1.2" key0="loc compose" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key width="1.2" key0="enter" key1="=" key2="action"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
@@ -9,12 +9,14 @@
|
||||
<subtype android:label="%s" android:languageTag="cs" android:imeSubtypeLocale="cs_CZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_cz,extra_keys=accent_aigu:á:é:í:ó:ú:ý|accent_ring:ů|accent_caron:č:ě:ň:ř:š:ž:ď:ť"/>
|
||||
<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:ä:ö:ü|ß|€"/>
|
||||
<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=£|€"/>
|
||||
<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_us,extra_keys=£|€"/>
|
||||
<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=£"/>
|
||||
<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:á:é:í:ó:ú|accent_tilde:ñ|accent_grave|accent_trema|€"/>
|
||||
<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-CA" android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù|accent_aigu:é|accent_circonflexe:â:ê:ô|accent_cedille:ç|accent_trema:ë:ï:ü:ÿ"/>
|
||||
<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:à:è:ù|accent_aigu:é|accent_circonflexe:â:ê:ô|accent_cedille:ç|accent_trema:ë:ï:ü:ÿ|€"/>
|
||||
<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:à:è:ù@a|accent_aigu:é@e|accent_circonflexe:â:ê:ô@e|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:à:è@a|accent_aigu:é@e|accent_circonflexe:â:ê:ô@e|accent_cedille:ç@c|accent_trema:ë:ï:ü@l|€"/>
|
||||
<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=₪|€"/>
|
||||
<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:á:é:í:ó:ú|accent_trema:ö:ü|accent_ogonek|accent_double_aigu:ő:ű|€"/>
|
||||
@@ -33,6 +35,8 @@
|
||||
<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="sk" android:imeSubtypeLocale="sk_SK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sk,extra_keys=accent_caron:ě:ř:ž:š:č:ň:ď:ľ:ť|accent_ring:ů|accent_circonflexe:ô|accent_trema:ä:ü:ö|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý"/>
|
||||
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_se,extra_keys=accent_aigu:á|accent_trema:ä:ö|accent_ring:å|€"/>
|
||||
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_AZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tly,extra_keys=á|ú|â|ê|ı|š|ž"/>
|
||||
<subtype android:label="%s" android:languageTag="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:ç:ş|accent_trema:ö:ü|accent_circonflexe:â:î:û|₺|ı|ğ"/>
|
||||
<subtype android:label="%s" android:languageTag="uk" android:imeSubtypeLocale="uk_UA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_jcuken_uk,extra_keys=ґ|є|і|ї|₴"/>
|
||||
<subtype android:label="%s" android:languageTag="vi" android:imeSubtypeLocale="vi_VN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_vi"/>
|
||||
|
@@ -30,7 +30,7 @@
|
||||
<key width="1.5" key0="switch_text" key2="ctrl"/>
|
||||
<key width="1.5" key0="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key width="0.75" key0="." key1=":" key2="," key3=";"/>
|
||||
<key width="0.75" key0="space" key1=""" key2="'" key4="_"/>
|
||||
<key width="0.75" key0="space" key1=""" key2="'" key3="loc compose" key4="_"/>
|
||||
<key width="1.5" key0="enter" key1="±" key2="action" key3="="/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
@@ -22,6 +22,6 @@
|
||||
<key shift="1.0" key0="*" key1="switch_text" key3="switch_numeric"/>
|
||||
<key key0="0" key3="+" key4="space"/>
|
||||
<key key0="\#" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key key0="enter" key2="action"/>
|
||||
<key key0="action" key2="enter"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
@@ -44,7 +44,10 @@
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="28" min="0" max="200"/>
|
||||
</PreferenceScreen>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.0" min="0.75" max="1.5"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="key_vertical_space" android:title="@string/pref_key_vertical_space" android:summary="%sdp" android:defaultValue="2" min="0" max="8"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="key_horizontal_space" android:title="@string/pref_key_horizontal_space" android:summary="%sdp" android:defaultValue="2" min="0" max="8"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_vertical_margin" android:title="@string/pref_key_vertical_space" android:summary="%s%%" android:defaultValue="1.5" min="0" max="5"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_horizontal_margin" android:title="@string/pref_key_horizontal_space" android:summary="%s%%" android:defaultValue="2" min="0" max="5"/>
|
||||
<CheckBoxPreference android:key="border_config" android:title="@string/pref_border_config_title" android:defaultValue="false"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="custom_border_radius" android:title="@string/pref_corners_radius_title" android:summary="%s%%" android:defaultValue="0" min="0" max="100" android:dependency="border_config"/>
|
||||
<juloo.keyboard2.prefs.SlideBarPreference android:key="custom_border_line_width" android:title="@string/pref_border_width_title" android:summary="%sdp" android:defaultValue="0" min="0" max="5" android:dependency="border_config"/>
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
8
srcs/compose/README.md
Normal file
8
srcs/compose/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Compose sequences
|
||||
|
||||
The `compose.py` program parses the compose sequences found in this directory
|
||||
and generates `srcs/juloo.keyboard2/ComposeKeyData.java`.
|
||||
|
||||
## `en_US_UTF_8_Compose.pre`
|
||||
|
||||
This file is copied from the `xorg` project. Copyright applies.
|
217
srcs/compose/compile.py
Normal file
217
srcs/compose/compile.py
Normal file
@@ -0,0 +1,217 @@
|
||||
import textwrap, sys, re, string, json
|
||||
|
||||
# Names not defined in Compose.pre
|
||||
xkb_char_extra_names = {
|
||||
"space": " ",
|
||||
"minus": "-",
|
||||
"asterisk": "*",
|
||||
"colon": ":",
|
||||
"equal": "=",
|
||||
"exclam": "!",
|
||||
"grave": "`",
|
||||
"parenleft": "(",
|
||||
"parenright": ")",
|
||||
"percent": "%",
|
||||
"period": ".",
|
||||
"plus": "+",
|
||||
"question": "?",
|
||||
"semicolon": ";",
|
||||
"underscore": "_",
|
||||
}
|
||||
|
||||
dropped_sequences = 0
|
||||
|
||||
# Parse XKB's Compose.pre files
|
||||
def parse_sequences_file_xkb(fname):
|
||||
# Parse a line of the form:
|
||||
# <Multi_key> <minus> <space> : "~" asciitilde # TILDE
|
||||
# Sequences not starting with <Multi_key> are ignored.
|
||||
line_re = re.compile(r'^((?:\s*<[^>]+>)+)\s*:\s*"((?:[^"\\]+|\\.)+)"\s*(\S+)?\s*(?:#.+)?$')
|
||||
char_re = re.compile(r'\s*<(?:U([a-fA-F0-9]{4,6})|([^>]+))>')
|
||||
def parse_seq_line(line):
|
||||
global dropped_sequences
|
||||
prefix = "<Multi_key>"
|
||||
if not line.startswith(prefix):
|
||||
return None
|
||||
m = re.match(line_re, line[len(prefix):])
|
||||
if m == None:
|
||||
return None
|
||||
def_ = m.group(1)
|
||||
try:
|
||||
def_ = parse_seq_chars(def_)
|
||||
result = parse_seq_result(m.group(2))
|
||||
except Exception as e:
|
||||
# print(str(e) + ". Sequence dropped: " + line.strip(), file=sys.stderr)
|
||||
dropped_sequences += 1
|
||||
return None
|
||||
return def_, result
|
||||
char_names = { **xkb_char_extra_names }
|
||||
# Interpret character names of the form "U0000" or using [char_names].
|
||||
def parse_seq_char(c):
|
||||
uchar, named_char = c
|
||||
if uchar != "":
|
||||
return chr(int(uchar, 16))
|
||||
# else is a named char
|
||||
if len(named_char) == 1:
|
||||
return named_char
|
||||
if not named_char in char_names:
|
||||
raise Exception("Unknown char: " + named_char)
|
||||
return char_names[named_char]
|
||||
# Interpret the left hand side of a sequence.
|
||||
def parse_seq_chars(def_):
|
||||
return list(map(parse_seq_char, re.findall(char_re, def_)))
|
||||
# Interpret the result of a sequence, as outputed by [line_re].
|
||||
def parse_seq_result(r):
|
||||
if len(r) == 2 and r[0] == '\\':
|
||||
return r[1]
|
||||
# The state machine can't represent characters that do not fit in a
|
||||
# 16-bit char. This breaks some sequences that output letters with
|
||||
# combined diacritics or emojis.
|
||||
if len(r) > 1 or ord(r[0]) > 65535:
|
||||
raise Exception("Char out of range: " + r)
|
||||
return r
|
||||
# Populate [char_names] with the information present in the file.
|
||||
with open(fname, "r") as inp:
|
||||
for line in inp:
|
||||
m = re.match(line_re, line)
|
||||
if m == None or m.group(3) == None:
|
||||
continue
|
||||
try:
|
||||
char_names[m.group(3)] = parse_seq_result(m.group(2))
|
||||
except Exception:
|
||||
pass
|
||||
# Parse the sequences
|
||||
with open(fname, "r") as inp:
|
||||
seqs = []
|
||||
for line in inp:
|
||||
s = parse_seq_line(line)
|
||||
if s != None:
|
||||
seqs.append(s)
|
||||
return seqs
|
||||
|
||||
# Parse from a json file containing a dictionary sequence → result string.
|
||||
def parse_sequences_file_json(fname):
|
||||
with open(fname, "r") as inp:
|
||||
seqs = json.load(inp)
|
||||
return list(seqs.items())
|
||||
|
||||
# Format of the sequences file is determined by its extension
|
||||
def parse_sequences_file(fname):
|
||||
if fname.endswith(".pre"):
|
||||
return parse_sequences_file_xkb(fname)
|
||||
if fname.endswith(".json"):
|
||||
return parse_sequences_file_json(fname)
|
||||
raise Exception(fname + ": Unsupported format")
|
||||
|
||||
# Turn a list of sequences into a trie.
|
||||
def add_sequences_to_trie(seqs, trie):
|
||||
def add_seq_to_trie(t_, seq, result):
|
||||
t_ = trie
|
||||
i = 0
|
||||
while i < len(seq) - 1:
|
||||
c = seq[i]
|
||||
if c not in t_:
|
||||
t_[c] = {}
|
||||
if isinstance(t_[c], str):
|
||||
global dropped_sequences
|
||||
dropped_sequences += 1
|
||||
print("Sequence collide: '%s = %s' '%s = %s'" % (
|
||||
seq[:i+1], t_[c], seq, result),
|
||||
file=sys.stderr)
|
||||
return
|
||||
t_ = t_[c]
|
||||
i += 1
|
||||
c = seq[i]
|
||||
t_[c] = result
|
||||
for seq, result in seqs:
|
||||
add_seq_to_trie(trie, seq, result)
|
||||
|
||||
# Compile the trie into a state machine.
|
||||
def make_automata(tree_root):
|
||||
states = []
|
||||
def add_tree(t):
|
||||
# Index and size of the new node
|
||||
i = len(states)
|
||||
s = len(t.keys())
|
||||
# Add node header
|
||||
states.append(("\0", s + 1))
|
||||
i += 1
|
||||
# Reserve space for the current node in both arrays
|
||||
for c in range(s):
|
||||
states.append((None, None))
|
||||
# Add nested nodes and fill the current node
|
||||
for c in sorted(t.keys()):
|
||||
node_i = len(states)
|
||||
add_node(t[c])
|
||||
states[i] = (c, node_i)
|
||||
i += 1
|
||||
def add_leaf(c):
|
||||
states.append((c, 1))
|
||||
def add_node(n):
|
||||
if type(n) == str:
|
||||
add_leaf(n)
|
||||
else:
|
||||
add_tree(n)
|
||||
add_tree(tree_root)
|
||||
return states
|
||||
|
||||
def batched(ar, n):
|
||||
i = 0
|
||||
while i + n < len(ar):
|
||||
yield ar[i:i+n]
|
||||
i += n
|
||||
if i < len(ar):
|
||||
yield ar[i:]
|
||||
|
||||
# Print the state machine compiled by make_automata into java code that can be
|
||||
# used by [ComposeKeyData.java].
|
||||
def gen_java(machine):
|
||||
chars_map = {
|
||||
# These characters cannot be used in unicode form as Java's parser
|
||||
# unescape unicode sequences before parsing.
|
||||
"\"": "\\\"",
|
||||
"\\": "\\\\",
|
||||
"\n": "\\n",
|
||||
"\r": "\\r",
|
||||
ord("\""): "\\\"",
|
||||
ord("\\"): "\\\\",
|
||||
ord("\n"): "\\n",
|
||||
ord("\r"): "\\r",
|
||||
}
|
||||
def char_repr(c):
|
||||
if c in chars_map:
|
||||
return chars_map[c]
|
||||
if type(c) == int: # The edges array contains ints
|
||||
return "\\u%04x" % c
|
||||
if c in string.printable:
|
||||
return c
|
||||
return "\\u%04x" % ord(c)
|
||||
def gen_array(array):
|
||||
chars = list(map(char_repr, array))
|
||||
return "\" +\n \"".join(map(lambda b: "".join(b), batched(chars, 72)))
|
||||
print("""package juloo.keyboard2;
|
||||
|
||||
/** This file is generated, see [srcs/compose/compile.py]. */
|
||||
|
||||
public final class ComposeKeyData
|
||||
{
|
||||
public static final char[] states =
|
||||
("%s").toCharArray();
|
||||
|
||||
public static final char[] edges =
|
||||
("%s").toCharArray();
|
||||
}""" % (
|
||||
# Break the edges array every few characters using string concatenation.
|
||||
gen_array(map(lambda s: s[0], machine)),
|
||||
gen_array(map(lambda s: s[1], machine)),
|
||||
))
|
||||
|
||||
total_sequences = 0
|
||||
trie = {}
|
||||
for fname in sys.argv[1:]:
|
||||
sequences = parse_sequences_file(fname)
|
||||
add_sequences_to_trie(sequences, trie)
|
||||
total_sequences += len(sequences)
|
||||
automata = make_automata(trie)
|
||||
gen_java(automata)
|
||||
print("Compiled %d sequences into %d states. Dropped %d sequences." % (total_sequences, len(automata), dropped_sequences), file=sys.stderr)
|
5249
srcs/compose/en_US_UTF_8_Compose.pre
Normal file
5249
srcs/compose/en_US_UTF_8_Compose.pre
Normal file
File diff suppressed because it is too large
Load Diff
104
srcs/juloo.keyboard2/Autonormalization.java
Normal file
104
srcs/juloo.keyboard2/Autonormalization.java
Normal file
@@ -0,0 +1,104 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.icu.text.Normalizer2;
|
||||
import android.view.inputmethod.InputConnection;
|
||||
|
||||
/** Compose the characters specified in [should_normalize_char()] using unicode
|
||||
normalization. The composing region is used to mark text where
|
||||
normalization could happen if more characters are typed. */
|
||||
public final class Autonormalization
|
||||
{
|
||||
/** Composing text waiting for more combinations. */
|
||||
StringBuilder _c = new StringBuilder();
|
||||
InputConnection _ic = null;
|
||||
Normalizer2 _normalizer_cached = null;
|
||||
|
||||
public Autonormalization() {}
|
||||
|
||||
public void started(EditorInfo info, InputConnection ic)
|
||||
{
|
||||
_ic = ic;
|
||||
_c.setLength(0);
|
||||
}
|
||||
|
||||
/** If the characters could combine with a following character, update the
|
||||
composing text and return [true]. If the typed chars can't combine, flush
|
||||
the composing text and return [false], without committing the text. */
|
||||
public boolean typed(CharSequence s)
|
||||
{
|
||||
if (_ic == null || s.length() == 0)
|
||||
return false;
|
||||
if (should_normalize_char(s.charAt(0)))
|
||||
{
|
||||
type_normalized(s);
|
||||
return true;
|
||||
}
|
||||
flush();
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Handle key events, might flush the composing text. Do not call [typed]. */
|
||||
public void key_up(KeyValue kv)
|
||||
{
|
||||
switch (kv.getKind())
|
||||
{
|
||||
// [typed] will be called later
|
||||
case Char:
|
||||
case String: break;
|
||||
// Do not change the composing text for these keys
|
||||
case Modifier:
|
||||
case Compose_pending: break;
|
||||
// The other keys flush the composing text
|
||||
case Event:
|
||||
case Keyevent:
|
||||
case Editing:
|
||||
flush();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/** If [typed()] has been called before, [flush()] must be called before
|
||||
sending any other command to the [InputConnection]. */
|
||||
void flush()
|
||||
{
|
||||
if (_ic == null)
|
||||
return;
|
||||
_c.setLength(0);
|
||||
_ic.finishComposingText();
|
||||
}
|
||||
|
||||
Normalizer2 normalizer()
|
||||
{
|
||||
if (_normalizer_cached == null)
|
||||
_normalizer_cached = Normalizer2.getNFKCInstance();
|
||||
return _normalizer_cached;
|
||||
}
|
||||
|
||||
void type_normalized(CharSequence s)
|
||||
{
|
||||
Normalizer2 norm = normalizer();
|
||||
norm.normalizeSecondAndAppend(_c, s);
|
||||
/* Only keep the string of normalizable character at the end of [_c].
|
||||
Commit the rest. */
|
||||
int i = _c.length() - 1;
|
||||
while (i > 0 && should_normalize_char(_c.charAt(i)))
|
||||
i--;
|
||||
if (i > 0)
|
||||
{
|
||||
_ic.commitText(_c.subSequence(0, i), 1);
|
||||
_c.delete(0, i);
|
||||
}
|
||||
_ic.setComposingText(_c, 1);
|
||||
}
|
||||
|
||||
/** Characters for which autonormalization will happen. */
|
||||
boolean should_normalize_char(char c)
|
||||
{
|
||||
return (c >= '\u1100' && c <= '\u11FF') // Hangul Jamo
|
||||
|| (c >= '\u3130' && c <= '\u318F') // Hangul Compatibility Jamo
|
||||
|| (c >= '\uA960' && c <= '\uA97F') // Hangul Jamo Extended-A
|
||||
|| (c >= '\uD7B0' && c <= '\uD7FF') // Hangul Jamo Extended-B
|
||||
;
|
||||
}
|
||||
}
|
62
srcs/juloo.keyboard2/ComposeKey.java
Normal file
62
srcs/juloo.keyboard2/ComposeKey.java
Normal file
@@ -0,0 +1,62 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public final class ComposeKey
|
||||
{
|
||||
/** Apply the pending compose sequence to [kv]. Returns [null] if [kv] is not
|
||||
part of the pending sequence. */
|
||||
public static KeyValue apply(int state, KeyValue kv)
|
||||
{
|
||||
switch (kv.getKind())
|
||||
{
|
||||
case Char:
|
||||
KeyValue res = apply(state, kv.getChar());
|
||||
// Dim characters not part of any sequence instead of removing them.
|
||||
if (res == null)
|
||||
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
|
||||
return res;
|
||||
/* These keys must not be removed. */
|
||||
case Event:
|
||||
case Modifier:
|
||||
return kv;
|
||||
/* These keys cannot be part of sequences. */
|
||||
case String:
|
||||
case Keyevent:
|
||||
case Editing:
|
||||
case Placeholder:
|
||||
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
|
||||
case Compose_pending: return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Apply the pending compose sequence to char [c]. */
|
||||
static KeyValue apply(int state, char c)
|
||||
{
|
||||
char[] states = ComposeKeyData.states;
|
||||
char[] edges = ComposeKeyData.edges;
|
||||
int length = edges[state];
|
||||
int next = Arrays.binarySearch(states, state + 1, state + length, c);
|
||||
if (next < 0)
|
||||
return null;
|
||||
next = edges[next];
|
||||
// The next state is the end of a sequence, show the result.
|
||||
if (edges[next] == 1)
|
||||
return KeyValue.makeCharKey(states[next]);
|
||||
return KeyValue.makeComposePending(String.valueOf(c), next, 0);
|
||||
}
|
||||
|
||||
/** The [states] array represents the different states and their transition.
|
||||
A state occupies one or several cells of the array:
|
||||
- The first cell is the result of the compose sequence if the state is of
|
||||
size 1, unspecified otherwise.
|
||||
- The remaining cells are the transitions, sorted alphabetically.
|
||||
|
||||
The [edges] array represents the transition state corresponding to each
|
||||
accepted inputs.
|
||||
Id [states[i]] is the first cell of a state, [edges[i]] is the number of
|
||||
cells occupied by the state [i].
|
||||
If [states[i]] is a transition, [edges[i]] is the index of the state to
|
||||
jump into. */
|
||||
}
|
150
srcs/juloo.keyboard2/ComposeKeyData.java
Normal file
150
srcs/juloo.keyboard2/ComposeKeyData.java
Normal file
@@ -0,0 +1,150 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
/** This file is generated, see [srcs/compose/compile.py]. */
|
||||
|
||||
public final class ComposeKeyData
|
||||
{
|
||||
public static final char[] states =
|
||||
("\u0000 !\"#%'()*+,-./01234578:;<=>?ABCDEFGHIKLMNOPQRSTUVWXYZ[\\]^_`abcdefghiklm" +
|
||||
"noprstuvwxyz{|~\u00a8\u00af\u00b4\u00b8\u00f7\u02d8\u05b7\u05c1\u05c2\u0654\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\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\u2272\u2273\u2276\u2277\u227a\u227b\u227c\u227d\u2282\u2283\u2286\u2287\u2291\u2292\u22a4" +
|
||||
"\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" +
|
||||
"wyz\u00a1\u0000OUou\u1ee2\u1ef0\u1ee3\u1ef1\u203d\u1ea0\u1e04\u1e0c\u1eb8\u1e24\u1eca\u1e32\u1e36\u1e42\u1e46\u1ecc\u1e5a\u1e62\u1e6c\u1ee4\u1e7e\u1e88\u1ef4\u1e92\u00a6\u1ea1\u1e05\u1e0d\u1eb9\u1e25\u1ecb\u1e33\u1e37\u1e43\u1e47\u1ecd\u1e5b\u1e63\u1e6d\u1ee5\u1e7f\u1e89\u1ef5\u1e93\u0000 \"',<>AEHIOUWXY_ae" +
|
||||
"hiotuwxy~\u00af\u00b4\u00d5\u00f5\u03d2\u04d8\u04d9\u04e8\u04e9\u00a8\u00a8\u0344\u201e\u201c\u201d\u00c4\u00cb\u1e26\u00cf\u00d6\u00dc\u1e84\u1e8c\u0178\u0000Uu\u1e7a\u1e7b\u00e4\u00eb\u1e27\u00ef\u00f6\u1e97\u00fc\u1e85\u1e8d\u00ff\u0000Oo\u1e4e\u1e4f\u0000Uu\u1e7a\u1e7b\u0344\u1e4e\u1e4f\u03d4\u04da\u04db\u04ea\u04eb\u0000#ESbe" +
|
||||
"fq\u266f\u266b\u266c\u266d\u266a\u266e\u2669\u0000o\u2030\u0000\"'+,/<>ACEGIKLMNOPRSUWYZ^_abcegiklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00dc\u00e2\u00e5\u00e6" +
|
||||
"\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u2395\u0000 IUiu\u0385\u1e2e\u01d7\u1e2f\u01d8\u00b4\u0000OUou\u1eda\u1ee8\u1edb\u1ee9\u201a\u0000Oo\u01fe\u01ff\u2018\u2019\u00c1\u0106\u00c9\u01f4\u00cd\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000AEOaeo\u1ea4\u1ebe\u1ed0\u1ea5\u1ebf\u1ed1\u0000EOeo" +
|
||||
"\u1e16\u1e52\u1e17\u1e53\u00e1\u0000Aa\u1eae\u1eaf\u0107\u00e9\u01f5\u00ed\u1e31\u013a\u1e3f\u0144\u00f3\u1e55\u0155\u015b\u00fa\u1e83\u00fd\u017a\u0000OUou\u1e4c\u1e78\u1e4d\u1e79\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u0000Cc\u1e08\u1e09\u1ea4\u01fa\u01fc\u1e08\u1ebe\u1e2e\u1ed0\u1e4c\u01d7\u1ea5\u01fb\u01fd\u1e09\u1ebf\u1e2f\u1ed1\u1e4d\u01ff\u01d8\u235e\u0000 (" +
|
||||
"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110b\u110c" +
|
||||
"\u110e\u110f\u1110\u1111\u1112\u30f0\u30f1\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\u02d8[{\u0000)\u24ea\u0000)01234567" +
|
||||
"89\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\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)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)\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)\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)\u24e5\u0000)\u24e6\u0000)\u24e7\u0000)\u24e8\u0000)\u24e9\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)\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)\u32fc\u0000)\u32fd\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\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\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)-]}\u0000'0AUau\u00a8\u25cb\u0000Aa\u01fa\u01fb\u00b0\u00c5\u016e\u00e5\u016f\u2363\u235f\u0000+-OUou#\u00b1\u01a0\u01af\u01a1\u01b0\u0000 \"',-ACDEGHIKLNORSTU" +
|
||||
"acdeghiklnorstu\u00b8\u201e\u201a\u00b8\u00ac\u0104\u00c7\u1e10\u0118\u0122\u1e28\u012e\u0136\u013b\u0145\u01ea\u0156\u015e\u0162\u0172\u0105\u00e7\u1e11\u0119\u0123\u1e29\u012f\u0137\u013c\u0146\u01eb\u0157\u015f\u0163\u0173\u0000 ()+,-/:>ADEIKLOU\\^_a" +
|
||||
"deilou\u2191\u2193\u25cb~{}\u00b1\u00ac\u0000 -.\u00ad\u2014\u2013\u233f\u00f7\u2192\u0100\u0110\u0112\u012a\u20ad\u00a3\u014c\u016a\u2340\u00af\u2212\u0101\u0111\u0113\u012b\u00a3\u014d\u016b\u234f\u2356\u2296\u0000 !'-.:<=>ABCDEFGHIMNOPRSTW" +
|
||||
"XYZ^abcdefghimnoprstwxyz\u00b4\u017f\u1e62\u1e63\u25cb\u02d9\u0000Ss\u1e68\u1e69\u0000Ss\u1e64\u1e65\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\u00b7\u0227\u1e03\u010b\u1e0b\u0117" +
|
||||
"\u1e1f\u0121\u1e23\u0131\u1e41\u1e45\u022f\u1e57\u1e59\u1e61\u1e6b\u1e87\u1e8b\u1e8f\u017c\u0000Ss\u1e64\u1e65\u1e9b\u1e68\u1e69\u2299\u0000-/<=BCDGHILOTZ^bcdghilmotuvz\u0294\u04ae\u04af\u2194\u2395\u233f\\\\\u2260\u0243\u20a1\u0110\u01e4\u0126\u0197\u0141\u00d8\u0166\u01b5" +
|
||||
"|\u0180\u00a2\u0111\u01e5\u0127\u0268\u0142\u20a5\u00f8\u0167\u00b5\u221a\u01b6\u02a1\u04b0\u04b1\u21ae\u2341\u0000*3~\u00b0\u2189\u236c\u0000123456789^\u00000\u2152\u00bd\u2153\u00bc\u2155\u2159\u2150\u215b\u2151\u00b9\u000035^\u2154\u2156\u00b2\u0000458^\u00be\u2157\u215c\u00b3\u00005\u2158\u000068\u215a" +
|
||||
"\u215d\u00008\u215e\u00008\u221e\u0000()-.\u2395\u2639\u263a\u00f7\u2234\u2360\u0000 AEIOSTU_aeiostu\u02db\u0104\u0118\u012e\u01ea\u0218\u021a\u0172\u236e\u0105\u0119\u012f\u01eb\u0219\u021b\u0173\u0000 \"'-/3<=>CDELNRSTZ_c" +
|
||||
"delnrstz\u2395\u02c7\u201c\u2018\u2190\u226e\u2665\u00ab\u2264\u22c4\u010c\u010e\u011a\u013d\u0147\u0158\u0160\u0164\u017d\u2264\u010d\u010f\u011b\u013e\u0148\u0159\u0161\u0165\u017e\u2343\u0000/<>CELNOPRTUWY^_cdeopruvy\u2395\u2260\u21d0\u21d2\u20ac\u20ac\u20a4\u20a6" +
|
||||
"\u0150\u20bd\u20b9\u20ae\u0170\u20a9\u00a5\u21d1\u2261\u20ac\u20ab\u20ac\u0151\u20bd\u20b9\u0171\u21d3\u00a5\u2338\u0000 \"'/<=>AEIOU_aeiou\u00a8\u2395^\u201d\u2019\u226f\u22c4\u2265\u00bb\u00c2\u00ca\u00ce\u00d4\u00db\u2265\u00e2\u00ea\u00ee\u00f4\u00fb\u2369\u2344\u0000!+?AEIOUY\\^" +
|
||||
"abeiouy\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u2395\u2e18\u0000OUou\u1ede\u1eec\u1edf\u1eed\u00bf\u1ea2\u1eba\u1ec8\u1ece\u1ee6\u1ef6\u262d\u0000AEOaeo\u1ea8\u1ec2\u1ed4\u1ea9\u1ec3\u1ed5\u1ea3\u0000Aa\u1eb2\u1eb3\u1ebb\u1ec9\u1ecf\u1ee7\u1ef7\u1ea8\u1ec2\u1ed4\u1ea9\u1ec3\u1ed5\u2370\u0000\"'(*,-;>" +
|
||||
"AET^_`~\u00a8\u00b4\u00c4\u00c1\u0102\u00c5\u0104\u0100\u0104\u00c2\u00c5\u00c6@\u00c2\u0100\u00c0\u00c3\u00c4\u00c1\u0000.|\u1e02\u0e3f\u0000',./<=CEOr|\u0106\u00c7\u010a\u20a1\u010c\u20ac\u2102\u20a0\u00a9\u20a2\u20b5\u0000,-.<H\u1e10\u0110\u1e0a\u010e\u00d0\u0000\"',-.;" +
|
||||
"<=>E^_`\u00a8\u00b4\u00cb\u00c9\u0118\u0112\u0116\u0118\u011a\u20ac\u00ca\u018f\u00ca\u0112\u00c8\u00cb\u00c9\u0000.ilr\u1e1e\ufb03\ufb04\u20a3\u0000(,.TU|\u02d8\u011e\u0122\u0120>\u011e\u20b2\u011e\u0000,\u1e28\u0000\"',-.;>J^_`j~\u00a8\u00b4\u00cf\u00cd\u012e\u012a\u0130" +
|
||||
"\u012e\u00ce\u0132\u00ce\u012a\u00cc\u0132\u0128\u00cf\u00cd\u0000,-\u0136\u20ad\u0000',-/<=TV\u0139\u013b\u00a3\u0141\u013d\u20a4<|\u0000.\u1e40\u0000',<=GNOo~\u0143\u0145\u0147\u20a6\u014a\u2115\u2116\u2116\u00d1\u0000\"',-/;>ACERSXY^_`" +
|
||||
"~\u00a8\u00b4\u00d6\u00d3\u01ea\u014c\u00d8\u01ea\u00d4\u24b6\u00a9\u0152\u00ae\u00a7\u00a4\u262e\u00d4\u014c\u00d2\u00d5\u00d6\u00d3\u0000!.=Pt\u00b6\u1e56\u20bd\u00b6\u20a7\u0000Q\u211a\u0000',<=ORs\u0154\u0156\u0158\u20b9\u00ae\u211d\u20a8\u0000!',.;<MOS|\u00a7\u015a\u015e\u1e60\u0218\u0160\u2120\u00a7\u1e9e" +
|
||||
"$\u0000,-./;<=HM\u0162\u0166\u1e6a\u0166\u021a\u0164\u20ae\u00de\u2122\u0000 !\"'*,-;>AEGIOU^_`aegiou~\u00a8\u00b4\u00b8\u0000,\u0000Ee\u1e1c\u1e1d\u0000Aa\u1eb6\u1eb7\u00dc\u00da\u016e\u0172\u016a\u0172\u00db\u0102\u0114\u011e\u012c" +
|
||||
"\u014e\u016c\u00db\u016a\u00d9\u0103\u0115\u011f\u012d\u014f\u016d\u0168\u00dc\u00da\u0000Ee\u1e1c\u1e1d\u0000L|\u0000=^\u20a9\u0174\u0000O\u00a4\u0000\"'=^\u00a8\u00b4\u0178\u00dd\u00a5\u0176\u0178\u00dd\u0000'.<Z\u0179\u017b\u017d\u2124\u0000]\u2337\u0000-?\u2395\u25cb\u2340\u262d\u2342\u2349\u0000[\u2337\u0000!()+" +
|
||||
"-./0123456789=ACEGHIJOSUWYZ_aceghijosuwyz|\u1eb8\u1eb9\u1ecc\u1ecd\u2212\u4e00\u4e01\u4e09\u4e0a\u4e0b\u4e19\u4e2d\u4e59\u4e8c\u4eba\u56db\u5730\u5929\u7532\u0000AEOaeo\u1eac\u1ec6\u1ed8\u1ead" +
|
||||
"\u1ec7\u1ed9\u207d\u207e\u207a\u207b\u00b7|\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207c\u00c2\u0108\u00ca\u011c\u0124\u00ce\u0134\u00d4\u015c\u00db\u0174\u0176\u1e90\u0000ahijlnorswxy\u0263\u0266\u0279\u027b\u0281\u0295\u00aa\u02b0\u2071\u02b2\u02e1\u207f\u00ba\u02b3\u02e2\u02b7\u02e3\u02b8\u02e0\u02b1\u02b4\u02b5\u02b6\u02e4\u00e2\u0109\u00ea" +
|
||||
"\u011d\u0125\u00ee\u0135\u00f4\u015d\u00fb\u0175\u0177\u1e91\u2191\u1ec6\u1ec7\u1ed8\u1ed9\u207b\u3192\u319c\u3194\u3196\u3198\u319b\u3197\u319a\u3193\u319f\u3195\u319e\u319d\u3199\u0000 !\"'()+-.0123456789;<=>AEGIOUY^_aegiouy~\u00c4" +
|
||||
"\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u1e36\u1e37\u1e5a\u1e5b\u2206\u220a\u2212\u2218\u2260\u2282\u2283\u22a5\u22c4\u2373\u2375\u237a\u25cb\u00af\u0000LRlr\u1e38\u1e5c\u1e39\u1e5d\u0000AOUaou\u01de\u022a\u01d5\u01df\u022b\u01d6\u2358\u208d\u208e\u208a\u208b\u0000AOao\u01e0\u0230\u01e1\u0231\u2080\u2081\u2082\u2083\u2084\u2085\u2086" +
|
||||
"\u2087\u2088\u2089\u0000Oo\u01ec\u01ed\u2264\u208c\u2265\u0100\u0112\u1e20\u012a\u014c\u016a\u0232\u00af\u00af\u0101\u0113\u1e21\u012b\u014d\u016b\u0233\u0000Oo\u022c\u022d\u01de\u01e2\u022c\u022a\u01d5\u01df\u01e3\u022d\u022b\u01d6\u01e0\u01e1\u1e38\u1e39\u1e5c\u1e5d\u2359\u2377\u208b\u235b\u2262\u2286\u2287\u234a\u235a\u2378\u2379\u2376\u235c\u0000\"+AEINOUWY" +
|
||||
"^_abeinouwy\u00af\u00c2\u00ca\u00d4\u00dc\u00e2\u00ea\u00f4\u00fc\u0000Uu\u01db\u01dc\u0000OUou\u1edc\u1eea\u1edd\u1eeb\u00c0\u00c8\u00cc\u01f8\u00d2\u00d9\u1e80\u1ef2\u0000AEOaeo\u1ea6\u1ec0\u1ed2\u1ea7\u1ec1\u1ed3\u0000EOeo\u1e14\u1e50\u1e15\u1e51\u00e0\u0000Aa\u1eb0\u1eb1\u00e8\u00ec" +
|
||||
"\u01f9\u00f2\u00f9\u1e81\u1ef3\u0000EOeo\u1e14\u1e50\u1e15\u1e51\u1ea6\u1ec0\u1ed2\u01db\u1ea7\u1ec1\u1ed3\u01dc\u0000\"'(*,-;>^_`ae~\u00a8\u00b4\u00e4\u00e1\u0103\u00e5\u0105\u0101\u0105\u00e2\u00e2\u0101\u00e0\u00e5\u00e6\u00e3\u00e4\u00e1\u0000!,.AEGIOUaegiou\u00b8" +
|
||||
"\u0000Aa\u1eb6\u1eb7\u0000Ee\u1e1c\u1e1d\u1e03\u0102\u0114\u011e\u012c\u014e\u016c\u0103\u0115\u011f\u012d\u014f\u016d\u0000Ee\u1e1c\u1e1d\u0000\"',./<=ACDEGHIKLNORSTUZacdeghijklnorstuz|\u00dc\u00fc" +
|
||||
"\u0000Uu\u01d9\u01da\u0107\u00e7\u010b\u00a2\u010d\u20ac\u01cd\u010c\u010e\u011a\u01e6\u021e\u01cf\u01e8\u013d\u0147\u01d1\u0158\u0160\u0164\u01d3\u017d\u01ce\u010d\u010f\u011b\u01e7\u021f\u01d0\u01f0\u01e9\u013e\u0148\u01d2\u0159\u0161\u0165\u01d4\u017e\u00a2\u01d9\u01da\u0000,-.<=hi\u1e11\u0111\u1e0b\u010f\u20ab\u00f0\u2300\u0000\"',-.;<=>" +
|
||||
"^_`e\u00a8\u00b4\u00eb\u00e9\u0119\u0113\u0117\u0119\u011b\u20ac\u00ea\u00ea\u0113\u00e8\u0259\u00eb\u00e9\u0000.Sfils\u1e1f\u017f\ufb00\ufb01\ufb02\u017f\u0000(,.Ut\u02d8\u011f\u0123\u0121\u011f>\u011f\u0000,\u1e29\u0000\"',-.;>^_`j~\u00a8\u00b4\u00ef\u00ed\u012f\u012b\u0131\u012f\u00ee" +
|
||||
"\u00ee\u012b\u00ec\u0133\u0129\u00ef\u00ed\u0000,k\u0137\u0138\u0000',-/<tv\u013a\u013c\u00a3\u0142\u013e<|\u0000./u\u1e41\u20a5\u00b5\u0000',<g~\u0144\u0146\u0148\u014b\u00f1\u0000\"',-/;>AU^_`aceorsuwxy~\u00a8\u00b4\u00f6" +
|
||||
"\u00f3\u01eb\u014d\u00f8\u01eb\u00f4\u00c5\u016e\u00f4\u014d\u00f2\u00e5\u00a9\u0153\u00b0\u00ae\u00a7\u016f\u1e98\u00a4\u1e99\u00f5\u00f6\u00f3\u0000!.=\u00b6\u1e57\u20bd\u0000',<=\u0155\u0157\u0159\u20b9\u0000!',.;<mos\u00b8\u00a7\u015b\u015f\u1e61\u0219\u0161\u2120\u00a7\u00df\u015f\u0000,-./;<hm\u0163\u0167" +
|
||||
"\u1e6b\u0167\u021b\u0165\u00fe\u2122\u0000\"'*,-/;>AEGIOU^_`aegiou~\u00a8\u00b4\u00fc\u00fa\u016f\u0173\u016b\u00b5\u0173\u00fb\u0102\u0114\u011e\u012c\u014e\u016c\u00fb\u016b\u00f9\u0103\u0115\u011f\u012d\u014f\u016d\u0169\u00fc\u00fa\u0000/ACDEGHIKNOR" +
|
||||
"STUZacdeghijklnorstuz|\u221a\u01cd\u010c\u010e\u011a\u01e6\u021e\u01cf\u01e8\u0147\u01d1\u0158\u0160\u0164\u01d3\u017d\u01ce\u010d\u010f\u011b\u01e7\u021f\u01d0\u01f0\u01e9|\u0148\u01d2\u0159\u0161\u0165\u01d4\u017e\u2193\u0000^\u0175\u0000ox\u00a4\u00d7\u0000\"'=^\u00a8\u00b4\u00ff" +
|
||||
"\u00fd\u00a5\u0177\u00ff\u00fd\u0000'.<\u017a\u017c\u017e\u0000}\u2205\u0000-=BCGS^cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u0e3f\u20b5\u20b2$\u2191\u00a2\u2193\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000+0AEINOUVY^abeinouvy|" +
|
||||
"~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u2207\u2227\u2228\u0000OUou\u1ee0\u1eee\u1ee1\u1eef\u236c\u00c3\u1ebc\u0128\u00d1\u00d5\u0168\u1e7c\u1ef8\u0000AEOaeo\u1eaa\u1ec4\u1ed6\u1eab\u1ec5\u1ed7\u00e3\u0000Aa\u1eb4\u1eb5\u1ebd\u0129\u00f1\u00f5\u0169\u1e7d\u1ef9\u236d\u2248\u2368\u1eaa\u1ec4\u1ed6\u1eab\u1ec5\u1ed7\u236b\u2372\u2371\u0000'*>A" +
|
||||
"EIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u0385\u2363\u2369\u00c4\u00cb\u00cf\u00d6\u00dc\u0178\u1fed\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u1fc1\u0385\u2362\u2364\u2361\u2365\u0000!\".;AEGIOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227" +
|
||||
"\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000LRlr\u1e38\u1e5c\u1e39\u1e5d\u0000AOUaou\u01de\u022a\u01d5\u01df\u022b\u01d6\u0000AOao\u01e0\u0230\u01e1\u0231\u0000Oo\u01ec\u01ed\u0100\u0112\u1e20\u012a\u014c\u016a\u0232\u0101\u0113\u1e21\u012b\u014d\u016b\u0233\u0000Oo\u022c\u022d\u01de\u01e2\u022c\u022a\u01d5\u01df\u01e3\u022d\u022b\u01d6\u01e0\u01e1" +
|
||||
"\u1e38\u1e39\u1e5c\u1e5d\u2351\u0000\"+,/ACEGIKLMNOPRSUWYZ^_abcegiklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0000IU" +
|
||||
"iu\u1e2e\u01d7\u1e2f\u01d8\u0000OUou\u1eda\u1ee8\u1edb\u1ee9\u0000Cc\u1e08\u1e09\u0000Oo\u01fe\u01ff\u00c1\u0106\u00c9\u01f4\u00cd\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000AEOaeo\u1ea4\u1ebe\u1ed0\u1ea5\u1ebf\u1ed1\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u00e1\u0000Aa\u1eae\u1eaf\u0107\u00e9" +
|
||||
"\u01f5\u00ed\u1e31\u013a\u1e3f\u0144\u00f3\u1e55\u0155\u015b\u00fa\u1e83\u00fd\u017a\u0000OUou\u1e4c\u1e78\u1e4d\u1e79\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u0000Cc\u1e08\u1e09\u1ea4\u01fa\u01fc\u1e08\u1ebe\u1e2e\u1ed0\u1e4c\u01d7\u1ea5\u01fb\u01fd\u1e09\u1ebf\u1e2f\u1ed1\u1e4d\u01ff\u01d8\u0000CDEGHKLNRSTcdeg" +
|
||||
"hklnrst\u00c7\u1e10\u0228\u0122\u1e28\u0136\u013b\u0145\u0156\u015e\u0162\u00e7\u1e11\u0229\u0123\u1e29\u0137\u013c\u0146\u0157\u015f\u0163\u0000\u2395\u2339\u0000Gg\u011e\u011f\u0000\u05f2\ufb1f\u0000\ufb49\ufb2c\u0000\ufb49\ufb2d\u0000\u06c1\u06d2\u06d5\u06c2\u06d3\u06c0\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\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\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\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\u112c\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\u1134\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\u1122\u1123\u1124\u1125" +
|
||||
"\u1126\u0000\u1100\u1133\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\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\u116b\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\u118b\u1170\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\u11c4\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\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\u11cc\u0000\u11a8\u11ba\u11d1\u11d2\u0000\u11ba\u11bc\u11c2\u11d3\u11d5\u11d4\u0000\u11ba\u11d6\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\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\u11de\u0000\u11a8\u11ed\u0000\u11ba\u11eb\u11f1\u11f2\u0000|\u2395\u2345\u2347\u0000-\u2395\u234f\u2350\u0000|\u2395\u2346\u2348\u0000-\u2395\u2356\u2357\u0000/\u2204\u0000_|\u2395\u2359\u234b\u234d\u0000|~\u00a8\u2395\u2352\u236b\u2362\u2354\u0000/\u2209\u0000_\u2377" +
|
||||
"\u0000/\u220c\u0000_\u00a8\u2229\u22a4\u22a5\u2395\u25cb\u235b\u2364\u235d\u2355\u234e\u233b\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2372\u22c4\u2353\u0000~\u2227\u2395\u2371\u22c4\u234c\u0000\u2218\u235d\u0000|\u2366\u0000/\u2241\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u2262\u236f\u0000/\u2274\u0000/\u2275\u0000/\u2278\u0000/" +
|
||||
"\u2279\u0000/\u2280\u0000/\u2281\u0000/\u22e0\u0000/\u22e1\u0000_|\u2286\u2367\u0000_\u2287\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000\u00a8\u00af\u2218\u22a5\u2361\u2351\u2355\u2336\u0000_\u2218\u22a4\u234a\u234e\u2336\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000/\u22ec\u0000/\u22ed\u0000_" +
|
||||
"\u2395\u235a\u233a\u0000_\u2378\u0000_\u2379\u0000_\u2376\u0000'/:<=>?\\\u00f7\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u235e\u2341\u2360\u2343\u2338\u2344\u2370\u2342\u2339\u2347\u2350\u2348\u2357\u234d\u2354\u233b\u2353\u234c\u236f\u233a\u233c\u0000*-.\\_|\u00a8\u2218\u2395\u235f\u2296\u2299\u2349\u235c\u233d\u2365" +
|
||||
"\u233e\u233c\u0000/\u2adc").toCharArray();
|
||||
|
||||
public static final char[] edges =
|
||||
("\u00e7\u00e7\u00f8\u0155\u01aa\u01b9\u01bc\u0285\u0564\u0569\u057e\u058b\u05d2\u0615\u0690\u06d3\u06da\u06f1\u06f8\u0701\u0704\u0709\u070c\u070f\u071a\u073b\u0776\u07ab\u07d4\u081f\u0842\u0847\u085e\u0869\u0888\u0891\u08a0\u08a3\u08c2\u08c7\u08d8\u08db\u08ee\u0917\u0922\u0925\u0934\u0949\u095c\u09a3\u09a6\u09ab\u09ae\u09bb\u09c4\u09c7\u09d0\u09d3\u0a86\u0b35\u0b9e\u0bbf\u0bec\u0c47\u0c56\u0c75\u0c82\u0c8f\u0c92\u0caf\u0cb4\u0cc3" +
|
||||
"\u0cca\u0cd5\u0d08\u0d0f\u0d18\u0d2d\u0d3e\u0d73\u0db8\u0dbb\u0dc0\u0dcd\u0dd4\u0dd7\u0dfa\u0e53\u0e80\u0eed\u0fb0\u0fdd\u0fe0\u0fe5\u0fe8\u0feb\u0fee\u0ff5\u100c\u1013\u1018\u1025\u102a\u1031\u1036\u1039\u103c\u103f\u1042\u1049\u104c\u1051\u1054\u105b\u105e\u1065\u1068\u106b\u106e\u1071\u1074\u1077\u107a\u107d\u1080\u108b\u108e\u1091\u109a\u109f\u10a8\u10ad\u10ce\u10d1\u10f2\u10f5\u110c\u1111\u1116\u111b\u111e\u1129\u112c\u112f" +
|
||||
"\u1132\u1135\u1138\u113f\u1146\u114f\u1156\u1167\u116a\u1175\u1186\u118b\u119a\u11a1\u11a4\u11b1\u11ba\u11c3\u11c6\u11d5\u11da\u1203\u1206\u120b\u1212\u1215\u1228\u1233\u123e\u1247\u124c\u1255\u1258\u125b\u125e\u1263\u1268\u126d\u1272\u1277\u127a\u1281\u128a\u128d\u1290\u1293\u12a2\u12a5\u12a8\u12af\u12b6\u12b9\u12bc\u12bf\u12c2\u12c5\u12c8\u12cd\u12d0\u12d3\u12d6\u12d9\u12dc\u12df\u12e2\u12e5\u12ea\u12ed\u12f0\u12f3\u12f6\u12f9" +
|
||||
"\u1302\u1309\u130c\u130f\u1312\u1315\u1318\u131b\u131e\u1323\u1326\u1329\u132c\u1357\u136a\u0009\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002b\u0123\u0124\u012d\u012e\u012f\u0130\u0131\u0132\u0133\u0134\u0135\u0136\u0137\u0138\u0139\u013a\u013b\u013c\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u0149\u014a\u014b\u014c\u014d\u014e\u014f\u0150\u0151" +
|
||||
"\u0152\u0153\u0154\u0001\u0005\u0129\u012a\u012b\u012c\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\u0025\u017a\u017b\u017c\u017d\u017e\u017f\u0180\u0181\u0182\u0183\u0184\u0185\u0186\u0187\u0188\u0189\u018e\u018f" +
|
||||
"\u0190\u0191\u0192\u0193\u0194\u0195\u0196\u0197\u0198\u019d\u01a2\u01a3\u01a4\u01a5\u01a6\u01a7\u01a8\u01a9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u018c\u018d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u019b\u019c\u0001\u0001\u0003\u01a0\u01a1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u01b2\u01b3\u01b4\u01b5\u01b6" +
|
||||
"\u01b7\u01b8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u01bb\u0001\u0044\u0200\u020b\u020c\u0215\u0216\u021b\u021c\u021d\u021e\u021f\u0220\u0221\u0222\u0223\u0224\u0225\u0226\u0227\u0228\u0229\u022a\u022b\u022c\u022d\u022e\u023b\u0244\u0245\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u0263\u026c\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c" +
|
||||
"\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0006\u0206\u0207\u0208\u0209\u020a\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0211\u0212\u0213\u0214\u0001\u0001\u0001\u0001\u0001\u0003\u0219\u021a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0235\u0236\u0237\u0238\u0239\u023a\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0240\u0241\u0242\u0243" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0003\u0248\u0249\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u025f\u0260\u0261\u0262\u0001\u0001\u0001\u0001\u0005\u0268\u0269\u026a\u026b\u0001\u0001\u0001\u0001\u0003\u026f\u0270\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0083\u0308\u0309" +
|
||||
"\u030a\u030b\u030e\u0339\u0364\u038f\u03ba\u03c1\u03c4\u03c7\u03ca\u03cd\u03d0\u03d3\u03d6\u03d9\u03dc\u03df\u03e2\u03e5\u03e8\u03eb\u03ee\u03f1\u03f4\u03f7\u03fa\u03fd\u0400\u0403\u0406\u0409\u040c\u040f\u0412\u0415\u0418\u041b\u041e\u0421\u0424\u0427\u042a\u042d\u0430\u0433\u0436\u0439\u043c\u043f\u0442\u0445\u0448\u044b\u044e\u0451\u0454\u0457\u045a\u045d\u0460\u0463\u0466\u0469\u0470\u0477\u047e\u0485\u048c\u0493\u049a\u04a1" +
|
||||
"\u04a8\u04af\u04b6\u04bd\u04c4\u04cb\u04ce\u04d1\u04d4\u04d7\u04da\u04dd\u04e0\u04e3\u04e6\u04e9\u04ec\u04ef\u04f2\u04f5\u04f8\u04fb\u04fe\u0501\u0504\u0507\u050a\u050d\u0510\u0513\u0516\u0519\u051c\u051f\u0522\u0525\u0528\u052b\u052e\u0531\u0534\u0537\u053a\u053d\u0540\u0543\u0546\u0549\u054c\u054f\u0552\u0555\u0558\u055b\u055e\u0561\u0001\u0001\u0001\u0002\u030d\u0001\u000c\u031a\u031b\u031e\u0321\u0324\u0327\u032a\u032d\u0330" +
|
||||
"\u0333\u0336\u0001\u0002\u031d\u0001\u0002\u0320\u0001\u0002\u0323\u0001\u0002\u0326\u0001\u0002\u0329\u0001\u0002\u032c\u0001\u0002\u032f\u0001\u0002\u0332\u0001\u0002\u0335\u0001\u0002\u0338\u0001\u000c\u0345\u0346\u0349\u034c\u034f\u0352\u0355\u0358\u035b\u035e\u0361\u0001\u0002\u0348\u0001\u0002\u034b\u0001\u0002\u034e\u0001\u0002\u0351\u0001\u0002\u0354\u0001\u0002\u0357\u0001\u0002\u035a\u0001\u0002\u035d\u0001\u0002\u0360" +
|
||||
"\u0001\u0002\u0363\u0001\u000c\u0370\u0371\u0374\u0377\u037a\u037d\u0380\u0383\u0386\u0389\u038c\u0001\u0002\u0373\u0001\u0002\u0376\u0001\u0002\u0379\u0001\u0002\u037c\u0001\u0002\u037f\u0001\u0002\u0382\u0001\u0002\u0385\u0001\u0002\u0388\u0001\u0002\u038b\u0001\u0002\u038e\u0001\u000c\u039b\u039c\u039f\u03a2\u03a5\u03a8\u03ab\u03ae\u03b1\u03b4\u03b7\u0001\u0002\u039e\u0001\u0002\u03a1\u0001\u0002\u03a4\u0001\u0002\u03a7\u0001" +
|
||||
"\u0002\u03aa\u0001\u0002\u03ad\u0001\u0002\u03b0\u0001\u0002\u03b3\u0001\u0002\u03b6\u0001\u0002\u03b9\u0001\u0003\u03bd\u03be\u0001\u0002\u03c0\u0001\u0002\u03c3\u0001\u0002\u03c6\u0001\u0002\u03c9\u0001\u0002\u03cc\u0001\u0002\u03cf\u0001\u0002\u03d2\u0001\u0002\u03d5\u0001\u0002\u03d8\u0001\u0002\u03db\u0001\u0002\u03de\u0001\u0002\u03e1\u0001\u0002\u03e4\u0001\u0002\u03e7\u0001\u0002\u03ea\u0001\u0002\u03ed\u0001\u0002\u03f0" +
|
||||
"\u0001\u0002\u03f3\u0001\u0002\u03f6\u0001\u0002\u03f9\u0001\u0002\u03fc\u0001\u0002\u03ff\u0001\u0002\u0402\u0001\u0002\u0405\u0001\u0002\u0408\u0001\u0002\u040b\u0001\u0002\u040e\u0001\u0002\u0411\u0001\u0002\u0414\u0001\u0002\u0417\u0001\u0002\u041a\u0001\u0002\u041d\u0001\u0002\u0420\u0001\u0002\u0423\u0001\u0002\u0426\u0001\u0002\u0429\u0001\u0002\u042c\u0001\u0002\u042f\u0001\u0002\u0432\u0001\u0002\u0435\u0001\u0002\u0438" +
|
||||
"\u0001\u0002\u043b\u0001\u0002\u043e\u0001\u0002\u0441\u0001\u0002\u0444\u0001\u0002\u0447\u0001\u0002\u044a\u0001\u0002\u044d\u0001\u0002\u0450\u0001\u0002\u0453\u0001\u0002\u0456\u0001\u0002\u0459\u0001\u0002\u045c\u0001\u0002\u045f\u0001\u0002\u0462\u0001\u0002\u0465\u0001\u0002\u0468\u0001\u0003\u046c\u046d\u0001\u0002\u046f\u0001\u0003\u0473\u0474\u0001\u0002\u0476\u0001\u0003\u047a\u047b\u0001\u0002\u047d\u0001\u0003\u0481" +
|
||||
"\u0482\u0001\u0002\u0484\u0001\u0003\u0488\u0489\u0001\u0002\u048b\u0001\u0003\u048f\u0490\u0001\u0002\u0492\u0001\u0003\u0496\u0497\u0001\u0002\u0499\u0001\u0003\u049d\u049e\u0001\u0002\u04a0\u0001\u0003\u04a4\u04a5\u0001\u0002\u04a7\u0001\u0003\u04ab\u04ac\u0001\u0002\u04ae\u0001\u0003\u04b2\u04b3\u0001\u0002\u04b5\u0001\u0003\u04b9\u04ba\u0001\u0002\u04bc\u0001\u0003\u04c0\u04c1\u0001\u0002\u04c3\u0001\u0003\u04c7\u04c8\u0001" +
|
||||
"\u0002\u04ca\u0001\u0002\u04cd\u0001\u0002\u04d0\u0001\u0002\u04d3\u0001\u0002\u04d6\u0001\u0002\u04d9\u0001\u0002\u04dc\u0001\u0002\u04df\u0001\u0002\u04e2\u0001\u0002\u04e5\u0001\u0002\u04e8\u0001\u0002\u04eb\u0001\u0002\u04ee\u0001\u0002\u04f1\u0001\u0002\u04f4\u0001\u0002\u04f7\u0001\u0002\u04fa\u0001\u0002\u04fd\u0001\u0002\u0500\u0001\u0002\u0503\u0001\u0002\u0506\u0001\u0002\u0509\u0001\u0002\u050c\u0001\u0002\u050f\u0001" +
|
||||
"\u0002\u0512\u0001\u0002\u0515\u0001\u0002\u0518\u0001\u0002\u051b\u0001\u0002\u051e\u0001\u0002\u0521\u0001\u0002\u0524\u0001\u0002\u0527\u0001\u0002\u052a\u0001\u0002\u052d\u0001\u0002\u0530\u0001\u0002\u0533\u0001\u0002\u0536\u0001\u0002\u0539\u0001\u0002\u053c\u0001\u0002\u053f\u0001\u0002\u0542\u0001\u0002\u0545\u0001\u0002\u0548\u0001\u0002\u054b\u0001\u0002\u054e\u0001\u0002\u0551\u0001\u0002\u0554\u0001\u0002\u0557\u0001" +
|
||||
"\u0002\u055a\u0001\u0002\u055d\u0001\u0002\u0560\u0001\u0002\u0563\u0001\u0003\u0567\u0568\u0001\u0001\u0009\u0572\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u0003\u0575\u0576\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0585\u0586\u0587\u0588\u0589\u058a\u0001\u0001\u0001\u0001\u0001\u0001\u0024\u05af\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\u05ba\u05bb\u05bc\u05bd\u05be\u05bf\u05c0\u05c1\u05c2" +
|
||||
"\u05c3\u05c4\u05c5\u05c6\u05c7\u05c8\u05c9\u05ca\u05cb\u05cc\u05cd\u05ce\u05cf\u05d0\u05d1\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\u001f\u05f1\u05f2\u05f3\u05f4\u05f5\u05f6\u05fd\u05fe\u05ff\u0600\u0601\u0602\u0603\u0604\u0605\u0606\u0607\u0608\u0609\u060a\u060b" +
|
||||
"\u060c\u060d\u060e\u060f\u0610\u0611\u0612\u0613\u0614\u0001\u0001\u0001\u0001\u0001\u0004\u05fa\u05fb\u05fc\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\u0038\u064d\u064e\u0653\u0658\u0659\u065a\u065b\u065c\u065d\u065e\u065f\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u066a\u066b\u066c\u066d\u066e" +
|
||||
"\u066f\u0670\u0671\u0672\u0673\u0674\u0675\u0676\u0677\u0678\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u068c\u068d\u068e\u068f\u0001\u0003\u0651\u0652\u0001\u0001\u0003\u0656\u0657\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\u0003\u068a\u068b\u0001\u0001\u0001\u0001\u0001\u0001\"\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06b9\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06c9\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\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\u06d7\u06d8\u06d9\u0001\u0001\u0001\u000b\u06e5\u06e8\u06e9\u06ea\u06eb\u06ec\u06ed\u06ee\u06ef\u06f0\u0002\u06e7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u06f5\u06f6\u06f7\u0001\u0001\u0001\u0005\u06fd\u06fe\u06ff\u0700\u0001\u0001\u0001\u0001\u0002\u0703\u0001\u0003\u0707\u0708\u0001" +
|
||||
"\u0001\u0002\u070b\u0001\u0002\u070e\u0001\u0006\u0715\u0716\u0717\u0718\u0719\u0001\u0001\u0001\u0001\u0001\u0011\u072b\u072c\u072d\u072e\u072f\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001e\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c" +
|
||||
"\u076d\u076e\u076f\u0770\u0771\u0772\u0773\u0774\u0775\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\u001b\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07a6\u07a7\u07a8\u07a9\u07aa\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\u0015\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001a\u07ee\u07ef\u07f8\u07f9\u07fa\u07fb\u07fc\u07fd\u07fe\u07ff\u0800" +
|
||||
"\u080d\u080e\u0813\u0814\u0815\u0816\u0817\u0818\u0819\u081a\u081b\u081c\u081d\u081e\u0001\u0005\u07f4\u07f5\u07f6\u07f7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0807\u0808\u0809\u080a\u080b\u080c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0811\u0812\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0012\u0831\u0832\u0833\u0834\u0835\u0836\u0837\u0838" +
|
||||
"\u0839\u083a\u083b\u083c\u083d\u083e\u083f\u0840\u0841\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0845\u0846\u0001\u0001\u000c\u0853\u0854\u0855\u0856\u0857\u0858\u0859\u085a\u085b\u085c\u085d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u0864\u0865\u0866\u0867\u0868\u0001\u0001\u0001\u0001\u0001\u0010\u0879\u087a\u087b\u087c\u087d\u087e" +
|
||||
"\u087f\u0880\u0881\u0882\u0883\u0884\u0885\u0886\u0887\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u088d\u088e\u088f\u0890\u0001\u0001\u0001\u0001\u0008\u0899\u089a\u089b\u089c\u089d\u089e\u089f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u08a2\u0001\u0010\u08b3\u08b4\u08b5\u08b6\u08b7\u08b8\u08b9\u08ba\u08bb\u08bc\u08bd\u08be\u08bf\u08c0\u08c1\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u08c5\u08c6\u0001\u0001\u0009\u08d0\u08d1\u08d2\u08d3\u08d4\u08d5\u08d6\u08d7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u08da\u0001\n\u08e5\u08e6\u08e7\u08e8\u08e9\u08ea\u08eb\u08ec\u08ed\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u0903\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913" +
|
||||
"\u0914\u0915\u0916\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u091d\u091e\u091f\u0920\u0921\u0001\u0001\u0001\u0001\u0001\u0002\u0924\u0001\u0008\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u093f\u0940\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\n\u0953\u0954\u0955\u0956\u0957\u0958\u0959\u095a\u095b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001d\u0979\u0980\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098d\u098e\u098f\u0990\u0991\u0992\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u0002\u097b\u0003\u097e\u097f\u0001\u0001\u0003\u0983\u0984\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\u09a1\u09a2\u0001\u0001\u0002\u09a5\u0001\u0003\u09a9\u09aa\u0001\u0001\u0002\u09ad\u0001\u0007\u09b5\u09b6\u09b7\u09b8\u09b9\u09ba\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u09c0\u09c1\u09c2\u09c3\u0001\u0001\u0001\u0001\u0002\u09c6\u0001\u0005\u09cc\u09cd\u09ce\u09cf\u0001\u0001\u0001\u0001\u0002\u09d2\u0001\u0042\u0a15\u0a22\u0a23\u0a24" +
|
||||
"\u0a25\u0a26\u0a27\u0a28\u0a29\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f\u0a30\u0a31\u0a32\u0a33\u0a34\u0a35\u0a36\u0a37\u0a38\u0a39\u0a3a\u0a3b\u0a3c\u0a3d\u0a3e\u0a3f\u0a40\u0a65\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a70\u0a71\u0a72\u0a73\u0a74\u0a75\u0a76\u0a77\u0a78\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a81\u0a82\u0a83\u0a84\u0a85\u0007\u0a1c\u0a1d\u0a1e\u0a1f\u0a20\u0a21\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\u0013\u0a53\u0a54\u0a55\u0a56\u0a57\u0a58\u0a59\u0a5a\u0a5b\u0a5c\u0a5d\u0a5e\u0a5f\u0a60\u0a61\u0a62\u0a63\u0a64\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\u0046\u0acc\u0acd\u0ad6\u0ae3\u0ae4\u0ae5\u0ae6\u0ae7\u0ae8\u0af1\u0af2\u0af3\u0af4\u0af5\u0af6\u0af7\u0af8\u0af9\u0afa\u0afb\u0b00\u0b01\u0b02\u0b03\u0b04\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0d\u0b0e\u0b0f\u0b10\u0b11\u0b12\u0b13\u0b18" +
|
||||
"\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b29\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b31\u0b32\u0b33\u0b34\u0001\u0005\u0ad2\u0ad3\u0ad4\u0ad5\u0001\u0001\u0001\u0001\u0007\u0add\u0ade\u0adf\u0ae0\u0ae1\u0ae2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0aed\u0aee\u0aef\u0af0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0003\u0afe\u0aff\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0b16\u0b17\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\u001f\u0b54\u0b59\u0b62\u0b63\u0b64\u0b65\u0b66\u0b67\u0b68\u0b69" +
|
||||
"\u0b6a\u0b77\u0b80\u0b81\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8b\u0b8c\u0b8d\u0b96\u0b97\u0b98\u0b99\u0b9a\u0b9b\u0b9c\u0b9d\u0003\u0b57\u0b58\u0001\u0001\u0005\u0b5e\u0b5f\u0b60\u0b61\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0b71\u0b72\u0b73\u0b74\u0b75\u0b76\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0b7c\u0b7d\u0b7e\u0b7f\u0001\u0001\u0001\u0001\u0001\u0003\u0b84\u0b85\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0005\u0b92\u0b93\u0b94\u0b95\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0011\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0bba\u0bbb\u0bbc\u0bbd\u0bbe\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0011\u0bd0\u0bd5\u0bda\u0bdb\u0bdc\u0bdd\u0bde\u0bdf\u0be0\u0be1\u0be2\u0be3\u0be4\u0be5\u0be6\u0be7" +
|
||||
"\u0003\u0bd3\u0bd4\u0001\u0001\u0003\u0bd8\u0bd9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0bea\u0beb\u0001\u0001\u002c\u0c18\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c29\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c34\u0c35\u0c36\u0c37\u0c38\u0c39\u0c3a\u0c3b\u0c3c\u0c3d\u0c3e\u0c3f\u0c40\u0c41\u0c42\u0c43\u0c44\u0c45\u0c46" +
|
||||
"\u0003\u0c1b\u0c1c\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\u0008\u0c4f\u0c50\u0c51\u0c52\u0c53\u0c54\u0c55\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0010\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e" +
|
||||
"\u0c6f\u0c70\u0c71\u0c72\u0c73\u0c74\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0c89\u0c8a\u0c8b\u0c8c\u0c8d\u0c8e\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0c91\u0001\u000f\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0ca9\u0caa\u0cab\u0cac\u0cad\u0cae\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0cb2\u0cb3\u0001\u0001\u0008\u0cbc\u0cbd\u0cbe\u0cbf\u0cc0\u0cc1\u0cc2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0cc7\u0cc8\u0cc9\u0001\u0001\u0001\u0006\u0cd0\u0cd1\u0cd2\u0cd3\u0cd4\u0001\u0001\u0001\u0001\u0001\u001a\u0cef\u0cf0\u0cf1\u0cf2\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0cfb\u0cfc\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d02\u0d03\u0d04\u0d05\u0d06\u0d07\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\u0d0c\u0d0d\u0d0e\u0001\u0001\u0001\u0005\u0d14\u0d15\u0d16\u0d17\u0001\u0001\u0001\u0001\u000b\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d29\u0d2a\u0d2b\u0d2c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3b\u0d3c\u0d3d\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u001b\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e\u0d5f\u0d60\u0d61\u0d62\u0d63\u0d64\u0d65\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0d70\u0d71\u0d72\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\u0023\u0d96\u0d97\u0d98\u0d99\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1" +
|
||||
"\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db2\u0db3\u0db4\u0db5\u0db6\u0db7\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\u0dba\u0001\u0003\u0dbe\u0dbf\u0001\u0001\u0007\u0dc7\u0dc8\u0dc9\u0dca\u0dcb\u0dcc\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0004\u0dd1\u0dd2\u0dd3\u0001\u0001\u0001\u0002\u0dd6\u0001\u0012\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df2\u0df3\u0df4\u0df5\u0df6\u0df7\u0df8\u0df9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0021\u0e1b\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e3a\u0e3b\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47" +
|
||||
"\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0005\u0e20\u0e21\u0e22\u0e23\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0e3e\u0e3f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u0e6a\u0e6b\u0e6c\u0e6d" +
|
||||
"\u0e6e\u0e6f\u0e70\u0e71\u0e72\u0e73\u0e74\u0e75\u0e76\u0e77\u0e78\u0e79\u0e7a\u0e7b\u0e7c\u0e7d\u0e7e\u0e7f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0025\u0ea5\u0eae\u0ebb\u0ec4\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ece\u0ecf\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0edc\u0edd\u0ede\u0edf\u0ee0\u0ee1\u0ee2\u0ee3\u0ee4\u0ee5\u0ee6\u0ee7" +
|
||||
"\u0ee8\u0ee9\u0eea\u0eeb\u0eec\u0005\u0eaa\u0eab\u0eac\u0ead\u0001\u0001\u0001\u0001\u0007\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0eba\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0ec0\u0ec1\u0ec2\u0ec3\u0001\u0001\u0001\u0001\u0003\u0ec7\u0ec8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0eda\u0edb\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0040\u0f2d\u0f36\u0f3f\u0f44\u0f49\u0f4a\u0f4b\u0f4c\u0f4d\u0f4e\u0f4f\u0f50\u0f51\u0f52\u0f53\u0f54\u0f55\u0f56\u0f57\u0f58\u0f59\u0f5a\u0f67\u0f70\u0f71\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f7f\u0f80\u0f81\u0f82\u0f83\u0f84\u0f85\u0f86\u0f8f\u0f98\u0f9d\u0f9e\u0f9f\u0fa0\u0fa1\u0fa2\u0fa3\u0fa4\u0fa5\u0fa6\u0fa7\u0fa8\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0005\u0f32\u0f33" +
|
||||
"\u0f34\u0f35\u0001\u0001\u0001\u0001\u0005\u0f3b\u0f3c\u0f3d\u0f3e\u0001\u0001\u0001\u0001\u0003\u0f42\u0f43\u0001\u0001\u0003\u0f47\u0f48\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0f61\u0f62\u0f63\u0f64\u0f65\u0f66\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0f6c\u0f6d\u0f6e\u0f6f\u0001\u0001\u0001\u0001\u0001\u0003\u0f74\u0f75\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0f8b\u0f8c\u0f8d\u0f8e\u0001\u0001\u0001\u0001\u0005\u0f94\u0f95\u0f96\u0f97\u0001\u0001\u0001\u0001\u0003\u0f9b\u0f9c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u0fc7\u0fc8\u0fc9\u0fca\u0fcb\u0fcc\u0fcd\u0fce\u0fcf\u0fd0\u0fd1\u0fd2\u0fd3\u0fd4\u0fd5" +
|
||||
"\u0fd6\u0fd7\u0fd8\u0fd9\u0fda\u0fdb\u0fdc\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0fdf\u0001\u0003\u0fe3\u0fe4\u0001\u0001\u0002\u0fe7\u0001\u0002\u0fea\u0001\u0002\u0fed\u0001\u0004\u0ff2\u0ff3\u0ff4\u0001\u0001\u0001\u000c\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0004\u1010\u1011\u1012\u0001\u0001\u0001\u0003\u1016\u1017\u0001\u0001\u0007\u101f\u1020\u1021\u1022\u1023\u1024\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1028\u1029\u0001\u0001\u0004\u102e\u102f\u1030\u0001\u0001\u0001\u0003\u1034\u1035\u0001\u0001\u0002\u1038\u0001\u0002\u103b\u0001\u0002\u103e\u0001\u0002\u1041\u0001\u0004\u1046\u1047\u1048\u0001\u0001\u0001\u0002\u104b\u0001\u0003\u104f\u1050\u0001" +
|
||||
"\u0001\u0002\u1053\u0001\u0004\u1058\u1059\u105a\u0001\u0001\u0001\u0002\u105d\u0001\u0004\u1062\u1063\u1064\u0001\u0001\u0001\u0002\u1067\u0001\u0002\u106a\u0001\u0002\u106d\u0001\u0002\u1070\u0001\u0002\u1073\u0001\u0002\u1076\u0001\u0002\u1079\u0001\u0002\u107c\u0001\u0002\u107f\u0001\u0006\u1086\u1087\u1088\u1089\u108a\u0001\u0001\u0001\u0001\u0001\u0002\u108d\u0001\u0002\u1090\u0001\u0005\u1096\u1097\u1098\u1099\u0001\u0001" +
|
||||
"\u0001\u0001\u0003\u109d\u109e\u0001\u0001\u0005\u10a4\u10a5\u10a6\u10a7\u0001\u0001\u0001\u0001\u0003\u10ab\u10ac\u0001\u0001\u0011\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c6\u10c7\u10c8\u10c9\u10ca\u10cb\u10cc\u10cd\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u10d0\u0001\u0011\u10e2\u10e3\u10e4\u10e5\u10e6\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef" +
|
||||
"\u10f0\u10f1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u10f4\u0001\u000c\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u110f\u1110\u0001\u0001\u0003\u1114\u1115\u0001\u0001\u0003\u1119\u111a\u0001\u0001\u0002\u111d\u0001\u0006\u1124\u1125\u1126\u1127\u1128\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0002\u112b\u0001\u0002\u112e\u0001\u0002\u1131\u0001\u0002\u1134\u0001\u0002\u1137\u0001\u0004\u113c\u113d\u113e\u0001\u0001\u0001\u0004\u1143\u1144\u1145\u0001\u0001\u0001\u0005\u114b\u114c\u114d\u114e\u0001\u0001\u0001\u0001\u0004\u1153\u1154\u1155\u0001\u0001\u0001\u0009\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1169\u0001\u0006\u1170\u1171\u1172\u1173\u1174" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0009\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1189\u118a\u0001\u0001\u0008\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u119e\u119f\u11a0\u0001\u0001\u0001\u0002\u11a3\u0001\u0007\u11ab\u11ac\u11ad\u11ae\u11af\u11b0\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u11b6\u11b7\u11b8\u11b9\u0001\u0001" +
|
||||
"\u0001\u0001\u0005\u11bf\u11c0\u11c1\u11c2\u0001\u0001\u0001\u0001\u0002\u11c5\u0001\u0008\u11ce\u11cf\u11d0\u11d1\u11d2\u11d3\u11d4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u11d8\u11d9\u0001\u0001\u0015\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\u1200\u1201\u1202\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0002\u1205\u0001\u0003\u1209\u120a\u0001\u0001\u0004\u120f\u1210\u1211\u0001\u0001\u0001\u0002\u1214\u0001\n\u121f\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u122e\u122f\u1230\u1231\u1232\u0001\u0001\u0001\u0001\u0001\u0006\u1239\u123a\u123b\u123c\u123d\u0001\u0001\u0001\u0001\u0001\u0005\u1243\u1244\u1245\u1246\u0001\u0001\u0001\u0001\u0003" +
|
||||
"\u124a\u124b\u0001\u0001\u0005\u1251\u1252\u1253\u1254\u0001\u0001\u0001\u0001\u0002\u1257\u0001\u0002\u125a\u0001\u0002\u125d\u0001\u0003\u1261\u1262\u0001\u0001\u0003\u1266\u1267\u0001\u0001\u0003\u126b\u126c\u0001\u0001\u0003\u1270\u1271\u0001\u0001\u0003\u1275\u1276\u0001\u0001\u0002\u1279\u0001\u0004\u127e\u127f\u1280\u0001\u0001\u0001\u0005\u1286\u1287\u1288\u1289\u0001\u0001\u0001\u0001\u0002\u128c\u0001\u0002\u128f\u0001" +
|
||||
"\u0002\u1292\u0001\u0008\u129b\u129c\u129d\u129e\u129f\u12a0\u12a1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u12a4\u0001\u0002\u12a7\u0001\u0004\u12ac\u12ad\u12ae\u0001\u0001\u0001\u0004\u12b3\u12b4\u12b5\u0001\u0001\u0001\u0002\u12b8\u0001\u0002\u12bb\u0001\u0002\u12be\u0001\u0002\u12c1\u0001\u0002\u12c4\u0001\u0002\u12c7\u0001\u0003\u12cb\u12cc\u0001\u0001\u0002\u12cf\u0001\u0002\u12d2\u0001\u0002\u12d5\u0001\u0002\u12d8" +
|
||||
"\u0001\u0002\u12db\u0001\u0002\u12de\u0001\u0002\u12e1\u0001\u0002\u12e4\u0001\u0003\u12e8\u12e9\u0001\u0001\u0002\u12ec\u0001\u0002\u12ef\u0001\u0002\u12f2\u0001\u0002\u12f5\u0001\u0002\u12f8\u0001\u0005\u12fe\u12ff\u1300\u1301\u0001\u0001\u0001\u0001\u0004\u1306\u1307\u1308\u0001\u0001\u0001\u0002\u130b\u0001\u0002\u130e\u0001\u0002\u1311\u0001\u0002\u1314\u0001\u0002\u1317\u0001\u0002\u131a\u0001\u0002\u131d\u0001\u0003\u1321" +
|
||||
"\u1322\u0001\u0001\u0002\u1325\u0001\u0002\u1328\u0001\u0002\u132b\u0001\u0016\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u1361\u1362\u1363\u1364\u1365\u1366\u1367\u1368\u1369\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0002\u136c\u0001").toCharArray();
|
||||
}
|
@@ -3,7 +3,6 @@ package juloo.keyboard2;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.TypedValue;
|
||||
import android.view.KeyEvent;
|
||||
@@ -47,10 +46,12 @@ public final class Config
|
||||
public float margin_bottom;
|
||||
public float keyHeight;
|
||||
public float horizontal_margin;
|
||||
public float keyVerticalInterval;
|
||||
public float keyHorizontalInterval;
|
||||
public float key_vertical_margin;
|
||||
public float key_horizontal_margin;
|
||||
public int labelBrightness; // 0 - 255
|
||||
public int keyboardOpacity; // 0 - 255
|
||||
public float customBorderRadius; // 0 - 1
|
||||
public float customBorderLineWidth; // dp
|
||||
public int keyOpacity; // 0 - 255
|
||||
public int keyActivatedOpacity; // 0 - 255
|
||||
public boolean double_tap_lock_shift;
|
||||
@@ -59,6 +60,7 @@ public final class Config
|
||||
public boolean autocapitalisation;
|
||||
public boolean switch_input_immediate;
|
||||
public boolean pin_entry_enabled;
|
||||
public boolean borderConfig;
|
||||
|
||||
// Dynamically set
|
||||
public boolean shouldOfferVoiceTyping;
|
||||
@@ -105,8 +107,6 @@ public final class Config
|
||||
// The height of the keyboard is relative to the height of the screen.
|
||||
// This is the height of the keyboard if it have 4 rows.
|
||||
int keyboardHeightPercent;
|
||||
// Scale some dimensions depending on orientation
|
||||
float horizontalIntervalScale = 1.f;
|
||||
float characterSizeScale = 1.f;
|
||||
String show_numpad_s = _prefs.getString("show_numpad", "never");
|
||||
show_numpad = "always".equals(show_numpad_s);
|
||||
@@ -115,7 +115,6 @@ public final class Config
|
||||
if ("landscape".equals(show_numpad_s))
|
||||
show_numpad = true;
|
||||
keyboardHeightPercent = _prefs.getInt("keyboard_height_landscape", 50);
|
||||
horizontalIntervalScale = 2.f;
|
||||
characterSizeScale = 1.25f;
|
||||
}
|
||||
else
|
||||
@@ -139,16 +138,20 @@ public final class Config
|
||||
longPressTimeout = _prefs.getInt("longpress_timeout", 600);
|
||||
longPressInterval = _prefs.getInt("longpress_interval", 65);
|
||||
margin_bottom = get_dip_pref_oriented(dm, "margin_bottom", 7, 3);
|
||||
keyVerticalInterval = get_dip_pref(dm, "key_vertical_space", 2);
|
||||
keyHorizontalInterval = get_dip_pref(dm, "key_horizontal_space", 2) * horizontalIntervalScale;
|
||||
key_vertical_margin = get_dip_pref(dm, "key_vertical_margin", 1.5f) / 100;
|
||||
key_horizontal_margin = get_dip_pref(dm, "key_horizontal_margin", 2) / 100;
|
||||
// Label brightness is used as the alpha channel
|
||||
labelBrightness = _prefs.getInt("label_brightness", 100) * 255 / 100;
|
||||
// Keyboard opacity
|
||||
keyboardOpacity = _prefs.getInt("keyboard_opacity", 100) * 255 / 100;
|
||||
keyOpacity = _prefs.getInt("key_opacity", 100) * 255 / 100;
|
||||
keyActivatedOpacity = _prefs.getInt("key_activated_opacity", 100) * 255 / 100;
|
||||
// Do not substract keyVerticalInterval from keyHeight because this is done
|
||||
// during rendered.
|
||||
// keyboard border settings
|
||||
borderConfig = _prefs.getBoolean("border_config", false);
|
||||
customBorderRadius = _prefs.getInt("custom_border_radius", 0) / 100.f;
|
||||
customBorderLineWidth = get_dip_pref(dm, "custom_border_line_width", 0);
|
||||
// Do not substract key_vertical_margin from keyHeight because this is done
|
||||
// during rendering.
|
||||
keyHeight = dm.heightPixels * keyboardHeightPercent / 100 / 4;
|
||||
horizontal_margin =
|
||||
get_dip_pref_oriented(dm, "horizontal_margin", 3, 28);
|
||||
@@ -206,6 +209,9 @@ public final class Config
|
||||
// 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)
|
||||
@@ -217,9 +223,11 @@ public final class Config
|
||||
extra_keys_subtype.compute(extra_keys,
|
||||
new ExtraKeys.Query(kw.script, present));
|
||||
}
|
||||
boolean number_row = this.number_row && !show_numpad;
|
||||
if (number_row)
|
||||
remove_keys.addAll(KeyboardData.number_row.getKeys(0).keySet());
|
||||
KeyboardData.Row number_row = null;
|
||||
if (this.number_row && !show_numpad)
|
||||
number_row = modify_number_row(KeyboardData.number_row, kw);
|
||||
if (number_row != null)
|
||||
remove_keys.addAll(number_row.getKeys(0).keySet());
|
||||
kw = kw.mapKeys(new KeyboardData.MapKeyValues() {
|
||||
public KeyValue apply(KeyValue key, boolean localized)
|
||||
{
|
||||
@@ -272,8 +280,8 @@ public final class Config
|
||||
});
|
||||
if (show_numpad)
|
||||
kw = kw.addNumPad(modify_numpad(KeyboardData.num_pad, kw));
|
||||
if (number_row)
|
||||
kw = kw.addNumberRow();
|
||||
if (number_row != null)
|
||||
kw = kw.addTopRow(number_row);
|
||||
if (extra_keys.size() > 0)
|
||||
kw = kw.addExtraKeys(extra_keys.entrySet().iterator());
|
||||
return kw;
|
||||
@@ -312,7 +320,7 @@ public final class Config
|
||||
c = inverse_numpad_char(c);
|
||||
String modified = map_digit.apply(c);
|
||||
if (modified != null) // Was modified by script
|
||||
return key.withSymbol(modified);
|
||||
return KeyValue.makeStringKey(modified);
|
||||
if (prev_c != c) // Was inverted
|
||||
return key.withChar(c);
|
||||
break;
|
||||
@@ -322,6 +330,39 @@ public final class Config
|
||||
});
|
||||
}
|
||||
|
||||
static KeyboardData.MapKeyValues numpad_script_map(String numpad_script)
|
||||
{
|
||||
final KeyModifier.Map_char map_digit = KeyModifier.modify_numpad_script(numpad_script);
|
||||
return new KeyboardData.MapKeyValues() {
|
||||
public KeyValue apply(KeyValue key, boolean localized)
|
||||
{
|
||||
switch (key.getKind())
|
||||
{
|
||||
case Char:
|
||||
String modified = map_digit.apply(key.getChar());
|
||||
if (modified != null)
|
||||
return KeyValue.makeStringKey(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)
|
||||
{
|
||||
return kw.mapKeys(numpad_script_map(main_kw.numpad_script));
|
||||
}
|
||||
|
||||
/** Modify the number row according to [main_kw]'s script. */
|
||||
public KeyboardData.Row modify_number_row(KeyboardData.Row row,
|
||||
KeyboardData main_kw)
|
||||
{
|
||||
return row.mapKeys(numpad_script_map(main_kw.numpad_script));
|
||||
}
|
||||
|
||||
private float get_dip_pref(DisplayMetrics dm, String pref_name, float def)
|
||||
{
|
||||
float value;
|
||||
@@ -354,12 +395,9 @@ public final class Config
|
||||
case "jungle": return R.style.Jungle;
|
||||
default:
|
||||
case "system":
|
||||
if (Build.VERSION.SDK_INT >= 8)
|
||||
{
|
||||
int night_mode = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
|
||||
return R.style.Light;
|
||||
}
|
||||
int night_mode = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
|
||||
return R.style.Light;
|
||||
return R.style.Dark;
|
||||
}
|
||||
}
|
||||
@@ -435,7 +473,7 @@ public final class Config
|
||||
case 1:
|
||||
default: break;
|
||||
}
|
||||
e.commit();
|
||||
e.apply();
|
||||
}
|
||||
|
||||
private static LayoutsPreference.Layout migrate_layout(String name)
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build.VERSION;
|
||||
@@ -7,6 +8,7 @@ import android.preference.PreferenceManager;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
@TargetApi(24)
|
||||
public final class DirectBootAwarePreferences
|
||||
{
|
||||
/* On API >= 24, preferences are read from the device protected storage. This
|
||||
@@ -57,7 +59,7 @@ public final class DirectBootAwarePreferences
|
||||
// Device is locked, migrate later.
|
||||
return;
|
||||
}
|
||||
prefs.edit().putBoolean("need_migration", false).commit();
|
||||
prefs.edit().putBoolean("need_migration", false).apply();
|
||||
copy_shared_preferences(prefs, protected_prefs);
|
||||
}
|
||||
|
||||
@@ -81,6 +83,6 @@ public final class DirectBootAwarePreferences
|
||||
else if (v instanceof Set)
|
||||
e.putStringSet(k, (Set<String>)v);
|
||||
}
|
||||
e.commit();
|
||||
e.apply();
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,8 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.os.Looper;
|
||||
import android.text.InputType;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.ExtractedText;
|
||||
@@ -12,26 +14,39 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
{
|
||||
IReceiver _recv;
|
||||
Autocapitalisation _autocap;
|
||||
Autonormalization _autonorm;
|
||||
/** State of the system modifiers. It is updated whether a modifier is down
|
||||
or up and a corresponding key event is sent. */
|
||||
Pointers.Modifiers _mods;
|
||||
/** Consistent with [_mods]. This is a mutable state rather than computed
|
||||
from [_mods] to ensure that the meta state is correct while up and down
|
||||
events are sent for the modifier keys. */
|
||||
int _meta_state;
|
||||
int _meta_state = 0;
|
||||
/** Whether to force sending arrow keys to move the cursor when
|
||||
[setSelection] could be used instead. */
|
||||
boolean _move_cursor_force_fallback = false;
|
||||
|
||||
public KeyEventHandler(Looper looper, IReceiver recv)
|
||||
{
|
||||
_recv = recv;
|
||||
_autocap = new Autocapitalisation(looper,
|
||||
this.new Autocapitalisation_callback());
|
||||
_autonorm = new Autonormalization();
|
||||
_mods = Pointers.Modifiers.EMPTY;
|
||||
}
|
||||
|
||||
/** Editing just started. */
|
||||
public void started(EditorInfo info)
|
||||
{
|
||||
_autocap.started(info, _recv.getCurrentInputConnection());
|
||||
InputConnection ic = _recv.getCurrentInputConnection();
|
||||
_autocap.started(info, ic);
|
||||
_autonorm.started(info, ic);
|
||||
// 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. */
|
||||
@@ -58,6 +73,9 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
case META:
|
||||
_autocap.stop();
|
||||
break;
|
||||
case COMPOSE_PENDING:
|
||||
KeyModifier.set_compose_pending(0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
@@ -72,6 +90,8 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
return;
|
||||
Pointers.Modifiers old_mods = _mods;
|
||||
update_meta_state(mods);
|
||||
// Handles sending text
|
||||
_autonorm.key_up(key);
|
||||
switch (key.getKind())
|
||||
{
|
||||
case Char: send_text(String.valueOf(key.getChar())); break;
|
||||
@@ -80,6 +100,10 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
case Keyevent: send_key_down_up(key.getKeyevent()); break;
|
||||
case Modifier: break;
|
||||
case Editing: handle_editing_key(key.getEditing()); break;
|
||||
case Compose_pending:
|
||||
KeyModifier.set_compose_pending(key.getPendingCompose());
|
||||
_recv.set_compose_pending(true);
|
||||
break;
|
||||
}
|
||||
update_meta_state(old_mods);
|
||||
}
|
||||
@@ -174,7 +198,8 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
InputConnection conn = _recv.getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
conn.commitText(text, 1);
|
||||
if (!_autonorm.typed(text))
|
||||
conn.commitText(text, 1);
|
||||
_autocap.typed(text);
|
||||
}
|
||||
|
||||
@@ -187,6 +212,7 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
conn.performContextMenuAction(id);
|
||||
}
|
||||
|
||||
@SuppressLint("InlinedApi")
|
||||
void handle_editing_key(KeyValue.Editing ev)
|
||||
{
|
||||
switch (ev)
|
||||
@@ -232,7 +258,8 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
return;
|
||||
ExtractedText et = get_cursor_pos(conn);
|
||||
// Fallback to sending key events
|
||||
if (et == null
|
||||
if (_move_cursor_force_fallback
|
||||
|| et == null
|
||||
|| _mods.has(KeyValue.Modifier.CTRL)
|
||||
|| _mods.has(KeyValue.Modifier.ALT)
|
||||
|| _mods.has(KeyValue.Modifier.META))
|
||||
@@ -256,7 +283,8 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
if (!_mods.has(KeyValue.Modifier.SHIFT))
|
||||
sel_start = sel_end;
|
||||
}
|
||||
conn.setSelection(sel_start, sel_end);
|
||||
if (!conn.setSelection(sel_start, sel_end))
|
||||
move_cursor_fallback(d);
|
||||
}
|
||||
|
||||
/** Send arrow keys as a fallback for editors that do not support
|
||||
@@ -279,6 +307,7 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
{
|
||||
public void handle_event_key(KeyValue.Event ev);
|
||||
public void set_shift_state(boolean state, boolean lock);
|
||||
public void set_compose_pending(boolean pending);
|
||||
public InputConnection getCurrentInputConnection();
|
||||
}
|
||||
|
||||
|
@@ -10,6 +10,10 @@ public final class KeyModifier
|
||||
private static HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>> _cache =
|
||||
new HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>>();
|
||||
|
||||
/** The current compose state. Whether a compose is pending is signaled by
|
||||
the [COMPOSE_PENDING] modifier. */
|
||||
static int _compose_pending = -1;
|
||||
|
||||
/** Modify a key according to modifiers. */
|
||||
public static KeyValue modify(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
@@ -27,7 +31,11 @@ public final class KeyModifier
|
||||
ks.put(mods, r);
|
||||
}
|
||||
/* Keys with an empty string are placeholder keys. */
|
||||
return (r.getString().length() == 0) ? null : r;
|
||||
if (r.getString().length() == 0)
|
||||
return null;
|
||||
if (mods.has(KeyValue.Modifier.COMPOSE_PENDING))
|
||||
r = ComposeKey.apply(_compose_pending, r);
|
||||
return r;
|
||||
}
|
||||
|
||||
public static KeyValue modify(KeyValue k, KeyValue.Modifier mod)
|
||||
@@ -95,10 +103,16 @@ public final class KeyModifier
|
||||
case "bengali": return map_char_numpad_bengali;
|
||||
case "devanagari": return map_char_numpad_devanagari;
|
||||
case "persian": return map_char_numpad_persian;
|
||||
case "gujarati": return map_char_numpad_gujarati;
|
||||
default: return map_char_none;
|
||||
}
|
||||
}
|
||||
|
||||
public static void set_compose_pending(int state)
|
||||
{
|
||||
_compose_pending = state;
|
||||
}
|
||||
|
||||
private static KeyValue apply_map_char(KeyValue k, Map_char map)
|
||||
{
|
||||
switch (k.getKind())
|
||||
@@ -490,6 +504,31 @@ public final class KeyModifier
|
||||
has the inconvenient of swapping i and ı on the keyboard. */
|
||||
case 'ı': return 'İ';
|
||||
case '₹': return '₨';
|
||||
// Gujarati alternate characters
|
||||
case 'અ': return 'આ';
|
||||
case 'ઇ': return 'ઈ';
|
||||
case 'િ': return 'ી';
|
||||
case 'ઉ': return 'ઊ';
|
||||
case 'ુ': return 'ૂ';
|
||||
case 'એ': return 'ઐ';
|
||||
case 'ે': return 'ૈ';
|
||||
case 'ઓ': return 'ઔ';
|
||||
case 'ો': return 'ૌ';
|
||||
case 'ક': return 'ખ';
|
||||
case 'ગ': return 'ઘ';
|
||||
case 'ચ': return 'છ';
|
||||
case 'જ': return 'ઝ';
|
||||
case 'ટ': return 'ઠ';
|
||||
case 'ડ': return 'ઢ';
|
||||
case 'ન': return 'ણ';
|
||||
case 'ત': return 'થ';
|
||||
case 'દ': return 'ધ';
|
||||
case 'પ': return 'ફ';
|
||||
case 'બ': return 'ભ';
|
||||
case 'મ': return 'ં';
|
||||
case 'લ': return 'ળ';
|
||||
case 'સ': return 'શ';
|
||||
case 'હ': return 'ઃ';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
@@ -520,6 +559,7 @@ public final class KeyModifier
|
||||
case 'j':
|
||||
// Russian vowels
|
||||
case 'у': case 'е': case 'а': case 'о': case 'и':
|
||||
case 'ы': case 'э': case 'ю': case 'я':
|
||||
return c + "\u0301";
|
||||
default: return map_dead_char(c, '\u00B4');
|
||||
}
|
||||
@@ -1084,4 +1124,25 @@ public final class KeyModifier
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_numpad_gujarati =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '0': return "૦";
|
||||
case '1': return "૧";
|
||||
case '2': return "૨";
|
||||
case '3': return "૩";
|
||||
case '4': return "૪";
|
||||
case '5': return "૫";
|
||||
case '6': return "૬";
|
||||
case '7': return "૭";
|
||||
case '8': return "૮";
|
||||
case '9': return "૯";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@@ -26,6 +26,7 @@ public final class KeyValue
|
||||
// Must be evaluated in the reverse order of their values.
|
||||
public static enum Modifier
|
||||
{
|
||||
COMPOSE_PENDING,
|
||||
SHIFT,
|
||||
CTRL,
|
||||
ALT,
|
||||
@@ -88,31 +89,43 @@ public final class KeyValue
|
||||
|
||||
public static enum Kind
|
||||
{
|
||||
Char, String, Keyevent, Event, Modifier, Editing, Placeholder
|
||||
Char, String, Keyevent, Event, Modifier, Editing, Placeholder,
|
||||
Compose_pending
|
||||
}
|
||||
|
||||
private static final int FLAGS_OFFSET = 19;
|
||||
private static final int KIND_OFFSET = 28;
|
||||
|
||||
// Behavior flags.
|
||||
public static final int FLAG_LATCH = (1 << 20);
|
||||
public static final int FLAG_LOCK = (1 << 21);
|
||||
public static final int FLAG_LATCH = (1 << FLAGS_OFFSET << 0);
|
||||
// Key can be locked by typing twice
|
||||
public static final int FLAG_LOCK = (1 << FLAGS_OFFSET << 1);
|
||||
// Special keys are not repeated and don't clear latched modifiers.
|
||||
public static final int FLAG_SPECIAL = (1 << 22);
|
||||
// Free flag: (1 << 23);
|
||||
public static final int FLAG_SPECIAL = (1 << FLAGS_OFFSET << 2);
|
||||
// Whether the symbol should be greyed out. For example, keys that are not
|
||||
// part of the pending compose sequence.
|
||||
public static final int FLAG_GREYED = (1 << FLAGS_OFFSET << 3);
|
||||
// Rendering flags.
|
||||
public static final int FLAG_KEY_FONT = (1 << 24); // special font file
|
||||
public static final int FLAG_SMALLER_FONT = (1 << 25); // 25% smaller symbols
|
||||
public static final int FLAG_SECONDARY = (1 << 26); // dimmer
|
||||
public static final int FLAG_KEY_FONT = (1 << FLAGS_OFFSET << 4); // special font file
|
||||
public static final int FLAG_SMALLER_FONT = (1 << FLAGS_OFFSET << 5); // 25% smaller symbols
|
||||
public static final int FLAG_SECONDARY = (1 << FLAGS_OFFSET << 6); // dimmer
|
||||
// Used by [Pointers].
|
||||
public static final int FLAG_LOCKED = (1 << 28);
|
||||
public static final int FLAG_FAKE_PTR = (1 << 29);
|
||||
// Free: (1 << FLAGS_OFFSET << 7)
|
||||
// Free: (1 << FLAGS_OFFSET << 8)
|
||||
|
||||
// Ranges for the different components
|
||||
private static final int FLAGS_BITS = (0b111111111 << 20); // 9 bits wide
|
||||
private static final int KIND_BITS = (0b111 << 29); // 3 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 VALUE_BITS = ~(FLAGS_BITS | KIND_BITS); // 20 bits wide
|
||||
|
||||
static
|
||||
{
|
||||
check((FLAGS_BITS & KIND_BITS) == 0); // No overlap
|
||||
check((FLAGS_BITS | KIND_BITS | VALUE_BITS) == ~0); // No holes
|
||||
// No kind is out of range
|
||||
check((((Kind.values().length - 1) << KIND_OFFSET) & ~KIND_BITS) == 0);
|
||||
}
|
||||
|
||||
private final String _symbol;
|
||||
@@ -122,7 +135,7 @@ public final class KeyValue
|
||||
|
||||
public Kind getKind()
|
||||
{
|
||||
return Kind.values()[(_code & KIND_BITS) >>> 29];
|
||||
return Kind.values()[(_code & KIND_BITS) >>> KIND_OFFSET];
|
||||
}
|
||||
|
||||
public int getFlags()
|
||||
@@ -130,9 +143,9 @@ public final class KeyValue
|
||||
return (_code & FLAGS_BITS);
|
||||
}
|
||||
|
||||
public boolean hasFlags(int has)
|
||||
public boolean hasFlagsAny(int has)
|
||||
{
|
||||
return ((_code & has) == has);
|
||||
return ((_code & has) != 0);
|
||||
}
|
||||
|
||||
/** The string to render on the keyboard.
|
||||
@@ -172,11 +185,18 @@ public final class KeyValue
|
||||
return Editing.values()[(_code & VALUE_BITS)];
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Placeholder]. */
|
||||
public Placeholder getPlaceholder()
|
||||
{
|
||||
return Placeholder.values()[(_code & VALUE_BITS)];
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Compose_pending]. */
|
||||
public int getPendingCompose()
|
||||
{
|
||||
return (_code & VALUE_BITS);
|
||||
}
|
||||
|
||||
/* Update the char and the symbol. */
|
||||
public KeyValue withChar(char c)
|
||||
{
|
||||
@@ -220,16 +240,13 @@ public final class KeyValue
|
||||
|
||||
public KeyValue(String s, int kind, int value, int flags)
|
||||
{
|
||||
check((kind & ~KIND_BITS) == 0);
|
||||
check((flags & ~FLAGS_BITS) == 0);
|
||||
check((value & ~VALUE_BITS) == 0);
|
||||
_symbol = s;
|
||||
_code = kind | flags | value;
|
||||
_code = (kind & KIND_BITS) | (flags & FLAGS_BITS) | (value & VALUE_BITS);
|
||||
}
|
||||
|
||||
public KeyValue(String s, Kind k, int v, int f)
|
||||
{
|
||||
this(s, (k.ordinal() << 29), v, f);
|
||||
this(s, (k.ordinal() << KIND_OFFSET), v, f);
|
||||
}
|
||||
|
||||
private static KeyValue charKey(String symbol, char c, int flags)
|
||||
@@ -303,6 +320,17 @@ public final class KeyValue
|
||||
return makeStringKey(str, 0);
|
||||
}
|
||||
|
||||
public static KeyValue makeCharKey(char c)
|
||||
{
|
||||
return new KeyValue(String.valueOf(c), Kind.Char, c, 0);
|
||||
}
|
||||
|
||||
public static KeyValue makeComposePending(String symbol, int state, int flags)
|
||||
{
|
||||
return new KeyValue(symbol, Kind.Compose_pending, state,
|
||||
flags | FLAG_SPECIAL);
|
||||
}
|
||||
|
||||
/** Make a key that types a string. A char key is returned for a string of
|
||||
length 1. */
|
||||
public static KeyValue makeStringKey(String str, int flags)
|
||||
@@ -464,6 +492,9 @@ public final class KeyValue
|
||||
case "textAssist": return editingKey(0xE038, Editing.ASSIST);
|
||||
case "autofill": return editingKey("auto", Editing.AUTOFILL);
|
||||
|
||||
/* The compose key */
|
||||
case "compose": return modifierKey(0xE016, Modifier.COMPOSE_PENDING, FLAG_SECONDARY | FLAG_SMALLER_FONT);
|
||||
|
||||
/* Placeholder keys */
|
||||
case "removed": return placeholderKey(Placeholder.REMOVED);
|
||||
case "f11_placeholder": return placeholderKey(Placeholder.F11);
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
@@ -87,13 +88,19 @@ public class Keyboard2 extends InputMethodService
|
||||
return KeyboardData.load(getResources(), layout_id);
|
||||
}
|
||||
|
||||
/** Load a layout that contains a numpad (eg. the pin entry). */
|
||||
/** Load a layout that contains a numpad. */
|
||||
KeyboardData loadNumpad(int layout_id)
|
||||
{
|
||||
return _config.modify_numpad(KeyboardData.load(getResources(), layout_id),
|
||||
current_layout_unmodified());
|
||||
}
|
||||
|
||||
KeyboardData loadPinentry(int layout_id)
|
||||
{
|
||||
return _config.modify_pinentry(KeyboardData.load(getResources(), layout_id),
|
||||
current_layout_unmodified());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate()
|
||||
{
|
||||
@@ -118,6 +125,7 @@ public class Keyboard2 extends InputMethodService
|
||||
return Arrays.asList();
|
||||
}
|
||||
|
||||
@TargetApi(12)
|
||||
private ExtraKeys extra_keys_of_subtype(InputMethodSubtype subtype)
|
||||
{
|
||||
String extra_keys = subtype.getExtraValueOf("extra_keys");
|
||||
@@ -127,6 +135,7 @@ public class Keyboard2 extends InputMethodService
|
||||
return ExtraKeys.EMPTY;
|
||||
}
|
||||
|
||||
@TargetApi(12)
|
||||
private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype)
|
||||
{
|
||||
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
|
||||
@@ -227,7 +236,7 @@ public class Keyboard2 extends InputMethodService
|
||||
case InputType.TYPE_CLASS_PHONE:
|
||||
case InputType.TYPE_CLASS_DATETIME:
|
||||
if (_config.pin_entry_enabled)
|
||||
return loadNumpad(R.xml.pin);
|
||||
return loadPinentry(R.xml.pin);
|
||||
else
|
||||
return loadNumpad(R.xml.numeric);
|
||||
default:
|
||||
@@ -431,6 +440,11 @@ public class Keyboard2 extends InputMethodService
|
||||
_keyboardView.set_shift_state(state, lock);
|
||||
}
|
||||
|
||||
public void set_compose_pending(boolean pending)
|
||||
{
|
||||
_keyboardView.set_compose_pending(pending);
|
||||
}
|
||||
|
||||
public InputConnection getCurrentInputConnection()
|
||||
{
|
||||
return Keyboard2.this.getCurrentInputConnection();
|
||||
|
@@ -25,6 +25,10 @@ public class Keyboard2View extends View
|
||||
private KeyValue _shift_kv;
|
||||
private KeyboardData.Key _shift_key;
|
||||
|
||||
/** Used to add fake pointers. */
|
||||
private KeyValue _compose_kv;
|
||||
private KeyboardData.Key _compose_key;
|
||||
|
||||
private Pointers _pointers;
|
||||
|
||||
private Pointers.Modifiers _mods;
|
||||
@@ -77,12 +81,14 @@ public class Keyboard2View extends View
|
||||
return;
|
||||
// The intermediate Window is a [Dialog].
|
||||
Window w = getParentWindow(context);
|
||||
w.setNavigationBarColor(_theme.colorNavBar);
|
||||
if (VERSION.SDK_INT < 26)
|
||||
return;
|
||||
int uiFlags = getSystemUiVisibility();
|
||||
if (_theme.isLightNavBar)
|
||||
uiFlags |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
||||
else
|
||||
uiFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
||||
w.setNavigationBarColor(_theme.colorNavBar);
|
||||
setSystemUiVisibility(uiFlags);
|
||||
}
|
||||
|
||||
@@ -96,6 +102,8 @@ public class Keyboard2View extends View
|
||||
_shift_kv = _shift_kv.withFlags(_shift_kv.getFlags() | KeyValue.FLAG_LOCK);
|
||||
_shift_key = _keyboard.findKeyWithValue(_shift_kv);
|
||||
}
|
||||
_compose_kv = KeyValue.getKeyByName("compose");
|
||||
_compose_key = _keyboard.findKeyWithValue(_compose_kv);
|
||||
reset();
|
||||
}
|
||||
|
||||
@@ -107,24 +115,24 @@ public class Keyboard2View extends View
|
||||
invalidate();
|
||||
}
|
||||
|
||||
/** Called by auto-capitalisation. */
|
||||
public void set_shift_state(boolean state, boolean lock)
|
||||
void set_fake_ptr_latched(KeyboardData.Key key, KeyValue kv, boolean latched,
|
||||
boolean lock)
|
||||
{
|
||||
if (_keyboard == null || _shift_key == null)
|
||||
if (_keyboard == null || key == null)
|
||||
return;
|
||||
int flags = _pointers.getKeyFlags(_shift_key, _shift_kv);
|
||||
if (state)
|
||||
{
|
||||
if (flags != -1 && !lock)
|
||||
return; // Don't replace an existing pointer
|
||||
_pointers.add_fake_pointer(_shift_kv, _shift_key, lock);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_FAKE_PTR) == 0)
|
||||
return; // Don't remove locked pointers
|
||||
_pointers.remove_fake_pointer(_shift_kv, _shift_key);
|
||||
}
|
||||
_pointers.set_fake_pointer_state(key, kv, latched, lock);
|
||||
}
|
||||
|
||||
/** Called by auto-capitalisation. */
|
||||
public void set_shift_state(boolean latched, boolean lock)
|
||||
{
|
||||
set_fake_ptr_latched(_shift_key, _shift_kv, latched, lock);
|
||||
}
|
||||
|
||||
/** Called from [KeyEventHandler]. */
|
||||
public void set_compose_pending(boolean pending)
|
||||
{
|
||||
set_fake_ptr_latched(_compose_key, _compose_kv, pending, false);
|
||||
}
|
||||
|
||||
public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods)
|
||||
@@ -299,16 +307,20 @@ public class Keyboard2View extends View
|
||||
_theme.keyBgPaint.setAlpha(_config.keyOpacity);
|
||||
_theme.keyDownBgPaint.setAlpha(_config.keyActivatedOpacity);
|
||||
_theme.keyBorderPaint.setAlpha(_config.keyOpacity);
|
||||
float y = _config.marginTop + _config.keyVerticalInterval / 2;
|
||||
float key_vertical_margin = _config.key_vertical_margin * _config.keyHeight;
|
||||
float key_horizontal_margin = _config.key_horizontal_margin * _keyWidth;
|
||||
// Add half of the key margin on the left and on the top as it's then added
|
||||
// on the right and on the bottom of every keys.
|
||||
float y = _config.marginTop + key_vertical_margin / 2;
|
||||
for (KeyboardData.Row row : _keyboard.rows)
|
||||
{
|
||||
y += row.shift * _config.keyHeight;
|
||||
float x = _config.horizontal_margin + _config.keyHorizontalInterval / 2;
|
||||
float keyH = row.height * _config.keyHeight - _config.keyVerticalInterval;
|
||||
float x = _config.horizontal_margin + key_horizontal_margin / 2;
|
||||
float keyH = row.height * _config.keyHeight - key_vertical_margin;
|
||||
for (KeyboardData.Key k : row.keys)
|
||||
{
|
||||
x += k.shift * _keyWidth;
|
||||
float keyW = _keyWidth * k.width - _config.keyHorizontalInterval;
|
||||
float keyW = _keyWidth * k.width - key_horizontal_margin;
|
||||
boolean isKeyDown = _pointers.isKeyDown(k);
|
||||
drawKeyFrame(canvas, x, y, keyW, keyH, isKeyDown);
|
||||
if (k.keys[0] != null)
|
||||
@@ -339,9 +351,13 @@ public class Keyboard2View extends View
|
||||
boolean isKeyDown)
|
||||
{
|
||||
float r = _theme.keyBorderRadius;
|
||||
float w = isKeyDown ? _theme.keyBorderWidthActivated : _theme.keyBorderWidth;
|
||||
float w2 = _theme.keyBorderWidth / 2.f;
|
||||
_tmpRect.set(x + w2, y + w2, x + keyW - w2, y + keyH - w2);
|
||||
if (_config.borderConfig)
|
||||
r = _config.customBorderRadius * _keyWidth;
|
||||
float w = (_config.borderConfig) ? _config.customBorderLineWidth : _theme.keyBorderWidth;
|
||||
float padding = w / 2.f;
|
||||
if (isKeyDown)
|
||||
w = _theme.keyBorderWidthActivated;
|
||||
_tmpRect.set(x + padding, y + padding, x + keyW - padding, y + keyH - padding);
|
||||
canvas.drawRoundRect(_tmpRect, r, r,
|
||||
isKeyDown ? _theme.keyDownBgPaint : _theme.keyBgPaint);
|
||||
if (w > 0.f)
|
||||
@@ -349,8 +365,8 @@ public class Keyboard2View extends View
|
||||
_theme.keyBorderPaint.setStrokeWidth(w);
|
||||
float overlap = r - r * 0.85f + w; // sin(45°)
|
||||
drawBorder(canvas, x, y, x + overlap, y + keyH, _theme.keyBorderColorLeft);
|
||||
drawBorder(canvas, x, y, x + keyW, y + overlap, _theme.keyBorderColorTop);
|
||||
drawBorder(canvas, x + keyW - overlap, y, x + keyW, y + keyH, _theme.keyBorderColorRight);
|
||||
drawBorder(canvas, x, y, x + keyW, y + overlap, _theme.keyBorderColorTop);
|
||||
drawBorder(canvas, x, y + keyH - overlap, x + keyW, y + keyH, _theme.keyBorderColorBottom);
|
||||
}
|
||||
}
|
||||
@@ -362,6 +378,8 @@ public class Keyboard2View extends View
|
||||
{
|
||||
Paint p = _theme.keyBorderPaint;
|
||||
float r = _theme.keyBorderRadius;
|
||||
if (_config.borderConfig)
|
||||
r = _config.customBorderRadius * _keyWidth;
|
||||
canvas.save();
|
||||
canvas.clipRect(clipl, clipt, clipr, clipb);
|
||||
p.setColor(color);
|
||||
@@ -376,13 +394,17 @@ public class Keyboard2View extends View
|
||||
int flags = _pointers.getKeyFlags(k);
|
||||
if (flags != -1)
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_LOCKED) != 0)
|
||||
if ((flags & Pointers.FLAG_P_LOCKED) != 0)
|
||||
return _theme.lockedColor;
|
||||
return _theme.activatedColor;
|
||||
}
|
||||
}
|
||||
if (k.hasFlags(KeyValue.FLAG_SECONDARY))
|
||||
if (k.hasFlagsAny(KeyValue.FLAG_SECONDARY | KeyValue.FLAG_GREYED))
|
||||
{
|
||||
if (k.hasFlagsAny(KeyValue.FLAG_GREYED))
|
||||
return _theme.greyedLabelColor;
|
||||
return _theme.secondaryLabelColor;
|
||||
}
|
||||
return sublabel ? _theme.subLabelColor : _theme.labelColor;
|
||||
}
|
||||
|
||||
@@ -392,7 +414,7 @@ public class Keyboard2View extends View
|
||||
if (kv == null)
|
||||
return;
|
||||
float textSize = scaleTextSize(kv, _config.labelTextSize, keyH);
|
||||
Paint p = _theme.labelPaint(kv.hasFlags(KeyValue.FLAG_KEY_FONT));
|
||||
Paint p = _theme.labelPaint(kv.hasFlagsAny(KeyValue.FLAG_KEY_FONT));
|
||||
p.setColor(labelColor(kv, isKeyDown, false));
|
||||
p.setAlpha(_config.labelBrightness);
|
||||
p.setTextSize(textSize);
|
||||
@@ -408,7 +430,7 @@ public class Keyboard2View extends View
|
||||
if (kv == null)
|
||||
return;
|
||||
float textSize = scaleTextSize(kv, _config.sublabelTextSize, keyH);
|
||||
Paint p = _theme.subLabelPaint(kv.hasFlags(KeyValue.FLAG_KEY_FONT), 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);
|
||||
@@ -442,7 +464,7 @@ public class Keyboard2View extends View
|
||||
|
||||
private float scaleTextSize(KeyValue k, float rel_size, float keyH)
|
||||
{
|
||||
float smaller_font = k.hasFlags(KeyValue.FLAG_SMALLER_FONT) ? 0.75f : 1.f;
|
||||
float smaller_font = k.hasFlagsAny(KeyValue.FLAG_SMALLER_FONT) ? 0.75f : 1.f;
|
||||
return keyH * rel_size * smaller_font * _config.characterSize;
|
||||
}
|
||||
}
|
||||
|
@@ -132,10 +132,10 @@ public final class KeyboardData
|
||||
return new KeyboardData(this, extendedRows);
|
||||
}
|
||||
|
||||
public KeyboardData addNumberRow()
|
||||
public KeyboardData addTopRow(Row row)
|
||||
{
|
||||
ArrayList<Row> rows_ = new ArrayList<Row>(this.rows);
|
||||
rows_.add(0, number_row.updateWidth(keysWidth));
|
||||
rows_.add(0, row.updateWidth(keysWidth));
|
||||
return new KeyboardData(this, rows_);
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioManager;
|
||||
@@ -31,7 +32,7 @@ public class LauncherActivity extends Activity
|
||||
_intro_video = (VideoView)findViewById(R.id.launcher_intro_video);
|
||||
_tryhere_text = (TextView)findViewById(R.id.launcher_tryhere_text);
|
||||
_tryhere_area = (EditText)findViewById(R.id.launcher_tryhere_area);
|
||||
if (VERSION.SDK_INT > 28)
|
||||
if (VERSION.SDK_INT >= 28)
|
||||
_tryhere_area.addOnUnhandledKeyEventListener(
|
||||
this.new Tryhere_OnUnhandledKeyEventListener());
|
||||
setup_intro_video(_intro_video);
|
||||
@@ -76,6 +77,7 @@ public class LauncherActivity extends Activity
|
||||
v.start();
|
||||
}
|
||||
|
||||
@TargetApi(28)
|
||||
final class Tryhere_OnUnhandledKeyEventListener implements View.OnUnhandledKeyEventListener
|
||||
{
|
||||
public boolean onUnhandledKeyEvent(View v, KeyEvent ev)
|
||||
|
@@ -13,6 +13,13 @@ import java.util.NoSuchElementException;
|
||||
*/
|
||||
public final class Pointers implements Handler.Callback
|
||||
{
|
||||
public static final int FLAG_P_LATCHABLE = 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_LOCKABLE = (1 << 3);
|
||||
public static final int FLAG_P_LOCKED = (1 << 4);
|
||||
public static final int FLAG_P_SLIDING = (1 << 5);
|
||||
|
||||
private Handler _keyrepeat_handler;
|
||||
private ArrayList<Pointer> _ptrs = new ArrayList<Pointer>();
|
||||
private IPointerEventHandler _handler;
|
||||
@@ -41,8 +48,8 @@ public final class Pointers implements Handler.Callback
|
||||
{
|
||||
Pointer p = _ptrs.get(i);
|
||||
if (p.value != null && p.value.getKind() == KeyValue.Kind.Modifier
|
||||
&& !(skip_latched && p.pointerId == -1
|
||||
&& (p.flags & KeyValue.FLAG_LOCKED) == 0))
|
||||
&& !(skip_latched && p.hasFlagsAny(FLAG_P_LATCHED)
|
||||
&& (p.flags & FLAG_P_LOCKED) == 0))
|
||||
mods[n_mods++] = p.value.getModifier();
|
||||
}
|
||||
return Modifiers.ofArray(mods, n_mods);
|
||||
@@ -63,13 +70,7 @@ public final class Pointers implements Handler.Callback
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* These flags can be different:
|
||||
* FLAG_LOCK Removed when the key is locked
|
||||
* FLAG_LOCKED Added when the key is locked
|
||||
* FLAG_LATCH Removed when the key is latched (released but not consumed yet)
|
||||
* Returns [-1] if not found.
|
||||
*/
|
||||
/** See [FLAG_P_*] flags. Returns [-1] if the key is not pressed. */
|
||||
public int getKeyFlags(KeyValue kv)
|
||||
{
|
||||
for (Pointer p : _ptrs)
|
||||
@@ -78,34 +79,50 @@ public final class Pointers implements Handler.Callback
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int getKeyFlags(KeyboardData.Key key, KeyValue kv)
|
||||
/** The key must not be already latched . */
|
||||
void add_fake_pointer(KeyboardData.Key key, KeyValue kv, boolean locked)
|
||||
{
|
||||
Pointer ptr = getLatched(key, kv);
|
||||
if (ptr == null) return -1;
|
||||
return ptr.flags;
|
||||
}
|
||||
|
||||
/** Fake pointers are latched and not lockable. */
|
||||
public void add_fake_pointer(KeyValue kv, KeyboardData.Key key, boolean locked)
|
||||
{
|
||||
Pointer ptr = getLatched(key, kv);
|
||||
if (ptr != null)
|
||||
removePtr(ptr); // Already latched, replace pointer.
|
||||
ptr = new Pointer(-1, key, kv, 0.f, 0.f, Modifiers.EMPTY);
|
||||
ptr.flags &= ~(KeyValue.FLAG_LATCH | KeyValue.FLAG_LOCK);
|
||||
ptr.flags |= KeyValue.FLAG_FAKE_PTR;
|
||||
Pointer ptr = new Pointer(-1, key, kv, 0.f, 0.f, Modifiers.EMPTY);
|
||||
ptr.flags = FLAG_P_FAKE | FLAG_P_LATCHED;
|
||||
if (locked)
|
||||
ptr.flags |= KeyValue.FLAG_LOCKED;
|
||||
ptr.flags |= FLAG_P_LOCKED;
|
||||
_ptrs.add(ptr);
|
||||
_handler.onPointerFlagsChanged(false);
|
||||
}
|
||||
|
||||
public void remove_fake_pointer(KeyValue kv, KeyboardData.Key key)
|
||||
/** Set whether a key is latched or locked by adding a "fake" pointer, a
|
||||
pointer that is not due to user interaction.
|
||||
This is used by auto-capitalisation.
|
||||
|
||||
When [lock] is true, [latched] control whether the modifier is locked or disabled.
|
||||
When [lock] is false, an existing locked pointer is not affected. */
|
||||
public void set_fake_pointer_state(KeyboardData.Key key, KeyValue kv,
|
||||
boolean latched, boolean lock)
|
||||
{
|
||||
Pointer ptr = getLatched(key, kv);
|
||||
if (ptr != null && (ptr.flags & KeyValue.FLAG_FAKE_PTR) != 0)
|
||||
if (ptr == null)
|
||||
{
|
||||
// No existing pointer, latch the key.
|
||||
if (latched)
|
||||
add_fake_pointer(key, kv, lock);
|
||||
}
|
||||
else if ((ptr.flags & FLAG_P_FAKE) != 0)
|
||||
{} // Key already latched but not by a fake ptr, do nothing.
|
||||
else if (lock)
|
||||
{
|
||||
// Acting on locked modifiers, replace the pointer each time.
|
||||
removePtr(ptr);
|
||||
_handler.onPointerFlagsChanged(false);
|
||||
if (latched)
|
||||
add_fake_pointer(key, kv, lock);
|
||||
}
|
||||
else if ((ptr.flags & FLAG_P_LOCKED) != 0)
|
||||
{} // Existing ptr is locked but [lock] is false, do not continue.
|
||||
else if (!latched)
|
||||
{
|
||||
// Key is latched by a fake ptr. Unlatch if requested.
|
||||
removePtr(ptr);
|
||||
_handler.onPointerFlagsChanged(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Receiving events
|
||||
@@ -115,7 +132,7 @@ public final class Pointers implements Handler.Callback
|
||||
Pointer ptr = getPtr(pointerId);
|
||||
if (ptr == null)
|
||||
return;
|
||||
if (ptr.sliding)
|
||||
if (ptr.hasFlagsAny(FLAG_P_SLIDING))
|
||||
{
|
||||
clearLatched();
|
||||
onTouchUp_sliding(ptr);
|
||||
@@ -126,7 +143,7 @@ public final class Pointers implements Handler.Callback
|
||||
if (latched != null) // Already latched
|
||||
{
|
||||
removePtr(ptr); // Remove dupplicate
|
||||
if ((latched.flags & KeyValue.FLAG_LOCK) != 0) // Toggle lockable key
|
||||
if ((latched.flags & FLAG_P_LOCKABLE) != 0) // Toggle lockable key
|
||||
lockPointer(latched, false);
|
||||
else // Otherwise, unlatch
|
||||
{
|
||||
@@ -134,10 +151,10 @@ public final class Pointers implements Handler.Callback
|
||||
_handler.onPointerUp(ptr.value, ptr.modifiers);
|
||||
}
|
||||
}
|
||||
else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
|
||||
else if ((ptr.flags & FLAG_P_LATCHABLE) != 0)
|
||||
{
|
||||
ptr.flags &= ~KeyValue.FLAG_LATCH;
|
||||
ptr.pointerId = -1; // Latch
|
||||
ptr.flags |= FLAG_P_LATCHED;
|
||||
ptr.pointerId = -1;
|
||||
_handler.onPointerFlagsChanged(false);
|
||||
}
|
||||
else
|
||||
@@ -158,7 +175,8 @@ public final class Pointers implements Handler.Callback
|
||||
private boolean isOtherPointerDown()
|
||||
{
|
||||
for (Pointer p : _ptrs)
|
||||
if (p.pointerId != -1 && (p.flags & KeyValue.FLAG_SPECIAL) == 0)
|
||||
if (!p.hasFlagsAny(FLAG_P_LATCHED) &&
|
||||
(p.value == null || !p.value.hasFlagsAny(KeyValue.FLAG_SPECIAL)))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -230,7 +248,7 @@ public final class Pointers implements Handler.Callback
|
||||
float dx = x - ptr.downX;
|
||||
float dy = y - ptr.downY;
|
||||
|
||||
if (ptr.sliding)
|
||||
if (ptr.hasFlagsAny(FLAG_P_SLIDING))
|
||||
{
|
||||
onTouchMove_sliding(ptr, dx);
|
||||
return;
|
||||
@@ -259,7 +277,7 @@ public final class Pointers implements Handler.Callback
|
||||
if (newValue != null && !newValue.equals(ptr.value))
|
||||
{
|
||||
ptr.value = newValue;
|
||||
ptr.flags = newValue.getFlags();
|
||||
ptr.flags = pointer_flags_of_kv(newValue);
|
||||
// Sliding mode is entered when key5 or key6 is down on a slider key.
|
||||
if (ptr.key.slider &&
|
||||
(newValue.equals(ptr.key.getKeyValue(5))
|
||||
@@ -297,7 +315,8 @@ public final class Pointers implements Handler.Callback
|
||||
if (v == null)
|
||||
return null;
|
||||
for (Pointer p : _ptrs)
|
||||
if (p.key == k && p.pointerId == -1 && p.value != null && p.value.equals(v))
|
||||
if (p.key == k && p.hasFlagsAny(FLAG_P_LATCHED)
|
||||
&& p.value != null && p.value.equals(v))
|
||||
return p;
|
||||
return null;
|
||||
}
|
||||
@@ -308,25 +327,25 @@ public final class Pointers implements Handler.Callback
|
||||
{
|
||||
Pointer ptr = _ptrs.get(i);
|
||||
// Latched and not locked, remove
|
||||
if (ptr.pointerId == -1 && (ptr.flags & KeyValue.FLAG_LOCKED) == 0)
|
||||
if (ptr.hasFlagsAny(FLAG_P_LATCHED) && (ptr.flags & FLAG_P_LOCKED) == 0)
|
||||
_ptrs.remove(i);
|
||||
// Not latched but pressed, don't latch once released and stop long press.
|
||||
else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
|
||||
ptr.flags &= ~KeyValue.FLAG_LATCH;
|
||||
else if ((ptr.flags & FLAG_P_LATCHABLE) != 0)
|
||||
ptr.flags &= ~FLAG_P_LATCHABLE;
|
||||
}
|
||||
}
|
||||
|
||||
/** Make a pointer into the locked state. */
|
||||
private void lockPointer(Pointer ptr, boolean shouldVibrate)
|
||||
{
|
||||
ptr.flags = (ptr.flags & ~KeyValue.FLAG_LOCK) | KeyValue.FLAG_LOCKED;
|
||||
ptr.flags = (ptr.flags & ~FLAG_P_LOCKABLE) | FLAG_P_LOCKED;
|
||||
_handler.onPointerFlagsChanged(shouldVibrate);
|
||||
}
|
||||
|
||||
boolean isSliding()
|
||||
{
|
||||
for (Pointer ptr : _ptrs)
|
||||
if (ptr.sliding)
|
||||
if (ptr.hasFlagsAny(FLAG_P_SLIDING))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -374,24 +393,23 @@ public final class Pointers implements Handler.Callback
|
||||
private boolean handleKeyRepeat(Pointer ptr)
|
||||
{
|
||||
// Long press toggle lock on modifiers
|
||||
if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
|
||||
if ((ptr.flags & FLAG_P_LATCHABLE) != 0)
|
||||
{
|
||||
lockPointer(ptr, true);
|
||||
return false;
|
||||
}
|
||||
// Stop repeating: Latched key, no key
|
||||
if (ptr.pointerId == -1 || ptr.value == null)
|
||||
if (ptr.hasFlagsAny(FLAG_P_LATCHED) || ptr.value == null)
|
||||
return false;
|
||||
KeyValue kv = KeyModifier.modify_long_press(ptr.value);
|
||||
if (!kv.equals(ptr.value))
|
||||
{
|
||||
ptr.value = kv;
|
||||
ptr.flags = kv.getFlags();
|
||||
_handler.onPointerDown(kv, true);
|
||||
return true;
|
||||
}
|
||||
// Stop repeating: Special keys
|
||||
if (kv.hasFlags(KeyValue.FLAG_SPECIAL))
|
||||
if (kv.hasFlagsAny(KeyValue.FLAG_SPECIAL))
|
||||
return false;
|
||||
_handler.onPointerHold(kv, ptr.modifiers);
|
||||
return true;
|
||||
@@ -402,7 +420,7 @@ public final class Pointers implements Handler.Callback
|
||||
void startSliding(Pointer ptr, float initial_dy)
|
||||
{
|
||||
stopKeyRepeat(ptr);
|
||||
ptr.sliding = true;
|
||||
ptr.flags |= FLAG_P_SLIDING;
|
||||
ptr.sliding_count = (int)(initial_dy / _config.slide_step_px);
|
||||
}
|
||||
|
||||
@@ -429,6 +447,17 @@ public final class Pointers implements Handler.Callback
|
||||
_handler.onPointerHold(newValue, ptr.modifiers);
|
||||
}
|
||||
|
||||
/** Return the [FLAG_P_*] flags that correspond to pressing [kv]. */
|
||||
static int pointer_flags_of_kv(KeyValue kv)
|
||||
{
|
||||
int flags = 0;
|
||||
if (kv.hasFlagsAny(KeyValue.FLAG_LATCH))
|
||||
flags |= FLAG_P_LATCHABLE;
|
||||
if (kv.hasFlagsAny(KeyValue.FLAG_LOCK))
|
||||
flags |= FLAG_P_LOCKABLE;
|
||||
return flags;
|
||||
}
|
||||
|
||||
private static final class Pointer
|
||||
{
|
||||
/** -1 when latched. */
|
||||
@@ -443,12 +472,10 @@ public final class Pointers implements Handler.Callback
|
||||
public float downY;
|
||||
/** Modifier flags at the time the key was pressed. */
|
||||
public Modifiers modifiers;
|
||||
/** Flags of the value. Latch, lock and locked flags are updated. */
|
||||
/** See [FLAG_P_*] flags. */
|
||||
public int flags;
|
||||
/** Identify timeout messages. */
|
||||
public int timeoutWhat;
|
||||
/** Whether the pointer is "sliding" laterally on a key. */
|
||||
public boolean sliding;
|
||||
/** Number of event already caused by sliding. */
|
||||
public int sliding_count;
|
||||
|
||||
@@ -461,11 +488,15 @@ public final class Pointers implements Handler.Callback
|
||||
downX = x;
|
||||
downY = y;
|
||||
modifiers = m;
|
||||
flags = (v == null) ? 0 : v.getFlags();
|
||||
flags = (v == null) ? 0 : pointer_flags_of_kv(v);
|
||||
timeoutWhat = -1;
|
||||
sliding = false;
|
||||
sliding_count = 0;
|
||||
}
|
||||
|
||||
public boolean hasFlagsAny(int has)
|
||||
{
|
||||
return ((flags & has) != 0);
|
||||
}
|
||||
}
|
||||
|
||||
/** Represent modifiers currently activated.
|
||||
@@ -583,7 +614,7 @@ public final class Pointers implements Handler.Callback
|
||||
public interface IPointerEventHandler
|
||||
{
|
||||
/** Key can be modified or removed by returning [null]. */
|
||||
public KeyValue modifyKey(KeyValue k, Modifiers flags);
|
||||
public KeyValue modifyKey(KeyValue k, Modifiers mods);
|
||||
|
||||
/** A key is pressed. [getModifiers()] is uptodate. Might be called after a
|
||||
press or a swipe to a different value. Down events are not paired with
|
||||
@@ -592,12 +623,12 @@ public final class Pointers implements Handler.Callback
|
||||
|
||||
/** Key is released. [k] is the key that was returned by
|
||||
[modifySelectedKey] or [modifySelectedKey]. */
|
||||
public void onPointerUp(KeyValue k, Modifiers flags);
|
||||
public void onPointerUp(KeyValue k, Modifiers mods);
|
||||
|
||||
/** Flags changed because latched or locked keys or cancelled pointers. */
|
||||
public void onPointerFlagsChanged(boolean shouldVibrate);
|
||||
|
||||
/** Key is repeating. */
|
||||
public void onPointerHold(KeyValue k, Modifiers flags);
|
||||
public void onPointerHold(KeyValue k, Modifiers mods);
|
||||
}
|
||||
}
|
||||
|
@@ -17,6 +17,7 @@ public class Theme
|
||||
public final int labelColor;
|
||||
public final int subLabelColor;
|
||||
public final int secondaryLabelColor;
|
||||
public final int greyedLabelColor;
|
||||
|
||||
public final float keyBorderRadius;
|
||||
public final float keyBorderWidth;
|
||||
@@ -48,8 +49,10 @@ public class Theme
|
||||
activatedColor = s.getColor(R.styleable.keyboard_colorLabelActivated, 0);
|
||||
lockedColor = s.getColor(R.styleable.keyboard_colorLabelLocked, 0);
|
||||
subLabelColor = s.getColor(R.styleable.keyboard_colorSubLabel, 0);
|
||||
float secondaryLightOffset = s.getFloat(R.styleable.keyboard_secondaryLightOffset, 1.f);
|
||||
secondaryLabelColor = adjustLight(labelColor, secondaryLightOffset);
|
||||
secondaryLabelColor = adjustLight(labelColor,
|
||||
s.getFloat(R.styleable.keyboard_secondaryDimming, 0.25f));
|
||||
greyedLabelColor = adjustLight(labelColor,
|
||||
s.getFloat(R.styleable.keyboard_greyedDimming, 0.5f));
|
||||
keyBorderRadius = s.getDimension(R.styleable.keyboard_keyBorderRadius, 0);
|
||||
keyBorderWidth = s.getDimension(R.styleable.keyboard_keyBorderWidth, 0);
|
||||
keyBorderWidthActivated = s.getDimension(R.styleable.keyboard_keyBorderWidthActivated, 0);
|
||||
@@ -85,11 +88,13 @@ public class Theme
|
||||
return _indicationPaint;
|
||||
}
|
||||
|
||||
int adjustLight(int color, float offset)
|
||||
/** Interpolate the 'value' component toward its opposite by 'alpha'. */
|
||||
int adjustLight(int color, float alpha)
|
||||
{
|
||||
float[] hsv = new float[3];
|
||||
Color.colorToHSV(color, hsv);
|
||||
hsv[2] += offset;
|
||||
float v = hsv[2];
|
||||
hsv[2] = alpha - (2 * alpha - 1) * v;
|
||||
return Color.HSVToColor(hsv);
|
||||
}
|
||||
|
||||
|
@@ -6,6 +6,7 @@ import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.Locale;
|
||||
|
||||
public final class Utils
|
||||
{
|
||||
@@ -16,7 +17,7 @@ public final class Utils
|
||||
return s;
|
||||
// Make sure not to cut a code point in half
|
||||
int i = s.offsetByCodePoints(0, 1);
|
||||
return s.substring(0, i).toUpperCase() + s.substring(i);
|
||||
return s.substring(0, i).toUpperCase(Locale.getDefault()) + s.substring(i);
|
||||
}
|
||||
|
||||
/** Like [dialog.show()] but properly configure layout params when called
|
||||
|
@@ -1,7 +1,6 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build.VERSION;
|
||||
import android.os.Vibrator;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.View;
|
||||
@@ -17,9 +16,8 @@ public final class VibratorCompat
|
||||
}
|
||||
else
|
||||
{
|
||||
if (VERSION.SDK_INT >= 8)
|
||||
v.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP,
|
||||
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
|
||||
v.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP,
|
||||
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -27,8 +27,6 @@ class VoiceImeSwitcher
|
||||
public static boolean switch_to_voice_ime(InputMethodService ims,
|
||||
InputMethodManager imm, SharedPreferences prefs)
|
||||
{
|
||||
if (VERSION.SDK_INT < 11) // Due to InputMethodSubtype
|
||||
return false;
|
||||
List<IME> imes = get_voice_ime_list(imm);
|
||||
String last_used = prefs.getString(PREF_LAST_USED, null);
|
||||
String last_known_imes = prefs.getString(PREF_KNOWN_IMES, null);
|
||||
@@ -46,8 +44,6 @@ class VoiceImeSwitcher
|
||||
public static boolean choose_voice_ime(InputMethodService ims,
|
||||
InputMethodManager imm, SharedPreferences prefs)
|
||||
{
|
||||
if (VERSION.SDK_INT < 11) // Due to InputMethodSubtype
|
||||
return false;
|
||||
List<IME> imes = get_voice_ime_list(imm);
|
||||
choose_voice_ime_and_update_prefs(ims, prefs, imes);
|
||||
return true;
|
||||
@@ -69,7 +65,7 @@ class VoiceImeSwitcher
|
||||
prefs.edit()
|
||||
.putString(PREF_LAST_USED, selected.get_id())
|
||||
.putString(PREF_KNOWN_IMES, serialize_ime_ids(imes))
|
||||
.commit();
|
||||
.apply();
|
||||
switch_input_method(ims, selected);
|
||||
}
|
||||
})
|
||||
|
@@ -51,7 +51,7 @@ public class CustomExtraKeysPreference extends ListGroupPreference<String>
|
||||
void select(final SelectionCallback<String> callback)
|
||||
{
|
||||
new AlertDialog.Builder(getContext())
|
||||
.setView(R.layout.dialog_edit_text)
|
||||
.setView(View.inflate(getContext(), R.layout.dialog_edit_text, null))
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){
|
||||
public void onClick(DialogInterface dialog, int which)
|
||||
{
|
||||
|
@@ -22,6 +22,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
{
|
||||
"alt",
|
||||
"meta",
|
||||
"compose",
|
||||
"voice_typing",
|
||||
"accent_aigu",
|
||||
"accent_grave",
|
||||
@@ -74,6 +75,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
{
|
||||
case "voice_typing":
|
||||
case "change_method":
|
||||
case "compose":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@@ -87,25 +89,26 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
switch (name)
|
||||
{
|
||||
case "capslock": id = R.string.key_descr_capslock; break;
|
||||
case "switch_greekmath": id = R.string.key_descr_switch_greekmath; break;
|
||||
case "change_method": id = R.string.key_descr_change_method; break;
|
||||
case "voice_typing": id = R.string.key_descr_voice_typing; break;
|
||||
case "compose": id = R.string.key_descr_compose; break;
|
||||
case "copy": id = R.string.key_descr_copy; break;
|
||||
case "paste": id = R.string.key_descr_paste; break;
|
||||
case "cut": id = R.string.key_descr_cut; break;
|
||||
case "end": id = R.string.key_descr_end; break;
|
||||
case "home": id = R.string.key_descr_home; break;
|
||||
case "page_down": id = R.string.key_descr_page_down; break;
|
||||
case "page_up": id = R.string.key_descr_page_up; break;
|
||||
case "paste": id = R.string.key_descr_paste; break;
|
||||
case "pasteAsPlainText": id = R.string.key_descr_pasteAsPlainText; break;
|
||||
case "redo": id = R.string.key_descr_redo; break;
|
||||
case "selectAll": id = R.string.key_descr_selectAll; break;
|
||||
case "shareText": id = R.string.key_descr_shareText; break;
|
||||
case "pasteAsPlainText": id = R.string.key_descr_pasteAsPlainText; break;
|
||||
case "subscript": id = R.string.key_descr_subscript; break;
|
||||
case "superscript": id = R.string.key_descr_superscript; break;
|
||||
case "switch_greekmath": id = R.string.key_descr_switch_greekmath; break;
|
||||
case "undo": id = R.string.key_descr_undo; break;
|
||||
case "redo": id = R.string.key_descr_redo; break;
|
||||
case "voice_typing": id = R.string.key_descr_voice_typing; break;
|
||||
case "ª": id = R.string.key_descr_ª; break;
|
||||
case "º": id = R.string.key_descr_º; break;
|
||||
case "superscript": id = R.string.key_descr_superscript; break;
|
||||
case "subscript": id = R.string.key_descr_subscript; break;
|
||||
case "page_up": id = R.string.key_descr_page_up; break;
|
||||
case "page_down": id = R.string.key_descr_page_down; break;
|
||||
case "home": id = R.string.key_descr_home; break;
|
||||
case "end": id = R.string.key_descr_end; break;
|
||||
}
|
||||
if (id == 0)
|
||||
return null;
|
||||
@@ -166,7 +169,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
setKey(pref_key_of_key_name(key_name));
|
||||
setDefaultValue(default_checked);
|
||||
setTitle(title);
|
||||
_key_font = kv.hasFlags(KeyValue.FLAG_KEY_FONT);
|
||||
_key_font = kv.hasFlagsAny(KeyValue.FLAG_KEY_FONT);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -7,6 +7,7 @@ import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.ArrayAdapter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -149,7 +150,7 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
{
|
||||
ArrayAdapter layouts = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, _layout_display_names);
|
||||
new AlertDialog.Builder(getContext())
|
||||
.setView(R.layout.dialog_edit_text)
|
||||
.setView(View.inflate(getContext(), R.layout.dialog_edit_text, null))
|
||||
.setAdapter(layouts, new DialogInterface.OnClickListener(){
|
||||
public void onClick(DialogInterface _dialog, int which)
|
||||
{
|
||||
|
134
srcs/layouts/LICENSE
Normal file
134
srcs/layouts/LICENSE
Normal file
@@ -0,0 +1,134 @@
|
||||
Layout definitions are licensed differently from the rest of the application
|
||||
source code to allow use in other projects related or unrelated to Unexpected
|
||||
Keyboard.
|
||||
|
||||
The following license applies to all the files in the srcs/layouts directory
|
||||
whose name ends in .xml with the exception of:
|
||||
|
||||
- latn_neo2.xml
|
||||
- latn_qwertz.xml
|
||||
|
||||
Files listed as exceptions are licensed under the same license as the rest of
|
||||
the project and might contain copyright notices.
|
||||
|
||||
Creative Commons Legal Code
|
||||
|
||||
CC0 1.0 Universal
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||
HEREUNDER.
|
||||
|
||||
Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for
|
||||
the purpose of contributing to a commons of creative, cultural and
|
||||
scientific works ("Commons") that the public can reliably and without fear
|
||||
of later claims of infringement build upon, modify, incorporate in other
|
||||
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||
and for any purposes, including without limitation commercial purposes.
|
||||
These owners may contribute to the Commons to promote the ideal of a free
|
||||
culture and the further production of creative, cultural and scientific
|
||||
works, or to gain reputation or greater distribution for their Work in
|
||||
part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any
|
||||
expectation of additional consideration or compensation, the person
|
||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not
|
||||
limited to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display,
|
||||
communicate, and translate a Work;
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
iii. publicity and privacy rights pertaining to a person's image or
|
||||
likeness depicted in a Work;
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||
in a Work;
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation
|
||||
thereof, including any amended or successor version of such
|
||||
directive); and
|
||||
vii. other similar, equivalent or corresponding rights throughout the
|
||||
world based on applicable law or treaty, and any national
|
||||
implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||
of action, whether now known or unknown (including existing as well as
|
||||
future claims and causes of action), in the Work (i) in all territories
|
||||
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||
treaty (including future time extensions), (iii) in any current or future
|
||||
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||
including without limitation commercial, advertising or promotional
|
||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||
member of the public at large and to the detriment of Affirmer's heirs and
|
||||
successors, fully intending that such Waiver shall not be subject to
|
||||
revocation, rescission, cancellation, termination, or any other legal or
|
||||
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||
as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||
be judged legally invalid or ineffective under applicable law, then the
|
||||
Waiver shall be preserved to the maximum extent permitted taking into
|
||||
account Affirmer's express Statement of Purpose. In addition, to the
|
||||
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||
maximum duration provided by applicable law or treaty (including future
|
||||
time extensions), (iii) in any current or future medium and for any number
|
||||
of copies, and (iv) for any purpose whatsoever, including without
|
||||
limitation commercial, advertising or promotional purposes (the
|
||||
"License"). The License shall be deemed effective as of the date CC0 was
|
||||
applied by Affirmer to the Work. Should any part of the License for any
|
||||
reason be judged legally invalid or ineffective under applicable law, such
|
||||
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||
of the License, and in such case Affirmer hereby affirms that he or she
|
||||
will not (i) exercise any of his or her remaining Copyright and Related
|
||||
Rights in the Work or (ii) assert any associated claims and causes of
|
||||
action with respect to the Work, in either case contrary to Affirmer's
|
||||
express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
b. Affirmer offers the Work as-is and makes no representations or
|
||||
warranties of any kind concerning the Work, express, implied,
|
||||
statutory or otherwise, including without limitation warranties of
|
||||
title, merchantability, fitness for a particular purpose, non
|
||||
infringement, or the absence of latent or other defects, accuracy, or
|
||||
the present or absence of errors, whether or not discoverable, all to
|
||||
the greatest extent permissible under applicable law.
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without
|
||||
limitation any person's Copyright and Related Rights in the Work.
|
||||
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||
consents, permissions or other rights required for any use of the
|
||||
Work.
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to
|
||||
this CC0 or use of the Work.
|
42
srcs/layouts/arab_hamvaj_tly.xml
Normal file
42
srcs/layouts/arab_hamvaj_tly.xml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<keyboard name="Talysh (تالشی همواج)" script="persian">
|
||||
<row>
|
||||
<key key0="ض" key2="۱"/>
|
||||
<key key0="ص" key1="~" key2="۲" key3="\@"/>
|
||||
<key key0="ث" key1="!" key2="۳" key3="\#"/>
|
||||
<key key0="ق" key1="﷼" key2="۴" key3="$"/>
|
||||
<key key0="ف" key2="۵" key3="٪"/>
|
||||
<key key0="غ" key1="،" key2="۶" key3="^"/>
|
||||
<key key0="ع" key2="۷" key3="&"/>
|
||||
<key key0="ه" key2="۸" key3="*"/>
|
||||
<key key0="خ" key2="۹" key3="(" key4=")"/>
|
||||
<key key0="ح" key2="۰"/>
|
||||
<key key0="ج"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ش" key1="َ" key2="tab"/>
|
||||
<key key0="س" key1="ُ"/>
|
||||
<key key0="ی" key4="ئ"/>
|
||||
<key key0="ب" key1="ّ"/>
|
||||
<key key0="ل" key3="ِ" key4="ﻻ"/>
|
||||
<key key0="ا" key1="آ" key2="-" key3="إ" key4="أ"/>
|
||||
<key key0="ت" key1="_" key2="+"/>
|
||||
<key key0="ن" key4="ۨ"/>
|
||||
<key key0="م"/>
|
||||
<key key0="ک"/>
|
||||
<key key0="گ" key1="ء"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ظ"/>
|
||||
<key key0="ط"/>
|
||||
<key key0="ژ" key2="«"/>
|
||||
<key key0="ز" key1="ْ" key2="»"/>
|
||||
<key key0="ر" key2="."/>
|
||||
<key key0="د" key2="؛" key3=":" key4="ذ"/>
|
||||
<key key0="پ" key2="؟"/>
|
||||
<key key0="و" key1="ۋ" key4="ۊ"/>
|
||||
<key key0="چ"/>
|
||||
<key key0="ٚ" key1="ٛ"/>
|
||||
<key key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
37
srcs/layouts/guj_phonetic_in.xml
Normal file
37
srcs/layouts/guj_phonetic_in.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<keyboard name="ગુજરાતી ફોનેટિક - Gujarati Phonetic" script="gujarati">
|
||||
<row>
|
||||
<key key0="ટ" key1="`" key2="1" key3="!" key4="esc"/>
|
||||
<key key0="ડ" key1="~" key2="2" key3="\@" key4="\#"/>
|
||||
<key key0="ે" key1="એ" key2="3" key3="$" key4="૱"/>
|
||||
<key key0="ર" key1="ઋ" key2="4" key3="ૃ" key4="₹"/>
|
||||
<key key0="ત" key1="ટ" key2="5" key3="%"/>
|
||||
<key key0="ય" key2="6" key3="^"/>
|
||||
<key key0="ુ" key1="ઉ" key2="7" key3="&"/>
|
||||
<key key0="િ" key1="ઇ" key2="8" key3="*" key4="ઁ"/>
|
||||
<key key0="ો" key1="ઓ" key2="9" key3="(" key4=")"/>
|
||||
<key key0="પ" key1="૰" key2="0" key4="॒"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ા" key1="tab" key3="અ"/>
|
||||
<key key0="સ" key1="“" key4="”"/>
|
||||
<key key0="દ" key1="ડ"/>
|
||||
<key key0="્" key1="ૠ" key3="ૄ"/>
|
||||
<key key0="ગ" key2="-" key3="_"/>
|
||||
<key key0="હ" key2="=" key3="+"/>
|
||||
<key key0="જ" key3="{" key4="}"/>
|
||||
<key key0="ક" key1="ૢ" key2="ૡ" key3="[" key4="]"/>
|
||||
<key key0="લ" key1="।" key2="|" key3="\\" key4="॥"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="ઞ" key1="જ્ઞ" key2="ૅ" key3="ઙ" key4="ઍ"/>
|
||||
<key key0="ષ" key1="ક્ષ" key2="ૉ" key3="઼" key4="ઑ"/>
|
||||
<key key0="ચ" key2="<" key3="."/>
|
||||
<key key0="વ" key2=">" key3=","/>
|
||||
<key key0="બ" key2="\?" key3="/"/>
|
||||
<key key0="ન" key2=":" key3=";"/>
|
||||
<key key0="મ" key1="ૐ" key2=""" key3="'" key4="॑" key6="ઽ"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@@ -9,7 +9,7 @@
|
||||
<key key0="r" key2="4" key3="'"/>
|
||||
<key key0="t" key2="5" key3="(" key4=")"/>
|
||||
<key key0="y" key2="6" key3="-" key4="|"/>
|
||||
<key key0="u" key2="7" key4="`"/>
|
||||
<key key0="u" key2="7" key3="à" key4="`"/>
|
||||
<key key0="i" key2="8" key3="_" key4="\\"/>
|
||||
<key key0="o" key2="9" key3="\@" key4="f11_placeholder"/>
|
||||
<key key0="p" key2="0" key3="f12_placeholder"/>
|
||||
@@ -17,12 +17,12 @@
|
||||
<row>
|
||||
<key key0="q" key2="tab"/>
|
||||
<key key0="s" key3="loc ß"/>
|
||||
<key key0="d" key1="accent_grave" key3="accent_aigu"/>
|
||||
<key key0="d" key1="loc accent_grave" key2="é" key3="loc accent_aigu"/>
|
||||
<key key0="f" key3="{" key4="}"/>
|
||||
<key key0="g" key3="[" key4="]"/>
|
||||
<key key0="h" key3="=" key4="+"/>
|
||||
<key key0="j" key1="accent_trema" key2="accent_circonflexe" key3="^"/>
|
||||
<key key0="k" key2="€" key3="$"/>
|
||||
<key key0="j" key1="loc accent_trema" key2="loc accent_circonflexe" key3="^"/>
|
||||
<key key0="k" key1="è" key2="€" key3="$"/>
|
||||
<key key0="l" key2="%"/>
|
||||
<key key0="m" key3="*"/>
|
||||
</row>
|
||||
@@ -30,7 +30,7 @@
|
||||
<key width="2.0" key0="shift" key2="loc capslock"/>
|
||||
<key key0="w" key3="<" key4=">"/>
|
||||
<key key0="x" key1="loc †"/>
|
||||
<key key0="c" key1="accent_cedille" key3="," key4="\?"/>
|
||||
<key key0="c" key1="loc accent_cedille" key2="ç" key3="," key4="\?"/>
|
||||
<key key0="v" key3=";" key4="."/>
|
||||
<key key0="b" key3=":" key4="/"/>
|
||||
<key key0="n" key1="loc accent_tilde" key2="§" key4="!"/>
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- copyright 2022 matthiakl <t-m.42@mailpost.spdns.org> -->
|
||||
<!-- https://neo-layout.org/Layouts/neo/ -->
|
||||
<keyboard name="Neo 2" bottom_row="false" script="latin">
|
||||
<row>
|
||||
@@ -40,11 +41,11 @@
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
<row height="0.95">
|
||||
<key width="1.8" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.2" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.0" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key width="1.2" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key key0="j" key4=";"/>
|
||||
<key width="1.8" key0="enter" key1="loc voice_typing" key2="action"/>
|
||||
</row>
|
||||
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key width="1.1" 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 key0="j" key4=";"/>
|
||||
<key width="1.7" key0="enter" key1="loc voice_typing" key2="action"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
37
srcs/layouts/latn_qwerty_gb.xml
Normal file
37
srcs/layouts/latn_qwerty_gb.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="QWERTY (UK)" script="latin">
|
||||
<row>
|
||||
<key key0="q" key2="1" key4="esc"/>
|
||||
<key key0="w" key2="2" key3="""/>
|
||||
<key key0="e" key1="!" key2="3" key3="loc £" key4="loc €"/>
|
||||
<key key0="r" key2="4" key3="$" key1="loc ₪"/>
|
||||
<key key0="t" key2="5" key3="%"/>
|
||||
<key key0="y" key2="6" key3="^"/>
|
||||
<key key0="u" key2="7" key3="&"/>
|
||||
<key key0="i" key2="8" key3="*"/>
|
||||
<key key0="o" key1="loc accent_macron" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key2="`"/>
|
||||
<key key0="s" key1="loc accent_ring" key2="loc §" key3="loc ß" key4="loc accent_ogonek"/>
|
||||
<key key0="d" key1="loc accent_grave" key3="loc accent_aigu"/>
|
||||
<key key0="f" key1="loc accent_dot_above"/>
|
||||
<key key0="g" key1="loc accent_caron" key2="-" key3="_"/>
|
||||
<key key0="h" key2="=" key3="+"/>
|
||||
<key key0="j" key1="loc accent_trema" key2="loc accent_circonflexe" key4="}" key3="{"/>
|
||||
<key key0="k" key1="loc accent_double_aigu" key3="[" key4="]"/>
|
||||
<key key0="l" key1="\#" key2="~" key3="'" key4="\@"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z" key2="|" key3="\\"/>
|
||||
<key key0="x" key2="loc †"/>
|
||||
<key key0="c" key1="loc accent_cedille" key2="<" key3="."/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key1="loc accent_tilde" key2=":" key3=";"/>
|
||||
<key key0="m"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
37
srcs/layouts/latn_qwerty_sk.xml
Normal file
37
srcs/layouts/latn_qwerty_sk.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="QWERTY (Slovak)" script="latin">
|
||||
<row>
|
||||
<key key0="q" key1="1" key4="esc"/>
|
||||
<key key0="w" key1="2" key3="`"/>
|
||||
<key key0="e" key1="3" key2="€" key3="é" key4="ě"/>
|
||||
<key key0="r" key1="4" key3="ŕ" key4="ř"/>
|
||||
<key key0="t" key1="5" key4="ť"/>
|
||||
<key key0="y" key1="6" key3="ý"/>
|
||||
<key key0="u" key1="7" key2="ü" key3="ú" key4="ů"/>
|
||||
<key key0="i" key1="8" key3="í"/>
|
||||
<key key0="o" key1="9" key2="ö" key3="ó" key4="ô"/>
|
||||
<key key0="p" key1="0" key3="="/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key2="&" key3="á" key4="ä"/>
|
||||
<key key0="s" key1="loc §" key2="$" key3="ś" key4="š"/>
|
||||
<key key0="d" key4="ď"/>
|
||||
<key key0="f" key1="%" key3="\\" key4="/"/>
|
||||
<key key0="g" key1="~" key2="^"/>
|
||||
<key key0="h" key1="+" key2="-" key3="*" key4="÷"/>
|
||||
<key key0="j" key1="{" key2="}" key3="|"/>
|
||||
<key key0="k" key1="[" key2="]" key3="'" key4="""/>
|
||||
<key key0="l" key1="(" key2=")" key3="ĺ" key4="ľ"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z" key4="ž"/>
|
||||
<key key0="x" key1="loc †" key2="\#"/>
|
||||
<key key0="c" key4="č"/>
|
||||
<key key0="v" key4="\@"/>
|
||||
<key key0="b" key1="<" key2=">" key3=";" key4=":"/>
|
||||
<key key0="n" key3="_" key4="ň"/>
|
||||
<key key0="m" key1="!" key2="\?" key3="," key4="."/>
|
||||
<key width="1.5" key0="backspace" key3="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
43
srcs/layouts/latn_qwerty_tly.xml
Normal file
43
srcs/layouts/latn_qwerty_tly.xml
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<keyboard name="QWERTY (Talysh New Latin)" script="latin">
|
||||
<row>
|
||||
<key key0="g" key2="1" key4="q"/>
|
||||
<key key0="ú" key2="2" key4="ü"/>
|
||||
<key key0="e" key2="3" key3="\#"/>
|
||||
<key key0="ê" key2="4" key3="!"/>
|
||||
<key key0="r" key2="5" key3="$"/>
|
||||
<key key0="t" key2="6" key3="%"/>
|
||||
<key key0="y" key2="7" key3="^"/>
|
||||
<key key0="u" key2="8" key3="û"/>
|
||||
<key key0="i" key2="9" key3="*"/>
|
||||
<key key0="o" key1="ö" key2="0" key3="("/>
|
||||
<key key0="p" key3=")"/>
|
||||
<key key0="q" key3="&" key4="ğ"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="á" key2="`" key4="a"/>
|
||||
<key key0="s" key2="~"/>
|
||||
<key key0="d" key1="{"/>
|
||||
<key key0="f" key2="}"/>
|
||||
<key key0="h" key2="=" key3="+"/>
|
||||
<key key0="ž" key4="j"/>
|
||||
<key key0="k" key2="]" key3="["/>
|
||||
<key key0="l" key2="|" key3="\\"/>
|
||||
<key key0="ı" key2="-" key8="_"/>
|
||||
<key key0="a" key4="ə"/>
|
||||
<key key0="â" key3="\@"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="j" key2="<" key3="." key4="c"/>
|
||||
<key key0="v" key1="w" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key2=":" key3=";"/>
|
||||
<key key0="m" key2=""" key3="'"/>
|
||||
<key key0="c" key4="ç"/>
|
||||
<key key0="š" key4="ş"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- copyright 2022 Moini <Moini@users.noreply.github.com> -->
|
||||
<keyboard name="QWERTZ" script="latin">
|
||||
<row>
|
||||
<key key0="q" key2="1" key4="esc"/>
|
||||
|
8
srcs/special_font/16.svg
Normal file
8
srcs/special_font/16.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- By Vectorization: Mrmw - Own work using: iso.org/obp/graphics/grs/8f631f6d-89af-4962-bd14-a94dd3c1a2bf 200.png, Public Domain, https://commons.wikimedia.org/w/index.php?curid=20206736 -->
|
||||
<svg width="200" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
|
||||
<g fill="none">
|
||||
<rect x="22.5" y="33.5" width="103" height="132" stroke="#000" stroke-width="5"/>
|
||||
<circle cx="125.5" cy="99.5" r="66" stroke="#000" stroke-width="5"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 519 B |
@@ -1,11 +1,32 @@
|
||||
import xml.etree.ElementTree as ET
|
||||
import glob
|
||||
import glob, os
|
||||
|
||||
# Edit every strings.xml files:
|
||||
# - Add missing translation as comments
|
||||
# - Remove obsolete strings
|
||||
# - Sort in the same order as the baseline
|
||||
# The baseline is 'values/strings.xml', which is english.
|
||||
# Sync store title and descriptions to the 'metadata/' directory.
|
||||
|
||||
VALUE_DIR_TO_METADATA = {
|
||||
"cs": "cs-CZ",
|
||||
"de": "de-DE",
|
||||
"en": "en-US",
|
||||
"es": "es-ES",
|
||||
"fa": "fa-IR",
|
||||
"fr": "fr-FR",
|
||||
"it": "it-IT",
|
||||
"ko": "ko-KR",
|
||||
"lv": "lv",
|
||||
"pl": "pl-PL",
|
||||
"pt": "pt-BR",
|
||||
"ro": "ro",
|
||||
"ru": "ru-RU",
|
||||
"tr": "tr-TR",
|
||||
"uk": "uk",
|
||||
"vi": "vi",
|
||||
"zh-rCN": "zh-CN",
|
||||
}
|
||||
|
||||
# Dict of strings. Key is the pair string name and product field (often None).
|
||||
def parse_strings_file(file):
|
||||
@@ -38,10 +59,36 @@ def sync(baseline, strings):
|
||||
(key, base_string, True)
|
||||
for key, base_string in baseline.items() ]
|
||||
|
||||
def sync_metadata(value_dir, strings):
|
||||
if "short_description" not in strings:
|
||||
return # Short description is mandatory, do nothing without it.
|
||||
locale = os.path.basename(value_dir).removeprefix("values-")
|
||||
if not locale in VALUE_DIR_TO_METADATA:
|
||||
raise Exception("Locale '%s' not known, please add it into sync_translations.py" % locale)
|
||||
meta_dir = "metadata/android/" + VALUE_DIR_TO_METADATA[locale]
|
||||
def sync_meta_file(fname, string_name):
|
||||
if string_name in strings:
|
||||
string = strings[string_name]
|
||||
if not os.path.isdir(meta_dir):
|
||||
os.makedirs(meta_dir)
|
||||
txt_file = os.path.join(meta_dir, fname)
|
||||
with open(txt_file, "w", encoding="utf-8") as out:
|
||||
out.write(string.text.removeprefix('"').removesuffix('"'))
|
||||
out.write("\n")
|
||||
sync_meta_file("title.txt", ("app_name_release", None))
|
||||
sync_meta_file("short_description.txt", ("short_description", None))
|
||||
sync_meta_file("full_description.txt", ("store_description", None))
|
||||
|
||||
baseline = parse_strings_file("res/values/strings.xml")
|
||||
|
||||
for strings_file in glob.glob("res/values-*/strings.xml"):
|
||||
strings = sync(baseline, dict(parse_strings_file(strings_file)))
|
||||
with open(strings_file, "w", encoding="utf-8") as out:
|
||||
write_updated_strings(out, strings)
|
||||
print_status(strings_file, strings)
|
||||
for value_dir in glob.glob("res/values-*"):
|
||||
strings_file = os.path.join(value_dir, "strings.xml")
|
||||
if os.path.isfile(strings_file):
|
||||
local_strings = dict(parse_strings_file(strings_file))
|
||||
synced_strings = sync(baseline, local_strings)
|
||||
with open(strings_file, "w", encoding="utf-8") as out:
|
||||
write_updated_strings(out, synced_strings)
|
||||
sync_metadata(value_dir, local_strings)
|
||||
print_status(strings_file, synced_strings)
|
||||
|
||||
sync_metadata("en", baseline)
|
||||
|
Reference in New Issue
Block a user