Compare commits

..

523 Commits

Author SHA1 Message Date
Patrick Goldinger
26650d2a00 Release v0.4.0-alpha03 2022-08-28 21:52:32 +02:00
florisboard-bot
4395eac500 Update translations from Crowdin 2022-08-28 21:34:01 +02:00
Patrick Goldinger
90e60a5e03 Fix KeyboardManager observer causing crash (#2020) 2022-08-28 15:49:50 +02:00
Patrick Goldinger
e647e0d248 Fix quick actions menu for RTL languages 2022-08-27 21:09:44 +02:00
Patrick Goldinger
31c046720a Fix Smartbar source string still using old label 2022-08-26 21:07:34 +02:00
Patrick Goldinger
03b70b43a6 Update privacy policy link to new location
See https://github.com/florisboard/florisboard/discussions/2021
2022-08-25 22:39:57 +02:00
Patrick Goldinger
de2b3b9433 Merge pull request #2012 from florisboard/smartbar-actions-rework
Smartbar Quick Action Rework + directly related keyboard logic changes + incognito mode
2022-08-23 23:40:57 +02:00
Patrick Goldinger
a51f671c3c Clean up changes and fix theme element translations 2022-08-23 22:30:12 +02:00
Patrick Goldinger
314cdf79bf Fix numeric and telpad layouts row height being miscalculated 2022-08-23 21:48:40 +02:00
Patrick Goldinger
d7137b41fe Adapt all default themes to new Smartbar rules 2022-08-23 16:44:44 +02:00
Patrick Goldinger
acad9f66a6 Fix actions editor screen not clearing flag sometimes 2022-08-23 16:15:59 +02:00
Patrick Goldinger
8d0565854c Fix NLP manager bindings not setting private session flag 2022-08-23 16:08:26 +02:00
Patrick Goldinger
6932fecbbd Improve actions overflow theme and style capabilities 2022-08-23 15:32:51 +02:00
Patrick Goldinger
3e6ed3d7b0 Fix state bug with drag marker in customize action order screen 2022-08-23 14:44:47 +02:00
Patrick Goldinger
85e76892b7 Fix quick actions overflow crashing in landscape mode (#2020) 2022-08-23 14:24:14 +02:00
Patrick Goldinger
65cbc4bea3 Implement Smartbar action order customization screen (#1612) 2022-08-23 14:08:24 +02:00
Patrick Goldinger
79d177144a Add autocorrect toggle placeholder message 2022-08-22 12:56:24 +02:00
Patrick Goldinger
8cb2b0bfa7 Implement incognito mode and toggle (#153, #617) 2022-08-22 12:20:19 +02:00
Patrick Goldinger
201de6a6db Adjust and fix keyboard height calculation (#1561) 2022-08-21 23:03:21 +02:00
Patrick Goldinger
f65b11bc6d Remove obsolete clipboard cursor row 2022-08-20 14:45:51 +02:00
Patrick Goldinger
86031bb428 Fix candidate row scrollbar height being too tall 2022-08-20 13:46:06 +02:00
Patrick Goldinger
58f62e1bd5 Animate background color and add ripple effect to quick action 2022-08-20 13:42:21 +02:00
Patrick Goldinger
6212e35382 Fix FlorisImeTheme not initializing MaterialTheme at all 2022-08-20 13:41:36 +02:00
Patrick Goldinger
c8d0c6269f Properly implement actions overflow panel 2022-08-19 18:55:40 +02:00
Patrick Goldinger
e6f40932ed Rework Smartbar themeing and make minor sizing adjustments 2022-08-18 22:49:41 +02:00
Patrick Goldinger
f8af02c400 Add support for tooltips on Smartbar actions (#1094) 2022-08-16 18:59:31 +02:00
Patrick Goldinger
932a7c3126 Add base logic and UI for Smartbar actions overflow menu 2022-08-14 13:12:35 +02:00
Patrick Goldinger
f0c2ac566f Move Smartbar display mode pref from Typing to Smartbar screen 2022-08-13 14:44:55 +02:00
Patrick Goldinger
19224e5f18 Rework Smartbar screen and introduce new Smartbar layouts 2022-08-13 14:36:28 +02:00
Patrick Goldinger
6c325af80e Remove SmartbarRowType enum and related resources
Is superseded by the fact that all surfaces (except candidates and inline autofill) are now action buttons and freely reorder-able. As such there is no need anymore to distinguish between row types.
2022-08-12 18:32:10 +02:00
Patrick Goldinger
bb82b78cb7 Fix auto action expansion interfering with arrow keys (#1674) 2022-08-11 21:34:06 +02:00
Patrick Goldinger
eb30eed735 Fix quick action icon size too small for landscape (#1781) 2022-08-11 18:51:30 +02:00
Patrick Goldinger
3198977143 Rework base implementation of QuickAction and it's composables 2022-08-11 18:49:33 +02:00
Patrick Goldinger
f3b3c21aaa Add Incognito mode and Autocorrect toggle icons and key codes
For later use in the quick actions rework as a placeholder before it gets implemented in the logic
2022-08-11 18:48:05 +02:00
Patrick Goldinger
0606afbb64 Rework ComputingEvaluator interface and eliminate RenderInfo 2022-08-09 23:33:50 +02:00
Patrick Goldinger
5362df02a5 Merge pull request #2003 from florisboard/improve-sounds-and-vibration-screen
Improve sounds and vibration screen
2022-08-09 16:46:27 +02:00
Patrick Goldinger
3d15bd7f46 Transform "Use vibrator directly" into list pref (#1919) 2022-08-06 11:13:05 +02:00
Patrick Goldinger
15e94ecf2c Merge audio/vibration enable and ignore system prefs (#1919)
The enable pref is now a list preference with a built-in switch, this means the force-on (ignore) toggle is now a list pref, which can be used if audio/vibration is enabled via the built-in switch.
2022-08-06 10:25:16 +02:00
Patrick Goldinger
ebb3873fe4 Improve vibration duration and strength error messages (#1919) 2022-08-04 23:50:26 +02:00
Patrick Goldinger
c1231cd964 Add preview for vibration duration/strength (#1173)
Issue that remains for clicks on the slider bar: https://issuetracker.google.com/issues/181415195
2022-08-04 22:40:48 +02:00
Patrick Goldinger
53ab0a3fa0 Release v0.4.0-alpha02 2022-08-03 23:14:59 +02:00
Patrick Goldinger
aeeff67d2e Adjust Settings UI home message and version number (#1942) 2022-08-03 23:12:33 +02:00
florisboard-bot
4343703eb3 Update translations from Crowdin 2022-08-03 23:00:58 +02:00
Patrick Goldinger
5f09bdbce2 Add implementation for notifySuggestionReverted() 2022-08-03 12:18:25 +02:00
Kostas Giapis
3a3e3625f2 Fix uppercase Greek vowels popups (#1981)
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-08-02 21:47:42 +02:00
Patrick Goldinger
bdf14c1997 Add numeric row manual shifting symbols (#1988) 2022-08-01 13:09:04 +02:00
Patrick Goldinger
d6e064ae00 Fix composer not allowing multiple code points (#1984) 2022-08-01 11:54:41 +02:00
Patrick Goldinger
1012094568 Fix accent ordering of z in Polish popup mapping (#1960) 2022-07-31 09:29:46 +02:00
Patrick Goldinger
4117537ff2 Disable unnecessary app icon sync in Settings UI for Android 10+ 2022-07-29 20:18:18 +02:00
Patrick Goldinger
2a72cb70d6 Remove deprecated Accompanist Insets library 2022-07-28 22:36:05 +02:00
Patrick Goldinger
b1cd9d9389 Rework and improve splash screen of Settings UI
Especially fixes the splash screen for Android 7-11 devices, which utilize the SplashScreen compat library and where the app icon did not draw correctly.

Additionally an unnecessary intermediate splash screen background step has been removed, which should improve Settings UI cold startup time slightly and make it seem more snappy.
2022-07-28 22:25:15 +02:00
Patrick Goldinger
568dfc973d Upgrade Compose to 1.2.0 / Upgrade other dependencies 2022-07-28 16:53:26 +02:00
Patrick Goldinger
2e74cec0db Upgrade Kotlin to 1.7.10 and Compose Compiler to 1.3.0-rc01 2022-07-28 15:51:57 +02:00
Patrick Goldinger
db378159d6 Decouple Jetpack Compose Compiler version from other Compose packages
This change has been done as Google decouples the Compiler release from the rest of Compose packages to allow for faster upgrades of the Kotlin version.

Source: https://android-developers.googleblog.com/2022/06/independent-versioning-of-Jetpack-Compose-libraries.html
2022-07-28 15:37:38 +02:00
Patrick Goldinger
50ff2d8f1b Merge pull request #1974 from florisboard/networkutils-and-clipboard-fixes
Clipboard and NetworkUtils regex fixes
2022-07-27 20:47:34 +02:00
Patrick Goldinger
061495fb27 Improve host regex accuracy for clipboard URL extraction (#1971) 2022-07-27 17:01:47 +02:00
Patrick Goldinger
40cb59ddfd Fix extracted URLs not checking for duplicates (#1971) 2022-07-27 16:51:06 +02:00
Patrick Goldinger
38affddc9e Fix extracted phone numbers not stripping parentheses (#1971) 2022-07-27 16:47:24 +02:00
Patrick Goldinger
17dcb90473 Partly disable smart clipboard on Android 7.0 and 7.1 (#1970)
Android 7.0 and 7.1 do not support named regex groups natively, which causes a crash.
2022-07-27 14:44:32 +02:00
Patrick Goldinger
772402b46f Fix domains get extracted from emails in clipboard (#1971) 2022-07-27 13:58:40 +02:00
Patrick Goldinger
29bd8a289c Add clipboard phone number detection (#1889, #1971) 2022-07-27 13:42:17 +02:00
Patrick Goldinger
79d9e73608 Fix phantom spacing for 1 letter words (#1940) 2022-07-26 15:44:12 +02:00
Patrick Goldinger
b04f8d75f3 Adjust AutoTextKey behavior to respect subtype locale (#1840) 2022-07-26 15:43:19 +02:00
Kostas Giapis
32b1d123d2 Add circumflex popups to Turkish layout (#1962)
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-07-26 15:37:45 +02:00
Patrick Goldinger
b576cafaa4 Upgrade dependencies and adapt API changes 2022-07-24 17:50:15 +02:00
Patrick Goldinger
312ef93ffc Fix auto-spacing incorrectly triggered (#1947)
Issue only occurred for non-Appender composers
2022-07-19 00:07:34 +02:00
Patrick Goldinger
a1dda0c247 Upgrade JetPref to 0.1.0-beta12 2022-07-11 01:27:29 +02:00
Patrick Goldinger
0c36b96922 Update README.md to fix inconsistency with roadmap 2022-07-07 23:56:30 +02:00
Patrick Goldinger
07e92f052b Release v0.4.0-alpha01 2022-07-06 17:56:53 +02:00
florisboard-bot
244c834de9 Update translations from Crowdin 2022-07-06 17:51:08 +02:00
Vlad
61b5c2cffd Correct layout name for RU&UA (ЙЦУКЕН) (#1681) 2022-07-06 16:39:44 +02:00
Leonardo Hernández
1441bd63cb Refactor and improve C++ codebase (#1895)
* close unused fd

dup2 doesn't close old fds, it only duplicates them.

* use `extern "C"` by block instead individual

also formatting changes for function parameters

* fix a memory leak

* cpp refactor: add utils::log() which takes log_priority

* std{out,err} logger: various improvements

- use std::thread rather than pthread
- redirect std{out,err} to stdin to avoid read() calls
- don't use global variables, for avoid spawning unneeded threads use a static function variable
- check for errors in pipe()
- use a lambda function for thread
2022-07-06 16:15:27 +02:00
Patrick Goldinger
e7d0db0fc0 Merge pull request #1913 from florisboard/sug04-prepare-UI-logic-interface
0.4/Phase 1: Prepare UI, suggestions interface and adjust logic
2022-07-06 11:48:00 +02:00
Patrick Goldinger
a87d340b25 Adjust experimental and NYI banners in Typing screen 2022-07-06 02:11:24 +02:00
Patrick Goldinger
3f0d90cb7c Add auto-spacing after punctuation (#375)
Key notes:
- It only works in rich editors
- It intentionally does NOT work in URL, EMAIL and PASSWORD text fields
- May break for exotic characters (aka everything not representable with one char in UTF-16)
- There's no hardcoded language restriction, however it is tailored towards symbols used mostly in Latin-based languages atm
- Performance checking needs to be redone for the commitChar() method
2022-07-06 01:35:02 +02:00
Patrick Goldinger
b9e9f9b122 Implement suggestion user removal 2022-07-05 02:21:57 +02:00
Patrick Goldinger
f2d1cf3baf Rework clipboard suggestions logic and allow for multiple items (#739) 2022-07-05 01:07:58 +02:00
Patrick Goldinger
cf1112327a Rework typing preference screen and integrate spelling 2022-07-04 23:29:15 +02:00
Patrick Goldinger
c2cb28668d Implement candidate auto-commit logic 2022-07-04 19:30:39 +02:00
Patrick Goldinger
75f4fcb91a Expand provider API with suggestions removal and notify events 2022-07-04 02:50:18 +02:00
Patrick Goldinger
3d92bd0584 Document EditorContent getters and companion object 2022-07-04 23:10:03 +02:00
Patrick Goldinger
52ca98a14d Improve NlpManager and provider API 2022-07-02 20:40:37 +02:00
Patrick Goldinger
629a73a5cf Document and improve SpellingResult 2022-07-01 20:02:10 +02:00
Patrick Goldinger
077ec43855 Add Liberapay option to FUNDING.yml (#1434) 2022-07-01 17:18:17 +02:00
Patrick Goldinger
3ecd3618cb Add baseline for keyboard and provider logic bridge 2022-07-01 01:27:41 +02:00
Patrick Goldinger
38bc34913b Rework and improve internal APK assets file handling 2022-06-30 00:08:03 +02:00
Patrick Goldinger
c733e5ceea Extend Android asset manager API to simplify usage 2022-06-29 22:24:05 +02:00
Patrick Goldinger
e2536ceb92 Remove duplicate NATIVE_NULLPTR 2022-06-28 23:10:13 +02:00
Patrick Goldinger
c17b6f073d Switch from LiveData to StateFlow in some manager classes 2022-06-28 22:10:22 +02:00
Patrick Goldinger
936b177776 Rework spell checker config and add utility script 2022-06-27 22:42:59 +02:00
Patrick Goldinger
7d8036fe69 Remove Nuspell spell check implementation (#1921) 2022-06-27 18:49:59 +02:00
Patrick Goldinger
6d08d1a265 Add sentence break iterator caching 2022-06-27 16:25:57 +02:00
Patrick Goldinger
48aba1c055 Add skeleton for new NLP provider API 2022-06-26 23:49:42 +02:00
Patrick Goldinger
0b3d3317bf Add secondary text UI implementation for candidates 2022-06-25 16:42:59 +02:00
Patrick Goldinger
d1fbdc581b Update roadmap's milestone 0.4 phase 1 2022-06-24 18:46:08 +02:00
Patrick Goldinger
044170eb4b Fix auto-capitalization issues with invalid initial state (#1915) 2022-06-24 03:25:28 +02:00
Patrick Goldinger
a7c16b3ceb Improve state reset mechanism for restarts (#1916) 2022-06-24 01:18:21 +02:00
Patrick Goldinger
dd12be2275 Rework and document candidate item API 2022-06-24 00:39:44 +02:00
Patrick Goldinger
1049bc543a Move package smartbar from ime.text to ime 2022-06-23 19:50:22 +02:00
Patrick Goldinger
5c5ad3cd32 Remove unused TextProcessor class 2022-06-21 14:48:35 +02:00
Patrick Goldinger
6fce521122 Fix candidate completion logic not behaving as expected 2022-06-20 23:02:39 +02:00
Patrick Goldinger
2af9941ea6 Add Costa Rican colón currency set (#1914) 2022-06-20 22:00:47 +02:00
Patrick Goldinger
9b24f742d1 Disable auto-capitalization for Thai language (#1908) 2022-06-20 00:05:44 +02:00
Patrick Goldinger
b36bcf7733 Tie composing region indicator to suggestion enabled state (#1911) 2022-06-19 23:46:14 +02:00
Patrick Goldinger
9559dbdcd6 Update roadmap for 0.4 milestone 2022-06-19 21:53:42 +02:00
Patrick Goldinger
668dd4b5bf Fix changelog for 0.3.16 accidentally stored in beta metafolder 2022-06-13 10:57:29 +02:00
Patrick Goldinger
b98feab9c4 Release v0.3.16 2022-06-12 22:12:29 +02:00
Patrick Goldinger
5f4711ac3e Update Settings home screen message for 0.3.16 2022-06-12 22:12:09 +02:00
Patrick Goldinger
4a931cbdc0 Release v0.3.16-rc01 2022-06-07 16:09:53 +02:00
florisboard-bot
90b2ddbdf2 Update translations from Crowdin 2022-06-07 16:04:43 +02:00
Patrick Goldinger
3d6cacc753 Merge pull request #1894 from florisboard/finetune-performance-and-decrease-cpu-usage
Improve input feedback controller performance
2022-06-05 19:50:51 +02:00
Patrick Goldinger
3aed315dfc Fix and improve auto capitalization logic and performance 2022-06-05 19:36:27 +02:00
Patrick Goldinger
06233cca8c Prevent unnecessary stack trace collection in KeyboardState 2022-06-04 18:54:58 +02:00
Patrick Goldinger
3da0ab260a Improve language display name performance by caching it 2022-06-04 11:12:12 +02:00
Patrick Goldinger
5d47159151 Improve input feedback controller performance 2022-06-03 03:00:31 +02:00
Patrick Goldinger
7e92a7382e Add clipboard URL and Email detection (#1889) 2022-06-03 02:00:10 +02:00
Patrick Goldinger
e69dcd87df Merge pull request #1884 from tsiflimagas/dvorak-es
Add DvorakES layout
2022-05-31 20:54:19 +02:00
Kostas Giapis
fb9589f642 Add Dvorak (ÑÇ) layout 2022-05-31 01:24:50 +03:00
Patrick Goldinger
b034075437 Upgrade AGP to 7.2.1 2022-05-30 23:56:56 +02:00
Patrick Goldinger
cd10906811 Release v0.3.16-beta04 2022-05-29 13:22:07 +02:00
florisboard-bot
a1e0bd9a0e Update translations from Crowdin 2022-05-29 13:03:36 +02:00
Patrick Goldinger
2dd70db4c2 Merge pull request #1880 from florisboard/fix-kbd-logic-and-settings-issues
Fix minor keyboard logic and Settings issues
2022-05-29 13:01:39 +02:00
Patrick Goldinger
fc835cd1ab Add exact stacktrace error log for backup failure (#1847) 2022-05-28 19:00:00 +02:00
Patrick Goldinger
5d88058354 Fix shift+space swipe not selecting text (#1843) 2022-05-27 19:16:04 +02:00
Patrick Goldinger
cda111f623 Fix auto-capitalization not behaving correctly (#1861) 2022-05-27 18:54:53 +02:00
Linerly
fc5ea6204d Add Indonesian layout (#1879)
* Add layout

* Add popup mappings and subtype presets; use QWERTY

* ...forgot the main thing

* Add Indonesian popup mapping and subtype presets

* oops

* Fix syntax issue in Indonesian subtype preset

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-05-26 18:06:13 +02:00
Patrick Goldinger
70ba72bf8b Merge pull request #1878 from florisboard/fix-minor-theme-issues
Fix minor theme issues (kbd + prefs)
2022-05-26 17:34:24 +02:00
Patrick Goldinger
c9f84a5a32 Add translations for emoji key and landscape input Syngg elements 2022-05-26 17:19:03 +02:00
Patrick Goldinger
10f53d1bd9 Fix Snygg Shape crashing for corner radii >= 34dp (#1838) 2022-05-26 16:57:30 +02:00
Patrick Goldinger
7624aac935 Upgrade to JetPref 0.1.0-beta11 2022-05-26 16:05:49 +02:00
Patrick Goldinger
06ffb89198 Merge pull request #1875 from florisboard/improve-devtools
Improve devtools and crash log / Add debug log
2022-05-26 15:20:34 +02:00
Patrick Goldinger
d48ce5ad94 Improve CrashDialogActivity crash log generation and add details 2022-05-24 23:58:26 +02:00
Patrick Goldinger
5c1dd57802 Add debug log view/export screen 2022-05-24 23:57:42 +02:00
Patrick Goldinger
1f4133676a Add internal Devtools helper for generating debug logs 2022-05-24 23:56:54 +02:00
Patrick Goldinger
f83d40d137 Add git commit hash to BuildConfig and debug versionNameSuffix
This change allows us to definitely know which commit a build corresponds to. For debug builds a short commit is included within the version name, for beta and stable builds it is just an internal `BuildConfig` field.
2022-05-24 19:41:38 +02:00
Patrick Goldinger
0999cb7b86 Merge pull request #1873 from florisboard/fix-prefs-reset-on-startup
Fix preferences reset & extensions not properly re-indexing on device startup
2022-05-24 19:35:23 +02:00
Patrick Goldinger
c58d6311e1 Fix extensions not properly reloading when context switches 2022-05-23 22:56:41 +02:00
Patrick Goldinger
8c9016d7e3 Fix prefs sometimes reset on startup (#1726, #1868) 2022-05-23 21:40:31 +02:00
Patrick Goldinger
072d768ef6 Properly upgrade to Gradle 7.4.2 2022-05-22 19:43:50 +02:00
Thanh, H
7eabe77358 Vietnamese Telex: Add mising case (#1862)
* Add missing case uc, ic, oc

* Add uô

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-05-22 19:09:00 +02:00
ElishaAz
e4df74bbae Added a button for switching to an IME that supports voice (#1587)
* Added a button for switching to an IME that supports voice

* Moved voice input button to the left of clipboard

* Improve voice key position and show toast on failure

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-05-22 10:47:31 +02:00
Péter Gábor
80f7d50770 Update Hungarian popup mapping (#1859)
Addition character assignments and changed TLD strings for Hungarian keyboard layouts.

These are important changes because Hungarian users mostly search accented characters where they belong.
For example, the u ú ü ű are similar shapes but u ú and ü ű are the short and long symbol pairs for two different sounds (the same is true for o ó and ö ő).
So the changes are intended to show up as follows:
- assignments for o and u is kept for compatibility with the old style and non-hungarian layouts but with hungarian language (as I use florisboard)
- assignments added for ö and ü to found their long versions (ő and ű) in the right place too (as others use florisboard)

TLD strings are changed because .hu and .eu is widely used in Hungary and .gov.hu is the official ending for government sites.
2022-05-22 10:16:14 +02:00
Patrick Goldinger
31d901ba1c Merge pull request #1870 from florisboard/add-baseline-profile
Add baseline profile and benchmak tests
2022-05-22 09:59:31 +02:00
Patrick Goldinger
4e2a43a6cd Add extended benchmark and improve app startup 2022-05-21 13:35:18 +02:00
Patrick Goldinger
0408d437e1 Add baseline profile 2022-05-20 17:07:38 +02:00
Patrick Goldinger
5a6c36d421 Merge pull request #1860 from florisboard/project-build-and-meta-rework
Improvement of Gradle files and dependency management + Proguard APK size optimization
2022-05-20 14:44:17 +02:00
Patrick Goldinger
5fc07f9ae3 Add Proguard optimization to beta and stable builds
Decrease resulting APK size for beta and stable builds by 3.2MB (18.3MB -> 15.1MB). Debug builds are not affected.
2022-05-19 19:17:52 +02:00
Patrick Goldinger
91cbe6d8ec Change OSS notices from Google GMS to mikepenz/AboutLibraries plugin
Note: the prior GMS Gradle plugin [oss-licenses-plugin](https://github.com/google/play-services-plugins/tree/master/oss-licenses-plugin) was, despite belonging to the GMS service stack, open-source. However it was a bit clunky to use and it does not keep up with the newest Gradle plugin standards, so it got replaced by Mike Penz' AboutLibraries library/plugin. This plugin allows me to define custom licenses and have an JC integration without needing to maintain much code, which is always a plus.
2022-05-19 02:07:55 +02:00
Patrick Goldinger
c2aa87beab Upgrade to Gradle 7.4.2 2022-05-19 00:29:48 +02:00
Patrick Goldinger
0094699a88 Move dependencies declaration to new Gradle version catalog 2022-05-18 23:55:35 +02:00
Patrick Goldinger
4adaf9a315 Release v0.3.16-beta03 2022-05-17 23:14:42 +02:00
florisboard-bot
01eee827df Update translations from Crowdin 2022-05-17 22:33:25 +02:00
SaeID/Rz
fd87241887 Add new persian layout (#1823)
* Delete extension.json

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Update fa3.json

insert character "ئ" as the default character

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-05-17 16:12:19 +02:00
Patrick Goldinger
d63792cb15 Merge pull request #1855 from florisboard/emoji-fixes-and-small-improvements
Emoji minor bug fixes / improvements
2022-05-17 15:39:11 +02:00
Patrick Goldinger
e2c4992b51 Fix symbols emoji category icon not representative (#1421) 2022-05-17 00:14:49 +02:00
Patrick Goldinger
481d929f2b Fix incorrect aspect ratio for emoji keys (#1856) 2022-05-16 23:05:40 +02:00
Patrick Goldinger
3d1f1d1e12 Rework internal EmojiCompat implementation (#1770) 2022-05-16 22:52:13 +02:00
Patrick Goldinger
9f4ef7e1ad Re-add vibration to emoji screen (#1675) 2022-05-16 18:26:34 +02:00
Patrick Goldinger
7d24f0c5ae Merge pull request #1844 from florisboard/glide-typing-fixes-and-improvements
Glide typing + gestures improvements / bug fixes
2022-05-15 18:35:56 +02:00
Patrick Goldinger
67408130b1 Fix glide typing not working for long words (#1851) 2022-05-15 13:07:09 +02:00
Patrick Goldinger
cdb9504e5f Fix glide threshold using incorrect units (#1023) 2022-05-14 12:38:45 +02:00
Patrick Goldinger
977b32de6e Add punctuation rules to keyboard extension (#596, #1828) 2022-05-14 11:37:54 +02:00
Patrick Goldinger
4ae4eb00e9 Auto-disable glide typing for password fields 2022-05-14 02:00:47 +02:00
Patrick Goldinger
063fca6dd1 Adjust popup mappings formatting in extension.json 2022-05-13 19:08:10 +02:00
Patrick Goldinger
a650bfe94c Fix active key not appearing pressed for moving gestures (#1846) 2022-05-13 11:47:59 +02:00
Patrick Goldinger
517448da06 Fix phantom space not resetting in selection update (#916) 2022-05-13 11:38:51 +02:00
Patrick Goldinger
8ba9abdace Fix glide typing broken in some input fields (#1009, #1247)
This applies to apps that report that they are "raw" but in fact they are rich. This new detection works by checking if the initial selection is valid, if so then we assume that the editor is rich.
2022-05-12 20:23:58 +02:00
Patrick Goldinger
193d03e0eb Remove Jetifier flag
See https://developer.android.com/studio/releases/gradle-plugin#jetifier-build-analyzer
2022-05-11 23:28:41 +02:00
Patrick Goldinger
363cfe1443 Migrate app namespace from manifest to build.gradle.kts
This is a preparation for AGP 8.0.0 in the future.
2022-05-11 23:15:59 +02:00
Patrick Goldinger
d9cd36966e Upgrade Gradle to 7.3.3 and AGP to 7.2.0 2022-05-11 22:59:37 +02:00
Patrick Goldinger
02bfae55b9 Release v0.3.16-beta02 2022-05-11 22:36:29 +02:00
florisboard-bot
6edbf64104 Update translations from Crowdin 2022-05-11 22:26:14 +02:00
Thanh, H
1c29319036 Expand Basic Telex for Vietnamese to proper Telex (#1797)
* Update tetex rule for: vowel + side char

* Update full rule for a, ă

* Add rule for e

* Update e+{c, m, n} and ê + {c, m} (2 rules)

* Add full rule for e, ă (mark and un-mark)

* Full rule for i

* Full rule o

* Full rule for u

* Add â+{c} (mark + unmark)

* Add â + {m, n}

* Add â + {p, t}

* Full â (mark + unmark)

* Add ê + {n, p, t} (mark)

* Full ê

* Full ô

* Full ơ

* Full ư

* Add full iê + {m, n, p, t, u, ng}: mark & unmark

* Add uyê + {n, t}: mark, un-mark

* Add ươ + {c, i}

* Add ươm

* Add ươ: mark & unmark

* Add full yê: {m, n, t, u, ng} - mark, unmark

* Remove useless rule: "ưow": "ươ"

* Add ach, ich, êch

* Fix Vietnamese default subtype using incorrect composer ID

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-05-11 17:52:12 +02:00
Patrick Goldinger
8c8664cafa Merge pull request #1832 from florisboard/fix-and-improve-kbd-logic
Fix and improve keyboard/input logic
2022-05-10 23:36:05 +02:00
Patrick Goldinger
652c7f4e4b Fix auto-capitalization and re-evaluate on new subtype (#1623)
Switching subtype forces a re-evaluation of the input shift state. Korean never auto-capitalizes anymore.
2022-05-10 00:06:51 +02:00
Patrick Goldinger
753fbc30df Re-implement composers into new editor instance logic 2022-05-09 23:32:10 +02:00
Patrick Goldinger
01de9a4ae1 Add ability to hold shift without caps lock (#1764)
Pressing a char before long press timeout will suppress caps lock -> this allows to use the shift key like on PC
2022-05-09 21:19:27 +02:00
Patrick Goldinger
aa52784174 Fix capitalization issues in text keyboard logic (#227) 2022-05-09 19:36:14 +02:00
Patrick Goldinger
dc72e2162e Fix shift key state concurrency issue in touch logic (#227) 2022-05-09 01:16:13 +02:00
Patrick Goldinger
8ef37cedfb Fix shift long press resetting after releasing (#1834) 2022-05-09 00:14:19 +02:00
Patrick Goldinger
08a77ce0eb Add shift state selector and fix Dvorak layout (#528) 2022-05-08 22:02:39 +02:00
Patrick Goldinger
afc6f21a6a Rework shift state management and possible states
There's now a differentiation between automatic and manual shifting. This is the prerequisite for proper shifting of symbol rows.
2022-05-08 21:30:46 +02:00
Patrick Goldinger
bdc2a9a5d3 Upgrade Accompanist to 0.23.1 2022-05-08 21:08:17 +02:00
Patrick Goldinger
c27365bccd Adjust timing for double tap / key repeat events (#1095)
Double tap events now use a fixed value provided by the system (by default `300ms`) and do not depend on `prefs.keyboard.longPressDelay` anymore.

Additionally key repeat also uses a system value, however both the default system value and the previous hard-coded value are `50ms`, no nothing should change here for the user.
2022-05-08 13:00:36 +02:00
Patrick Goldinger
83d4fc727d Fix backspace sometimes not working in initial state (#1831) 2022-05-07 18:47:45 +02:00
Patrick Goldinger
5bf4819d83 Fix space swipe not checking for raw input editor 2022-05-07 17:50:57 +02:00
Patrick Goldinger
60221743f6 Fix Smartbar suggestion UI not updating correctly 2022-05-07 17:39:55 +02:00
Patrick Goldinger
9d78661ecb Refactor Room to use KSP + export schema correctly 2022-05-07 11:52:49 +02:00
Patrick Goldinger
addedb6f9b Fix long press action being run outside main thread 2022-05-06 19:08:21 +02:00
Patrick Goldinger
e1701b2ba7 Improve devtools input state overlay 2022-05-05 22:51:13 +02:00
Patrick Goldinger
380a0e4f4c Release v0.3.16-beta01 2022-05-03 19:57:46 +02:00
florisboard-bot
7fb24c0471 Update translations from Crowdin 2022-05-03 19:38:57 +02:00
Patrick Goldinger
aaae483ad8 Update ROADMAP.md and home screen message 2022-05-03 19:37:23 +02:00
GoRaN
578652b9ba Update Kurdish layout and overall improvements (#1798)
* Update kurdish.json

* Update kurdish_standard.json

* Update ckb.json

* Update ckb.json

* Update kurdish_standard.json
2022-05-02 23:25:59 +02:00
Patrick Goldinger
b8133b17fe Merge pull request #1822 from florisboard/editor-instance-rework
Major rework of input logic, connection handling and state management
2022-05-02 23:18:37 +02:00
Patrick Goldinger
8226a4fcb9 Add "Always delete word" toggle for glide typing (#1541, #1036) 2022-05-02 22:51:20 +02:00
Patrick Goldinger
ea85a63da9 Fix input lag for mass selection events (fast cursor movement)
which results from the keyboard. Fast cursor movement from the editor currently is still a laggy experience.
2022-05-02 22:13:39 +02:00
Patrick Goldinger
21e784fb09 Fix crashutility namespace incorrect in manifest 2022-05-02 19:48:42 +02:00
Patrick Goldinger
0a1fb5a51e Fix editor instance issues with phantom space 2022-05-01 19:05:18 +02:00
Patrick Goldinger
2a3c3e07e2 Improve input connection raw key event sending 2022-05-01 15:30:37 +02:00
Patrick Goldinger
f8eb86806e Improve expected content handling to reduce expensive calls 2022-04-30 18:56:29 +02:00
Patrick Goldinger
25a7c47c3c Fix enter key behavior for multiline and shift (#1037) 2022-04-29 19:42:00 +02:00
Patrick Goldinger
f08d92fef4 Fix delete key word selection not working properly 2022-04-29 00:07:37 +02:00
Patrick Goldinger
362a84de51 Rework InputEventDispatcher and remove async channel 2022-04-28 23:57:05 +02:00
Patrick Goldinger
64fefef31a Add delete key long press option in gesture prefs (#637) 2022-04-28 01:02:51 +02:00
Patrick Goldinger
b0fced6f98 Fix delete key precise char selection not triggering precisely 2022-04-27 23:54:08 +02:00
Patrick Goldinger
406f79ee36 Fix state bugs in the commitText and deleteBeforeCursor logic 2022-04-27 23:17:37 +02:00
Patrick Goldinger
893fc758b1 Add expected content functionality baseline 2022-04-26 23:58:48 +02:00
Patrick Goldinger
126de62f80 Improve and fix new caching base logic in editor instance 2022-04-25 23:31:08 +02:00
Patrick Goldinger
0ee634a83d Merge input logic and editor instance
but keep logic separate in an abstract and a normal class
2022-04-23 20:47:27 +02:00
Patrick Goldinger
d4f634e8af Split editor instance into input logic and instance
Base for further work on the split and input cache expected caching
2022-04-22 21:20:58 +02:00
Patrick Goldinger
f544e1203d Fix delete call being async / Update selection docs 2022-04-21 01:24:32 +02:00
Patrick Goldinger
d0a373f5f4 Rework and simplify editor content+instance logic 2022-04-20 23:53:45 +02:00
Patrick Goldinger
e4dfed3940 Improve logic in text updater and caching 2022-04-20 02:03:34 +02:00
Patrick Goldinger
7f674f89d2 Raise minimum API level from 23 to 24 2022-04-20 00:05:43 +02:00
Patrick Goldinger
0d593a07e6 Rework base logic of EditorInstance word logic
Not optimized for performance yet, some features are broken in this commit. See the following commits for improvements in the changes of this commit.
2022-04-19 23:56:49 +02:00
Patrick Goldinger
261c8fbec1 Add FlorisEditorInfo wrapper class 2022-04-18 23:58:59 +02:00
Patrick Goldinger
d5262e3ad2 Move EditorInfo helpers into own file 2022-04-17 20:43:51 +02:00
Patrick Goldinger
527543331a Update android.yml to remove gradle caching 2022-04-16 13:02:29 +02:00
Patrick Goldinger
75623f2a95 Fix space key being used as hint from symbols (#1778) 2022-04-16 12:24:16 +02:00
Patrick Goldinger
29f6658256 Merge pull request #1793 from florisboard/gestures-and-glide-fixes
Fix issues with gesture detection and glide/input logic
2022-04-16 12:05:59 +02:00
Patrick Goldinger
dbc6606237 Add Smartbar visibility toggle swipe action (#1794) 2022-04-15 20:00:37 +02:00
Patrick Goldinger
1108456a8e Fix glide typing not setting phantom space flag (#1777) 2022-04-15 19:29:04 +02:00
Patrick Goldinger
2debf36cb6 Improve double-space period behavior (#1792)
Still isn't fixed though, requires new cached input logic
2022-04-15 19:10:46 +02:00
Patrick Goldinger
896101b840 Fix gesture detector comparing px and dp values 2022-04-15 18:23:20 +02:00
Patrick Goldinger
a84854a5b1 Fix space bar eating input when gestures disabled (#1715) 2022-04-15 17:44:44 +02:00
Patrick Goldinger
461966de96 Add devtools "Show key touch boundaries" toggle 2022-04-14 22:22:06 +02:00
Patrick Goldinger
6dd3713641 Fix confirm delete dialog bug when history empty (#1783) 2022-04-13 23:00:06 +02:00
Patrick Goldinger
d51b301364 Change repo icon to be rounded-corner (#1785) 2022-04-13 22:47:01 +02:00
Patrick Goldinger
f8db5d3881 Merge pull request #1780 from florisboard/kotlin-package-structure-changes
Source file package structure changes
2022-04-13 17:56:12 +02:00
Patrick Goldinger
781a00e7c2 Fix linking to source files & Update ROADMAP.md 2022-04-12 20:30:27 +02:00
Patrick Goldinger
a1bb73ba9d Optimize imports on all main source files 2022-04-12 00:21:13 +02:00
Patrick Goldinger
d6390108c2 Move res package to lib/cache and lib/io 2022-04-12 00:13:41 +02:00
Patrick Goldinger
fee954c95f Move snygg package to lib/snygg 2022-04-12 00:02:07 +02:00
Patrick Goldinger
0347eabc04 Rework structure inside app and move custom compose to lib 2022-04-11 23:57:45 +02:00
Patrick Goldinger
c6bcd8a89c Rename common package to lib and move several packages in 2022-04-11 23:35:07 +02:00
Patrick Goldinger
114bcb0d4b Rename java source dir to kotlin 2022-04-11 22:56:20 +02:00
Patrick Goldinger
f4a1a04997 Merge pull request #1775 from florisboard/change-app-icon-v4
Add new flower-shaped app icon
2022-04-11 17:52:32 +02:00
Patrick Goldinger
70a859e00b Adjust Fastlane to use new icon 2022-04-10 21:28:54 +02:00
Patrick Goldinger
8d3b2ef474 Add new flower-shaped app icon (#1735)
Co-authored-by: BloodRaven0 <bloodraven0@users.noreply.github.com>
2022-04-10 21:09:04 +02:00
Patrick Goldinger
76efc0a0e0 Upgrade AGP to 7.1.3 / Upgrade other dependencies 2022-04-10 14:53:48 +02:00
Patrick Goldinger
166734757f Release v0.3.15 2022-04-10 13:57:55 +02:00
Patrick Goldinger
97f401371f Fix crash in key reset logic (#1771) 2022-04-10 12:26:21 +02:00
Patrick Goldinger
b012e5377b Release v0.3.15-rc02 2022-04-09 19:19:54 +02:00
florisboard-bot
3b18dc33d8 Update translations from Crowdin 2022-04-09 19:07:29 +02:00
Patrick Goldinger
d798f01576 Merge pull request #1769 from florisboard/fix-key-visuals-and-popups-getting-stuck
Fix key visuals and popups getting stuck
2022-04-09 17:35:55 +02:00
Patrick Goldinger
55281bd7d6 Merge pull request #1768 from florisboard/add-guardedbylock-and-fix-glide-issues
Add guardedbylock and fix glide issues
2022-04-09 17:34:59 +02:00
Patrick Goldinger
88e9bde0a9 Fix popup stays active when using multitouch (#1450) 2022-04-09 17:26:11 +02:00
Patrick Goldinger
54d5a16761 Fix keys can get stuck with active visuals (#1446) 2022-04-09 16:43:53 +02:00
Patrick Goldinger
701da50479 Add GuardedByLock to prevent crash (#1632) 2022-04-09 16:02:06 +02:00
Patrick Goldinger
b43b6aa2d0 Remove unnecessary classes and methods in common 2022-04-09 13:07:37 +02:00
Patrick Goldinger
4279e9d100 Fix Unicode non-spacing marks for Thai (#1759) 2022-04-08 20:06:36 +02:00
M-Koushan
e5bd979880 Add German (Gboard) layout (#1737) & Fix Persian layout issue (#1746) 2022-04-08 18:48:00 +02:00
Patrick Goldinger
9a48169bf3 Fix delete key swipe right deleting left words (#1765) 2022-04-08 17:42:47 +02:00
Patrick Goldinger
99cfd99815 Merge pull request #1763 from florisboard/fix-extracted-input-ui-issues
Fix extracted input UI issues
2022-04-08 17:23:19 +02:00
Hayleia
e8f082d885 Fix Korean composition of medial+final and final+final (#1757) 2022-04-07 20:33:45 +02:00
Patrick Goldinger
b63f475a8c Fix NPE crash in extracted input UI (#1758) 2022-04-07 20:12:20 +02:00
Patrick Goldinger
e183f10969 Improve devtools overlay UI and remove unnecessary code 2022-04-06 23:57:57 +02:00
Patrick Goldinger
c1e624b9a0 Fix input view + extracted input UI layouting issues (#1760) 2022-04-06 22:51:51 +02:00
Patrick Goldinger
2d87d0e4d3 Release v0.3.15-rc01 2022-04-05 23:59:07 +02:00
florisboard-bot
bcf1bffc24 Update translations from Crowdin 2022-04-05 23:45:52 +02:00
Patrick Goldinger
f388e8811e Add support for videos on clipboard history (#1721) 2022-04-05 23:42:12 +02:00
Patrick Goldinger
7ededa6293 Merge pull request #1756 from florisboard/quick-glide-fixes
Fix glide typing state and drawing bugs
2022-04-05 22:21:49 +02:00
Patrick Goldinger
7d9e1cf2b5 Fix glide trail not drawing if popups disabled (#1704) 2022-04-05 22:12:52 +02:00
Patrick Goldinger
299f581609 Fix glide not initializing if disabled on app start (#1703) 2022-04-05 21:33:46 +02:00
Patrick Goldinger
c38d4ed90b Merge pull request #1749 from florisboard/re-add-other-default-themes
Re-implement other default themes
2022-04-05 19:43:52 +02:00
Patrick Goldinger
647bc659d7 Decrease visual key height for borderless themes 2022-04-05 19:25:20 +02:00
Patrick Goldinger
61eb09e611 Re-add Pure Night and all borderless themes (#1702) 2022-04-05 19:08:28 +02:00
Patrick Goldinger
1a4118d29a Fix space bar ignoring "No action" setting (#1706) 2022-04-04 23:04:43 +02:00
Denys Honsiorovskyi
48655b3771 Ukrainian popup mappings improvements (#1739)
* Ukrainian popup mappings improvements

* Make all letters relevant not to override default symbols

* Update extension.json

* Remove extra domains: they look ugly
2022-04-04 22:41:53 +02:00
pjtsearch
17649c44bf Fix փ missing in Armenian layouts (#1741)
Co-authored-by: PJTSearch <pjtsignups@gmail.com>
2022-04-04 22:34:31 +02:00
Patrick Goldinger
7cbb19ddcb Add support for Chinese (Simplified) (zh-CN) 2022-04-04 20:04:25 +02:00
Patrick Goldinger
e13ac7c689 Add support for locale display language in devtools 2022-04-04 20:03:58 +02:00
Patrick Goldinger
941733cdc0 Merge pull request #1734 from florisboard/add-extracted-landscape-input-layout
Add support for ExtractedLandscapeInput
2022-04-03 15:16:44 +02:00
Patrick Goldinger
a25289a856 Fix ExtractedLandscapeInput UI themeing 2022-04-02 20:46:59 +02:00
Patrick Goldinger
7bcfeca872 Improve ExtractedLandscapeInput UI and fix compatibility
... with Samsung devices.
2022-04-02 20:01:45 +02:00
Patrick Goldinger
240ebc499a Improve debug summarization of EditorInfo 2022-04-02 17:09:10 +02:00
Patrick Goldinger
831882f419 Add base for ExtractedLandscapeInput 2022-04-01 20:24:08 +02:00
Patrick Goldinger
e0e5259b4c Remove deprecated shift and caps flag from KeyboardState 2022-04-01 18:37:04 +02:00
Patrick Goldinger
33cd2b5d01 Release v0.3.15-beta02 2022-03-31 20:35:03 +02:00
florisboard-bot
d3dda86966 Update translations from Crowdin 2022-03-31 20:21:27 +02:00
Patrick Goldinger
59aa5cdb33 Fix Restore screen too restrictive about media type (#1707) 2022-03-31 20:08:31 +02:00
Patrick Goldinger
d26e820492 Possible fix for setup screen system observer failing (#1731) 2022-03-31 19:49:33 +02:00
Patrick Goldinger
b8b1b04c7e Decrease vertical padding usage in setup screen (#1364) 2022-03-31 19:48:56 +02:00
Patrick Goldinger
26b4acc894 Add limit to clipboard history text item preview (#1730) 2022-03-31 19:19:40 +02:00
Patrick Goldinger
12c4220544 Merge pull request #1720 from florisboard/improve-theme-logic-and-ui
Improve theme logic, appearance and stylesheet editor UI
2022-03-31 18:55:43 +02:00
Patrick Goldinger
5fc4f5ba60 Improve wording of code param in stylesheet editor 2022-03-31 01:39:07 +02:00
Patrick Goldinger
03ea9bcb76 Add key code recording tool in stylesheet editor 2022-03-31 01:03:59 +02:00
Patrick Goldinger
a04c44df98 Improve common Android Toast extension funs 2022-03-30 22:06:55 +02:00
Patrick Goldinger
b1431c7e51 Add key code preview box in stylesheet rule dialog 2022-03-29 01:32:46 +02:00
Patrick Goldinger
c09719ffd6 Fix emoji key (and popup) font color ignoring current theme 2022-03-28 19:49:39 +02:00
Patrick Goldinger
16149d95a1 Fix key shape clipping contents (#1710) 2022-03-28 19:39:37 +02:00
Patrick Goldinger
658e43da9c Move fontSizeMultiplier() to AppPrefs directly 2022-03-28 19:29:56 +02:00
M-Koushan
66ddb451ab Add additional Persian keyboard layout (#1683)
* Adding new layout Persian2

* Fix whitespace issues and charactersMod missing

* Fix issues in fa2.json

Co-authored-by: M-Koushan <koushan405@gmail.com>
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-03-27 13:09:31 +02:00
Patrick Goldinger
f135513f3e Add support for A12 VibratiorManager 2022-03-26 20:00:52 +01:00
Patrick Goldinger
322dfa717b Fix language names not titlecase for some locales (#1686) 2022-03-26 11:26:56 +01:00
Patrick Goldinger
bfe7852bdf Release v0.3.15-beta01 2022-03-25 19:54:49 +01:00
florisboard-bot
45fe2f311e Update translations from Crowdin 2022-03-25 19:43:46 +01:00
blucin
f73daa2b00 Add ColemakDH keyboard layout (#1401)
* Added ColemakDH layout

* Adjust ColemakDH to new Flex extension format

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-03-25 19:39:22 +01:00
Nijat Ismayilzada
4e8ff9ec14 Add Azerbaijani keyboard layout (#1639)
* Add Azerbaijani keyboard layout

* Add subtype preset for Azerbaijani

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-03-25 19:24:18 +01:00
Amir Yalon
a96fc84fc1 Add Hebrew SI-1452 niqqud and some punctuation marks (#1413)
Based on information from https://en.wikipedia.org/wiki/Hebrew_keyboard

Combining characters don’t display well on their own. In the source code, they are avoided altogether by using JSON
escape codes like `\u05c2`, while in labels a placeholder letter is used. The letter ס was chosen because it is hollow,
and the letter ש must be used for its dots because other letters take the HEBREW POINT SHIN DOT on the wrong side when
combined.
2022-03-25 17:55:34 +01:00
Patrick Goldinger
e62ddc37dd Disable forceDarkAllowed in IME base theme (#1694) 2022-03-25 17:25:12 +01:00
Patrick Goldinger
06cfa34a4b Remove popups from telpad layout (#1044) 2022-03-25 16:51:08 +01:00
Patrick Goldinger
ef849dfefd Add alphabetic letters to phone digits in telpad layout (#355) 2022-03-25 16:51:08 +01:00
pjtsearch
091d43520e Add Armenian keyboard layouts (#1654)
* feat: Add Western Armenian layouts, popup mapping, and currency

* feat: Add Eastern Armenian layouts, popup mapping, and currency

* fix: Fix Armenian popup mapping

* fix: Add yev to Armenian popup mapping

* fix: Fix Western Armenian language tag

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

* fix: Differentiate Western layout name

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

* fix: Differentiate Eastern layout name

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>

Co-authored-by: PJTSearch <pjtsignups@gmail.com>
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-03-25 00:07:29 +01:00
Patrick Goldinger
95b6b1bbf9 Fix keyboard ignoring number row height in symbols (#1658) 2022-03-24 22:33:39 +01:00
Patrick Goldinger
021014e870 Change layout direction of Smartbar and Emoji to forced LTR (#1673) 2022-03-24 22:10:20 +01:00
Kostas Giapis
aaa4fbae7a Fix main popup for "ﺍ" ‎(#1571) 2022-03-24 21:57:56 +01:00
Patrick Goldinger
78b645d820 Fix media and clipboard ignoring number row in height calc (#1672) 2022-03-24 20:37:42 +01:00
GoRaN
61bd6752e3 Fix TLDs of Arabic and Urdu-Phonetic (#1680) 2022-03-24 19:18:57 +01:00
Patrick Goldinger
e4e10f5c72 Fix Arabic combining characters not displaying correctly (#1679) 2022-03-24 07:43:18 +01:00
Patrick Goldinger
1c6a719aa5 Release v0.3.14 2022-03-22 20:03:11 +01:00
Patrick Goldinger
693051b699 Fix popup UI controller remember keys causing unintended resets 2022-03-22 18:29:10 +01:00
Patrick Goldinger
91865a0e14 Update CONTRIBUTING.md (#1506) 2022-03-21 22:47:39 +01:00
Patrick Goldinger
ebd45375f6 Release v0.3.14-rc04 2022-03-20 22:53:41 +01:00
Patrick Goldinger
1c9f24c533 Fix numeric and numeric advanced popup width (#1044) 2022-03-20 22:31:51 +01:00
Patrick Goldinger
d6daa87ce6 Fix currency key in symbols not having popups (#1671) 2022-03-20 22:04:59 +01:00
Patrick Goldinger
99eaee1477 Fix clipboard crash when item still has old URI format (#1660) 2022-03-20 12:24:15 +01:00
Patrick Goldinger
47824a8e5f Release v0.3.14-rc03 2022-03-19 20:04:48 +01:00
florisboard-bot
83f45f9c5d Update translations from Crowdin 2022-03-19 19:56:20 +01:00
Patrick Goldinger
5e36f57e82 Fix theme properties share values between different rules (#1626) 2022-03-19 19:48:52 +01:00
Patrick Goldinger
ec65d9e6f8 Merge pull request #1666 from florisboard/fix-clipboard-and-input-logic-crashes
Fix clipboard and input logic crashes
2022-03-19 13:11:03 +01:00
Patrick Goldinger
e3ede1160e Fix ConcurrentModificationException in glide typing (#887, #1632) 2022-03-19 12:53:25 +01:00
Patrick Goldinger
a72d570065 Fix ArrayIndexOutOfBounds in glide typing (#801, #927, #1398) 2022-03-19 11:51:22 +01:00
Patrick Goldinger
db2227cc04 Fix StringIndexOutOfBoundsException (#1140, #1301, #1519, #1662) 2022-03-19 11:44:41 +01:00
Patrick Goldinger
1a77f94af9 Fix clipboard history UI crashing if data file not existing (#1660) 2022-03-19 11:15:52 +01:00
Patrick Goldinger
5bba116e01 Release v0.3.14-rc02 2022-03-18 19:51:41 +01:00
florisboard-bot
5c177cc225 Update translations from Crowdin 2022-03-18 19:37:29 +01:00
Patrick Goldinger
1d0826f854 Update in-app notes about feature availability and welcome screen 2022-03-18 19:33:29 +01:00
Patrick Goldinger
85fdd3876a Merge pull request #1653 from florisboard/fix-clipboard-issues
Fix clipboard issues / Re-add clipboard image support
2022-03-18 19:00:25 +01:00
Patrick Goldinger
59def39114 Fix duplicate primary clip callback adding duplicates (#1555)
This is a mitigation of a bug when a target app quickly adds the same clip twice, to prevent unnecessary duplicates.
2022-03-18 18:53:26 +01:00
Patrick Goldinger
463644c1d2 Improve image scaling in clipboard history view 2022-03-18 17:47:56 +01:00
Patrick Goldinger
117654c95c Fix clipboard history text clip deletion crash 2022-03-18 17:39:20 +01:00
Patrick Goldinger
21e97d6933 Improve clipboard image source display name retrieval logic 2022-03-18 17:18:52 +01:00
Patrick Goldinger
36d9f91009 Fix copy image crash when source does not provide display name 2022-03-18 16:54:16 +01:00
Patrick Goldinger
07c15f0782 Clipboard image provider now supports OpenableColumns 2022-03-18 00:56:34 +01:00
Patrick Goldinger
97d3223122 Re-implement clipboard image support (#1642) 2022-03-17 23:49:31 +01:00
Patrick Goldinger
2e12d756df Fix clipboard adding empty string silently when actually failing (#1647) 2022-03-17 00:04:40 +01:00
Patrick Goldinger
1ca1763138 Remove Handler utils 2022-03-16 23:49:28 +01:00
Patrick Goldinger
93f6ba3f69 Update home screen text displayed 2022-03-15 23:50:56 +01:00
Patrick Goldinger
83fd9a27a8 Fix SnyggStringValueSpec not having meaningful error message (#1643) 2022-03-14 21:54:40 +01:00
Patrick Goldinger
4c8587fa1e Fix Corner Percent Shape allowing percentages over 100 (#1643) 2022-03-14 21:52:12 +01:00
Patrick Goldinger
92f4ef12d9 Fix auto-backup not working on certain devices and with ADB 2022-03-13 23:19:25 +01:00
James
db401e0b69 Fix selectedText not checking for null when performing a copy (#1637) 2022-03-13 22:58:00 +01:00
GoRaN
ca5706b638 Fix kurmanji kurdish letter ş (#1638)
Fix kurmanji letter ş
2022-03-13 16:07:03 +01:00
Patrick Goldinger
63d132ad3c Fix editable color strings contain Unicode Ctrl Chars (#1636) 2022-03-12 20:09:57 +01:00
Patrick Goldinger
97456645e4 Update README.md and ROADMAP.md 2022-03-12 14:45:09 +01:00
Patrick Goldinger
81f949a1ee Release v0.3.14-rc01 2022-03-11 19:57:21 +01:00
florisboard-bot
438ca8c7ad Update translations from Crowdin 2022-03-11 19:42:26 +01:00
Patrick Goldinger
51bd2cc5cd Add note for glide typing preview (#1627) 2022-03-11 19:29:24 +01:00
Patrick Goldinger
864ee749ca Fix Smartbar Settings preference enable state bug 2022-03-11 19:02:47 +01:00
Patrick Goldinger
ba40307f0f Fix long titles and summaries in Settings (#998) 2022-03-11 19:00:56 +01:00
Patrick Goldinger
ae091bdae8 Fix floris_user_dictionary not included in auto-backup 2022-03-11 17:56:19 +01:00
Patrick Goldinger
e98b12f3c5 Merge pull request #1629 from florisboard/localization-fixes
Add support for RTL preference/keyboard UI layout and other minor fixes
2022-03-11 17:29:43 +01:00
Patrick Goldinger
ae49342ae7 Fix Emoji RTL issues 2022-03-11 17:23:26 +01:00
Patrick Goldinger
85ad815ae7 Fix parentheses for RTL languages (#422, #1624) 2022-03-10 22:46:02 +01:00
Patrick Goldinger
948e9bb75f Fix RTL layout issues in theme editor / extension editor 2022-03-10 20:55:11 +01:00
Patrick Goldinger
898dc25cb6 Fix one-handed mode and emoji in RTL layout direction 2022-03-10 00:17:29 +01:00
Patrick Goldinger
33f2336676 Add base support for localization and RTL in keyboard UI 2022-03-09 23:59:21 +01:00
Patrick Goldinger
e64ab1e75d Add support for RTL layout inside new preference UI 2022-03-08 19:55:07 +01:00
Patrick Goldinger
d46e95ceac Disable bundle language split for GPlay releases
This is only necessary for GPLay bundles because both F-Droid and
GitHub releases are a simple APK, which does split at all.
2022-03-08 19:09:23 +01:00
Patrick Goldinger
dd25420e03 Add Japanese (ja) as available language 2022-03-08 19:03:58 +01:00
Patrick Goldinger
b29519a784 Release v0.3.14-beta14 2022-03-06 20:33:01 +01:00
Patrick Goldinger
2d62398186 Adjust home screen message 2022-03-06 20:01:53 +01:00
florisboard-bot
573e55f1c4 Update translations from Crowdin 2022-03-06 19:59:33 +01:00
blueberry-robin
523eabee17 Update Urdu phonetic layout (#1619)
2 fixes for wrong layout in the Urdu phonetic keyboard. One was a wrong(duplicate) HTML code causing 2 different keys to output the same character. The other was a wrong label on a key resulting in 1 key label appearing twice and giving 2 different outputs.
2022-03-06 19:28:38 +01:00
GoRaN
913872e4cd Fix Kurdish language not changing app language (#1620)
* Fix Kurdish language not changing app language manually + some correct and improvement to kurdish layouts

* Add language mappings for Kurdish languages (ckb and ku)

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2022-03-06 19:27:18 +01:00
Patrick Goldinger
c12a802e5e Possible fix for overflow button now showing (#1615) 2022-03-06 18:40:19 +01:00
Patrick Goldinger
3129617402 Merge pull request #1614 from florisboard/reimplement-composers
Reimplement composers into new extension system
2022-03-06 16:15:52 +01:00
Patrick Goldinger
dc2d130b13 Reduce noise of Appender and WithRules composer code 2022-03-06 16:00:10 +01:00
Patrick Goldinger
e9b140a9fe Reimplement composers into new extension system (#1478) 2022-03-06 16:00:10 +01:00
Patrick Goldinger
4189955554 Merge pull request #1618 from florisboard/smartbar-beta14-overhaul
Smartbar overhaul for 0.3.14-beta14
2022-03-06 15:58:52 +01:00
Patrick Goldinger
51f0843a2f Fix Smartbar primary actions auto-collapse for selection (#870) 2022-03-05 19:31:32 +01:00
Patrick Goldinger
2496ada14b Rework and simplify Smartbar themeing 2022-03-05 13:35:11 +01:00
Patrick Goldinger
544e3857fc Add ability to switch Smartbar layouts (#1548) 2022-03-04 20:03:54 +01:00
Patrick Goldinger
f3d076b51e Re-arrange Smartbar settings screen and change terminology a bit 2022-03-04 18:30:16 +01:00
Patrick Goldinger
40efbd0f65 Fix cursor movement for RTL text inside preview field (#1575) 2022-03-04 17:03:07 +01:00
Patrick Goldinger
8d667297c2 Add clear clipboard history confirmation (#1606) 2022-03-03 23:14:10 +01:00
Patrick Goldinger
dbb3f97abd Merge pull request #1608 from florisboard/improve-emoji-implementation
Improve emoji implementation
2022-03-03 20:33:15 +01:00
Patrick Goldinger
627919e34f Fix EmojiCompat IllegalStateException crash (#1610) 2022-03-03 20:25:58 +01:00
Patrick Goldinger
9f67789337 Add ability to specify preferred emoji skin tone (#132) 2022-03-01 01:48:53 +01:00
Patrick Goldinger
96d830e5c4 Add ability to specify emoji history max size 2022-03-01 01:03:24 +01:00
Patrick Goldinger
80ca97388c Fix Emoji font size having "unspecified" as default value (#1607) 2022-03-01 00:11:59 +01:00
Patrick Goldinger
afa021f67d Upgrade AGP to 7.1.2, JC to 1.1.1, and other dependencies 2022-02-28 23:58:21 +01:00
Patrick Goldinger
e14f54cac1 Release v0.3.14-beta13 2022-02-27 23:37:46 +01:00
florisboard-bot
21c1915233 Update translations from Crowdin 2022-02-27 23:20:35 +01:00
Patrick Goldinger
5af80a2270 Fix positioning of emoji variations popup 2022-02-27 23:18:55 +01:00
Patrick Goldinger
8a1a3d3bb4 Improve emoji palette view performance 2022-02-27 23:04:57 +01:00
Patrick Goldinger
a2f15606c7 Fix EmojiCompat load state not correctly checked 2022-02-27 19:11:47 +01:00
Patrick Goldinger
01e2ee7835 Fix crash dialog PendingIntent notification bug 2022-02-26 19:45:01 +01:00
Patrick Goldinger
7adc045752 Merge pull request #1589 from florisboard/reimplement-basic-emoji-palette
Re-implement basic emoji palette view
2022-02-25 18:04:56 +01:00
Patrick Goldinger
266af61e3a Fix font size multiplier ignored in emoji view 2022-02-25 17:56:58 +01:00
Patrick Goldinger
a814190012 Improve and fix themeing of emoji popup palette 2022-02-23 18:05:28 +01:00
Patrick Goldinger
109c323369 Fix emoji palette height not properly adapting 2022-02-23 01:01:39 +01:00
Patrick Goldinger
654e160503 Fix bug that variant emojis weren't checked for availability 2022-02-23 00:51:25 +01:00
Patrick Goldinger
3aa6d7ccbe Add emoji history for recently used emojis (#268, #944) 2022-02-23 00:21:12 +01:00
Patrick Goldinger
5d447d7a8f Improve emoji display and add support for emoji compat drawing 2022-02-22 22:53:26 +01:00
Patrick Goldinger
25bfd61814 Add emoji variations popup in emoji palette 2022-02-22 22:10:30 +01:00
Patrick Goldinger
b4caa66377 Add emoji2 library / Improve emoji UI a lot 2022-02-22 01:40:37 +01:00
Patrick Goldinger
e5dde63efc Improve tabs display in emoji palette view 2022-02-21 23:45:55 +01:00
Patrick Goldinger
78f64adbbf Add base buttons (switch to text and delete) in emoji 2022-02-21 20:34:50 +01:00
Patrick Goldinger
3f39bc8768 Add input event processor for base emojis 2022-02-21 00:54:32 +01:00
Patrick Goldinger
d2274c4d9e Add base skeleton for emoji frontend palette and backend mapping 2022-02-21 00:25:28 +01:00
Patrick Goldinger
8674a04a5c Release v0.3.14-beta12 2022-02-14 21:38:40 +01:00
florisboard-bot
2f14529902 Update translations from Crowdin 2022-02-14 21:25:00 +01:00
Patrick Goldinger
1d74a17b98 Merge pull request #1569 from florisboard/prefs-rework-polishing-1
Preference Rework Polishing Part 1
2022-02-14 21:18:45 +01:00
Patrick Goldinger
52435d9837 Add option to specify language name display type (#1568) 2022-02-14 20:14:12 +01:00
Patrick Goldinger
b6fbbe5a91 Fix transparent colors not drawing with a checkered background 2022-02-14 00:44:22 +01:00
Patrick Goldinger
3f85e1167c Fix blank screen on initial app launch after install (#1537) 2022-02-14 00:20:46 +01:00
Patrick Goldinger
9c05096184 Rework internal implementation of window insets within Settings UI 2022-02-13 21:24:23 +01:00
Patrick Goldinger
ef3bc015b0 Add "display kbd after dialog" option to fine-tune editor options 2022-02-13 20:19:46 +01:00
Patrick Goldinger
75fd600448 Remove ExternalContentUtils.kt 2022-02-13 19:21:09 +01:00
Patrick Goldinger
2f01e7770f Fix behavior and visual display for URLs where no scheme is specified 2022-02-13 19:17:44 +01:00
Patrick Goldinger
12b6edf872 Add missing icon for Smartbar and Advanced screen (#1428) 2022-02-13 18:27:11 +01:00
Patrick Goldinger
6053f2d16b Fix Scrollbar overlaps with text on welcome screen (#1427) 2022-02-13 17:51:47 +01:00
Patrick Goldinger
636c5f4df4 Add "System default (AMOLED)" option for Settings UI theme (#1539) 2022-02-13 17:40:23 +01:00
Patrick Goldinger
bb0bd478cf Fix crash in devtools system settings viewer (#1387) 2022-02-13 15:50:22 +01:00
Patrick Goldinger
79eb080811 Upgrade AGP to 7.1.1 / Upgrade other dependencies 2022-02-13 15:37:47 +01:00
Patrick Goldinger
b5b82836bc Fix NPE due to incorrect variable usage in restore screen (#1567) 2022-02-13 15:06:09 +01:00
Patrick Goldinger
cef0f2b53d Merge pull request #1565 from florisboard/improve-theme-engine-and-add-border
Improve theme editor/stylesheets and implement boder color/width
2022-02-13 14:57:33 +01:00
Patrick Goldinger
dbf031469f Fix follow system and time not updating (#1557) 2022-02-13 14:50:49 +01:00
Patrick Goldinger
5b87c933da Split FlorisImeTheme and BaseStyle into separate files 2022-02-13 12:37:17 +01:00
Patrick Goldinger
adc4b9a372 Improve ordering of value types in stylesheet property editor dialog
Value was changed from explicit inherit > var > *encoders to *encoders > var > explicit inherit. This speeds up the selection process, as users naturally read top to bottom and inherit is almost never used by a user anyways.
2022-02-11 19:58:47 +01:00
Patrick Goldinger
0ff8f7776e Improve float number display in theme editor (remove .0 suffix) 2022-02-11 19:49:28 +01:00
Patrick Goldinger
c04fdeb491 Fix alpha color value in HEX8 mode missing leading zero 2022-02-11 19:28:01 +01:00
Patrick Goldinger
295d8e5326 Implement border-color and border-width for stylesheets (#1105) 2022-02-11 18:59:56 +01:00
Patrick Goldinger
b032ac64f7 Add ability to show/hide keyboard UI on Android 8.1 and lower 2022-02-11 00:22:57 +01:00
Patrick Goldinger
8ebe99d2c9 Merge pull request #1562 from florisboard/reimplement-user-dictionary-manager-ui
Re-implement user-dictionary settings UI
2022-02-10 23:16:49 +01:00
Patrick Goldinger
f0b027557b Fix state issues within the user dictionary UI 2022-02-10 23:03:13 +01:00
Patrick Goldinger
462030bcd7 Re-implement user-dictionary settings UI (#1544) 2022-02-10 22:51:02 +01:00
Patrick Goldinger
888af9d28d Release v0.3.14-beta11 2022-02-08 19:43:54 +01:00
Patrick Goldinger
ea159527f3 Restrict variable name input validation and fix behavior bugs 2022-02-08 19:33:03 +01:00
Patrick Goldinger
0dc0f53a91 Fix missing elevation theme-attribute causing crash on Android 9 (#1553) 2022-02-08 19:11:20 +01:00
Patrick Goldinger
d5aac7ac14 Release v0.3.14-beta10 2022-02-07 21:09:41 +01:00
florisboard-bot
9f58088545 Update translations from Crowdin 2022-02-07 20:24:27 +01:00
Patrick Goldinger
b684f1759d Add option to select text via delete key (#705, #1534) 2022-02-06 23:21:49 +01:00
Patrick Goldinger
aa7a264d6c Add ability to hide language name on the space bar (#371, #1025) 2022-02-06 22:50:05 +01:00
Patrick Goldinger
6ac537c517 Fix spacebar switches to full keyboard in number-only fields (#1248)
Additionally also fixed it for phone and phone2 layouts.
2022-02-06 22:22:45 +01:00
Patrick Goldinger
2386ae7749 Merge pull request #1538 from florisboard/improve-theme-editor-ui
Improve theme editor UI
2022-02-06 22:12:40 +01:00
Patrick Goldinger
7d559acfae Improve redundancy definition of shape in SnyggShapeValue 2022-02-06 21:21:54 +01:00
Patrick Goldinger
7783b9b218 Add shadow elevation to theme and UI 2022-02-06 20:08:36 +01:00
Patrick Goldinger
548f7d7b1e Move SnyggValueIcon to own source file 2022-02-06 19:10:25 +01:00
Patrick Goldinger
4629c07812 Fix manual color string editing disregarding display colors as option 2022-02-06 12:16:43 +01:00
Patrick Goldinger
3b2b7da841 Add fine tune editor dialog / Add "Display colors as" option 2022-02-05 13:59:14 +01:00
Patrick Goldinger
25ef53510a Improve Snygg shape UI and naming implementation 2022-02-05 12:04:03 +01:00
Patrick Goldinger
0064f248d3 Move theme property translations to own file 2022-02-05 11:32:32 +01:00
Patrick Goldinger
0c721696f2 Improve default theme variable usage 2022-02-04 16:08:06 +01:00
Patrick Goldinger
131ab6214d Remove term "component" from title strings 2022-02-04 14:44:18 +01:00
Patrick Goldinger
70bc7a1236 Add translation for var references in basic and advanced mode
... in stylesheet editor
2022-02-04 14:35:26 +01:00
Patrick Goldinger
6c88716a2a Add Snygg circle shape value 2022-02-04 14:29:47 +01:00
Patrick Goldinger
ff3c37e360 Add ability to style color of glide trail
(property `foreground` is the color of glide trail)
2022-02-04 00:21:06 +01:00
Patrick Goldinger
58bab443c4 Add ability to modify color values manually 2022-02-03 23:32:26 +01:00
Patrick Goldinger
a8b0a6d555 Upgrade dependencies / Upgrade Kotlin to 1.6.10 2022-02-03 20:40:34 +01:00
Patrick Goldinger
0a430b4b0a Release v0.3.14-beta09 2022-02-02 23:46:47 +01:00
Patrick Goldinger
8b76c5ce3b Update README.md 2022-02-02 23:29:11 +01:00
florisboard-bot
c81f5f7015 Update translations from Crowdin 2022-02-02 23:25:36 +01:00
GoRaN
cf6b186269 Update kurdish.json (#1410)
* Update kurdish.json

Update and correct some characters place with there codes.

* Update kurdish.json
2022-02-02 23:08:27 +01:00
Patrick Goldinger
bd25ddb92e Merge pull request #1524 from svvvst/master
Add Rusyn Language Language Set, Layout, Popups
2022-02-02 23:05:03 +01:00
Patrick Goldinger
62bdd31af3 Fix rue popup mapping missing from extension manifest 2022-02-02 22:59:06 +01:00
Patrick Goldinger
d4af89bf99 Merge pull request #1513 from florisboard/add-theme-editor-ui
Add extension editor UI / theme editor UI
2022-02-02 22:51:21 +01:00
Patrick Goldinger
1c38a42c0b Fix system nav bar not using background var reference in default themes
This is done to avoid confusion why the system nav bar color does not change with the background.
2022-02-02 22:28:56 +01:00
Patrick Goldinger
6d1ebb74fb Adjust feedback and beta info test in Settings UI 2022-02-02 22:26:29 +01:00
Patrick Goldinger
9673e6de5c Clean-up old theme strings 2022-02-02 22:14:20 +01:00
Patrick Goldinger
ab709e2c69 Add create extension ability / Fix a lot of state and validation bugs 2022-02-02 21:57:29 +01:00
Patrick Goldinger
9144708cf0 Fix autofill chip not applying correct style (#1507) 2022-02-01 22:25:02 +01:00
Patrick Goldinger
38136de39d Add save extension function to extension editor 2022-01-31 22:21:23 +01:00
Patrick Goldinger
beb800a76e Add ability to modify shape property values in stylesheet editor 2022-01-31 21:40:23 +01:00
Patrick Goldinger
aab738526a Add ability to add new component from existing in extension editor 2022-01-31 00:48:03 +01:00
Patrick Goldinger
86bdad61a4 Add (semi-)live-preview to stylesheet editor
Semi-live only because you must apply a property value before the change reflects on the keyboard UI. THis is also done because instantly updating the stylesheet when using the color picker would create lag.
2022-01-30 23:18:52 +01:00
Patrick Goldinger
e4c56cab03 Fix bugs and fine-tune appearance across extension editor 2022-01-30 20:12:46 +01:00
Patrick Goldinger
cef1c4e3f6 Add hint to text field and trim input in component meta dialog 2022-01-30 18:29:30 +01:00
Patrick Goldinger
b2721c9faa Add input validation to component meta editor dialog 2022-01-30 18:07:26 +01:00
Patrick Goldinger
ab4ae62ffe Improve SnyggRule backend 2022-01-30 15:43:44 +01:00
Patrick Goldinger
74244bab74 Add empty component screen in extension editor 2022-01-29 14:51:51 +01:00
svvvst
57112ae692 Added missing character to layout. 2022-01-28 14:04:15 -04:00
svvvst
fd1314ccba Fixed layout. 2022-01-28 14:03:24 -04:00
svvvst
45d99df104 Added missing character. 2022-01-28 14:02:36 -04:00
Patrick Goldinger
17b87f6543 Remove old theme related strings 2022-01-28 17:40:00 +01:00
Patrick Goldinger
d62e82569d Add ability to modify component meta data in stylesheet editor 2022-01-28 17:28:05 +01:00
Patrick Goldinger
dc5e00cc07 Fix KeyCode range being too restrictive 2022-01-27 23:51:45 +01:00
Patrick Goldinger
6402511d38 Eradicate nasty bug in SnyggRule comparator and equality logic
This bug caused some rules to be magically hidden, because they were either
incorrectly resolved as equal or the comparator returned `=` even though the
codes, groups or modes did not match at all.
2022-01-27 23:49:20 +01:00
Patrick Goldinger
83c1f70077 Implement property apply in stylesheet editor 2022-01-27 19:07:15 +01:00
Patrick Goldinger
f3375f48ef Update AGP to 7.1.0 and Gradle to 7.2 2022-01-27 00:12:01 +01:00
Patrick Goldinger
e1b911086b Fix minor theming issues in stylesheet editor 2022-01-26 23:38:25 +01:00
Patrick Goldinger
b60c0cef51 Improve property set button layout in stylesheet editor 2022-01-26 23:14:01 +01:00
Patrick Goldinger
0c42185700 Add sp size property value field in stylesheet editor 2022-01-26 22:52:46 +01:00
Patrick Goldinger
ee3c779b17 Add custom design for text field in stylesheet editor 2022-01-26 22:08:52 +01:00
Patrick Goldinger
b5e6655c84 Add color picker to property editor in stylesheet editor 2022-01-26 19:38:29 +01:00
Patrick Goldinger
e1b45b9193 Add property value for vars and type selector in stylesheet editor 2022-01-24 20:38:16 +01:00
svvvst
588713bd55 Add Rusyn 2022-01-24 15:23:16 -04:00
svvvst
43ad452174 Add rusyn layouts 2022-01-24 15:21:56 -04:00
svvvst
2cf9146536 Add Rusyn popup mapping 2022-01-24 15:15:37 -04:00
svvvst
f81331baed Add Rusyn language keyboard 2022-01-24 15:14:25 -04:00
Patrick Goldinger
9c9c3b9428 Add skeleton for property editor in stylesheet editor 2022-01-24 01:09:59 +01:00
Patrick Goldinger
4b64d81c21 Extract EditRuleDialog in own file 2022-01-23 23:15:03 +01:00
Patrick Goldinger
e826f600f0 Rework stylesheet editor to use lazy list, avoiding layout freeze 2022-01-23 23:04:36 +01:00
Patrick Goldinger
0f845a9784 Add modes and finish rule mod functionality in stylesheet editor 2022-01-23 21:53:04 +01:00
Patrick Goldinger
a2805bedca Add codes modifier UI in rule editor for stylesheet editor 2022-01-23 13:30:07 +01:00
Patrick Goldinger
d860bbfb90 Add rule dialog in stylesheet editor 2022-01-22 20:47:28 +01:00
Patrick Goldinger
70e2d34410 Add variables box in stylesheet editor 2022-01-21 20:36:44 +01:00
Patrick Goldinger
1c49a11824 Add property preview in stylesheet editor 2022-01-21 19:57:29 +01:00
Patrick Goldinger
cd2a0000c0 Add rule and properties view in stylesheet editor 2022-01-21 00:50:18 +01:00
Patrick Goldinger
1304e49eb4 Add strings for all rule and property names in stylesheet editor 2022-01-20 23:55:43 +01:00
svvvst
9658cecb88 Create rue.json 2022-01-20 00:32:53 -04:00
svvvst
4c23d5bafc Create rusyn.json
Custom Rusyn keyboard layout.
2022-01-19 21:00:39 -04:00
Patrick Goldinger
82238c8c1a Add base skeleton for stylesheet editing 2022-01-20 00:35:13 +01:00
Patrick Goldinger
ead74e1c26 Fix issues with loosing state on rotating screen in extension editor 2022-01-19 23:43:46 +01:00
Patrick Goldinger
d58371be81 Add basic component creator screen 2022-01-19 00:48:53 +01:00
Patrick Goldinger
844d194533 Add stub screens for dependencies and files 2022-01-18 22:55:40 +01:00
Patrick Goldinger
84abc929d0 Improve meta data editor screen for extension editor 2022-01-18 21:27:33 +01:00
Patrick Goldinger
7497470875 Add discard changes dialog / Improve action screen code 2022-01-18 01:34:19 +01:00
Patrick Goldinger
cc5df41daa Rework and refactor UI code base for extension editor 2022-01-17 23:49:14 +01:00
Patrick Goldinger
d87b290a32 Add meta data manager in extension editor 2022-01-17 01:51:16 +01:00
Patrick Goldinger
a0f859ad03 Add basic skeleton for in-app extension editing 2022-01-16 23:49:01 +01:00
Patrick Goldinger
c86892ec0b Merge pull request #1498 from florisboard/add-backup-and-restore-feature
Add backup and restore feature
2022-01-12 22:33:24 +01:00
Patrick Goldinger
c85fea0799 Enable encrypted backup for app data (#272, #1324) 2022-01-12 22:32:38 +01:00
Patrick Goldinger
765e34a01d Improve restore metadata UI 2022-01-11 00:29:19 +01:00
Patrick Goldinger
96e7f2eeac Add restore data functionality 2022-01-10 23:00:00 +01:00
Patrick Goldinger
23dddfd16e Add restore screen UI and general B&R code improvements
B&R..Backup&Restore

Restore action itself does nothing atm
2022-01-08 20:31:39 +01:00
Patrick Goldinger
e2318d0af1 Add ability to share generated backup through share menu 2022-01-07 17:38:22 +01:00
Patrick Goldinger
ef3b840dce Add backup data screen (local file sys only)
Also add skeleton for restore data screen
2022-01-07 02:51:43 +01:00
Patrick Goldinger
9b9c5fa70e Change unhandled stacktraces dir to prevent backup interference
Old location:
`files/{timestamp}.stacktrace`

New location:
`no_backup/unhandled_stacktraces/{timestamp}.stacktrace`

Additionally clean up some "magics" and improve code in the crash utility.
2022-01-06 23:00:08 +01:00
Patrick Goldinger
6f0216cf9f Raise targetSdk from API 30 to 31 2022-01-06 00:59:06 +01:00
626 changed files with 47132 additions and 30909 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1,2 +1,3 @@
github: [patrickgold]
liberapay: patrickgold
custom: ["https://paypal.me/devpatrickgold"]

BIN
.github/repo_icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -29,14 +29,6 @@ jobs:
java-version: 11
- name: Setup CMake and Ninja
uses: lukka/get-cmake@v3.20.1
- uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Build with Gradle
# MUST call gradlew separately because of an OSS license plugin issue.
# See https://github.com/google/play-services-plugins/issues/199

3
.gitignore vendored
View File

@@ -43,6 +43,3 @@ crowdin.properties
# C++
.cxx/
# AndroidX Room schema JSONs
/app/schemas/

View File

@@ -2,127 +2,104 @@
First off, thanks for considering contributing to FlorisBoard!
There are several ways to contribute to FlorisBoard. This document
provides some general guidelines for each type of contribution.
There are several ways to contribute to FlorisBoard. This document provides some general guidelines for each type of
contribution.
## Giving general feedback
NEW! You can now [give general feedback](https://github.com/florisboard/florisboard/discussions/new?category=feedback)
directly here on GitHub. This is the preferred way to give feedback, as
it allows not only for me to read and respond to feedback, but for everyone
in this community.
directly here on GitHub. This is the preferred way to give feedback, as it allows not only for me to read and respond to
feedback, but for everyone in this community.
Optionally you can also use the review function within Google Play or email me
at [florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev). I
love to hear from you! Note, that the amount of feedback emails I get
is overwhelmingly high - so if I don't answer or answer really late, I
apologize - I guarantee though that I read through every email and that
I will use every feedback to improve FlorisBoard :)
at [florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev). I love to hear from you! Note, that the amount of
feedback emails I get is overwhelmingly high - so if I don't answer or answer really late, I apologize - I guarantee
though that I read through every email and that I will use every feedback to improve FlorisBoard :)
## Translations
To make FlorisBoard accessible in as many languages as possible, the
platform [Crowdin](https://crowdin.florisboard.patrickgold.dev) is used
to crowdsource and manage translations. This is the only source of
translations from now on - **PRs that add/update translations are no
longer accepted.** The list of languages in Crowdin covers the top 20
languages, but feel free to email me at
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev) to
request a language and I'll add it.
platform [Crowdin](https://crowdin.florisboard.patrickgold.dev) is used to crowdsource and manage translations. This is
the only source of translations from now on - **PRs that add/update translations are no longer accepted.** The list of
languages in Crowdin covers the top 20 languages, but feel free to email me at
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev) to request a language and I'll add it.
## Adding a new feature or making large changes
If you intend to add a new feature or to make large changes, please
discuss this first through a proposal on GitHub. Discussing your idea
enables both you and the dev team that we are on the same page before
you start on working on your change. If you have any questions, feel
free to ask for help at any time!
If you intend to add a new feature or to make large changes, please discuss this first through a proposal on GitHub.
Discussing your idea enables both you and the dev team that we are on the same page before you start on working on your
change. If you have any questions, feel free to ask for help at any time!
## Adding a new keyboard layout
Adding a layout to FlorisBoard is very simple and does not require any
coding skills, although you should understand the basics of the JSON
syntax (it is very easy though by just looking at some other layout files).
There are two main steps in adding new layouts, though the config step can
be skipped if you only add a layout without a new default language support.
### The config file ([`app/src/main/assets/ime/config.json`](app/src/main/assets/ime/config.json))
This file is very important, as it defines all default currency sets as
well as all default subtypes available in the Settings Subtype UI. Note
that you don't have to modify this file if you add a layout for an already
pre-configured language.
- `currencySets`: This is a list of all currency sets, which can be chosen
for each subtype. If you consider adding a new one, make sure that the
first currency symbol matches the name of the currency set and also
ensure that you have exactly 6 currency symbols. This is important as the
symbol layouts have exactly 6 slots available to fill these defined
currency symbols in.
- `defaultSubtyes`: This is a list of all pre-made subtypes. Each time the
user selects a language in the `Subtype Add`-dialog, all options configured
here will get pre-selected. The language tag must adhere to the IETF BCP
47 code ([ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
and [ISO 3166-1 region code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements)).
For example, Dutch as spoken in Belgium is `nl-be`. Use a unique value
for `id` to avoid possible crashes caused by duplicate ids.
Adding a layout to FlorisBoard is very simple and does not require any coding skills, although you should understand the
basics of the JSON syntax (it is very easy though by just looking at some other layout files). Most of the time is
enough to look at the existing layout files, but the following attempts to help you in creating layouts from scratch.
### Adding the layout
Since v0.3.10-beta05 it is possible to add custom layouts for all types.
Since v0.3.14-beta06 it is possible to add custom layouts for all types using the new extension format, Flex.
To add a new layout, head to [`app/src/main/assets/ime/text`](app/src/main/assets/ime/text) and then select
the correct sub-directory for the type of layout you want to add. In most cases
this will be `characters` to add a layout like QWERTY etc.
Keyboard layout assets are grouped in [`app/src/main/assets/ime/keyboard`](app/src/main/assets/ime/keyboard) and are
further sub-grouped into the following:
For the `code` field of each key, make sure to use the UTF-8 code. An
useful tool for finding the correct code is [unicode-table.com](https://unicode-table.com/en/).
From there, you search for your letter and then use the HTML code, but without the `&#;`
- `org.florisboard.composers`: Defines standard composers for interpreting input, currently supports basic typing and
Korean input. Most of the time you won't need to add new composers, so if you don't know what they are always
assume `appender` (the default composer which does not alter input in any way) is in use.
- `org.florisboard.currencysets`: Lists all currency sets, which can be chosen for each subtype. If you consider adding
a new one, make sure that the first currency symbol matches the name of the currency set and also ensure that you have
exactly 6 currency symbols. This is important as the symbol layouts have exactly 6 slots available to fill these
defined currency symbols in.
- `org.florisboard.layouts`: Contains the actual layout files for all layout types.
- `org.florisboard.localization`: Contains all popup mappings and subtype presets (formally the `config.json` file). The
subtype presets are a list of all pre-made subtypes. Each time the user selects a language in the `Subtype Add`
-dialog, all options configured here will get selected if found in the presets. The language tag must adhere to the
IETF BCP 47 code ([ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
and [ISO 3166-1 region code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements)). For
example, Dutch as spoken in Belgium is `nl-be`.
To add a new layout, head to above directory and add the necessary files to each extension group.
For the `code` field of each key, make sure to use the UTF-8 code. An useful tool for finding the correct code
is [unicode-table.com](https://unicode-table.com/en/). From there, you search for your letter and then use the HTML
code, but without the `&#;`
For internal codes of functional or UI keys, see
[`app/src/main/java/dev/patrickgold/florisboard/ime/text/key/KeyCode.kt`](app/src/main/java/dev/patrickgold/florisboard/ime/text/key/KeyCode.kt).
[`app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/key/KeyCode.kt`](app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/key/KeyCode.kt)
.
The label is equally important and should always match up with the defined
code. If `code` and `label` don't match up, FlorisBoard won't crash but
it will most likely lead to confusion in the key processing logic.
The label is equally important and should always match up with the defined code. If `code` and `label` don't match up,
FlorisBoard won't crash but it will most likely lead to confusion in the key processing logic.
Any accents or diacritics that should be exposed via long press can be
added at [`app/src/main/assets/ime/text/characters/extended_popups/<languageTag_name_here>.json`](app/src/main/assets/ime/text/characters/extended_popups).
For each key, you can add 1 main and several relevant accents. The main
accent should be used for accents which are important for the language
you add. The main field is used for determining if a hint or an accent
should take priority, so please make sure to leave main empty and just
use relevant for accents which are not-so important.
Any accents or diacritics that should be exposed via long press can be added
at [`app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/<languageTag>.json`](app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings)
. For each key, you can add 1 main and several relevant accents. The main accent should be used for accents which are
important for the language you add. The main field is used for determining if a hint or an accent should take priority,
so please make sure to leave main empty and just use relevant for accents which are not-so important.
For popups of non-`characters` layout, simply add the popup directly to
each key via the `popup` field.
For popups of non-`characters` layout, simply add the popup directly to each key via the `popup` field.
## Adding a new dictionary for a language
Currently the suggestions implementation is highly experimental and will
get a major if not complete rework, so dictionaries are currently not
accepted.
Currently the suggestions implementation is highly experimental and not available until 0.4.0, so dictionaries are
currently not accepted.
## Bug reporting
This kind of contribution is the most important, as it tells where
FlorisBoard has flaws and thus should be improved to maximize stability
and user experience. To make this process as smooth as possible, please
use the pre-made [issue template](.github/ISSUE_TEMPLATE/bug_report.md)
for bug reporting. This makes it easy for us to understand what the bug
is and how to solve it.
This kind of contribution is the most important, as it tells where FlorisBoard has flaws and thus should be improved to
maximize stability and user experience. To make this process as smooth as possible, please use the
pre-made [issue template](.github/ISSUE_TEMPLATE/bug_report.md)
for bug reporting. This makes it easy for us to understand what the bug is and how to solve it.
### Capturing error logs
Logs are captured by FlorisBoard's crash handler, which gives you the
ability to copy it to the clipboard and paste it in GitHub. This is the
preferred way to capture logs.
Logs are captured by FlorisBoard's crash handler, which gives you the ability to copy it to the clipboard and paste it
in GitHub. This is the preferred way to capture logs.
Alternatively, you can also use ADB (Android Debug Bridge) to capture
the error log. This is recommended for experienced users only.
Alternatively, you can also use ADB (Android Debug Bridge) to capture the error log. This is recommended for experienced
users only.
## Donating
If none of the above options are feasible for you but you still want to
show your support, you can also buy me a coffee, so I can stay up all night
and chase away bugs or add new cool stuff :)
If none of the above options are feasible for you but you still want to show your support, you can also buy me a coffee,
so I can stay up all night and chase away bugs or add new cool stuff :)
See the `Sponsors` button for available options!

View File

@@ -1,9 +1,9 @@
<img align="left" width="80" height="80"
src="fastlane/metadata/android/en-US/images/icon.png" alt="App icon">
src=".github/repo_icon.png" alt="App icon">
# FlorisBoard [![Crowdin](https://badges.crowdin.net/florisboard/localized.svg)](https://crowdin.florisboard.patrickgold.dev) [![Matrix badge](https://img.shields.io/badge/chat-%23florisboard%3amatrix.org-blue)](https://matrix.to/#/#florisboard:matrix.org) ![FlorisBoard CI](https://github.com/florisboard/florisboard/workflows/FlorisBoard%20CI/badge.svg?event=push)
**FlorisBoard** is a free and open-source keyboard for Android 6.0+
**FlorisBoard** is a free and open-source keyboard for Android 7.0+
devices. It aims at being modern, user-friendly and customizable while
fully respecting your privacy. Currently in early-beta state.
@@ -18,10 +18,10 @@ fully respecting your privacy. Currently in early-beta state.
</tr>
<tr>
<td valign="top">
<p><i>Major versions only, 1 release per 1-3 months</i><br><br>Updates are more polished, new features are matured and tested through to ensure a stable experience.</p>
<p><i>Major versions only, 1 release per 1-5 months</i><br><br>Updates are more polished, new features are matured and tested through to ensure a stable experience.</p>
</td>
<td valign="top">
<p><i>Beta versions, 1-2 releases per week</i><br><br>Updates contain new features that may not be fully matured yet and bugs are more likely to occur. Allows you to give early feedback.</p>
<p><i>Beta versions, up to 1-2 releases per week</i><br><br>Updates contain new features that may not be fully matured yet and bugs are more likely to occur. Allows you to give early feedback.</p>
</td>
</tr>
<tr>
@@ -54,15 +54,18 @@ fully respecting your privacy. Currently in early-beta state.
</tr>
</table>
Beginning with v0.4.0 FlorisBoard will follow [SemVer](https://semver.org/#summary) versioning scheme and enter the public beta on Google Play.
Beginning with v0.4.0 FlorisBoard will follow [SemVer](https://semver.org/#summary) versioning scheme.
Beginning with v0.5.0 FlorisBoard will enter the public beta on Google Play.
## Highlighted features
- Spell checking service
- Word suggestions (currently English only and may not work on all devices)
- Glide typing (currently English only)
- Advanced theming support and customization
- Integrated clipboard manager / history
- Emoji keyboard (although lacking some features)
- Advanced theming support and customization
- Integrated extension support (still evolving)
- Emoji keyboard
- Spell checking service
- Glide typing (currently English only)
Word suggestions are not included in the current releases and are a major goal for the v0.4.0 milestone.
Feature roadmap: See [ROADMAP.md](ROADMAP.md)
@@ -78,26 +81,30 @@ Please refer to this [page](https://github.com/florisboard/florisboard/wiki/List
to get more information on this topic.
## Used libraries, components and icons
* [Google Flexbox Layout for Android](https://github.com/google/flexbox-layout)
by [google](https://github.com/google)
* [AndroidX libraries](https://github.com/androidx/androidx) by
[Android Jetpack](https://github.com/androidx)
* [Accompanist Compose UI libraries](https://github.com/google/accompanist/) by
[Google](https://github.com/google)
* [AboutLibraries](https://github.com/mikepenz/AboutLibraries) by
[mikepenz](https://github.com/mikepenz)
* [Google Material icons](https://github.com/google/material-design-icons) by
[google](https://github.com/google)
[Google](https://github.com/google)
* [JetPref preference library](https://github.com/patrickgold/jetpref) by
[patrickgold](https://github.com/patrickgold)
* [KotlinX coroutines library](https://github.com/Kotlin/kotlinx.coroutines) by
[Kotlin](https://github.com/Kotlin)
* [KotlinX serialization library](https://github.com/Kotlin/kotlinx.serialization) by
[Kotlin](https://github.com/Kotlin)
* [ColorPicker preference](https://github.com/jaredrummler/ColorPicker) by
[Jared Rummler](https://github.com/jaredrummler)
* [Timber](https://github.com/JakeWharton/timber) by
[JakeWharton](https://github.com/JakeWharton)
* [expandable-fab](https://github.com/nambicompany/expandable-fab) by
[Nambi](https://github.com/nambicompany)
* [ICU4C](https://github.com/unicode-org/icu) by
[The Unicode Consortium](https://github.com/unicode-org)
* [Nuspell](https://github.com/nuspell/nuspell) by
[Nuspell](https://github.com/nuspell)
Many thanks to [Nikolay Anzarov](https://www.behance.net/nikolayanzarov) ([@BloodRaven0](https://github.com/BloodRaven0)) for designing and providing the main app icons to this project!
## License
```
Copyright 2020 Patrick Goldinger
Copyright 2020-2022 Patrick Goldinger
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

View File

@@ -1,94 +1,113 @@
# FlorisBoard's feature roadmap & milestones
This feature roadmap intents to provide transparency to what I want to add
to FlorisBoard in the foreseeable future. Note that there are no ETAs for any
version milestones down below, experience says these won't hold anyways.
This feature roadmap intents to provide transparency to what I want to add to FlorisBoard in the foreseeable future.
Note that there are no ETAs for any version milestones down below, experience says these won't hold anyways.
I try my best to release regularly, though some features take a lot longer
than others and thus releases can be spaced out a bit on the stable track.
If you are interested in following the development more closely, make sure to
follow along the beta track releases! These are generally more unstable but
you get new stuff faster and can provide early feedback, which helps a lot!
I try my best to release regularly, though some features take a lot longer than others and thus releases can be spaced
out a bit on the stable track. If you are interested in following the development more closely, make sure to follow
along the beta track releases! These are generally more unstable but you get new stuff faster and can provide early
feedback, which helps a lot!
## 0.3.x
Releases in this section still follow the old versioning scheme, meaning the
patch number is a feature upgrade. As this naming convention is more confusing
than useful, beginning with v0.4.0 development a new release/development cycle will be
introduced.
## 0.4
### 0.3.14 (currently in progress, much is already implemented and working well)
- Re-write of the Preference core
- Reduce redundancy in key/default value definitions
- Avoid having to manually add redundant code for adding a new pref
- Goes hand-in-hand with the Settings UI re-write
- Re-write of the Settings UI with Jetpack Compose
- Also re-structure UI into a more list-like panel
- Adjust theme colors of Settings a bit to make it more modern
- Preview the keyboard at any time from within the Settings
- Settings language different than device language
- Re-write the Setup UI in Jetpack Compose
- Simplify screen based on previously discussed ideas and mock-ups
- Improve backend setup logic
- Implement base-UI for extensions and further continue development
of existing Flex (FlorisBoard extension) format
- Allows for a continuous experience of customizing FlorisBoard in different areas
- Planned what will use Flex:
- Themes
- Layouts (Characters, symbols, numeric, ...)
- Composers for non-Latin script languages
- Word suggestion dictionaries (in 0.4.0)
- Spell check dictionaries
- User dictionaries (not in 0.3.14)
- Other features that require only data and no logic (not in 0.3.14)
- Maybe full backup of preferences? Not 100% confirmed though and may be pushed back
- Theme rework part I:
- Custom key corner radius
- Custom key border color (not shadow!!)
- Re-work theme internals so they use Flex extension format and FlexCSS
- Improvement of the Smartbar
- Allow to have multiple Smartbars
- Better candidate view (in prep for 0.4.0)
Major release which mainly focuses on adding proper word suggestions and inline autocorrect (for Latin-based languages
only at first). This is a big effort which will take some time to be fully completed. Additionally general small bug
fixes and improvements will be made alongside the development of the main objective.
### 0.3.15
- Hotfix release for possible bugs in the preference rework, may be skipped and 0.4.0 is directly released.
With this release the versioning scheme changes to `0.x.y`, where `x` specifies the major changes, and `y` are just
small bug fixes and improvements for the former major stable release `x`. This is different to `0.3.x`, where the
version scheme just did not make any sense anymore, especially with the latest `0.3.x` releases. As for the beta track,
major developments (`0.x`) will have alpha, beta and release candidate releases on the beta track before it goes live on
the stable track. Small follow-up bug fixes (`0.x.y`) will be published on both the stable and beta track without
release candidates.
## 0.4.0
- Re-adding word suggestions (at least for Latin-based languages at first)
- Importing the dictionaries as well as management relies on the Flex extension core and UI in Kotlin
- Actually parsing and generating suggestions happens in C++ to avoid another OOM catastrophe like in 0.3.9/10
- The actual format of the dictionary and word list source is not decided yet
- Community repository on GitHub for theme sharing across users (may be 0.5.0)
### Word suggestions / Autocorrect
With this release the versioning scheme changes: the second number now indicates new features,
changes in the third "patch" number now indicates bug fixes for the stable track. The development
cycle for each 0.x release will have `-alphaXX`, `-betaXX` and `-rcXX` (release candidate) releases on the beta
track for interested people to follow along the development. The first release to follow the new scheme will be `0.4.0-alpha01`
on the beta track.
The development effort of this feature is quite big, thus it is split into multiple phases:
**Phase 1: Preparations of suggestions UI & interfacing API (first alpha release(s))**
- Rework Smartbar suggestions UI
- Allow for primary and optionally secondary label (in a smaller font) to be shown per suggestion
- Better integrate clipboard suggestions into word suggestion flow
- Add long-press suggestion action for user to prevent from showing again
- Generally fix and polish suggestions UI design (3-column mode and scrollable mode)
- Add a `SuggestionProvider` interface API to allow for any specialized implementation to be written
- A provider's main task is to receive updates on the current state of the editor (except for raw inputs) and
provide both current word autocorrect/suggestions or next word suggestions if there is no current word
- The provider can utilize the basic APK asset and file APIs for reading dictionary files, however there is no
standardization in parsing as different languages may require different dictionary structures and thus have
different requirements
- Document API and add dummy implementation to test API
- Try to add toggle for not underlining the current word (composing region) while not loosing the caching benefits
- In parallel: Do local research and preps for phase 2
_[Anomaly](https://www.anomaly.ltd/), an Australian software company, will sponsor this project with 1000€ so this phase
gets implemented first, as they want to use FlorisBoard as a base for
their [WCC Language Program project (Gurray)](https://www.anomaly.ltd/portfolio/wcc/gurray/). As this fits in perfectly
with the current dev cycle and this had to be done anyways (some parts like documenting and UI polishing just later in
the 0.4 milestone), I have accepted this. However in general this does not mean this project accepts sponsoring for any
feature to be prioritized, as the project's main goals and planned feature timeline must always come first and human dev
resources are limited._
**Phase 2: Add native (C++) Latin word suggestion core (alpha releases)**
- Research and experiment with different approaches/data sources for Latin-based language prediction and autocorrect
- Research will mainly be done first locally on Linux to decide what to use
- Implementation will be in C++ using STL libraries and if needed other open-source libraries, with compatibility
and CPU/memory restrictions on Android devices in mind
- Once an experiment runs well locally it will be included in the main project and tested out within the keyboard UI
in different alpha releases
- Especially at the beginning an idea may be scrapped and replaced by something else if found that another approach
is better
- (Based on research) Introduce new dictionary/language model format
- Importing the dictionaries/models as well as management relies on the Flex extension core and UI in Kotlin
- Actually parsing and generating suggestions happens in C++
- The actual format of the dictionary/model source is not decided yet
- Add system in preprocessing stage to properly mark slightly offensive words and prevent extremely offensive words
from being included at all
- Add system in preprocessing stage to filter out email addresses and phone numbers that may be included in the
large datasets which are used for building the models
**Phase 3: Add support for more languages & Allow glide typing to utilize new word prediction system (beta releases)**
- Glide typing: Utilize new prediction system and get rid of current English (US) json dictionary
- Add support for more languages (Latin-based), may need to utilize datasets like Opensubtitles or Wikimedia, although
those need extensive cleaning and are not as reliable
- Focus on improving performance and stabilizing the Latin suggestion core
- Possibly address some language-specific issues and ensure suggested word capitalization is correct
- Finalize Settings and keyboard UI regarding word suggestions.
### Other planned features for 0.4
- General small fixes and improvements
- Community repository on GitHub for extension sharing across users (may be 0.5.0 though)
- Localized emoji suggestions (may be 0.5.0 though)
## 0.5
## 0.5.0
- Complete rework of the Emoji panel
- Recently used / Emoji history
- Emoji search
- Emoji suggestions when using :emoji_name: syntax
- Kaomoji panel implementation (the third tab which currently has "not yet implemented")
- Recently used / Emoji history (already implemented with 0.3.14)
- Emoji search
- Emoji suggestions when using :emoji_name: syntax
- Kaomoji panel implementation (the third tab which currently has "not yet implemented")
- Smartbar customization improvements
- Quick actions customization (order and which buttons to show)
- Prepare FlorisBoard repository and app store presence for public beta release
on Google Play (will go live with stable 0.5.0!!)
- Quick actions customization (order and which buttons to show)
- Prepare FlorisBoard repository and app store presence for public beta release on Google Play (will go live with stable
0.5.0!!)
- Rework branding images and texts of FlorisBoard for the app stores
- Focus on stability and experience improvements of the app and keyboard
## 0.6.0
- Full on-board layout editor which allows users to create their own layouts
without writing a JSON file
- Import/Export of custom layout files packed in Flex extensions
## Backlog
## Backlog / Features that MAY be added, even in versions not mentioned above if the feature implementation fits perfectly with another feature
**Features that MAY be added (even in versions mentioned above) or dismissed altogether**
- Full on-board layout editor which allows users to create their own layouts without writing a JSON file
- Import/Export of custom layout files packed in Flex extensions
- Theme rework part II
- Adaptive themes v2
- Voice-to-text with Mozilla's open-source voice service
- Text translation
- Glide typing better word detection
- Proximity-based key typo detection
- Floating keyboard
- Tablet mode / Optimizations for landscape input

View File

@@ -1,14 +1,37 @@
/*
* Copyright (C) 2022 Patrick Goldinger
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Suppress needed until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed
@file:Suppress("DSL_SCOPE_VIOLATION")
import java.io.ByteArrayOutputStream
import java.io.File
plugins {
id("com.android.application")
kotlin("android")
kotlin("kapt")
kotlin("plugin.serialization")
id("com.google.android.gms.oss-licenses-plugin")
id("de.mannodermaus.android-junit5")
alias(libs.plugins.agp.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.ksp)
alias(libs.plugins.mannodermaus.android.junit5)
alias(libs.plugins.mikepenz.aboutlibraries)
}
android {
compileSdk = 31
namespace = "dev.patrickgold.florisboard"
compileSdk = 32
buildToolsVersion = "31.0.0"
ndkVersion = "22.1.7171670"
@@ -18,32 +41,29 @@ android {
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
jvmTarget = "1.8"
freeCompilerArgs = listOf(
"-Xallow-result-return-type",
"-Xopt-in=kotlin.RequiresOptIn",
"-Xopt-in=kotlin.contracts.ExperimentalContracts",
"-Xjvm-default=compatibility",
"-opt-in=kotlin.contracts.ExperimentalContracts",
"-Xjvm-default=all-compatibility",
)
}
defaultConfig {
applicationId = "dev.patrickgold.florisboard"
minSdk = 23
targetSdk = 30
versionCode = 64
versionName = "0.3.14"
minSdk = 24
targetSdk = 31
versionCode = 89
versionName = "0.4.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments += mapOf(
Pair("room.schemaLocation", "$projectDir/schemas"),
Pair("room.incremental", "true"),
Pair("room.expandProjection", "true")
)
}
buildConfigField("String", "BUILD_COMMIT_HASH", "\"${getGitCommitHash()}\"")
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
arg("room.incremental", "true")
arg("room.expandProjection", "true")
}
externalNativeBuild {
@@ -66,16 +86,28 @@ android {
jniLibs {
srcDirs("src/main/icu4c/prebuilt/jniLibs")
}
java {
srcDirs("src/main/kotlin")
}
}
}
}
bundle {
language {
// We disable language split because FlorisBoard does not use
// runtime Google Play Service APIs and thus cannot dynamically
// request to download the language resources for a specific locale.
enableSplit = false
}
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.1.0-rc01"
kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get()
}
externalNativeBuild {
@@ -85,12 +117,12 @@ android {
}
buildTypes {
named("debug").configure {
named("debug") {
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
versionNameSuffix = "-debug-${getGitCommitHash(short = true)}"
isDebuggable = true
isJniDebuggable = true
isJniDebuggable = false
ndk {
// For running FlorisBoard on the emulator
@@ -103,11 +135,13 @@ android {
resValue("string", "floris_app_name", "FlorisBoard Debug")
}
create("beta") // Needed because by default the "beta" BuildType does not exist
named("beta").configure {
create("beta") {
applicationIdSuffix = ".beta"
versionNameSuffix = "-beta08"
proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt"))
versionNameSuffix = "-alpha03"
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
isMinifyEnabled = true
isShrinkResources = true
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_beta")
resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_beta_round")
@@ -115,14 +149,31 @@ android {
resValue("string", "floris_app_name", "FlorisBoard Beta")
}
named("release").configure {
proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt"))
named("release") {
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
isMinifyEnabled = true
isShrinkResources = true
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_release")
resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_release_round")
resValue("drawable", "floris_app_icon_foreground", "@drawable/ic_app_icon_release_foreground")
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_stable")
resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_stable_round")
resValue("drawable", "floris_app_icon_foreground", "@drawable/ic_app_icon_stable_foreground")
resValue("string", "floris_app_name", "@string/app_name")
}
create("benchmark") {
initWith(getByName("release"))
signingConfig = signingConfigs.getByName("debug")
matchingFallbacks += listOf("release")
ndk {
// For running FlorisBoard on the emulator
abiFilters += listOf("x86", "x86_64")
}
}
}
aboutLibraries {
configPath = "app/src/main/config"
}
testOptions {
@@ -133,10 +184,6 @@ android {
it.useJUnitPlatform()
}
}
lint {
isAbortOnError = false
}
}
tasks.withType<Test> {
@@ -144,31 +191,57 @@ tasks.withType<Test> {
}
dependencies {
implementation("androidx.activity:activity-compose:1.4.0")
implementation("androidx.activity:activity-ktx:1.4.0")
implementation("androidx.autofill:autofill:1.1.0")
implementation("androidx.collection:collection-ktx:1.2.0")
implementation("androidx.compose.material:material:1.1.0-rc01")
implementation("androidx.compose.runtime:runtime-livedata:1.1.0-rc01")
implementation("androidx.compose.ui:ui:1.1.0-rc01")
implementation("androidx.compose.ui:ui-tooling-preview:1.1.0-rc01")
implementation("androidx.core:core-ktx:1.7.0")
implementation("androidx.core:core-splashscreen:1.0.0-alpha02")
implementation("androidx.navigation:navigation-compose:2.4.0-rc01")
implementation("com.google.accompanist:accompanist-systemuicontroller:0.20.2")
implementation("dev.patrickgold.jetpref:jetpref-datastore-model:0.1.0-beta02")
implementation("dev.patrickgold.jetpref:jetpref-datastore-ui:0.1.0-beta02")
implementation("dev.patrickgold.jetpref:jetpref-material-ui:0.1.0-beta02")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.1")
implementation("androidx.room:room-runtime:2.4.0")
kapt("androidx.room:room-compiler:2.4.0")
implementation(libs.accompanist.flowlayout)
implementation(libs.accompanist.systemuicontroller)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.activity.ktx)
implementation(libs.androidx.autofill)
implementation(libs.androidx.collection.ktx)
implementation(libs.androidx.compose.material)
implementation(libs.androidx.compose.runtime.livedata)
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.core.splashscreen)
implementation(libs.androidx.emoji2)
implementation(libs.androidx.emoji2.views)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.profileinstaller)
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.runtime)
implementation(libs.cache4k)
implementation(libs.jetpref.datastore.model)
implementation(libs.jetpref.datastore.ui)
implementation(libs.jetpref.material.ui)
implementation(libs.kotlinx.coroutines)
implementation(libs.kotlinx.serialization.json)
implementation(libs.mikepenz.aboutlibraries.core)
implementation(libs.mikepenz.aboutlibraries.compose)
implementation(libs.patrickgold.compose.tooltip)
testImplementation("io.kotest:kotest-runner-junit5:4.6.3")
testImplementation("io.kotest:kotest-assertions-core:4.6.3")
testImplementation("io.kotest:kotest-property:4.6.3")
testImplementation("io.kotest.extensions:kotest-extensions-robolectric:0.4.0")
testImplementation(libs.equalsverifier)
testImplementation(libs.kotest.assertions.core)
testImplementation(libs.kotest.extensions.roboelectric)
testImplementation(libs.kotest.property)
testImplementation(libs.kotest.runner.junit5)
androidTestImplementation("androidx.test.ext", "junit", "1.1.2")
androidTestImplementation("androidx.test.espresso", "espresso-core", "3.3.0")
androidTestImplementation(libs.androidx.test.ext)
androidTestImplementation(libs.androidx.test.espresso.core)
}
fun getGitCommitHash(short: Boolean = false): String {
if (!File(".git").exists()) {
return "null"
}
val stdout = ByteArrayOutputStream()
exec {
if (short) {
commandLine("git", "rev-parse", "--short", "HEAD")
} else {
commandLine("git", "rev-parse", "HEAD")
}
standardOutput = stdout
}
return stdout.toString().trim()
}

29
app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,29 @@
# Disable obfuscation (we use Proguard exclusively for optimization)
-dontobfuscate
# Keep `Companion` object fields of serializable classes.
# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects.
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> {
static <1>$Companion Companion;
}
# Keep `serializer()` on companion objects (both default and named) of serializable classes.
-if @kotlinx.serialization.Serializable class ** {
static **$* *;
}
-keepclassmembers class <2>$<3> {
kotlinx.serialization.KSerializer serializer(...);
}
# Keep `INSTANCE.serializer()` of serializable objects.
-if @kotlinx.serialization.Serializable class ** {
public static ** INSTANCE;
}
-keepclassmembers class <1> {
public static <1> INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
}
# @Serializable and @Polymorphic are used at runtime for polymorphic serialization.
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault

View File

@@ -0,0 +1,62 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "d573e2ae2cbe7026957bc8d8fda291f3",
"entities": [
{
"tableName": "clipboard_files",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER NOT NULL, `_display_name` TEXT NOT NULL, `_size` INTEGER NOT NULL, `mimeTypes` TEXT NOT NULL, PRIMARY KEY(`_id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "displayName",
"columnName": "_display_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "size",
"columnName": "_size",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "mimeTypes",
"columnName": "mimeTypes",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_clipboard_files__id",
"unique": false,
"columnNames": [
"_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_clipboard_files__id` ON `${TABLE_NAME}` (`_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd573e2ae2cbe7026957bc8d8fda291f3')"
]
}
}

View File

@@ -0,0 +1,80 @@
{
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "6fbec9d7ea017f8aefac4fb84dbd5189",
"entities": [
{
"tableName": "clipboard_history",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` INTEGER NOT NULL, `text` TEXT, `uri` TEXT, `creationTimestampMs` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `mimeTypes` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "uri",
"columnName": "uri",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "creationTimestampMs",
"columnName": "creationTimestampMs",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "mimeTypes",
"columnName": "mimeTypes",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_clipboard_history__id",
"unique": false,
"columnNames": [
"_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_clipboard_history__id` ON `${TABLE_NAME}` (`_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6fbec9d7ea017f8aefac4fb84dbd5189')"
]
}
}

View File

@@ -0,0 +1,68 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "787af4a2df15bf9d2c0597519d3fb273",
"entities": [
{
"tableName": "words",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `word` TEXT NOT NULL, `frequency` INTEGER NOT NULL, `locale` TEXT, `shortcut` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "word",
"columnName": "word",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "freq",
"columnName": "frequency",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "locale",
"columnName": "locale",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "shortcut",
"columnName": "shortcut",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_words__id",
"unique": false,
"columnNames": [
"_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_words__id` ON `${TABLE_NAME}` (`_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '787af4a2df15bf9d2c0597519d3fb273')"
]
}
}

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2020 Patrick Goldinger
<!-- Copyright (C) 2020-2022 Patrick Goldinger
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,10 +13,8 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="dev.patrickgold.florisboard">
xmlns:tools="http://schemas.android.com/tools">
<!-- Permission needed to vibrate if the user has key press vibration enabled -->
<uses-permission android:name="android.permission.VIBRATE"/>
@@ -36,12 +34,18 @@
<application
android:name="dev.patrickgold.florisboard.FlorisApplication"
android:allowBackup="false"
android:allowBackup="true"
android:dataExtractionRules="@xml/backup_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/floris_app_icon"
android:label="@string/floris_app_name"
android:roundIcon="@mipmap/floris_app_icon_round"
android:supportsRtl="true"
android:theme="@style/FlorisAppTheme">
android:theme="@style/FlorisAppTheme"
tools:targetApi="s">
<!-- Allow app to be profiled for benchmarking and baseline profile generation -->
<profileable android:shell="true"/>
<!-- IME service -->
<service
@@ -49,8 +53,7 @@
android:label="@string/floris_app_name"
android:permission="android.permission.BIND_INPUT_METHOD"
android:directBootAware="true"
android:exported="true"
tools:targetApi="n">
android:exported="true">
<intent-filter>
<action android:name="android.view.InputMethod"/>
</intent-filter>
@@ -77,7 +80,7 @@
android:launchMode="singleTask"
android:roundIcon="@mipmap/floris_app_icon_round"
android:windowSoftInputMode="adjustResize"
android:theme="@style/FlorisAppTheme"
android:theme="@style/FlorisAppTheme.Splash"
android:exported="false">
<intent-filter>
<data android:scheme="florisboard" android:host="app-ui"/>
@@ -92,7 +95,7 @@
android:launchMode="singleTask"
android:roundIcon="@mipmap/floris_app_icon_round"
android:targetActivity="dev.patrickgold.florisboard.app.FlorisAppActivity"
android:theme="@style/FlorisAppTheme"
android:theme="@style/FlorisAppTheme.Splash"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
@@ -102,7 +105,7 @@
<!-- Import File Bridging Activity -->
<activity
android:name="dev.patrickgold.florisboard.app.ui.ext.ImportFileActivity"
android:name="dev.patrickgold.florisboard.app.ext.ImportFileActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__title"
android:launchMode="singleTask"
@@ -120,18 +123,41 @@
<!-- Crash Dialog Activity -->
<activity
android:name="dev.patrickgold.florisboard.crashutility.CrashDialogActivity"
android:name="dev.patrickgold.florisboard.lib.crashutility.CrashDialogActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/crash_dialog__title"
android:theme="@style/CrashDialogTheme"/>
<!-- Clipboard Media File Provider -->
<provider
android:name="dev.patrickgold.florisboard.ime.clipboard.provider.FlorisContentProvider"
android:authorities="${applicationId}.provider.clip"
android:name="dev.patrickgold.florisboard.ime.clipboard.provider.ClipboardMediaProvider"
android:authorities="${applicationId}.provider.clipboard"
android:grantUriPermissions="true"
android:exported="false">
</provider>
<!-- Default file provider to share files from the "files" or "cache" dir -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider.file"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
<!-- Disable default EmojiCompat initializer -->
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.emoji2.text.EmojiCompatInitializer"
tools:node="remove"/>
</provider>
</application>
</manifest>

View File

@@ -1,57 +0,0 @@
{
"package": "dev.patrickgold.florisboard",
"composers": [
{ "$": "appender" },
{ "$": "hangul-unicode" },
{ "$": "kana-unicode" },
{ "$": "with-rules",
"name": "basic-telex",
"label": "Basic Telex",
"rules": {
"aw": "ă", "aa": "â", "dd": "đ", "ee": "ê", "oo": "ô", "ow": "ơ", "uw": "ư", "w": "ư",
"uow": "ươ",
"af": "à", "ar": "ả", "ax": "ã", "as": "á", "aj": "ạ",
"ăf": "ằ", "ăr": "ẳ", "ăx": "ẵ", "ăs": "ắ", "ăj": "ặ",
"âf": "ầ", "âr": "ẩ", "âx": "ẫ", "âs": "ấ", "âj": "ậ",
"ef": "è", "er": "ẻ", "ex": "ẽ", "es": "é", "ej": "ẹ",
"êf": "ề", "êr": "ể", "êx": "ễ", "ês": "ế", "êj": "ệ",
"if": "ì", "ir": "ỉ", "ix": "ĩ", "is": "í", "ij": "ị",
"of": "ò", "or": "ỏ", "ox": "õ", "os": "ó", "oj": "ọ",
"ôf": "ồ", "ôr": "ổ", "ôx": "ỗ", "ôs": "ố", "ôj": "ộ",
"ơf": "ờ", "ơr": "ở", "ơx": "ỡ", "ơs": "ớ", "ơj": "ợ",
"uf": "ù", "ur": "ủ", "ux": "ũ", "us": "ú", "uj": "ụ",
"ưf": "ừ", "ưr": "ử", "ưx": "ữ", "ưs": "ứ", "ưj": "ự",
"yf": "ỳ", "yr": "ỷ", "yx": "ỹ", "ys": "ý", "yj": "ỵ",
"ăw": "aw", "âa": "aa", "đd": "dd", "êe": "ee", "ôo": "oo", "ơw": "ow", "ưw": "w",
"ươw": "uow",
"àf": "af", "ảr": "ar", "ãx": "ax", "ás": "as", "ạj": "aj",
"ằf": "ăf", "ẳr": "ăr", "ẵx": "ăx", "ắs": "ăs", "ặj": "ăj",
"ầf": "âf", "ẩr": "âr", "ẫx": "âx", "ấs": "âs", "ậj": "âj",
"èf": "ef", "ẻr": "er", "ẽx": "ex", "és": "es", "ẹj": "ej",
"ềf": "êf", "ểr": "êr", "ễx": "êx", "ếs": "ês", "ệj": "êj",
"ìf": "if", "ỉr": "ir", "ĩx": "ix", "ís": "is", "ịj": "ij",
"òf": "of", "ỏr": "or", "õx": "ox", "ós": "os", "ọj": "oj",
"ồf": "ôf", "ổr": "ôr", "ỗx": "ôx", "ốs": "ôs", "ộj": "ôj",
"ờf": "ơf", "ởr": "ơr", "ỡx": "ơx", "ớs": "ơs", "ợj": "ơj",
"ùf": "uf", "ủr": "ur", "ũx": "ux", "ús": "us", "ụj": "uj",
"ừf": "ưf", "ửr": "ưr", "ữx": "ưx", "ứs": "ưs", "ựj": "ưj",
"ỳf": "yf", "ỷr": "yr", "ỹx": "yx", "ýs": "ys", "ỵj": "yj",
"àz": "a", "ảz": "a", "ãz": "a", "áz": "a", "ạz": "a",
"ằz": "ă", "ẳz": "ă", "ẵz": "ă", "ắz": "ă", "ặz": "ă",
"ầz": "â", "ẩz": "â", "ẫz": "â", "ấz": "â", "ậz": "â",
"èz": "e", "ẻz": "e", "ẽz": "e", "éz": "e", "ẹz": "e",
"ềz": "ê", "ểz": "ê", "ễz": "ê", "ếz": "ê", "ệz": "ê",
"ìz": "i", "ỉz": "i", "ĩz": "i", "íz": "i", "ịz": "i",
"òz": "o", "ỏz": "o", "õz": "o", "óz": "o", "ọz": "o",
"ồz": "ô", "ổz": "ô", "ỗz": "ô", "ốz": "ô", "ộz": "ô",
"ờz": "ơ", "ởz": "ơ", "ỡz": "ơ", "ớz": "ơ", "ợz": "ơ",
"ùz": "u", "ủz": "u", "ũz": "u", "úz": "u", "ụz": "u",
"ừz": "ư", "ửz": "ư", "ữz": "ư", "ứz": "ư", "ựz": "ư",
"ỳz": "y", "ỷz": "y", "ỹz": "y", "ýz": "y", "ỵz": "y"
}
}
],
"currencySets": [],
"defaultSubtypes": [
]
}

View File

@@ -0,0 +1,678 @@
{
"$": "ime.extension.keyboard",
"meta": {
"id": "org.florisboard.composers",
"version": "0.1.1",
"title": "Default composers",
"description": "Default composers which are always available.",
"maintainers": [ "patrickgold <patrick@patrickgold.dev>", "thanhhocse96 <thanh.hoquang@pm.me>" ],
"license": "apache-2.0"
},
"composers": [
{ "$": "appender" },
{ "$": "hangul-unicode" },
{ "$": "kana-unicode" },
{ "$": "with-rules",
"id": "telex",
"label": "Telex",
"rules": {
"aw": "ă", "aa": "â", "dd": "đ", "ee": "ê", "oo": "ô", "ow": "ơ", "uw": "ư", "w": "ư",
"uow": "ươ",
"af": "à", "ar": "ả", "ax": "ã", "as": "á", "aj": "ạ",
"ăf": "ằ", "ăr": "ẳ", "ăx": "ẵ", "ăs": "ắ", "ăj": "ặ",
"âf": "ầ", "âr": "ẩ", "âx": "ẫ", "âs": "ấ", "âj": "ậ",
"ef": "è", "er": "ẻ", "ex": "ẽ", "es": "é", "ej": "ẹ",
"êf": "ề", "êr": "ể", "êx": "ễ", "ês": "ế", "êj": "ệ",
"if": "ì", "ir": "ỉ", "ix": "ĩ", "is": "í", "ij": "ị",
"of": "ò", "or": "ỏ", "ox": "õ", "os": "ó", "oj": "ọ",
"ôf": "ồ", "ôr": "ổ", "ôx": "ỗ", "ôs": "ố", "ôj": "ộ",
"ơf": "ờ", "ơr": "ở", "ơx": "ỡ", "ơs": "ớ", "ơj": "ợ",
"uf": "ù", "ur": "ủ", "ux": "ũ", "us": "ú", "uj": "ụ",
"ưf": "ừ", "ưr": "ử", "ưx": "ữ", "ưs": "ứ", "ưj": "ự",
"yf": "ỳ", "yr": "ỷ", "yx": "ỹ", "ys": "ý", "yj": "ỵ",
"ăw": "aw", "âa": "aa", "đd": "dd", "êe": "ee", "ôo": "oo", "ơw": "ow", "ưw": "w", "iêe": "iee",
"ươw": "uow",
"àf": "af", "ảr": "ar", "ãx": "ax", "ás": "as", "ạj": "aj",
"ằf": "ăf", "ẳr": "ăr", "ẵx": "ăx", "ắs": "ăs", "ặj": "ăj",
"ầf": "âf", "ẩr": "âr", "ẫx": "âx", "ấs": "âs", "ậj": "âj",
"èf": "ef", "ẻr": "er", "ẽx": "ex", "és": "es", "ẹj": "ej",
"ềf": "êf", "ểr": "êr", "ễx": "êx", "ếs": "ês", "ệj": "êj",
"ìf": "if", "ỉr": "ir", "ĩx": "ix", "ís": "is", "ịj": "ij",
"òf": "of", "ỏr": "or", "õx": "ox", "ós": "os", "ọj": "oj",
"ồf": "ôf", "ổr": "ôr", "ỗx": "ôx", "ốs": "ôs", "ộj": "ôj",
"ờf": "ơf", "ởr": "ơr", "ỡx": "ơx", "ớs": "ơs", "ợj": "ơj",
"ùf": "uf", "ủr": "ur", "ũx": "ux", "ús": "us", "ụj": "uj",
"ừf": "ưf", "ửr": "ưr", "ữx": "ưx", "ứs": "ưs", "ựj": "ưj",
"ỳf": "yf", "ỷr": "yr", "ỹx": "yx", "ýs": "ys", "ỵj": "yj",
"àz": "a", "ảz": "a", "ãz": "a", "áz": "a", "ạz": "a",
"ằz": "ă", "ẳz": "ă", "ẵz": "ă", "ắz": "ă", "ặz": "ă",
"ầz": "â", "ẩz": "â", "ẫz": "â", "ấz": "â", "ậz": "â",
"èz": "e", "ẻz": "e", "ẽz": "e", "éz": "e", "ẹz": "e",
"ềz": "ê", "ểz": "ê", "ễz": "ê", "ếz": "ê", "ệz": "ê",
"ìz": "i", "ỉz": "i", "ĩz": "i", "íz": "i", "ịz": "i",
"òz": "o", "ỏz": "o", "õz": "o", "óz": "o", "ọz": "o",
"ồz": "ô", "ổz": "ô", "ỗz": "ô", "ốz": "ô", "ộz": "ô",
"ờz": "ơ", "ởz": "ơ", "ỡz": "ơ", "ớz": "ơ", "ợz": "ơ",
"ùz": "u", "ủz": "u", "ũz": "u", "úz": "u", "ụz": "u",
"ừz": "ư", "ửz": "ư", "ữz": "ư", "ứz": "ư", "ựz": "ư",
"ỳz": "y", "ỷz": "y", "ỹz": "y", "ýz": "y", "ỵz": "y",
"acw": "ăc", "amw": "ăm", "anw": "ăn", "apw": "ăp", "atw": "ăt", "angw": "ăng",
"aca": "âc", "ama": "âm", "ana": "ân", "apa": "âp", "ata": "ât", "aua": "âu", "aya": "ây", "anga": "âng",
"eme": "êm", "ene": "ên", "epe": "êp", "ete": "êt", "enhe": "ênh",
"oio": "ôi","omo": "ôm", "ono": "ôn", "opo": "ôp", "oto": "ôt", "ongo": "ông",
"oiw": "ơi", "omw": "ơm", "onw": "ơn", "opw": "ơp", "otw": "ơt",
"uaw": "ưa", "uiw": "ưi", "umw": "ưm", "unw": "ưn", "utw": "ưt", "uuw": "ưu", "ungw": "ưng",
"ieme": "iêm", "iene": "iên", "iepe": "iêp", "iete": "iêt", "ieue": "iêu", "ienge": "iêng",
"uocw": "ươc", "uoiw": "ươi", "uomw": "ươm", "uonw": "ươn", "uotw": "ươt", "uongw": "ương",
"uoco": "uôc", "uoio": "uôi", "uomo": "uôm", "uono": "uôn", "uoto": "uôt", "uongo": "uông",
"uyene": "uyên", "uyete": "uyêt",
"yeme": "yêm", "yene": "yên", "yete": "yêt", "yeue": "yêu", "yenge": "yêng",
"ăca": "âc", "ăma": "âm", "ăna": "ân", "ăpa": "âp", "ăta": "ât", "ănga": "âng",
"âcw": "ăc", "âmw": "ăm", "ânw": "ăn", "âpw": "ăp", "âtw": "ăt", "ângw": "ăng",
"ôiw": "ơi", "ômw": "ơm", "ônw": "ơn", "ôpw": "ơp", "ôtw": "ơt",
"ơio": "ôi", "ơmo": "ôm", "ơno": "ôn", "ơpo": "ôp", "ơto": "ôt",
"ăcw": "acw", "ămw": "amw", "ănw": "anw", "ăpw": "apw", "ătw": "atw", "ăngw": "angw",
"âca": "aca", "âma": "ama", "âna": "ana", "âpa": "apa", "âta": "ata", "âua": "aua", "âya": "aya", "ânga": "anga",
"ême": "eme", "êne": "ene", "êpe": "epe", "ête": "ete",
"ôio": "oio", "ômo": "omo", "ôno": "ono", "ôpo": "opo", "ôto": "oto", "ôngo": "ongo",
"ơmw": "omw", "ơnw": "onw", "ơpw": "opw", "ơtw": "otw",
"ưaw": "uaw", "ưiw": "uiw", "ưmw": "umw", "ưnw": "unw" , "ưtw": "utw", "ưuw": "uuw", "ưngw": "ungw",
"iême": "ieme", "iêne": "iene", "iêpe": "iepe", "iête": "iete", "iêue": "ieue", "iênge": "ienge",
"ươcw": "uocw", "ươiw": "uoiw", "ươmw": "uomw", "ươnw": "uonw", "ươtw": "uotw", "ươngw": "uongw",
"uyêne": "uyene", "uyêt": "uyete",
"yême": "yeme", "yêne": "yene", "yête": "yete", "yêue": "yeue", "yênge": "yenge",
"acs": "ác", "acj": "ạc",
"achs": "ách", "achj": "ạch",
"ais": "ái", "aif": "ài", "air": "ải", "aix": "ãi", "aij": "ại",
"ams": "ám", "amf": "àm", "amr": "ảm", "amx": "ãm", "amj": "ạm",
"ans": "án" , "anf": "àn", "anr": "ản", "anx": "ãn", "anj": "ạn",
"aos": "áo", "aof": "ào", "aor": "ảo", "aox": "ão", "aoj": "ạo",
"aps":"áp", "apj": "ạp",
"ats":"át", "atj": "ạt",
"aus":"áu", "auf": "àu", "aur": "ảu", "aux": "ãu", "auj": "ạu",
"ays": "áy", "ayf": "ày", "ayr": "ảy", "ayx": "ãy", "ayj": "ạy",
"angs": "áng", "angf": "àng", "angr": "ảng", "angx": "ãng", "angj": "ạng",
"anhs": "ánh", "anhf": "ành", "anhr": "ảnh", "anhx": "ãnh", "anhj": "ạnh",
"ács": "acs", "ạcj": "acj",
"áchs": "achs", "ạchj": "achj",
"áis": "ais", "àif": "aif", "ảir": "air", "ãix": "aix", "ạij": "aij",
"áms": "ams", "àmf": "amf", "ảmr": "amr", "ãmx": "amx", "ạmj": "amj",
"áns": "ans", "ànf": "anf", "ảnr": "anr", "ãnx": "anx", "ạnj": "anj",
"áos": "aos", "àof": "aof", "ảor": "aor", "ãox": "aox", "ạoj":"aoj",
"áps": "aps", "ạpj": "apj",
"áts": "ats", "ạtj": "atj",
"áus": "aus", "àuf": "auf", "ảur": "aur", "ãux": "aux", "ạuj": "auj",
"áys": "ays", "àyf": "ayf", "ảyr": "ayr", "ãyx": "ayx", "ạyj": "ayj",
"ángs": "angs", "àngf": "angf", "ảngr": "angr", "ãngx": "angx", "ạngj": "angj",
"ánhs": "anhs", "ànhf": "anhf", "ảnhr": "anhr", "ãnhx": "anhx", "ạnhj": "anhj",
"ecs": "éc", "ecj": "ẹc",
"ems": "ém", "emf": "èm", "emr": "ẻm", "emx": "ẽm", "emj": "ẹm",
"ens": "én", "enf": "èn", "enr": "ẻn", "enx": "ẽn", "enj": "ẹn",
"eps": "ép", "epj": "ẹp",
"ets": "ét", "etj": "ẹt",
"engs": "éng", "engf": "èng", "engr": "ẻng", "engx": "ẽng", "engj": "ẹng",
"enhs": "énh", "enhf": "ènh", "enhr": "ẻnh", "enhx": "ẽnh", "enhj": "ẹnh",
"écs": "ecs", "ẹcj": "ecj",
"éms": "ems", "èmf": "emf", "ẻmr": "emr", "ẽmx": "emx", "ẹmj": "emj",
"éns": "ens", "ènf": "enf","ẻnr": "enr", "ẽnx": "enx", "ẹnj": "enj",
"éps": "eps", "ẹpj": "epj",
"éts": "ets", "ẹtj": "etj",
"éngs": "engs", "èngf": "engf", "ẻngr": "engr", "ẽngx":"engx", "ẹngj": "engj",
"énhs": "enhs", "ènhf": "enhf", "ẻnhr": "enhr", "ẽnh": "enhx", "ẹnh": "enhj",
"ias": "ía", "iaf": "ìa", "iar": "ỉa", "iax": "ĩa", "iaj": "ịa",
"ics": "íc", "icj": "ịc",
"ims": "ím", "imf": "ìm", "imr": "ỉm", "imx": "ĩm", "imj": "ịm",
"ins": "ín", "inf": "ìn", "inr": "ỉn", "inx": "ĩn", "inj": "ịn",
"ips": "íp", "ipj": "ịp",
"its": "ít", "itj": "ịt",
"ius": "íu", "iuf": "ìu", "iur": "ỉu", "iux": "ĩu", "iuj": "ịu",
"ichs": "ích", "ichj": "ịch",
"inhs": "ính", "inhf": "ình", "inhr": "ỉnh", "inhx": "ĩnh", "inhj": "ịnh",
"ías": "ias", "ìaf": "iaf", "ỉar": "iar", "ĩax": "iax", "ịaj": "iaj",
"ícs": "ics", "ịcj": "icj",
"íms": "ims", "ìmf": "imf", "ỉmr": "imr", "ĩmx": "imx", "ịmj": "imj",
"íns": "ins", "ìnf": "inf", "ỉnr": "inr", "ĩnx": "inx", "ịnj": "inj",
"íps": "ips", "ịpj": "ipj",
"íts": "its", "ịtj": "itj",
"íus": "ius", "ìuf": "iuf", "ỉur": "iur", "ĩux": "iux", "ịuj": "iuj",
"íchs": "ichs", "ịchj": "ichj",
"ínhs": "inhs", "ìnhf": "inhf", "ỉnhr": "inhr", "ĩnhx": "inhx", "ịnhj": "inhj",
"oas": "óa", "oaf": "òa", "oar": "ỏa", "oax": "õa", "oaj": "ọa",
"ocs": "óc", "ocj": "ọc",
"ois": "ói", "oif": "òi", "oir": "ỏi", "oix": "õi", "oij": "ọi",
"oms": "óm", "omf": "òm", "omr": "ỏm", "omx": "õm", "omj": "ọm",
"ons": "ón", "onf": "òn", "onr": "ỏn", "onx": "õn", "onj": "ọn",
"ops": "óp", "opj": "ọp",
"ots": "ót", "otj": "ọt",
"ongs": "óng", "ongf": "òng", "ongr": "ỏng", "ongx": "õng", "ongj": "ọng",
"óas": "oas", "òaf": "oaf", "ỏar": "oar", "õax": "oax", "ọaj": "oaj",
"ócs": "ocs", "ọcj": "ocj",
"óis": "ois", "òif": "oif", "ỏir": "oir", "õix": "oix", "ọij": "oij",
"óms": "oms", "òmf": "omf", "ỏmr": "omr", "õmx": "omx", "ọmj": "omj",
"óns": "ons", "ònf": "onf", "ỏnr": "onr", "õnx": "onx", "ọnj": "onj",
"óps": "ops", "ọpj": "opj",
"óts": "ots", "ọtj": "otj",
"óngs": "ongs", "òngf": "ongf", "ỏngr": "ongr", "õngx": "ongx", "ọngj": "ongj",
"uas": "úa", "uaf": "ùa", "uar": "ủa", "uax": "ũa", "uaj": "ụa",
"ucs": "úc", "ucj": "ục",
"uis": "úi", "uif": "ùi", "uir": "ủi", "uix": "ũi", "uij": "ụi",
"ums": "úm", "umf": "ùm", "umr": "ủm", "umx": "ũm", "umj": "ụm",
"uns": "ún", "unf": "ùn", "unr": "ủn", "unx": "ũn", "unj": "ụn",
"ups": "úp", "upj": "ụp",
"uts": "út", "utj": "ụt",
"uus": "úu", "uuf": "ùu", "uur": "ủu", "uux": "ũu", "uuj": "ụu",
"uys": "úy", "uyf": "ùy", "uyr": "ủy", "uyx": "ũy", "uyj": "ụy",
"ungs": "úng", "ungf": "ùng", "ungr": "ủng", "ungx": "ũng", "ungj": "ụng",
"úas": "uas", "ùaf": "uaf", "ủar": "uar", "ũax": "uax", "ụaj": "uaj",
"úcs": "ucs", "ụcj": "ucj",
"úis": "uis", "ùif": "uif", "ủir": "uir", "ũix": "uix", "ụij": "uij",
"úms": "ums", "ùmf": "umf", "ủmr": "umr", "ũmx": "umx", "ụmj": "umj",
"úns": "uns", "ùnf": "unf", "ủnr": "unr", "ũnx": "unx", "ụnj": "unj",
"úps": "ups", "ụpj": "upj",
"úts": "uts", "ụtj": "utj",
"úus": "uus", "ùuf": "uuf", "ủur": "uur", "ũux": "uux", "ụuj": "uuj",
"úu ": "uus", "ùu ": "uuf", "ủu ": "uur", "ũu ": "uux", "ụu ": "uuj",
"úys": "uys", "ùyf": "uyf", "ủyr": "uyr", "ũyx": "uyx", "ụyj": "uyj",
"úngs": "ungs", "ùngf": "ungf", "ủngr": "ungr", "ũngx": "ungx", "ụngj": "ungj",
"ăcs": "ắc", "ăcj": "ặc",
"ácw": "ắc", "ạcw": "ặc",
"ăms": "ắm", "ămf": "ằm", "ămr": "ẳm", "ămx": "ẵm", "ămj": "ặm",
"ámw": "ắm", "àmw": "ằm", "ảmw": "ẳm", "ãmw": "ẵm", "ạmw": "ặm",
"ăns": "ắn", "ănf": "ằn", "ănr": "ẳn", "ănx": "ẵn", "ănj": "ặn",
"ánw": "ắn", "ànw": "ằn", "ảnw": "ẳn", "ãnw": "ẵn", "ạnw": "ặn",
"ăps": "ắp", "ăpj": "ặp",
"ápw": "ắp", "ạpw": "ặp",
"ăts": "ắt", "ătj": "ặt",
"átw": "ắt", "ạtw": "ặt",
"ăngs": "ắng", "ăngf": "ằng", "ăngr": "ẳng", "ăngx": "ẵng", "ăngj": "ặng",
"ángw": "ắng", "àngw": "ằng", "ảngw": "ẳng", "ãngw":"ẵng", "ạngw": "ặng",
"ắcw": "ácw", "ắcs": "ăcs", "ăcsw": "acsw", "ácws": "acws",
"ặcw": "ạcw", "ặcj": "ăcj", "ăcjw": "acjw", "ạcwj": "acwj",
"ắms": "ăms", "ắmw": "ámw", "ămsw": "amsw", "ámws": "amws",
"ằmf": "ămf", "ằmw": "àmw", "ămfw": "amfw", "àmwf": "amwf",
"ẳmr": "ămr", "ẳmw": "ảmw", "ămrw": "amrw", "ảmwr": "amwr",
"ẵmx": "ămx", "ẵmw": "ãmw", "ămxw": "amxw", "ãmwx": "amwx",
"ặmj": "ămj", "ặmw": "ạmw", "ămjw": "amjw", "ạmwj": "amwj",
"ắns": "ăns", "ắnw": "ánw", "ănsw": "answ", "ánws": "anws",
"ằnf": "ănf", "ằnw": "ànw", "ănfw": "anfw", "ànwf": "anwf",
"ẳnr": "ănr", "ẳnw": "ảnw", "ănrw": "anrw", "ảnwr": "anwr",
"ẵnx": "ănx", "ẵnw": "ãnw", "ănxw": "anxw", "ãnwx": "anwx",
"ặnj": "ănj", "ặnw": "ạnw", "ănjw": "anjw", "ạnwj": "anwj",
"ắps": "ăps", "ắpw": "ápw", "ăpsw": "apsw", "ápws": "apws",
"ặpj": "ăpj", "ặpw": "ạpw", "ăpjw": "apjw", "ạpwj": "apwj",
"ắts": "ăts", "ắtw": "átw", "ătsw": "atws", "átws": "atws",
"ặtj": "ătj", "ặtw": "ạtw", "ătjw": "atjw", "ạtwj": "atwj",
"ắngs": "ăngs", "ắngw": "ángw", "ăngsw": "angsw", "ángws": "angws",
"ằngf": "ăngf", "ằngw": "àngw", "ăngfw": "angfw", "àngwf": "angwf",
"ẳngr": "ăngr", "ẳngw": "ảngw", "ăngrw": "angrw", "ảngwr": "angwr",
"ẵngx": "ăngx", "ẵngw": "ãngw", "ăngxw": "angxw", "ãngwx": "angwx",
"ặngj": "ăngj", "ặngw": "ạngw", "ăngjw": "angjw", "ạngwj": "angwj",
"âcs": "ấc", "âcj": "ậc",
"áca": "ấc", "ạca": "ậc",
"âms": "ấm", "âmf": "ầm", "âmr": "ẩm", "âmx": "ẫm", "âmj": "ậm",
"áma": "ấm", "àma": "ầm", "ảma": "ẩm", "ãma": "ẫm", "ạma": "ậm",
"âns": "ấn", "ânf": "ần", "ânr": "ẩn", "ânx": "ẫn", "ânj": "ận",
"ána": "ấn", "àna": "ần", "ảna": "ẩn", "ãna": "ẫn", "ạna": "ận",
"âps": "ấp", "âpj": "ập",
"ápa": "ấp", "ạpa": "ập",
"âts": "ất", "âtj": "ật",
"áta": "ất", "ạta": "ật",
"âus": "ấu", "âuf": "ầu", "âur": "ẩu", "âux": "ẫu", "âuj": "ậu",
"áua": "ấu", "àua": "ầu", "ảua": "ẩu", "ãua": "ẫu", "ạua": "ậu",
"âys": "ấy", "âyf": "ầy", "âyr": "ẩy", "âyx": "ẫy", "âyj": "ậy",
"áya": "ấy", "àya": "ầy", "ảya": "ẩy", "ãya": "ẫy", "ạya": "ậy",
"ângs": "ấng", "ângf": "ầng", "ângr": "ẩng", "ângx": "ẫng", "ângj": "ậng",
"ánga": "ấng", "ànga": "ầng", "ảnga": "ẩng", "ãnga": "ẫng", "ạnga": "ậng",
"ấcs": "âcs", "ấca": "áca", "âcsa": "acsa", "ácas": "acas",
"ậcj": "âcj", "ậca": "ạca", "âcja": "acja", "ạcaj": "acaj",
"ấms": "âms", "ấma": "áma", "âmsa": "amsa", "ámas": "amas",
"ầmf": "âmf", "ầma": "àma", "âmfa": "amfa", "àmaf": "amaf",
"ẩmr": "âmr", "ẩma": "ảma", "âmra": "amra", "ảmar": "amar",
"ẫmx": "âmx", "ẫma": "ãma", "âmxa": "amxa", "ãmax": "amax",
"ậmj": "âmj", "ậma": "ạma", "âmja": "amja", "ạmaj": "amaj",
"ấns": "âns", "ấna": "ána", "ânsa": "ansa", "ánas": "anas",
"ầnf": "ânf", "ầna": "àna", "ânfa": "anfa", "ànaf": "anaf",
"ẩnr": "ânr", "ẩna": "ảna", "ânra": "anra", "ảnar": "anar",
"ẫnx": "ânx", "ẫna": "ãna", "ânxa": "anxa", "ãnax": "anax",
"ậnj": "ânj", "ậna": "ạna", "ânja": "anja", "ạnaj": "anaj",
"ấps": "âps", "ấpa": "ápa", "âpsa": "apsa", "ápas": "apas",
"ậpj": "âpj", "ậpa": "ạpa", "âpja": "apja", "ạpaj": "apaj",
"ấts": "âts", "ấta": "áta", "âtsa": "atas", "átas": "atas",
"ậtj": "âtj", "ậta": "ạta", "âtja": "atja", "ạtaj": "ataj",
"ấus": "âus", "ấua": "áua", "âusa": "ausa", "áuas": "auas",
"ầuf": "âuf", "ầua": "àua", "âufa": "aufa", "àuaf": "auaf",
"ẩur": "âur", "ẩua": "ảua", "âura": "aura", "ảuar": "auar",
"ẫux": "âux", "ẫua": "ãua", "âuxa": "auxa", "ãuax": "auax",
"ậuj": "âuj", "ậua": "ạua", "âuja": "auja", "ạuaj": "auaj",
"ấys": "âys", "ấya": "áya", "âysa": "aysa", "áyas": "ayas",
"ầyf": "âyf", "ầya": "àya", "âyfa": "ayfa", "àyaf": "ayaf",
"ẩyr": "âyr", "ẩya": "ảya", "âyra": "ayra", "ảyar": "ayar",
"ẫyx": "âyx", "ẫya": "ãya", "âyxa": "ayxa", "ãyax": "ayax",
"ậyj": "âyj", "ậya": "ạya", "âyja": "ayja", "ạyaj": "ayaj",
"ấngs": "ângs", "ấnga": "ánga", "ângsa": "angsa", "ángas": "angas",
"ầngf": "ângf", "ầnga": "ànga", "ângfa": "angfa", "àngaf": "angaf",
"ẩngr": "ângr", "ẩnga": "ảnga", "ângra": "angra", "ảngar": "angar",
"ẫngx": "ângx", "ẫnga": "ãnga", "ângxa": "angxa", "ãngax": "angax",
"ậngj": "ângj", "ậnga": "ạnga", "ângja": "angja", "ạngaj": "angaj",
"êcs": "ếc", "êcj": "ệc",
"éce": "ếc", "ẹce": "ệc",
"êms": "ếm", "êmf": "ềm", "êmr": "ểm", "êmx": "ễm", "êmj": "ệm",
"éme": "ếm", "ème": "ềm", "ẻme": "ểm", "ẽme": "ễm", "ẹme": "ệm",
"êns": "ến", "ênf": "ền", "ênr": "ển", "ênx": "ễn", "ênj": "ện",
"éne": "ến", "ène": "ền", "ẻne": "ển", "ẽne": "ễn", "ẹne": "ện",
"êps": "ếp", "êpj": "ệp",
"épe": "ếp", "ẹpe": "ệp",
"êts": "ết", "êtj": "ệt",
"éte": "ết", "ẹte": "ệt",
"êchs": "ếch", "êchj": "ệch",
"echs": "éch", "echj": "ẹch",
"éche": "ếch", "ẹche": "ệch",
"ênhs": "ếnh", "ênhf": "ềnh", "ênhr": "ểnh", "ênhx": "ễnh", "ênhj": "ệnh",
"énhe": "ếnh", "ènhe": "ềnh", "ẻnhe": "ểnh", "ẽnhe": "ễnh", "ẹnhe": "ệnh",
"ếms": "êms", "ếme": "éme", "êmse": "emse", "émes": "emes",
"ềmf": "êmf", "ềme": "ème", "êmfe": "emfe", "èmef": "emef",
"ểmr": "êmr", "ểme": "ẻme", "êmre": "emre", "ẻmer": "emer",
"ễmx": "êmx", "ễme": "ẽme", "êmxe": "emxe", "ẽmex": "emex",
"ệmj": "êmj", "ệme": "ẹme", "êmje": "emje", "ẹmej": "emej",
"ếns": "êns", "ếne": "éne", "ênse": "ense", "énes": "enes",
"ềnf": "ênf", "ềne": "ène", "ênfe": "enfe", "ènef": "enef",
"ểnr": "ênr", "ểne": "ẻne", "ênre": "enre", "ẻner": "ener",
"nx": "ênx", "ne": "ne", "ênxe": "enxe", "nex": "enex",
"nj": "ênj", "ne": "ne", "ênje": "enje", "nej": "enej",
"ếps": "êps", "ếpe": "épe", "êpse": "epse", "épes": "epes",
"pj": "êpj", "pe": "pe", "êpje": "epje", "pej": "epej",
"ếts": "êts", "ếte": "éte", "êtse": "etes", "étes": "etes",
"tj": "êtj", "te": "te", "êtje": "etje", "tej": "etej",
"ếchs": "êchs", "ếche": "éche", "êchse": "eches", "éches": "eches",
"chj": "êchj", "che": "che", "êchje": "echje", "chej": "echej",
"ếnhs": "ênhs", "ếnhe": "énhe", "ênhse": "enhse", "énhes": "enhes",
"nhf": "ênhf", "nhe": "ènhe", "ênhfe": "enhfe", "ènhef": "enhef",
"nhr": "ênhr", "nhe": "nhe", "ênhre": "enhre", "nher": "enher",
"nhx": "ênhx", "nhe": "nhe", "ênhxe": "enhxe", "nhex": "enhex",
"nhj": "ênhj", "nhe": "nhe", "ênhje": "enhje", "nhej": "enhej",
"ôcs": "c", "ôcj": "c",
"óco": "c", "co": "c",
"ôis": "i", "ôif": "i", "ôir": "i", "ôix": "i", "ôij": "i",
"óio": "i", "òio": "i", "io": "i", "õio": "i", "io": "i",
"ôms": "m", "ômf": "m", "ômr": "m", "ômx": "m", "ômj": "m",
"ómo": "m", "òmo": "m", "mo": "m", "õmo": "m", "mo": "m",
"ôns": "n", "ônf": "n", "ônr": "n", "ônx": "n", "ônj": "n",
"óno": "n", "òno": "n", "no": "n", "õno": "n", "no": "n",
"ôps": "p", "ôpj": "p",
"ópo": "p", "po": "p",
"ôts": "t", "ôtj": "t",
"óto": "t", "to": "t",
"ôngs": "ng", "ôngf": "ng", "ôngr": "ng", "ôngx": "ng", "ôngj": "ng",
"óngo": "ng", "òngo": "ng", "ngo": "ng", "õngo": "ng", "ngo": "ng",
"cs": "ôcs", "co": "óco", "ôcso": "ocso", "ócos": "ocos",
"cj": "ôcj", "co": "co", "ôcjo": "ocjo", "coj": "ocoj",
"is": "ôis", "io": "óio", "ôiso": "oiso", "óios": "oios",
"if": "ôif", "io": "òio", "ôifo": "oifo", "òiof": "oiof",
"ir": "ôir", "io": "io", "ôiro": "oiro", "ior": "oior",
"ix": "ôix", "io": "õio", "ôixo": "oixo", "õiox": "oiox",
"ij": "ôij", "io": "io", "ôijo": "oijo", "ioj": "oioj",
"ms": "ôms", "mo": "ómo", "ômso": "omso", "ómos": "omos",
"mf": "ômf", "mo": "òmo", "ômfo": "omfo", "òmof": "omof",
"mr": "ômr", "mo": "mo", "ômro": "omro", "mor": "omor",
"mx": "ômx", "mo": "õmo", "ômxo": "omxo", "õmox": "omox",
"mj": "ômj", "mo": "mo", "ômjo": "omjo", "moj": "omoj",
"ns": "ôns", "no": "óno", "ônso": "onso", "ónos": "onos",
"nf": "ônf", "no": "òno", "ônfo": "onfo", "ònof": "onof",
"nr": "ônr", "no": "no", "ônro": "onro", "nor": "onor",
"nx": "ônx", "no": "õno", "ônxo": "onxo", "õnox": "onox",
"nj": "ônj", "no": "no", "ônjo": "onjo", "noj": "onoj",
"ps": "ôps", "po": "ópo", "ôpso": "opso", "ópos": "opos",
"pj": "ôpj", "po": "po", "ôpjo": "opjo", "poj": "opoj",
"ts": "ôts", "to": "óto", "ôtso": "otso", "ótos": "otos",
"tj": "ôtj", "to": "to", "ôtjo": "otjo", "toj": "otoj",
"ngs": "ôngs", "ngo": "óngo", "ôngso": "ongso", "óngos": "ongos",
"ngf": "ôngf", "ngo": "òngo", "ôngfo": "ongfo", "òngof": "ongof",
"ngr": "ôngr", "ngo": "ngo", "ôngro": "ongro", "ngor": "ongor",
"ngx": "ôngx", "ngo": "õngo", "ôngxo": "ongxo", "õngox": "ongox",
"ngj": "ôngj", "ngo": "ngo", "ôngjo": "ongjo", "ngoj": "ongoj",
"ơis": "i", "ơif": "i", "ơir": "i", "ơix": "i", "ơij": "i",
"óiw": "i", "òiw": "i", "iw": "i", "õiw": "i", "iw": "i",
"ơms": "m", "ơmf": "m", "ơmr": "m", "ơmx": "m", "ơmj": "m",
"ómw": "m", "òmw": "m", "mw": "m", "õmw": "m", "mw": "m",
"ơns": "n", "ơnf": "n", "ơnr": "n", "ơnx": "n", "ơnj": "n",
"ónw": "n", "ònw": "n", "nw": "n", "õnw": "n", "nw": "n",
"ơps": "p", "ơpj": "p",
"ópw": "p", "pw": "p",
"ơts": "t", "ơtj": "t",
"ótw": "t", "tw": "t",
"is": "ơis", "iw": "óiw", "ơisw": "oisw", "óiws": "oiws",
"if": "ơif", "iw": "òiw", "ơifw": "oifw", "òiwf": "oiwf",
"ir": "ơir", "iw": "iw", "ơirw": "oirw", "iwr": "oiwr",
"ix": "ơix", "iw": "õiw", "ơixw": "oixw", "õiwx": "oiwx",
"ij": "ơij", "iw": "iw", "ơijw": "oijw", "iwj": "oiwj",
"ms": "ơms", "mw": "ómw", "ơmsw": "omsw", "ómws": "omws",
"mf": "ơmf", "mw": "òmw", "ơmfw": "omfw", "òmwf": "omwf",
"mr": "ơmr", "mw": "mw", "ơmrw": "omrw", "mwr": "omwr",
"mx": "ơmx", "mw": "õmw", "ơmxw": "omxw", "õmwx": "omwx",
"mj": "ơmj", "mw": "mw", "ơmjw": "omjw", "mwj": "omwj",
"ns": "ơns", "nw": "ónw", "ơnsw": "onsw", "ónws": "onws",
"nf": "ơnf", "nw": "ònw", "ơnfw": "onfw", "ònwf": "onwf",
"nr": "ơnr", "nw": "nw", "ơnrw": "onrw", "nwr": "onwr",
"nx": "ơnx", "nw": "õnw", "ơnxw": "onxw", "õnwx": "onwx",
"nj": "ơnj", "nw": "nw", "ơnjw": "onjw", "nwj": "onwj",
"ps": "ơps", "pw": "ópw", "ơpsw": "opsw", "ópws": "opws",
"pj": "ơpj", "pw": "pw", "ơpjw": "opjw", "pwj": "opwj",
"ts": "ơts", "tw": "ótw", "ơtsw": "otsw", "ótws": "otws",
"tj": "ơtj", "tw": "tw", "ơtjw": "otjw", "twj": "otwj",
"ưas": "a", "ưaf": "a", "ưar": "a", "ưax": "a", "ưaj": "a",
"úaw": "a", "ùaw": "a", "aw": "a", "ũaw": "a", "aw": "a",
"ưis": "i", "ưif": "i", "ưir": "i", "ưix": "i", "ưij": "i",
"úiw": "i", "ùiw": "i", "iw": "i", "ũiw": "i", "iw": "i",
"ưms": "m", "ưmf": "m", "ưmr": "m", "ưmx": "m", "ưmj": "m",
"úmw": "m", "ùmw": "m", "mw": "m", "ũmw": "m", "mw": "m",
"ưns": "n", "ưnf": "n", "ưnr": "n", "ưnx": "n", "ưnj": "n",
"únw": "n", "ùnw": "n", "nw": "n", "ũnw": "n", "nw": "n",
"ưts": "t", "ưtj": "t",
"útw": "t", "tw": "t",
"ưus": "u", "ưuf": "u", "ưur": "u", "ưux": "u", "ưuj": "u",
"úuw": "u", "ùuw": "u", "uw": "u", "ũuw": "u", "uw": "u",
"ưngs": "ng", "ưngf": "ng", "ưngr": "ng", "ưngx": "ng", "ưngj": "ng",
"úngw": "ng", "ùngw": "ng", "ngw": "ng", "ũngw": "ng", "ngw": "ng",
"as": "ưas", "aw": "úaw", "ưasw": "uasw", "úaws": "uaws",
"af": "ưaf", "aw": "ùaw", "ưafw": "uafw", "ùawf": "uawf",
"ar": "ưar", "aw": "aw", "ưarw": "uarw", "awr": "uawr",
"ax": "ưax", "aw": "ũaw", "ưaxw": "uaxw", "ũawx": "uawx",
"aj": "ưaj", "aw": "aw", "ưajw": "uajw", "awj": "uawj",
"is": "ưis", "iw": "úiw", "ưisw": "uisw", "úiws": "uiws",
"if": "ưif", "iw": "ùiw", "ưifw": "uifw", "ùiwf": "uiwf",
"ir": "ưir", "iw": "iw", "ưirw": "uirw", "iwr": "uiwr",
"ix": "ưix", "iw": "ũiw", "ưixw": "uixw", "ũiwx": "uiwx",
"ij": "ưij", "iw": "iw", "ưijw": "uijw", "iwj": "uiwj",
"ms": "ưms", "mw": "úmw", "ưmsw": "umsw", "úmws": "umws",
"mf": "ưmf", "mw": "ùmw", "ưmfw": "umfw", "ùmwf": "umwf",
"mr": "ưmr", "mw": "mw", "ưmrw": "umrw", "mwr": "umwr",
"mx": "ưmx", "mw": "ũmw", "ưmxw": "umxw", "ũmwx": "umwx",
"mj": "ưmj", "mw": "mw", "ưmjw": "umjw", "mwj": "umwj",
"ns": "ưns", "nw": "únw", "ưnsw": "unsw", "únws": "unws",
"nf": "ưnf", "nw": "ùnw", "ưnfw": "unfw", "ùnwf": "unwf",
"nr": "ưnr", "nw": "nw", "ưnrw": "unrw", "nwr": "unwr",
"nx": "ưnx", "nw": "ũnw", "ưnxw": "unxw", "ũnwx": "unwx",
"nj": "ưnj", "nw": "nw", "ưnjw": "unjw", "nwj": "unwj",
"ts": "ưts", "tw": "útw", "ưtsw": "utsw", "útws": "utws",
"tj": "ưtj", "tw": "tw", "ưtjw": "utjw", "twj": "utwj",
"us": "ưus", "uw": "úuw", "ưusw": "uusw", "úuws": "uuws",
"uf": "ưuf", "uw": "ùuw", "ưufw": "uufw", "ùuwf": "uuwf",
"ur": "ưur", "uw": "uw", "ưurw": "uurw", "uwr": "uuwr",
"ux": "ưux", "uw": "ũuw", "ưuxw": "uuxw", "ũuwx": "uuwx",
"uj": "ưuj", "uw": "uw", "ưujw": "uujw", "uwj": "uuwj",
"ngs": "ưngs", "ngw": "úngw", "ưngsw": "ungsw", "úngws": "ungws",
"ngf": "ưngf", "ngw": "ùngw", "ưngfw": "ungfw", "ùngwf": "ungwf",
"ngr": "ưngr", "ngw": "ngw", "ưngrw": "ungrw", "ngwr": "ungwr",
"ngx": "ưngx", "ngw": "ũngw", "ưngxw": "ungxw", "ũngwx": "ungwx",
"ngj": "ưngj", "ngw": "ngw", "ưngjw": "ungjw", "ngwj": "ungwj",
"iems": "iém", "iemf": "ièm", "iemr": "im", "iemx": "im", "iemj": "im",
"iéme": "iếm", "ième": "im", "ime": "im", "ime": "im", "ime": "im",
"iêms": "iếm", "iêmf": "im", "iêmr": "im", "iêmx": "im", "iêmj": "im",
"iens": "ién", "ienf": "ièn", "ienr": "in", "ienx": "in", "ienj": "in",
"iéne": "iến", "iène": "in", "ine": "in", "ine": "in", "ine": "in",
"iêns": "iến", "iênf": "in", "iênr": "in", "iênx": "in", "iênj": "in",
"ieps": "iép", "iepj": "ip",
"iépe": "iếp", "ipe": "ip",
"iêps": "iếp", "iêpj": "ip",
"iets": "iét", "ietj": "it",
"iéte": "iết", "ite": "it",
"iêts": "iết", "iêtj": "it",
"ieus": "iéu", "ieuf": "ièu", "ieur": "iu", "ieux": "iu", "ieuj": "iu",
"iéue": "iếu", "ièue": "iu", "iue": "iu", "iue": "iu", "iue": "iu",
"iêus": "iếu", "iêuf": "iu", "iêur": "iu", "iêux": "iu", "iêuj": "iu",
"iengs": "iéng", "iengf": "ièng", "iengr": "ing", "iengx": "ing", "iengj": "ing",
"iénge": "iếng", "iènge": "ing", "inge": "ing", "inge": "ing", "inge": "ing",
"iêngs": "iếng", "iêngf": "ing", "iêngr": "ing", "iêngx": "ing", "iêngj": "ing",
"iếms": "iêms", "iếme": "iéme", "iêmse": "iemse", "iémes": "iemes",
"imf": "iêmf", "ime": "ième", "iêmfe": "iemfe", "ièmef": "iemef",
"imr": "iêmr", "ime": "ime", "iêmre": "iemre", "imer": "iemer",
"imx": "iêmx", "ime": "ime", "iêmxe": "iemxe", "imex": "iemex",
"imj": "iêmj", "ime": "ime", "iêmje": "iemje", "imej": "iemej",
"iếns": "iêns", "iếne": "iéne", "iênse": "iense", "iénes": "ienes",
"inf": "iênf", "ine": "iène", "iênfe": "ienfe", "iènef": "ienef",
"inr": "iênr", "ine": "ine", "iênre": "ienre", "iner": "iener",
"inx": "iênx", "ine": "ine", "iênxe": "ienxe", "inex": "ienex",
"inj": "iênj", "ine": "ine", "iênje": "ienje", "inej": "ienej",
"iếps": "iêps", "iếpe": "iépe", "iêpse": "iepse", "iépes": "iepes",
"ipj": "iêpj", "ipe": "ipe", "iêpje": "iepje", "ipej": "iepej",
"iếts": "iêts", "iếte": "iéte", "iêtse": "ietse", "iétes": "ietes",
"itj": "iêtj", "ite": "ite", "iêtje": "ietje", "itej": "ietej",
"iếus": "iêus", "iếue": "iéue", "iêuse": "ieuse", "iéues": "ieues",
"iuf": "iêuf", "iue": "ièue", "iêufe": "ieufe", "ièuef": "ieuef",
"iur": "iêur", "iue": "iue", "iêure": "ieure", "iuer": "ieuer",
"iux": "iêux", "iue": "iue", "iêuxe": "ieuxe", "iuex": "ieuex",
"iuj": "iêuj", "iue": "iue", "iêuje": "ieuje", "iuej": "ieuej",
"iếngs": "iêngs", "iếnge": "iénge", "iêngse": "iengse", "iénges": "ienges",
"ingf": "iêngf", "inge": "iènge", "iêngfe": "iengfe", "ièngef": "iengef",
"ingr": "iêngr", "inge": "inge", "iêngre": "iengre", "inger": "ienger",
"ingx": "iêngx", "inge": "inge", "iêngxe": "iengxe", "ingex": "iengex",
"ingj": "iêngj", "inge": "inge", "iêngje": "iengje", "ingej": "iengej",
"uyens": "uyén", "uyenf": "uyèn", "uyenr": "uyn", "uyenx": "uyn", "uyenj": "uyn",
"uyéne": "uyến", "uyène": "uyn", "uyne": "uyn", "uyne": "uyn", "uyne": "uyn",
"uyêns": "uyến", "uyênf": "uyn", "uyênr": "uyn", "uyênx": "uyn", "uyênj": "uyn",
"uyets": "uyét", "uyetf": "uyèt", "uyetr": "uyt", "uyetx": "uyt", "uyetj": "uyt",
"uyéte": "uyết", "uyète": "uyt", "uyte": "uyt", "uyte": "uyt", "uyte": "uyt",
"uyêts": "uyết", "uyêtf": "uyt", "uyêtr": "uyt", "uyêtx": "uyt", "uyêtj": "uyt",
"uyếns": "uyêns", "uyếne": "uyéne", "uyênse": "uyense", "uyénes": "uyenes",
"uynf": "uyênf", "uyne": "uyène", "uyênfe": "uyenfe", "uyènef": "uyenef",
"uynr": "uyênr", "uyne": "uyne", "uyênre": "uyenre", "uyner": "uyener",
"uynx": "uyênx", "uyne": "uyne", "uyênxe": "uyenxe", "uynex": "uyenex",
"uynj": "uyênj", "uyne": "uyne", "uyênje": "uyenje", "uynej": "uyenej",
"uyếts": "uyêts", "uyếte": "uyéte", "uyêtse": "uyetse", "uyétes": "uyetes",
"uytf": "uyêtf", "uyte": "uyète", "uyêtfe": "uyetfe", "uyètef": "uyetef",
"uytr": "uyêtr", "uyte": "uyte", "uyêtre": "uyetre", "uyter": "uyeter",
"uytx": "uyêtx", "uyte": "uyte", "uyêtxe": "uyetxe", "uytex": "uyetex",
"uytj": "uyêtj", "uyte": "uyte", "uyêtje": "uyetje", "uytej": "uyetej",
"uyts": "uýt", "uytj": "ut",
"uynhs": "uýnh", "uynhf": "unh", "uynhr": "unh", "uynhx": "unh", "uynhj": "unh",
"uýts": "uyts", "utj": "uytj",
"uýnhs": "uynhs", "unhf": "uynhf", "unhr": "uynhr", "unh": "uynhx", "unhj": "uynhj",
"uits": "uít", "uitj": "ut",
"uíts": "uits", "utj": "uitj",
"uos": "úo", "uof": "ùo", "uor": "o", "uox": "ũo", "uoj": "o",
"úoc": "uóc", "oc": "uc",
"uocs": "uóc", "uocj": "uc",
"uócw": "ưc", "ucw": "ưc",
"ươcs": "ưc", "ươcj": "ưc",
"úoi": "uói", "ùoi" : "uòi", "oi": "ui", "ũoi": "uõi", "oi": "ui",
"uois": "uói", "uoif": "uòi", "uoir": "ui", "uoix": "uõi", "uoij": "ui",
"uóiw": "ưi", "uòiw": "ưi", "uiw": "ưi", "uõiw": "ưi", "uiw": "ưi",
"ươis": "ưi", "ươif": "ưi", "ươir": "ưi", "ươix": "ưi", "ươij": "ưi",
"úom": "uóm", "ùom" : "uòm", "om": "um", "ũom": "uõm", "om": "um",
"uoms": "uóm", "uomf": "uòm", "uomr": "um", "uomx": "uõm", "uomj": "um",
"uómw": "ưm", "uòmw": "ưm", "umw": "ưm", "uõmw": "ưm", "umw": "ưm",
"ươms": "ưm", "ươmf": "ưm", "ươmr": "ưm", "ươmx": "ưm", "ươmj": "ưm",
"úon": "uón", "ùon" : "uòn", "on": "un", "ũon": "uõn", "on": "un",
"uons": "uón", "uonf": "uòn", "uonr": "un", "uonx": "uõn", "uonj": "un",
"uónw": "ưn", "uònw": "ưn", "unw": "ưn", "uõnw": "ưn", "unw": "ưn",
"ươns": "ưn", "ươnf": "ưn", "ươnr": "ưn", "ươnx": "ưn", "ươnj": "ưn",
"úop": "uóp", "op": "up",
"uops": "uóp", "uopj": "up",
"uópw": "ưp", "upw": "ưp",
"ươps": "ưp", "ươpj": "ưp",
"úot": "uót", "ot": "ut",
"uots": "uót", "uotj": "ut",
"uótw": "ưt", "utw": "ưt",
"ươts": "ưt", "ươtj": "ưt",
"úou": "uóu", "ùou" : "uòu", "ou": "uu", "ũou": "uõu", "ou": "uu",
"uous": "uóu", "uouf": "uòu", "uour": "uu", "uoux": "uõu", "uouj": "uu",
"uóuw": "ưu", "uòuw": "ưu", "uuw": "ưu", "uõuw": "ưu", "uuw": "ưu",
"ươus": "ưu", "ươuf": "ưu", "ươur": "ưu", "ươux": "ưu", "ươuj": "ưu",
"úong": "uóng", "ùong" : "uòng", "ong": "ung", "ũong": "uõng", "ong": "ung",
"uongs": "uóng", "uongf": "uòng", "uongr": "ung", "uongx": "uõng", "uongj": "ung",
"uóngw": "ưng", "uòngw": "ưng", "ungw": "ưng", "uõngw": "ưng", "ungw": "ưng",
"ươngs": "ưng", "ươngf": "ưng", "ươngr": "ưng", "ươngx": "ưng", "ươngj": "ưng",
"úos": "uos", "ùof": "uof", "or": "uor", "ũo": "uox", "oj": "uoj",
"uócs": "uocs", "ucj": "uocj",
"ưcs": "ươcs", "ưcw": "uócw", "ươcsw": "uocsw", "uócws": "uocws",
"ưcj": "ươcj", "ưcw": "ucw", "ươcjw": "uocjw", "ucwj": "uocwj",
"uóis": "uois", "uòif": "uoif", "uir": "uoir", "uõix": "uoix", "uij": "uoij",
"ưis": "ươis", "ưiw": "uóiw", "ươisw": "uoisw", "uóiws": "uoiws",
"ưif": "ươif", "ưiw": "uòiw", "ươifw": "uoifw", "uòiwf": "uoiwf",
"ưir": "ươir", "ưiw": "uiw", "ươirw": "uoirw", "uiwr": "uoiwr",
"ưix": "ươix", "ưiw": "uõiw", "ươixw": "uoixw", "uõiwx": "uoiwx",
"ưij": "ươij", "ưiw": "uóiw", "ươijw": "uoijw", "uiwj": "uoiwj",
"uóms": "uoms", "uòmf": "uomf", "umr": "uomr", "uõmx": "uomx", "umj": "uomj",
"ưms": "ươms", "ưmw": "uómw", "ươmsw": "uomsw", "uómws": "uomws",
"ưmf": "ươmf", "ưmw": "uòmw", "ươmfw": "uomfw", "uòmwf": "uomwf",
"ưmr": "ươmr", "ưmw": "umw", "ươmrw": "uomrw", "umwr": "uomwr",
"ưmx": "ươmx", "ưmw": "uõmw", "ươmxw": "uomxw", "uõmwx": "uomwx",
"ưmj": "ươmj", "ưmw": "uómw", "ươmjw": "uomjw", "umwj": "uomwj",
"uóns": "uons", "uònf": "uonf", "unr": "uonr", "uõnx": "uonx", "unj": "uonj",
"ưns": "ươns", "ưnw": "uónw", "ươnsw": "uonsw", "uónws": "uonws",
"ưnf": "ươnf", "ưnw": "uònw", "ươnfw": "uonfw", "uònwf": "uonwf",
"ưnr": "ươnr", "ưnw": "unw", "ươnrw": "uonrw", "unwr": "uonwr",
"ưnx": "ươnx", "ưnw": "uõnw", "ươnxw": "uonxw", "uõnwx": "uonwx",
"ưnj": "ươnj", "ưnw": "uónw", "ươnjw": "uonjw", "unwj": "uonwj",
"uóps": "uops", "upj": "uopj",
"ưps": "ươps", "ưpw": "uópw", "ươpsw": "uopsw", "uópws": "uopws",
"ưpj": "ươpj", "ưpw": "upw", "ươpjw": "uopjw", "upwj": "uopwj",
"uóts": "uots", "utj": "uotj",
"ưts": "ươts", "ưtw": "uótw", "ươtsw": "uotsw", "uótws": "uotws",
"ưtj": "ươtj", "ưtw": "utw", "ươtjw": "uotjw", "utwj": "uotwj",
"uóus": "uous", "uòuf": "uouf", "uur": "uour", "uõux": "uoux", "uuj": "uouj",
"ưus": "ươus", "ưuw": "uóuw", "ươusw": "uousw", "uóuws": "uouws",
"ưuf": "ươuf", "ưuw": "uòuw", "ươufw": "uoufw", "uòuwf": "uouwf",
"ưur": "ươur", "ưuw": "uuw", "ươurw": "uourw", "uuwr": "uouwr",
"ưux": "ươux", "ưuw": "uõuw", "ươuxw": "uouxw", "uõuwx": "uouwx",
"ưuj": "ươuj", "ưuw": "uóuw", "ươujw": "uoujw", "uuwj": "uouwj",
"uóngs": "uongs", "uòngf": "uongf", "ungr": "uongr", "uõngx": "uongx", "ungj": "uongj",
"ưngs": "ươngs", "ưngw": "uóngw", "ươngsw": "uongsw", "uóngws": "uongws",
"ưngf": "ươngf", "ưngw": "uòngw", "ươngfw": "uongfw", "uòngwf": "uongwf",
"ưngr": "ươngr", "ưngw": "ungw", "ươngrw": "uongrw", "ungwr": "uongwr",
"ưngx": "ươngx", "ưngw": "uõngw", "ươngxw": "uongxw", "uõngwx": "uongwx",
"ưngj": "ươngj", "ưngw": "uóngw", "ươngjw": "uongjw", "ungwj": "uongwj",
"uóco": "uc", "uco": "uc",
"uôcs": "uc", "uôcj": "uc",
"uóio": "ui", "uòio": "ui", "uio": "ui", "uõio": "ui", "uio": "ui",
"uôis": "ui", "uôif": "ui", "uôir": "ui", "uôix": "ui", "uôij": "ui",
"uómo": "um", "uòmo": "um", "umo": "um", "uõmo": "um", "umo": "um",
"uôms": "um", "uômf": "um", "uômr": "um", "uômx": "um", "uômj": "um",
"uóno": "un", "uòno": "un", "uno": "un", "uõno": "un", "uno": "un",
"uôns": "un", "uônf": "un", "uônr": "un", "uônx": "un", "uônj": "un",
"uópo": "up", "upo": "up",
"uôps": "up", "uôpj": "up",
"uóto": "ut", "uto": "ut",
"uôts": "ut", "uôtj": "ut",
"uóuo": "uu", "uòuo": "uu", "uuo": "uu", "uõuo": "uu", "uuo": "uu",
"uôus": "uu", "uôuf": "uu", "uôur": "uu", "uôux": "uu", "uôuj": "uu",
"uóngo": "ung", "uòngo": "ung", "ungo": "ung", "uõngo": "ung", "ungo": "ung",
"uôngs": "ung", "uôngf": "ung", "uôngr": "ung", "uôngx": "ung", "uôngj": "ung",
"ucs": "uôcs", "uco": "uóco", "uôcso": "uocso", "uócos": "uocos",
"ucj": "uôcj", "uco": "uco", "uôcjo": "uocjo", "ucoj": "uocoj",
"uis": "uôis", "uio": "uóio", "uôiso": "uoiso", "uóios": "uoios",
"uif": "uôif", "uio": "uòio", "uôifo": "uoifo", "uòiof": "uoiof",
"uir": "uôir", "uio": "uio", "uôiro": "uoiro", "uior": "uoior",
"uix": "uôix", "uio": "uõio", "uôixo": "uoixo", "uõiox": "uoiox",
"uij": "uôij", "uio": "uóio", "uôijo": "uoijo", "uioj": "uoioj",
"ums": "uôms", "umo": "uómo", "uômso": "uomso", "uómos": "uomos",
"umf": "uômf", "umo": "uòmo", "uômfo": "uomfo", "uòmof": "uomof",
"umr": "uômr", "umo": "umo", "uômro": "uomro", "umor": "uomor",
"umx": "uômx", "umo": "uõmo", "uômxo": "uomxo", "uõmox": "uomox",
"umj": "uômj", "umo": "uómo", "uômjo": "uomjo", "umoj": "uomoj",
"uns": "uôns", "uno": "uóno", "uônso": "uonso", "uónos": "uonos",
"unf": "uônf", "uno": "uòno", "uônfo": "uonfo", "uònof": "uonof",
"unr": "uônr", "uno": "uno", "uônro": "uonro", "unor": "uonor",
"unx": "uônx", "uno": "uõno", "uônxo": "uonxo", "uõnox": "uonox",
"unj": "uônj", "uno": "uóno", "uônjo": "uonjo", "unoj": "uonoj",
"ups": "uôps", "upo": "uópo", "uôpso": "uopso", "uópos": "uopos",
"upj": "uôpj", "upo": "upo", "uôpjo": "uopjo", "upoj": "uopoj",
"uts": "uôts", "uto": "uóto", "uôtso": "uotso", "uótos": "uotos",
"utj": "uôtj", "uto": "uto", "uôtjo": "uotjo", "utoj": "uotoj",
"uus": "uôus", "uuo": "uóuo", "uôuso": "uouso", "uóuos": "uouos",
"uuf": "uôuf", "uuo": "uòuo", "uôufo": "uoufo", "uòuof": "uouof",
"uur": "uôur", "uuo": "uuo", "uôuro": "uouro", "uuor": "uouor",
"uux": "uôux", "uuo": "uõuo", "uôuxo": "uouxo", "uõuox": "uouox",
"uuj": "uôuj", "uuo": "uóuo", "uôujo": "uoujo", "uuoj": "uouoj",
"ungs": "uôngs", "ungo": "uóngo", "uôngso": "uongso", "uóngos": "uongos",
"ungf": "uôngf", "ungo": "uòngo", "uôngfo": "uongfo", "uòngof": "uongof",
"ungr": "uôngr", "ungo": "ungo", "uôngro": "uongro", "ungor": "uongor",
"ungx": "uôngx", "ungo": "uõngo", "uôngxo": "uongxo", "uõngox": "uongox",
"ungj": "uôngj", "ungo": "uóngo", "uôngjo": "uongjo", "ungoj": "uongoj",
"yes": "ýe", "yef": "e", "yer": "e", "yex": "e", "yej": "e",
"ýem": "yém", "em": "yèm", "em": "ym", "em": "ym", "em": "ym",
"yems": "yém", "yemf": "yèm", "yemr": "ym", "yemx": "ym", "yemj": "ym",
"yêms": "yếm", "yêmf": "ym", "yêmr": "ym", "yêmx": "ym", "yêmj": "ym",
"yéme": "yếm", "yème": "ym", "yme": "ym", "yme": "ym", "yme": "ym",
"ýen": "yén", "en": "yèn", "en": "yn", "en": "yn", "en": "yn",
"yens": "yén", "yenf": "yèn", "yenr": "yn", "yenx": "yn", "yenj": "yn",
"yêns": "yến", "yênf": "yn", "yênr": "yn", "yênx": "yn", "yênj": "yn",
"yéne": "yến", "yène": "yn", "yne": "yn", "yne": "yn", "yne": "yn",
"ýet": "yét", "et": "yt",
"yets": "yét", "yetj": "yt",
"yêts": "yết", "yêtj": "yt",
"yéte": "yết", "yte": "yt",
"ýeu": "yéu", "eu": "yèu", "eu": "yu", "eu": "yu", "eu": "yu",
"yeus": "yéu", "yeuf": "yèu", "yeur": "yu", "yeux": "yu", "yeuj": "yu",
"yêus": "yếu", "yêuf": "yu", "yêur": "yu", "yêux": "yu", "yêuj": "yu",
"yéue": "yếu", "yèue": "yu", "yue": "yu", "yue": "yu", "yue": "yu",
"ýeng": "yéng", "eng": "yèng", "eng": "yng", "eng": "yng", "eng": "yng",
"yengs": "yéng", "yengf": "yèng", "yengr": "yng", "yengx": "yng", "yengj": "yng",
"yêngs": "yếng", "yêngf": "yng", "yêngr": "yng", "yêngx": "yng", "yêngj": "yng",
"yénge": "yếng", "yènge": "yng", "ynge": "yng", "ynge": "yng", "ynge": "yng",
"ýes": "yes", "ef": "yef", "er": "yer", "ex": "yex", "ej": "yej",
"yếms": "yêms", "yếme": "yéme", "yêmse": "yemse", "yémes": "yemes",
"ymf": "yêmf", "yme": "yème", "yêmfe": "yemfe", "yèmef": "yemef",
"ymr": "yêmr", "yme": "yme", "yêmre": "yemre", "ymer": "yemer",
"ymx": "yêmx", "yme": "yme", "yêmxe": "yemxe", "ymex": "yemex",
"ymj": "yêmj", "yme": "yme", "yêmje": "yemje", "ymej": "yemej",
"yếns": "yêns", "yếne": "yéne", "yênse": "yense", "yénes": "yenes",
"ynf": "yênf", "yne": "yène", "yênfe": "yenfe", "yènef": "yenef",
"ynr": "yênr", "yne": "yne", "yênre": "yenre", "yner": "yener",
"ynx": "yênx", "yne": "yne", "yênxe": "yenxe", "ynex": "yenex",
"ynj": "yênj", "yne": "yne", "yênje": "yenje", "ynej": "yenej",
"yếts": "yêts", "yếte": "yéte", "yêtse": "yetse", "yétes": "yetes",
"ytj": "yêtj", "yte": "yte", "yêtje": "yetje", "ytej": "yetej",
"yếus": "yêus", "yếue": "yéue", "yêuse": "yeuse", "yéues": "yeues",
"yuf": "yêuf", "yue": "yèue", "yêufe": "yeufe", "yèuef": "yeuef",
"yur": "yêur", "yue": "yue", "yêure": "yeure", "yuer": "yeuer",
"yux": "yêux", "yue": "yue", "yêuxe": "yeuxe", "yuex": "yeuex",
"yuj": "yêuj", "yue": "yue", "yêuje": "yeuje", "yuej": "yeuej",
"yếngs": "yêngs", "yếnge": "yénge", "yêngse": "yengse", "yénges": "yenges",
"yngf": "yêngf", "ynge": "yènge", "yêngfe": "yengfe", "yèngef": "yengef",
"yngr": "yêngr", "ynge": "ynge", "yêngre": "yengre", "ynger": "yenger",
"yngx": "yêngx", "ynge": "ynge", "yêngxe": "yengxe", "yngex": "yengex",
"yngj": "yêngj", "ynge": "ynge", "yêngje": "yengje", "yngej": "yengej"
}
}
]
}

View File

@@ -9,6 +9,18 @@
"license": "apache-2.0"
},
"currencySets": [
{
"id": "armenian_dram",
"label": "Armenian dram (֏)",
"slots": [
{ "code": 1423, "label": "֏" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"id": "azerbaijani_manat",
"label": "Azerbaijani manat (₼)",
@@ -33,6 +45,18 @@
{ "code": 165, "label": "¥" }
]
},
{
"id": "costa_rican_colon",
"label": "Costa Rican colón (₡)",
"slots": [
{ "code": 8353, "label": "₡" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"id": "dollar",
"label": "Dollar ($)",

View File

@@ -17,6 +17,26 @@
"direction": "rtl",
"modifier": "org.florisboard.layouts:arabic"
},
{
"id": "western_armenian",
"label": "Armenian (Western)",
"authors": [ "PJTSearch" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:armenian"
},
{
"id": "eastern_armenian",
"label": "Armenian (Eastern)",
"authors": [ "PJTSearch" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:armenian"
},
{
"id": "azerbaijani",
"label": "Azerbaijani",
"authors": [ "nijatismayilzada" ],
"direction": "ltr"
},
{
"id": "azerty",
"label": "AZERTY",
@@ -72,6 +92,12 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "colemak_dh",
"label": "ColemakDH",
"authors": [ "blucin" ],
"direction": "ltr"
},
{
"id": "danish",
"label": "Danish (QWERTY)",
@@ -85,6 +111,13 @@
"direction": "ltr",
"modifier": "org.florisboard.layouts:dvorak"
},
{
"id": "dvorak_es",
"label": "Dvorak (ÑÇ)",
"authors": [ "tsiflimagas" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:dvorak"
},
{
"id": "esperanto",
"label": "Esperanto",
@@ -109,6 +142,12 @@
"authors": [ "mahmoudk1000" ],
"direction": "ltr"
},
{
"id": "german2",
"label": "German (GBoard)",
"authors": [ "M-Koushan" ],
"direction": "rtl"
},
{
"id": "greek",
"label": "Ελληνικά",
@@ -146,6 +185,12 @@
"authors": [ "nd500" ],
"direction": "ltr"
},
{
"id": "indonesian",
"label": "Indonesian (QWERTY)",
"authors": [ "Linerly" ],
"direction": "ltr"
},
{
"id": "ipa",
"label": "International Phonetic Alphabet",
@@ -154,13 +199,13 @@
},
{
"id": "jcuken_russian",
"label": "Russian (JCUKEN)",
"label": "Russian (ЙЦУКЕН)",
"authors": [ "williamtheaker" ],
"direction": "ltr"
},
{
"id": "jcuken_ukrainian",
"label": "Ukrainian (JCUKEN)",
"label": "Ukrainian (ЙЦУКЕН)",
"authors": [ "williamtheaker", "33kk" ],
"direction": "ltr"
},
@@ -223,6 +268,20 @@
"direction": "rtl",
"modifier": "org.florisboard.layouts:persian"
},
{
"id": "persian2",
"label": "Persian2",
"authors": [ "M-Koushan" ],
"direction": "rtl",
"modifier": "org.florisboard.layouts:persian2"
},
{
"id": "persian3",
"label": "Persian3",
"authors": [ "SaeID-Rz" ],
"direction": "rtl",
"modifier": "org.florisboard.layouts:persian3"
},
{
"id": "qwerty",
"label": "QWERTY",
@@ -235,6 +294,18 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "rusyn",
"label": "Rusyn",
"authors": [ "svvvst" ],
"direction": "ltr"
},
{
"id": "rusyn_us",
"label": "Rusyn (Phonetic)",
"authors": [ "svvvst" ],
"direction": "ltr"
},
{
"id": "sangaline",
"label": "Sangaline",
@@ -334,6 +405,12 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "armenian",
"label": "Armenian",
"authors": [ "PJTSearch" ],
"direction": "ltr"
},
{
"id": "arabic",
"label": "Arabic",
@@ -375,6 +452,18 @@
"label": "Persian",
"authors": [ "PHELAT" ],
"direction": "rtl"
},
{
"id": "persian2",
"label": "Persian2",
"authors": [ "M-Koushan" ],
"direction": "rtl"
},
{
"id": "persian3",
"label": "Persian3",
"authors": [ "SaeID-Rz" ],
"direction": "rtl"
}
],
"extension": [
@@ -528,6 +617,13 @@
}
],
"symbols": [
{
"id": "armenian",
"label": "Armenian",
"authors": [ "PJTSearch" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:armenian"
},
{
"id": "cjk",
"label": "CJK",
@@ -580,6 +676,12 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "armenian",
"label": "Armenian",
"authors": [ "PJTSearch" ],
"direction": "ltr"
},
{
"id": "cjk",
"label": "CJK",

View File

@@ -0,0 +1,46 @@
[
[
{ "$": "auto_text_key", "code": 113, "label": "q" },
{ "$": "auto_text_key", "code": 252, "label": "ü" },
{ "$": "auto_text_key", "code": 101, "label": "e" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 116, "label": "t" },
{ "$": "auto_text_key", "code": 121, "label": "y" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "case_selector",
"lower": { "code": 105, "label": "i" },
"upper": { "code": 304, "label": "İ" }
},
{ "$": "auto_text_key", "code": 111, "label": "o" },
{ "$": "auto_text_key", "code": 112, "label": "p" },
{ "$": "auto_text_key", "code": 246, "label": "ö" },
{ "$": "auto_text_key", "code": 287, "label": "ğ" }
],
[
{ "$": "auto_text_key", "code": 97, "label": "a" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 102, "label": "f" },
{ "$": "auto_text_key", "code": 103, "label": "g" },
{ "$": "auto_text_key", "code": 104, "label": "h" },
{ "$": "auto_text_key", "code": 106, "label": "j" },
{ "$": "auto_text_key", "code": 107, "label": "k" },
{ "$": "auto_text_key", "code": 108, "label": "l" },
{ "$": "case_selector",
"lower": { "code": 305, "label": "ı" },
"upper": { "code": 73, "label": "I" }
},
{ "$": "auto_text_key", "code": 601, "label": "ə" }
],
[
{ "$": "auto_text_key", "code": 122, "label": "z" },
{ "$": "auto_text_key", "code": 120, "label": "x" },
{ "$": "auto_text_key", "code": 99, "label": "c" },
{ "$": "auto_text_key", "code": 118, "label": "v" },
{ "$": "auto_text_key", "code": 98, "label": "b" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 109, "label": "m" },
{ "$": "auto_text_key", "code": 231, "label": "ç" },
{ "$": "auto_text_key", "code": 351, "label": "ş" }
]
]

View File

@@ -0,0 +1,46 @@
[
[
{ "$": "auto_text_key", "code": 113, "label": "q" },
{ "$": "auto_text_key", "code": 119, "label": "w" },
{ "$": "auto_text_key", "code": 102, "label": "f" },
{ "$": "auto_text_key", "code": 112, "label": "p" },
{ "$": "auto_text_key", "code": 98, "label": "b" },
{ "$": "auto_text_key", "code": 106, "label": "j" },
{ "$": "auto_text_key", "code": 108, "label": "l" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "auto_text_key", "code": 121, "label": "y" },
{ "$": "case_selector",
"lower": { "code": 59, "label": ";", "popup": {
"relevant": [
{ "code": 58, "label": ":" }
]
} },
"upper": { "code": 58, "label": ":", "popup": {
"relevant": [
{ "code": 59, "label": ";" }
]
} }
}
],
[
{ "$": "auto_text_key", "code": 97, "label": "a" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "auto_text_key", "code": 116, "label": "t" },
{ "$": "auto_text_key", "code": 103, "label": "g" },
{ "$": "auto_text_key", "code": 109, "label": "m" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 101, "label": "e" },
{ "$": "auto_text_key", "code": 105, "label": "i" },
{ "$": "auto_text_key", "code": 111, "label": "o" }
],
[
{ "$": "auto_text_key", "code": 120, "label": "x" },
{ "$": "auto_text_key", "code": 99, "label": "c" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 118, "label": "v" },
{ "$": "auto_text_key", "code": 122, "label": "z" },
{ "$": "auto_text_key", "code": 107, "label": "k" },
{ "$": "auto_text_key", "code": 104, "label": "h" }
]
]

View File

@@ -1,47 +1,47 @@
[
[
{ "$": "variation_selector",
"default": { "$": "case_selector",
"lower": { "code": 39, "label": "'", "popup": {
{ "$": "shift_state_selector",
"shiftedManual": { "code": 34, "label": "\"", "popup": {
"relevant": [
{ "code": 33, "label": "!" },
{ "code": 39, "label": "'"}
]
} },
"default": { "$": "variation_selector",
"email": { "code": 64, "label": "@" },
"uri": { "code": 47, "label": "/" },
"default": { "code": 39, "label": "'", "popup": {
"relevant": [
{ "code": 33, "label": "!" },
{ "code": 34, "label": "\"" }
]
} },
"upper": { "code": 34, "label": "\"", "popup": {
"relevant": [
{ "code": 33, "label": "!" },
{ "code": 39, "label": "'"}
]
} }
},
"email": { "code": 64, "label": "@" },
"uri": { "code": 47, "label": "/" }
}
},
{ "$": "case_selector",
"lower": { "code": 44, "label": ",", "popup": {
"relevant": [
{ "code": 60, "label": "<" },
{ "code": 63, "label": "?" }
]
} },
"upper": { "code": 60, "label": "<", "popup": {
{ "$": "shift_state_selector",
"shiftedManual": { "code": 60, "label": "<", "popup": {
"relevant": [
{ "code": 44, "label": "," },
{ "code": 63, "label": "?" }
]
} },
"default": { "code": 44, "label": ",", "popup": {
"relevant": [
{ "code": 60, "label": "<" },
{ "code": 63, "label": "?" }
]
} }
},
{ "$": "case_selector",
"lower": { "code": 46, "label": ".", "popup": {
"relevant": [
{ "code": 62, "label": ">" }
]
} },
"upper": { "code": 62, "label": ">", "popup": {
{ "$": "shift_state_selector",
"shiftedManual": { "code": 62, "label": ">", "popup": {
"relevant": [
{ "code": 46, "label": "." }
]
} },
"default": { "code": 46, "label": ".", "popup": {
"relevant": [
{ "code": 62, "label": ">" }
]
} }
},
{ "$": "auto_text_key", "code": 112, "label": "p" },

View File

@@ -0,0 +1,78 @@
[
[
{ "$": "shift_state_selector",
"shiftedManual": { "code": 60, "label": "<", "popup": {
"relevant": [
{ "code": 44, "label": "," },
{ "code": 63, "label": "?" }
]
} },
"default": { "code": 44, "label": ",", "popup": {
"relevant": [
{ "code": 60, "label": "<" },
{ "code": 63, "label": "?" }
]
} }
},
{ "$": "shift_state_selector",
"shiftedManual": { "code": 62, "label": ">", "popup": {
"relevant": [
{ "code": 46, "label": "." }
]
} },
"default": { "code": 46, "label": ".", "popup": {
"relevant": [
{ "code": 62, "label": ">" }
]
} }
},
{ "$": "auto_text_key", "code": 241, "label": "ñ" },
{ "$": "auto_text_key", "code": 112, "label": "p" },
{ "$": "auto_text_key", "code": 121, "label": "y" },
{ "$": "auto_text_key", "code": 102, "label": "f" },
{ "$": "auto_text_key", "code": 103, "label": "g" },
{ "$": "auto_text_key", "code": 99, "label": "c" },
{ "$": "auto_text_key", "code": 104, "label": "h" },
{ "$": "auto_text_key", "code": 108, "label": "l" }
],
[
{ "$": "auto_text_key", "code": 97, "label": "a" },
{ "$": "auto_text_key", "code": 111, "label": "o" },
{ "$": "auto_text_key", "code": 101, "label": "e" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "auto_text_key", "code": 105, "label": "i" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 116, "label": "t" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "shift_state_selector",
"shiftedManual": { "code": 34, "label": "\"", "popup": {
"relevant": [
{ "code": 33, "label": "!" },
{ "code": 39, "label": "'"}
]
} },
"default": { "$": "variation_selector",
"email": { "code": 64, "label": "@" },
"uri": { "code": 47, "label": "/" },
"default": { "code": 39, "label": "'", "popup": {
"relevant": [
{ "code": 33, "label": "!" },
{ "code": 34, "label": "\"" }
]
} }
}
},
{ "$": "auto_text_key", "code": 231, "label": "ç" }
],
[
{ "$": "auto_text_key", "code": 106, "label": "j" },
{ "$": "auto_text_key", "code": 107, "label": "k" },
{ "$": "auto_text_key", "code": 120, "label": "x" },
{ "$": "auto_text_key", "code": 98, "label": "b" },
{ "$": "auto_text_key", "code": 109, "label": "m" },
{ "$": "auto_text_key", "code": 119, "label": "w" },
{ "$": "auto_text_key", "code": 118, "label": "v" }
]
]

View File

@@ -0,0 +1,48 @@
[
[
{ "$": "auto_text_key", "code": 1393, "label": "ձ" },
{ "$": "auto_text_key", "code": 1397, "label": "յ" },
{ "$": "auto_text_key", "code": 1413, "label": "օ" },
{ "$": "auto_text_key", "code": 1404, "label": "ռ" },
{ "$": "auto_text_key", "code": 1386, "label": "ժ" },
{ "$": "auto_text_key", "code": 1401, "label": "չ" },
{ "$": "auto_text_key", "code": 1403, "label": "ջ" },
{ "$": "auto_text_key", "code": 1411, "label": "փ" },
{ "$": "auto_text_key", "code": 1394, "label": "ղ" },
{ "$": "auto_text_key", "code": 1390, "label": "ծ" }
],
[
{ "$": "auto_text_key", "code": 1389, "label": "խ" },
{ "$": "auto_text_key", "code": 1410, "label": "ւ" },
{ "$": "auto_text_key", "code": 1383, "label": "է" },
{ "$": "auto_text_key", "code": 1408, "label": "ր" },
{ "$": "auto_text_key", "code": 1407, "label": "տ" },
{ "$": "auto_text_key", "code": 1381, "label": "ե" },
{ "$": "auto_text_key", "code": 1384, "label": "ը" },
{ "$": "auto_text_key", "code": 1387, "label": "ի" },
{ "$": "auto_text_key", "code": 1400, "label": "ո" },
{ "$": "auto_text_key", "code": 1402, "label": "պ" }
],
[
{ "$": "auto_text_key", "code": 1377, "label": "ա" },
{ "$": "auto_text_key", "code": 1405, "label": "ս" },
{ "$": "auto_text_key", "code": 1380, "label": "դ" },
{ "$": "auto_text_key", "code": 1414, "label": "ֆ" },
{ "$": "auto_text_key", "code": 1412, "label": "ք" },
{ "$": "auto_text_key", "code": 1392, "label": "հ" },
{ "$": "auto_text_key", "code": 1395, "label": "ճ" },
{ "$": "auto_text_key", "code": 1391, "label": "կ" },
{ "$": "auto_text_key", "code": 1388, "label": "լ" },
{ "$": "auto_text_key", "code": 1385, "label": "թ" }
],
[
{ "$": "auto_text_key", "code": 1382, "label": "զ" },
{ "$": "auto_text_key", "code": 1409, "label": "ց" },
{ "$": "auto_text_key", "code": 1379, "label": "գ" },
{ "$": "auto_text_key", "code": 1406, "label": "վ" },
{ "$": "auto_text_key", "code": 1378, "label": "բ" },
{ "$": "auto_text_key", "code": 1398, "label": "ն" },
{ "$": "auto_text_key", "code": 1396, "label": "մ" },
{ "$": "auto_text_key", "code": 1399, "label": "շ" }
]
]

View File

@@ -0,0 +1,37 @@
[
[
{ "$": "auto_text_key", "code": 113, "label": "q" },
{ "$": "auto_text_key", "code": 119, "label": "w" },
{ "$": "auto_text_key", "code": 101, "label": "e" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 116, "label": "t" },
{ "$": "auto_text_key", "code": 122, "label": "z" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "auto_text_key", "code": 105, "label": "i" },
{ "$": "auto_text_key", "code": 111, "label": "o" },
{ "$": "auto_text_key", "code": 112, "label": "p" },
{ "$": "auto_text_key", "code": 252, "label": "ü" }
],
[
{ "$": "auto_text_key", "code": 97, "label": "a" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 102, "label": "f" },
{ "$": "auto_text_key", "code": 103, "label": "g" },
{ "$": "auto_text_key", "code": 104, "label": "h" },
{ "$": "auto_text_key", "code": 106, "label": "j" },
{ "$": "auto_text_key", "code": 107, "label": "k" },
{ "$": "auto_text_key", "code": 108, "label": "l" },
{ "$": "auto_text_key", "code": 246, "label": "ö" },
{ "$": "auto_text_key", "code": 228, "label": "ä" }
],
[
{ "$": "auto_text_key", "code": 121, "label": "y" },
{ "$": "auto_text_key", "code": 120, "label": "x" },
{ "$": "auto_text_key", "code": 99, "label": "c" },
{ "$": "auto_text_key", "code": 118, "label": "v" },
{ "$": "auto_text_key", "code": 98, "label": "b" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 109, "label": "m" }
]
]

View File

@@ -2,44 +2,85 @@
[
{ "code": 39, "label": "'", "popup": {
"relevant": [
{ "code": 1474, "label": "ש\u05c2" },
{ "code": 1467, "label": "ס\u05bb" },
{ "code": 1523, "label": "׳" },
{ "code": 1524, "label": "״" },
{ "code": 34, "label": "\"" },
{ "code": 96, "label": "`" }
]
} },
{ "code": 45, "label": "-", "popup": {
"relevant": [
{ "code": 1470, "label": "־" },
{ "code": 1473, "label": "ש\u05c1" },
{ "code": 95, "label": "_" }
]
} },
{ "code": 1511, "label": "ק" },
{ "code": 1511, "label": "ק", "popup": {
"relevant": [
{ "code": 1464, "label": "ס\u05b8" },
{ "code": 1459, "label": "ס\u05b3" }
]
} },
{ "code": 1512, "label": "ר" },
{ "code": 1488, "label": "א" },
{ "code": 1496, "label": "ט" },
{ "code": 1493, "label": "ו" },
{ "code": 1493, "label": "ו", "popup": {
"relevant": [
{ "code": 1465, "label": "ס\u05b9" }
]
} },
{ "code": 1503, "label": "ן" },
{ "code": 1501, "label": "ם" },
{ "code": 1508, "label": "פ" }
{ "code": 1508, "label": "פ", "popup": {
"relevant": [
{ "code": 1463, "label": "ס\u05b7" },
{ "code": 1458, "label": "ס\u05b2" }
]
} }
],
[
{ "code": 1513, "label": "ש" },
{ "code": 1491, "label": "ד" },
{ "code": 1513, "label": "ש", "popup": {
"relevant": [
{ "code": 1456, "label": "ס\u05b0" }
]
} },
{ "code": 1491, "label": "ד", "popup": {
"relevant": [
{ "code": 1468, "label": "ס\u05bc" }
]
} },
{ "code": 1490, "label": "ג" },
{ "code": 1499, "label": "כ" },
{ "code": 1506, "label": "ע" },
{ "code": 1497, "label": "י" },
{ "code": 1495, "label": "ח" },
{ "code": 1495, "label": "ח", "popup": {
"relevant": [
{ "code": 1460, "label": "ס\u05b4" }
]
} },
{ "code": 1500, "label": "ל" },
{ "code": 1498, "label": "ך" },
{ "code": 1507, "label": "ף" }
],
[
{ "code": 1494, "label": "ז" },
{ "code": 1505, "label": "ס" },
{ "code": 1505, "label": "ס", "popup": {
"relevant": [
{ "code": 1462, "label": "ס\u05b6" },
{ "code": 1457, "label": "ס\u05b1" }
]
} },
{ "code": 1489, "label": "ב" },
{ "code": 1492, "label": "ה" },
{ "code": 1504, "label": "נ" },
{ "code": 1502, "label": "מ" },
{ "code": 1510, "label": "צ" },
{ "code": 1510, "label": "צ", "popup": {
"relevant": [
{ "code": 1461, "label": "ס\u05b5" }
]
} },
{ "code": 1514, "label": "ת" },
{ "code": 1509, "label": "ץ" }
]

View File

@@ -1,13 +1,13 @@
[
[
[
{ "code": 1602, "label": "ق", "popup": {
"main": { "code": 1647, "label": "ٯ" }
} },
{ "code": 1608, "label": "و", "popup": {
"main": { "code": -255, "label": "وو" }
} },
{ "code": 1749, "label": "", "popup": {
"main": { "code": 1577, "label": "ة" }
{ "code": 1749, "label": "ە", "popup": {
"main": { "code": 1577, "label": "ة" }
} },
{ "code": 1585, "label": "ر", "popup": {
"main": { "code": 1685, "label": "ڕ" }
@@ -15,50 +15,49 @@
{ "code": 1578, "label": "ت", "popup": {
"main": { "code": 1591, "label": "ط" }
} },
{ "code": 1740, "label": "ی", "popup": {
"main": { "code": 1742, "label": "ێ" }
} },
{ "code": 1740, "label": "ی" },
{ "code": 1742, "label": "ێ" },
{ "code": 1574, "label": "ﺋ", "popup": {
"main": { "code": 1569, "label": "ء" }
} },
{ "code": 1593, "label": "ع", "popup": {
"main": { "code": 1594, "label": "غ" }
} },
{ "code": 1734, "label": "ۆ" },
{ "code": 1662, "label": "پ", "popup": {
"main": { "code": 1579, "label": "ث" }
} }
],
[
{"code": 1575, "label": "ا"},
{ "code": 1587, "label": "س" },
{ "code": 1588, "label": "ش" },
{ "code": 1583, "label": "د", "popup": {
"main": {"code": 1584, "label": "ذ" }
],
[
{ "code": 1575, "label": "ا"},
{ "code": 1587, "label": "س" },
{ "code": 1588, "label": "ش" },
{ "code": 1583, "label": "د", "popup": {
"main": {"code": 1584, "label": "ذ" }
} },
{ "code": 1601, "label": "ف" , "popup": {
"main": {"code": 1700, "label": "ڤ" }
} },
{ "code": 1601, "label": "ف" , "popup": {
"main": {"code": 1700, "label": "ڤ" }
} },
{ "code": 1607, "label": "ھ" },
{ "code": 1688, "label": "ژ", "popup": {
"main": { "code": 1600, "label": "" }
} },
{ "code": 1604, "label": "ل", "popup": {
"main": { "code": 1717, "label": "ڵ" }
} },
{ "code": 1705, "label": "ک" },
{ "code": 1711, "label": "گ" }
],
[
{ "code": 1586, "label": "ز", "popup": {
"main": {"code": 1592, "label": "ظ" }
} },
{ "code": 1582, "label": "خ" },
{ "code": 1580, "label": "ج" },
{ "code": 1670, "label": "چ" },
{ "code": 1581, "label": "ح" },
{ "code": 1576, "label": "ب" },
{ "code": 1606, "label": "ن" },
{ "code": 1605, "label": "م" }
{ "code": 1726, "label": "ھ" },
{ "code": 1688, "label": "ژ", "popup": {
"main": { "code": 1600, "label": "━" }
} },
{ "code": 1604, "label": "ل", "popup": {
"main": { "code": 1717, "label": "ڵ" }
} },
{ "code": 1705, "label": "ک" },
{ "code": 1711, "label": "گ" , "popup": {
"main": { "code": 1594, "label": "غ" }
} }
],
[
{ "code": 1586, "label": "ز", "popup": {
"main": {"code": 1592, "label": "ظ" }
} },
{ "code": 1582, "label": "خ" },
{ "code": 1580, "label": "ج" },
{ "code": 1670, "label": "چ" },
{ "code": 1581, "label": "ح" },
{ "code": 1593, "label": "ع" },
{ "code": 1576, "label": "ب" },
{ "code": 1606, "label": "ن" },
{ "code": 1605, "label": "م" }
]
]
]

View File

@@ -48,7 +48,9 @@
],
[
{ "code": 1600, "label": "kashida", "popup":
{ "main": { "code": 8204, "label": "half_space" }
} },
{ "code": 1574, "label": "ﺋ", "popup": {
"main": { "code": 1569, "label": "ء" }
} },
@@ -58,9 +60,14 @@
} },
{ "code": 1688, "label": "ژ" },
{ "code": 1605, "label": "م" },
{ "code": 1567, "label": "؟" },
{ "code": 1548, "label": "،" },
{ "code": 46, "label": "." }
{ "code": 1567, "label": "؟", "popup": {
"main": { "code": 63, "label": "?" }
} },
{ "code": 1548, "label": "،", "popup": {
"main": { "code": 1643, "label": "٫" }
} },
{ "code": 58, "label": ":", "popup": {
"main": { "code": 1563, "label": "؛" }
} }
]
]

View File

@@ -0,0 +1,36 @@
[
[
{ "code": 1589, "label": "ص" },
{ "code": 1602, "label": "ق" },
{ "code": 1601, "label": "ف" },
{ "code": 1594, "label": "غ" },
{ "code": 1593, "label": "ع" },
{ "code": 1607, "label": "ه" },
{ "code": 1582, "label": "خ" },
{ "code": 1581, "label": "ح" },
{ "code": 1580, "label": "ج" },
{ "code": 1670, "label": "چ" }
],
[
{ "code": 1588, "label": "ش" },
{ "code": 1587, "label": "س" },
{ "code": 1740, "label": "ی" },
{ "code": 1576, "label": "ب" },
{ "code": 1604, "label": "ل" },
{ "code": 1575, "label": "ا" },
{ "code": 1578, "label": "ت" },
{ "code": 1606, "label": "ن" },
{ "code": 1605, "label": "م" },
{ "code": 1705, "label": "ک" }
],
[
{ "code": 8204, "label": "half_space" },
{ "code": 1591, "label": "ط" },
{ "code": 1586, "label": "ز" },
{ "code": 1585, "label": "ر" },
{ "code": 1584, "label": "ذ" },
{ "code": 1583, "label": "د" },
{ "code": 1608, "label": "و" },
{ "code": 1711, "label": "گ" }
]
]

View File

@@ -0,0 +1,39 @@
[
[
{ "code": 1590, "label": "ض" },
{ "code": 1589, "label": "ص" },
{ "code": 1579, "label": "ث" },
{ "code": 1602, "label": "ق" },
{ "code": 1601, "label": "ف" },
{ "code": 1594, "label": "غ" },
{ "code": 1593, "label": "ع" },
{ "code": 1607, "label": "ه" },
{ "code": 1582, "label": "خ" },
{ "code": 1581, "label": "ح" },
{ "code": 1580, "label": "ج" }
],
[
{ "code": 1588, "label": "ش" },
{ "code": 1587, "label": "س" },
{ "code": 1740, "label": "ی" },
{ "code": 1576, "label": "ب" },
{ "code": 1604, "label": "ل" },
{ "code": 1575, "label": "ا" },
{ "code": 1578, "label": "ت" },
{ "code": 1606, "label": "ن" },
{ "code": 1605, "label": "م" },
{ "code": 1705, "label": "ک" },
{ "code": 1711, "label": "گ" }
],
[
{ "code": 1592, "label": "ظ" },
{ "code": 1591, "label": "ط" },
{ "code": 1586, "label": "ز" },
{ "code": 1585, "label": "ر" },
{ "code": 1584, "label": "ذ" },
{ "code": 1583, "label": "د" },
{ "code": 1662, "label": "پ" },
{ "code": 1608, "label": "و" },
{ "code": 1670, "label": "چ" }
]
]

View File

@@ -0,0 +1,47 @@
[
[
{ "$": "auto_text_key", "code": 1081, "label": "й" },
{ "$": "auto_text_key", "code": 1094, "label": "ц" },
{ "$": "auto_text_key", "code": 1091, "label": "у" },
{ "$": "auto_text_key", "code": 1082, "label": "к" },
{ "$": "auto_text_key", "code": 1077, "label": "е" },
{ "$": "auto_text_key", "code": 1085, "label": "н" },
{ "$": "auto_text_key", "code": 1075, "label": "г" },
{ "$": "auto_text_key", "code": 1096, "label": "ш" },
{ "$": "auto_text_key", "code": 1097, "label": "щ" },
{ "$": "auto_text_key", "code": 1079, "label": "з" },
{ "$": "auto_text_key", "code": 1093, "label": "х" },
{ "$": "auto_text_key", "code": 1031, "label": "ї" }
],
[
{ "$": "auto_text_key", "code": 1092 , "label": "ф" },
{ "$": "auto_text_key", "code": 1110 , "label": "і" },
{ "$": "auto_text_key", "code": 1074 , "label": "в" },
{ "$": "auto_text_key", "code": 1072 , "label": "а" },
{ "$": "auto_text_key", "code": 1087 , "label": "п" },
{ "$": "auto_text_key", "code": 1088 , "label": "р" },
{ "$": "auto_text_key", "code": 1086 , "label": "о" },
{ "$": "auto_text_key", "code": 1083 , "label": "л" },
{ "$": "auto_text_key", "code": 1076 , "label": "д" },
{ "$": "auto_text_key", "code": 1078 , "label": "ж" },
{ "$": "auto_text_key", "code": 1108 , "label": "є" },
{ "$": "auto_text_key", "code": 1067 , "label": "ы" }
],
[
{ "$": "auto_text_key", "code": 1169 , "label": "ґ" },
{ "$": "auto_text_key", "code": 1103 , "label": "я" },
{ "$": "auto_text_key", "code": 1095 , "label": "ч" },
{ "$": "auto_text_key", "code": 1089 , "label": "с" },
{ "$": "auto_text_key", "code": 1084 , "label": "м" },
{ "$": "auto_text_key", "code": 1080 , "label": "и" },
{ "$": "auto_text_key", "code": 1090 , "label": "т" },
{ "$": "auto_text_key", "code": 1100 , "label": "ь" },
{ "$": "auto_text_key", "code": 1073 , "label": "б" },
{ "$": "auto_text_key", "code": 1102 , "label": "ю" },
{ "$": "auto_text_key", "code": 1025 , "label": "ё" }
]
]

View File

@@ -0,0 +1,46 @@
[
[
{ "$": "auto_text_key", "code": 1094, "label": "ц" },
{ "$": "auto_text_key", "code": 1108 , "label": "є" },
{ "$": "auto_text_key", "code": 1077, "label": "е" },
{ "$": "auto_text_key", "code": 1088 , "label": "р" },
{ "$": "auto_text_key", "code": 1090 , "label": "т" },
{ "$": "auto_text_key", "code": 1081, "label": "й" },
{ "$": "auto_text_key", "code": 1091, "label": "у" },
{ "$": "auto_text_key", "code": 1102 , "label": "ю" },
{ "$": "auto_text_key", "code": 1110 , "label": "і" },
{ "$": "auto_text_key", "code": 1031, "label": "ї" },
{ "$": "auto_text_key", "code": 1086 , "label": "о" },
{ "$": "auto_text_key", "code": 1025 , "label": "ё" },
{ "$": "auto_text_key", "code": 1087 , "label": "п" }
],
[
{ "$": "auto_text_key", "code": 1103 , "label": "я" },
{ "$": "auto_text_key", "code": 1072 , "label": "а" },
{ "$": "auto_text_key", "code": 1089 , "label": "с" },
{ "$": "auto_text_key", "code": 1076 , "label": "д" },
{ "$": "auto_text_key", "code": 1092 , "label": "ф" },
{ "$": "auto_text_key", "code": 1169 , "label": "ґ" },
{ "$": "auto_text_key", "code": 1067 , "label": "ы" },
{ "$": "auto_text_key", "code": 1075, "label": "г" },
{ "$": "auto_text_key", "code": 1078 , "label": "ж" },
{ "$": "auto_text_key", "code": 1082, "label": "к" },
{ "$": "auto_text_key", "code": 1083 , "label": "л" },
{ "$": "auto_text_key", "code": 1096, "label": "ш" },
{ "$": "auto_text_key", "code": 1097, "label": "щ" }
],
[
{ "$": "auto_text_key", "code": 1079, "label": "з" },
{ "$": "auto_text_key", "code": 1093, "label": "х" },
{ "$": "auto_text_key", "code": 1095 , "label": "ч" },
{ "$": "auto_text_key", "code": 1074 , "label": "в" },
{ "$": "auto_text_key", "code": 1073 , "label": "б" },
{ "$": "auto_text_key", "code": 1085, "label": "н" },
{ "$": "auto_text_key", "code": 1084 , "label": "м" },
{ "$": "auto_text_key", "code": 1080 , "label": "и" },
{ "$": "auto_text_key", "code": 1100 , "label": "ь" }
]
]

View File

@@ -4,7 +4,7 @@
{ "code": 1608, "label": "و" },
{ "code": 1593, "label": "ع" },
{ "code": 1585, "label": "ر" },
{ "code": 1587, "label": "ت" },
{ "code": 1578, "label": "ت" },
{ "code": 1746, "label": "ے" },
{ "code": 1569, "label": "ء" },
{ "code": 1740, "label": "ی" },
@@ -27,7 +27,7 @@
{ "code": 1588, "label": "ش" },
{ "code": 1670, "label": "چ" },
{ "code": 1591, "label": "ط" },
{ "code": 1576, "label": "پ" },
{ "code": 1576, "label": "ب" },
{ "code": 1606, "label": "ن" },
{ "code": 1605, "label": "م" }
]

View File

@@ -0,0 +1,49 @@
[
[
{ "$": "auto_text_key", "code": 1393, "label": "ձ" },
{ "$": "auto_text_key", "code": 1397, "label": "յ" },
{ "$": "auto_text_key", "code": 1413, "label": "օ" },
{ "$": "auto_text_key", "code": 1404, "label": "ռ" },
{ "$": "auto_text_key", "code": 1386, "label": "ժ" },
{ "$": "auto_text_key", "code": 1401, "label": "չ" },
{ "$": "auto_text_key", "code": 1403, "label": "ջ" },
{ "$": "auto_text_key", "code": 1411, "label": "փ" },
{ "$": "auto_text_key", "code": 1394, "label": "ղ" },
{ "$": "auto_text_key", "code": 1390, "label": "ծ" }
],
[
{ "$": "auto_text_key", "code": 1389, "label": "խ" },
{ "$": "auto_text_key", "code": 1406, "label": "վ" },
{ "$": "auto_text_key", "code": 1383, "label": "է" },
{ "$": "auto_text_key", "code": 1408, "label": "ր" },
{ "$": "auto_text_key", "code": 1380, "label": "դ" },
{ "$": "auto_text_key", "code": 1381, "label": "ե" },
{ "$": "auto_text_key", "code": 1384, "label": "ը" },
{ "$": "auto_text_key", "code": 1387, "label": "ի" },
{ "$": "auto_text_key", "code": 1400, "label": "ո" },
{ "$": "auto_text_key", "code": 1378, "label": "բ" }
],
[
{ "$": "auto_text_key", "code": 1377, "label": "ա" },
{ "$": "auto_text_key", "code": 1405, "label": "ս" },
{ "$": "auto_text_key", "code": 1407, "label": "տ" },
{ "$": "auto_text_key", "code": 1414, "label": "ֆ" },
{ "$": "auto_text_key", "code": 1391, "label": "կ" },
{ "$": "auto_text_key", "code": 1392, "label": "հ" },
{ "$": "auto_text_key", "code": 1395, "label": "ճ" },
{ "$": "auto_text_key", "code": 1412, "label": "ք" },
{ "$": "auto_text_key", "code": 1388, "label": "լ" },
{ "$": "auto_text_key", "code": 1385, "label": "թ" }
],
[
{ "$": "auto_text_key", "code": 1382, "label": "զ" },
{ "$": "auto_text_key", "code": 1409, "label": "ց" },
{ "$": "auto_text_key", "code": 1379, "label": "գ" },
{ "$": "auto_text_key", "code": 1410, "label": "ւ" },
{ "$": "auto_text_key", "code": 1402, "label": "պ" },
{ "$": "auto_text_key", "code": 1398, "label": "ն" },
{ "$": "auto_text_key", "code": 1396, "label": "մ" },
{ "$": "auto_text_key", "code": 1399, "label": "շ" }
]
]

View File

@@ -0,0 +1,20 @@
[
[
{ "code": -11, "label": "shift", "type": "modifier" },
{ "code": 0, "type": "placeholder" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],
[
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
{ "$": "variation_selector",
"default": { "code": 44, "label": ",", "groupId": 1 },
"email": { "code": 64, "label": "@", "groupId": 1 },
"uri": { "code": 47, "label": "/", "groupId": 1 }
},
{ "code": -227, "label": "language_switch", "type": "system_gui" },
{ "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" },
{ "code": 32, "label": "space" },
{ "code": 1417, "label": "։", "groupId": 2 },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -1,8 +1,5 @@
[
[
{ "code": 1600, "label": "kashida", "popup":
{ "main": { "code": 8204, "label": "half_space" }
} },
{ "code": 0, "type": "placeholder" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],

View File

@@ -0,0 +1,19 @@
[
[
{ "code": 0, "type": "placeholder" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],
[
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
{ "code": -227, "label": "language_switch", "type": "system_gui" },
{ "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" },
{ "$": "variation_selector",
"default": { "code": 1548, "label": "،", "groupId": 1 },
"email": { "code": 64, "label": "@", "groupId": 1 },
"uri": { "code": 47, "label": "/", "groupId": 1 }
},
{ "code": 32, "label": "space" },
{ "code": 46, "label": ".", "groupId": 2 },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -0,0 +1,19 @@
[
[
{ "code": 0, "type": "placeholder" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],
[
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
{ "$": "variation_selector",
"default": { "code": 1548, "label": "،", "groupId": 1 },
"email": { "code": 64, "label": "@", "groupId": 1 },
"uri": { "code": 47, "label": "/", "groupId": 1 }
},
{ "code": -227, "label": "language_switch", "type": "system_gui" },
{ "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" },
{ "code": 32, "label": "space" },
{ "code": 46, "label": ".", "groupId": 2 },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -1,12 +0,0 @@
[
[
{ "code": -35, "label": "clipboard_select_all", "type": "enter_editing" },
{ "code": -31, "label": "clipboard_copy", "type": "enter_editing" },
{ "code": -32, "label": "clipboard_cut", "type": "enter_editing" },
{ "code": -21, "label": "arrow_left", "type": "navigation" },
{ "code": -22, "label": "arrow_right", "type": "navigation" },
{ "code": -33, "label": "clipboard_paste", "type": "enter_editing" },
{ "code": -38, "label": "clipboard_clear_primary_clip", "type": "system_gui"},
{ "code": -213, "label": "ime_ui_mode_clipboard", "type": "system_gui"}
]
]

View File

@@ -1,68 +1,200 @@
[
[
{ "code": 49, "label": "1", "type": "numeric", "popup": {
"main": { "code": 185, "label": "¹" },
"relevant": [
{ "code": 8537, "label": "" },
{ "code": 8528, "label": "⅐" },
{ "code": 8539, "label": "⅛" },
{ "code": 8529, "label": "⅑" },
{ "code": 8530, "label": "" },
{ "code": 189, "label": "½" },
{ "code": 8531, "label": "⅓" },
{ "code": 188, "label": "¼" },
{ "code": 8533, "label": "" }
]
} },
{ "code": 50, "label": "2", "type": "numeric", "popup": {
"main": { "code": 178, "label": "²" },
"relevant": [
{ "code": 8532, "label": "" },
{ "code": 8534, "label": "" }
]
} },
{ "code": 51, "label": "3", "type": "numeric", "popup": {
"main": { "code": 179, "label": "³" },
"relevant": [
{ "code": 8535, "label": "" },
{ "code": 190, "label": "¾" },
{ "code": 8540, "label": "⅜" }
]
} },
{ "code": 52, "label": "4", "type": "numeric", "popup": {
"main": { "code": 8308, "label": "" },
"relevant": [
{ "code": 8536, "label": "⅘" }
]
} },
{ "code": 53, "label": "5", "type": "numeric", "popup": {
"main": { "code": 8309, "label": "⁵" },
"relevant": [
{ "code": 8538, "label": "" },
{ "code": 8541, "label": "⅝" }
]
} },
{ "code": 54, "label": "6", "type": "numeric", "popup": {
"main": { "code": 8310, "label": "" }
} },
{ "code": 55, "label": "7", "type": "numeric", "popup": {
"main": { "code": 8311, "label": "" },
"relevant": [
{ "code": 8542, "label": "⅞" }
]
} },
{ "code": 56, "label": "8", "type": "numeric", "popup": {
"main": { "code": 8312, "label": "⁸" }
} },
{ "code": 57, "label": "9", "type": "numeric", "popup": {
"main": { "code": 8313, "label": "" }
} },
{ "code": 48, "label": "0", "type": "numeric", "popup": {
"main": { "code": 8304, "label": "" },
"relevant": [
{ "code": 8709, "label": "" },
{ "code": 8319, "label": "ⁿ" }
]
} }
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 33, "label": "!", "type": "numeric", "popup": {
"main": { "code": 161, "label": "¡" }
}
},
"default": {
"code": 49, "label": "1", "type": "numeric", "popup": {
"main": { "code": 185, "label": "¹" },
"relevant": [
{ "code": 8537, "label": "" },
{ "code": 8528, "label": "" },
{ "code": 8539, "label": "⅛" },
{ "code": 8529, "label": "⅑" },
{ "code": 8530, "label": "" },
{ "code": 189, "label": "½" },
{ "code": 8531, "label": "⅓" },
{ "code": 188, "label": "¼" },
{ "code": 8533, "label": "" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": { "code": 64, "label": "@", "type": "numeric" },
"default": {
"code": 50, "label": "2", "type": "numeric", "popup": {
"main": { "code": 178, "label": "²" },
"relevant": [
{ "code": 8532, "label": "" },
{ "code": 8534, "label": "" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 35, "label": "#", "type": "numeric", "popup": {
"main": { "code": 8470, "label": "" }
}
},
"default": {
"code": 51, "label": "3", "type": "numeric", "popup": {
"main": { "code": 179, "label": "³" },
"relevant": [
{ "code": 8535, "label": "" },
{ "code": 190, "label": "¾" },
{ "code": 8540, "label": "⅜" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": -801, "label": "currency_slot_1", "type": "numeric", "popup": {
"main": { "code": -802, "label": "currency_slot_2" },
"relevant": [
{ "code": -806, "label": "currency_slot_6" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" }
]
}
},
"default": {
"code": 52, "label": "4", "type": "numeric", "popup": {
"main": { "code": 8308, "label": "⁴" },
"relevant": [
{ "code": 8536, "label": "⅘" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 37, "label": "%", "type": "numeric", "popup": {
"main": { "code": 8240, "label": "‰" },
"relevant": [
{ "code": 8453, "label": "℅" }
]
}
},
"default": {
"code": 53, "label": "5", "type": "numeric", "popup": {
"main": { "code": 8309, "label": "⁵" },
"relevant": [
{ "code": 8538, "label": "⅚" },
{ "code": 8541, "label": "⅝" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 94, "label": "^", "type": "numeric", "popup": {
"main": { "code": 8593, "label": "↑" },
"relevant": [
{ "code": 8592, "label": "←" },
{ "code": 8595, "label": "↓" },
{ "code": 8594, "label": "→" }
]
}
},
"default": {
"code": 54, "label": "6", "type": "numeric", "popup": {
"main": { "code": 8310, "label": "⁶" }
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": { "code": 38, "label": "&", "type": "numeric" },
"default": {
"code": 55, "label": "7", "type": "numeric", "popup": {
"main": { "code": 8311, "label": "⁷" },
"relevant": [
{ "code": 8542, "label": "⅞" }
]
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"code": 42, "label": "*", "type": "numeric", "popup": {
"main": { "code": 8224, "label": "†" },
"relevant": [
{ "code": 9733, "label": "★" },
{ "code": 8225, "label": "‡" }
]
}
},
"default": {
"code": 56, "label": "8", "type": "numeric", "popup": {
"main": { "code": 8312, "label": "⁸" }
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"$": "layout_direction_selector",
"ltr": {
"code": 40, "label": "(", "type": "numeric", "popup": {
"main": { "code": 60, "label": "<" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
}
},
"rtl": {
"code": 41, "label": "(", "type": "numeric", "popup": {
"main": { "code": 62, "label": "<" },
"relevant": [
{ "code": 93, "label": "[" },
{ "code": 125, "label": "{" }
]
}
}
},
"default": {
"code": 57, "label": "9", "type": "numeric", "popup": {
"main": { "code": 8313, "label": "⁹" }
}
}
},
{ "$": "shift_state_selector",
"shiftedManual": {
"$": "layout_direction_selector",
"ltr": {
"code": 41, "label": ")", "type": "numeric", "popup": {
"main": { "code": 62, "label": ">" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
}
},
"rtl": {
"code": 40, "label": ")", "type": "numeric", "popup": {
"main": { "code": 60, "label": ">" },
"relevant": [
{ "code": 91, "label": "]" },
{ "code": 123, "label": "}" }
]
}
}
},
"default": {
"code": 48, "label": "0", "type": "numeric", "popup": {
"main": { "code": 8304, "label": "⁰" },
"relevant": [
{ "code": 8709, "label": "∅" },
{ "code": 8319, "label": "ⁿ" }
]
}
}
}
]
]

View File

@@ -1,8 +1,14 @@
[
[
{ "code": 40, "label": "(" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "code": 47, "label": "/" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 45, "label": "-" }
],
[

View File

@@ -0,0 +1,92 @@
[
[
{ "code": 64, "label": "@" },
{ "code": 35, "label": "#", "popup": {
"main": { "code": 8470, "label": "№" }
} },
{ "code": -801, "label": "currency_slot_1", "popup": {
"main": { "code": -802, "label": "currency_slot_2" },
"relevant": [
{ "code": -806, "label": "currency_slot_6" },
{ "code": -803, "label": "currency_slot_3" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" }
]
} },
{ "code": 37, "label": "%", "popup": {
"main": { "code": 8240, "label": "‰" },
"relevant": [
{ "code": 8453, "label": "℅" }
]
} },
{ "code": 38, "label": "&" },
{ "code": 45, "label": "-", "popup": {
"main": { "code": 95, "label": "_" },
"relevant": [
{ "code": 8212, "label": "—" },
{ "code": 8211, "label": "" },
{ "code": 183, "label": "·" }
]
} },
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 40, "label": "(", "popup": {
"main": { "code": 60, "label": "<" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 41, "label": ")", "popup": {
"main": { "code": 62, "label": ">" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
} },
{ "code": 47, "label": "/" }
],
[
{ "code": 42, "label": "*", "popup": {
"main": { "code": 8224, "label": "†" },
"relevant": [
{ "code": 9733, "label": "★" },
{ "code": 8225, "label": "‡" }
]
} },
{ "code": 171, "label": "«", "popup": {
"main": { "code": 34, "label": "\"" },
"relevant": [
{ "code": 8221, "label": "”" },
{ "code": 8222, "label": "„" },
{ "code": 8220, "label": "“" },
{ "code": 8249, "label": "" }
]
} },
{ "code": 187, "label": "»", "popup": {
"main": { "code": 39, "label": "'" },
"relevant": [
{ "code": 8217, "label": "" },
{ "code": 8218, "label": "" },
{ "code": 8216, "label": "" },
{ "code": 8250, "label": "" }
]
} },
{ "code": 1373, "label": "՝", "popup": {
"main": { "code": 58, "label": ":" }
} },
{ "code": 46, "label": "." },
{ "code": 1372, "label": "՜", "popup": {
"main": { "code": 33, "label": "!" }
} },
{ "code": 1374, "label": "՞", "popup": {
"main": { "code": 63, "label": "?" },
"relevant": [
{ "code": 191, "label": "¿" },
{ "code": 8253, "label": "‽" }
]
} },
{ "code": 1371, "label": "՛" }
]
]

View File

@@ -32,22 +32,42 @@
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 40, "label": "(", "popup": {
"main": { "code":64830, "label": "" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 60, "label": "<" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 41, "label": ")", "popup": {
"main": { "code":64831, "label": "﴿" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 62, "label": ">" },
{ "code": 125, "label": "}" }
]
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(", "popup": {
"main": { "code":64830, "label": "" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 60, "label": "<" },
{ "code": 123, "label": "{" }
]
} },
"rtl": { "code": 41, "label": "(", "popup": {
"main": { "code":64830, "label": "" },
"relevant": [
{ "code": 93, "label": "[" },
{ "code": 62, "label": "<" },
{ "code": 125, "label": "{" }
]
} }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")", "popup": {
"main": { "code":64831, "label": "﴿" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 62, "label": ">" },
{ "code": 125, "label": "}" }
]
} },
"rtl": { "code": 40, "label": ")", "popup": {
"main": { "code":64831, "label": "﴿" },
"relevant": [
{ "code": 91, "label": "]" },
{ "code": 60, "label": ">" },
{ "code": 123, "label": "}" }
]
} }
},
{ "code": 47, "label": "/" }
],
[

View File

@@ -2,12 +2,24 @@
[
{ "code": 8230, "label": "…" },
{ "code": 95, "label": "_" },
{ "code": 91, "label": "[" },
{ "code": 93, "label": "]" },
{ "$": "layout_direction_selector",
"ltr": { "code": 91, "label": "[" },
"rtl": { "code": 93, "label": "[" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 93, "label": "]" },
"rtl": { "code": 91, "label": "]" }
},
{ "code": 94, "label": "^" },
{ "code": 33, "label": "!" },
{ "code": 60, "label": "<" },
{ "code": 62, "label": ">" },
{ "$": "layout_direction_selector",
"ltr": { "code": 60, "label": "<" },
"rtl": { "code": 62, "label": "<" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 62, "label": ">" },
"rtl": { "code": 60, "label": ">" }
},
{ "code": 61, "label": "=" },
{ "code": 38, "label": "&" },
{ "code": 383, "label": "ſ" }
@@ -15,12 +27,24 @@
[
{ "code": 92, "label": "\\" },
{ "code": 47, "label": "/" },
{ "code": 123, "label": "{" },
{ "code": 125, "label": "}" },
{ "$": "layout_direction_selector",
"ltr": { "code": 123, "label": "{" },
"rtl": { "code": 125, "label": "{" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 125, "label": "}" },
"rtl": { "code": 123, "label": "}" }
},
{ "code": 42, "label": "*" },
{ "code": 63, "label": "?" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 64, "label": "@" }

View File

@@ -32,22 +32,42 @@
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 40, "label": "(", "popup": {
"main": { "code":64830, "label": "" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 60, "label": "<" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 41, "label": ")", "popup": {
"main": { "code":64831, "label": "﴿" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 62, "label": ">" },
{ "code": 125, "label": "}" }
]
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(", "popup": {
"main": { "code":64830, "label": "" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 60, "label": "<" },
{ "code": 123, "label": "{" }
]
} },
"rtl": { "code": 41, "label": "(", "popup": {
"main": { "code":64830, "label": "" },
"relevant": [
{ "code": 93, "label": "[" },
{ "code": 62, "label": "<" },
{ "code": 125, "label": "{" }
]
} }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")", "popup": {
"main": { "code":64831, "label": "﴿" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 62, "label": ">" },
{ "code": 125, "label": "}" }
]
} },
"rtl": { "code": 40, "label": ")", "popup": {
"main": { "code":64831, "label": "﴿" },
"relevant": [
{ "code": 91, "label": "]" },
{ "code": 60, "label": ">" },
{ "code": 123, "label": "}" }
]
} }
},
{ "code": 1643, "label": "٫", "popup": {
"main": { "code": 1644, "label": "٬" },
"relevant": [

View File

@@ -31,20 +31,38 @@
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 40, "label": "(", "popup": {
"main": { "code": 60, "label": "<" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 41, "label": ")", "popup": {
"main": { "code": 62, "label": ">" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(", "popup": {
"main": { "code": 60, "label": "<" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
} },
"rtl": { "code": 41, "label": "(", "popup": {
"main": { "code": 62, "label": "<" },
"relevant": [
{ "code": 93, "label": "[" },
{ "code": 125, "label": "{" }
]
} }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")", "popup": {
"main": { "code": 62, "label": ">" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
} },
"rtl": { "code": 40, "label": ")", "popup": {
"main": { "code": 60, "label": ">" },
"relevant": [
{ "code": 91, "label": "]" },
{ "code": 123, "label": "}" }
]
} }
},
{ "code": 47, "label": "/" }
],
[

View File

@@ -43,20 +43,38 @@
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 40, "label": "(", "popup": {
"main": { "code": 60, "label": "<" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 41, "label": ")", "popup": {
"main": { "code": 62, "label": ">" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(", "popup": {
"main": { "code": 60, "label": "<" },
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
} },
"rtl": { "code": 41, "label": "(", "popup": {
"main": { "code": 62, "label": "<" },
"relevant": [
{ "code": 93, "label": "[" },
{ "code": 125, "label": "{" }
]
} }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")", "popup": {
"main": { "code": 62, "label": ">" },
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
} },
"rtl": { "code": 40, "label": ")", "popup": {
"main": { "code": 60, "label": ">" },
"relevant": [
{ "code": 91, "label": "]" },
{ "code": 123, "label": "}" }
]
} }
},
{ "code": 47, "label": "/" }
],
[

View File

@@ -56,12 +56,22 @@
{ "code": 8776, "label": "≈" }
]
} },
{ "code": 123, "label": "{", "popup": {
"main": { "code": 40, "label": "(" }
} },
{ "code": 125, "label": "}", "popup": {
"main": { "code": 41, "label": ")" }
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 123, "label": "{", "popup": {
"main": { "code": 40, "label": "(" }
} },
"rtl": { "code": 125, "label": "{", "popup": {
"main": { "code": 41, "label": "(" }
} }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 125, "label": "}", "popup": {
"main": { "code": 41, "label": ")" }
} },
"rtl": { "code": 123, "label": "}", "popup": {
"main": { "code": 40, "label": ")" }
} }
},
{ "code": 92, "label": "\\" }
],
[
@@ -70,7 +80,13 @@
{ "code": 174, "label": "®" },
{ "code": 8482, "label": "™" },
{ "code": 10003, "label": "✓" },
{ "code": 91, "label": "[" },
{ "code": 93, "label": "]" }
{ "$": "layout_direction_selector",
"ltr": { "code": 91, "label": "[" },
"rtl": { "code": 93, "label": "[" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 93, "label": "]" },
"rtl": { "code": 91, "label": "]" }
}
]
]

View File

@@ -56,12 +56,22 @@
{ "code": 8776, "label": "≈" }
]
} },
{ "code": 123, "label": "{", "popup": {
"main": { "code": 40, "label": "(" }
} },
{ "code": 125, "label": "}", "popup": {
"main": { "code": 41, "label": ")" }
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 123, "label": "{", "popup": {
"main": { "code": 40, "label": "(" }
} },
"rtl": { "code": 125, "label": "{", "popup": {
"main": { "code": 41, "label": "(" }
} }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 125, "label": "}", "popup": {
"main": { "code": 41, "label": ")" }
} },
"rtl": { "code": 123, "label": "}", "popup": {
"main": { "code": 40, "label": ")" }
} }
},
{ "code": 92, "label": "\\" }
],
[
@@ -70,7 +80,13 @@
{ "code": 174, "label": "®" },
{ "code": 8482, "label": "™" },
{ "code": 10003, "label": "✓" },
{ "code": 91, "label": "[" },
{ "code": 93, "label": "]" }
{ "$": "layout_direction_selector",
"ltr": { "code": 91, "label": "[" },
"rtl": { "code": 93, "label": "[" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 93, "label": "]" },
"rtl": { "code": 91, "label": "]" }
}
]
]

View File

@@ -56,12 +56,22 @@
{ "code": 8776, "label": "≈" }
]
} },
{ "code": 123, "label": "{", "popup": {
"main": { "code": 40, "label": "(" }
} },
{ "code": 125, "label": "}", "popup": {
"main": { "code": 41, "label": ")" }
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 123, "label": "{", "popup": {
"main": { "code": 40, "label": "(" }
} },
"rtl": { "code": 125, "label": "{", "popup": {
"main": { "code": 41, "label": "(" }
} }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 125, "label": "}", "popup": {
"main": { "code": 41, "label": ")" }
} },
"rtl": { "code": 123, "label": "}", "popup": {
"main": { "code": 40, "label": ")" }
} }
},
{ "code": 92, "label": "\\" }
],
[
@@ -70,7 +80,13 @@
{ "code": 174, "label": "®" },
{ "code": 8482, "label": "™" },
{ "code": 10003, "label": "✓" },
{ "code": 91, "label": "[" },
{ "code": 93, "label": "]" }
{ "$": "layout_direction_selector",
"ltr": { "code": 91, "label": "[" },
"rtl": { "code": 93, "label": "[" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 93, "label": "]" },
"rtl": { "code": 91, "label": "]" }
}
]
]

View File

@@ -6,24 +6,44 @@
],
[
{ "code": -201, "label": "view_characters", "type": "system_gui" },
{ "code": 60, "label": "<", "popup": {
"relevant": [
{ "code": 171, "label": "«" },
{ "code": 8804, "label": "" },
{ "code": 8249, "label": "" },
{ "code":10216, "label": "" }
]
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 60, "label": "<", "popup": {
"relevant": [
{ "code": 171, "label": "«" },
{ "code": 8804, "label": "" },
{ "code": 8249, "label": "" },
{ "code":10216, "label": "⟨" }
]
} },
"rtl": { "code": 62, "label": "<", "popup": {
"relevant": [
{ "code": 187, "label": "«" },
{ "code": 8805, "label": "≤" },
{ "code": 8250, "label": "" },
{ "code":10217, "label": "⟨" }
]
} }
},
{ "code": -205, "label": "view_numeric_advanced", "type": "system_gui" },
{ "code": 32, "label": "space" },
{ "code": 62, "label": ">", "popup": {
"relevant": [
{ "code":10217, "label": "⟩" },
{ "code": 8250, "label": "" },
{ "code": 8805, "label": "" },
{ "code": 187, "label": "»" }
]
} },
{ "$": "layout_direction_selector",
"ltr": { "code": 62, "label": ">", "popup": {
"relevant": [
{ "code":10217, "label": "" },
{ "code": 8250, "label": "" },
{ "code": 8805, "label": "" },
{ "code": 187, "label": "»" }
]
} },
"rtl": { "code": 60, "label": ">", "popup": {
"relevant": [
{ "code":10216, "label": "⟩" },
{ "code": 8249, "label": "" },
{ "code": 8804, "label": "≥" },
{ "code": 171, "label": "»" }
]
} }
},
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -0,0 +1,17 @@
[
[
{ "code": -203, "label": "view_symbols2", "type": "system_gui" },
{ "code": 0, "type": "placeholder" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],
[
{ "code": -201, "label": "view_characters", "type": "system_gui" },
{ "code": 44, "label": "," },
{ "code": -205, "label": "view_numeric_advanced", "type": "system_gui" },
{ "code": 32, "label": "space" },
{ "code": 1417, "label": "։", "popup": {
"main": { "code": 46, "label": "." }
} },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -2,9 +2,9 @@
"$": "ime.extension.keyboard",
"meta": {
"id": "org.florisboard.localization",
"version": "0.1.0",
"version": "0.2.0",
"title": "Default subtype presets / popup mappings",
"description": "Default subptye presets and popup mappings which are always available.",
"description": "Default subtype presets and popup mappings which are always available.",
"maintainers": [ "patrickgold <patrick@patrickgold.dev>" ],
"license": "apache-2.0"
},
@@ -13,172 +13,66 @@
"org.florisboard.currencysets",
"org.florisboard.layouts"
],
"popupMappings": [
"punctuationRules": [
{
"id": "default",
"authors": [ "patrickgold" ]
},
{
"id": "ar",
"authors": [ "HeiWiper" ]
},
{
"id": "bg",
"authors": [ "iorvethe" ]
},
{
"id": "ca",
"authors": [ "mikelloc" ]
},
{
"id": "ckb",
"authors": [ "GoRaN" ]
},
{
"id": "cs",
"authors": [ "stefan-misik" ]
},
{
"id": "da",
"authors": [ "patrickgold" ]
},
{
"id": "de",
"authors": [ "patrickgold" ]
},
{
"id": "de-DE-neobone",
"authors": [ "ostrya" ]
},
{
"id": "el",
"authors": [ "tsiflimagas" ]
},
{
"id": "en",
"authors": [ "patrickgold" ]
},
{
"id": "eo",
"authors": [ "jeremiah-miller" ]
},
{
"id": "es",
"authors": [ "patrickgold" ]
},
{
"id": "fa",
"authors": [ "PHELAT" ]
},
{
"id": "fi",
"authors": [ "patrickgold" ]
},
{
"id": "fo",
"authors": [ "BinFlush" ]
},
{
"id": "fr",
"authors": [ "patrickgold" ]
},
{
"id": "hr",
"authors": [ "hedidnothingwrong" ]
},
{
"id": "hu",
"authors": [ "zoli111, gabik65" ]
},
{
"id": "is",
"authors": [ "patrickgold" ]
},
{
"id": "it",
"authors": [ "patrickgold" ]
},
{
"id": "iw",
"authors": [ "Antony" ]
},
{
"id": "ja-JP-jis",
"authors": [ "waelwindows" ]
},
{
"id": "ko",
"authors": [ "patrickgold", "Hayleia" ]
},
{
"id": "ku",
"authors": [ "GoRaN" ]
},
{
"id": "lt",
"authors": [ "patrickgold" ]
},
{
"id": "lv",
"authors": [ "patrickgold", "eandersons" ]
},
{
"id": "nb",
"authors": [ "patrickgold" ]
},
{
"id": "nn",
"authors": [ "patrickgold" ]
},
{
"id": "pl",
"authors": [ "Mikołaj Biel" ]
},
{
"id": "pt",
"authors": [ "patrickgold" ]
},
{
"id": "pt-BR",
"authors": [ "rickym7" ]
},
{
"id": "ro",
"authors": [ "bertin0" ]
},
{
"id": "ru",
"authors": [ "williamtheaker", "33kk" ]
},
{
"id": "sk",
"authors": [ "stefan-misik", "majso" ]
},
{
"id": "sr",
"authors": [ "hedidnothingwrong", "GrbavaCigla" ]
},
{
"id": "sv",
"authors": [ "patrickgold" ]
},
{
"id": "tr",
"authors": [ "kisekinopureya", "patrickgold", "dvrnynr" ]
},
{
"id": "uk",
"authors": [ "williamtheaker", "33kk" ]
},
{
"id": "ur-PK",
"authors": [ "mubashir-rehman", "mirfatif" ]
},
{
"id": "vi-VN",
"authors": [ "patrickgold", "Hayleia" ]
"label": "Default",
"symbolsPrecedingAutoSpace": ".,?‽!\"&%)]}»",
"symbolsFollowingAutoSpace": "",
"symbolsPrecedingPhantomSpace": ".,;:?‽!&%)]}»©®™",
"symbolsFollowingPhantomSpace": "¿⸘¡([{",
"symbolsTerminatingSentence": ".?‽!"
}
],
"popupMappings": [
{ "id": "default", "authors": [ "patrickgold" ] },
{ "id": "ar", "authors": [ "HeiWiper" ] },
{ "id": "bg", "authors": [ "iorvethe" ] },
{ "id": "ca", "authors": [ "mikelloc" ] },
{ "id": "ckb", "authors": [ "GoRaN" ] },
{ "id": "cs", "authors": [ "stefan-misik" ] },
{ "id": "da", "authors": [ "patrickgold" ] },
{ "id": "de", "authors": [ "patrickgold" ] },
{ "id": "de-DE-neobone", "authors": [ "ostrya" ] },
{ "id": "el", "authors": [ "tsiflimagas" ] },
{ "id": "en", "authors": [ "patrickgold" ] },
{ "id": "eo", "authors": [ "jeremiah-miller" ] },
{ "id": "es", "authors": [ "patrickgold" ] },
{ "id": "fa", "authors": [ "PHELAT" ] },
{ "id": "fa2", "authors": [ "M-Koushan" ] },
{ "id": "fa3", "authors": [ "SaeID-Rz" ] },
{ "id": "fi", "authors": [ "patrickgold" ] },
{ "id": "fo", "authors": [ "BinFlush" ] },
{ "id": "fr", "authors": [ "patrickgold" ] },
{ "id": "hr", "authors": [ "hedidnothingwrong" ] },
{ "id": "hu", "authors": [ "zoli111, gabik65" ] },
{ "id": "hy", "authors": [ "PJTSearch" ] },
{ "id": "id", "authors": [ "Linerly" ] },
{ "id": "is", "authors": [ "patrickgold" ] },
{ "id": "it", "authors": [ "patrickgold" ] },
{ "id": "iw", "authors": [ "Antony" ] },
{ "id": "ja-JP-jis", "authors": [ "waelwindows" ] },
{ "id": "ko", "authors": [ "patrickgold", "Hayleia" ] },
{ "id": "ku", "authors": [ "GoRaN" ] },
{ "id": "lt", "authors": [ "patrickgold" ] },
{ "id": "lv", "authors": [ "patrickgold", "eandersons" ] },
{ "id": "nb", "authors": [ "patrickgold" ] },
{ "id": "nn", "authors": [ "patrickgold" ] },
{ "id": "pl", "authors": [ "Mikołaj Biel" ] },
{ "id": "pt", "authors": [ "patrickgold" ] },
{ "id": "pt-BR", "authors": [ "rickym7" ] },
{ "id": "ro", "authors": [ "bertin0" ] },
{ "id": "ru", "authors": [ "williamtheaker", "33kk" ] },
{ "id": "rue", "authors": [ "svvvst" ] },
{ "id": "sk", "authors": [ "stefan-misik", "majso" ] },
{ "id": "sr", "authors": [ "hedidnothingwrong", "GrbavaCigla" ] },
{ "id": "sv", "authors": [ "patrickgold" ] },
{ "id": "tr", "authors": [ "kisekinopureya", "patrickgold", "dvrnynr" ] },
{ "id": "uk", "authors": [ "williamtheaker", "33kk", "honsiorovskyi" ] },
{ "id": "uk-cyr-ext", "authors": [ "williamtheaker", "33kk", "honsiorovskyi" ] },
{ "id": "ur-PK", "authors": [ "mubashir-rehman", "mirfatif" ] },
{ "id": "vi-VN", "authors": [ "patrickgold", "Hayleia" ] }
],
"subtypePresets": [
{
"languageTag": "en-US",
@@ -389,6 +283,15 @@
"characters": "org.florisboard.layouts:danish"
}
},
{
"languageTag": "id",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:dollar",
"popupMapping": "org.florisboard.localization:id",
"preferred": {
"characters": "org.florisboard.layouts:qwerty"
}
},
{
"languageTag": "is-IS",
"composer": "org.florisboard.composers:appender",
@@ -419,6 +322,30 @@
"numericRow": "org.florisboard.layouts:persian"
}
},
{
"languageTag": "fa-FA",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:rial",
"popupMapping": "org.florisboard.localization:fa2",
"preferred": {
"characters": "org.florisboard.layouts:persian2",
"symbols": "org.florisboard.layouts:persian",
"symbols2": "org.florisboard.layouts:persian",
"numericRow": "org.florisboard.layouts:persian"
}
},
{
"languageTag": "fa-FA",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:rial",
"popupMapping": "org.florisboard.localization:fa3",
"preferred": {
"characters": "org.florisboard.layouts:persian3",
"symbols": "org.florisboard.layouts:persian",
"symbols2": "org.florisboard.layouts:persian",
"numericRow": "org.florisboard.layouts:western_arabic"
}
},
{
"languageTag": "ar",
"composer": "org.florisboard.composers:appender",
@@ -431,6 +358,15 @@
"numericRow": "org.florisboard.layouts:eastern_arabic"
}
},
{
"languageTag": "az",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:azerbaijani_manat",
"popupMapping": "org.florisboard.localization:tr",
"preferred": {
"characters": "org.florisboard.layouts:azerbaijani"
}
},
{
"languageTag": "hu",
"composer": "org.florisboard.composers:appender",
@@ -458,6 +394,26 @@
"characters": "org.florisboard.layouts:qwertz"
}
},
{
"languageTag": "hy",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:armenian_dram",
"popupMapping": "org.florisboard.localization:hy",
"preferred": {
"characters": "org.florisboard.layouts:western_armenian",
"symbols": "org.florisboard.layouts:armenian"
}
},
{
"languageTag": "hy",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:armenian_dram",
"popupMapping": "org.florisboard.localization:hy",
"preferred": {
"characters": "org.florisboard.layouts:eastern_armenian",
"symbols": "org.florisboard.layouts:armenian"
}
},
{
"languageTag": "ru",
"composer": "org.florisboard.composers:appender",
@@ -467,6 +423,15 @@
"characters": "org.florisboard.layouts:jcuken_russian"
}
},
{
"languageTag": "rue",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:euro",
"popupMapping": "org.florisboard.localization:rue",
"preferred": {
"characters": "org.florisboard.layouts:rusyn"
}
},
{
"languageTag": "uk",
"composer": "org.florisboard.composers:appender",
@@ -647,7 +612,7 @@
},
{
"languageTag": "vi-VN",
"composer": "org.florisboard.composers:basic-telex",
"composer": "org.florisboard.composers:telex",
"currencySet": "org.florisboard.currencysets:vietnamese_dong",
"popupMapping": "org.florisboard.localization:vi-VN",
"preferred": {

View File

@@ -90,7 +90,7 @@
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".ir"},
"main": { "code": -255, "label": ".sa"},
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".edu" },

View File

@@ -18,8 +18,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -91,8 +91,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -11,16 +11,18 @@
]
},
"ی": {
"main": { "code": 1610, "label": "ي" },
"relevant": [
{ "code": 1746, "label": "ے" },
{ "code": 1741, "label": "ۍ" },
{ "code": 1744, "label": "ې" },
{ "code": 1610, "label": "ي" },
{ "code": 1597, "label": "ؽ" }
{ "code": 1744, "label": "ې" }
]
},
"ێ": {
"main": { "code": 1597, "label": "ؽ" }
},
"ﺋ": {
"relevant": [
{ "code": 65163, "label": "ﺋ" },
@@ -118,19 +120,23 @@
"~right": {
"main": { "code": 1567, "label": "؟" },
"relevant": [
{ "code": 64, "label": "@" },
{ "code": 35, "label": "#" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "code": 171, "label": "«" },
{ "code": 187, "label": "»" },
{ "code": 60, "label": "<" },
{ "code": 62, "label": ">" },
{ "code": 1642, "label": "٪" },
{ "code": 35, "label": "#" },
{ "code": 42, "label": "*" },
{ "code": 1563, "label": "؛" },
{ "code": 59, "label": ";" },
{ "code": 58, "label": ":" },
{ "code": 44, "label": "," },
{ "code": 1549, "label": "؍" },
{ "code": 45, "label": "-" },
{ "code": 95, "label": "_" },
{ "code": 1600, "label": "" },
{ "code": 33, "label": "!" },
{ "code": 1548, "label": "،" }
{ "code": 1563, "label": "؛" },
{ "code": 58, "label": ":" },
{ "code": 1549, "label": "؍" },
{ "code": 1643, "label": "٫" },
{ "code": 1548, "label": "،" },
{ "code": 33, "label": "!" }
]
}
},

View File

@@ -88,8 +88,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -106,8 +106,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -85,8 +85,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -2,41 +2,74 @@
"all": {
"α": {
"relevant": [
{ "$": "auto_text_key", "code": 940, "label": "ά" }
{ "$": "case_selector",
"lower": { "code": 940, "label": "ά" },
"upper": { "code": 902, "label": "Ά" }
}
]
},
"ε": {
"relevant": [
{ "$": "auto_text_key", "code": 941, "label": "έ" }
{ "$": "case_selector",
"lower": { "code": 941, "label": "έ" },
"upper": { "code": 904, "label": "Έ" }
}
]
},
"η": {
"relevant": [
{ "$": "auto_text_key", "code": 942, "label": "ή" }
{ "$": "case_selector",
"lower": { "code": 942, "label": "ή" },
"upper": { "code": 905, "label": "Ή" }
}
]
},
"ι": {
"main": { "$": "auto_text_key", "code": 943, "label": "ί" },
"main": { "$": "case_selector",
"lower": { "code": 943, "label": "ί" },
"upper": { "code": 906, "label": "Ί" }
},
"relevant": [
{ "$": "auto_text_key", "code": 912, "label": "ΐ" },
{ "$": "auto_text_key", "code": 970, "label": "ϊ" }
{ "$": "case_selector",
"lower": { "code": 912, "label": "ΐ" },
"upper": { "$": "multi_text_key", "codePoints": [921, 776, 769], "label": "Ϊ́" }
},
{ "$": "case_selector",
"lower": { "code": 970, "label": "ϊ" },
"upper": { "code": 938, "label": "Ϊ" }
}
]
},
"ο": {
"relevant": [
{ "$": "auto_text_key", "code": 972, "label": "ό" }
{ "$": "case_selector",
"lower": { "code": 972, "label": "ό" },
"upper": { "code": 908, "label": "Ό" }
}
]
},
"υ": {
"main": { "$": "auto_text_key", "code": 973, "label": "ύ" },
"main": { "$": "case_selector",
"lower": { "code": 973, "label": "ύ" },
"upper": { "code": 910, "label": "Ύ" }
},
"relevant": [
{ "$": "auto_text_key", "code": 944, "label": "ΰ" },
{ "$": "auto_text_key", "code": 971, "label": "ϋ" }
{ "$": "case_selector",
"lower": { "code": 944, "label": "ΰ" },
"upper": { "$": "multi_text_key", "codePoints": [933, 776, 769], "label": "Ϋ́" }
},
{ "$": "case_selector",
"lower": { "code": 971, "label": "ϋ" },
"upper": { "code": 939, "label": "Ϋ" }
}
]
},
"ω": {
"relevant": [
{ "$": "auto_text_key", "code": 974, "label": "ώ" }
{ "$": "case_selector",
"lower": { "code": 974, "label": "ώ" },
"upper": { "code": 911, "label": "Ώ" }
}
]
},
"~right": {
@@ -52,8 +85,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -80,8 +80,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -63,8 +63,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -88,8 +88,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -8,12 +8,12 @@
]
},
"ا": {
"main": { "code": 1570, "label": "آ"},
"relevant": [
{ "code": 1649, "label": "ٱ" },
{ "code": 1569, "label": "ء" },
{ "code": 1571, "label": "أ" },
{ "code": 1573, "label": "إ" },
{ "code": 1570, "label": "آ" }
{ "code": 1573, "label": "إ" }
]
},
"ه": {

View File

@@ -0,0 +1,99 @@
{
"all": {
"ص": {
"relevant": [
{ "code": 1590, "label": "ض" }
]
},
"half_space": {
"relevant": [
{ "code": 1622, "label": "ٖ" },
{ "code": 1648, "label": "ٰ" },
{ "code": 1619, "label": "ٓ" },
{ "code": 1615, "label": "ُ" },
{ "code": 1616, "label": "ِ" },
{ "code": 1614, "label": "َ" },
{ "code": 1600, "label": "ـ" },
{ "code": 1621, "label": "ٕ" },
{ "code": 1618, "label": "ْ" },
{ "code": 1617, "label": "ّ" },
{ "code": 1612, "label": "ٌ" },
{ "code": 1613, "label": "ٍ" },
{ "code": 1620, "label": "ٔ" }
]
},
"ی": {
"relevant": [
{ "code": 1574, "label": "ئ" },
{ "code": 1610, "label": "ي" },
{ "code": 1746, "label": "ے" }
]
},
"ا": {
"main": { "code": 1570, "label": "آ"},
"relevant": [
{ "code": 1649, "label": "ٱ" },
{ "code": 1569, "label": "ء" },
{ "code": 1571, "label": "أ" },
{ "code": 1573, "label": "إ" }
]
},
"ه": {
"relevant": [
{ "code": 1729, "label": "ہ" },
{ "code": 1728, "label": "ۀ" },
{ "code": 1726, "label": "ھ" }
]
},
"ت": {
"relevant": [
{ "code": 1579, "label": "ث" }
]
},
"ک": {
"relevant": [
{ "code": 1706, "label": "ڪ"}
]
},
"ط": {
"relevant": [
{ "code": 1592, "label": "ظ" }
]
},
"ز": {
"relevant": [
{ "code": 1688, "label": "ژ" }
]
},
"و": {
"relevant": [
{ "code": 1572, "label": "ؤ" }
]
},
"گ": {
"relevant": [
{ "code": 1662, "label": "پ" }
]
},
"~right": {
"main": { "code": 1567, "label": "؟"},
"relevant": [
{ "code": 1563, "label": "؛" },
{ "code": 58, "label": ":"},
{ "code": 33, "label": "!" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".ir"},
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".com" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -0,0 +1,69 @@
{
"all": {
"ی": {
"main": { "code": 1574, "label": "ئ" },
"relevant": [
{ "code": 1610, "label": "ي" },
{ "code": 1746, "label": "ے" }
]
},
"ا": {
"main": { "code": 1570, "label": "آ" },
"relevant": [
{ "code": 1649, "label": "ٱ" },
{ "code": 1569, "label": "ء" },
{ "code": 1571, "label": "أ" },
{ "code": 1573, "label": "إ" }
]
},
"ه": {
"relevant": [
{ "code": 1729, "label": "ہ" },
{ "code": 1728, "label": "ۀ" },
{ "code": 1726, "label": "ھ" }
]
},
"ت": {
"relevant": [
{ "code": 1577, "label": "ة" }
]
},
"ک": {
"relevant": [
{ "code": 1706, "label": "ڪ"}
]
},
"ز": {
"relevant": [
{ "code": 1688, "label": "ژ" }
]
},
"و": {
"relevant": [
{ "code": 1572, "label": "ؤ" }
]
},
"~right": {
"main": { "code": 1611, "label": "ً" },
"relevant": [
{ "code": 1615, "label": "ُ" },
{ "code": 1616, "label": "ِ" },
{ "code": 1614, "label": "َ" },
{ "code": 1617, "label": "ّ" },
{ "code": 1620, "label": "ٔ" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".ir"},
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".com" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -91,8 +91,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -111,8 +111,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -94,8 +94,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -34,8 +34,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -22,6 +22,11 @@
{ "$": "auto_text_key", "code": 337, "label": "ő" }
]
},
"ö": {
"relevant": [
{ "$": "auto_text_key", "code": 337, "label": "ő" }
]
},
"u": {
"relevant": [
{ "$": "auto_text_key", "code": 250, "label": "ú" },
@@ -29,6 +34,11 @@
{ "$": "auto_text_key", "code": 369, "label": "ű" }
]
},
"ü": {
"relevant": [
{ "$": "auto_text_key", "code": 369, "label": "ű" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
@@ -42,8 +52,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
@@ -52,13 +68,13 @@
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"main": { "code": -255, "label": ".hu" },
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".hu" },
{ "code": -255, "label": ".com" },
{ "code": -255, "label": ".net" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
{ "code": -255, "label": ".eu" },
{ "code": -255, "label": ".gov.hu" }
]
}
}

View File

@@ -0,0 +1,41 @@
{
"all": {
"ե": {
"main": { "$": "auto_text_key", "code": 1415, "label": "և" }
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 171, "label": "«" },
{ "code": 187, "label": "»" },
{ "code": 45, "label": "-" },
{ "code": 1373, "label": "՝" },
{ "code": 1371, "label": "՛" },
{ "code": 64, "label": "@" },
{ "code": 46, "label": "." },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "code": 35, "label": "#" },
{ "code": 1372, "label": "՜" },
{ "code": 1374, "label": "՞" },
{ "code": 1415, "label": "և" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".gr" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -0,0 +1,49 @@
{
"all": {
"e": {
"relevant": [
{ "$": "auto_text_key", "code": 234, "label": "ê" },
{ "$": "auto_text_key", "code": 233, "label": "é" },
{ "$": "auto_text_key", "code": 232, "label": "è" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".id" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" },
{ "code": -255, "label": ".co.id"},
{ "code": -255, "label": ".go.id"}
]
}
}
}

View File

@@ -83,8 +83,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -76,8 +76,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -13,8 +13,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -48,8 +48,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -63,7 +63,7 @@
]
},
"s": {
"main": { "$": "auto_text_key", "code": 219, "label": "ș" },
"main": { "$": "auto_text_key", "code": 351, "label": "ş" },
"relevant": [
{ "$": "auto_text_key", "code": 347, "label": "ś" },
{ "$": "auto_text_key", "code": 349, "label": "ŝ" },
@@ -102,8 +102,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -140,8 +140,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -80,8 +80,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -72,8 +72,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -82,8 +82,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -43,8 +43,8 @@
},
"z": {
"relevant": [
{ "$": "auto_text_key", "code": 378, "label": "ź" },
{ "$": "auto_text_key", "code": 380, "label": "ż" }
{ "$": "auto_text_key", "code": 380, "label": "ż" },
{ "$": "auto_text_key", "code": 378, "label": "ź" }
]
},
"~right": {
@@ -60,8 +60,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -81,8 +81,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -81,8 +81,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -52,8 +52,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -23,8 +23,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -0,0 +1,69 @@
{
"all": {
"е": {
"main": { "$": "auto_text_key", "code": 234, "label": "ê" },
"relevant": [{ "$": "auto_text_key", "code": 1105, "label": "ё" }]
},
"у": {
"main": { "$": "auto_text_key", "code": 1263, "label": "ӯ" },
"relevant": [
{ "$": "auto_text_key", "code": 1118, "label": "ў" },
{ "$": "auto_text_key", "code": 1265, "label": "ӱ" },
{ "$": "auto_text_key", "code": 375, "label": "ŷ" }
]
},
"г": {
"main": { "$": "auto_text_key", "code": 1169, "label": "ґ" }
},
"і": {
"main": { "$": "auto_text_key", "code": 1123, "label": "î" },
"relevant": [
{ "$": "auto_text_key", "code": 1123, "label": "ѣ" },
{ "$": "auto_text_key", "code": 1111, "label": "ї" }
]
},
"о": {
"main": { "$": "auto_text_key", "code": 333, "label": "ō" },
"relevant": [{ "$": "auto_text_key", "code": 244, "label": "ô" }]
},
"ь": {
"main": { "$": "auto_text_key", "code": 1098, "label": "ъ" }
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -89,8 +89,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -32,8 +32,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -133,8 +133,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -1,5 +1,8 @@
{
"all": {
"a": {
"main": { "$": "auto_text_key", "code": 226, "label": "â" }
},
"c": {
"main": { "$": "auto_text_key", "code": 231, "label": "ç" }
},
@@ -10,13 +13,19 @@
"main": { "$": "case_selector",
"lower": { "code": 305, "label": "ı" },
"upper": { "code": 73, "label": "I" }
}
},
"relevant": [
{ "$": "auto_text_key", "code": 238, "label": "î" }
]
},
"ı": {
"main": { "$": "case_selector",
"lower": { "code": 105, "label": "i" },
"upper": { "code": 304, "label": "İ" }
}
},
"relevant": [
{ "$": "auto_text_key", "code": 238, "label": "î" }
]
},
"o": {
"main": { "$": "auto_text_key", "code": 246, "label": "ö" }
@@ -25,7 +34,10 @@
"main": { "$": "auto_text_key", "code": 351, "label": "ş" }
},
"u": {
"main": { "$": "auto_text_key", "code": 252, "label": "ü" }
"main": { "$": "auto_text_key", "code": 252, "label": "ü" },
"relevant": [
{ "$": "auto_text_key", "code": 251, "label": "û" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
@@ -40,8 +52,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

View File

@@ -0,0 +1,74 @@
{
"all": {
"е": {
"relevant": [
{ "$": "auto_text_key", "code": 1105, "label": "ё" }
]
},
"у": {
"relevant": [
{ "$": "auto_text_key", "code": 1118, "label": "ў" }
]
},
"г": {
"relevant": [
{ "$": "auto_text_key", "code": 1169, "label": "ґ" }
]
},
"і": {
"relevant": [
{ "$": "auto_text_key", "code": 1111, "label": "ї" },
{ "$": "auto_text_key", "code": 1099, "label": "ы" }
]
},
"є": {
"relevant": [
{ "$": "auto_text_key", "code": 8212, "label": "—" },
{ "$": "auto_text_key", "code": 1101, "label": "э" }
]
},
"ь": {
"relevant": [
{ "$": "auto_text_key", "code": 700, "label": "ʼ" },
{ "$": "auto_text_key", "code": 39, "label": "'" },
{ "$": "auto_text_key", "code": 1098, "label": "ъ" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 38, "label": "&" },
{ "code": 37, "label": "%" },
{ "code": 43, "label": "+" },
{ "code": 34, "label": "\"" },
{ "code": 45, "label": "-" },
{ "code": 58, "label": ":" },
{ "code": 39, "label": "'" },
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".ua" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]
}
}
}

View File

@@ -1,10 +1,26 @@
{
"all": {
"г": {
"relevant": [
{ "$": "auto_text_key", "code": 1169, "label": "ґ" }
]
},
"і": {
"relevant": [
{ "$": "auto_text_key", "code": 1111, "label": "ї" }
]
},
"є": {
"relevant": [
{ "$": "auto_text_key", "code": 8212, "label": "—" }
]
},
"ь": {
"relevant": [
{ "$": "auto_text_key", "code": 700, "label": "ʼ" },
{ "$": "auto_text_key", "code": 39, "label": "'" }
]
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [
@@ -18,8 +34,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }
@@ -31,7 +53,6 @@
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".ua" },
{ "code": -255, "label": ".edu" },
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".net" }
]

View File

@@ -183,7 +183,7 @@
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".ir"},
"main": { "code": -255, "label": ".pk"},
"relevant": [
{ "code": -255, "label": ".gov" },
{ "code": -255, "label": ".edu" },

View File

@@ -40,8 +40,14 @@
{ "code": 64, "label": "@" },
{ "code": 59, "label": ";" },
{ "code": 47, "label": "/" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" },
{ "$": "layout_direction_selector",
"ltr": { "code": 40, "label": "(" },
"rtl": { "code": 41, "label": "(" }
},
{ "$": "layout_direction_selector",
"ltr": { "code": 41, "label": ")" },
"rtl": { "code": 40, "label": ")" }
},
{ "code": 35, "label": "#" },
{ "code": 33, "label": "!" },
{ "code": 63, "label": "?" }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +0,0 @@
[
")",
"}",
"]",
">",
"&",
".",
",",
"?",
"!",
";",
":"
]

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