Compare commits

...

748 Commits

Author SHA1 Message Date
Patrick Goldinger
bc5ed3475c Release v0.4.6 2025-03-04 22:47:39 +01:00
Patrick Goldinger
871ff0acb1 Merge branch 'main' into release/0.4 2025-03-04 22:45:30 +01:00
florisboard-bot
34f8fec2f6 Update translations from Crowdin 2025-03-04 22:39:56 +01:00
npnpatidar
7199fcdf12 Devanagari Script and Hindi Language Layout Added (#2723)
* test commit

* hi-IN popupmappings id added

* basic layout

* heart replaces with space

* code corrected

* lots of other keys added

* all characters have been added

* popmappings rearranged

* some positional change

* * and \ won't popup due to क्ष and  ज्ञ

* ओ औ code correced

* some vovels reordered

* Hindi does not capitalization concept
2025-03-04 22:27:16 +01:00
Lars Mühlbauer
8319f563b9 Add support for switching the subtype on space bar long press (#2781)
* Add initial support for switching the subtype on space bar long press

* Fix keyboard presses behind the header panel

* Fix taps behind sheet

* Extract string ressource and refactor code

* Instant select subtype

* Persist suptype change in prefs
2025-03-04 22:23:24 +01:00
Lars Mühlbauer
45efe52159 Add new screenshot generator and update fastlane images (#2787)
* Add new screenshot generator and update fastlane images

* Update featureGraphic.png to match g-play requirements
2025-03-04 21:46:54 +01:00
Lars Mühlbauer
7a286b932b Update snygg dynamic color scheme on wallpaper change (#2778)
* Update snygg dynamic color scheme on wallpaper change

* Move broadcast receiver handling to FlorisImeService and properly unregister the receiver

* Set systembar color on stylesheet change
2025-03-04 21:08:45 +01:00
Lars Mühlbauer
df3f84e96d Fix text being rendered behind the top app bar (#2758)
* Fix text being rendered behind the top app bar

This commit fixes an issue where the text was rendered
behind the top app bar in the crash dialog activity by
removing the top app bar in the style and adding a top
app bar in the layout XML.

* Fix toolbar rendering messed up in crash dialog screen

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2025-02-14 13:13:44 +01:00
Lars Mühlbauer
4cc2216940 Fix switching back from voice ime (#2684) (#2759)
This commit fixes an issue where the voice ime was
not possible to switch back to FlorisBoard, because
the keyboard subtype was not specified.
2025-02-14 12:23:46 +01:00
Lars Mühlbauer
21fdd31c88 Fix BottomSheetContent drawing behind system nav bar (#2757)
This commit fixes an issue where the BottomSheetContent
was drawn behind the system navigation bar. To fix this
issue, I applied the saveDrawingPadding Modifier to the
AnimatedVisibility. There was a color problem on the
system navigation bar, so I set the background color to
SheetOutOfBoundsBgColorInactive. Now the system nav bar
is colored the right way.
2025-02-14 12:20:13 +01:00
Lars Mühlbauer
53c6cb52ca Fix crash when opening clipboard history (#2756)
This Commit fixes a crash when opening the clipboard history
with a theme which does not provide a sp size for the header
or the clipboard item. The sp value is now saveTimes multiplied
with 1f.
2025-02-14 12:15:39 +01:00
Patrick Goldinger
9b12213b3e Possible fixes for all keys invisible bug (#2743)
* Fix possible race condition in extension manager init

* Fix deprecation warnings in Kotlin contracts

* Fix race condition in KeyboardManagerResources

* Add debug glide.enabled toggle
2025-02-02 22:35:25 +01:00
Patrick Goldinger
659a5062ab Merge pull request #2750 from florisboard/feat/implement-custom-material-you-color
Implement custom material you colors
2025-02-02 20:17:29 +01:00
lm41
086e5f7782 Add new JetPrefColorPicker for the keyboard accent color.
This commit introduces the new color schemes for spoofed
material you themes. The material you themes can now be
used on any android version that is supported by FlorisBoard
and not just on android 12+.
2025-02-02 19:40:04 +01:00
lm41
ae73e64cd2 Add new JetPrefColorPicker for the settings accent color. 2025-02-02 19:35:16 +01:00
lm41
9f5e8cddd5 Add :lib:color package
This package includes a set of material 3 color schemes
and a map of the corresponding colors to the color schemes.
Please visit the packages README.md for information
on how the schemes were created.
2025-02-02 19:30:39 +01:00
Lars Mühlbauer
3724495d4f Remove code duplication in setup screen (#2742)
* Remove code duplication in setup screen

* fixup! Remove code duplication in setup screen
2025-01-16 22:52:25 +01:00
Patrick Goldinger
a146c6f846 Release v0.4.5 2025-01-13 02:10:22 +01:00
Patrick Goldinger
40ad937384 Merge branch 'main' into release/0.4 2025-01-13 02:08:25 +01:00
Patrick Goldinger
15b5dd9e3e Fix issues with all keys invisible detection (#2737) 2025-01-13 02:07:05 +01:00
Patrick Goldinger
8408cb5133 Release v0.4.4 2025-01-13 00:54:07 +01:00
Patrick Goldinger
8b90cdf06e Merge branch 'main' into release/0.4 2025-01-13 00:44:39 +01:00
florisboard-bot
36f06e0b4b Update translations from Crowdin 2025-01-13 00:34:27 +01:00
Patrick Goldinger
eacb5259ec Merge pull request #2736 from florisboard/chore/add-copyright-templates-to-idea
Update copyright to the new copyright holders
2025-01-13 00:30:04 +01:00
Patrick Goldinger
e7a82a3123 Update README.md/LICENSE 2025-01-13 00:22:59 +01:00
Patrick Goldinger
123b3a6d39 Update copyright year and name in all source files 2025-01-13 00:05:38 +01:00
lm41
9531ad4c36 Add copyright templates for usage with android studio and intellij 2025-01-12 23:56:59 +01:00
Lars Mühlbauer
54ed179ead Fix NoSuchMethodError: removeFirst() on android 14 and lower (#2734)
* Fix NoSuchMethodError: removeFirst() on android 14 and lower

* Add RequiredApi annotations to SnyggMaterialYou classes

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2025-01-12 23:25:20 +01:00
Patrick Goldinger
2dc7efd811 Add better detection for all keys visible bug (#2735)
* Add better detection for all keys visible bug

* Remove on purpose fail for extension manager again
2025-01-12 23:23:38 +01:00
Lars Mühlbauer
01d0b02e6d Fix keyboard height calculation on android 15 to match previous android versions (#2722) 2025-01-11 17:31:51 +01:00
Patrick Goldinger
67c083131a Upgrade to Android 15 (#2733) 2025-01-11 17:17:35 +01:00
Lars Mühlbauer
03cde7296e Add option to delete EmojiHistory from settings screen (#2732)
* Add possibility to delete EmojiHistory from settings screen

* Apply review suggestions

* fixup! Apply review suggestions

* Fix stylistic issues
2025-01-11 16:12:23 +01:00
Lars Mühlbauer
32d26bcf80 Add subtypes and installed extensions to debug logs (#2731)
* Add subtypes and installed extensions to debug logs

* Fix debug log output

* Apply suggestion
2025-01-11 15:59:47 +01:00
Lars Mühlbauer
e61a2c6e82 Fix colors in add subtype screen and enhance subtype presets dialog (#2729) 2025-01-11 15:35:55 +01:00
Md. Rifat Hasan Jihan
ce7a97dce6 added Bengali (bn) to non-capitalization group (#2700) 2024-12-01 22:33:02 +01:00
Md. Rifat Hasan Jihan
9f17a1d36c Replace ZWNJ with ZWJ for Bengali 'র‌্য' in keyboard layout (#2696) 2024-12-01 22:32:27 +01:00
Lars Mühlbauer
a248b4f717 Fix the top message in TypingScreen (#2690) 2024-12-01 22:31:26 +01:00
Lars Mühlbauer
c470b792c1 Fix Keyboard height in one-handed mode (#2668) 2024-10-31 15:10:04 +01:00
Lars Mühlbauer
ff5cd1e7c2 Fix smartbar spacing (#2665) 2024-10-31 15:03:01 +01:00
Lars Mühlbauer
32fee44364 Auto clean sensitive clipboard items (#2659)
* Auto clean sensitive clipboard items

* Fix typo :D

* Apply review suggestions
2024-10-25 16:46:08 +02:00
Patrick Goldinger
97edc33d05 Fix NetworkUtils not detecting hostnames with digits correctly (#2660) 2024-10-25 15:16:51 +02:00
Lars Mühlbauer
a89af25eab Improve ExtensionEditScreen (#2656) 2024-10-22 22:47:20 +02:00
Patrick Goldinger
ff01120925 Release v0.4.3 2024-10-21 23:20:13 +02:00
Patrick Goldinger
74b5c845aa Merge branch 'main' into release/0.4 2024-10-21 23:19:26 +02:00
florisboard-bot
66340249d4 Update translations from Crowdin 2024-10-21 23:17:01 +02:00
Lars Mühlbauer
14147ca1b9 Fix migration in clipboard database (#2641)
* Fix migration in clipboard database

* Update database version

* Fix migration from version 3 to version 4
2024-10-21 23:15:24 +02:00
Patrick Goldinger
bdc740637b Fix inline autofill single icon style (#2628) (#2649) 2024-10-21 17:02:36 +02:00
Patrick Goldinger
eb20e80295 Fix state issues in TextKeyboardLayout (popups) (#2647)
* Fix state issues in TextKeyboardLayout (popups)

* Fix utility key not updating correctly (#2648)
2024-10-21 15:34:15 +02:00
Patrick Goldinger
453fb0253a Fix predictive back by removing generic onBackPressedHandler (#2646) 2024-10-19 15:13:35 +02:00
Lucas Sanginetto
13fc7679a2 Fix incorrect bracket labels in IPA symbols layout (#2644) 2024-10-19 11:26:25 +02:00
Patrick Goldinger
2421d13038 Update ROADMAP.md (#2639) 2024-10-18 00:34:15 +02:00
Patrick Goldinger
ddc4f7f1ba Release v0.4.2 2024-10-17 19:12:13 +02:00
Patrick Goldinger
afea8c721f Merge branch 'main' into release/0.4 2024-10-17 19:10:49 +02:00
florisboard-bot
7dedfd4f7a Update translations from Crowdin 2024-10-17 19:07:32 +02:00
Patrick Goldinger
ef37194900 Disable compose strong skipping mode (#2637) 2024-10-17 16:51:02 +02:00
Lars Mühlbauer
58134b1ceb Add fix for sensitive clipboard suggestions (#2635) 2024-10-16 23:17:54 +02:00
Lars Mühlbauer
53cfbad404 Clipboard History enhancements (#2631)
* Hide sensitive clip data in clipboard history

* Add is remoteDevice flag

* Do not link password length to displayed characters

* Add backspace in clipboard history (#2615)

* Use ClipboardItem level function for the obfuscation of the text

* Move the backspace button to the header bar

* Adjust innerHeight to match the full layout

* Use KeyboardLikeButton instead of FlorisIconButtonWithInnerPadding
2024-10-14 19:31:37 +02:00
Patrick Goldinger
9cffcea246 Release v0.4.1 2024-10-10 20:53:19 +02:00
Patrick Goldinger
5acf80db0f Merge branch 'main' into release/0.4 2024-10-10 16:03:17 +02:00
florisboard-bot
d6f724e518 Update translations from Crowdin 2024-10-10 16:00:04 +02:00
Patrick Goldinger
6c4aa36b06 Update Crowdin configuration and workflow 2024-10-10 15:54:48 +02:00
Patrick Goldinger
edc38b6c2c Fix keyboard key size not properly updating (#2625) 2024-10-10 14:48:50 +02:00
Patrick Goldinger
891a2c6bac Update README.md 2024-10-09 15:35:16 +02:00
Patrick Goldinger
229237153b Add new release configs for Obtainium 2024-10-09 15:35:16 +02:00
Patrick Goldinger
290fbb5239 Merge pull request #2613 from florisboard/rework/inline-autofill-impl
Rework inline autofill suggestions from password managers
2024-10-08 21:59:43 +02:00
Patrick Goldinger
409d4f9348 Fix theme editor state bugs (#2620)
* Fix emoji history header not using theme style

* Fix extension editor component list state not being updated
2024-10-06 10:34:26 +02:00
Patrick Goldinger
82938cda5b Fix emojis with differing meta data not being seen as identical (#2617) 2024-10-05 14:48:26 +02:00
Patrick Goldinger
f7b0a30271 Rework Smartbar layout implementation & Remove Smartbar shared auto expand 2024-10-02 16:46:30 +02:00
Patrick Goldinger
575f359a85 Fix inline autofill service potential concurrent modification exception 2024-10-01 01:15:17 +02:00
Patrick Goldinger
22591163b3 Improve state handling for inline autofill suggestions 2024-10-01 00:30:20 +02:00
Patrick Goldinger
8104ae60ca Add inline autofill debug overlay 2024-09-30 22:34:04 +02:00
Patrick Goldinger
165b682732 Rework inline autofill UI implementation 2024-09-30 21:36:54 +02:00
Patrick Goldinger
eb770fac6c Merge pull request #2611 from florisboard/rework/emoji-history
Major rework of emoji history
2024-09-30 00:58:02 +02:00
Patrick Goldinger
39c27426a4 Add ability to manually reorder emojis in history (#1975) 2024-09-29 14:29:59 +02:00
Patrick Goldinger
228d5055cc Add ability to pin emojis in emoji history (#2273) 2024-09-29 14:05:57 +02:00
Patrick Goldinger
b400e04560 Rewrite emoji history logic and data class 2024-09-28 19:35:12 +02:00
Patrick Goldinger
27c1bbf039 Fix emoji history update bug if items is max size (#2129) 2024-09-28 15:32:10 +02:00
Patrick Goldinger
f61b655f7d Add emoji history group and enable toggle (#1990) 2024-09-28 15:19:30 +02:00
Patrick Goldinger
f82af63e97 Merge pull request #2606 from florisboard/rework/emoji-suggestions
Major rework of emoji suggestions
2024-09-28 14:17:36 +02:00
Patrick Goldinger
0fbd950f6e Change default value of show emoji name to false 2024-09-28 13:41:53 +02:00
Patrick Goldinger
e97b5f54ac Update emoji data to CLDR 45 (#2607) 2024-09-27 23:28:47 +02:00
Patrick Goldinger
b611360dd5 Add emoji acceptance updates history toggle 2024-09-27 19:37:12 +02:00
Patrick Goldinger
1b9d260020 Add emoji name visibility toggle 2024-09-27 19:24:28 +02:00
Patrick Goldinger
d74fe62bc0 Fix emoji suggestions failing for non-default skin-tones (#2604) 2024-09-27 19:04:09 +02:00
Patrick Goldinger
fe6f61a282 Rework emoji suggestions prefs 2024-09-27 18:32:16 +02:00
Senthil Vignesh Kumar
8b4239d9be Added Tamil to layout extension config (#2514)
* adding tamil to characters

* Author name fixed
2024-09-24 02:32:37 +02:00
Patrick Goldinger
a0c7cf2794 Upgrade to Kotlin 2.0 (#2597) 2024-09-24 01:59:37 +02:00
Patrick Goldinger
7480d14a0f Upgrade Compose to 1.7 & Upgrade other deps (#2596)
* Upgrade dependencies

* Code base deprecation cleanup
2024-09-24 00:38:51 +02:00
Kevin
7274228a46 Update quick action reordering based on row (#2592) 2024-09-23 14:58:54 +02:00
Patrick Goldinger
a38f6a2c76 Fix utility key action not correctly applied (#2591) 2024-09-23 13:59:04 +02:00
Krzysztof Kozyra
eda6c09538 Add delete subtype on long-press (#2580)
* add delete subtype feature

* Delete dialog switch from AlertDialog.Builder (unstyled) to JetPrefAlertDialog() to match rest of the ui

* Rework code and add new changes, add translations for subtype delete dialog

* Fix: when dialog is open and screen is rotated app crashes

* Remove translations due to contribution guidelines

* Add english translation so that the project can be built again ;)

* Revert spacing in values-ru/strings.xml

---------

Co-authored-by: lm41 <lm41@lm41.xyz>
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-09-22 22:50:49 +02:00
Patrick Goldinger
9e42d16cb0 Add workflow for automatically rejecting translation updates (#2588) 2024-09-22 22:30:16 +02:00
Lars Mühlbauer
11ba51c354 Remove placeholder suggestions (#2572) 2024-09-22 14:50:55 +02:00
Kevin
51f5196b8a Fix incognito icon messing up landscape input height (#2584) 2024-09-22 14:48:21 +02:00
Lars Mühlbauer
56bbe9d13c Update clipboard backup and restore behavior (#2547)
* Change Clipboard History Checkbox to TriStateCheckbox

* Fix history import error when files are already in ClipboardFileStorage

* Ahhhh yes, the nitpicks `:DD`

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

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-09-18 23:47:38 +02:00
Lars Mühlbauer
4d1ae52dc0 Localize debug log screen and add option for preformatted exporting (#2561)
* Add Button for copying the formatted debug log for GitHub and localize ExportDebugLogScreen

* Add review suggestions

* Ahh yes, we love to nitpick
2024-09-18 23:17:59 +02:00
Lars Mühlbauer
1e1916194b Remove trailing comma to comply with the JSON spec (#2560) 2024-09-18 21:59:40 +02:00
Patrick Goldinger
80fb20885b Release v0.4.0 2024-09-18 18:26:47 +02:00
Patrick Goldinger
bae3c8ec9d Fix Rust Cargo.lock file getting rewritten during build (#2568) 2024-09-18 18:25:04 +02:00
Patrick Goldinger
9ff7d86a8d Add hint to find_program for Rust discovery (#2567) 2024-09-18 16:56:20 +02:00
Patrick Goldinger
89ab0731d2 Add Cargo.lock files to VCS (#2566) 2024-09-18 07:23:24 +02:00
Patrick Goldinger
887a75a482 Rework version name handling in Gradle (#2565) 2024-09-18 05:43:48 +02:00
Patrick Goldinger
e52bea2456 Rename master to main & Update workflows (#2564)
* Update workflows to main branch

* Remove OSS plugin comment (is not used anymore)
2024-09-18 04:25:11 +02:00
Patrick Goldinger
2171e16346 Release v0.4.0-rc02 2024-09-02 22:23:40 +02:00
Lars Mühlbauer
566b6fbae3 Fix incorrect drawing behavior with display cutouts (#2533)
* Fix incorrect drawing behavior with display cutouts

* Replace old conditional logic with new function
2024-09-02 22:20:03 +02:00
Book-reader
5215227793 Fix incorrect addons store url (.com -> .org) (#2535) 2024-08-28 20:43:27 +02:00
Patrick Goldinger
671f97eddb Release v0.4.0-rc01 2024-08-23 15:59:55 +02:00
Patrick Goldinger
b6c9469826 Adjust gitignore for release.sh script 2024-08-23 14:01:35 +02:00
Lars Mühlbauer
77e4414467 Move FlorisCopyToClipboardActivity to ime.clipboard (#2531)
* Move FlorisCopyToClipboardActivity to `ime.clipboard`

* Fix image alignment
2024-08-21 21:57:54 +02:00
Lars Mühlbauer
db85e05714 Disable hinted number row toggle if number row is enabled (#2532) 2024-08-21 21:22:09 +02:00
Lars Mühlbauer
51890c93d4 Fix transparent navigation bar color on older api levels (#2529) 2024-08-21 20:45:28 +02:00
Lars Mühlbauer
1f16ac2c3b Update README.md to the current status (#2528)
* Update README.md

* Apply suggestions from code review

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

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-08-13 21:33:37 +02:00
Lars Mühlbauer
199211fdbf Switch to sliding navigation animation (#2527) 2024-08-13 21:13:11 +02:00
Lars Mühlbauer
c5ee414ec6 Remove preference category from ExtensionHomeScreen (#2525) 2024-08-13 02:15:25 +02:00
Patrick Goldinger
f1c5b1802b Release v0.4.0-beta03 2024-08-10 02:47:31 +02:00
Patrick Goldinger
0450c8c7a1 Fix null ptr exception in intent handling 2024-08-10 02:47:09 +02:00
florisboard-bot
6da6da74fc Update translations from Crowdin 2024-08-07 02:16:08 +02:00
Lars Mühlbauer
d7fca0aad1 Open subtype preset dialog when a new subtype is added (#2521)
* Open subtype preset dialog when a new subtype is added

* Update addons store url in build config
2024-08-07 02:13:07 +02:00
Patrick Goldinger
1af519e01d Update to Gradle 8.7 and AGP 8.5.1 (#2520) 2024-08-07 00:01:04 +02:00
Lars Mühlbauer
989d2884b1 Fix backspace icon (#2518) 2024-08-06 03:19:29 +02:00
Lars Mühlbauer
d137155ab0 Add CheckUpdatesScreen (#2509) 2024-07-15 19:12:16 +02:00
Patrick Goldinger
270ab4fe5f Add deep link support for UI (#2508) 2024-07-15 18:22:05 +02:00
klaurence
be4cd4d897 Change files of Udmurt subtype (#2445)
* Update extension.json

* Update udmurt_compact.json

* Update udmurt_compact.json
2024-07-08 03:48:22 +02:00
JP O'Neill
e46d53291b add support for the layout colemak-dhm (#2357)
Co-authored-by: JP O'Neill <oneilljp@proton.me>
2024-07-08 03:37:36 +02:00
Victor B
8292f9d4cc Add ЈЦУКЕН interslavic keyboard layout (#2354) 2024-07-08 03:37:07 +02:00
Thanh, H
192412b6dd Improve Vietnamese Telex keyboard (#2259)
* Init Full Telex

* Add Telex Rule for a__

* Add a__, ă__, â__ rule

* Update ô, ơ, ư, iê without sound

* Add ơ, iê, uyê. yê without sound

* Add ăc, ăm

* Add êm

* Add ăn

* Update ô

* Improve Vietnamese

* Add "ưc"

* Special case: "gi" + vowel + tone

* Special case: "ghi" + tone + "ê"

* Special case: "gi" + "a, u" + "tone"

* Add change tone feature: "áf" -> "à"

* Add tone remove for iê case
2024-07-08 03:23:14 +02:00
GasparAM
a7f8980d35 Added Armenian alternative phonetic layout (#2171) 2024-07-08 03:18:55 +02:00
moonbeamcelery
f5d80a5818 CJK keyboard adjustments for better Chinese input convenience (#2142)
* CJK keyboard fixes, see expanded message:

- fix full-width comma
- add () to first symbol screen popups
- merge postal sign with # popups
- add = to + popup
- add full-width = to half-width popup
- fix half-width <> and single guillemets ‹›
- add check mark to square root symbol popup
- Add [] to popups
- Add pinyin characters in popup mapping

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* fix: issue with brackets, ü, and add cjk popup to Chinese preset

---------

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>
2024-07-08 03:16:36 +02:00
Patrick Goldinger
d9b940f4f3 Add possible detection for "All keys invisible" bug (#2501) 2024-07-08 02:38:21 +02:00
Lars Mühlbauer
d86fc13cff Remove material2 dependency (#2500)
* remove material2

* fix icon rotation in smartbar

* add FB icon for Android Studio's NewUI

* Add new button styling option for clipboard history view
replace one hand mode icon

* apply review suggestions

* ah yes, the trailing commas
2024-07-08 01:54:29 +02:00
Patrick Goldinger
5b7727b884 Merge pull request #2499 from florisboard/refactor/move-lib-snygg
Move `lib.snygg` to separate module
2024-07-05 20:49:19 +02:00
Patrick Goldinger
b0649b1b7e Move lib.snygg to separate module 2024-07-05 19:43:00 +02:00
Patrick Goldinger
6244198795 Rework enum display string strategy
Preparation for further lib de-entanglement
2024-07-05 17:56:29 +02:00
Patrick Goldinger
bd9f7750aa Move lib.android to separate module (#2498) 2024-07-05 15:59:37 +02:00
Patrick Goldinger
c909d3ad7d Merge pull request #2473 from florisboard/feat/addons-support
Add addons support
2024-07-04 19:31:11 +02:00
lm41
736411e4f3 change hardcoded uri build config uri 2024-07-04 19:21:18 +02:00
lm41
9c7d980b3b localize addon manager 2024-07-04 18:47:09 +02:00
lm41
4d04eb1bb5 update ROADMAP.md 2024-06-30 17:54:11 +02:00
lm41
68c55d66be add better one hand mode icon 2024-06-28 12:40:16 +02:00
lm41
e1550d813b Remove AssetManager and switch to extension functions 2024-06-26 20:45:01 +02:00
lm41
f780ef0213 localize ExtensionValidation 2024-06-24 21:35:15 +02:00
lm41
025620a262 add FLADDONS_*** prefix to BuildConfig fields 2024-06-23 21:41:04 +02:00
lm41
4b83c907c3 simplify code 2024-06-23 19:43:51 +02:00
lm41
5542a131b9 Update UX for managing Extensions 2024-06-23 14:03:17 +02:00
kuroya
eb50498890 Add Diktor layout (#2495)
* Add Diktor layout

* change tab to spaces
2024-06-22 13:58:48 +02:00
Lars Mühlbauer
e6a408fbc0 Remove deprecated swipe-able API and switch to M3 ModalBottomSheet (#2496) 2024-06-22 13:50:14 +02:00
Lars Mühlbauer
9d76b684be Fix suggestion engine selection crash (#2492)
* fix suggestion engine selection crash

* replace rtl modifier with auto mirrored icon

* remove unnecessary OptIn annotation
2024-06-22 13:38:06 +02:00
lm41
b97cc52958 fix url encoding 2024-06-13 19:35:01 +02:00
lm41
aac7134433 add funktion to create an extension update url 2024-06-05 16:31:40 +02:00
Patrick Goldinger
f1d60d9958 Add barebones implementation for addons screen 2024-06-03 15:55:59 +02:00
lm41
e520a9c335 Prevent file/path name max length attacks 2024-06-02 13:55:39 +02:00
lm41
30294b02b4 Prevent large file size attacks by limiting the max file size to 100MB 2024-06-02 00:58:44 +02:00
Patrick Goldinger
f1bdf216fc Add error condition for failing octet-streams 2024-06-02 00:19:28 +02:00
lm41
82d43a53cc prevent zip-slip when unpacking an extension 2024-06-01 21:42:56 +02:00
Patrick Goldinger
c51a787ac4 Fix import extension intents for Firefox 2024-06-01 21:11:23 +02:00
Lars Mühlbauer
f116e20829 Remove systemuicontroller and switch to view apis (#2486) 2024-06-01 12:27:06 +02:00
lm41
baf2cbcd13 Add share import handler for .flex files 2024-05-31 18:01:03 +02:00
lm41
1edb90b0f7 change flex file importer mimetype to application/vnd.florisboard.extension+zip 2024-05-31 14:31:19 +02:00
Lars Mühlbauer
4c0c3f52e7 Smartbar enhancements (#2477)
* fix incorrect smartbar paste button state

* Add incognito mode indicator in Smartbar

* apply suggestions
2024-05-29 22:49:38 +02:00
Md. Rifat Hasan Jihan
d23575375d Updated bn-BD layout with the latest Unijoy layout (#2417)
and refined the popup keys
2024-05-29 07:51:09 +02:00
Lars Mühlbauer
e95bbf5192 Fix fullscreen input mode in portrait orientation (#2475) 2024-05-29 07:42:07 +02:00
Patrick Goldinger
0a4a4418ca Revamp theme settings screen 2024-05-13 01:53:28 +02:00
Patrick Goldinger
2c653853e2 Add basic support for importing flex files from the file explorer 2024-05-13 00:30:18 +02:00
Lars Mühlbauer
6f169997e9 Migrate Settings UI to Material 3 (#2467)
* implement material3 for the settings ui

* fix chip colors

* fix statusbar color

* fix aboutlibraries color

* fix alignment of subcheckboxen

* fix wrong card colors

* Update cornershape of the dropdown menu

* update ScrollableModifiers to material 3

* better card and background colors

* update jetpref

* change contrast of outlined cards

* apply suggestions

* implement suggestions

* add corners on text background in the theme editor

* apply the systembar color for the navbar

* set material you as default on android 12+

* fix card content padding

* Fix status bar color not adapting to navbar color state

* update jetpref dependency to 0.2.0-beta01

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-05-08 00:29:42 +02:00
Patrick Goldinger
f2e76cc72a Fix emoji suggestion logic (#2462)
* Rework emoji suggestion (#2460)

* Apply suggestions from code review

* Fix emoji suggestions caring about capitalization
2024-05-03 20:37:06 +02:00
Lars Mühlbauer
3da59cc94b Add clipboard history to backup (#2458)
* Implement backup/restore clipboard history

* Fix duplicate clipboard items when merging the same archive multiple times

* Apply suggestions

* Update UI

* Implement backup of media clipboard history items.

* Implement restore and add strings; apply suggestions

* change from popBackStack() to navigateUp()
2024-04-29 21:14:06 +02:00
Patrick Goldinger
cf7f6f5fe2 Release v0.4.0-beta02 2024-04-20 17:41:22 +02:00
Lars Mühlbauer
7724b07a75 Fix missing beta variant build issue (#2450) 2024-04-20 16:52:56 +02:00
Patrick Goldinger
30750d7842 Merge pull request #2448 from florisboard/fix-material-you-colors
Add new Material You surface colors
2024-04-20 16:24:19 +02:00
Kevin
7351a8bfa9 Implement smooth scrollbar in emoji palette (#2446)
* implement smooth scrollbar

* Code style and function visibility adjustments

* Apply suggestions from code review

Formatting

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
Co-authored-by: Lars Mühlbauer <59062169+lm41@users.noreply.github.com>

* Update app/src/main/kotlin/dev/patrickgold/florisboard/lib/compose/ScrollableModifiers.kt

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

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
Co-authored-by: Lars Mühlbauer <59062169+lm41@users.noreply.github.com>
2024-04-19 12:45:35 +02:00
Patrick Goldinger
7df9a93cb9 Fix issue with auto-mirroring of dropdown-like buttons 2024-04-19 12:42:56 +02:00
Patrick Goldinger
522f9a8153 Add new Material You surface colors
The following color names are now available:
- surfaceBright
- surfaceDim
- surfaceContainer
- surfaceContainerHigh
- surfaceContainerHighest
- surfaceContainerLow
- surfaceContainerLowest

These colors have replaced the color name "surface", which has been removed.

See section "Surfaces" in the blog entry https://material.io/blog/material-3-compose-1-2 for more info
2024-04-19 12:42:22 +02:00
Patrick Goldinger
5bff051d41 Fix FlorisDropdownMenu arrows being inverse in direction 2024-04-16 21:30:35 +02:00
Patrick Goldinger
0167e1231f Merge pull request #2439 from florisboard/switch-to-rust
Switch native code to Rust
2024-04-07 20:29:31 +02:00
Patrick Goldinger
97bca076e2 Fix Rust toolchain locating issues 2024-04-07 16:26:39 +02:00
Patrick Goldinger
83ec842196 Update CONTRIBUTING.md 2024-04-07 15:23:41 +02:00
Lars Mühlbauer
9c25b7f7a3 Switch to ImageVector icons (#2432)
* Remove (most) drawables and refactor codebase to use androidx.material.icons instead

* use ImageVector for ButtonBar

* use the new vectorRessource function instead of jeticon

* resolve build error

* Switch to rc jetpref

* Apply suggestions
2024-04-07 13:40:22 +02:00
Patrick Goldinger
4d78110a56 Update ROADMAP.md 2024-04-07 11:47:16 +02:00
Patrick Goldinger
2b1dd31ad7 Upgrade Gradle to 8.4 / Upgrade AGP to 8.3.1 2024-04-05 02:11:26 +02:00
Patrick Goldinger
c5d1d3b31e Add Rust build support 2024-04-05 01:35:04 +02:00
Patrick Goldinger
c198e8b376 Remove cpp native code from app 2024-04-04 17:48:52 +02:00
Patrick Goldinger
c5e7fea8f2 Remove florisboard/nlp submodule 2024-04-04 17:46:24 +02:00
Patrick Goldinger
397ef1a150 Add emoji data for most important languages (#2437) 2024-04-03 17:02:18 +02:00
Siddhesh Naik
bdd8f660c5 Add Emoji Suggestions for a More Expressive User Experience (#2385)
* Add Emoji Suggestions for a More Expressive User Experience

- Implement EmojiSuggestionProvider:
  - Manages emoji suggestion tasks, including initialization and maintenance of supported emojis.
  - Generates and returns suggestions based on user input and preferences.
- Updates in NlpManager to Include Emoji Suggestions:
  - Adds emoji suggestions when applicable and available.
- Create Custom EmojiSuggestionCandidate Class:
  - Encapsulates individual emoji suggestions for seamless integration.

Future Actions:
- Introduce Espresso tests in Florisboard to validate the emoji suggestion flow.

* Fix review comments

* Addressed review comments

- Added logic to dynamically get the locale file.
- Currently only supports English as related files are added.
- To support other locales in future, we can just add the related file.
- Added en.txt and en_US.txt and updated root.txt to match emojicon 44.1
  version.
2024-04-03 16:43:17 +02:00
Patrick Goldinger
632c4a7134 Merge pull request #2422 from florisboard/fix-clipboard-history-large-item-handling
Fix huge clipboard text items causing clipboard history crash
2024-03-23 15:15:23 +01:00
Patrick Goldinger
43e618333a Fix huge clipboard text items causing clipboard history crash (#2420) 2024-03-15 23:55:49 +01:00
Patrick Goldinger
6e1c7716dc Add generated schema 2 of clipboard database 2024-03-15 19:43:55 +01:00
Patrick Goldinger
b2a1e82963 Release v0.4.0-beta01 2024-03-10 23:09:01 +01:00
florisboard-bot
0dd1f90c83 Update translations from Crowdin 2024-03-10 22:59:09 +01:00
Lars Mühlbauer
22b7a675e4 Modularize lib.kotlin (#2404)
* extract dev.patrickgold.florisboard.lib.kotlin to org.florisboard.lib.kotlin

* apply review suggestions
2024-03-07 04:57:31 +01:00
Lars Mühlbauer
74dd67642c Fix random rotated images in threema (#2369)
* fix random rotated images in threema

* add filter for the projection

* do not filter only for orientation request but also for every other column

* Apply the suggestion

* get the orientation of the image on insert
2024-03-07 00:46:36 +01:00
Patrick Goldinger
44f0c9cd89 Merge pull request #2397 from vorgoron/feature/udmurt-layout
Add Udmurt layouts.
2024-02-29 17:13:19 +01:00
Lars Mühlbauer
28fdb423b4 Fix #2309, #2134, #2112, #2378 and some deprecation warnings (#2388)
* emoji history visibility when locked fix (#2309)

* Add POST_NOTIFICATIONS permission

* remove deprecation warning

* add better naming for readability

* rename QabType to QuickActionBarType for better readability

* add smartbar vibrations (#2134)

* add share to clipboard

* remove strings

* Add Notification permission to startup menu (#2378)

To display Notifications on Android 13+ the app nust request permission to do so.

* remove deprecation warnings (use defaultDeserializer instead of default)

* Rework NotificationPermissionState handeling on Android 13+.
If the permission is NOT_SET (the user installed the app when the permission wasn't necessary), restart the SetupScreen or add this option to the SetupScreen.
If the permission was granted or denied, the user will not be asked again even if he revokes the permission later in the settings.

* Add comments/docs to the NotificationSetup code

* Revert "remove strings"

This reverts commit ee8a62d647.

* fix crash when InputFeedbackManager is not initialized

* apply the usual formatting nitpicks

* Add the bottom sheet to CopyToClipboardActivity

* add strings

* reformat file

* fix resource context not initialized error

* apply the patch of patrick@patrickgold.dev;
Enhance the bottom sheet with swipe gestures;

* Update app/src/main/kotlin/dev/patrickgold/florisboard/FlorisCopyToClipboardActivity.kt

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

* Update app/src/main/res/values/themes.xml

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

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2024-02-29 16:41:23 +01:00
Grigory Grigorev
de169e9d0d Add udmurt layouts 2024-02-18 19:30:28 +04:00
Patrick Goldinger
ffbe7696a4 Merge pull request #2396 from florisboard/upgrade-project-dependencies
Upgrade project dependencies
2024-02-15 23:08:18 +01:00
Patrick Goldinger
57254e0ebe Upgrade about library and fix crash in third-party licenses screen 2024-02-15 03:16:28 +01:00
Patrick Goldinger
4b671b5794 Fix additional Kotlin migration issues 2024-02-15 02:39:47 +01:00
Patrick Goldinger
9cd413f2f3 Fix Android API level issues and suppress compose material import lints 2024-02-15 02:36:13 +01:00
Patrick Goldinger
777bf48b50 Fix usage of deprecated compose API 2024-02-15 02:32:21 +01:00
Patrick Goldinger
11d4ea206d Upgrade to Kotlin's new .entries shorthand for enums 2024-02-15 02:18:15 +01:00
Patrick Goldinger
8e7311ea01 Upgrade Kotlin to 1.9.22 & Upgrade project dependencies 2024-02-15 01:56:40 +01:00
Siddhesh Naik
e63186bebc Refine Clipboard Suggestion Validation to Prevent Empty and Invalid Items (#2387)
* Refine Clipboard Suggestion Validation to Prevent Empty and Invalid Items

Summary:
- This PR addresses an issue where empty or invalid clipboard items that
  could lead to incorrect suggestions.
- It introduces validation logic to ensure only meaningful content is suggested.

Context:
- The issue was observed when apps like KDE Connect added empty or special
  character-only items to the clipboard.
- The ClipboardSuggestionProvider previously lacked validation for such cases.

Changes:
- Added validation for empty clipboard items.
- Enhanced validation to handle special characters (newlines, tabs).
- Introduced private methods and constants for improved readability and maintainability.

* Update the validation with Regex
2024-02-06 04:54:48 +01:00
inson1
17ca0c1cb1 Update year in Copyright (#2391) 2024-02-04 18:59:49 +01:00
Patrick Goldinger
c9df7a9f49 Merge pull request #2372 from lm41/add-spacebar-character
Implement option to cycle throu the capitalization modes and add option to set spacebar to the spacebar character
2024-01-13 16:35:55 +01:00
lm41
0e9963bd3b refactor CapitalizationBehavior to use CapitalizationBehavior enum and resolve the requested changes 2024-01-13 15:31:25 +01:00
lm41
2cde597be6 add option to cycle through the captitalization cycle 2024-01-13 11:21:43 +01:00
Patrick Goldinger
5829ff5d07 Merge pull request #2371 from lm41/fix-wrong-primary-clipboard-entry-accessibility
fix primary clipboard entry accessible while phone is locked
2024-01-13 11:02:14 +01:00
Patrick Goldinger
9a7360bfee Merge pull request #2370 from lm41/fix-pinned-items-getting-unpinned
fix pinned items getting unpinned when copying the same content again
2024-01-13 10:56:03 +01:00
lm41
2d42ed1c06 add the option to select the spacebar character 2024-01-13 06:38:38 +01:00
lm41
031823c81c fix primary clipboard entry accessible while phone is locked 2024-01-13 03:51:29 +01:00
lm41
5b8b73ff16 fix pinned items getting unpinned when copying the same content again 2024-01-13 03:13:13 +01:00
Patrick Goldinger
80541095fd Merge pull request #2366 from lm41/issue-form
[Meta]: Switch to issue forms
2024-01-12 08:46:15 +01:00
lm41
ed7861ec12 Add issue forms 2024-01-12 02:04:58 +01:00
Patrick Goldinger
f6a1a091b5 Merge pull request #2364 from lm41/monochrome-icons
Add the monochrome icon variants
2024-01-12 00:13:26 +01:00
lm41
6d7bbc2df7 Add the monochrome icon variants 2024-01-10 23:15:56 +01:00
Patrick Goldinger
f7b65f788f Upgrade to Kotlin 1.9.21 2023-12-25 22:56:31 +01:00
Patrick Goldinger
af282693c8 Upgrade AGP to 8.2.0 & Add support for Android library modules 2023-12-25 19:50:04 +01:00
Patrick Goldinger
5bb7c6f786 Release v0.4.0-alpha06 2023-12-23 10:49:12 +01:00
Patrick Goldinger
7e1bce2cea Fix IME enabled/selected checker failing on API 34+ (#2344) 2023-12-23 10:34:09 +01:00
Patrick Goldinger
1c873e4026 Release v0.4.0-alpha05 2023-12-23 00:18:37 +01:00
Patrick Goldinger
964f5d38e5 Update texts in Settings 2023-12-23 00:08:41 +01:00
florisboard-bot
b3c0cf094a Update translations from Crowdin 2023-12-22 22:44:49 +01:00
János Benjamin Antal
6c7a4a6fc0 Add main symbols to Hungarian localization based on letter frequency (#2279) 2023-12-10 23:24:21 +01:00
Mohammad Sadegh At'hari
45aa02ca1f Add Arabic Kaf to the Persian popup (#2253)
* Remove redundant Kashida key in Persian layout

There is a Kashida(code: 1600) key inside
the popup of Dot key(code: 46). The Kashida is
a very low use character in Persian writing, so
removing it from the main layout improves the
layout usability by increasing the width of the
Space-bar.

* Add Arabic Kaf to the Persian popup

The Arabic Kaf (code: 1603) is part of the standard Persian
keyboard (ISIRI 9147), but it was missing in the current layout.

This commit adds the Arabic Kaf (code: 1603) to the popup of the Persian Kaf
(code: 1705) key, following the convention of other keys that have
both Arabic and Persian variants.
This improves the backward compatibility and accessibility of
the layout for users who need to type both scripts.

---------

Co-authored-by: Mohammad Sadegh At'hari <msadegh64@users.noreply.github.com>
2023-12-10 23:20:33 +01:00
Patrick Goldinger
2e8f06232a Merge pull request #2339 from florisboard/upgrade-and-cleanup
Upgrade traget SDK to 34 and cleanup code base
2023-12-10 23:16:42 +01:00
msrd0
9a2ba678d0 Add german variant of the dvorak layout (#2335)
* add dvorak-de layout

* fix dvorak_de modifiers

* reset app/build.gradle.kts
2023-12-10 13:38:55 +01:00
Lars Mühlbauer
4e73e2a2f7 Fix one-handed mode not extending to bottom of UI (#2340) 2023-12-10 13:25:31 +01:00
Patrick Goldinger
2a4b5b6d75 Update README.md 2023-12-10 13:01:10 +01:00
Patrick Goldinger
e5b51d8572 Upgrade Gradle to 8.1.1 2023-12-09 05:10:01 +01:00
Patrick Goldinger
a84df7d07c Migrate to using non-transitive R-classes 2023-12-09 04:58:43 +01:00
Patrick Goldinger
74f062cce7 Upgrade to target SDK 34 2023-12-09 04:52:04 +01:00
Patrick Goldinger
a4f6c0326f Move project version/buildtool meta to gradle.properties 2023-12-09 04:47:19 +01:00
Patrick Goldinger
e66bcc124f Merge pull request #2338 from florisboard/rework-build-system
Include new NLP submodule build system
2023-12-09 03:32:27 +01:00
Patrick Goldinger
6b00121a43 Include new icu4c build system 2023-12-09 03:18:41 +01:00
Patrick Goldinger
2813c64101 Upgrade Gradle to 8.1.1 and NDK to r26b 2023-12-09 02:58:45 +01:00
Patrick Goldinger
6542d43cf9 Update NLP submodule 2023-12-09 02:12:43 +01:00
klaurence
ac2df6f915 Fix wrong character in Thai number row layout (#2320)
* Update thai.json

* Update thai.json
2023-11-04 18:30:30 +01:00
Patrick Goldinger
fd98df7548 Merge pull request #2213 from 1fexd/feature/material-you-theme-colors
Implement support for Material You color selection in theme editor
2023-11-01 11:10:33 +01:00
Patrick Goldinger
d1415d6cfb Add discussion links into ROADMAP and CONTRIBUTING 2023-10-22 11:18:03 +02:00
Patrick Goldinger
3045e3e930 Merge pull request #2313 from florisboard/get-proj-back-on-track
Add new ROADMAP, CODE OF CONDUCT and rewrite CONTRIBUTING
2023-10-22 11:12:05 +02:00
Patrick Goldinger
a1b59d6e69 Adjust CONTRIBUTING file 2023-10-21 23:05:35 +02:00
Patrick Goldinger
1a0bccdf72 Add CODE OF CONDUCT
The code of conduct is based on the Contributor Covenant v2.1 standard
and has been llinked in the README
2023-10-21 15:27:04 +02:00
Patrick Goldinger
3529fa8d70 Add initial new ROADMAP 2023-10-21 15:09:52 +02:00
nettnikl
aa00eb6e79 Add Samsung Board inspired layouts for symbols (#2229)
* Add samsung board inspired layout

* Fix inconsistencies

* Rename western_samsung

* Update extension.json
2023-06-02 02:06:53 +02:00
OneSheepy
759a2ac7c7 Add Estonian layout (#2167)
* Added Estonian layout

* changed language code from 'ee' to 'et'

* added '.ee' TLD

---------

Co-authored-by: Kaspar Ormak <kaspar@messenger.ee>
2023-06-01 19:29:05 +02:00
phyrz91
f5e26917c3 Add Polish Fastlane translation (#2231)
Update polish translation

* Create short_description.txt

* Create full_description.txt
2023-06-01 19:23:18 +02:00
samo_lego
0d663bd8a1 Add Slovenian layout (#2233) 2023-06-01 12:30:32 +02:00
Clément Lyonnet
2d9605fbda Add Tamil layout (#2194)
Related to #261 & #368

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2023-06-01 12:16:42 +02:00
yanis867
50e2ab4275 Add New Kabyle (Taqbaylit) Popup Mapping (#2163) 2023-06-01 12:08:05 +02:00
Mohammad Sadegh At'hari
0708491056 Remove redundant Kashida key in Persian layout (#2227)
There is a Kashida(code: 1600) key inside
the popup of Dot key(code: 46). The Kashida is
a very low use character in Persian writing, so
removing it from the main layout improves the
layout usability by increasing the width of the
Space-bar.
2023-06-01 11:21:51 +02:00
1fexd
44e8a56610 feat: Refresh Material You colors on change 2023-05-21 20:34:44 +02:00
1fexd
158c83c972 chore: Bum Compose Material3 dependency 2023-05-17 17:53:04 +02:00
1fexd
46cced07c3 chore: Use AndroidVersion 2023-05-17 17:52:01 +02:00
1fexd
6597171011 chore: Update copyright year 2023-05-17 17:51:07 +02:00
1fexd
26ada18301 chore: Display serialized Material You color using serializer 2023-05-17 17:50:35 +02:00
1fexd
93ebbbb3de fix: Serialize Material You Light/Dark as dynamic-light-color/dynamic-dark-color 2023-05-17 17:47:23 +02:00
1fexd
215da1c0ab chore: Add SnyggMaterialYouDarkColorValue 2023-05-10 20:22:45 +02:00
1fexd
b599b807d8 feat: Implement support for Material You color selection in theme editor 2023-05-10 19:59:11 +02:00
Patrick Goldinger
deaf3295fd Merge pull request #2196 from florisboard/implement-latin-nlp-provider
Implement Latin NLP provider (part 1)
2023-05-07 18:00:54 +02:00
Patrick Goldinger
0abec78aae Remove hardcoded NDK path from build.gradle.kts (oops) 2023-05-07 15:42:21 +02:00
Patrick Goldinger
63fea7ece4 Upgrade JetPref library to 0.1.0-beta14 2023-05-07 14:45:58 +02:00
Patrick Goldinger
f11b3b837b Upgrade Kotlin to 1.8.21 / Upgrade and fix other libraries 2023-05-07 03:08:43 +02:00
Patrick Goldinger
6c879c46dc Upgrade target API level to 33 2023-05-06 20:00:08 +02:00
Patrick Goldinger
407a477c6a Update android.yml workflow 2023-05-06 19:09:26 +02:00
Patrick Goldinger
27af366234 Update nlp submodule ref 2023-05-06 19:06:17 +02:00
Patrick Goldinger
b76a25d649 Remove hardcoded ninja path from build.gradle.kts 2023-05-01 18:46:46 +02:00
Patrick Goldinger
8a2189c763 Update GitHub FlorisBoard CI workflow for new build config 2023-05-01 18:34:20 +02:00
Patrick Goldinger
c158eabedc Update nlp submodule reference to match new state with Android NDK support 2023-05-01 18:11:33 +02:00
Patrick Goldinger
ff97c6120a Adjust build system and FlorisApplication to load new ICU data properly 2023-05-01 16:44:08 +02:00
Patrick Goldinger
1314d0da93 Update build configuration for NLP subproject 2023-05-01 13:22:23 +02:00
Patrick Goldinger
1d9a5fb552 Upgrade Android NDK to r25c 2023-04-23 23:56:47 +02:00
Patrick Goldinger
4ef8e7be88 Move nlp submodule into cpp source set 2023-04-22 19:43:25 +02:00
Patrick Goldinger
a74e1fa489 Upgrade Gradle to 8.0 and AGP to 8.0.0 2023-04-22 14:32:22 +02:00
Patrick Goldinger
b9f9437fa7 Add nlp submodule 2023-04-22 14:09:37 +02:00
Patrick Goldinger
36200eba32 Remove icu4c submodule directory 2023-04-21 19:53:23 +02:00
Patrick Goldinger
d8af1a76e7 Remove submodule icu4c 2023-04-21 19:51:51 +02:00
BHydden
a47a6065df Update README.md (#2195)
Add a note on the main page explaining the current situation, as suggested in the main matrix channel

https://matrix.to/#/!LcLoPwndyZCssfevip:matrix.org/$miH4mas6b-JTKqjM2zyodK_AdLZLwAs0YfHZvakPNLA?via=matrix.org&via=tchncs.de&via=envs.net
2023-04-19 00:13:39 +02:00
moonbeamcelery
f6e58f7534 Fixes to Chinese shape-based layout: mixed language support (#2093)
* Bug fix: expected content cannot match

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Reset suggestions when switching subtypes

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Draft: record last candidate or gesture commit position to help determine composing range

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Let the NlpProvider handle last candidate or gesture commit position when determining composing range.

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* draft: allow Enter to commit raw text for CJK

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Add full-width comma to CJK symbols

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Add minimal support for physical keyboard handling (space, enter)

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Force suggestion on for HanShapeBased to avoid user confusion

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Delete pushes lastCommitPosition back instead of resetting to -1

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* fix: delete flogDebug without import

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* fix: allow composing range to change based on subtype switch

* fix: bug where HanShapeBased force suggestion on not reflected in displayed candidates

* fix: for speed, stub out getListOfWords and getFrequencyForWord

* Polish LANGUAGEPACK.md. Add warning about phonetic input. Add translations.

* Move Chinese language pack README to another file

---------

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>
2023-02-24 13:18:44 +01:00
Waelwindows
a5dab5fb5a Add Chinese Shape Based Layouts (#2054)
* feat(ime/nlp): Add `HanShapeBasedLanguageProvider`

* feat: Manually set default NLP to be HanShapeBased

* feat: Temporarily disable adding spaces

This commit should give insight into how the keyboard adds spaces, this
should then be refined into not adding a space after commiting a CJK
text suggestion

* fix(ime/nlp): Remove empty str suggest in HanShape

* feat(ime/nlp): Handle locale variants in HanShape

this should facilitate multiple layouts in the zh locale

* fix(ime/nlp): Handle query params in HanShape

This also helps performance as the DBC doesn't have to compile the query
for every string the user writes

* Space behavior QoL updates for Han shape-based layout (#1)

* Separate space behavior for zh* and latin, and allow space when there is no suggestion.

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Add checking if locale is CJK

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* refactor: Change predicate to a getter & rename

* chore: Remove TODO `supportsAutoSpace` message

* fix: Fix spaces after sugg. in non-space subtypes

* fix: Fix auto space predicate in `PhantomSpace`

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>
Co-authored-by: waelwindows <waelwindows9922@gmail.com>

* Draft: editor screen exposes nlpProviders and shape-based Chinese input methods as variants

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Fix defaults for zhengma preset

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Add word tables for added input methods

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Fix: bug in zhengma preset

* Draft: support composing with special characters by delegating nlpProvider to decide composing range.

* Catch SQLite errors such as layout (locale variant) not found (e.g. using HanShapeBased with JIS)

* fixup: remove TODO

* fix: partly addresses 2101, allow searching for locale in English for phones lacking system locale IME

* Adds support for importing "language packs" (sqlite3 db for HanShapeBased for now)

* Changes language pack to zip files. Adds a basic language pack class for storing metadata of IMEs.

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Implement language pack as a type of Flex extension, and draft its import and view UI

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* fix: input method name translation

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Trim down to zhengma, quickclassic, and cangjie for the barebones Chinese shape-based pack. Polish extension user documentation.

* Fix hack to allow multiple language pack extensions to co-exist.

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>

* Replace quickclassic with boshiamy

* Fix href in LANGUAGEPACKS.md

* build(nix): Clean up nix flake

* refactor: Encapsulate lanaguage pack query in HSB

* feat(ime/nlp): Implement `getListOfWords` in HSB

* feat(ime/nlp): Implement `getFrequencyForWord`

* chore: Normalize weights for freq in `han.sqlite3`

* chore(ime/nlp): Add some logging for HSB

* Update app/src/main/assets/ime/keyboard/org.florisboard.localization/extension.json

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

Signed-off-by: moonbeamcelery <moonbeamcelery@proton.me>
Co-authored-by: moonbeamcelery <114041522+moonbeamcelery@users.noreply.github.com>
Co-authored-by: moonbeamcelery <moonbeamcelery@proton.me>
Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2023-01-15 17:22:10 +01:00
Softastur
9776ac1812 Add support for Asturian layout (#2138) 2023-01-04 01:31:08 +01:00
Md Rasel Hossain
099e5678f7 Add Bengali keyboard layout (#2077)
* Bengali keyboard layout

* Fix some popup keys - Bengali layout
2022-12-24 11:34:48 +01:00
Patrick Goldinger
3235472e0f Merge pull request #2108 from tsiflimagas/ci_deps
Update workflows dependencies
2022-11-08 00:58:30 +01:00
Kostas Giapis
19b934cb6c Update workflows dependencies 2022-11-06 00:39:24 +02:00
Patrick Goldinger
4b2211b5c0 Change default language display names from native to system 2022-09-15 23:58:54 +02:00
Iago
88bd544c90 Add spanish fastlane metadata (#2037)
* Add spanish fastlane metadata

* Copy es-ES metadata to androidbeta

* Remove icon

* Remove outdated changelog

* Remove outdated changelog (from beta)
2022-09-06 14:15:58 +02:00
Patrick Goldinger
31a01c8d39 Release v0.4.0-alpha04 2022-09-01 20:35:07 +02:00
florisboard-bot
d29859c6b3 Update translations from Crowdin 2022-09-01 20:30:52 +02:00
Patrick Goldinger
4c800f37f0 Comment out "auto0" placeholder logic as it is annoying (#1976) 2022-08-31 20:23:20 +02:00
Patrick Goldinger
470d302ed2 Merge pull request #2030 from florisboard/smartbar-rework-hotfixes
Smartbar rework hotfixes
2022-08-31 20:16:10 +02:00
Patrick Goldinger
ae2a1db1ef Change extended actions toggle so it closes actions overflow (#2035) 2022-08-30 18:06:24 +02:00
Patrick Goldinger
94b62b7224 Fix bottom sheet host UI causing issues in landscape input UI (#1760) 2022-08-30 17:20:55 +02:00
Patrick Goldinger
8fe84b999a Implement sticky action is overflow button if set to none (#2033) 2022-08-30 01:45:14 +02:00
Patrick Goldinger
da5b316acd Rework KeyboardState and its observing logic (#2025) 2022-08-30 00:58:07 +02:00
Patrick Goldinger
eb5fdbb08c Fix clipboard suggestions showing when they shouldn't (#2029) 2022-08-29 20:02:57 +02:00
Patrick Goldinger
ad73e3894c Fix moving all Smartbar actions to hidden causing crash (#2026) 2022-08-29 14:27:41 +02:00
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
922 changed files with 89246 additions and 35187 deletions

View File

@@ -9,7 +9,7 @@ insert_final_newline = true
max_line_length = 120
trim_trailing_whitespace = true
[{*.har,*.json,*yml}]
[{*.har,*.json,*yml,*.sh}]
indent_size = 2
[*.kt]

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use_flake

1
.github/FUNDING.yml vendored
View File

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

View File

@@ -1,34 +0,0 @@
---
name: Bug report
about: Create a report to help FlorisBoard improve
title: ''
labels: bug
assignees: ''
---
<!--
Thank you for your help in making FlorisBoard better!
Guide to a good bug-report:
• Please search existing bug/crash reports reports to avoid creating duplicates.
• Give your bug report a good name (no generics like "Error" or "Crash"), so others can easily identify the topic of your issue.
• Describe the bug in a short but concise way.
• If you have a screenshot or screen recording of the bug, link them at the end of this issue.
• Also make sure to fill out the environment information. This info is valuable when trying to fix your described bug.
-->
#### Short description
Describe the bug in a short but concise way.
#### Steps to reproduce
1. Go to '…'
2. Click on '…'
3. Scroll down to '…'
4. See error
#### Environment information
- FlorisBoard Version: <!-- e.g. 0.X.X -->
- Install Source: <!-- Google PlayStore/F-Droid/GitHub/? -->
- Device: <!-- e.g. OnePlus 7T -->
- Android: <!-- e.g. 10, Stock -->

64
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,64 @@
name: Bug Report
description: Create a report to help FlorisBoard improve
labels:
- "bug"
body:
- type: markdown
attributes:
value: |
Thank you for your help in making FlorisBoard better!
Guide to a good bug-report:
• Please search existing bug/crash reports reports to avoid creating duplicates.
• Give your bug report a good name (no generics like "Error" or "Crash"), so others can easily identify the topic of your issue.
• Describe the bug in a short but concise way.
• If you have a screenshot or screen recording of the bug, link them at the end of this issue.
• Also make sure to fill out the environment information. This info is valuable when trying to fix your described bug.
- type: textarea
id: description
attributes:
label: Short description
description: Describe the bug in a short but concise way.
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
value: |
1. Go to '…'
2. Click on '…'
3. Scroll down to '…'
4. See error
validations:
required: true
- type: input
id: florisversion
attributes:
label: FlorisBoard Version
placeholder: e.g. 0.X.X
validations:
required: true
- type: dropdown
id: installsource
attributes:
label: Install Source
options:
- Google PlayStore
- F-Droid
- GitHub
validations:
required: true
- type: input
id: device
attributes:
label: Device
placeholder: e.g. OnePlus 7T
validations:
required: true
- type: input
id: androidversion
attributes:
label: Android
placeholder: e.g. 10, Stock
validations:
required: true

View File

@@ -1,28 +0,0 @@
---
name: Crash report
about: Create a report with a generated crash log attached to help FlorisBoard improve
title: ''
labels: bug
assignees: ''
---
<!--
Thank you for your help in making FlorisBoard better!
Guide to a good crash-report:
• Please search existing bug/crash reports to avoid creating duplicates.
• Give your crash report a good name (no generics like "Error" or "Crash"), so others can easily identify the topic of your issue.
• Describe what you were doing what could've led to the crash and whether the crash is random or reproducible.
-->
#### Short description
Describe what you were doing that could've led to the crash.
#### Steps to reproduce
1. Go to '…'
2. Click on '…'
3. Scroll down to '…'
4. See crash
<!-- Paste the generated crash log below -->

38
.github/ISSUE_TEMPLATE/crash_report.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: Crash report
description: Create a report with a generated crash log attached to help FlorisBoard improve
labels:
- "bug"
body:
- type: markdown
attributes:
value: |
Thank you for your help in making FlorisBoard better!
Guide to a good crash-report:
• Please search existing bug/crash reports to avoid creating duplicates.
• Give your crash report a good name (no generics like "Error" or "Crash"), so others can easily identify the topic of your issue.
• Describe what you were doing what could've led to the crash and whether the crash is random or reproducible.
- type: textarea
id: description
attributes:
label: Short description
description: Describe the bug in a short but concise way.
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
value: |
1. Go to '…'
2. Click on '…'
3. Scroll down to '…'
4. See crash
validations:
required: true
- type: textarea
id: crashlog
attributes:
label: Crash log
description: Paste the generated crash log below
validations:
required: true

View File

@@ -1,18 +0,0 @@
---
name: Feature request / Suggestion
about: Suggest an idea for this project
title: ''
labels: proposal
assignees: ''
---
<!--
Thank you for your help in making FlorisBoard better!
Guide to a good feature-request:
• Please search existing proposals to avoid creating duplicates.
• If you have multiple ideas which are not directly connected to other, file a new issue for each idea. This makes it easier to implement your proposals.
• Describe your idea in a short but concise way.
• If you have any examples, e.g. screenshots or other keyboards have the proposed feature implemented, feel free to post them after your description.
-->

View File

@@ -0,0 +1,22 @@
name: Feature request / Suggestion
description: Suggest an idea for this project
labels:
- "proposal"
body:
- type: markdown
attributes:
value: |
Thank you for your help in making FlorisBoard better!
Guide to a good feature-request:
• Please search existing proposals to avoid creating duplicates.
• If you have multiple ideas which are not directly connected to other, file a new issue for each idea. This makes it easier to implement your proposals.
• Describe your idea in a short but concise way.
• If you have any examples, e.g. screenshots or other keyboards have the proposed feature implemented, feel free to post them after your description.
- type: textarea
id: feature
attributes:
label: Feature idea
description: Please explain your idea in a precise way.
validations:
required: true

BIN
.github/repo_icon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -2,46 +2,40 @@ name: FlorisBoard CI
on:
push:
branches: [ master ]
branches: [ main ]
paths-ignore:
- ".github/ISSUE_TEMPLATE/**"
- ".github/FUNDING.yml"
- ".editorconfig"
- "fastlane/**"
- "CONTRIBUTING.md"
- "CODE_OF_CONDUCT.md"
- "LICENSE"
- "README.md"
- "ROADMAP.md"
pull_request:
branches: [ master ]
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Checkout submodules
run: git submodule update --init --recursive
- name: set up JDK 11
uses: actions/setup-java@v1
- uses: actions/checkout@v4
with:
java-version: 11
- name: Setup CMake and Ninja
uses: lukka/get-cmake@v3.20.1
- uses: actions/cache@v2
submodules: recursive
- uses: gradle/actions/wrapper-validation@v3
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: |
${{ runner.os }}-gradle-
java-version: 17
distribution: temurin
- name: Set up CMake and Ninja
uses: lukka/get-cmake@latest
- 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
run: ./gradlew clean && ./gradlew assembleDebug
- uses: actions/upload-artifact@v2
run: ./gradlew clean assembleDebug
- uses: actions/upload-artifact@v4
with:
name: app-debug.apk
path: app/build/outputs/apk/debug/app-debug.apk

View File

@@ -2,7 +2,7 @@ name: Crowdin Upload Sources
on:
push:
branches: [ master ]
branches: [ main ]
paths:
- "app/src/main/res/values/strings.xml"
- ".github/workflows/crowdin-upload.yml"
@@ -13,9 +13,9 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Upload
uses: crowdin/github-action@1.4.0
uses: crowdin/github-action@v2
with:
config: "crowdin.yml"
upload_sources: true

View File

@@ -0,0 +1,61 @@
name: Validate no translated strings.xml included
on:
pull_request_target:
branches: [ main ]
jobs:
validate:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Precheck if validation is required
id: precheck
run: |
pr_author="${{ github.event.pull_request.user.login }}"
if [[ "$pr_author" == "florisboard-bot" ]]; then
echo "PR is by florisboard-bot, skipping validation!"
echo "require_validation=false" >> "$GITHUB_OUTPUT"
else
echo "PR is not by florisboard-bot, requiring validation!"
echo "require_validation=true" >> "$GITHUB_OUTPUT"
fi
- name: Fetch PR changed files manually
id: fetch_changed_files
if: steps.precheck.outputs.require_validation == 'true'
run: |
pr_files="$(curl -sSf https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files?per_page=1000)" || exit 11
changed_files="$(jq -r '.[].filename' <<< "$pr_files")" || exit 12
illegal_changes_list="$(grep -E '^app/src/main/res/values-.+/strings.xml$' <<< "$changed_files")" || true
if [ -n "$illegal_changes_list" ]; then
echo -e "Illegal changes detected:\n$illegal_changes_list"
else
echo "No illegal changes detected"
fi
echo "illegal_changes_list<<EOF" >> "$GITHUB_OUTPUT"
echo "$illegal_changes_list" >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
- name: Create comment if illegal files detected
uses: peter-evans/create-or-update-comment@v4
if: steps.precheck.outputs.require_validation == 'true' && steps.fetch_changed_files.outputs.illegal_changes_list != ''
with:
issue-number: ${{ github.event.pull_request.number }}
body: |
⚠️ Illegal changes detected
Hey there!
We detected illegal changes that disobey the [contribution guidelines](https://github.com/florisboard/florisboard/blob/main/CONTRIBUTING.md#translation). This is a kind reminder that pull requests must not contain translated `strings.xml` files, as those are exclusively managed from Crowdin.
Please remove changes to the following files:
```
${{ steps.fetch_changed_files.outputs.illegal_changes_list }}
```
- name: Fail workflow if illegal files detected
if: steps.precheck.outputs.require_validation == 'true' && steps.fetch_changed_files.outputs.illegal_changes_list != ''
run: echo -e "Illegal changes detected:\n${{ steps.fetch_changed_files.outputs.illegal_changes_list }}" && exit 1

19
.gitignore vendored
View File

@@ -1,7 +1,11 @@
# Built application files
*.apk
*.aab
*.ap_
# dotenv
.env
# Files for the ART/Dalvik VM
*.dex
@@ -36,6 +40,7 @@ captures/
# Intellij
*.iml
.idea/
!/.idea/copyright/
# Keystore files
*.jks
@@ -44,5 +49,15 @@ crowdin.properties
# C++
.cxx/
# AndroidX Room schema JSONs
/app/schemas/
# Nix stuff
.direnv/
result
# VSCode
.vscode/
# Rust
debug/
target/
**/*.rs.bk
*.pdb

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "app/src/main/icu4c"]
path = app/src/main/icu4c
url = https://github.com/florisboard/icu4c

6
.idea/copyright/copyright.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<component name="CopyrightManager">
<copyright>
<option name="notice" value="Copyright (C) &amp;#36;originalComment.match(&quot;Copyright \(C\) (\d+)&quot;, 1, &quot;-&quot;, &quot;&amp;#36;today.year&quot;)&amp;#36;today.year The FlorisBoard Contributors&#10;&#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10;http://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License." />
<option name="myName" value="copyright" />
</copyright>
</component>

15
.idea/copyright/profiles_settings.xml generated Normal file
View File

@@ -0,0 +1,15 @@
<component name="CopyrightManager">
<settings default="copyright">
<module2copyright>
<element module="Project Files" copyright="copyright" />
</module2copyright>
<LanguageOptions name="Shell Script">
<option name="fileTypeOverride" value="1" />
</LanguageOptions>
<LanguageOptions name="XML">
<option name="fileTypeOverride" value="1" />
<option name="prefixLines" value="false" />
</LanguageOptions>
<LanguageOptions name="__TEMPLATE__" />
</settings>
</component>

226
.idea/icon.svg generated Normal file
View File

@@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="vector"
width="108"
height="108"
viewBox="0 0 108 108"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs10">
<radialGradient
gradientUnits="userSpaceOnUse"
r="20.594"
cx="54.141998"
cy="48.769001"
id="gradient_0"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#55E032FF"
id="stop1" />
<stop
offset="1"
stop-color="#227C53FF"
id="stop2" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
r="20.594"
cx="54.141998"
cy="48.769001"
id="gradient_1"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#55E032FF"
id="stop3" />
<stop
offset="1"
stop-color="#227C53FF"
id="stop4" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
r="12.849"
cx="54.029999"
cy="39.144001"
id="gradient_2"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#FE7901FF"
id="stop5" />
<stop
offset="1"
stop-color="#FEBE01FF"
id="stop6" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
r="20.594"
cx="54.141998"
cy="48.769001"
id="gradient_3"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#55E032FF"
id="stop7" />
<stop
offset="1"
stop-color="#227C53FF"
id="stop8" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
r="17.913"
cx="54.131001"
cy="49.819"
id="gradient_4"
gradientTransform="matrix(2.193116,0,0,2.193116,-64.427669,-59.442216)">
<stop
offset="0"
stop-color="#FE7901FF"
id="stop9" />
<stop
offset="1"
stop-color="#FEBE01FF"
id="stop10" />
</radialGradient>
</defs>
<path
fill="url(#gradient_0)"
d="m 12.291915,34.438502 0.434238,0.0066 c 20.014377,0.256595 36.184221,16.58873 36.184221,36.666707 v 6.504782 C 46.434346,77.090222 43.999987,76.362108 41.642388,75.436613 27.045007,69.710386 16.044337,56.538532 13.081437,41.131892 12.655973,38.923423 12.392799,36.686445 12.289722,34.440694 Z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_0"
style="fill:url(#gradient_0);stroke-width:2.19311" />
<path
fill="url(#gradient_1)"
d="m 41.438428,33.83978 c 1.451843,-7.875479 5.219616,-15.404446 11.305513,-21.490344 0.497838,-0.497837 1.004447,-0.980322 1.524216,-1.449649 0.517575,0.469327 1.026378,0.951812 1.526409,1.449649 6.074931,6.077125 9.842705,13.595127 11.29674,21.459641 -5.296375,4.153762 -9.689186,9.412854 -12.829729,15.428571 -3.136156,-5.974047 -7.53774,-11.23314 -12.823149,-15.395674 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_1"
style="fill:url(#gradient_1);stroke-width:2.19311" />
<path
fill="url(#gradient_2)"
d="M 33.758135,28.900884 C 35.892037,20.613098 40.199317,12.774901 46.684361,6.2876637 48.478331,4.4936948 50.377569,2.8642095 52.362338,1.4035943 L 54.268157,0 56.176168,1.4035943 c 1.984769,1.4628084 3.884009,3.0901005 5.677977,4.8840694 6.480658,6.4806583 10.790132,14.3210483 12.924033,22.6022543 -2.015473,1.030764 -3.949802,2.199695 -5.783247,3.49802 C 67.332549,24.486141 63.437574,16.961559 57.307815,10.833993 56.548998,10.072982 55.768249,9.3492537 54.965567,8.6584222 L 54.265964,8.0553153 53.56636,8.6584222 C 52.765872,9.3492537 51.985123,10.072982 51.226304,10.833993 45.089966,16.970332 41.190606,24.503686 39.53261,32.414255 37.694779,31.111545 35.764837,29.933841 33.753749,28.900884 Z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_2"
style="fill:url(#gradient_2);stroke-width:2.19311" />
<path
fill="url(#gradient_3)"
d="m 96.244398,34.438502 -0.434237,0.0066 c -20.01657,0.256595 -36.186415,16.58873 -36.186415,36.666707 v 6.506976 C 79.890332,73.322449 95.279427,55.74901 96.244398,34.440694 Z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_3"
style="fill:url(#gradient_3);stroke-width:2.19311" />
<path
fill="url(#gradient_4)"
d="m 12.68887,25.874383 0.149132,0.0022 c 4.506853,0.05702 8.996162,0.787328 13.290282,2.168991 11.959063,3.851112 21.891685,12.759549 27.168322,24.058483 l 0.973744,2.083461 0.969357,-2.085654 C 62.347596,36.789522 77.776168,26.104661 95.702698,25.876577 l 0.149133,-0.0022 c 0.291684,2.098811 0.443009,4.241486 0.445201,6.421443 l -0.510995,0.0066 C 74.600536,32.576546 57.485458,49.860493 57.485458,71.111788 v 6.917088 c -1.048309,0.155711 -2.046178,0.188608 -3.079135,0.192995 h -0.13378 c -1.068047,0 -2.144867,-0.07238 -3.212915,-0.219313 v -6.89077 c 0,-21.251295 -17.117271,-38.535242 -38.300578,-38.809382 l -0.510997,-0.0066 c 0,-2.147061 0.149133,-4.296315 0.445203,-6.421443 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_4"
style="fill:url(#gradient_4);stroke-width:2.19311" />
<path
fill="#53cd53"
d="m 101.9772,99.716601 c 0,-2.46287 -1.997925,-4.462992 -4.460795,-4.462992 H 85.243728 c -2.460676,0 -4.460798,1.997929 -4.460798,4.462992 v 3.822599 c 0,2.46068 1.997928,4.4608 4.460798,4.4608 h 12.272677 c 2.460676,0 4.460795,-1.99793 4.460795,-4.4608 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_5"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 78.620517,84.818763 c 0,-2.460676 -1.997928,-4.460798 -4.460797,-4.460798 h -6.096864 c -2.460676,0 -4.460798,1.997929 -4.460798,4.460798 v 3.824795 c 0,2.460676 1.997929,4.460798 4.460798,4.460798 h 6.096864 c 2.460676,0 4.460797,-1.997929 4.460797,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_6"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 61.450612,84.818763 c 0,-2.460676 -1.997929,-4.460798 -4.460798,-4.460798 h -6.09467 c -2.460676,0 -4.460798,1.997929 -4.460798,4.460798 v 3.824795 c 0,2.460676 1.997929,4.460798 4.460798,4.460798 h 6.09467 c 2.460676,0 4.460798,-1.997929 4.460798,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_7"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 27.11738,84.818763 c 0,-2.460676 -1.997929,-4.460798 -4.460798,-4.460798 h -6.096863 c -2.460676,0 -4.460798,1.997929 -4.460798,4.460798 v 3.824795 c 0,2.460676 1.997929,4.460798 4.460798,4.460798 h 6.096863 c 2.460676,0 4.460798,-1.997929 4.460798,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_8"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 95.78823,84.818763 c 0,-2.460676 -1.997929,-4.460798 -4.460798,-4.460798 h -6.09467 c -2.462869,0 -4.462991,1.997929 -4.462991,4.460798 v 3.824795 c 0,2.460676 1.997928,4.460798 4.462991,4.460798 h 6.09467 c 2.460676,0 4.460798,-1.997929 4.460798,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_9"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 21.038062,69.923119 c 0,-2.46287 -1.997928,-4.462991 -4.460797,-4.462991 h -6.09467 c -2.4606765,0 -4.4607984,1.997929 -4.4607984,4.462991 v 3.822601 c 0,2.460676 1.9979288,4.460798 4.4607984,4.460798 h 6.09467 c 2.460676,0 4.460797,-1.997928 4.460797,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_10"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 101.9772,69.923119 c 0,-2.46287 -1.997925,-4.462991 -4.460795,-4.462991 h -6.09467 c -2.460676,0 -4.460797,1.997929 -4.460797,4.462991 v 3.822601 c 0,2.460676 1.997928,4.460798 4.460797,4.460798 h 6.09467 c 2.460676,0 4.460795,-1.997928 4.460795,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_11"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 44.282899,84.818763 c 0,-2.460676 -1.997928,-4.460798 -4.460798,-4.460798 h -6.09467 c -2.462869,0 -4.462991,1.997929 -4.462991,4.460798 v 3.824795 c 0,2.460676 1.99793,4.460798 4.462991,4.460798 h 6.09467 c 2.460676,0 4.460798,-1.997929 4.460798,-4.460798 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_12"
style="stroke-width:2.19311" />
<path
fill="#fe9801"
d="m 27.21607,99.716601 c 0,-2.46287 -1.997928,-4.462992 -4.460798,-4.462992 H 10.482595 c -2.4606765,0 -4.4607984,1.997929 -4.4607984,4.462992 v 3.822599 c 0,2.46068 1.9979288,4.4608 4.4607984,4.4608 h 12.272677 c 2.460676,0 4.460798,-1.99793 4.460798,-4.4608 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_13"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 83.756795,67.041365 c 0.655742,0.776363 1.054889,1.783003 1.054889,2.881754 v 3.822601 c 0,2.460676 -1.997928,4.460798 -4.460798,4.460798 h -6.096863 c -1.557112,0 -2.927809,-0.798293 -3.723911,-2.006701 4.91258,-2.307158 9.377765,-5.414803 13.226683,-9.158452 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_14"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 24.529503,66.738714 c 3.796284,3.76558 8.20664,6.919282 13.066585,9.263722 -0.774169,1.320257 -2.210661,2.204082 -3.848919,2.204082 h -6.096862 c -2.460676,0 -4.460798,-1.997928 -4.460798,-4.460798 v -3.822601 c 0,-1.247883 0.510996,-2.375144 1.337801,-3.186598 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_15"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 14.015705,51.362778 c 1.868535,4.322632 4.359915,8.346999 7.366677,11.950289 h -4.822663 c -2.460676,0 -4.460798,-1.997928 -4.460798,-4.460797 v -3.824795 c 0,-1.517637 0.758819,-2.85763 1.916784,-3.664697 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_16"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 94.369284,51.764118 c 0.87286,0.813646 1.418946,1.975997 1.418946,3.263357 v 3.824795 c 0,2.460676 -1.997929,4.460797 -4.460798,4.460797 h -4.116479 c 2.897106,-3.471703 5.313921,-7.355711 7.156137,-11.548949 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_17"
style="stroke-width:2.19311" />
<path
fill="#ffffff"
d="m 78.782808,99.819677 c 0,-2.432165 -1.971611,-4.40597 -4.403777,-4.40597 H 33.738397 c -2.432166,0 -4.405969,1.973805 -4.405969,4.40597 v 3.774353 c 0,2.43217 1.973803,4.40378 4.405969,4.40378 h 40.640634 c 2.432166,0 4.403777,-1.97161 4.403777,-4.40378 z"
stroke-linejoin="round"
fill-rule="evenodd"
id="path_18"
style="stroke-width:2.19311" />
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

133
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,133 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@@ -1,128 +1,97 @@
# Contributing
# Contribution guidelines
First off, thanks for considering contributing to FlorisBoard!
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
## General contributions
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.
### Translation
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 :)
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. The list of languages in Crowdin covers a good range of languages, but feel free to send an email to [florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev) to request a new language.
## Translations
> [!IMPORTANT]
> This is the only source of translations - **PRs that add/update translations are not accepted.**
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.
### Feedback
## Adding a new feature or making large changes
You can [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.
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!
### Bug reporting
## Adding a new keyboard layout
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.
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.
#### Capturing error logs
### The config file ([`app/src/main/assets/ime/config.json`](app/src/main/assets/ime/config.json))
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.
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.
Alternatively, you can also use ADB (Android Debug Bridge) to capture the error log. This is recommended for experienced users only.
- `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.
### Feature proposals
### Adding the layout
Use the feature proposal issue template to suggest a new idea or improvement for this project.
Since v0.3.10-beta05 it is possible to add custom layouts for all types.
## Code contributions
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.
You are always welcome to contribute new features or work on existing issues, there are a lot to choose from :) It is always best to quickly ask if someone is already working on this issue to avoid duplicate issues.
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).
> [!NOTE]
> If you intend to implement a bigger feature please coordinate with us so we can prevent that there's a major difference in expected implementation.
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.
If you are overwhelmed by the code don't hesistate to ask for help in the [dev chat](https://matrix.to/#/#florisboard-dev:matrix.org) or the discussions tab! Some issues are also marked as good first issue, which are easy to do tasks.
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.
### System requirements for development
For popups of non-`characters` layout, simply add the popup directly to
each key via the `popup` field.
- Desktop PC with Linux or WSL2 (Windows)
- MacOS and Windows without WSL2 probably works too however there's no official support
- At least 16GB of RAM (because of Android Studio)
- The following tools must be installed:
- Android Studio (bundles SDK and NDK)
- Java 17
- CMake 3.22+
- Clang 15+
- Git
- [Rust](https://www.rust-lang.org/tools/install)
- Utilities (optional)
- Python 3.10+
- Bash, realpath, grep, ...
## Adding a new dictionary for a language
### Manual build without Android Studio
Currently the suggestions implementation is highly experimental and will
get a major if not complete rework, so dictionaries are currently not
accepted.
If you want to manually build the project without Android Studio you must ensure that the Android SDK and NDK are properly installed on your system. Then issue
## Bug reporting
```./gradlew clean && ./gradlew assembleDebug```
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.
and Gradle should take care of every build task.
### Capturing error logs
## Joining the team
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.
If you want to join the core maintainer/moderator team on a volunteer basis and be part of this project's journey that's great to hear!
Alternatively, you can also use ADB (Android Debug Bridge) to capture
the error log. This is recommended for experienced users only.
### Basic Requirements
- A passion for seeing FlorisBoard flourish
- Good English skills for team and public communication
- A GitHub account and a Matrix handle
### Why Join
You'll have the chance to work directly with me and other team members. While the general idea is for us to work on all kinds of different aspects of the project as a team, if you're particularly interested in a specific area (e.g., UI, extensions, text processing), that's totally okay too!
### Available Roles
Currently the following roles are available and need help:
Role Description | Required Dev Experience
---|---
Software Developer (Kotlin) for Core App | Java/Kotlin development experience (on Android)
Software Developer (Rust) for Native Core | Some Rust development experience
GitHub Issues/Discussions Moderator | None
Crowdin Translation Verifier | Language proficiency for the language you want to verify
Interested? Feel free to dm me ([@patrickgold](https://matrix.to/#/@patrickgold:matrix.org)) on Matrix or send an email to [florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev).
## 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 :)
Alternatively you can also show your support by buying 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!

143
LANGUAGEPACKS-CHINESE.md Normal file
View File

@@ -0,0 +1,143 @@
# Chinese language pack
[简体中文翻译点这里](#简体中文翻译)
[繁体中文翻譯點這裡](#繁体中文翻譯)
## Default barebones Chinese shape-based pack
Default barebones Chinese shape-based language pack which are always available.
Please download the [full Chinese language pack](#full-chinese-shape-based-pack) to access input methods such as wubi, quick cangjie, and other versions of these input methods.
This pack is released under the same license as Florisboard.
## Full Chinese shape-based pack
Chinese shape-based language pack based on fcitx5-table-extra.
This pack is released under a separate license. Please visit to download: [TODO: add link to release page](https://)
:no_entry: :no_entry: **WARNING** :no_entry: :no_entry:
- **Input methods that include pinyin, jyutping, zhuyin as (auxiliary) functions are only provided for convenience. Currently, FlorisBoard lacks phonetic input algorithms. These functions currently have poor user experience and are not recommended for daily use.**
The following input methods are included in this language pack:
- 中文 (中国) [T9笔画] / Chinese (China) [T9]
- 中文 (中国) [五笔98] / Chinese (China) [WUBI98]
- ~中文 (中国) [五笔98-拼音混打] / Chinese (China) [WUBI98PINYIN]~
- 中文 (中国) [五笔98-单字] / Chinese (China) [WUBI98SINGLE]
- 中文 (中国) [五笔-大字库] / Chinese (China) [WUBILARGE]
- 中文 (中国) [郑码] / Chinese (China) [ZHENGMA]
- 中文 (中国) [郑码-大字库] / Chinese (China) [ZHENGMALARGE]
- ~中文 (中国) [郑码-拼音混打] / Chinese (China) [ZHENGMAPINYIN]~
- ~中文 (香港) [廣東拼音] / Chinese (Hong Kong) [CANTONESE]~
- ~中文 (香港) [港式廣東話] / Chinese (Hong Kong) [CANTONHK]~
- 中文 (香港) [輕鬆-大字庫] / Chinese (Hong Kong) [EASYLARGE]
- ~中文 (香港) [粤語拼音-表格] / Chinese (Hong Kong) [JYUTPINGTABLE]~
- 中文 (香港) [速成三代] / Chinese (Hong Kong) [QUICK3]
- 中文 (香港) [經典速成] / Chinese (Hong Kong) [QUICKCLASSIC]
- 中文 (香港) [筆順五碼] / Chinese (Hong Kong) [STROKE5]
- 中文 (台灣) [行列] / Chinese (Taiwan) [ARRAY30]
- 中文 (台灣) [行列-大字库] / Chinese (Taiwan) [ARRAY30LARGE]
- 中文 (台灣) [嘸蝦米] / Chinese (Taiwan) [BOSHIAMY]
- 中文 (台灣) [倉頡三代] / Chinese (Taiwan) [CANGJIE3]
- 中文 (台灣) [倉頡五代] / Chinese (Taiwan) [CANGJIE5]
- 中文 (台灣) [倉頡-大字庫] / Chinese (Taiwan) [CANGJIELARGE]
- 中文 (台灣) [速成五代] / Chinese (Taiwan) [QUICK5]
- 中文 (台灣) [快倉六] / Chinese (Taiwan) [SCJ6]
- ~中文 (台灣) [吳語注音] / Chinese (Taiwan) [WU]~
Third-party license: [https://github.com/fcitx/fcitx5-table-extra/blob/master/LICENSES/GPL-3.0-or-later.txt]
# 简体中文翻译
## 默认中文形码语言包
请下载[完整中文语言包](#fcitx5-中文形码语言包)来获得五笔、快速仓颉等输入法,及这些输入法的其他版本。
这一语言包的使用许可与FlorisBoard相同。
## Fcitx5 中文形码语言包
这一语言包由另一使用许可提供。下载请访问:[TODO: add link to release page](https://)
:no_entry: :no_entry: **注意** :no_entry: :no_entry:
- **含拼音、粤拼、注音等功能的输入法仅为便利提供。目前FlorisBoard缺乏音码输入算法这些功能目前使用体验不佳暂不推荐日常使用。**
语言包内含以下输入法:
- 中文 (中国) [T9笔画] / Chinese (China) [T9]
- 中文 (中国) [五笔98] / Chinese (China) [WUBI98]
- ~中文 (中国) [五笔98-拼音混打] / Chinese (China) [WUBI98PINYIN]~
- 中文 (中国) [五笔98-单字] / Chinese (China) [WUBI98SINGLE]
- 中文 (中国) [五笔-大字库] / Chinese (China) [WUBILARGE]
- 中文 (中国) [郑码] / Chinese (China) [ZHENGMA]
- 中文 (中国) [郑码-大字库] / Chinese (China) [ZHENGMALARGE]
- ~中文 (中国) [郑码-拼音混打] / Chinese (China) [ZHENGMAPINYIN]~
- ~中文 (香港) [廣東拼音] / Chinese (Hong Kong) [CANTONESE]~
- ~中文 (香港) [港式廣東話] / Chinese (Hong Kong) [CANTONHK]~
- 中文 (香港) [輕鬆-大字庫] / Chinese (Hong Kong) [EASYLARGE]
- ~中文 (香港) [粤語拼音-表格] / Chinese (Hong Kong) [JYUTPINGTABLE]~
- 中文 (香港) [速成三代] / Chinese (Hong Kong) [QUICK3]
- 中文 (香港) [經典速成] / Chinese (Hong Kong) [QUICKCLASSIC]
- 中文 (香港) [筆順五碼] / Chinese (Hong Kong) [STROKE5]
- 中文 (台灣) [行列] / Chinese (Taiwan) [ARRAY30]
- 中文 (台灣) [行列-大字库] / Chinese (Taiwan) [ARRAY30LARGE]
- 中文 (台灣) [嘸蝦米] / Chinese (Taiwan) [BOSHIAMY]
- 中文 (台灣) [倉頡三代] / Chinese (Taiwan) [CANGJIE3]
- 中文 (台灣) [倉頡五代] / Chinese (Taiwan) [CANGJIE5]
- 中文 (台灣) [倉頡-大字庫] / Chinese (Taiwan) [CANGJIELARGE]
- 中文 (台灣) [速成五代] / Chinese (Taiwan) [QUICK5]
- 中文 (台灣) [快倉六] / Chinese (Taiwan) [SCJ6]
- ~中文 (台灣) [吳語注音] / Chinese (Taiwan) [WU]~
第三方许可证: [https://github.com/fcitx/fcitx5-table-extra/blob/master/LICENSES/GPL-3.0-or-later.txt]
# 繁体中文翻譯
## 預設中文形碼語言包
請下載[完整中文語言包](#fcitx5-中文形碼語言包)來獲得五筆、快速倉頡等輸入法,及這些輸入法的其他版本。
這一語言包的使用許可與FlorisBoard相同。
## Fcitx5 中文形碼語言包
這一語言包由另一使用許可提供。下載請訪問:[TODO: add link to release page](https://)
:no_entry: :no_entry: **注意** :no_entry: :no_entry:
- **含拼音、粵拼、注音等功能的輸入法僅為便利提供。目前FlorisBoard缺乏音碼輸入算法這些功能目前使用體驗不佳暫不推薦日常使用。**
語言包內含以下輸入法:
- 中文 (中国) [T9笔画] / Chinese (China) [T9]
- 中文 (中国) [五笔98] / Chinese (China) [WUBI98]
- ~中文 (中国) [五笔98-拼音混打] / Chinese (China) [WUBI98PINYIN]~
- 中文 (中国) [五笔98-单字] / Chinese (China) [WUBI98SINGLE]
- 中文 (中国) [五笔-大字库] / Chinese (China) [WUBILARGE]
- 中文 (中国) [郑码] / Chinese (China) [ZHENGMA]
- 中文 (中国) [郑码-大字库] / Chinese (China) [ZHENGMALARGE]
- ~中文 (中国) [郑码-拼音混打] / Chinese (China) [ZHENGMAPINYIN]~
- ~中文 (香港) [廣東拼音] / Chinese (Hong Kong) [CANTONESE]~
- ~中文 (香港) [港式廣東話] / Chinese (Hong Kong) [CANTONHK]~
- 中文 (香港) [輕鬆-大字庫] / Chinese (Hong Kong) [EASYLARGE]
- ~中文 (香港) [粤語拼音-表格] / Chinese (Hong Kong) [JYUTPINGTABLE]~
- 中文 (香港) [速成三代] / Chinese (Hong Kong) [QUICK3]
- 中文 (香港) [經典速成] / Chinese (Hong Kong) [QUICKCLASSIC]
- 中文 (香港) [筆順五碼] / Chinese (Hong Kong) [STROKE5]
- 中文 (台灣) [行列] / Chinese (Taiwan) [ARRAY30]
- 中文 (台灣) [行列-大字库] / Chinese (Taiwan) [ARRAY30LARGE]
- 中文 (台灣) [嘸蝦米] / Chinese (Taiwan) [BOSHIAMY]
- 中文 (台灣) [倉頡三代] / Chinese (Taiwan) [CANGJIE3]
- 中文 (台灣) [倉頡五代] / Chinese (Taiwan) [CANGJIE5]
- 中文 (台灣) [倉頡-大字庫] / Chinese (Taiwan) [CANGJIELARGE]
- 中文 (台灣) [速成五代] / Chinese (Taiwan) [QUICK5]
- 中文 (台灣) [快倉六] / Chinese (Taiwan) [SCJ6]
- ~中文 (台灣) [吳語注音] / Chinese (Taiwan) [WU]~
第三方許可證: [https://github.com/fcitx/fcitx5-table-extra/blob/master/LICENSES/GPL-3.0-or-later.txt]

16
LANGUAGEPACKS.md Normal file
View File

@@ -0,0 +1,16 @@
# Language Packs
## Languages
- [Summary](#summary)
- [Chinese / 中文](LANGUAGEPACKS-CHINESE.md)
## Summary
Stub.
This page should describe how language packs work, how to import them, and point to the location of downloadable
language packs.
The homepage of default language packs included in FlorisBoard should link to this page.

View File

@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2020 Patrick Goldinger
Copyright 2020-2025 The FlorisBoard Contributors
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,27 +1,27 @@
<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 [![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) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) [![FlorisBoard CI](https://github.com/florisboard/florisboard/actions/workflows/android.yml/badge.svg?event=push)](https://github.com/florisboard/florisboard/actions/workflows/android.yml)
**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.
<table>
<tr>
<th align="center" width="50%">
<h3>Stable <a href="https://github.com/florisboard/florisboard/releases/latest"><img alt="Latest stable release" src="https://img.shields.io/github/v/release/florisboard/florisboard"></a></h3>
<h3>Stable <a href="https://github.com/florisboard/florisboard/releases/latest"><img alt="Latest stable release" src="https://img.shields.io/github/v/release/florisboard/florisboard?sort=semver&display_name=tag&color=28a745"></a></h3>
</th>
<th align="center" width="50%">
<h3>Beta <a href="https://github.com/florisboard/florisboard/releases"><img alt="Latest beta release" src="https://img.shields.io/github/v/release/florisboard/florisboard?include_prereleases"></a></h3>
<h3>Preview <a href="https://github.com/florisboard/florisboard/releases"><img alt="Latest preview release" src="https://img.shields.io/github/v/release/florisboard/florisboard?include_prereleases&sort=semver&display_name=tag&color=fd7e14"></a></h3>
</th>
</tr>
<tr>
<td valign="top">
<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>
<p><i>Major versions only</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, 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>
<p><i>Major + Alpha/Beta/Rc versions</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>
@@ -34,6 +34,11 @@ fully respecting your privacy. Currently in early-beta state.
</p>
<p>
**Obtainium**: [Auto-import stable config][obtainium_stable]
</p>
<p>
**Manual**: Download and install the APK from the release page.
</p>
@@ -42,7 +47,12 @@ fully respecting your privacy. Currently in early-beta state.
<p><a href="https://apt.izzysoft.de/fdroid/index/apk/dev.patrickgold.florisboard.beta"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" height="64" alt="IzzySoft repo badge"></a></p>
<p>
**Google Play**: Join the [FlorisBoard Test Group](https://groups.google.com/g/florisboard-public-alpha-test), then visit the [beta testing page](https://play.google.com/apps/testing/dev.patrickgold.florisboard.beta). Once joined and installed, updates will be delivered like for any other app. ([Store entry](https://play.google.com/store/apps/details?id=dev.patrickgold.florisboard.beta))
**Google Play**: Join the [FlorisBoard Test Group](https://groups.google.com/g/florisboard-public-alpha-test), then visit the [preview testing page](https://play.google.com/apps/testing/dev.patrickgold.florisboard.beta). Once joined and installed, updates will be delivered like for any other app. ([Store entry](https://play.google.com/store/apps/details?id=dev.patrickgold.florisboard.beta))
</p>
<p>
**Obtainium**: [Auto-import preview config][obtainium_preview]
</p>
<p>
@@ -54,50 +64,57 @@ 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.6.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 / history / suggestions
> [!IMPORTANT]
> Word suggestions/spell checking are not included in the current releases
> and are a major goal for the v0.5 milestone.
Feature roadmap: See [ROADMAP.md](ROADMAP.md)
## Contributing
Wanna contribute to FlorisBoard? That's great to hear! There are lots of
different ways to help out. Bug reporting, making pull requests,
translating FlorisBoard to make it more accessible, etc. For more
information see the [contributing guidelines](CONTRIBUTING.md). Thank
you for your help!
Want to contribute to FlorisBoard? That's great to hear! There are lots of
different ways to help out, please see the [contribution guidelines](CONTRIBUTING.md) for more info.
## Addons Store
The official [Addons Store](https://beta.addons.florisboard.org) offers the possibility for the community to share and download FlorisBoard extensions.
Instructions on how to publish addons can be found [here](https://github.com/florisboard/florisboard/wiki/How-to-publish-on-FlorisBoard-Addons).
Many thanks to Ali ([@4H1R](https://github.com/4H1R)) for implementing the store!
> [!NOTE]
> During the initial beta release phase, the Addons Store _will_ only accept theme extensions.
> Later on we plan to add support for language packs and keyboard extensions.
## List of permissions FlorisBoard requests
Please refer to this [page](https://github.com/florisboard/florisboard/wiki/List-of-permissions-FlorisBoard-requests)
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)
* [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-2025 The FlorisBoard Contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -111,3 +128,12 @@ 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.
```
Thanks to [The FlorisBoard Contributors](https://github.com/florisboard/florisboard/graphs/contributors) for making this project possible!
<!-- BEGIN SECTION: obtainium_links -->
<!-- auto-generated link templates, do NOT edit by hand -->
<!-- see fastlane/update-readme.sh -->
[obtainium_preview]: https://apps.obtainium.imranr.dev/redirect.html?r=obtainium://app/%7B%22id%22%3A%22dev.patrickgold.florisboard.beta%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fflorisboard%2Fflorisboard%22%2C%22author%22%3A%22florisboard%22%2C%22name%22%3A%22FlorisBoard%20Preview%22%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Atrue%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22preview%5C%22%7D%22%7D%0A
[obtainium_stable]: https://apps.obtainium.imranr.dev/redirect.html?r=obtainium://app/%7B%22id%22%3A%22dev.patrickgold.florisboard%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fflorisboard%2Fflorisboard%22%2C%22author%22%3A%22florisboard%22%2C%22name%22%3A%22FlorisBoard%20Stable%22%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Afalse%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22stable%5C%22%7D%22%7D%0A
<!-- END SECTION: obtainium_links -->

View File

@@ -1,101 +1,50 @@
# FlorisBoard's feature roadmap & milestones
# Roadmap
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 is planned to be added to FlorisBoard in the foreseeable future. Note that there are no ETAs for any version milestones down below, experience has shown 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!
Each major milestone has associated alpha/beta releases, so if you are interested in previewing features quicker, keep an eye out! Each major 0.x release has also patch releases after the initial major release, which will be published on both the stable and preview tracks.
## 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.5
### 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)
- Implement predictive text support / spell checking
- Consider adding proximity-based key typo detection
- Add new extension type: Language Pack
- Basically groups all locale-relevant data (predictive base model, emoji suggestion data, ...)
in a dynamically importable extension file
- New text processing logic (maybe moved back / split to 0.6)
- Add floating keyboard mode
- New keyboard layout engine + file syntax based on the upcoming Unicode Keyboard v3 standard
- Add Tablet mode / Optimizations for landscape input based on new keyboard layout engine
- Add support for any remaining new features introduced with Android 13
### 0.3.15
- Hotfix release for possible bugs in the preference rework, may be skipped and 0.4.0 is directly released.
## 0.6
## 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)
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.
## 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")
- 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!!)
- Fully scrollable emoji list (soft category borders)
- More granular themeing options
- Layout customization (e.g. placement of category buttons)
- Maybe: consider upgrading to emoji2 for better unified system-wide emoji styles
- Reimplementation of glide typing with the new layout engine and predictive text core
- Prepare FlorisBoard repository and app store presence for public beta release on Google Play (will go live with stable 0.6)
- Rework branding images and texts of FlorisBoard for the app stores
- Focus on stability and experience improvements of the app and keyboard
- Add support for new features introduced with Android 14 / 15
- Not finalized, but planned: raise minimum required Android version from Android 7 (SDK level 24) to Android 8 (SDK level 26)
## 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 / Planned (unassigned)
## 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**
- Full on-board layout editor which allows users to create their own layouts without writing a JSON file
- Theme rework part II
- Adaptive themes v2
- Voice-to-text with Mozilla's open-source voice service
- Voice-to-text with Mozilla's open-source voice service (or any other oss voice provider)
- Text translation
- Glide typing better word detection
- Proximity-based key typo detection
- Floating keyboard
- Tablet mode / Optimizations for landscape input
- Stickers/GIFs
- Kaomoji panel implementation
- FlorisBoard landing web page for presentation
- Implementing additional layouts
- Support for Tasker/Automate/MacroDroid plugins
- Support for WearOS/Smartwatches
- Handwriting
- ...

2
app/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
# Exclude auto-generated icu4c assets
src/main/assets/icu4c/

View File

@@ -1,16 +1,46 @@
/*
* Copyright (C) 2022-2025 The FlorisBoard Contributors
*
* 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.
*/
import java.io.ByteArrayOutputStream
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag
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.plugin.compose)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.ksp)
alias(libs.plugins.mannodermaus.android.junit5)
alias(libs.plugins.mikepenz.aboutlibraries)
}
val projectMinSdk: String by project
val projectTargetSdk: String by project
val projectCompileSdk: String by project
val projectBuildToolsVersion: String by project
val projectNdkVersion: String by project
val projectVersionCode: String by project
val projectVersionName: String by project
val projectVersionNameSuffix = projectVersionName.substringAfter("-", "")
android {
compileSdk = 31
buildToolsVersion = "31.0.0"
ndkVersion = "22.1.7171670"
namespace = "dev.patrickgold.florisboard"
compileSdk = projectCompileSdk.toInt()
buildToolsVersion = projectBuildToolsVersion
ndkVersion = projectNdkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
@@ -18,84 +48,65 @@ 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 = 31
versionCode = 65
versionName = "0.3.14"
minSdk = projectMinSdk.toInt()
targetSdk = projectTargetSdk.toInt()
versionCode = projectVersionCode.toInt()
versionName = projectVersionName.substringBefore("-")
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()}\"")
buildConfigField("String", "FLADDONS_API_VERSION", "\"v~draft2\"")
buildConfigField("String", "FLADDONS_STORE_URL", "\"beta.addons.florisboard.org\"")
externalNativeBuild {
cmake {
cFlags("-fvisibility=hidden", "-DU_STATIC_IMPLEMENTATION=1")
cppFlags("-fvisibility=hidden", "-std=c++17", "-fexceptions", "-ffunction-sections", "-fdata-sections", "-DU_DISABLE_RENAMING=1", "-DU_STATIC_IMPLEMENTATION=1")
arguments("-DANDROID_STL=c++_static")
}
}
ndk {
abiFilters += listOf("armeabi-v7a", "arm64-v8a")
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
arg("room.incremental", "true")
arg("room.expandProjection", "true")
}
sourceSets {
maybeCreate("main").apply {
assets {
srcDirs("src/main/assets", "src/main/icu4c/prebuilt/assets")
srcDirs("src/main/assets")
}
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 {
buildConfig = true
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.1.0-rc01"
}
externalNativeBuild {
cmake {
path("src/main/cpp/CMakeLists.txt")
}
}
buildTypes {
named("debug").configure {
named("debug") {
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
versionNameSuffix = "-debug+${getGitCommitHash(short = true)}"
isDebuggable = true
isJniDebuggable = true
ndk {
// For running FlorisBoard on the emulator
abiFilters += listOf("x86", "x86_64")
}
isJniDebuggable = false
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_debug")
resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_debug_round")
@@ -103,11 +114,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 = "-beta09"
proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt"))
versionNameSuffix = projectVersionNameSuffix
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 +128,28 @@ android {
resValue("string", "floris_app_name", "FlorisBoard Beta")
}
named("release").configure {
proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt"))
named("release") {
versionNameSuffix = projectVersionNameSuffix
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")
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
isMinifyEnabled = true
isShrinkResources = true
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")
}
}
aboutLibraries {
configPath = "app/src/main/config"
}
testOptions {
@@ -135,38 +162,74 @@ android {
}
}
composeCompiler {
// DO NOT ENABLE STRONG SKIPPING! This project currently relies on
// recomposition on parent state change to update the UI correctly.
featureFlags.add(ComposeFeatureFlag.StrongSkipping.disabled())
}
tasks.withType<Test> {
useJUnitPlatform()
}
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-flowlayout:0.20.2")
implementation("com.google.accompanist:accompanist-systemuicontroller:0.20.2")
implementation("dev.patrickgold.jetpref:jetpref-datastore-model:0.1.0-beta05")
implementation("dev.patrickgold.jetpref:jetpref-datastore-ui:0.1.0-beta05")
implementation("dev.patrickgold.jetpref:jetpref-material-ui:0.1.0-beta05")
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.androidx.activity.compose)
implementation(libs.androidx.activity.ktx)
implementation(libs.androidx.autofill)
implementation(libs.androidx.collection.ktx)
implementation(libs.androidx.compose.material3)
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.exifinterface)
implementation(libs.androidx.material.icons)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.profileinstaller)
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.runtime)
implementation(libs.cache4k)
implementation(libs.kotlinx.coroutines)
implementation(libs.kotlinx.serialization.json)
implementation(libs.mikepenz.aboutlibraries.core)
implementation(libs.mikepenz.aboutlibraries.compose)
implementation(libs.patrickgold.compose.tooltip)
implementation(libs.patrickgold.jetpref.datastore.model)
implementation(libs.patrickgold.jetpref.datastore.ui)
implementation(libs.patrickgold.jetpref.material.ui)
testImplementation("io.kotest:kotest-runner-junit5:5.1.0")
testImplementation("io.kotest:kotest-assertions-core:5.1.0")
testImplementation("io.kotest:kotest-property:5.1.0")
testImplementation("io.kotest.extensions:kotest-extensions-robolectric:0.5.0")
testImplementation("nl.jqno.equalsverifier:equalsverifier:3.8.3")
implementation(project(":lib:android"))
implementation(project(":lib:color"))
implementation(project(":lib:kotlin"))
implementation(project(":lib:native"))
implementation(project(":lib:snygg"))
androidTestImplementation("androidx.test.ext", "junit", "1.1.2")
androidTestImplementation("androidx.test.espresso", "espresso-core", "3.3.0")
testImplementation(libs.equalsverifier)
testImplementation(libs.kotest.assertions.core)
testImplementation(libs.kotest.extensions.roboelectric)
testImplementation(libs.kotest.property)
testImplementation(libs.kotest.runner.junit5)
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()
}

3
app/lint.xml Normal file
View File

@@ -0,0 +1,3 @@
<lint>
<issue id="UsingMaterialAndMaterial3Libraries" severity="ignore" />
</lint>

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,68 @@
{
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "dc886df9792fe6b6ad532cc7aa7c4a84",
"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, `orientation` 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": "orientation",
"columnName": "orientation",
"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, 'dc886df9792fe6b6ad532cc7aa7c4a84')"
]
}
}

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,94 @@
{
"formatVersion": 1,
"database": {
"version": 3,
"identityHash": "145ca5bf4bff8e98f71ebc70ab3b495b",
"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, `isSensitive` INTEGER NOT NULL DEFAULT 0, `isRemoteDevice` INTEGER NOT NULL DEFAULT 0)",
"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
},
{
"fieldPath": "isSensitive",
"columnName": "isSensitive",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "isRemoteDevice",
"columnName": "isRemoteDevice",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"_id"
]
},
"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, '145ca5bf4bff8e98f71ebc70ab3b495b')"
]
}
}

View File

@@ -0,0 +1,94 @@
{
"formatVersion": 1,
"database": {
"version": 4,
"identityHash": "1dd181d116dcb4530fb5b33451ea9ab5",
"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, `is_sensitive` INTEGER NOT NULL DEFAULT 0, `is_remote_device` INTEGER NOT NULL DEFAULT 0)",
"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
},
{
"fieldPath": "isSensitive",
"columnName": "is_sensitive",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "isRemoteDevice",
"columnName": "is_remote_device",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"_id"
]
},
"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, '1dd181d116dcb4530fb5b33451ea9ab5')"
]
}
}

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,3 +1,19 @@
/*
* Copyright (C) 2025 The FlorisBoard Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dev.patrickgold.florisboard
import androidx.test.ext.junit.runners.AndroidJUnit4

View File

@@ -1,26 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2020 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.
-->
<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"/>
<!-- Permission needed to create notifications on devices running Android 13+ -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<!-- Android 11+ only: Define that FlorisBoard requests to see all apps that
ship with an IME or Spell Check service. This is used to guide the user
in the Settings Ui why FlorisBoard may not be working.
@@ -41,10 +28,14 @@
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/floris_app_icon"
android:label="@string/floris_app_name"
android:enableOnBackInvokedCallback="true"
android:roundIcon="@mipmap/floris_app_icon_round"
android:supportsRtl="true"
android:theme="@style/FlorisAppTheme"
tools:targetApi="s">
tools:targetApi="tiramisu">
<!-- Allow app to be profiled for benchmarking and baseline profile generation -->
<profileable android:shell="true"/>
<!-- IME service -->
<service
@@ -52,8 +43,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>
@@ -80,10 +70,26 @@
android:launchMode="singleTask"
android:roundIcon="@mipmap/floris_app_icon_round"
android:windowSoftInputMode="adjustResize"
android:theme="@style/FlorisAppTheme"
android:exported="false">
android:theme="@style/FlorisAppTheme.Splash"
android:exported="true">
<intent-filter>
<data android:scheme="florisboard" android:host="app-ui"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="ui" android:host="florisboard" android:pathPrefix="/" />
</intent-filter>
<intent-filter android:label="Import Extension">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="content"/>
<data android:mimeType="application/vnd.florisboard.extension+zip"/>
<data android:mimeType="application/octet-stream"/><!-- Firefox looking at you :eyes: -->
</intent-filter>
<intent-filter android:label="Import Extension">
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/vnd.florisboard.extension+zip"/>
<data android:mimeType="application/octet-stream"/><!-- Firefox looking at you :eyes: -->
</intent-filter>
</activity>
@@ -95,7 +101,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"/>
@@ -103,34 +109,29 @@
</intent-filter>
</activity-alias>
<!-- Import File Bridging Activity -->
<activity
android:name="dev.patrickgold.florisboard.app.ui.ext.ImportFileActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__title"
android:launchMode="singleTask"
android:roundIcon="@mipmap/floris_app_icon_round"
android:windowSoftInputMode="adjustResize"
android:theme="@style/FlorisAppTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="*" android:host="*" android:pathPattern=".*\\.flex"/>
<data android:scheme="*" android:host="*" android:pathPattern=".*\\.xpi"/>
</intent-filter>
</activity>
<!-- 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"/>
<!-- Copy to Clipboard Activity -->
<activity
android:name="dev.patrickgold.florisboard.ime.clipboard.FlorisCopyToClipboardActivity"
android:theme="@style/FlorisAppTheme.Transparent"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>
<!-- 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>
@@ -146,6 +147,17 @@
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,765 @@
{
"$": "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",
"áf": "à", "ár": "ả", "áx": "ã", "áj": "ạ",
"às": "á", "àr": "ả", "àx": "ã", "àj": "ạ",
"ảs": "á", "ảf": "à", "ảx": "ã", "ảj": "ạ",
"ãs": "á", "ãf": "à", "ãr": "ả", "ãj": "ạ",
"ạs": "á", "ạf": "à", "ạr": "ả", "ạx": "ã",
"ấf": "ầ", "ấr": "ẩ", "ấx": "ẫ", "ấj": "ậ",
"ầs": "ấ", "ầr": "ẩ", "ầx": "ẫ", "ầj": "ậ",
"ẩs": "ấ", "ẩf": "ầ", "ẩx": "ẫ", "ẩj": "ậ",
"ẫs": "ấ", "ẫf": "ầ", "ẫr": "ẩ", "ẫj": "ậ",
"ậs": "ấ", "ậf": "ầ", "ậr": "ẩ", "ậx": "ẫ",
"ắf": "ằ", "ắr": "ẳ", "ắx": "ẵ", "ắj": "ặ",
"ằs": "ắ", "ằr": "ẳ", "ằx": "ẵ", "ằj": "ặ",
"ẳs": "ắ", "ẳf": "ằ", "ẳx": "ẵ", "ẳj": "ặ",
"ẵs": "ắ", "ẵf": "ằ", "ẵr": "ẳ", "ẵj": "ặ",
"ặs": "ắ", "ặf": "ằ", "ặr": "ẳ", "ặx": "ẵ",
"éf": "è", "ér": "ẻ", "éx": "ẽ", "éj": "ẹ",
"ès": "é", "èr": "ẻ", "èx": "ẽ", "èj": "ẹ",
"ẻs": "é", "ẻf": "è", "ẻx": "ẽ", "ẻj": "ẹ",
"ẽs": "é", "ẽf": "è", "ẽr": "ẻ", "ẽj": "ẹ",
"ẹs": "é", "ẹf": "è", "ẹr": "ẻ", "ẹx": "ẽ",
"ếf": "ề", "ếr": "ể", "ếx": "ễ", "ếj": "ệ",
"ềs": "ế", "ềr": "ể", "ềx": "ễ", "ềj": "ệ",
"ểs": "ế", "ểf": "ề", "ểx": "ễ", "ểj": "ệ",
"ễs": "ế", "ễf": "ề", "ễr": "ể", "ễj": "ệ",
"ệs": "ế", "ệf": "ề", "ệr": "ể", "ệx": "ễ",
"íf": "ì", "ír": "ỉ", "íx": "ĩ", "íj": "ị",
"ìs": "í", "ìr": "ỉ", "ìx": "ĩ", "ìj": "ị",
"ỉs": "í", "ỉf": "ì", "ỉx": "ĩ", "ỉj": "ị",
"ĩs": "í", "ĩf": "ì", "ĩr": "ỉ", "ĩj": "ị",
"ịs": "í", "ịf": "ì", "ịr": "ỉ", "ịx": "ĩ",
"óf": "ò", "ór": "ỏ", "óx": "õ", "ój": "ọ",
"òs": "ó", "òr": "ỏ", "òx": "õ", "òj": "ọ",
"ỏs": "ó", "ỏf": "ò", "ỏx": "õ", "ỏj": "ọ",
"õs": "ó", "õf": "ò", "õr": "ỏ", "õj": "ọ",
"ọs": "ó", "ọf": "ò", "ọr": "ỏ", "ọx": "õ",
"ốf": "ồ", "ốr": "ổ", "ốx": "ỗ", "ốj": "ộ",
"ồs": "ố", "ồr": "ổ", "ồx": "ỗ", "ồj": "ộ",
"ổs": "ố", "ổf": "ồ", "ổx": "ỗ", "ổj": "ộ",
"ỗs": "ố", "ỗf": "ồ", "ỗr": "ổ", "ỗj": "ộ",
"ộs": "ố", "ộf": "ồ", "ộr": "ổ", "ộx": "ỗ",
"ớf": "ờ", "ớr": "ở", "ớx": "ỡ", "ớj": "ợ",
"ờs": "ớ", "ờr": "ở", "ờx": "ỡ", "ờj": "ợ",
"ởs": "ớ", "ởf": "ờ", "ởx": "ỡ", "ởj": "ợ",
"ỡs": "ớ", "ỡf": "ờ", "ỡr": "ở", "ỡj": "ợ",
"ợs": "ớ", "ợf": "ờ", "ợr": "ở", "ợx": "ỡ",
"úf": "ù", "úr": "ủ", "úx": "ũ", "új": "ụ",
"ùs": "ú", "ùr": "ủ", "ùx": "ũ", "ùj": "ụ",
"ủs": "ú", "ủf": "ù", "ủx": "ũ", "ủj": "ụ",
"ũs": "ú", "ũf": "ù", "ũr": "ủ", "ũj": "ụ",
"ụs": "ú", "ụf": "ù", "ụr": "ủ", "ụx": "ũ",
"ứf": "ừ", "ứr": "ử", "ứx": "ữ", "ứj": "ự",
"ừs": "ứ", "ừr": "ử", "ừx": "ữ", "ừj": "ự",
"ửs": "ứ", "ửf": "ừ", "ửx": "ữ", "ửj": "ự",
"ữs": "ứ", "ữf": "ừ", "ữr": "ử", "ữj": "ự",
"ựs": "ứ", "ựf": "ừ", "ựr": "ử", "ựx": "ữ",
"ýf": "ỳ", "ýr": "ỷ", "ýx": "ỹ", "ýj": "ỵ",
"ỳs": "ý", "ỳr": "ỷ", "ỳx": "ỹ", "ỳj": "ỵ",
"ỷs": "ý", "ỷf": "ỳ", "ỷx": "ỹ", "ỷj": "ỵ",
"ỹs": "ý", "ỹf": "ỳ", "ỹr": "ỷ", "ỹj": "ỵ",
"ỵs": "ý", "ỵf": "ỳ", "ỵr": "ỷ", "ỵx": "ỹ",
"gias": "giá", "giaf": "già", "giar": "giả", "giax": "giã", "giaj": "giạ",
"gía": "giá", "gìa": "già", "gỉa": "giả", "gĩa": "giã", "gịa": "giạ",
"gíă": "giắ", "gìă": "giằ", "gỉă": "giẳ", "gĩă": "giẵ", "gịă": "giặ",
"gíâ": "giấ", "gìâ": "giầ", "gỉâ": "giẩ", "gĩẫ": "giẫ", "gịâ": "giậ",
"gíe": "gié", "gìe": "giè", "gỉe": "giẻ", "gĩe": "giẽ", "gịe": "giẹ",
"gíê": "giế", "gìê": "giề", "gỉê": "giể", "gĩê": "giễ", "gịê": "giệ",
"gío": "gió", "gìo": "giò", "gỉo": "giỏ", "gĩo": "giõ", "gịo": "giọ",
"gíô": "giố", "gìô": "giồ", "gỉô": "giổ", "gĩô": "giỗ", "gịô": "giộ",
"gíơ": "giớ", "gìơ": "giờ", "gỉơ": "giở", "gĩơ": "giỡ", "gịơ": "giợ",
"gius": "giú", "giuf": "giù", "giur": "giủ", "giux": "giũ", "giuj": "giụ",
"gíu": "giú", "gìu": "giù", "gỉu": "giủ", "gĩu": "giũ", "gịu": "giụ",
"gíư": "giứ", "gìư": "giừ", "gỉư": "giử", "gĩư": "giữ", "gịư": "giự",
"ghíê": "ghiế", "ghìê": "ghiề", "ghỉê": "ghiể", "ghĩê": "ghiễ", "ghịê": "ghiệ",
"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", "ucw": "ưc", "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", "ưcw": "ucw", "ư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",
"iás": "ias", "iàf": "iaf", "iảr": "iar", "iãx": "iax", "iạj": "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",
"ưcs": "ức", "ưcj": "ực",
"úcw": "ức", "ụcw": "ực",
"ư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",
"ứcs": "ưcs", "ứcw": "úcw", "ưcsw": "ucsw", "úcws": "ucws",
"ựcj": "ưcj", "ựcw": "ụcw", "ưcjw": "ucjw", "ụcwj": "ucwj",
"ứ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": "iẻm", "iemx": "iẽm", "iemj": "iẹm",
"iéme": "iếm", "ième": "iềm", "iẻme": "iểm", "iẽme": "iễm", "iẹme": "iệm",
"iêms": "iếm", "iêmf": "iềm", "iêmr": "iểm", "iêmx": "iễm", "iêmj": "iệm",
"iens": "ién", "ienf": "ièn", "ienr": "iẻn", "ienx": "iẽn", "ienj": "iẹn",
"iéne": "iến", "iène": "iền", "iẻne": "iển", "iẽne": "iễn", "iẹne": "iện",
"iêns": "iến", "iênf": "iền", "iênr": "iển", "iênx": "iễn", "iênj": "iện",
"ieps": "iép", "iepj": "iẹp",
"iépe": "iếp", "iẹpe": "iệp",
"iêps": "iếp", "iêpj": "iệp",
"iets": "iét", "ietj": "iẹt",
"iéte": "iết", "iẹte": "iệt",
"iêts": "iết", "iêtj": "iệt",
"ieus": "iéu", "ieuf": "ièu", "ieur": "iẻu", "ieux": "iẽu", "ieuj": "iẹu",
"iéue": "iếu", "ièue": "iều", "iẻue": "iểu", "iẽue": "iễu", "iẹue": "iệu",
"iêus": "iếu", "iêuf": "iều", "iêur": "iểu", "iêux": "iễu", "iêuj": "iệu",
"iengs": "iéng", "iengf": "ièng", "iengr": "iẻng", "iengx": "iẽng", "iengj": "iẹng",
"iénge": "iếng", "iènge": "iềng", "iẻnge": "iểng", "iẽnge": "iễng", "iẹnge": "iệng",
"iêngs": "iếng", "iêngf": "iềng", "iêngr": "iểng", "iêngx": "iễng", "iêngj": "iệng",
"iếs": "iês", "iếe": "iée", "iêse": "iese", "iées": "iees",
"iềf": "iêf", "iềe": "ièe", "iêfe": "iefe", "ièef": "ieef",
"iểr": "iêr", "iểe": "iẻe", "iêre": "iere", "iẻer": "ieer",
"iễx": "iêx", "iễe": "iẽe", "iêxe": "iexe", "iẽex": "ieex",
"iệj": "iêj", "iệe": "iẹe", "iêje": "ieje", "iẹej": "ieej",
"iếms": "iêms", "iếme": "iéme", "iêmse": "iemse", "iémes": "iemes",
"iềmf": "iêmf", "iềme": "ième", "iêmfe": "iemfe", "ièmef": "iemef",
"iểmr": "iêmr", "iểme": "iẻme", "iêmre": "iemre", "iẻmer": "iemer",
"iễmx": "iêmx", "iễme": "iẽme", "iêmxe": "iemxe", "iẽmex": "iemex",
"iệmj": "iêmj", "iệme": "iẹme", "iêmje": "iemje", "iẹmej": "iemej",
"iếns": "iêns", "iếne": "iéne", "iênse": "iense", "iénes": "ienes",
"iềnf": "iênf", "iềne": "iène", "iênfe": "ienfe", "iènef": "ienef",
"iểnr": "iênr", "iểne": "iẻne", "iênre": "ienre", "iẻner": "iener",
"iễnx": "iênx", "iễne": "iẽne", "iênxe": "ienxe", "iẽnex": "ienex",
"iệnj": "iênj", "iệne": "iẹne", "iênje": "ienje", "iẹnej": "ienej",
"iếps": "iêps", "iếpe": "iépe", "iêpse": "iepse", "iépes": "iepes",
"iệpj": "iêpj", "iệpe": "iẹpe", "iêpje": "iepje", "iẹpej": "iepej",
"iếts": "iêts", "iếte": "iéte", "iêtse": "ietse", "iétes": "ietes",
"iệtj": "iêtj", "iệte": "iẹte", "iêtje": "ietje", "iẹtej": "ietej",
"iếus": "iêus", "iếue": "iéue", "iêuse": "ieuse", "iéues": "ieues",
"iềuf": "iêuf", "iềue": "ièue", "iêufe": "ieufe", "ièuef": "ieuef",
"iểur": "iêur", "iểue": "iẻue", "iêure": "ieure", "iẻuer": "ieuer",
"iễux": "iêux", "iễue": "iẽue", "iêuxe": "ieuxe", "iẽuex": "ieuex",
"iệuj": "iêuj", "iệue": "iẹue", "iêuje": "ieuje", "iẹuej": "ieuej",
"iếngs": "iêngs", "iếnge": "iénge", "iêngse": "iengse", "iénges": "ienges",
"iềngf": "iêngf", "iềnge": "iènge", "iêngfe": "iengfe", "ièngef": "iengef",
"iểngr": "iêngr", "iểnge": "iẻnge", "iêngre": "iengre", "iẻnger": "ienger",
"iễngx": "iêngx", "iễnge": "iẽnge", "iêngxe": "iengxe", "iẽngex": "iengex",
"iệngj": "iêngj", "iệnge": "iẹnge", "iêngje": "iengje", "iẹngej": "iengej",
"uyens": "uyén", "uyenf": "uyèn", "uyenr": "uyẻn", "uyenx": "uyẽn", "uyenj": "uyẹn",
"uyéne": "uyến", "uyène": "uyền", "uyẻne": "uyển", "uyẽne": "uyễn", "uyẹne": "uyện",
"uyêns": "uyến", "uyênf": "uyền", "uyênr": "uyển", "uyênx": "uyễn", "uyênj": "uyện",
"uyets": "uyét", "uyetf": "uyèt", "uyetr": "uyẻt", "uyetx": "uyẽt", "uyetj": "uyẹt",
"uyéte": "uyết", "uyète": "uyềt", "uyẻte": "uyểt", "uyẽte": "uyễt", "uyẹte": "uyệt",
"uyêts": "uyết", "uyêtf": "uyềt", "uyêtr": "uyểt", "uyêtx": "uyễt", "uyêtj": "uyệt",
"uyếns": "uyêns", "uyếne": "uyéne", "uyênse": "uyense", "uyénes": "uyenes",
"uyềnf": "uyênf", "uyềne": "uyène", "uyênfe": "uyenfe", "uyènef": "uyenef",
"uyểnr": "uyênr", "uyểne": "uyẻne", "uyênre": "uyenre", "uyẻner": "uyener",
"uyễnx": "uyênx", "uyễne": "uyẽne", "uyênxe": "uyenxe", "uyẽnex": "uyenex",
"uyệnj": "uyênj", "uyệne": "uyẹne", "uyênje": "uyenje", "uyẹnej": "uyenej",
"uyếts": "uyêts", "uyếte": "uyéte", "uyêtse": "uyetse", "uyétes": "uyetes",
"uyềtf": "uyêtf", "uyềte": "uyète", "uyêtfe": "uyetfe", "uyètef": "uyetef",
"uyểtr": "uyêtr", "uyểte": "uyẻte", "uyêtre": "uyetre", "uyẻter": "uyeter",
"uyễtx": "uyêtx", "uyễte": "uyẽte", "uyêtxe": "uyetxe", "uyẽtex": "uyetex",
"uyệtj": "uyêtj", "uyệte": "uyẹte", "uyêtje": "uyetje", "uyẹtej": "uyetej",
"uyts": "uýt", "uytj": "uỵt",
"uynhs": "uýnh", "uynhf": "uỳnh", "uynhr": "uỷnh", "uynhx": "uỹnh", "uynhj": "uỵnh",
"uýts": "uyts", "uỵtj": "uytj",
"uýnhs": "uynhs", "uỳnhf": "uynhf", "uỷnhr": "uynhr", "uỹnh": "uynhx", "uỵnhj": "uynhj",
"uits": "uít", "uitj": "uịt",
"uíts": "uits", "uịtj": "uitj",
"uos": "úo", "uof": "ùo", "uor": "ủo", "uox": "ũo", "uoj": "ụo",
"úoc": "uóc", "ụoc": "uọc",
"uocs": "uóc", "uocj": "uọc",
"uócw": "ước", "uọcw": "ược",
"ươcs": "ước", "ươcj": "ược",
"úoi": "uói", "ùoi" : "uòi", "ủoi": "uỏi", "ũoi": "uõi", "ụoi": "uọi",
"uois": "uói", "uoif": "uòi", "uoir": "uỏi", "uoix": "uõi", "uoij": "uọi",
"uóiw": "ưới", "uòiw": "ười", "uỏiw": "ưởi", "uõiw": "ưỡi", "uọiw": "ượi",
"ươis": "ưới", "ươif": "ười", "ươir": "ưởi", "ươix": "ưỡi", "ươij": "ượi",
"úom": "uóm", "ùom" : "uòm", "ủom": "uỏm", "ũom": "uõm", "ụom": "uọm",
"uoms": "uóm", "uomf": "uòm", "uomr": "uỏm", "uomx": "uõm", "uomj": "uọm",
"uómw": "ướm", "uòmw": "ườm", "uỏmw": "ưởm", "uõmw": "ưỡm", "uọmw": "ượm",
"ươms": "ướm", "ươmf": "ườm", "ươmr": "ưởm", "ươmx": "ưỡm", "ươmj": "ượm",
"úon": "uón", "ùon" : "uòn", "ủon": "uỏn", "ũon": "uõn", "ụon": "uọn",
"uons": "uón", "uonf": "uòn", "uonr": "uỏn", "uonx": "uõn", "uonj": "uọn",
"uónw": "ướn", "uònw": "ườn", "uỏnw": "ưởn", "uõnw": "ưỡn", "uọnw": "ượn",
"ươns": "ướn", "ươnf": "ườn", "ươnr": "ưởn", "ươnx": "ưỡn", "ươnj": "ượn",
"úop": "uóp", "ụop": "uọp",
"uops": "uóp", "uopj": "uọp",
"uópw": "ướp", "uọpw": "ượp",
"ươps": "ướp", "ươpj": "ượp",
"úot": "uót", "ụot": "uọt",
"uots": "uót", "uotj": "uọt",
"uótw": "ướt", "uọtw": "ượt",
"ươts": "ướt", "ươtj": "ượt",
"úou": "uóu", "ùou" : "uòu", "ủou": "uỏu", "ũou": "uõu", "ụou": "uọu",
"uous": "uóu", "uouf": "uòu", "uour": "uỏu", "uoux": "uõu", "uouj": "uọu",
"uóuw": "ướu", "uòuw": "ườu", "uỏuw": "ưởu", "uõuw": "ưỡu", "uọuw": "ượu",
"ươus": "ướu", "ươuf": "ườu", "ươur": "ưởu", "ươux": "ưỡu", "ươuj": "ượu",
"úong": "uóng", "ùong" : "uòng", "ủong": "uỏng", "ũong": "uõng", "ụong": "uọng",
"uongs": "uóng", "uongf": "uòng", "uongr": "uỏng", "uongx": "uõng", "uongj": "uọng",
"uóngw": "ướng", "uòngw": "ường", "uỏngw": "ưởng", "uõngw": "ưỡng", "uọngw": "ượng",
"ươngs": "ướng", "ươngf": "ường", "ươngr": "ưởng", "ươngx": "ưỡng", "ươngj": "ượng",
"úos": "uos", "ùof": "uof", "ủor": "uor", "ũo": "uox", "ụoj": "uoj",
"uócs": "uocs", "uọcj": "uocj",
"ướcs": "ươcs", "ướcw": "uócw", "ươcsw": "uocsw", "uócws": "uocws",
"ượcj": "ươcj", "ượcw": "uọcw", "ươcjw": "uocjw", "uọcwj": "uocwj",
"uóis": "uois", "uòif": "uoif", "uỏir": "uoir", "uõix": "uoix", "uọij": "uoij",
"ướis": "ươis", "ướiw": "uóiw", "ươisw": "uoisw", "uóiws": "uoiws",
"ườif": "ươif", "ườiw": "uòiw", "ươifw": "uoifw", "uòiwf": "uoiwf",
"ưởir": "ươir", "ưởiw": "uỏiw", "ươirw": "uoirw", "uỏiwr": "uoiwr",
"ưỡix": "ươix", "ưỡiw": "uõiw", "ươixw": "uoixw", "uõiwx": "uoiwx",
"ượij": "ươij", "ượiw": "uóiw", "ươijw": "uoijw", "uọiwj": "uoiwj",
"uóms": "uoms", "uòmf": "uomf", "uỏmr": "uomr", "uõmx": "uomx", "uọmj": "uomj",
"ướms": "ươms", "ướmw": "uómw", "ươmsw": "uomsw", "uómws": "uomws",
"ườmf": "ươmf", "ườmw": "uòmw", "ươmfw": "uomfw", "uòmwf": "uomwf",
"ưởmr": "ươmr", "ưởmw": "uỏmw", "ươmrw": "uomrw", "uỏmwr": "uomwr",
"ưỡmx": "ươmx", "ưỡmw": "uõmw", "ươmxw": "uomxw", "uõmwx": "uomwx",
"ượmj": "ươmj", "ượmw": "uómw", "ươmjw": "uomjw", "uọmwj": "uomwj",
"uóns": "uons", "uònf": "uonf", "uỏnr": "uonr", "uõnx": "uonx", "uọnj": "uonj",
"ướns": "ươns", "ướnw": "uónw", "ươnsw": "uonsw", "uónws": "uonws",
"ườnf": "ươnf", "ườnw": "uònw", "ươnfw": "uonfw", "uònwf": "uonwf",
"ưởnr": "ươnr", "ưởnw": "uỏnw", "ươnrw": "uonrw", "uỏnwr": "uonwr",
"ưỡnx": "ươnx", "ưỡnw": "uõnw", "ươnxw": "uonxw", "uõnwx": "uonwx",
"ượnj": "ươnj", "ượnw": "uónw", "ươnjw": "uonjw", "uọnwj": "uonwj",
"uóps": "uops", "uọpj": "uopj",
"ướps": "ươps", "ướpw": "uópw", "ươpsw": "uopsw", "uópws": "uopws",
"ượpj": "ươpj", "ượpw": "uọpw", "ươpjw": "uopjw", "uọpwj": "uopwj",
"uóts": "uots", "uọtj": "uotj",
"ướts": "ươts", "ướtw": "uótw", "ươtsw": "uotsw", "uótws": "uotws",
"ượtj": "ươtj", "ượtw": "uọtw", "ươtjw": "uotjw", "uọtwj": "uotwj",
"uóus": "uous", "uòuf": "uouf", "uỏur": "uour", "uõux": "uoux", "uọuj": "uouj",
"ướus": "ươus", "ướuw": "uóuw", "ươusw": "uousw", "uóuws": "uouws",
"ườuf": "ươuf", "ườuw": "uòuw", "ươufw": "uoufw", "uòuwf": "uouwf",
"ưởur": "ươur", "ưởuw": "uỏuw", "ươurw": "uourw", "uỏuwr": "uouwr",
"ưỡux": "ươux", "ưỡuw": "uõuw", "ươuxw": "uouxw", "uõuwx": "uouwx",
"ượuj": "ươuj", "ượuw": "uóuw", "ươujw": "uoujw", "uọuwj": "uouwj",
"uóngs": "uongs", "uòngf": "uongf", "uỏngr": "uongr", "uõngx": "uongx", "uọngj": "uongj",
"ướngs": "ươngs", "ướngw": "uóngw", "ươngsw": "uongsw", "uóngws": "uongws",
"ườngf": "ươngf", "ườngw": "uòngw", "ươngfw": "uongfw", "uòngwf": "uongwf",
"ưởngr": "ươngr", "ưởngw": "uỏngw", "ươngrw": "uongrw", "uỏngwr": "uongwr",
"ưỡngx": "ươngx", "ưỡngw": "uõngw", "ươngxw": "uongxw", "uõngwx": "uongwx",
"ượngj": "ươngj", "ượngw": "uóngw", "ươngjw": "uongjw", "uọngwj": "uongwj",
"uóco": "uốc", "uọco": "uộc",
"uôcs": "uốc", "uôcj": "uộc",
"uóio": "uối", "uòio": "uồi", "uỏio": "uổi", "uõio": "uỗi", "uọio": "uội",
"uôis": "uối", "uôif": "uồi", "uôir": "uổi", "uôix": "uỗi", "uôij": "uội",
"uómo": "uốm", "uòmo": "uồm", "uỏmo": "uổm", "uõmo": "uỗm", "uọmo": "uộm",
"uôms": "uốm", "uômf": "uồm", "uômr": "uổm", "uômx": "uỗm", "uômj": "uộm",
"uóno": "uốn", "uòno": "uồn", "uỏno": "uổn", "uõno": "uỗn", "uọno": "uộn",
"uôns": "uốn", "uônf": "uồn", "uônr": "uổn", "uônx": "uỗn", "uônj": "uộn",
"uópo": "uốp", "uọpo": "uộp",
"uôps": "uốp", "uôpj": "uộp",
"uóto": "uốt", "uọto": "uột",
"uôts": "uốt", "uôtj": "uột",
"uóuo": "uốu", "uòuo": "uồu", "uỏuo": "uổu", "uõuo": "uỗu", "uọuo": "uộu",
"uôus": "uốu", "uôuf": "uồu", "uôur": "uổu", "uôux": "uỗu", "uôuj": "uộu",
"uóngo": "uống", "uòngo": "uồng", "uỏngo": "uổng", "uõngo": "uỗng", "uọngo": "uộng",
"uôngs": "uống", "uôngf": "uồng", "uôngr": "uổng", "uôngx": "uỗng", "uôngj": "uộng",
"uốcs": "uôcs", "uốco": "uóco", "uôcso": "uocso", "uócos": "uocos",
"uộcj": "uôcj", "uộco": "uọco", "uôcjo": "uocjo", "uọcoj": "uocoj",
"uốis": "uôis", "uốio": "uóio", "uôiso": "uoiso", "uóios": "uoios",
"uồif": "uôif", "uồio": "uòio", "uôifo": "uoifo", "uòiof": "uoiof",
"uổir": "uôir", "uổio": "uỏio", "uôiro": "uoiro", "uỏior": "uoior",
"uỗix": "uôix", "uỗio": "uõio", "uôixo": "uoixo", "uõiox": "uoiox",
"uộij": "uôij", "uộio": "uóio", "uôijo": "uoijo", "uọioj": "uoioj",
"uốms": "uôms", "uốmo": "uómo", "uômso": "uomso", "uómos": "uomos",
"uồmf": "uômf", "uồmo": "uòmo", "uômfo": "uomfo", "uòmof": "uomof",
"uổmr": "uômr", "uổmo": "uỏmo", "uômro": "uomro", "uỏmor": "uomor",
"uỗmx": "uômx", "uỗmo": "uõmo", "uômxo": "uomxo", "uõmox": "uomox",
"uộmj": "uômj", "uộmo": "uómo", "uômjo": "uomjo", "uọmoj": "uomoj",
"uốns": "uôns", "uốno": "uóno", "uônso": "uonso", "uónos": "uonos",
"uồnf": "uônf", "uồno": "uòno", "uônfo": "uonfo", "uònof": "uonof",
"uổnr": "uônr", "uổno": "uỏno", "uônro": "uonro", "uỏnor": "uonor",
"uỗnx": "uônx", "uỗno": "uõno", "uônxo": "uonxo", "uõnox": "uonox",
"uộnj": "uônj", "uộno": "uóno", "uônjo": "uonjo", "uọnoj": "uonoj",
"uốps": "uôps", "uốpo": "uópo", "uôpso": "uopso", "uópos": "uopos",
"uộpj": "uôpj", "uộpo": "uọpo", "uôpjo": "uopjo", "uọpoj": "uopoj",
"uốts": "uôts", "uốto": "uóto", "uôtso": "uotso", "uótos": "uotos",
"uộtj": "uôtj", "uộto": "uọto", "uôtjo": "uotjo", "uọtoj": "uotoj",
"uốus": "uôus", "uốuo": "uóuo", "uôuso": "uouso", "uóuos": "uouos",
"uồuf": "uôuf", "uồuo": "uòuo", "uôufo": "uoufo", "uòuof": "uouof",
"uổur": "uôur", "uổuo": "uỏuo", "uôuro": "uouro", "uỏuor": "uouor",
"uỗux": "uôux", "uỗuo": "uõuo", "uôuxo": "uouxo", "uõuox": "uouox",
"uộuj": "uôuj", "uộuo": "uóuo", "uôujo": "uoujo", "uọuoj": "uouoj",
"uốngs": "uôngs", "uốngo": "uóngo", "uôngso": "uongso", "uóngos": "uongos",
"uồngf": "uôngf", "uồngo": "uòngo", "uôngfo": "uongfo", "uòngof": "uongof",
"uổngr": "uôngr", "uổngo": "uỏngo", "uôngro": "uongro", "uỏngor": "uongor",
"uỗngx": "uôngx", "uỗngo": "uõngo", "uôngxo": "uongxo", "uõngox": "uongox",
"uộngj": "uôngj", "uộngo": "uóngo", "uôngjo": "uongjo", "uọngoj": "uongoj",
"yes": "ýe", "yef": "ỳe", "yer": "ỷe", "yex": "ỹe", "yej": "ỵe",
"ýem": "yém", "ỳem": "yèm", "ỷem": "yẻm", "ỹem": "yẽm", "ỵem": "yẹm",
"yems": "yém", "yemf": "yèm", "yemr": "yẻm", "yemx": "yẽm", "yemj": "yẹm",
"yêms": "yếm", "yêmf": "yềm", "yêmr": "yểm", "yêmx": "yễm", "yêmj": "yệm",
"yéme": "yếm", "yème": "yềm", "yẻme": "yểm", "yẽme": "yễm", "yẹme": "yệm",
"ýen": "yén", "ỳen": "yèn", "ỷen": "yẻn", "ỹen": "yẽn", "ỵen": "yẹn",
"yens": "yén", "yenf": "yèn", "yenr": "yẻn", "yenx": "yẽn", "yenj": "yẹn",
"yêns": "yến", "yênf": "yền", "yênr": "yển", "yênx": "yễn", "yênj": "yện",
"yéne": "yến", "yène": "yền", "yẻne": "yển", "yẽne": "yễn", "yẹne": "yện",
"ýet": "yét", "ỵet": "yẹt",
"yets": "yét", "yetj": "yẹt",
"yêts": "yết", "yêtj": "yệt",
"yéte": "yết", "yẹte": "yệt",
"ýeu": "yéu", "ỳeu": "yèu", "ỷeu": "yẻu", "ỹeu": "yẽu", "ỵeu": "yẹu",
"yeus": "yéu", "yeuf": "yèu", "yeur": "yẻu", "yeux": "yẽu", "yeuj": "yẹu",
"yêus": "yếu", "yêuf": "yều", "yêur": "yểu", "yêux": "yễu", "yêuj": "yệu",
"yéue": "yếu", "yèue": "yều", "yẻue": "yểu", "yẽue": "yễu", "yẹue": "yệu",
"ýeng": "yéng", "ỳeng": "yèng", "ỷeng": "yẻng", "ỹeng": "yẽng", "ỵeng": "yẹng",
"yengs": "yéng", "yengf": "yèng", "yengr": "yẻng", "yengx": "yẽng", "yengj": "yẹng",
"yêngs": "yếng", "yêngf": "yềng", "yêngr": "yểng", "yêngx": "yễng", "yêngj": "yệng",
"yénge": "yếng", "yènge": "yềng", "yẻnge": "yểng", "yẽnge": "yễng", "yẹnge": "yệng",
"ýes": "yes", "ỳef": "yef", "ỷer": "yer", "ỹex": "yex", "ỵej": "yej",
"yếms": "yêms", "yếme": "yéme", "yêmse": "yemse", "yémes": "yemes",
"yềmf": "yêmf", "yềme": "yème", "yêmfe": "yemfe", "yèmef": "yemef",
"yểmr": "yêmr", "yểme": "yẻme", "yêmre": "yemre", "yẻmer": "yemer",
"yễmx": "yêmx", "yễme": "yẽme", "yêmxe": "yemxe", "yẽmex": "yemex",
"yệmj": "yêmj", "yệme": "yẹme", "yêmje": "yemje", "yẹmej": "yemej",
"yếns": "yêns", "yếne": "yéne", "yênse": "yense", "yénes": "yenes",
"yềnf": "yênf", "yềne": "yène", "yênfe": "yenfe", "yènef": "yenef",
"yểnr": "yênr", "yểne": "yẻne", "yênre": "yenre", "yẻner": "yener",
"yễnx": "yênx", "yễne": "yẽne", "yênxe": "yenxe", "yẽnex": "yenex",
"yệnj": "yênj", "yệne": "yẹne", "yênje": "yenje", "yẹnej": "yenej",
"yếts": "yêts", "yếte": "yéte", "yêtse": "yetse", "yétes": "yetes",
"yệtj": "yêtj", "yệte": "yẹte", "yêtje": "yetje", "yẹtej": "yetej",
"yếus": "yêus", "yếue": "yéue", "yêuse": "yeuse", "yéues": "yeues",
"yềuf": "yêuf", "yềue": "yèue", "yêufe": "yeufe", "yèuef": "yeuef",
"yểur": "yêur", "yểue": "yẻue", "yêure": "yeure", "yẻuer": "yeuer",
"yễux": "yêux", "yễue": "yẽue", "yêuxe": "yeuxe", "yẽuex": "yeuex",
"yệuj": "yêuj", "yệue": "yẹue", "yêuje": "yeuje", "yẹuej": "yeuej",
"yếngs": "yêngs", "yếnge": "yénge", "yêngse": "yengse", "yénges": "yenges",
"yềngf": "yêngf", "yềnge": "yènge", "yêngfe": "yengfe", "yèngef": "yengef",
"yểngr": "yêngr", "yểnge": "yẻnge", "yêngre": "yengre", "yẻnger": "yenger",
"yễngx": "yêngx", "yễnge": "yẽnge", "yêngxe": "yengxe", "yẽngex": "yengex",
"yệngj": "yêngj", "yệnge": "yẹnge", "yêngje": "yengje", "yẹngej": "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 (₼)",
@@ -20,6 +32,18 @@
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"id": "bangladeshi_taka",
"label": "Bangladeshi taka (৳)",
"slots": [
{ "code": 2547, "label": "৳" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"id": "bitcoin",
@@ -33,6 +57,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,11 +17,43 @@
"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",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "bengali_bd",
"label": "বাংলা",
"authors": [ "iamrasel" ],
"direction": "ltr"
},
{
"id": "hindi_in",
"label": "हिंदी",
"authors": [ "npnpatidar" ],
"direction": "ltr"
},
{
"id": "bepo",
@@ -72,12 +104,31 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "colemak_dh",
"label": "ColemakDH",
"authors": [ "blucin" ],
"direction": "ltr"
},
{
"id": "colemak_dhm",
"label": "ColemakDHm",
"authors": [ "SteveP", "oneilljp" ],
"direction": "ltr"
},
{
"id": "danish",
"label": "Danish (QWERTY)",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "diktor",
"label": "Diktor",
"authors": [ "kuroya2mouse" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:diktor"
},
{
"id": "dvorak",
"label": "Dvorak",
@@ -85,6 +136,20 @@
"direction": "ltr",
"modifier": "org.florisboard.layouts:dvorak"
},
{
"id": "dvorak_de",
"label": "Dvorak (DE)",
"authors": [ "msrd0" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:dvorak_de"
},
{
"id": "dvorak_es",
"label": "Dvorak (ÑÇ)",
"authors": [ "tsiflimagas" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:dvorak"
},
{
"id": "esperanto",
"label": "Esperanto",
@@ -97,6 +162,12 @@
"authors": [ "jeremiah-miller", "patrickgold" ],
"direction": "ltr"
},
{
"id": "estonian",
"label": "Estonian",
"authors": [ "OneSheepy" ],
"direction": "ltr"
},
{
"id": "faroese",
"label": "Faroese (QWERTY)",
@@ -109,6 +180,12 @@
"authors": [ "mahmoudk1000" ],
"direction": "ltr"
},
{
"id": "german2",
"label": "German (GBoard)",
"authors": [ "M-Koushan" ],
"direction": "rtl"
},
{
"id": "greek",
"label": "Ελληνικά",
@@ -146,6 +223,12 @@
"authors": [ "nd500" ],
"direction": "ltr"
},
{
"id": "indonesian",
"label": "Indonesian (QWERTY)",
"authors": [ "Linerly" ],
"direction": "ltr"
},
{
"id": "ipa",
"label": "International Phonetic Alphabet",
@@ -154,13 +237,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 +306,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",
@@ -265,6 +362,12 @@
"authors": ["GrbavaCigla"],
"direction": "ltr"
},
{
"id": "slovenian",
"label": "Slovenian (QWERTZ)",
"authors": ["samo_lego"],
"direction": "ltr"
},
{
"id": "spanish",
"label": "Spanish (QWERTY)",
@@ -295,6 +398,12 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "tamil",
"label": "Tamil",
"authors": [ "Clem0908" ],
"direction": "ltr"
},
{
"id": "thai_kedmanee",
"label": "Thai Kedmanee",
@@ -319,6 +428,18 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "udmurt_compact",
"label": "Udmurt (3 чур)",
"authors": [ "vorgoron" ],
"direction": "ltr"
},
{
"id": "udmurt_extended",
"label": "Udmurt (4 чур)",
"authors": [ "vorgoron" ],
"direction": "ltr"
},
{
"id": "urdu_phonetic",
"label": "Urdu Phonetic",
@@ -337,6 +458,12 @@
"label": "Workman",
"authors": [ "icyphox" ],
"direction": "ltr"
},
{
"id": "jcuken_interslavic",
"label": "Interslavic (ЈЦУКЕН)",
"authors": [ "victorbnl" ],
"direction": "ltr"
}
],
"charactersMod": [
@@ -346,18 +473,36 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "armenian",
"label": "Armenian",
"authors": [ "PJTSearch" ],
"direction": "ltr"
},
{
"id": "arabic",
"label": "Arabic",
"authors": [ "HeiWiper" ],
"direction": "rtl"
},
{
"id": "diktor",
"label": "Diktor",
"authors": [ "kuroya2mouse" ],
"direction": "ltr"
},
{
"id": "dvorak",
"label": "Dvorak",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "dvorak_de",
"label": "Dvorak (DE)",
"authors": [ "msrd0" ],
"direction": "ltr"
},
{
"id": "hebrew",
"label": "עברית",
@@ -387,6 +532,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": [
@@ -423,6 +580,12 @@
"label": "Western Arabic (PC)",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "bengali",
"label": "Bengali",
"authors": [ "iamrasel" ],
"direction": "ltr"
}
],
"numericRow": [
@@ -495,7 +658,7 @@
{
"id": "tamil",
"label": "Tamil",
"authors": [ "yashpalgoyal1304" ],
"authors": [ "Clem0908" ],
"direction": "ltr"
},
{
@@ -540,6 +703,13 @@
}
],
"symbols": [
{
"id": "armenian",
"label": "Armenian",
"authors": [ "PJTSearch" ],
"direction": "ltr",
"modifier": "org.florisboard.layouts:armenian"
},
{
"id": "cjk",
"label": "CJK",
@@ -583,6 +753,12 @@
"label": "Western (Additional symbols)",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "western_samsung",
"label": "Western (Samsung)",
"authors": [ "nettnikl" ],
"direction": "ltr"
}
],
"symbolsMod": [
@@ -592,6 +768,12 @@
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "armenian",
"label": "Armenian",
"authors": [ "PJTSearch" ],
"direction": "ltr"
},
{
"id": "cjk",
"label": "CJK",
@@ -636,6 +818,12 @@
"label": "Western",
"authors": [ "patrickgold" ],
"direction": "ltr"
},
{
"id": "western_samsung",
"label": "Western (Samsung)",
"authors": [ "nettnikl" ],
"direction": "ltr"
}
],
"symbols2Mod": [

View File

@@ -0,0 +1,49 @@
[
[
{ "$": "auto_text_key", "code": 1383, "label": "է" },
{ "$": "auto_text_key", "code": 1385, "label": "թ" },
{ "$": "auto_text_key", "code": 1411, "label": "փ" },
{ "$": "auto_text_key", "code": 1393, "label": "ձ" },
{ "$": "auto_text_key", "code": 1403, "label": "ջ" },
{ "$": "auto_text_key", "code": 1408, "label": "ր" },
{ "$": "auto_text_key", "code": 1401, "label": "չ" },
{ "$": "auto_text_key", "code": 1395, "label": "ճ" },
{ "$": "auto_text_key", "code": 1386, "label": "ժ" },
{ "$": "auto_text_key", "code": 1390, "label": "ծ" }
],
[
{ "$": "auto_text_key", "code": 1412, "label": "ք" },
{ "$": "auto_text_key", "code": 1400, "label": "ո" },
{ "$": "auto_text_key", "code": 1381, "label": "ե" },
{ "$": "auto_text_key", "code": 1404, "label": "ռ" },
{ "$": "auto_text_key", "code": 1407, "label": "տ" },
{ "$": "auto_text_key", "code": 1384, "label": "ը" },
{ "$": "auto_text_key", "code": 1410, "label": "ւ" },
{ "$": "auto_text_key", "code": 1387, "label": "ի" },
{ "$": "auto_text_key", "code": 1413, "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": 1379, "label": "գ" },
{ "$": "auto_text_key", "code": 1392, "label": "հ" },
{ "$": "auto_text_key", "code": 1397, "label": "յ" },
{ "$": "auto_text_key", "code": 1391, "label": "կ" },
{ "$": "auto_text_key", "code": 1388, "label": "լ" },
{ "$": "auto_text_key", "code": 1389, "label": "խ" }
],
[
{ "$": "auto_text_key", "code": 1382, "label": "զ" },
{ "$": "auto_text_key", "code": 1394, "label": "ղ" },
{ "$": "auto_text_key", "code": 1409, "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,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,112 @@
[
[
{ "$": "case_selector",
"lower": { "code": 2457, "label": "ঙ" },
"upper": { "code": 2434, "label": "ং" }
},
{ "$": "case_selector",
"lower": { "code": 2479, "label": "য" },
"upper": { "code": 2527, "label": "য়" }
},
{ "$": "case_selector",
"lower": { "code": 2465, "label": "ড" },
"upper": { "code": 2466, "label": "ঢ" }
},
{ "$": "case_selector",
"lower": { "code": 2474, "label": "প" },
"upper": { "code": 2475, "label": "ফ" }
},
{ "$": "case_selector",
"lower": { "code": 2463, "label": "ট" },
"upper": { "code": 2464, "label": "ঠ" }
},
{ "$": "case_selector",
"lower": { "code": 2458, "label": "চ" },
"upper": { "code": 2459, "label": "ছ" }
},
{ "$": "case_selector",
"lower": { "code": 2460, "label": "জ" },
"upper": { "code": 2461, "label": "ঝ" }
},
{ "$": "case_selector",
"lower": { "code": 2489, "label": "হ" },
"upper": { "code": 2462, "label": "ঞ" }
},
{ "$": "case_selector",
"lower": { "code": 2455, "label": "গ" },
"upper": { "code": 2456, "label": "ঘ" }
},
{ "$": "case_selector",
"lower": { "code": 2524, "label": "ড়" },
"upper": { "code": 2525, "label": "ঢ়" }
}
],
[
{ "$": "case_selector",
"lower": { "code": 2499, "label": "ৃ" },
"upper": { "code": 2435, "label": "ঃ" }
},
{ "$": "case_selector",
"lower": { "code": 2497, "label": "ু" },
"upper": { "code": 2498, "label": "ূ" }
},
{ "$": "case_selector",
"lower": { "code": 2495, "label": "ি" },
"upper": { "code": 2496, "label": "ী" }
},
{ "$": "case_selector",
"lower": { "code": 2494, "label": "া" },
"upper": { "code": 2437, "label": "অ" }
},
{ "$": "case_selector",
"lower": { "code": 2509, "label": "্" },
"upper": { "code": 2433, "label": "ঁ" }
},
{ "$": "case_selector",
"lower": { "code": 2476, "label": "ব" },
"upper": { "code": 2477, "label": "ভ" }
},
{ "$": "case_selector",
"lower": { "code": 2453, "label": "ক" },
"upper": { "code": 2454, "label": "খ" }
},
{ "$": "case_selector",
"lower": { "code": 2468, "label": "ত" },
"upper": { "code": 2469, "label": "থ" }
},
{ "$": "case_selector",
"lower": { "code": 2470, "label": "দ" },
"upper": { "code": 2471, "label": "ধ" }
}
],
[
{ "$": "case_selector",
"lower": { "$": "multi_text_key", "codePoints": [2509, 2480], "label": "্র" },
"upper": { "$": "multi_text_key", "codePoints": [2509, 2479], "label": "্য" }
},
{ "$": "case_selector",
"lower": { "code": 2507, "label": "ো" },
"upper": { "code": 2508, "label": "ৌ" }
},
{ "$": "case_selector",
"lower": { "code": 2503, "label": "ে" },
"upper": { "code": 2504, "label": "ৈ" }
},
{ "$": "case_selector",
"lower": { "code": 2480, "label": "র" },
"upper": { "code": 2482, "label": "ল" }
},
{ "$": "case_selector",
"lower": { "code": 2472, "label": "ন" },
"upper": { "code": 2467, "label": "ণ" }
},
{ "$": "case_selector",
"lower": { "code": 2488, "label": "স" },
"upper": { "code": 2487, "label": "ষ" }
},
{ "$": "case_selector",
"lower": { "code": 2478, "label": "ম" },
"upper": { "code": 2486, "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

@@ -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": 122, "label": "z" },
{ "$": "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": 107, "label": "k" },
{ "$": "auto_text_key", "code": 104, "label": "h" }
]
]

View File

@@ -0,0 +1,49 @@
[
[
{ "$": "auto_text_key", "code": 1094, "label": "ц" },
{ "$": "auto_text_key", "code": 1100, "label": "ь" },
{ "$": "auto_text_key", "code": 1103, "label": "я" },
{ "$": "case_selector",
"lower": { "code": 44, "label": ",", "popup": {
"relevant": [
{ "code": 46, "label": "." }
]
} },
"upper": { "code": 46, "label": ".", "popup": {
"relevant": [
{ "code": 44, "label": "," }
]
} }
},
{ "$": "auto_text_key", "code": 1079, "label": "з" },
{ "$": "auto_text_key", "code": 1074, "label": "в" },
{ "$": "auto_text_key", "code": 1082, "label": "к" },
{ "$": "auto_text_key", "code": 1076, "label": "д" },
{ "$": "auto_text_key", "code": 1095, "label": "ч" },
{ "$": "auto_text_key", "code": 1096, "label": "ш" },
{ "$": "auto_text_key", "code": 1097, "label": "щ" }
],
[
{ "$": "auto_text_key", "code": 1091 , "label": "у" },
{ "$": "auto_text_key", "code": 1080 , "label": "и" },
{ "$": "auto_text_key", "code": 1077 , "label": "е" },
{ "$": "auto_text_key", "code": 1086 , "label": "о" },
{ "$": "auto_text_key", "code": 1072 , "label": "а" },
{ "$": "auto_text_key", "code": 1083 , "label": "л" },
{ "$": "auto_text_key", "code": 1085 , "label": "н" },
{ "$": "auto_text_key", "code": 1090 , "label": "т" },
{ "$": "auto_text_key", "code": 1089 , "label": "с" },
{ "$": "auto_text_key", "code": 1088 , "label": "р" },
{ "$": "auto_text_key", "code": 1081 , "label": "й" }
],
[
{ "$": "auto_text_key", "code": 1101 , "label": "э" },
{ "$": "auto_text_key", "code": 1093 , "label": "х" },
{ "$": "auto_text_key", "code": 1099 , "label": "ы" },
{ "$": "auto_text_key", "code": 1102 , "label": "ю" },
{ "$": "auto_text_key", "code": 1073 , "label": "б" },
{ "$": "auto_text_key", "code": 1084 , "label": "м" },
{ "$": "auto_text_key", "code": 1087 , "label": "п" },
{ "$": "auto_text_key", "code": 1075 , "label": "г" }
]
]

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,71 @@
[
[
{ "$": "auto_text_key", "code": 252, "label": "ü" },
{ "$": "shift_state_selector",
"shiftedManual": { "code": 59, "label": ";", "popup": {
"relevant": [
{ "code": 44, "label": "," }
]
} },
"default": { "code": 44, "label": ",", "popup": {
"relevant": [
{ "code": 59, "label": ";" }
]
} }
},
{ "$": "shift_state_selector",
"shiftedManual": { "code": 58, "label": ":", "popup": {
"relevant": [
{ "code": 46, "label": "." }
]
} },
"default": { "code": 46, "label": ".", "popup": {
"relevant": [
{ "code": 58, "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": 116, "label": "t" },
{ "$": "auto_text_key", "code": 122, "label": "z" },
{ "$": "shift_state_selector",
"shiftedManual": { "code": 223, "label": "ß", "popup": {
"relevant": [
{ "code": 63, "label": "?" }
]
} },
"default": { "code": 63, "label": "?", "popup": {
"relevant": [
{ "code": 223, "label": "ß" }
]
} }
}
],
[
{ "$": "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": 105, "label": "i" },
{ "$": "auto_text_key", "code": 117, "label": "u" },
{ "$": "auto_text_key", "code": 104, "label": "h" },
{ "$": "auto_text_key", "code": 100, "label": "d" },
{ "$": "auto_text_key", "code": 114, "label": "r" },
{ "$": "auto_text_key", "code": 110, "label": "n" },
{ "$": "auto_text_key", "code": 115, "label": "s" },
{ "$": "auto_text_key", "code": 108, "label": "l" }
],
[
{ "$": "auto_text_key", "code": 113, "label": "q" },
{ "$": "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,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,38 @@
[
[
{ "$": "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": 121, "label": "y" },
{ "$": "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": 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": 245, "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

@@ -0,0 +1,42 @@
[
[
{ "$": "case_selector", "lower": { "code": 2335, "label": "ट" }, "upper": { "code": 2336, "label": "ठ" } },
{ "$": "case_selector", "lower": { "code": 2337, "label": "ड" }, "upper": { "code": 2338, "label": "ढ" } },
{ "$": "case_selector", "lower": { "code": 2375, "label": "े" }, "upper": { "code": 2376, "label": "ै" } },
{ "$": "case_selector", "lower": { "code": 2352, "label": "र" }, "upper": { "code": 2371, "label": "ृ" } },
{ "$": "case_selector", "lower": { "code": 2340, "label": "त" }, "upper": { "code": 2341, "label": "थ" } },
{ "$": "case_selector", "lower": { "code": 2351, "label": "य" }, "upper": { "code": 2399, "label": "य़" } },
{ "$": "case_selector", "lower": { "code": 2369, "label": "ु" }, "upper": { "code": 2370, "label": "ू" } },
{ "$": "case_selector", "lower": { "code": 2367, "label": "ि" }, "upper": { "code": 2368, "label": "ी" } },
{ "$": "case_selector", "lower": { "code": 2379, "label": "ो" }, "upper": { "code": 2380, "label": "ौ" } },
{ "$": "case_selector", "lower": { "code": 2346, "label": "प" }, "upper": { "code": 2398, "label": "फ़" } }
],
[
{ "$": "case_selector", "lower": { "code": 2366, "label": "ा" }, "upper": { "code": 2309, "label": "अ" } },
{ "$": "case_selector", "lower": { "code": 2360, "label": "स" }, "upper": { "code": 2358, "label": "श" } },
{ "$": "case_selector", "lower": { "code": 2342, "label": "द" }, "upper": { "code": 2343, "label": "ध" } },
{ "$": "case_selector", "lower": { "code": 2347, "label": "फ" }, "upper": { "code": 2364, "label": " ़" } },
{ "$": "case_selector", "lower": { "code": 2327, "label": "ग" }, "upper": { "code": 2328, "label": "घ" } },
{ "$": "case_selector", "lower": { "code": 2361, "label": "ह" }, "upper": { "code": 2307, "label": "" } },
{ "$": "case_selector", "lower": { "code": 2332, "label": "ज" }, "upper": { "code": 2333, "label": "झ" } },
{ "$": "case_selector", "lower": { "code": 2325, "label": "क" }, "upper": { "code": 2326, "label": "ख" } },
{ "$": "case_selector", "lower": { "code": 2354, "label": "ल" }, "upper": { "code": 2355, "label": "ळ" } }
],
[
{
"$": "case_selector",
"lower": { "$": "multi_text_key", "codePoints": [2332, 2381, 2334], "label": "ज्ञ" },
"upper": { "code": 2395, "label": "ज़" }
},
{
"$": "case_selector",
"lower": { "$": "multi_text_key", "codePoints": [2325, 2381, 2359], "label": "क्ष" },
"upper": { "code": 2359, "label": "ष" }
},
{ "$": "case_selector", "lower": { "code": 2330, "label": "च" }, "upper": { "code": 2331, "label": "छ" } },
{ "$": "case_selector", "lower": { "code": 2357, "label": "व" }, "upper": { "code": 2381, "label": "्" } },
{ "$": "case_selector", "lower": { "code": 2348, "label": "ब" }, "upper": { "code": 2349, "label": "भ" } },
{ "$": "case_selector", "lower": { "code": 2344, "label": "न" }, "upper": { "code": 2339, "label": "ण" } },
{ "$": "case_selector", "lower": { "code": 2350, "label": "म" }, "upper": { "code": 2306, "label": "ं" } }
]
]

View File

@@ -0,0 +1,36 @@
[
[
{ "$": "auto_text_key", "code": 1112, "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": 1114, "label": "њ" },
{ "$": "auto_text_key", "code": 1075, "label": "г" },
{ "$": "auto_text_key", "code": 1096, "label": "ш" },
{ "$": "auto_text_key", "code": 1079, "label": "з" },
{ "$": "auto_text_key", "code": 1093, "label": "х" }
],
[
{ "$": "auto_text_key", "code": 1092 , "label": "ф" },
{ "$": "auto_text_key", "code": 1099 , "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": 1113 , "label": "љ" },
{ "$": "auto_text_key", "code": 1078 , "label": "ж" }
],
[
{ "$": "auto_text_key", "code": 1108 , "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": 1073 , "label": "б" }
]
]

View File

@@ -55,9 +55,7 @@
{ "code": 1580, "label": "ج" },
{ "code": 1670, "label": "چ" },
{ "code": 1581, "label": "ح" },
{ "code": 1593, "label": "ع", "popup": {
"main": { "code": 1551, "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,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": 353, "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": 269, "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" },
{ "$": "auto_text_key", "code": 382, "label": "ž" }
]
]

View File

@@ -0,0 +1,98 @@
[
[
{ "$": "case_selector",
"lower": { "code": 2974, "label": "ஞ" },
"upper": { "code": 2998, "label": "ஶ" }
},
{ "$": "case_selector",
"lower": { "code": 2993, "label": "ற" },
"upper": { "code": 2999, "label": "ஷ" }
},
{ "$": "case_selector",
"lower": { "code": 2984, "label": "ந" },
"upper": { "code": 3000, "label": "ஸ" }
},
{ "$": "case_selector",
"lower": { "code": 2970, "label": "ச" },
"upper": { "code": 3001, "label": "ஹ" }
},
{ "$": "case_selector",
"lower": { "code": 2997, "label": "வ" },
"upper": { "code": 2972, "label": "ஜ" }
},
{ "$": "case_selector",
"lower": { "code": 2992, "label": "ர" },
"upper": { "code": 2994, "label": "ல" }
},
{ "$": "case_selector",
"lower": { "code": 3016, "label": "ை" },
"upper": { "code": 2960, "label": "ஐ" }
},
{ "$": "case_selector",
"lower": { "code": 3018, "label": "ொ" },
"upper": { "code": 3019, "label": "ோ" }
},
{ "$": "case_selector",
"lower": { "code": 3007, "label": "ி" },
"upper": { "code": 3008, "label": "ீ" }
},
{ "$": "case_selector",
"lower": { "code": 3009, "label": "ு" },
"upper": { "code": 3010, "label": "ூ" }
}
],
[
{ "$": "auto_text_key", "code": 2991, "label": "ய" },
{ "$": "auto_text_key", "code": 2995, "label": "ள" },
{ "$": "auto_text_key", "code": 2985, "label": "ன" },
{ "$": "auto_text_key", "code": 2965, "label": "க" },
{ "$": "auto_text_key", "code": 2986, "label": "ப" },
{ "$": "case_selector",
"lower": { "code": 3006, "label": "ா" },
"upper": { "code": 2996, "label": "ழ" }
},
{ "$": "case_selector",
"lower": { "code": 2980, "label": "த" },
"upper": { "code": 2990, "label": "ம" }
},
{ "$": "case_selector",
"lower": { "code": 2975, "label": "ட" },
"upper": { "code": 2969, "label": "ங" }
},
{ "$": "case_selector",
"lower": { "code": 3021, "label": "்" },
"upper": { "code": 2947, "label": "ஃ" }
},
{ "$": "case_selector",
"lower": { "code": 2951, "label": "இ" },
"upper": { "code": 2952, "label": "ஈ" }
}
],
[
{ "$": "auto_text_key", "code": 2979, "label": "ண" },
{ "$": "case_selector",
"lower": { "code": 2962, "label": "ஒ" },
"upper": { "code": 2963, "label": "ஓ" }
},
{ "$": "case_selector",
"lower": { "code": 2953, "label": "உ" },
"upper": { "code": 2954, "label": "ஊ" }
},
{ "$": "case_selector",
"lower": { "code": 2958, "label": "எ" },
"upper": { "code": 2959, "label": "ஏ" }
},
{ "$": "case_selector",
"lower": { "code": 3014, "label": "ெ" },
"upper": { "code": 3015, "label": "ே" }
},
{ "$": "case_selector",
"lower": { "code": 2964, "label": "ஔ" },
"upper": { "code": 3020, "label": "ௌ" }
},
{ "$": "case_selector",
"lower": { "code": 2949, "label": "அ" },
"upper": { "code": 2950, "label": "ஆ" }
}
]
]

View File

@@ -0,0 +1,39 @@
[
[
{ "$": "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": 1092 , "label": "ф" },
{ "$": "auto_text_key", "code": 1099 , "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": 1101 , "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": "ю" }
]
]

View File

@@ -0,0 +1,48 @@
[
[
{ "$": "auto_text_key", "code": 1081, "label": "ё" },
{ "$": "auto_text_key", "code": 1245, "label": "ӝ" },
{ "$": "auto_text_key", "code": 1255, "label": "ӧ" },
{ "$": "auto_text_key", "code": 1269, "label": "ӵ" },
{ "$": "auto_text_key", "code": 1253, "label": "ӥ" },
{ "$": "auto_text_key", "code": 1247, "label": "ӟ" },
{ "$": "auto_text_key", "code": 1100, "label": "ь" },
{ "$": "auto_text_key", "code": 1098, "label": "ъ" },
{ "$": "auto_text_key", "code": 1093, "label": "х" },
{ "$": "auto_text_key", "code": 1101, "label": "э" }
],
[
{ "$": "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": 1092 , "label": "ф" },
{ "$": "auto_text_key", "code": 1099 , "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": 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": 1073 , "label": "б" },
{ "$": "auto_text_key", "code": 1102 , "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

@@ -0,0 +1,16 @@
[
[
{ "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" },
{ "$": "auto_text_key", "code": 1092, "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" },
{ "$": "auto_text_key", "code": 1078, "label": "ж", "groupId": 2 },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -0,0 +1,16 @@
[
[
{ "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" },
{ "$": "auto_text_key", "code": 228, "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" },
{ "$": "auto_text_key", "code": 246, "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

@@ -14,7 +14,6 @@
{ "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" },
{ "code": 32, "label": "space" },
{ "code": 8204, "label": "half_space" },
{ "code": 1600, "label": "kashida" },
{ "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" },
{ "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

@@ -0,0 +1,48 @@
[
[
{ "code": 43, "label": "+", "popup": {
"relevant": [
{ "code": 45, "label": "-" },
{ "code": 215, "label": "×" },
{ "code": 247, "label": "÷" }
]
} },
{ "code": 2535, "label": "১", "type": "numeric" },
{ "code": 2536, "label": "২", "type": "numeric" },
{ "code": 2537, "label": "৩", "type": "numeric" },
{ "code": 37, "label": "%" }
],
[
{ "code": 40, "label": "(", "popup": {
"relevant": [
{ "code": 91, "label": "[" },
{ "code": 123, "label": "{" }
]
} },
{ "code": 2538, "label": "", "type": "numeric" },
{ "code": 2539, "label": "৫", "type": "numeric" },
{ "code": 2540, "label": "৬", "type": "numeric" },
{ "code": 32, "label": "space" }
],
[
{ "code": 41, "label": ")", "popup": {
"relevant": [
{ "code": 93, "label": "]" },
{ "code": 125, "label": "}" }
]
} },
{ "code": 2541, "label": "", "type": "numeric" },
{ "code": 2542, "label": "৮", "type": "numeric" },
{ "code": 2543, "label": "৯", "type": "numeric" },
{ "code": -7, "label": "delete", "type": "enter_editing" }
],
[
{ "code": -201, "label": "view_characters", "type": "system_gui" },
{ "code": 44, "label": "," },
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
{ "code": 2534, "label": "", "type": "numeric" },
{ "code": 61, "label": "=" },
{ "code": 46, "label": "." },
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

View File

@@ -54,7 +54,7 @@
{ "code": 3672, "label": "๘", "type": "numeric", "popup": {
"main": { "code": 8312, "label": "⁸" }
} },
{ "code": 3672, "label": "", "type": "numeric", "popup": {
{ "code": 3673, "label": "", "type": "numeric", "popup": {
"main": { "code": 8313, "label": "⁹" }
} },
{ "code": 3664, "label": "", "type": "numeric", "popup": {

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

@@ -8,15 +8,13 @@
},
"half": { "code": 64, "label": "@" }
},
{ "code": 12306, "label": "〒", "popup": {
"main": { "code": 12320, "label": "〠" }
}
},
{
"$": "char_width_selector",
"full": { "code": 65283, "label": "", "popup": {
"main": { "code": 35, "label": "#" },
"relevant": [
{ "code": 12306, "label": "〒"},
{ "code": 12320, "label": "〠" },
{ "code": 8470, "label": "№" }
]
}
@@ -24,6 +22,8 @@
"half": { "code": 35, "label": "#", "popup": {
"main": { "code": 65283, "label": "" },
"relevant": [
{ "code": 12306, "label": "〒"},
{ "code": 12320, "label": "〠" },
{ "code": 8470, "label": "№" }
]
}
@@ -99,14 +99,18 @@
"full": { "code": 65291, "label": "", "popup": {
"main": { "code": 43, "label": "+" },
"relevant": [
{ "code": 177, "label": "±" }
{ "code": 177, "label": "±" },
{ "code": 61, "label": "=" },
{ "code": 65309, "label": "" }
]
}
},
"half": { "code": 43, "label": "+", "popup": {
"main": { "code": 65291, "label": "" },
"relevant": [
{ "code": 177, "label": "±" }
{ "code": 177, "label": "±" },
{ "code": 61, "label": "=" },
{ "code": 65309, "label": "" }
]
}
}
@@ -117,16 +121,20 @@
"main": { "code": 12302, "label": "『" },
"relevant": [
{ "code": 12304, "label": "【" },
{ "code": 12310, "label": "〖" }
{ "code": 12310, "label": "〖" },
{ "code": 65288, "label": "" },
{ "code": 65339, "label": "" }
]
}
},
"half": { "code": 65378, "label": "「", "popup": {
"main": { "code": 12301, "label": "" },
"main": { "code": 12300, "label": "" },
"relevant": [
{ "code": 12303, "label": "" },
{ "code": 12302, "label": "" },
{ "code": 12304, "label": "【" },
{ "code": 12310, "label": "〖" }
{ "code": 12310, "label": "〖" },
{ "code": 40, "label": "(" },
{ "code": 91, "label": "[" }
]
}
}
@@ -137,7 +145,9 @@
"main": { "code": 12303, "label": "』" },
"relevant": [
{ "code": 12305, "label": "】" },
{ "code": 12311, "label": "〗" }
{ "code": 12311, "label": "〗" },
{ "code": 65289, "label": "" },
{ "code": 65341, "label": "" }
]
}
},
@@ -146,7 +156,9 @@
"relevant": [
{ "code": 12303, "label": "』" },
{ "code": 12305, "label": "】" },
{ "code": 12311, "label": "〗" }
{ "code": 12311, "label": "〗" },
{ "code": 41, "label": ")" },
{ "code": 93, "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

@@ -64,7 +64,7 @@
{ "code": 11816, "label": "⸨" },
{ "code": 10214, "label": "⟦" },
{ "code": 10216, "label": "⟨" },
{ "code": 10218, "label": "" },
{ "code": 10218, "label": "" },
{ "code": 123, "label": "{" }
]
} },
@@ -72,7 +72,7 @@
"relevant": [
{ "code": 41, "label": ")" },
{ "code": 11817, "label": "⸩" },
{ "code": 10215, "label": "" },
{ "code": 10215, "label": "" },
{ "code": 10217, "label": "⟩" },
{ "code": 10219, "label": "⟫" },
{ "code": 125, "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

@@ -0,0 +1,85 @@
[
[
{ "code": 43, "label": "+", "popup": {
"main": { "code": 177, "label": "±" }
} },
{ "code": 215, "label": "×" },
{ "code": 247, "label": "÷" },
{ "code": 61, "label": "=", "popup": {
"main": { "code": 8776, "label": "≈" },
"relevant": [
{ "code": 8800, "label": "≠" },
{ "code": 8801, "label": "≡" }
]
} },
{ "code": 47, "label": "/" },
{ "code": 95, "label": "_" },
{ "code": 60, "label": "<" },
{ "code": 62, "label": ">" },
{ "code": 91, "label": "[", "popup": {
"main": { "code": 12302, "label": "『" },
"relevant": [
{ "code": 12300, "label": "「" },
{ "code": 12308, "label": "" },
{ "code": 12304, "label": "【" }
]
} },
{ "code": 93, "label": "]", "popup": {
"main": { "code": 12303, "label": "』" },
"relevant": [
{ "code": 12301, "label": "」" },
{ "code": 12309, "label": "" },
{ "code": 12305, "label": "】" }
]
} }
],
[
{ "code": 33, "label": "!", "popup": {
"main": { "code": 161, "label": "¡" }
} },
{ "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": 1642, "label": "٪" },
"relevant": [
{ "code": 8240, "label": "‰" }
]
} },
{ "code": 94, "label": "^" },
{ "code": 38, "label": "&" },
{ "code": 42, "label": "*" },
{ "code": 40, "label": "(" },
{ "code": 41, "label": ")" }
],
[
{ "code": 45, "label": "-", "popup": {
"main": { "code": 8208, "label": "" },
"relevant": [
{ "code": 8211, "label": "" },
{ "code": 8212, "label": "—" }
]
} },
{ "code": 39, "label": "'" },
{ "code": 34, "label": "\"" },
{ "code": 58, "label": ":" },
{ "code": 59, "label": ";" },
{ "code": 44, "label": "," },
{ "code": 63, "label": "?", "popup": {
"main": { "code": 191, "label": "¿" },
"relevant": [
{ "code": 8253, "label": "‽" }
]
} }
]
]

View File

@@ -54,7 +54,9 @@
]
} }
},
{ "code": 8730, "label": "√" },
{ "code": 8730, "label": "√", "popup": {
"main": { "code": 10003, "label": "✓" }
} },
{ "code": 960, "label": "π", "popup": {
"main": { "code": 928, "label": "Π" },
"relevant": [
@@ -104,7 +106,7 @@
{ "code": 61, "label": "=", "popup": {
"main": { "code": 8800, "label": "≠" },
"relevant": [
{ "code": 61, "label": "=" },
{ "code": 65309, "label": "" },
{ "code": 8734, "label": "∞" },
{ "code": 8776, "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

@@ -0,0 +1,45 @@
[
[
{ "code": 96, "label": "`" },
{ "code": 126, "label": "~" },
{ "code": 92, "label": "\\" },
{ "code": 124, "label": "|" },
{ "code": 123, "label": "{" },
{ "code": 125, "label": "}" },
{ "code": -802, "label": "currency_slot_2" },
{ "code": -804, "label": "currency_slot_4" },
{ "code": -805, "label": "currency_slot_5" },
{ "code": -806, "label": "currency_slot_6" }
],
[
{ "code": 176, "label": "°" },
{ "code": 8226, "label": "•" },
{ "code": 9675, "label": "○" },
{ "code": 9679, "label": "●" },
{ "code": 9633, "label": "□" },
{ "code": 9632, "label": "■" },
{ "code": 9828, "label": "♤", "popup": {
"main": { "code": 9824, "label": "♠️" }
} },
{ "code": 9825, "label": "♡", "popup": {
"main": { "code": 9829, "label": "♥️" }
} },
{ "code": 9671, "label": "◇", "popup": {
"main": { "code": 9670, "label": "◆" }
} },
{ "code": 9831, "label": "♧", "popup": {
"main": { "code": 9827, "label": "♣️" }
} }
],
[
{ "code": 9734, "label": "☆", "popup": {
"main": { "code": 9733, "label": "★" }
} },
{ "code": 9642, "label": "▪️" },
{ "code": 164, "label": "¤" },
{ "code":12298, "label": "《" },
{ "code":12299, "label": "》" },
{ "code": 161, "label": "¡" },
{ "code": 191, "label": "¿" }
]
]

View File

@@ -6,15 +6,28 @@
],
[
{ "code": -201, "label": "view_characters", "type": "system_gui" },
{ "code": 12296, "label": "〈", "popup": {
"main": { "code": 12298, "label": "《" },
"relevant": [
{ "code": 8804, "label": "≤" },
{ "code": 8249, "label": "" },
{ "code": 10216, "label": "" },
{ "code": 65308, "label": "" }
]
} },
{ "$": "char_width_selector",
"full": { "code": 12296, "label": "〈", "popup": {
"main": { "code": 12298, "label": "《" },
"relevant": [
{ "code": 60, "label": "<" },
{ "code": 8804, "label": "" },
{ "code": 8249, "label": "" },
{ "code": 10216, "label": "⟨" },
{ "code": 65308, "label": "" }
]
} },
"half": { "code": 60, "label": "<", "popup": {
"main": { "code": 12298, "label": "《" },
"relevant": [
{ "code": 12296, "label": "〈" },
{ "code": 8804, "label": "≤" },
{ "code": 8249, "label": "" },
{ "code": 10216, "label": "⟨" },
{ "code": 65308, "label": "" }
]
} }
},
{ "code": -205, "label": "view_numeric_advanced", "type": "system_gui" },
{ "code": 12288, "label": "空白" },
{ "code": -9701, "label": "char_width_switcher", "type": "system_gui", "popup": {
@@ -24,15 +37,28 @@
]
}
},
{ "code": 12297, "label": "〉", "popup": {
"main": { "code": 12299, "label": "》" },
"relevant": [
{ "code": 62, "label": ">" },
{ "code": 8805, "label": "" },
{ "code": 10217, "label": "" },
{ "code": 65310, "label": "" }
]
} },
{ "$": "char_width_selector",
"full": { "code": 12297, "label": "〉", "popup": {
"main": { "code": 12299, "label": "》" },
"relevant": [
{ "code": 62, "label": ">" },
{ "code": 8805, "label": "" },
{ "code": 8250, "label": "" },
{ "code": 10217, "label": "⟩" },
{ "code": 65310, "label": "" }
]
} },
"half": { "code": 62, "label": ">", "popup": {
"main": { "code": 12299, "label": "》" },
"relevant": [
{ "code": 12297, "label": "〉" },
{ "code": 8805, "label": "≥" },
{ "code": 8250, "label": "" },
{ "code": 10217, "label": "⟩" },
{ "code": 65310, "label": "" }
]
} }
},
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
]
]

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

@@ -8,11 +8,17 @@
{ "code": -201, "label": "view_characters", "type": "system_gui" },
{ "$": "char_width_selector",
"full": { "code": 12289, "label": "、", "popup": {
"main": { "code": 44, "label": "," }
"main": { "code": 65292, "label": "" },
"relevant": [
{ "code": 44, "label": "," }
]
}
},
"half": { "code": 65380, "label": "、", "popup": {
"main": { "code": 44, "label": "," }
"main": { "code": 44, "label": "," },
"relevant": [
{ "code": 65292, "label": "" }
]
}
}
},

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,176 +13,73 @@
"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": "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" ]
},
{
"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": "ast", "authors": [ "Softastur" ] },
{ "id": "bg", "authors": [ "iorvethe" ] },
{ "id": "bn-BD", "authors": [ "iamrasel" ] },
{ "id": "ca", "authors": [ "mikelloc" ] },
{ "id": "cjk", "authors": [ "moonbeamcelery" ] },
{ "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": "et", "authors": [ "OneSheepy" ] },
{ "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": "hi-IN", "authors": [ "npnpatidar" ] },
{ "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": "kab", "authors": [ "yanis867" ] },
{ "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": "udm", "authors": [ "vorgoron" ] },
{ "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",
@@ -393,6 +290,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",
@@ -423,6 +329,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",
@@ -435,6 +365,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",
@@ -462,6 +401,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",
@@ -564,6 +523,15 @@
"characters": "org.florisboard.layouts:serbian_cyrillic"
}
},
{
"languageTag": "sl-SI",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:euro",
"popupMapping": "org.florisboard.localization:sl-SI",
"preferred": {
"characters": "org.florisboard.layouts:slovenian"
}
},
{
"languageTag": "lv-LV",
"composer": "org.florisboard.composers:appender",
@@ -660,7 +628,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": {
@@ -684,6 +652,15 @@
"numericRow": "org.florisboard.layouts:warang_citi"
}
},
{
"languageTag": "udm",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:russian_ruble",
"popupMapping": "org.florisboard.localization:udm",
"preferred": {
"characters": "org.florisboard.layouts:udmurt_extended"
}
},
{
"languageTag": "ur-PK",
"composer": "org.florisboard.composers:appender",
@@ -692,6 +669,68 @@
"preferred": {
"characters": "org.florisboard.layouts:urdu_phonetic"
}
},
{
"languageTag": "zh-CN-zhengma",
"composer": "org.florisboard.composers:appender",
"nlpProviders": {
"spelling": "org.florisboard.nlp.providers.han.shape",
"suggestion": "org.florisboard.nlp.providers.han.shape"
},
"currencySet": "org.florisboard.currencysets:yen",
"popupMapping": "org.florisboard.localization:cjk",
"preferred": {
"characters": "org.florisboard.layouts:qwerty",
"symbols": "org.florisboard.layouts:cjk",
"symbols2": "org.florisboard.layouts:cjk"
}
},
{
"languageTag": "bn-BD",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:bangladeshi_taka",
"popupMapping": "org.florisboard.localization:bn-BD",
"preferred": {
"characters": "org.florisboard.layouts:bengali_bd",
"numericRow": "org.florisboard.layouts:bengali",
"numericAdvanced": "org.florisboard.layouts:bengali"
}
},
{
"languageTag": "hi-IN",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:indian_rupee",
"popupMapping": "org.florisboard.localization:hi-IN",
"preferred": {
"characters": "org.florisboard.layouts:hindi_in",
"numericRow": "org.florisboard.layouts:devanagari"
}
},
{
"languageTag": "ast",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:euro",
"popupMapping": "org.florisboard.localization:ast",
"preferred": {
"characters": "org.florisboard.layouts:qwerty"
}
},
{
"languageTag": "ta-lk",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:indian_rupee",
"preferred": {
"characters": "org.florisboard.layouts:tamil"
}
},
{
"languageTag": "kab",
"composer": "org.florisboard.composers:appender",
"currencySet": "org.florisboard.currencysets:euro",
"popupMapping": "org.florisboard.localization:kab",
"preferred": {
"characters": "org.florisboard.layouts:qwerty"
}
}
]
}

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

@@ -0,0 +1,115 @@
{
"all": {
"a": {
"main": { "$": "auto_text_key", "code": 225, "label": "á" },
"relevant": [
{ "$": "auto_text_key", "code": 170, "label": "ª" },
{ "$": "auto_text_key", "code": 229, "label": "å" },
{ "$": "auto_text_key", "code": 261, "label": "ą" },
{ "$": "auto_text_key", "code": 230, "label": "æ" },
{ "$": "auto_text_key", "code": 257, "label": "ā" },
{ "$": "auto_text_key", "code": 224, "label": "à" },
{ "$": "auto_text_key", "code": 228, "label": "ä" },
{ "$": "auto_text_key", "code": 226, "label": "â" },
{ "$": "auto_text_key", "code": 227, "label": "ã" }
]
},
"c": {
"main": { "$": "auto_text_key", "code": 231, "label": "ç" },
"relevant": [
{ "$": "auto_text_key", "code": 269, "label": "č" },
{ "$": "auto_text_key", "code": 263, "label": "ć" }
]
},
"e": {
"main": { "$": "auto_text_key", "code": 233, "label": "é" },
"relevant": [
{ "$": "auto_text_key", "code": 7497, "label": "ᵉ" },
{ "$": "auto_text_key", "code": 275, "label": "ē" },
{ "$": "auto_text_key", "code": 281, "label": "ę" },
{ "$": "auto_text_key", "code": 279, "label": "ė" },
{ "$": "auto_text_key", "code": 235, "label": "ë" },
{ "$": "auto_text_key", "code": 232, "label": "è" },
{ "$": "auto_text_key", "code": 234, "label": "ê" }
]
},
"h": {
"relevant": [
{ "$": "auto_text_key", "code": 7717, "label": "ḥ" }
]
},
"i": {
"main": { "$": "auto_text_key", "code": 237, "label": "í" },
"relevant": [
{ "$": "auto_text_key", "code": 299, "label": "ī" },
{ "$": "auto_text_key", "code": 238, "label": "î" },
{ "$": "auto_text_key", "code": 303, "label": "į" },
{ "$": "auto_text_key", "code": 236, "label": "ì" },
{ "$": "auto_text_key", "code": 239, "label": "ï" }
]
},
"l": {
"relevant": [
{ "$": "auto_text_key", "code": 7735, "label": "ḷ" }
]
},
"n": {
"relevant": [
{ "$": "auto_text_key", "code": 241, "label": "ñ" },
{ "$": "auto_text_key", "code": 324, "label": "ń" }
]
},
"o": {
"main": { "$": "auto_text_key", "code": 243, "label": "ó" },
"relevant": [
{ "$": "auto_text_key", "code": 186, "label": "º" },
{ "$": "auto_text_key", "code": 333, "label": "ō" },
{ "$": "auto_text_key", "code": 248, "label": "ø" },
{ "$": "auto_text_key", "code": 339, "label": "œ" },
{ "$": "auto_text_key", "code": 245, "label": "õ" },
{ "$": "auto_text_key", "code": 244, "label": "ô" },
{ "$": "auto_text_key", "code": 246, "label": "ö" },
{ "$": "auto_text_key", "code": 242, "label": "ò" }
]
},
"r": {
"relevant": [
{ "$": "auto_text_key", "code": 691, "label": "ʳ" }
]
},
"s": {
"relevant": [
{ "$": "auto_text_key", "code": 223, "label": "ß" }
]
},
"u": {
"main": { "$": "auto_text_key", "code": 250, "label": "ú" },
"relevant": [
{ "$": "auto_text_key", "code": 7512, "label": "ᵘ" },
{ "$": "auto_text_key", "code": 363, "label": "ū" },
{ "$": "auto_text_key", "code": 249, "label": "ù" },
{ "$": "auto_text_key", "code": 252, "label": "ü" },
{ "$": "auto_text_key", "code": 251, "label": "û" }
]
},
"~right": {
"main": { "code": 58, "label": ":" },
"relevant": [
{ "code": 59, "label": ";" },
{ "code": 8230, "label": "…" }
]
}
},
"uri": {
"~right": {
"main": { "code": -255, "label": ".com" },
"relevant": [
{ "code": -255, "label": ".org" },
{ "code": -255, "label": ".es" },
{ "code": -255, "label": ".com.es" },
{ "code": -255, "label": ".net" }
]
}
}
}

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