Compare commits

..

33 Commits

Author SHA1 Message Date
Patrick Goldinger
a71c89d5d3 Release v0.3.14-beta01 2021-09-14 18:58:09 +02:00
Patrick Goldinger
408716f4c4 Fix custom app language setter bug 2021-09-14 18:48:22 +02:00
Patrick Goldinger
005040df66 Update translations from Crowdin 2021-09-14 18:41:20 +02:00
Patrick Goldinger
527b3b293e Fix glide typing preview not working (#1191) 2021-09-14 00:59:43 +02:00
mrdeck4rd
dec39e8bd9 Add Thai layout (#1226)
* Add Thai Kedmanee layout.

* Add Thai layout

-Thai Kedmanee
-Thai Manoonchai

* Added Thai Numerals

* Fix syntax issue in config file

* Add new line to thai_manoonchai.json

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2021-09-14 00:34:33 +02:00
Patrick Goldinger
eaa630b219 Merge pull request #1237 from florisboard/prefs-rework-1
Preference Rework Part 1: JetPref lib + base preparation
2021-09-14 00:25:22 +02:00
Patrick Goldinger
4217594dd4 Update JetPref to 0.1.0-alpha03 2021-09-14 00:16:24 +02:00
Patrick Goldinger
96d01a28fb Implement live preview for advanced preferences 2021-09-13 22:14:28 +02:00
Patrick Goldinger
ec9f4a6654 Add keyboard preview in Settings (#82) 2021-09-13 21:30:39 +02:00
Patrick Goldinger
1990916851 Change home card to be collapsible 2021-09-12 23:51:36 +02:00
Patrick Goldinger
9ab49ff1c9 Add Settings language option feature 2021-09-12 23:03:47 +02:00
Patrick Goldinger
b4f08c38b3 Add home screen beta tester note 2021-09-11 14:05:29 +02:00
Patrick Goldinger
5a375ec30f Implement devtools and force-private-mode 2021-09-11 13:33:46 +02:00
Patrick Goldinger
efded915c3 Implement show/hide app icon feature / Fix theme issues 2021-09-11 13:14:46 +02:00
Patrick Goldinger
4bf335f4af Implement Jetpack Theme + Settings Theme pref functionality 2021-09-11 12:20:12 +02:00
Patrick Goldinger
643920c094 Add advanced preferences 2021-09-10 19:46:44 +02:00
Patrick Goldinger
172eb54909 Add license screen / Improve internal UI code 2021-09-10 17:56:15 +02:00
Patrick Goldinger
3d3d8f74c4 Re-add app icon on about screen 2021-09-10 00:39:04 +02:00
Patrick Goldinger
cf77038336 Re-implement version copy feature 2021-09-10 00:15:59 +02:00
Patrick Goldinger
619e06be1b Rename MainAppActivity to FlorisAppActivity 2021-09-09 23:59:39 +02:00
Patrick Goldinger
36dde9f7e0 Add about screen structure 2021-09-09 23:51:38 +02:00
Patrick Goldinger
58d0954fe4 Add base skeleton for implementing new Settings UI 2021-09-08 19:29:40 +02:00
Patrick Goldinger
17d28c9d9d Clean up and sort Gradle dependencies 2021-09-08 18:48:28 +02:00
Patrick Goldinger
46fb33b2a0 Rename package settings to oldsettings 2021-09-08 18:25:32 +02:00
Patrick Goldinger
e36aa80cc0 Add JetPref library import into gradle dependencies 2021-09-07 23:59:03 +02:00
Patrick Goldinger
3ce323596c Update Gradle version to 7.0.2 2021-09-07 23:58:41 +02:00
Hèctor Godoy
abe67c2a6f Add ñ as popup on catalan layout (#1236) 2021-09-07 23:50:02 +02:00
Aman9das
5c1768a924 Add additonal Western layout with more symbols (#1214)
* Add files via upload

* Contributing guidelines hyperlink

* Rename western.json to western-numrow.json

* western keyboard-unchanged

* Update and rename western-numrow.json to western-additional-symbols.json

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
2021-09-02 19:33:44 +02:00
Patrick Goldinger
92086954de Update README.md to make it less cluttered (#1195) 2021-08-28 18:58:00 +02:00
Patrick Goldinger
2b47d4a811 Release v0.3.13 2021-08-26 17:47:16 +02:00
Patrick Goldinger
e977c512a7 Fix increment step for vibration duration preference 2021-08-26 12:57:43 +02:00
Patrick Goldinger
0828c0a4db Update issue template chooser and contributing for new discussions 2021-08-25 22:47:19 +02:00
Patrick Goldinger
ecee7bfa56 Update README.md for 0.3.13 2021-08-25 17:41:35 +02:00
119 changed files with 2833 additions and 398 deletions

View File

@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Ask a question
url: https://github.com/florisboard/florisboard/discussions/new?category=q-a
about: Ask here if you have a question about FlorisBoard or need assistance
- name: General feedback
url: https://github.com/florisboard/florisboard/blob/master/CONTRIBUTING.md
url: https://github.com/florisboard/florisboard/discussions/new?category=feedback
about: Give general feedback about this project

View File

@@ -1,15 +0,0 @@
---
name: Question
about: Ask here if you have a question about FlorisBoard
title: ''
labels: question
assignees: ''
---
<!--
If you need assistance in using FlorisBoard, ask it here!
• Please search existing questions to avoid creating duplicates.
• If you want to suggest an idea for this project, please use the Feature request / Suggestion template instead.
-->

View File

@@ -7,8 +7,13 @@ provides some general guidelines for each type of contribution.
## Giving general feedback
Either use the review function within Google Play or email me at
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev). I
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.
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

149
README.md
View File

@@ -7,123 +7,68 @@ src="fastlane/metadata/android/en-US/images/icon.png" alt="App icon">
devices. It aims at being modern, user-friendly and customizable while
fully respecting your privacy. Currently in early-beta state.
### Stable [![Latest stable release](https://img.shields.io/github/v/release/florisboard/florisboard)](https://github.com/florisboard/florisboard/releases/latest)
<table>
<tr>
<th align="center" width="50%">
<h3>Stable <a href="https://github.com/florisboard/florisboard/releases"><img alt="Latest stable release" src="https://img.shields.io/github/v/release/florisboard/florisboard"></a></h3>
</th>
<th align="center" width="50%">
<h3>Beta <a href="https://github.com/florisboard/florisboard/releases/latest"><img alt="Latest beta release" src="https://img.shields.io/github/v/release/florisboard/florisboard?include_prereleases"></a></h3>
</th>
</tr>
<tr>
<td valign="top">
<p><i>Major versions only, 1 release per 1-3 months</i><br><br>Updates are more polished, new features are matured and tested through to ensure a stable experience.</p>
</td>
<td valign="top">
<p><i>Beta versions, 1-2 releases per week</i><br><br>Updates contain new features that may not be fully matured yet and bugs are more likely to occur. Allows you to give early feedback.</p>
</td>
</tr>
<tr>
<td valign="top">
<p><a href="https://f-droid.org/packages/dev.patrickgold.florisboard"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" height="64" alt="F-Droid badge"></a></p>
<p>
Releases on this track are in general stable and ready for everyday use, except for features marked as experimental. Use one of the following options to receive FlorisBoard's stable releases:
**Google Play**: Join the [FlorisBoard Test Group](https://groups.google.com/g/florisboard-public-alpha-test), then visit the [testing page](https://play.google.com/apps/testing/dev.patrickgold.florisboard). 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))
_A. Get it on F-Droid_:
</p>
<p>
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" height="64" alt="F-Droid badge">](https://f-droid.org/packages/dev.patrickgold.florisboard)
**Manual**: Download and install the APK from the release page.
_B. Google Play Public Alpha Test_:
</p>
</td>
<td valign="top">
<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>
You can join the public alpha test programme on Google Play. To become a
tester, follow these steps:
1. Join the
[FlorisBoard Public Alpha Test](https://groups.google.com/g/florisboard-public-alpha-test)
Google Group to be able to access the testing programme.
2. Go to the
[FlorisBoard Testing Page](https://play.google.com/apps/testing/dev.patrickgold.florisboard),
then click "Become a tester". Now you are enrolled in the testing
programme.
3. To try out FlorisBoard, download it via Google Play. To do so, click
on "Download it on Google Play", which takes you to the [PlayStore
listing](https://play.google.com/store/apps/details?id=dev.patrickgold.florisboard).
4. Finished! You will receive future versions of FlorisBoard via Google
Play.
**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))
With the v0.4.0 release FlorisBoard will enter the public beta in GPlay, allowing to directly search
for and download FlorisBoard without prior joining the alpha group.
</p>
<p>
_C. Use the APK provided in the release section of this repo_
**Manual**: Download and install the APK from the release page.
### Beta [![Latest beta release](https://img.shields.io/github/v/release/florisboard/florisboard?include_prereleases)](https://github.com/florisboard/florisboard/releases)
</p>
</td>
</tr>
</table>
Releases on this track are also in general stable and should be ready for everyday use, though crashes and bugs are more likely to occur. Use releases from this track if you want to get new features faster and give feedback for brand-new stuff. Options to get beta releases:
Beginning with v0.4.0 FlorisBoard will follow [SemVer](https://semver.org/#summary) versioning scheme and enter the public beta on Google Play.
_A. IzzySoft's repo for F-Droid_:
[<img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" height="64" alt="IzzySoft repo badge">](https://apt.izzysoft.de/fdroid/index/apk/dev.patrickgold.florisboard.beta)
_B. Google Play_:
Follow the same steps as for the stable track, the app can then be accessed [here](https://play.google.com/store/apps/details?id=dev.patrickgold.florisboard.beta).
_C. Use the APK provided in the release section of this repo_
### Giving feedback
If you want to give feedback to FlorisBoard, there are several ways to
do so, as listed [here](CONTRIBUTING.md#giving-general-feedback).
---
<img align="right" height="256"
src="https://patrickgold.dev/media/previews/florisboard-preview-day.png"
alt="Preview image">
## Implemented features
This list contains all implemented and fully functional features
FlorisBoard currently has to offer. For planned features and its
milestones, please refer to the [Feature roadmap](#feature-roadmap).
### Basics
* [x] Implementation of the keyboard core (InputMethodService)
* [x] Custom implementation of deprecated KeyboardView (base only)
* [x] Caps + Caps Lock
* [x] Key popups
* [x] Extended key popups (e.g. a -> á, à, ä, ...)
* [x] Key press sound/vibration
* [x] Portrait orientation support
* [x] Landscape orientation support (needs tweaks)
### Layouts
* [x] Latin character layouts (QWERTY, QWERTZ, AZERTY, Swiss, Spanish, Norwegian, Swedish/Finnish, Icelandic, Danish,
Hungarian, Croatian, Polish, Romanian, Colemak, Dvorak, Turkish-Q, Turkish-F, and more...)
* [x] Non-latin character layouts (Arabic, Persian, Kurdish, Greek, Russian (JCUKEN), and more...)
* [x] Adapt to situation in app (password, url, text, etc. )
* [x] Special character layout(s)
* [x] Numeric layout
* [x] Numeric layout (advanced)
* [x] Phone number layout
* [x] Emoji layout
* [x] Emoticon layout
### Preferences
* [x] Setup wizard
* [x] Preferences screen
* [x] Customize look and behaviour of keyboard
* [x] Theme presets (currently only day/night theme + borderless)
* [x] Theme customization
* [x] Subtype selection (language/layout)
* [x] Keyboard behaviour preferences
* [x] Gesture preferences
* [x] User dictionary manager (system and internal)
### Other useful features
* [x] Support for Android 11+ inline autofill API
* [x] One-handed mode
* [x] Clipboard/cursor tools
* [x] Clipboard manager/history
* [x] Integrated number row / symbols in character layouts
* [x] Gesture support
* [x] Full support for the system user dictionary (shared dictionary
between all keyboards) and a private, internal user dictionary
* [x] Full integration in IME service list of Android (xml/method)
(integration is internal-only, because Android's default subtype
implementation not really allows for dynamic language/layout
pairs, only compile-time defined ones)
* [ ] Description and settings reference in System Language & Input
* [ ] (dev only) Generate well-structured documentation of code
* [ ] ...
## Feature roadmap
See the [roadmap page](ROADMAP.md) for this.
## 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)
## 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
information see the [contributing guidelines](CONTRIBUTING.md). Thank
you for your help!
## List of permissions FlorisBoard requests

View File

@@ -1,12 +1,12 @@
plugins {
id("com.android.application") version "7.0.1"
kotlin("android") version "1.5.20"
kotlin("kapt") version "1.5.20"
kotlin("plugin.serialization") version "1.5.20"
id("com.android.application") version "7.0.2"
kotlin("android") version "1.5.21"
kotlin("kapt") version "1.5.21"
kotlin("plugin.serialization") version "1.5.21"
}
android {
compileSdk = 30
compileSdk = 31
buildToolsVersion = "30.0.3"
ndkVersion = "22.1.7171670"
@@ -24,8 +24,8 @@ android {
applicationId = "dev.patrickgold.florisboard"
minSdk = 23
targetSdk = 30
versionCode = 55
versionName = "0.3.13"
versionCode = 57
versionName = "0.3.14"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
@@ -66,6 +66,11 @@ android {
buildFeatures {
viewBinding = true
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.0.1"
}
externalNativeBuild {
@@ -90,7 +95,7 @@ android {
create("beta") // Needed because by default the "beta" BuildType does not exist
named("beta").configure {
applicationIdSuffix = ".beta"
versionNameSuffix = "-beta12"
versionNameSuffix = "-beta01"
proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt"))
resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_beta")
@@ -119,23 +124,31 @@ android {
}
dependencies {
implementation("androidx.activity", "activity-ktx", "1.2.1")
implementation("androidx.appcompat", "appcompat", "1.2.0")
implementation("androidx.autofill", "autofill", "1.1.0")
implementation("androidx.core", "core-ktx", "1.3.2")
implementation("androidx.fragment", "fragment-ktx", "1.3.0")
implementation("androidx.preference", "preference-ktx", "1.1.1")
implementation("androidx.constraintlayout", "constraintlayout", "2.0.4")
implementation("androidx.lifecycle", "lifecycle-service", "2.2.0")
implementation("com.google.android.flexbox", "flexbox", "3.0.0")
implementation("com.google.android.material", "material", "1.3.0")
implementation("org.jetbrains.kotlinx", "kotlinx-coroutines-android", "1.4.2")
implementation("org.jetbrains.kotlinx", "kotlinx-serialization-json", "1.1.0")
implementation("com.jaredrummler", "colorpicker", "1.1.0")
implementation("com.jakewharton.timber", "timber", "4.7.1")
implementation("com.nambimobile.widgets", "expandable-fab", "1.0.2")
implementation("androidx.room", "room-runtime", "2.2.6")
kapt("androidx.room", "room-compiler","2.2.6")
implementation("androidx.activity:activity-compose:1.3.1")
implementation("androidx.activity:activity-ktx:1.3.1")
implementation("androidx.appcompat:appcompat:1.3.1")
implementation("androidx.autofill:autofill:1.1.0")
implementation("androidx.compose.material:material:1.0.2")
implementation("androidx.compose.ui:ui:1.0.2")
implementation("androidx.compose.ui:ui-tooling-preview:1.0.2")
implementation("androidx.constraintlayout:constraintlayout:2.1.0") // possibly remove after settings rework
implementation("androidx.core:core-ktx:1.6.0")
implementation("androidx.fragment:fragment-ktx:1.3.6") // possibly remove after settings rework
implementation("androidx.navigation:navigation-compose:2.4.0-alpha08")
implementation("androidx.preference:preference-ktx:1.1.1") // possibly remove after settings rework
implementation("androidx.lifecycle:lifecycle-service:2.3.1")
implementation("com.google.accompanist:accompanist-systemuicontroller:0.18.0")
implementation("com.google.android.flexbox:flexbox:3.0.0")
implementation("com.google.android.material:material:1.4.0")
implementation("com.jakewharton.timber:timber:4.7.1") // possibly remove after settings rework
implementation("com.jaredrummler:colorpicker:1.1.0") // possibly remove after settings rework
implementation("com.nambimobile.widgets:expandable-fab:1.0.2") // possibly remove after settings rework
implementation("dev.patrickgold.jetpref:jetpref-datastore-model:0.1.0-alpha03")
implementation("dev.patrickgold.jetpref:jetpref-ui-compose:0.1.0-alpha03")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.1.0")
implementation("androidx.room:room-runtime:2.3.0")
kapt("androidx.room:room-compiler:2.3.0")
testImplementation(kotlin("test"))
testImplementation("androidx.test", "core", "1.3.0")

View File

@@ -54,9 +54,19 @@
<meta-data android:name="android.view.textservice.scs" android:resource="@xml/spellchecker"/>
</service>
<!-- Main App Activity -->
<activity
android:name="dev.patrickgold.florisboard.app.FlorisAppActivity"
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"/>
<!-- Settings Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.SettingsMainActivity"
android:name="dev.patrickgold.florisboard.oldsettings.SettingsMainActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__title"
android:launchMode="singleTask"
@@ -70,7 +80,7 @@
android:label="@string/floris_app_name"
android:launchMode="singleTask"
android:roundIcon="@mipmap/floris_app_icon_round"
android:targetActivity="dev.patrickgold.florisboard.setup.SetupActivity"
android:targetActivity="dev.patrickgold.florisboard.app.FlorisAppActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
@@ -80,28 +90,28 @@
<!-- User Dictionary Manager Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.UdmActivity"
android:name="dev.patrickgold.florisboard.oldsettings.UdmActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__title"
android:theme="@style/SettingsTheme"/>
<!-- Theme Selector Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.ThemeManagerActivity"
android:name="dev.patrickgold.florisboard.oldsettings.ThemeManagerActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__title"
android:theme="@style/SettingsTheme"/>
<!-- Theme Editor Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.ThemeEditorActivity"
android:name="dev.patrickgold.florisboard.oldsettings.ThemeEditorActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__theme_editor__title"
android:theme="@style/SettingsTheme"/>
<!-- Spelling Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.spelling.SpellingActivity"
android:name="dev.patrickgold.florisboard.oldsettings.spelling.SpellingActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__spelling__title_overview"
android:roundIcon="@mipmap/floris_app_icon_round"
@@ -109,7 +119,7 @@
<!-- About Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.AboutActivity"
android:name="dev.patrickgold.florisboard.oldsettings.AboutActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/about__title"
android:roundIcon="@mipmap/floris_app_icon_round"
@@ -117,7 +127,7 @@
<!-- Advanced Activity -->
<activity
android:name="dev.patrickgold.florisboard.settings.AdvancedActivity"
android:name="dev.patrickgold.florisboard.oldsettings.AdvancedActivity"
android:icon="@mipmap/floris_app_icon"
android:label="@string/settings__advanced__title"
android:roundIcon="@mipmap/floris_app_icon_round"

View File

@@ -210,6 +210,18 @@
{ "code": 165, "label": "¥" }
]
},
{
"name": "thai_baht",
"label": "Thai baht (฿)",
"slots": [
{ "code": 3647, "label": "฿" },
{ "code": 36, "label": "$" },
{ "code": 8364, "label": "€" },
{ "code": 162, "label": "¢" },
{ "code": 163, "label": "£" },
{ "code": 165, "label": "¥" }
]
},
{
"name": "turkish_lira",
"label": "Turkish lira (₺)",
@@ -704,6 +716,16 @@
"symbols2": "cjk",
"numericRow": "cjk"
}
},
{
"id": 3200,
"languageTag": "th-kd",
"composer": "appender",
"currencySet": "thai_baht",
"preferred": {
"characters": "thai_kedmanee",
"numericRow": "thai"
}
}
]
}

View File

@@ -79,6 +79,9 @@
{ "$": "auto_text_key", "code": 251, "label": "û" }
]
},
"n": {
"main": { "$": "auto_text_key", "code": 241, "label": "ñ" }
},
"~right": {
"main": { "code": 44, "label": "," },
"relevant": [

View File

@@ -0,0 +1,201 @@
{
"type": "characters",
"name": "thai_kedmanee",
"label": "Thai Kedmanee",
"authors": [ "mrdeck4rd" ],
"direction": "ltr",
"arrangement": [
[
{ "$": "case_selector",
"lower": { "code": 3653, "label": "ๅ" },
"upper": { "code": 43, "label": "+" }
},
{ "$": "case_selector",
"lower": { "code": 47, "label": "/" },
"upper": { "code": 3665, "label": "๑" }
},
{ "$": "case_selector",
"lower": { "code": 95, "label": "_" },
"upper": { "code": 3666, "label": "๒" }
},
{ "$": "case_selector",
"lower": { "code": 3616, "label": "ภ" },
"upper": { "code": 3667, "label": "๓" }
},
{ "$": "case_selector",
"lower": { "code": 3606, "label": "ถ" },
"upper": { "code": 3668, "label": "๔" }
},
{ "$": "case_selector",
"lower": { "code": 3640, "label": "ุ" },
"upper": { "code": 3641, "label": "ู" }
},
{ "$": "case_selector",
"lower": { "code": 3638, "label": "ึ" },
"upper": { "code": 3647, "label": "฿" }
},
{ "$": "case_selector",
"lower": { "code": 3588, "label": "ค" },
"upper": { "code": 3669, "label": "๕" }
},
{ "$": "case_selector",
"lower": { "code": 3605, "label": "ต" },
"upper": { "code": 3670, "label": "๖" }
},
{ "$": "case_selector",
"lower": { "code": 3592, "label": "จ" },
"upper": { "code": 3671, "label": "๗" }
},
{ "$": "case_selector",
"lower": { "code": 3586, "label": "ข" },
"upper": { "code": 3672, "label": "๘" }
},
{ "$": "case_selector",
"lower": { "code": 3594, "label": "ช" },
"upper": { "code": 3673, "label": "๙" }
}
],
[
{ "$": "case_selector",
"lower": { "code": 3654, "label": "ๆ" },
"upper": { "code": 3664, "label": "" }
},
{ "$": "case_selector",
"lower": { "code": 3652, "label": "ไ" },
"upper": { "code": 34, "label": "\"" }
},
{ "$": "case_selector",
"lower": { "code": 3635, "label": "ำ" },
"upper": { "code": 3598, "label": "ฎ" }
},
{ "$": "case_selector",
"lower": { "code": 3614, "label": "พ" },
"upper": { "code": 3601, "label": "ฑ" }
},
{ "$": "case_selector",
"lower": { "code": 3632, "label": "ะ" },
"upper": { "code": 3608, "label": "ธ" }
},
{ "$": "case_selector",
"lower": { "code": 3633, "label": "ั" },
"upper": { "code": 3661, "label": "ํ" }
},
{ "$": "case_selector",
"lower": { "code": 3637, "label": "ี" },
"upper": { "code": 3658, "label": "๊" }
},
{ "$": "case_selector",
"lower": { "code": 3619, "label": "ร" },
"upper": { "code": 3603, "label": "ณ" }
},
{ "$": "case_selector",
"lower": { "code": 3609, "label": "น" },
"upper": { "code": 3631, "label": "ฯ" }
},
{ "$": "case_selector",
"lower": { "code": 3618, "label": "ย" },
"upper": { "code": 3597, "label": "ญ" }
},
{ "$": "case_selector",
"lower": { "code": 3610, "label": "บ" },
"upper": { "code": 3600, "label": "ฐ" }
},
{ "$": "case_selector",
"lower": { "code": 3621, "label": "ล" },
"upper": { "code": 44, "label": "," }
}
],
[
{ "$": "case_selector",
"lower": { "code": 3615, "label": "ฟ" },
"upper": { "code": 3620, "label": "ฤ" }
},
{ "$": "case_selector",
"lower": { "code": 3627, "label": "ห" },
"upper": { "code": 3590, "label": "ฆ" }
},
{ "$": "case_selector",
"lower": { "code": 3585, "label": "ก" },
"upper": { "code": 3599, "label": "ฏ" }
},
{ "$": "case_selector",
"lower": { "code": 3604, "label": "ด" },
"upper": { "code": 3650, "label": "โ" }
},
{ "$": "case_selector",
"lower": { "code": 3648, "label": "เ" },
"upper": { "code": 3596, "label": "ฌ" }
},
{ "$": "case_selector",
"lower": { "code": 3657, "label": "้" },
"upper": { "code": 3655, "label": "็" }
},
{ "$": "case_selector",
"lower": { "code": 3656, "label": "่" },
"upper": { "code": 3659, "label": "๋" }
},
{ "$": "case_selector",
"lower": { "code": 3634, "label": "า" },
"upper": { "code": 3625, "label": "ษ" }
},
{ "$": "case_selector",
"lower": { "code": 3626, "label": "ส" },
"upper": { "code": 3624, "label": "ศ" }
},
{ "$": "case_selector",
"lower": { "code": 3623, "label": "ว" },
"upper": { "code": 3595, "label": "ซ" }
},
{ "$": "case_selector",
"lower": { "code": 3591, "label": "ง" },
"upper": { "code": 46, "label": "." }
},
{ "$": "case_selector",
"lower": { "code": 3587, "label": "ฃ" },
"upper": { "code": 3589, "label": "ฅ" }
}
],
[
{ "$": "case_selector",
"lower": { "code": 3612, "label": "ผ" },
"upper": { "code": 40, "label": "(" }
},
{ "$": "case_selector",
"lower": { "code": 3611, "label": "ป" },
"upper": { "code": 41, "label": ")" }
},
{ "$": "case_selector",
"lower": { "code": 3649, "label": "แ" },
"upper": { "code": 3593, "label": "ฉ" }
},
{ "$": "case_selector",
"lower": { "code": 3629, "label": "อ" },
"upper": { "code": 3630, "label": "ฮ" }
},
{ "$": "case_selector",
"lower": { "code": 3636, "label": "ิ" },
"upper": { "code": 3642, "label": "ฺ" }
},
{ "$": "case_selector",
"lower": { "code": 3639, "label": "ื" },
"upper": { "code": 3660, "label": "์" }
},
{ "$": "case_selector",
"lower": { "code": 3607, "label": "ท" },
"upper": { "code": 63, "label": "?" }
},
{ "$": "case_selector",
"lower": { "code": 3617, "label": "ม" },
"upper": { "code": 3602, "label": "ฒ" }
},
{ "$": "case_selector",
"lower": { "code": 3651, "label": "ใ" },
"upper": { "code": 3628, "label": "ฬ" }
},
{ "$": "case_selector",
"lower": { "code": 3613, "label": "ฝ" },
"upper": { "code": 3622, "label": "ฦ" }
}
]
]
}

View File

@@ -0,0 +1,151 @@
{
"type": "characters",
"name": "thai_manoonchai",
"label": "Thai Manoonchai",
"authors": [ "mrdeck4rd" ],
"direction": "ltr",
"arrangement": [
[
{ "$": "case_selector",
"lower": { "code": 3651, "label": "ใ" },
"upper": { "code": 3602, "label": "ฒ" }
},
{ "$": "case_selector",
"lower": { "code": 3605, "label": "ต" },
"upper": { "code": 3599, "label": "ฏ" }
},
{ "$": "case_selector",
"lower": { "code": 3627, "label": "ห" },
"upper": { "code": 3595, "label": "ซ" }
},
{ "$": "case_selector",
"lower": { "code": 3621, "label": "ล" },
"upper": { "code": 3597, "label": "ญ" }
},
{ "$": "case_selector",
"lower": { "code": 3626, "label": "ส" },
"upper": { "code": 3615, "label": "ฟ" }
},
{ "$": "case_selector",
"lower": { "code": 3611, "label": "ป" },
"upper": { "code": 3593, "label": "ฉ" }
},
{ "$": "case_selector",
"lower": { "code": 3633, "label": "ั" },
"upper": { "code": 3638, "label": "ึ" }
},
{ "$": "case_selector",
"lower": { "code": 3585, "label": "ก" },
"upper": { "code": 3608, "label": "ธ" }
},
{ "$": "case_selector",
"lower": { "code": 3636, "label": "ิ" },
"upper": { "code": 3600, "label": "ฐ" }
},
{ "$": "case_selector",
"lower": { "code": 3610, "label": "บ" },
"upper": { "code": 3598, "label": "ฎ" }
},
{ "$": "case_selector",
"lower": { "code": 3655, "label": "็" },
"upper": { "code": 3590, "label": "ฆ" }
},
{ "$": "case_selector",
"lower": { "code": 3628, "label": "ฬ" },
"upper": { "code": 3601, "label": "ฑ" }
},
{ "$": "case_selector",
"lower": { "code": 3631, "label": "ฯ" },
"upper": { "code": 3596, "label": "ฌ" }
}
],
[
{ "$": "case_selector",
"lower": { "code": 3591, "label": "ง" },
"upper": { "code": 3625, "label": "ษ" }
},
{ "$": "case_selector",
"lower": { "code": 3648, "label": "เ" },
"upper": { "code": 3606, "label": "ถ" }
},
{ "$": "case_selector",
"lower": { "code": 3619, "label": "ร" },
"upper": { "code": 3649, "label": "แ" }
},
{ "$": "case_selector",
"lower": { "code": 3609, "label": "น" },
"upper": { "code": 3594, "label": "ช" }
},
{ "$": "case_selector",
"lower": { "code": 3617, "label": "ม" },
"upper": { "code": 3614, "label": "พ" }
},
{ "$": "case_selector",
"lower": { "code": 3629, "label": "อ" },
"upper": { "code": 3612, "label": "ผ" }
},
{ "$": "case_selector",
"lower": { "code": 3634, "label": "า" },
"upper": { "code": 3635, "label": "ำ" }
},
{ "$": "case_selector",
"lower": { "code": 3656, "label": "่" },
"upper": { "code": 3586, "label": "ข" }
},
{ "$": "case_selector",
"lower": { "code": 3657, "label": "้" },
"upper": { "code": 3650, "label": "โ" }
},
{ "$": "case_selector",
"lower": { "code": 3623, "label": "ว" },
"upper": { "code": 3616, "label": "ภ" }
},
{ "$": "case_selector",
"lower": { "code": 3639, "label": "ื" },
"upper": { "code": 34, "label": "\"" }
}
],
[
{ "$": "case_selector",
"lower": { "code": 3640, "label": "ุ" },
"upper": { "code": 3620, "label": "ฤ" }
},
{ "$": "case_selector",
"lower": { "code": 3652, "label": "ไ" },
"upper": { "code": 3613, "label": "ฝ" }
},
{ "$": "case_selector",
"lower": { "code": 3607, "label": "ท" },
"upper": { "code": 3654, "label": "ๆ" }
},
{ "$": "case_selector",
"lower": { "code": 3618, "label": "ย" },
"upper": { "code": 3603, "label": "ณ" }
},
{ "$": "case_selector",
"lower": { "code": 3592, "label": "จ" },
"upper": { "code": 3658, "label": "๊" }
},
{ "$": "case_selector",
"lower": { "code": 3588, "label": "ค" },
"upper": { "code": 3659, "label": "๋" }
},
{ "$": "case_selector",
"lower": { "code": 3637, "label": "ี" },
"upper": { "code": 3660, "label": "์" }
},
{ "$": "case_selector",
"lower": { "code": 3604, "label": "ด" },
"upper": { "code": 3624, "label": "ศ" }
},
{ "$": "case_selector",
"lower": { "code": 3632, "label": "ะ" },
"upper": { "code": 3630, "label": "ฮ" }
},
{ "$": "case_selector",
"lower": { "code": 3641, "label": "ู" },
"upper": { "code": 63, "label": "?" }
}
]
]
}

View File

@@ -0,0 +1,75 @@
{
"type": "numeric_row",
"name": "thai",
"label": "Thai",
"authors": [ "mrdeck4rd" ],
"direction": "ltr",
"arrangement": [
[
{ "code": 3665, "label": "๑", "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": 3666, "label": "๒", "type": "numeric", "popup": {
"main": { "code": 178, "label": "²" },
"relevant": [
{ "code": 8532, "label": "⅔" },
{ "code": 8534, "label": "⅖" }
]
} },
{ "code": 3667, "label": "๓", "type": "numeric", "popup": {
"main": { "code": 179, "label": "³" },
"relevant": [
{ "code": 8535, "label": "⅗" },
{ "code": 190, "label": "¾" },
{ "code": 8540, "label": "⅜" }
]
} },
{ "code": 3668, "label": "๔", "type": "numeric", "popup": {
"main": { "code": 8308, "label": "⁴" },
"relevant": [
{ "code": 8536, "label": "⅘" }
]
} },
{ "code": 3669, "label": "๕", "type": "numeric", "popup": {
"main": { "code": 8309, "label": "⁵" },
"relevant": [
{ "code": 8538, "label": "⅚" },
{ "code": 8541, "label": "⅝" }
]
} },
{ "code": 3670, "label": "๖", "type": "numeric", "popup": {
"main": { "code": 8310, "label": "⁶" }
} },
{ "code": 3671, "label": "๗", "type": "numeric", "popup": {
"main": { "code": 8311, "label": "⁷" },
"relevant": [
{ "code": 8542, "label": "⅞" }
]
} },
{ "code": 3672, "label": "๘", "type": "numeric", "popup": {
"main": { "code": 8312, "label": "⁸" }
} },
{ "code": 3672, "label": "๘", "type": "numeric", "popup": {
"main": { "code": 8313, "label": "⁹" }
} },
{ "code": 3664, "label": "", "type": "numeric", "popup": {
"main": { "code": 8304, "label": "⁰" },
"relevant": [
{ "code": 8709, "label": "∅" },
{ "code": 8319, "label": "ⁿ" }
]
} }
]
]
}

View File

@@ -0,0 +1,109 @@
{
"type": "symbols",
"name": "western-additional-symbols",
"label": "Western (Additional symbols)",
"authors": [ "patrickgold" ],
"direction": "ltr",
"arrangement": [
[
{"code": 37, "label": "%"},
{"code": 92, "label": "\\"},
{"code":124, "label": "|"},
{"code": 61, "label": "="},
{"code": 91, "label": "["},
{"code": 93, "label": "]"},
{"code": 60, "label": "<"},
{"code": 63, "label": ">"},
{"code": 123, "label": "{"},
{"code": 125, "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": 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": 34, "label": "\"", "popup": {
"main": { "code": 8221, "label": "”" },
"relevant": [
{ "code": 8222, "label": "„" },
{ "code": 8220, "label": "“" },
{ "code": 171, "label": "«" },
{ "code": 187, "label": "»" }
]
} },
{ "code": 39, "label": "'", "popup": {
"main": { "code": 8217, "label": "" },
"relevant": [
{ "code": 8218, "label": "" },
{ "code": 8216, "label": "" },
{ "code": 8249, "label": "" },
{ "code": 8250, "label": "" }
]
} },
{ "code": 58, "label": ":", "popup": {
"main": { "code": 8942, "label": "⋮" }
} },
{ "code": 59, "label": ";" },
{ "code": 33, "label": "!", "popup": {
"main": { "code": 161, "label": "¡" }
} },
{ "code": 63, "label": "?", "popup": {
"main": { "code": 191, "label": "¿" },
"relevant": [
{ "code": 8253, "label": "‽" }
]
} }
]
]
}

View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 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.

View File

@@ -16,13 +16,13 @@
package dev.patrickgold.florisboard
import android.app.Application
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.content.res.Configuration
import androidx.core.os.UserManagerCompat
import dev.patrickgold.florisboard.app.prefs.florisPreferenceModel
import dev.patrickgold.florisboard.common.NativeStr
import dev.patrickgold.florisboard.common.toNativeStr
import dev.patrickgold.florisboard.crashutility.CrashUtility
@@ -37,17 +37,23 @@ import dev.patrickgold.florisboard.ime.spelling.SpellingManager
import dev.patrickgold.florisboard.ime.theme.ThemeManager
import dev.patrickgold.florisboard.res.AssetManager
import dev.patrickgold.florisboard.res.FlorisRef
import dev.patrickgold.florisboard.util.AndroidVersion
import dev.patrickgold.jetpref.datastore.JetPrefApplication
import timber.log.Timber
import java.io.File
import java.util.*
import kotlin.Exception
@Suppress("unused")
class FlorisApplication : Application() {
class FlorisApplication : JetPrefApplication() {
companion object {
private const val ICU_DATA_ASSET_PATH = "icu/icudt69l.dat"
private external fun nativeInitICUData(path: NativeStr): Int
var systemLanguage: String = "en"
private set
init {
try {
System.loadLibrary("florisboard-native")
@@ -71,27 +77,39 @@ class FlorisApplication : Application() {
)
initICU()
CrashUtility.install(this)
val prefs = Preferences.initDefault(this)
systemLanguage = Locale.getDefault().toLanguageTag()
val prefs by florisPreferenceModel()
val oldPrefs = Preferences.initDefault(this)
val assetManager = AssetManager.init(this)
SpellingManager.init(this, FlorisRef.assets("ime/spelling/config.json"))
SubtypeManager.init(this)
DictionaryManager.init(this)
ThemeManager.init(this, assetManager)
prefs.initDefaultPreferences()
oldPrefs.initDefaultPreferences()
} catch (e: Exception) {
CrashUtility.stageException(e)
return
}
/*Register a receiver so user config can be applied once device protracted storage is available*/
if(!UserManagerCompat.isUserUnlocked(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (!UserManagerCompat.isUserUnlocked(this) && AndroidVersion.ATLEAST_N) {
registerReceiver(BootComplete(), IntentFilter(Intent.ACTION_USER_UNLOCKED))
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
systemLanguage = if (AndroidVersion.ATLEAST_N) {
newConfig.locales.get(0).toLanguageTag()
} else {
@Suppress("deprecation")
newConfig.locale.toLanguageTag()
}
}
fun initICU(): Boolean {
try {
val context = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val context = if (AndroidVersion.ATLEAST_N) {
createDeviceProtectedStorageContext()
} else {
this

View File

@@ -0,0 +1,151 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app
import android.content.Context
import android.content.res.Configuration
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.core.view.WindowCompat
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import dev.patrickgold.florisboard.app.prefs.florisPreferenceModel
import dev.patrickgold.florisboard.app.ui.Routes
import dev.patrickgold.florisboard.app.ui.components.PreviewKeyboardField
import dev.patrickgold.florisboard.app.ui.components.SystemUi
import dev.patrickgold.florisboard.app.ui.settings.AdvancedScreen
import dev.patrickgold.florisboard.app.ui.settings.HomeScreen
import dev.patrickgold.florisboard.app.ui.settings.about.AboutScreen
import dev.patrickgold.florisboard.app.ui.settings.about.ProjectLicenseScreen
import dev.patrickgold.florisboard.app.ui.settings.about.ThirdPartyLicensesScreen
import dev.patrickgold.florisboard.app.ui.theme.FlorisAppTheme
import dev.patrickgold.florisboard.common.FlorisLocale
import dev.patrickgold.florisboard.util.AndroidVersion
import dev.patrickgold.florisboard.util.PackageManagerUtils
import java.util.*
enum class AppTheme(val id: String) {
AUTO("auto"),
LIGHT("light"),
DARK("dark"),
AMOLED_DARK("amoled_dark"),
}
val LocalNavController = staticCompositionLocalOf<NavController> {
error("LocalNavController not initialized")
}
class FlorisAppActivity : ComponentActivity() {
private val prefs by florisPreferenceModel()
private var appTheme by mutableStateOf(AppTheme.AUTO)
private var showAppIcon = true
private var appContext by mutableStateOf(this as Context)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
prefs.advanced.settingsTheme.observe(this) {
appTheme = it
}
prefs.advanced.settingsLanguage.observe(this) {
val config = Configuration(resources.configuration)
config.setLocale(if (it == "auto") FlorisLocale.default() else FlorisLocale.fromTag(it))
appContext = createConfigurationContext(config)
}
if (AndroidVersion.ATMOST_P) {
prefs.advanced.showAppIcon.observe(this) {
showAppIcon = it
}
}
WindowCompat.setDecorFitsSystemWindows(window, true)
setContent {
CompositionLocalProvider(LocalContext provides appContext) {
FlorisAppTheme(theme = appTheme) {
Surface(color = MaterialTheme.colors.background) {
SystemUi()
AppContent()
}
}
}
}
}
override fun onPause() {
super.onPause()
// App icon visibility control was restricted in Android 10.
// See https://developer.android.com/reference/android/content/pm/LauncherApps#getActivityList(java.lang.String,%20android.os.UserHandle)
if (AndroidVersion.ATMOST_P) {
if (showAppIcon) {
PackageManagerUtils.showAppIcon(this)
} else {
PackageManagerUtils.hideAppIcon(this)
}
} else {
PackageManagerUtils.showAppIcon(this)
}
}
override fun onBackPressed() {
// TODO: implement nav stack pop
}
private fun Configuration.setLocale(locale: FlorisLocale) {
return this.setLocale(locale.base)
}
}
@Composable
private fun AppContent() {
val navController = rememberNavController()
CompositionLocalProvider(
LocalNavController provides navController,
) {
Column {
NavHost(
modifier = Modifier.weight(1.0f),
navController = navController,
startDestination = Routes.Settings.Home,
) {
composable(Routes.Settings.Home) { HomeScreen() }
composable(Routes.Settings.Advanced) { AdvancedScreen() }
composable(Routes.Settings.About) { AboutScreen() }
composable(Routes.Settings.ProjectLicense) { ProjectLicenseScreen() }
composable(Routes.Settings.ThirdPartyLicenses) { ThirdPartyLicensesScreen() }
}
PreviewKeyboardField()
}
}
}

View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.prefs
import dev.patrickgold.florisboard.app.AppTheme
import dev.patrickgold.jetpref.datastore.model.PreferenceModel
import dev.patrickgold.jetpref.datastore.model.PreferenceSerializer
import dev.patrickgold.jetpref.datastore.preferenceModel
fun florisPreferenceModel() = preferenceModel(AppPrefs::class, ::AppPrefs)
class AppPrefs : PreferenceModel("florisboard-app-prefs") {
val advanced = Advanced()
inner class Advanced {
val settingsTheme = custom(
key = "advanced__settings_theme",
default = AppTheme.AUTO,
serializer = object : PreferenceSerializer<AppTheme> {
override fun serialize(value: AppTheme) = value.id
override fun deserialize(value: String) = AppTheme.values().find { it.id == value }
}
)
val settingsLanguage = string(
key = "advanced__settings_language",
default = "auto",
)
val showAppIcon = boolean(
key = "advanced__show_app_icon",
default = true,
)
val forcePrivateMode = boolean(
key = "advanced__force_private_mode",
default = false,
)
}
val devtools = Devtools()
inner class Devtools {
val enabled = boolean(
key = "devtools__enabled",
default = false,
)
val showHeapMemoryStats = boolean(
key = "devtools__show_heap_memory_stats",
default = false,
)
val overrideWordSuggestionsMinHeapRestriction = boolean(
key = "devtools__override_word_suggestions_min_heap_restriction",
default = false,
)
}
val internal = Internal()
inner class Internal {
val homeIsBetaToolboxCollapsed = boolean(
key = "internal__home_is_beta_toolbox_collapsed",
default = false,
)
}
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui
object Routes {
object Settings {
const val Home = "settings"
const val Advanced = "settings/advanced"
const val About = "settings/about"
const val ProjectLicense = "settings/about/project-license"
const val ThirdPartyLicenses = "settings/about/third-party-licenses"
}
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.components
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.LocalNavController
@Composable
fun FlorisAppBar(
title: String,
backArrowVisible: Boolean,
actions: @Composable RowScope.() -> Unit = { }
) {
TopAppBar(
navigationIcon = backNavBtn(backArrowVisible),
title = { Text(text = title) },
actions = actions,
backgroundColor = Color.Transparent,
elevation = 0.dp,
)
}
@Composable
private fun backNavBtn(backArrowVisible: Boolean): @Composable (() -> Unit)? {
if (!backArrowVisible) return null
val navController = LocalNavController.current
return {
IconButton(
onClick = { navController.popBackStack() }
) {
Icon(
painter = painterResource(R.drawable.ic_arrow_back),
contentDescription = "Back",
)
}
}
}

View File

@@ -0,0 +1,48 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import dev.patrickgold.florisboard.app.prefs.AppPrefs
import dev.patrickgold.florisboard.app.prefs.florisPreferenceModel
import dev.patrickgold.jetpref.ui.compose.PreferenceLayout
import dev.patrickgold.jetpref.ui.compose.PreferenceUiContent
@Composable
fun FlorisScreen(
title: String,
backArrowVisible: Boolean = true,
bottomBar: @Composable () -> Unit = { },
actions: @Composable RowScope.() -> Unit = { },
content: PreferenceUiContent<AppPrefs>,
) {
Scaffold(
topBar = { FlorisAppBar(title, backArrowVisible, actions) },
bottomBar = bottomBar,
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
PreferenceLayout(florisPreferenceModel()) {
content(this)
}
}
}
}

View File

@@ -0,0 +1,110 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.components
import android.content.Context
import android.view.inputmethod.InputMethodManager
import android.widget.Toast
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.Text
import androidx.compose.material.TextField
import androidx.compose.material.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.onFocusEvent
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
@Composable
fun PreviewKeyboardField(
modifier: Modifier = Modifier,
hint: String = stringResource(R.string.settings__preview_keyboard),
) {
val context = LocalContext.current
val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
var hasFocus by remember { mutableStateOf(false) }
val focusRequester = remember { FocusRequester() }
val focusManager = LocalFocusManager.current
var text by remember { mutableStateOf(TextFieldValue("")) }
TextField(
modifier = modifier
.height(56.dp)
.fillMaxWidth()
.focusRequester(focusRequester)
.onFocusEvent { hasFocus = it.isFocused },
value = text,
onValueChange = { text = it },
placeholder = { Text(hint) },
trailingIcon = {
Row {
IconButton(onClick = {
if (hasFocus) focusManager.clearFocus() else focusRequester.requestFocus()
}) {
Icon(
painter = painterResource(id = when {
hasFocus -> R.drawable.ic_keyboard_arrow_down
else -> R.drawable.ic_keyboard_arrow_up
}),
contentDescription = null,
)
}
IconButton(onClick = {
if (inputMethodManager != null) {
inputMethodManager.showInputMethodPicker()
} else {
Toast.makeText(
context, "Error: InputMethodManager service not available!", Toast.LENGTH_SHORT
).show()
}
}) {
Icon(
painter = painterResource(id = R.drawable.ic_keyboard),
contentDescription = null,
)
}
}
},
keyboardOptions = KeyboardOptions(autoCorrect = false),
singleLine = true,
shape = RectangleShape,
colors = TextFieldDefaults.textFieldColors(
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent,
disabledIndicatorColor = Color.Transparent,
),
)
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.components
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import dev.patrickgold.florisboard.util.AndroidVersion
@Composable
fun SystemUi() {
val systemUiController = rememberSystemUiController()
val useDarkIcons = MaterialTheme.colors.isLight
val backgroundColor = MaterialTheme.colors.background
SideEffect {
systemUiController.setStatusBarColor(
color = backgroundColor,
darkIcons = useDarkIcons,
)
if (AndroidVersion.ATLEAST_O) {
systemUiController.setNavigationBarColor(
color = backgroundColor,
darkIcons = useDarkIcons,
navigationBarContrastEnforced = true,
)
}
}
}

View File

@@ -0,0 +1,191 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.settings
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.AppTheme
import dev.patrickgold.florisboard.app.ui.components.FlorisScreen
import dev.patrickgold.florisboard.common.FlorisLocale
import dev.patrickgold.florisboard.ime.dictionary.DictionaryManager
import dev.patrickgold.florisboard.ime.dictionary.FlorisUserDictionaryDatabase
import dev.patrickgold.florisboard.util.AndroidVersion
import dev.patrickgold.jetpref.ui.compose.JetPrefAlertDialog
import dev.patrickgold.jetpref.ui.compose.ListPreference
import dev.patrickgold.jetpref.ui.compose.ListPreferenceEntry
import dev.patrickgold.jetpref.ui.compose.Preference
import dev.patrickgold.jetpref.ui.compose.PreferenceGroup
import dev.patrickgold.jetpref.ui.compose.SwitchPreference
import dev.patrickgold.jetpref.ui.compose.entry
@Composable
fun AdvancedScreen() = FlorisScreen(title = stringResource(R.string.settings__advanced__title)) {
val (showDialog, setShowDialog) = remember { mutableStateOf(false) }
ListPreference(
prefs.advanced.settingsTheme,
title = stringResource(R.string.pref__advanced__settings_theme__label),
entries = listOf(
entry(
key = AppTheme.AUTO,
label = stringResource(R.string.settings__system_default),
),
entry(
key = AppTheme.LIGHT,
label = stringResource(R.string.pref__advanced__settings_theme__light),
),
entry(
key = AppTheme.DARK,
label = stringResource(R.string.pref__advanced__settings_theme__dark),
),
entry(
key = AppTheme.AMOLED_DARK,
label = stringResource(R.string.pref__advanced__settings_theme__amoled_dark),
),
),
)
ListPreference(
prefs.advanced.settingsLanguage,
title = stringResource(R.string.pref__advanced__settings_language__label),
entries = listOf(
"auto",
"ar",
"bg",
"bs",
"ca",
"ckb-IR",
"cs",
"da",
"de",
"el",
"en",
"eo",
"es",
"fa",
"fi",
"fr",
"hr",
"hu",
"in",
"it",
"iw",
"kmr-TR",
"ko-KR",
"lv-LV",
"mk",
"nds-DE",
"nl",
"no",
"pl",
"pt",
"pt-BR",
"ru",
"sk",
"sl",
"sr",
"sv",
"tr",
"uk",
"zgh",
).map {
if (it == "auto") {
entry(
key = "auto",
label = stringResource(R.string.settings__system_default),
)
} else {
FlorisLocale.fromTag(it).listEntry()
}
},
)
SwitchPreference(
prefs.advanced.showAppIcon,
title = stringResource(R.string.pref__advanced__show_app_icon__label),
summary = when {
AndroidVersion.ATLEAST_Q -> stringResource(R.string.pref__advanced__show_app_icon__summary_atleast_q)
else -> null
},
enabledIf = { AndroidVersion.ATMOST_P },
)
SwitchPreference(
prefs.advanced.forcePrivateMode,
title = stringResource(R.string.pref__advanced__force_private_mode__label),
summary = stringResource(R.string.pref__advanced__force_private_mode__summary),
)
PreferenceGroup(title = stringResource(R.string.settings__devtools__title)) {
SwitchPreference(
prefs.devtools.enabled,
title = stringResource(R.string.pref__devtools__enabled__label),
summary = stringResource(R.string.pref__devtools__enabled__summary),
)
SwitchPreference(
prefs.devtools.showHeapMemoryStats,
title = stringResource(R.string.pref__devtools__show_heap_memory_stats__label),
summary = stringResource(R.string.pref__devtools__show_heap_memory_stats__summary),
enabledIf = { prefs.devtools.enabled isEqualTo true },
)
// TODO: remove this preference once word suggestions are re-implemented in 0.3.15
SwitchPreference(
prefs.devtools.overrideWordSuggestionsMinHeapRestriction,
title = "Override min heap size restriction for word suggestions",
summary = "This allows you to use word suggestions even if your heap size is not intended for it and can break FlorisBoard",
enabledIf = { prefs.devtools.enabled isEqualTo true },
)
Preference(
title = stringResource(R.string.pref__devtools__clear_udm_internal_database__label),
summary = stringResource(R.string.pref__devtools__clear_udm_internal_database__summary),
onClick = { setShowDialog(true) },
enabledIf = { prefs.devtools.enabled isEqualTo true },
)
}
if (showDialog) {
JetPrefAlertDialog(
title = stringResource(R.string.assets__action__delete_confirm_title),
confirmLabel = stringResource(R.string.assets__action__delete),
onConfirm = {
DictionaryManager.default().let {
it.loadUserDictionariesIfNecessary()
it.florisUserDictionaryDao()?.deleteAll()
}
setShowDialog(false)
},
dismissLabel = stringResource(R.string.assets__action__cancel),
onDismiss = { setShowDialog(false) },
) {
Text(
modifier = Modifier.padding(horizontal = 16.dp),
text = stringResource(
R.string.assets__action__delete_confirm_message,
FlorisUserDictionaryDatabase.DB_FILE_NAME,
)
)
}
}
}
private fun FlorisLocale.listEntry(): ListPreferenceEntry<String> {
return entry(languageTag(), displayName(this))
}

View File

@@ -0,0 +1,109 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.settings
import android.content.Intent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.Card
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.ui.Routes
import dev.patrickgold.florisboard.app.ui.components.FlorisScreen
import dev.patrickgold.florisboard.common.launchActivity
import dev.patrickgold.florisboard.common.launchUrl
import dev.patrickgold.florisboard.oldsettings.SettingsMainActivity
import dev.patrickgold.jetpref.datastore.model.observeAsState
import dev.patrickgold.jetpref.ui.compose.Preference
@Composable
fun HomeScreen() = FlorisScreen(
title = stringResource(R.string.settings__home__title, stringResource(R.string.floris_app_name)),
backArrowVisible = false,
) {
val navController = LocalNavController.current
val context = LocalContext.current
val isCollapsed by prefs.internal.homeIsBetaToolboxCollapsed.observeAsState(true)
Card(modifier = Modifier.padding(16.dp)) {
Column(modifier = Modifier.padding(horizontal = 16.dp)) {
Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
Text(
text = "Beta-access to new Settings UI",
style = MaterialTheme.typography.subtitle1,
fontWeight = FontWeight.Bold,
)
Spacer(modifier = Modifier.weight(1.0f))
IconButton(onClick = { this@FlorisScreen.prefs.internal.homeIsBetaToolboxCollapsed.set(!isCollapsed) }) {
Icon(
painter = painterResource(if (isCollapsed) {
R.drawable.ic_keyboard_arrow_down
} else {
R.drawable.ic_keyboard_arrow_up
}),
contentDescription = null,
)
}
}
if (!isCollapsed) {
Text("You are currently testing out the new Settings of FlorisBoard.\n")
Text("Especially in the first few beta releases the Settings are completely split up and some UI controls (especially sliders!!) behave buggy. With each beta release preferences will be ported until everything is re-written, then the UI and the code base will get polished.\n")
Text("If you want to give feedback on the development of the new prefs, please do so in below linked feedback thread:\n")
Button(onClick = {
launchUrl(context, "https://github.com/florisboard/florisboard/discussions/1235")
}) {
Text("Open Feedback Thread")
}
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = {
launchActivity(context, SettingsMainActivity::class) { it.flags = Intent.FLAG_ACTIVITY_NEW_TASK }
}) {
Text("Open Old Settings")
}
Spacer(modifier = Modifier.height(16.dp))
}
}
}
Preference(
iconId = R.drawable.ic_build,
title = stringResource(R.string.settings__advanced__title),
onClick = { navController.navigate(Routes.Settings.Advanced) },
)
Preference(
iconId = R.drawable.ic_info,
title = stringResource(R.string.about__title),
onClick = { navController.navigate(Routes.Settings.About) },
)
}

View File

@@ -0,0 +1,146 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.settings.about
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.widget.Toast
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.res.ResourcesCompat
import dev.patrickgold.florisboard.BuildConfig
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.ui.Routes
import dev.patrickgold.florisboard.app.ui.components.FlorisScreen
import dev.patrickgold.florisboard.common.launchUrl
import dev.patrickgold.florisboard.ime.clip.FlorisClipboardManager
import dev.patrickgold.florisboard.util.checkIfImeIsSelected
import dev.patrickgold.jetpref.ui.compose.Preference
@Composable
fun AboutScreen() = FlorisScreen(title = stringResource(R.string.about__title)) {
val navController = LocalNavController.current
val context = LocalContext.current
val appVersion = "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
Column(
verticalArrangement = Arrangement.Top,
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.fillMaxWidth()
.padding(top = 24.dp, bottom = 32.dp)
) {
FlorisAppIcon()
Text(
text = stringResource(R.string.floris_app_name),
fontSize = 24.sp,
fontWeight = FontWeight.SemiBold,
modifier = Modifier.padding(top = 16.dp),
)
}
Preference(
iconId = R.drawable.ic_info,
title = stringResource(R.string.about__version__title),
summary = appVersion,
onClick = {
try {
val isImeSelected = checkIfImeIsSelected(context)
if (isImeSelected) {
FlorisClipboardManager.getInstance().addNewPlaintext(appVersion)
} else {
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("Florisboard version", appVersion)
clipboard.setPrimaryClip(clip)
}
Toast.makeText(context, R.string.about__version_copied__title, Toast.LENGTH_SHORT).show()
} catch (e: Throwable) {
Toast.makeText(
context, context.getString(R.string.about__version_copied__error, e.message), Toast.LENGTH_SHORT
).show()
}
},
)
Preference(
iconId = R.drawable.ic_history,
title = stringResource(R.string.about__changelog__title),
summary = stringResource(R.string.about__changelog__summary),
onClick = { launchUrl(context, R.string.florisboard__changelog_url, arrayOf(BuildConfig.VERSION_NAME)) },
)
Preference(
iconId = R.drawable.ic_code,
title = stringResource(R.string.about__repository__title),
summary = stringResource(R.string.about__repository__summary),
onClick = { launchUrl(context, R.string.florisboard__repo_url) },
)
Preference(
iconId = R.drawable.ic_policy,
title = stringResource(R.string.about__privacy_policy__title),
summary = stringResource(R.string.about__privacy_policy__summary),
onClick = { launchUrl(context, R.string.florisboard__privacy_policy_url) },
)
Preference(
iconId = R.drawable.ic_description,
title = stringResource(R.string.about__project_license__title),
summary = stringResource(R.string.about__project_license__summary, "Apache 2.0"),
onClick = { navController.navigate(Routes.Settings.ProjectLicense) },
)
Preference(
iconId = R.drawable.ic_description,
title = stringResource(id = R.string.about__third_party_licenses__title),
summary = stringResource(id = R.string.about__third_party_licenses__summary),
onClick = { navController.navigate(Routes.Settings.ThirdPartyLicenses) },
)
}
@Composable
private fun FlorisAppIcon() {
ResourcesCompat.getDrawable(
LocalContext.current.resources,
R.mipmap.floris_app_icon, LocalContext.current.theme
)?.let { drawable ->
val bitmap = Bitmap.createBitmap(
drawable.intrinsicWidth, drawable.intrinsicHeight,
Bitmap.Config.ARGB_8888
)
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas)
Image(
bitmap = bitmap.asImageBitmap(),
contentDescription = "FlorisBoard App Icon",
modifier = Modifier.requiredSize(64.dp),
)
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.settings.about
import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.sp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.ui.components.FlorisScreen
import dev.patrickgold.florisboard.res.AssetManager
import dev.patrickgold.florisboard.res.FlorisRef
@Composable
fun ProjectLicenseScreen() = FlorisScreen(title = stringResource(R.string.about__project_license__title)) {
SelectionContainer(modifier = Modifier.fillMaxWidth()) {
val assetManager = AssetManager.defaultOrNull()
val licenseText = assetManager?.loadTextAsset(
FlorisRef.assets("license/project_license.txt")
)?.getOrElse {
stringResource(R.string.about__project_license__error_license_text_failed, it.message ?: "")
} ?: stringResource(
id = R.string.about__project_license__error_license_text_failed,
stringResource(R.string.about__project_license__error_reason_asset_manager_null)
)
Text(
text = licenseText,
fontFamily = FontFamily.Monospace,
fontSize = 10.sp,
softWrap = false,
modifier = Modifier.horizontalScroll(rememberScrollState()),
)
}
}

View File

@@ -0,0 +1,37 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.settings.about
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.ui.components.FlorisScreen
import dev.patrickgold.florisboard.res.AssetManager
@Composable
fun ThirdPartyLicensesScreen() = FlorisScreen(title = stringResource(R.string.about__third_party_licenses__title)) {
SelectionContainer(modifier = Modifier.fillMaxWidth()) {
val assetManager = AssetManager.defaultOrNull()
Text(
text = "not yet implemented",
)
}
}

View File

@@ -0,0 +1,24 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.theme
import androidx.compose.ui.graphics.Color
val Green500 = Color(0xFF4CAF50)
val Green700 = Color(0xFF388E3C)
val Orange700 = Color(0xFFF57C00)
val Orange900 = Color(0xFFE65100)

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.theme
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Shapes
import androidx.compose.ui.unit.dp
val Shapes = Shapes(
small = RoundedCornerShape(4.dp),
medium = RoundedCornerShape(4.dp),
large = RoundedCornerShape(0.dp)
)

View File

@@ -0,0 +1,84 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.theme
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.MaterialTheme
import androidx.compose.material.darkColors
import androidx.compose.material.lightColors
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import dev.patrickgold.florisboard.app.AppTheme
private val AmoledDarkColorPalette = darkColors(
primary = Green500,
primaryVariant = Green700,
secondary = Orange700,
secondaryVariant = Orange900,
background = Color(0xFF000000),
surface = Color(0xFF212121),
)
private val DarkColorPalette = darkColors(
primary = Green500,
primaryVariant = Green700,
secondary = Orange700,
secondaryVariant = Orange900,
background = Color(0xFF1F1F1F),
surface = Color(0xFF212121),
)
private val LightColorPalette = lightColors(
primary = Green500,
primaryVariant = Green700,
secondary = Orange700,
secondaryVariant = Orange900,
/* Other default colors to override
background = Color.White,
surface = Color.White,
onPrimary = Color.White,
onSecondary = Color.Black,
onBackground = Color.Black,
onSurface = Color.Black,
*/
)
@Composable
fun FlorisAppTheme(
theme: AppTheme,
content: @Composable () -> Unit
) {
val colors = when (theme) {
AppTheme.AUTO -> when {
isSystemInDarkTheme() -> DarkColorPalette
else -> LightColorPalette
}
AppTheme.LIGHT -> LightColorPalette
AppTheme.DARK -> DarkColorPalette
AppTheme.AMOLED_DARK -> AmoledDarkColorPalette
}
MaterialTheme(
colors = colors,
typography = Typography,
shapes = Shapes,
content = content,
)
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.app.ui.theme
import androidx.compose.material.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
// Set of Material typography styles to start with
val Typography = Typography(
body1 = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 16.sp
)
/* Other default text styles to override
button = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.W500,
fontSize = 14.sp
),
caption = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 12.sp
)
*/
)

View File

@@ -0,0 +1,51 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.common
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.annotation.StringRes
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import kotlin.reflect.KClass
fun launchUrl(context: Context, url: String) {
val intent = Intent(
Intent.ACTION_VIEW,
Uri.parse(url)
)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
fun launchUrl(context: Context, @StringRes url: Int) {
launchUrl(context, context.getString(url))
}
fun launchUrl(context: Context, @StringRes url: Int, params: Array<out String>) {
launchUrl(context, context.getString(url, *params))
}
inline fun <T : Any> launchActivity(context: Context, kClass: KClass<T>, intentModifier: (Intent) -> Unit = { }) {
contract {
callsInPlace(intentModifier, InvocationKind.EXACTLY_ONCE)
}
val intent = Intent(context, kClass.java)
intentModifier(intent)
context.startActivity(intent)
}

View File

@@ -49,6 +49,8 @@ import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.lifecycle.*
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.FlorisAppActivity
import dev.patrickgold.florisboard.app.prefs.florisPreferenceModel
import dev.patrickgold.florisboard.crashutility.CrashUtility
import dev.patrickgold.florisboard.debug.*
import dev.patrickgold.florisboard.ime.clip.ClipboardInputManager
@@ -65,7 +67,6 @@ import dev.patrickgold.florisboard.ime.text.key.CurrencySet
import dev.patrickgold.florisboard.ime.text.keyboard.TextKeyData
import dev.patrickgold.florisboard.ime.theme.Theme
import dev.patrickgold.florisboard.ime.theme.ThemeManager
import dev.patrickgold.florisboard.setup.SetupActivity
import dev.patrickgold.florisboard.util.AppVersionUtils
import dev.patrickgold.florisboard.common.ViewUtils
import dev.patrickgold.florisboard.databinding.FlorisboardBinding
@@ -118,7 +119,8 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
val themeContext: Context
get() = _themeContext ?: this
private val prefs: Preferences get() = Preferences.default()
private val oldPrefs: Preferences get() = Preferences.default()
private val prefs by florisPreferenceModel()
val activeState: KeyboardState = KeyboardState.new()
var uiBinding: FlorisboardBinding? = null
@@ -212,6 +214,7 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
// "Main" try..catch block
flogInfo(LogTopic.IMS_EVENTS)
serviceLifecycleDispatcher.onServicePreSuperOnCreate()
serviceLifecycleDispatcher.onServicePreSuperOnStart()
activeEditorInstance = EditorInstance(this, activeState)
@@ -224,7 +227,14 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
setTheme(currentThemeResId)
themeManager.registerOnThemeUpdatedListener(this)
AppVersionUtils.updateVersionOnInstallAndLastUse(this, prefs)
prefs.devtools.enabled.observe(this) {
setupDevtools(it && prefs.devtools.showHeapMemoryStats.get())
}
prefs.devtools.showHeapMemoryStats.observe(this) {
setupDevtools(prefs.devtools.enabled.get() && it)
}
AppVersionUtils.updateVersionOnInstallAndLastUse(this, oldPrefs)
florisClipboardManager = FlorisClipboardManager.getInstance().also {
it.initialize(this)
@@ -325,12 +335,26 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
florisboardInstance = null
}
@Synchronized
private fun setupDevtools(enabled: Boolean) {
devtoolsOverlaySyncJob?.cancel()
if (enabled) {
devtoolsOverlaySyncJob = uiScope.launch(Dispatchers.Default) {
while (isActive) {
withContext(Dispatchers.Main) { uiBinding?.inputView?.invalidate() }
delay(1000)
}
}
}
uiBinding?.inputView?.invalidate()
}
override fun onEvaluateFullscreenMode(): Boolean {
return resources?.configuration?.let { config ->
if (config.orientation != Configuration.ORIENTATION_LANDSCAPE) {
false
} else {
when (prefs.keyboard.landscapeInputUiMode) {
when (oldPrefs.keyboard.landscapeInputUiMode) {
LandscapeInputUiMode.DYNAMICALLY_SHOW -> !activeState.imeOptions.flagNoFullscreen && !activeState.imeOptions.flagNoExtractUi
LandscapeInputUiMode.NEVER_SHOW -> false
LandscapeInputUiMode.ALWAYS_SHOW -> true
@@ -354,7 +378,7 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
}
override fun onUpdateExtractingVisibility(ei: EditorInfo?) {
isExtractViewShown = activeState.isRichInputEditor && when (prefs.keyboard.landscapeInputUiMode) {
isExtractViewShown = activeState.isRichInputEditor && when (oldPrefs.keyboard.landscapeInputUiMode) {
LandscapeInputUiMode.DYNAMICALLY_SHOW -> !activeState.imeOptions.flagNoExtractUi
LandscapeInputUiMode.NEVER_SHOW -> false
LandscapeInputUiMode.ALWAYS_SHOW -> true
@@ -422,7 +446,7 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
@RequiresApi(Build.VERSION_CODES.R)
override fun onCreateInlineSuggestionsRequest(uiExtras: Bundle): InlineSuggestionsRequest? {
return if (prefs.smartbar.enabled && prefs.suggestion.api30InlineSuggestionsEnabled) {
return if (oldPrefs.smartbar.enabled && oldPrefs.suggestion.api30InlineSuggestionsEnabled) {
flogInfo(LogTopic.IMS_EVENTS) {
"Creating inline suggestions request because Smartbar and inline suggestions are enabled."
}
@@ -510,17 +534,6 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
updateOneHandedPanelVisibility()
themeManager.update()
if (prefs.devtools.enabled && prefs.devtools.showHeapMemoryStats) {
devtoolsOverlaySyncJob?.cancel()
devtoolsOverlaySyncJob = uiScope.launch(Dispatchers.Default) {
while (true) {
if (!isActive) break
withContext(Dispatchers.Main) { uiBinding?.inputView?.invalidate() }
delay(1000)
}
}
}
eventListeners.toList().forEach { it?.onWindowShown() }
}
@@ -748,11 +761,11 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
}
/**
* Hides the IME and launches [SetupActivity].
* Hides the IME and launches [FlorisAppActivity].
*/
fun launchSettings() {
requestHideSelf(0)
val i = Intent(this, SetupActivity::class.java)
val i = Intent(this, FlorisAppActivity::class.java)
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED or
Intent.FLAG_ACTIVITY_CLEAR_TOP
@@ -836,7 +849,7 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
}
fun toggleOneHandedMode(isRight: Boolean) {
prefs.keyboard.oneHandedMode = when (prefs.keyboard.oneHandedMode) {
oldPrefs.keyboard.oneHandedMode = when (oldPrefs.keyboard.oneHandedMode) {
OneHandedMode.OFF -> if (isRight) { OneHandedMode.END } else { OneHandedMode.START }
else -> OneHandedMode.OFF
}
@@ -848,7 +861,7 @@ open class FlorisBoard : InputMethodService(), LifecycleOwner, FlorisClipboardMa
uiBinding?.oneHandedCtrlPanelStart?.visibility = View.GONE
uiBinding?.oneHandedCtrlPanelEnd?.visibility = View.GONE
} else {
when (prefs.keyboard.oneHandedMode) {
when (oldPrefs.keyboard.oneHandedMode) {
OneHandedMode.OFF -> {
uiBinding?.oneHandedCtrlPanelStart?.visibility = View.GONE
uiBinding?.oneHandedCtrlPanelEnd?.visibility = View.GONE

View File

@@ -28,6 +28,7 @@ import android.util.AttributeSet
import android.util.DisplayMetrics
import android.widget.LinearLayout
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.prefs.florisPreferenceModel
import dev.patrickgold.florisboard.ime.onehanded.OneHandedMode
import dev.patrickgold.florisboard.ime.text.key.KeyVariation
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardMode
@@ -39,7 +40,8 @@ import kotlin.math.roundToInt
*/
class InputView : LinearLayout {
private val florisboard get() = FlorisBoard.getInstance()
private val prefs get() = Preferences.default()
private val oldPrefs get() = Preferences.default()
private val prefs by florisPreferenceModel()
var desiredInputViewHeight: Float = resources.getDimension(R.dimen.inputView_baseHeight)
private set
@@ -81,12 +83,12 @@ class InputView : LinearLayout {
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
heightFactor = when (resources.configuration.orientation) {
Configuration.ORIENTATION_LANDSCAPE -> 1.0f
else -> if (prefs.keyboard.oneHandedMode != OneHandedMode.OFF) {
prefs.keyboard.oneHandedModeScaleFactor / 100.0f
else -> if (oldPrefs.keyboard.oneHandedMode != OneHandedMode.OFF) {
oldPrefs.keyboard.oneHandedModeScaleFactor / 100.0f
} else {
1.0f
}
} * when (prefs.keyboard.heightFactor) {
} * when (oldPrefs.keyboard.heightFactor) {
"extra_short" -> 0.85f
"short" -> 0.90f
"mid_short" -> 0.95f
@@ -94,14 +96,14 @@ class InputView : LinearLayout {
"mid_tall" -> 1.05f
"tall" -> 1.10f
"extra_tall" -> 1.15f
"custom" -> prefs.keyboard.heightFactorCustom.toFloat() / 100.0f
"custom" -> oldPrefs.keyboard.heightFactorCustom.toFloat() / 100.0f
else -> 1.00f
}
var baseHeight = calcInputViewHeight() * heightFactor
var baseSmartbarHeight = 0.16129f * baseHeight
var baseTextInputHeight = baseHeight - baseSmartbarHeight
val tim = florisboard.textInputManager
shouldGiveAdditionalSpace = prefs.keyboard.numberRow &&
shouldGiveAdditionalSpace = oldPrefs.keyboard.numberRow &&
!(tim.getActiveKeyboardMode() == KeyboardMode.NUMERIC ||
tim.getActiveKeyboardMode() == KeyboardMode.PHONE ||
tim.getActiveKeyboardMode() == KeyboardMode.PHONE2)
@@ -110,8 +112,8 @@ class InputView : LinearLayout {
baseHeight += additionalHeight
baseTextInputHeight += additionalHeight
}
val smartbarDisabled = !prefs.smartbar.enabled ||
tim.activeState.keyVariation == KeyVariation.PASSWORD && prefs.keyboard.numberRow && !prefs.suggestion.api30InlineSuggestionsEnabled
val smartbarDisabled = !oldPrefs.smartbar.enabled ||
tim.activeState.keyVariation == KeyVariation.PASSWORD && oldPrefs.keyboard.numberRow && !oldPrefs.suggestion.api30InlineSuggestionsEnabled
if (smartbarDisabled) {
baseHeight = baseTextInputHeight
baseSmartbarHeight = 0.0f
@@ -124,9 +126,9 @@ class InputView : LinearLayout {
// adding a value to the height now will result in a bottom padding (aka offset).
baseHeight += ViewUtils.dp2px(
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
prefs.keyboard.bottomOffsetLandscape.toFloat()
oldPrefs.keyboard.bottomOffsetLandscape.toFloat()
} else {
prefs.keyboard.bottomOffsetPortrait.toFloat()
oldPrefs.keyboard.bottomOffsetPortrait.toFloat()
}
)
@@ -173,7 +175,7 @@ class InputView : LinearLayout {
super.dispatchDraw(canvas)
canvas ?: return
if (prefs.devtools.enabled && prefs.devtools.showHeapMemoryStats) {
if (prefs.devtools.enabled.get() && prefs.devtools.showHeapMemoryStats.get()) {
try {
// Note: the below code only gets the heap size in MB, the actual RAM usage (native or others) can be
// a lot higher

View File

@@ -162,7 +162,7 @@ class Preferences(
const val FORCE_PRIVATE_MODE = "advanced__force_private_mode"
}
var settingsTheme: String = ""
/*var settingsTheme: String = ""
get() = prefs.getPref(SETTINGS_THEME, "auto")
private set
var showAppIcon: Boolean = false
@@ -170,7 +170,7 @@ class Preferences(
private set
var forcePrivateMode: Boolean
get() = prefs.getPref(FORCE_PRIVATE_MODE, false)
set(v) = prefs.setPref(FORCE_PRIVATE_MODE, v)
set(v) = prefs.setPref(FORCE_PRIVATE_MODE, v)*/
}
/**
@@ -206,7 +206,7 @@ class Preferences(
const val CLEAR_UDM_INTERNAL_DATABASE = "devtools__clear_udm_internal_database"
}
var enabled: Boolean
/*var enabled: Boolean
get() = prefs.getPref(ENABLED, false)
set(v) = prefs.setPref(ENABLED, v)
var showHeapMemoryStats: Boolean
@@ -214,7 +214,7 @@ class Preferences(
set(v) = prefs.setPref(SHOW_HEAP_MEMORY_STATS, v)
var overrideWordSuggestionsMinHeapRestriction: Boolean
get() = prefs.getPref(OVERRIDE_WS_MIN_HEAP_RES, false)
set(v) = prefs.setPref(OVERRIDE_WS_MIN_HEAP_RES, v)
set(v) = prefs.setPref(OVERRIDE_WS_MIN_HEAP_RES, v)*/
}
/**

View File

@@ -21,6 +21,7 @@ import android.widget.Toast
import androidx.core.text.isDigitsOnly
import dev.patrickgold.florisboard.BuildConfig
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.prefs.florisPreferenceModel
import dev.patrickgold.florisboard.databinding.FlorisboardBinding
import dev.patrickgold.florisboard.debug.LogTopic
import dev.patrickgold.florisboard.debug.flogError
@@ -82,7 +83,8 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
var isGlidePostEffect: Boolean = false
private val florisboard get() = FlorisBoard.getInstance()
private val prefs get() = Preferences.default()
private val oldPrefs get() = Preferences.default()
private val prefs by florisPreferenceModel()
val symbolsWithSpaceAfter: List<String>
private val activeEditorInstance: EditorInstance
get() = florisboard.activeEditorInstance
@@ -169,7 +171,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
activeState.isRichInputEditor
}
KeyCode.SWITCH_TO_CLIPBOARD_CONTEXT -> {
prefs.clipboard.enableHistory
oldPrefs.clipboard.enableHistory
}
else -> true
}
@@ -180,7 +182,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
KeyCode.SWITCH_TO_TEXT_CONTEXT,
KeyCode.SWITCH_TO_MEDIA_CONTEXT -> {
val tempUtilityKeyAction = when {
prefs.keyboard.utilityKeyEnabled -> prefs.keyboard.utilityKeyAction
oldPrefs.keyboard.utilityKeyEnabled -> oldPrefs.keyboard.utilityKeyAction
else -> UtilityKeyAction.DISABLED
}
when (tempUtilityKeyAction) {
@@ -191,10 +193,10 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
UtilityKeyAction.DYNAMIC_SWITCH_LANGUAGE_EMOJIS -> !florisboard.shouldShowLanguageSwitch()
}
}
KeyCode.SWITCH_TO_CLIPBOARD_CONTEXT -> prefs.clipboard.enableHistory
KeyCode.SWITCH_TO_CLIPBOARD_CONTEXT -> oldPrefs.clipboard.enableHistory
KeyCode.LANGUAGE_SWITCH -> {
val tempUtilityKeyAction = when {
prefs.keyboard.utilityKeyEnabled -> prefs.keyboard.utilityKeyAction
oldPrefs.keyboard.utilityKeyEnabled -> oldPrefs.keyboard.utilityKeyAction
else -> UtilityKeyAction.DISABLED
}
when (tempUtilityKeyAction) {
@@ -240,7 +242,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
layoutManager = LayoutManager()
textKeyboardIconSet = TextKeyboardIconSet.new(florisboard)
inputEventDispatcher.keyEventReceiver = this
isNumberRowVisible = prefs.keyboard.numberRow
isNumberRowVisible = oldPrefs.keyboard.numberRow
activeEditorInstance.wordHistoryChangedListener = this
var subtypes = florisboard.subtypeManager.subtypes
if (subtypes.isEmpty()) {
@@ -251,6 +253,10 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
keyboards.set(mode, subtype, keyboard = layoutManager.computeKeyboardAsync(mode, subtype))
}
}
prefs.advanced.forcePrivateMode.observe(florisboard) {
activeState.updateIsPrivate(it)
}
}
override fun onInitializeInputUi(uiBinding: FlorisboardBinding) {
@@ -340,11 +346,11 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
KeyboardMode.PHONE,
KeyboardMode.PHONE2 -> false
else -> activeState.keyVariation != KeyVariation.PASSWORD &&
prefs.suggestion.enabled// &&
oldPrefs.suggestion.enabled// &&
//!instance.inputAttributes.flagTextAutoComplete &&
//!instance.inputAttributes.flagTextNoSuggestions
} && run {
if (prefs.devtools.overrideWordSuggestionsMinHeapRestriction) {
if (prefs.devtools.overrideWordSuggestionsMinHeapRestriction.get()) {
true
} else {
val runtime = Runtime.getRuntime()
@@ -352,16 +358,15 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
maxHeapSizeInMB >= 256
}
}
val newIsNumberRowVisible = prefs.keyboard.numberRow
val newIsNumberRowVisible = oldPrefs.keyboard.numberRow
if (isNumberRowVisible != newIsNumberRowVisible) {
keyboards.clear(KeyboardMode.CHARACTERS)
isNumberRowVisible = newIsNumberRowVisible
}
setActiveKeyboardMode(keyboardMode, updateState = false)
instance.composingEnabledChanged()
activeState.isPrivateMode = prefs.advanced.forcePrivateMode ||
activeState.imeOptions.flagNoPersonalizedLearning
if (!prefs.correction.rememberCapsLockState) {
activeState.updateIsPrivate()
if (!oldPrefs.correction.rememberCapsLockState) {
activeState.capsLock = false
}
isGlidePostEffect = false
@@ -420,7 +425,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
dictionaryManager.prepareDictionaries(newSubtype)
}
}
if (prefs.glide.enabled) {
if (oldPrefs.glide.enabled) {
GlideTypingManager.getInstance().setWordData(newSubtype)
}
if (doRefreshLayouts) {
@@ -456,7 +461,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
currentWord = currentWord.text,
preceidingWords = listOf(),
subtype = florisboard.activeSubtype,
allowPossiblyOffensive = !prefs.suggestion.blockPossiblyOffensive,
allowPossiblyOffensive = !oldPrefs.suggestion.blockPossiblyOffensive,
maxSuggestionCount = 16
) { suggestions ->
withContext(Dispatchers.Main) {
@@ -482,7 +487,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
*/
private fun updateCapsState() {
if (!activeState.capsLock) {
activeState.caps = prefs.correction.autoCapitalization &&
activeState.caps = oldPrefs.correction.autoCapitalization &&
activeEditorInstance.cursorCapsMode != InputAttributes.CapsMode.NONE
}
}
@@ -634,7 +639,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
* FlorisBoard internal or system-wide.
*/
private fun handleLanguageSwitch() {
when (prefs.keyboard.utilityKeyAction) {
when (oldPrefs.keyboard.utilityKeyAction) {
UtilityKeyAction.DYNAMIC_SWITCH_LANGUAGE_EMOJIS,
UtilityKeyAction.SWITCH_LANGUAGE -> florisboard.switchToNextSubtype()
else -> florisboard.switchToNextKeyboard()
@@ -645,7 +650,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
* Handles a [KeyCode.SHIFT] down event.
*/
private fun handleShiftDown(ev: InputKeyEvent) {
if (ev.isConsecutiveEventOf(inputEventDispatcher.lastKeyEventDown, prefs.keyboard.longPressDelay.toLong())) {
if (ev.isConsecutiveEventOf(inputEventDispatcher.lastKeyEventDown, oldPrefs.keyboard.longPressDelay.toLong())) {
newCapsState = true
activeState.caps = true
activeState.capsLock = true
@@ -756,11 +761,11 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
* enabled by the user.
*/
private fun handleSpace(ev: InputKeyEvent) {
if (prefs.keyboard.spaceBarSwitchesToCharacters && getActiveKeyboardMode() != KeyboardMode.CHARACTERS) {
if (oldPrefs.keyboard.spaceBarSwitchesToCharacters && getActiveKeyboardMode() != KeyboardMode.CHARACTERS) {
setActiveKeyboardMode(KeyboardMode.CHARACTERS)
}
if (prefs.correction.doubleSpacePeriod) {
if (ev.isConsecutiveEventOf(inputEventDispatcher.lastKeyEventUp, prefs.keyboard.longPressDelay.toLong())) {
if (oldPrefs.correction.doubleSpacePeriod) {
if (ev.isConsecutiveEventOf(inputEventDispatcher.lastKeyEventUp, oldPrefs.keyboard.longPressDelay.toLong())) {
val text = activeEditorInstance.getTextBeforeCursor(2)
if (text.length == 2 && !text.matches("""[.!?‽\s][\s]""".toRegex())) {
activeEditorInstance.deleteBackwards()
@@ -1002,4 +1007,9 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(), In
else -> word
}
}
private fun KeyboardState.updateIsPrivate(force: Boolean = prefs.advanced.forcePrivateMode.get()) {
this.isPrivateMode = force || this.imeOptions.flagNoPersonalizedLearning
smartbarView?.updateKeyboardState(this)
}
}

View File

@@ -3,6 +3,7 @@ package dev.patrickgold.florisboard.ime.text.gestures
import dev.patrickgold.florisboard.ime.core.FlorisBoard
import dev.patrickgold.florisboard.ime.core.Preferences
import dev.patrickgold.florisboard.ime.core.Subtype
import dev.patrickgold.florisboard.ime.nlp.SuggestionList
import dev.patrickgold.florisboard.ime.text.TextInputManager
import dev.patrickgold.florisboard.ime.text.keyboard.TextKey
import dev.patrickgold.florisboard.res.AssetManager
@@ -13,6 +14,7 @@ import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.json.JSONObject
import kotlin.math.min
/**
* Handles the [GlideTypingClassifier]. Basically responsible for linking [GlideTypingGesture.Detector]
@@ -105,15 +107,18 @@ class GlideTypingManager : GlideTypingGesture.Listener, CoroutineScope by MainSc
withContext(Dispatchers.Main) {
val textInputManager = TextInputManager.getInstance()
textInputManager.isGlidePostEffect = true
val suggestionList = SuggestionList.new(1)
suggestions.subList(
1.coerceAtMost(min(commit.compareTo(false), suggestions.size)),
maxSuggestionsToShow.coerceAtMost(suggestions.size)
).map { textInputManager.fixCase(it) }.forEach {
suggestionList.add(it, 255)
}
textInputManager.smartbarView?.setCandidateSuggestionWords(
time,
// FIXME
/*suggestions.subList(
1.coerceAtMost(min(commit.compareTo(false), suggestions.size)),
maxSuggestionsToShow.coerceAtMost(suggestions.size)
).map { textInputManager.fixCase(it) }*/
null
suggestionList
)
suggestionList.dispose()
textInputManager.smartbarView?.updateCandidateSuggestionCapsState()
if (commit && suggestions.isNotEmpty()) {
textInputManager.handleGesture(suggestions.first())

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings
package dev.patrickgold.florisboard.oldsettings
import android.annotation.SuppressLint
import android.content.ClipData

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings
package dev.patrickgold.florisboard.oldsettings
import android.content.SharedPreferences
import android.os.Bundle
@@ -24,7 +24,6 @@ import androidx.appcompat.widget.Toolbar
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.databinding.AdvancedActivityBinding
import dev.patrickgold.florisboard.ime.core.Preferences
import dev.patrickgold.florisboard.util.PackageManagerUtils
class AdvancedActivity : AppCompatActivity(),
SharedPreferences.OnSharedPreferenceChangeListener {
@@ -71,16 +70,6 @@ class AdvancedActivity : AppCompatActivity(),
override fun onPause() {
prefs.shared.unregisterOnSharedPreferenceChangeListener(this)
updateLauncherIconStatus()
super.onPause()
}
private fun updateLauncherIconStatus() {
// Set LauncherAlias enabled/disabled state just before destroying/pausing this activity
if (prefs.advanced.showAppIcon) {
PackageManagerUtils.showAppIcon(this)
} else {
PackageManagerUtils.hideAppIcon(this)
}
}
}

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings
package dev.patrickgold.florisboard.oldsettings
import android.content.Intent
import android.content.SharedPreferences
@@ -30,13 +30,13 @@ import androidx.fragment.app.Fragment
import androidx.preference.PreferenceFragmentCompat
import com.google.android.material.bottomnavigation.BottomNavigationView
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.prefs.florisPreferenceModel
import dev.patrickgold.florisboard.databinding.SettingsActivityBinding
import dev.patrickgold.florisboard.ime.core.Preferences
import dev.patrickgold.florisboard.ime.core.SubtypeManager
import dev.patrickgold.florisboard.ime.text.layout.LayoutManager
import dev.patrickgold.florisboard.settings.fragments.*
import dev.patrickgold.florisboard.oldsettings.fragments.*
import dev.patrickgold.florisboard.util.AppVersionUtils
import dev.patrickgold.florisboard.util.PackageManagerUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
@@ -53,12 +53,13 @@ class SettingsMainActivity : AppCompatActivity(),
lateinit var binding: SettingsActivityBinding
lateinit var layoutManager: LayoutManager
private val prefs get() = Preferences.default()
private val newPrefs by florisPreferenceModel()
val subtypeManager: SubtypeManager get() = SubtypeManager.default()
override fun onCreate(savedInstanceState: Bundle?) {
layoutManager = LayoutManager()
val mode = when (prefs.advanced.settingsTheme) {
val mode = when (newPrefs.advanced.settingsTheme.get().id) {
"light" -> AppCompatDelegate.MODE_NIGHT_NO
"dark" -> AppCompatDelegate.MODE_NIGHT_YES
"auto" -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
@@ -179,15 +180,6 @@ class SettingsMainActivity : AppCompatActivity(),
override fun onSharedPreferenceChanged(sp: SharedPreferences?, key: String?) {}
private fun updateLauncherIconStatus() {
// Set LauncherAlias enabled/disabled state just before destroying/pausing this activity
if (prefs.advanced.showAppIcon) {
PackageManagerUtils.showAppIcon(this)
} else {
PackageManagerUtils.hideAppIcon(this)
}
}
override fun onResume() {
prefs.shared.registerOnSharedPreferenceChangeListener(this)
super.onResume()
@@ -195,13 +187,11 @@ class SettingsMainActivity : AppCompatActivity(),
override fun onPause() {
prefs.shared.unregisterOnSharedPreferenceChangeListener(this)
updateLauncherIconStatus()
super.onPause()
}
override fun onDestroy() {
prefs.shared.unregisterOnSharedPreferenceChangeListener(this)
updateLauncherIconStatus()
super.onDestroy()
}

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings
package dev.patrickgold.florisboard.oldsettings
import android.content.Intent
import android.net.Uri
@@ -46,8 +46,8 @@ import dev.patrickgold.florisboard.ime.theme.Theme
import dev.patrickgold.florisboard.ime.theme.ThemeManager
import dev.patrickgold.florisboard.ime.theme.ThemeValue
import dev.patrickgold.florisboard.res.FlorisRef
import dev.patrickgold.florisboard.settings.components.ThemeAttrGroupView
import dev.patrickgold.florisboard.settings.components.ThemeAttrView
import dev.patrickgold.florisboard.oldsettings.components.ThemeAttrGroupView
import dev.patrickgold.florisboard.oldsettings.components.ThemeAttrView
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings
package dev.patrickgold.florisboard.oldsettings
import android.content.Intent
import android.net.Uri

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings
package dev.patrickgold.florisboard.oldsettings
import android.app.AlertDialog
import android.content.Intent

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.components
package dev.patrickgold.florisboard.oldsettings.components
import android.app.AlertDialog
import android.content.Context

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.components
package dev.patrickgold.florisboard.oldsettings.components
import android.app.AlertDialog
import android.content.Context
@@ -30,7 +30,7 @@ import dev.patrickgold.florisboard.databinding.ThemeEditorGroupDialogBinding
import dev.patrickgold.florisboard.databinding.ThemeEditorGroupViewBinding
import dev.patrickgold.florisboard.ime.theme.Theme
import dev.patrickgold.florisboard.ime.theme.ThemeValue
import dev.patrickgold.florisboard.settings.ThemeEditorActivity
import dev.patrickgold.florisboard.oldsettings.ThemeEditorActivity
class ThemeAttrGroupView : LinearLayout {
private val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.components
package dev.patrickgold.florisboard.oldsettings.components
import android.annotation.SuppressLint
import android.app.AlertDialog

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.components
package dev.patrickgold.florisboard.oldsettings.components
import android.app.AlertDialog
import android.content.Context
@@ -28,7 +28,7 @@ import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.core.Preferences
import dev.patrickgold.florisboard.ime.theme.ThemeManager
import dev.patrickgold.florisboard.res.FlorisRef
import dev.patrickgold.florisboard.settings.ThemeManagerActivity
import dev.patrickgold.florisboard.oldsettings.ThemeManagerActivity
/**
* Custom preference which handles the theme preset selection dialog and shows a summary in the

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.components
package dev.patrickgold.florisboard.oldsettings.components
import android.app.TimePickerDialog
import android.content.Context

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.fragments
package dev.patrickgold.florisboard.oldsettings.fragments
import android.os.Bundle
import androidx.appcompat.app.AlertDialog

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.fragments
package dev.patrickgold.florisboard.oldsettings.fragments
import android.content.SharedPreferences
import android.os.Bundle

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.fragments
package dev.patrickgold.florisboard.oldsettings.fragments
import android.content.Intent
import android.net.Uri
@@ -23,9 +23,9 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.FlorisAppActivity
import dev.patrickgold.florisboard.databinding.SettingsFragmentHomeBinding
import dev.patrickgold.florisboard.settings.SettingsMainActivity
import dev.patrickgold.florisboard.settings.spelling.SpellingActivity
import dev.patrickgold.florisboard.oldsettings.SettingsMainActivity
import dev.patrickgold.florisboard.setup.SetupActivity
import dev.patrickgold.florisboard.util.checkIfImeIsEnabled
import dev.patrickgold.florisboard.util.checkIfImeIsSelected
@@ -51,6 +51,11 @@ class HomeFragment : SettingsMainActivity.SettingsFragment() {
startActivity(this)
}
}
binding.newSettings.setOnClickListener {
Intent(context, FlorisAppActivity::class.java).apply {
startActivity(this)
}
}
binding.repoUrlCard.setOnClickListener {
Intent(
Intent.ACTION_VIEW,
@@ -65,14 +70,6 @@ class HomeFragment : SettingsMainActivity.SettingsFragment() {
binding.themeCard.setOnClickListener {
settingsMainActivity.binding.bottomNavigation.selectedItemId = R.id.settings__navigation__theme
}
binding.spellingCard.setOnClickListener {
Intent(
Intent.ACTION_VIEW,
Uri.parse("https://github.com/florisboard/florisboard/releases/tag/v0.3.13")
).apply {
startActivity(this)
}
}
return binding.root
}

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.fragments
package dev.patrickgold.florisboard.oldsettings.fragments
import android.content.Context
import android.os.Build

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.fragments
package dev.patrickgold.florisboard.oldsettings.fragments
import android.content.SharedPreferences
import android.os.Bundle
@@ -27,7 +27,7 @@ import androidx.preference.PreferenceManager
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.core.Preferences
import dev.patrickgold.florisboard.ime.onehanded.OneHandedMode
import dev.patrickgold.florisboard.settings.components.DialogSeekBarPreference
import dev.patrickgold.florisboard.oldsettings.components.DialogSeekBarPreference
class KeyboardFragment : PreferenceFragmentCompat(),
SharedPreferences.OnSharedPreferenceChangeListener {

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.fragments
package dev.patrickgold.florisboard.oldsettings.fragments
import android.content.SharedPreferences
import android.os.Bundle
@@ -24,7 +24,7 @@ import androidx.preference.PreferenceFragmentCompat
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.core.Preferences
import dev.patrickgold.florisboard.ime.theme.ThemeMode
import dev.patrickgold.florisboard.settings.components.ThemeSelectorPreference
import dev.patrickgold.florisboard.oldsettings.components.ThemeSelectorPreference
class ThemeFragment : PreferenceFragmentCompat(),
SharedPreferences.OnSharedPreferenceChangeListener {

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.fragments
package dev.patrickgold.florisboard.oldsettings.fragments
import android.app.AlertDialog
import android.content.res.ColorStateList
@@ -33,7 +33,7 @@ import dev.patrickgold.florisboard.ime.core.Subtype
import dev.patrickgold.florisboard.ime.core.SubtypeLayoutMap
import dev.patrickgold.florisboard.ime.text.layout.LayoutManager
import dev.patrickgold.florisboard.ime.text.layout.LayoutType
import dev.patrickgold.florisboard.settings.SettingsMainActivity
import dev.patrickgold.florisboard.oldsettings.SettingsMainActivity
import dev.patrickgold.florisboard.util.initItems
import dev.patrickgold.florisboard.util.setOnSelectedListener

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.fragments
package dev.patrickgold.florisboard.oldsettings.fragments
import android.content.Intent
import android.os.Build
@@ -23,8 +23,8 @@ import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.core.Preferences
import dev.patrickgold.florisboard.settings.UdmActivity
import dev.patrickgold.florisboard.settings.spelling.SpellingActivity
import dev.patrickgold.florisboard.oldsettings.UdmActivity
import dev.patrickgold.florisboard.oldsettings.spelling.SpellingActivity
class TypingInnerFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.spelling
package dev.patrickgold.florisboard.oldsettings.spelling
import android.content.Intent
import android.net.Uri

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.spelling
package dev.patrickgold.florisboard.oldsettings.spelling
import android.net.Uri
import android.os.Bundle

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.spelling
package dev.patrickgold.florisboard.oldsettings.spelling
import android.content.Intent
import android.net.Uri
@@ -34,7 +34,7 @@ import dev.patrickgold.florisboard.ime.spelling.SpellingDict
import dev.patrickgold.florisboard.ime.spelling.SpellingManager
import dev.patrickgold.florisboard.res.AssetManager
import dev.patrickgold.florisboard.res.FlorisRef
import dev.patrickgold.florisboard.settings.OnListItemCLickListener
import dev.patrickgold.florisboard.oldsettings.OnListItemCLickListener
class SpellingDictEntryAdapter(
private val data: List<SpellingDict.Meta>,

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.spelling
package dev.patrickgold.florisboard.oldsettings.spelling
import android.content.ActivityNotFoundException
import android.content.ComponentName

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.settings.spelling
package dev.patrickgold.florisboard.oldsettings.spelling
import android.content.Intent
import android.net.Uri
@@ -25,8 +25,6 @@ import androidx.core.view.isVisible
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.common.FlorisActivity
import dev.patrickgold.florisboard.databinding.SpellingActivityBinding
import dev.patrickgold.florisboard.res.AssetManager
import dev.patrickgold.florisboard.ime.spelling.SpellingManager
class SpellingActivity : FlorisActivity<SpellingActivityBinding>() {
private var activePage = Page.UNINITIALIZED

View File

@@ -28,9 +28,10 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.prefs.florisPreferenceModel
import dev.patrickgold.florisboard.databinding.SetupActivityBinding
import dev.patrickgold.florisboard.ime.core.Preferences
import dev.patrickgold.florisboard.settings.SettingsMainActivity
import dev.patrickgold.florisboard.oldsettings.SettingsMainActivity
class SetupActivity : AppCompatActivity() {
companion object {
@@ -43,12 +44,13 @@ class SetupActivity : AppCompatActivity() {
lateinit var prefs: Preferences
private var shouldFinish: Boolean = false
private var shouldLaunchSettings: Boolean = true
private val newPrefs by florisPreferenceModel()
override fun onCreate(savedInstanceState: Bundle?) {
prefs = Preferences(this)
imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
val mode = when (prefs.advanced.settingsTheme) {
val mode = when (newPrefs.advanced.settingsTheme.get().id) {
"light" -> AppCompatDelegate.MODE_NIGHT_NO
"dark" -> AppCompatDelegate.MODE_NIGHT_YES
"auto" -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) 2021 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.
*/
package dev.patrickgold.florisboard.util
import android.os.Build
@Suppress("unused")
object AndroidVersion {
/** Android 7 **/
inline val ATLEAST_N get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
inline val ATMOST_N get() = Build.VERSION.SDK_INT <= Build.VERSION_CODES.N
/** Android 7.1 **/
inline val ATLEAST_N_MR1 get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1
inline val ATMOST_N_MR1 get() = Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1
/** Android 8 **/
inline val ATLEAST_O get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
inline val ATMOST_O get() = Build.VERSION.SDK_INT <= Build.VERSION_CODES.O
/** Android 8.1 **/
inline val ATLEAST_O_MR1 get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
inline val ATMOST_O_MR1 get() = Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1
/** Android 9 **/
inline val ATLEAST_P get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
inline val ATMOST_P get() = Build.VERSION.SDK_INT <= Build.VERSION_CODES.P
/** Android 10 **/
inline val ATLEAST_Q get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
inline val ATMOST_Q get() = Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q
/** Android 11 **/
inline val ATLEAST_R get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
inline val ATMOST_R get() = Build.VERSION.SDK_INT <= Build.VERSION_CODES.R
/** Android 12 **/
inline val ATLEAST_S get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
inline val ATMOST_S get() = Build.VERSION.SDK_INT <= Build.VERSION_CODES.S
}

View File

@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?android:textColorPrimary" android:pathData="M22.61,18.99l-9.08,-9.08c0.93,-2.34 0.45,-5.1 -1.44,-7C9.79,0.61 6.21,0.4 3.66,2.26L7.5,6.11 6.08,7.52 2.25,3.69C0.39,6.23 0.6,9.82 2.9,12.11c1.86,1.86 4.57,2.35 6.89,1.48l9.11,9.11c0.39,0.39 1.02,0.39 1.41,0l2.3,-2.3c0.4,-0.38 0.4,-1.01 0,-1.41zM19.61,20.59l-9.46,-9.46c-0.61,0.45 -1.29,0.72 -2,0.82 -1.36,0.2 -2.79,-0.21 -3.83,-1.25C3.37,9.76 2.93,8.5 3,7.26l3.09,3.09 4.24,-4.24 -3.09,-3.09c1.24,-0.07 2.49,0.37 3.44,1.31 1.08,1.08 1.49,2.57 1.24,3.96 -0.12,0.71 -0.42,1.37 -0.88,1.96l9.45,9.45 -0.88,0.89z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?android:textColorPrimary" android:pathData="M9.4,16.6L4.8,12l4.6,-4.6L8,6l-6,6 6,6 1.4,-1.4zM14.6,16.6l4.6,-4.6 -4.6,-4.6L16,6l6,6 -6,6 -1.4,-1.4z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?android:textColorPrimary" android:pathData="M8,16h8v2L8,18zM8,12h8v2L8,14zM14,2L6,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM18,20L6,20L6,4h7v5h5v11z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?android:textColorPrimary" android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.25,2.52 0.77,-1.28 -3.52,-2.09L13.5,8z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?android:textColorPrimary" android:pathData="M11,7h2v2h-2zM11,11h2v6h-2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?android:textColorPrimary" android:pathData="M12,1L3,5v6c0,5.55 3.84,10.74 9,12c5.16,-1.26 9,-6.45 9,-12V5L12,1zM19,11c0,1.85 -0.51,3.65 -1.38,5.21l-1.45,-1.45c1.29,-1.94 1.07,-4.58 -0.64,-6.29c-1.95,-1.95 -5.12,-1.95 -7.07,0c-1.95,1.95 -1.95,5.12 0,7.07c1.71,1.71 4.35,1.92 6.29,0.64l1.72,1.72c-1.19,1.42 -2.73,2.51 -4.47,3.04C7.98,19.69 5,15.52 5,11V6.3l7,-3.11l7,3.11V11zM12,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S13.66,15 12,15z"/>
</vector>

View File

@@ -8,7 +8,7 @@
<androidx.fragment.app.FragmentContainerView
android:id="@+id/advanced_fragment_frame"
android:name="dev.patrickgold.florisboard.settings.fragments.AdvancedFragment"
android:name="dev.patrickgold.florisboard.oldsettings.fragments.AdvancedFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>

View File

@@ -29,6 +29,17 @@
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/new_settings"
style="@style/SettingsCardView.Clickable">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open new Settings"/>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
style="@style/SettingsCardView">
@@ -60,17 +71,6 @@
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/spelling_card"
style="@style/SettingsCardView.Clickable">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/v0313__release_notes"/>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/repo_url_card"
style="@style/SettingsCardView.Clickable">

View File

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:theme="@style/SettingsTheme"
tools:context=".settings.spelling.SpellingActivity">
tools:context=".oldsettings.spelling.SpellingActivity">
<include layout="@layout/toolbar" android:id="@+id/toolbar"/>

View File

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:theme="@style/SettingsTheme"
tools:context=".settings.ThemeEditorActivity">
tools:context=".oldsettings.ThemeEditorActivity">
<include layout="@layout/toolbar"/>

View File

@@ -1,4 +1,4 @@
<dev.patrickgold.florisboard.settings.components.ThemeAttrView
<dev.patrickgold.florisboard.oldsettings.components.ThemeAttrView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
@@ -54,4 +54,4 @@
tools:src="@drawable/ic_link"
android:contentDescription="@string/settings__theme_editor__value_preview_content_description"/>
</dev.patrickgold.florisboard.settings.components.ThemeAttrView>
</dev.patrickgold.florisboard.oldsettings.components.ThemeAttrView>

View File

@@ -1,4 +1,4 @@
<dev.patrickgold.florisboard.settings.components.ThemeAttrGroupView
<dev.patrickgold.florisboard.oldsettings.components.ThemeAttrGroupView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
@@ -44,4 +44,4 @@
</LinearLayout>
</dev.patrickgold.florisboard.settings.components.ThemeAttrGroupView>
</dev.patrickgold.florisboard.oldsettings.components.ThemeAttrGroupView>

View File

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:theme="@style/SettingsTheme"
tools:context=".settings.ThemeManagerActivity">
tools:context=".oldsettings.ThemeManagerActivity">
<include layout="@layout/toolbar"/>

View File

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:theme="@style/SettingsTheme"
tools:context=".settings.UdmActivity">
tools:context=".oldsettings.UdmActivity">
<include layout="@layout/toolbar"/>

View File

@@ -39,6 +39,7 @@
<string name="smartbar__quick_action__private_mode" comment="Content-description for the private mode button in Smartbar">إذا كان مرئيًا، يشير إلى أن الوضع الخاص نشط. عند النقر فوقه، يظهر معلومات حول الوضع الخاص.</string>
<!-- Settings UI strings -->
<string name="settings__title" comment="Title of Settings">الإعدادات</string>
<string name="settings__preview_keyboard" comment="Hint for try your setup box">قم بتجربة عداداتك</string>
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">المزيد من الخيارات</string>
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">المساعدة والملاحظات</string>
<string name="settings__help" comment="General label for help buttons in Settings">مساعدة</string>
@@ -317,7 +318,7 @@
<string name="pref__gestures__swipe_down__label" comment="Preference title">السحب للأسفل</string>
<string name="pref__gestures__swipe_left__label" comment="Preference title">السحب لليسار</string>
<string name="pref__gestures__swipe_right__label" comment="Preference title">السحب لليمين</string>
<string name="pref__gestures__space_bar_swipe_up__label" comment="Preference title">السحب للفوق من خلال مفتاح المسافة</string>
<string name="pref__gestures__space_bar_swipe_up__label" comment="Preference title">السحب للأعلى من خلال مفتاح المسافة</string>
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">السحب لليسار من خلال مفتاح المسافة</string>
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">السحب لليمين من خلال مفتاح المسافة</string>
<string name="pref__gestures__space_bar_long_press__label" comment="Preference title">الضغط المطول على شريط المسافة</string>
@@ -334,13 +335,17 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">عادية</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">طويلة</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">طويلة جداً</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">إعدادات متقدمة</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">إعدادات متقدمة</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">إعدادات المظهر</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">فاتح</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">داكن</string>
<string name="pref__advanced__settings_theme__amoled_dark" comment="Possible value of Settings theme preference in Advanced">أسود قاتم</string>
<string name="pref__advanced__settings_language__label" comment="Label of Settings language preference in Advanced">إعدادات اللغة</string>
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">إظهار أيقونة البرنامج في درج التطبيقات</string>
<string name="pref__advanced__show_app_icon__summary_atleast_q" comment="Summary of Show app icon preference in Advanced for Android 10+">ممكّن دائمًا على اندرويد 10+ فما فوق بسبب قيود النظام</string>
<string name="pref__advanced__force_private_mode__label" comment="Label of Force private mode preference in Advanced">فرض الوضع الخاص</string>
<string name="pref__advanced__force_private_mode__summary" comment="Summary of Force private mode preference in Advanced">سيتم تعطيل أي ميزات تعمل مؤقتًا باستعمال بيانات الإدخال الخاصة بك</string>
<string name="settings__devtools__title" comment="Title of Devtools settings">أدوات المطورين</string>
<string name="pref__devtools__enabled__label" comment="Label of Enable developer tools in Advanced">تفعيل أدوات المطور</string>
<string name="pref__devtools__enabled__summary" comment="Summary of Enable developer tools in Advanced">أدوات مصممة خصيصًا لتصحيح الأخطاء واستكشاف العلل وإصلاحها</string>
<string name="pref__devtools__show_heap_memory_stats__label" comment="Label of Show heap memory stats in Advanced">إظهار إحصائيات كومة الذاكرة</string>
@@ -394,7 +399,21 @@
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">سياسة الخصوصية</string>
<string name="about__view_source_code" comment="Label of View source code button in About">مصدر التعليمات البرمجية</string>
<string name="about__license__title" comment="Title of Open-source licenses dialog">تراخيص البرامج مفتوحة المصدر</string>
<string name="about__version__title" comment="Preference title">الإصدار</string>
<string name="about__version_copied__title" comment="Title of the toast for copying the version string">تم نسخ الإصدار إلى الحافظة</string>
<string name="about__version_copied__error" comment="Title of the error toast for copying the version string (%s will contain the generated crash message title)">لقد حدث خطأ ما: %s</string>
<string name="about__changelog__title" comment="Preference title">سِجل التغييرات</string>
<string name="about__changelog__summary" comment="Preference summary">مالجديد</string>
<string name="about__repository__title" comment="Preference title">المستودع(چيتهب)</string>
<string name="about__repository__summary" comment="Preference summary">الكود المصدري, المناقشات, الاخطاء والمعلومات</string>
<string name="about__privacy_policy__title" comment="Preference title">سياسة الخصوصية</string>
<string name="about__privacy_policy__summary" comment="Preference summary">سياسة الخصوصية لهذا المشروع</string>
<string name="about__project_license__title" comment="Preference title">رخصة المشروع</string>
<string name="about__project_license__summary" comment="Preference summary (%s will insert license name)">هذا التطبيق هو مرخص تحت رخصة %s</string>
<string name="about__project_license__error_license_text_failed" comment="Error text for license text loading failure">خطأ: فشل تحميل نص الترخيص. \n-&gt; السبب: %s</string>
<string name="about__project_license__error_reason_asset_manager_null" comment="Error text if asset manager is null">مدير مرجع الأصول فارغ</string>
<string name="about__third_party_licenses__title" comment="Preference title">تراخيص الأطراف الثالثة</string>
<string name="about__third_party_licenses__summary" comment="Preference summary">تراخيص مكتبات الطرف الثالث المدرجة في هذا التطبيق</string>
<!-- Assets strings -->
<plurals name="assets__file__authors">
<item quantity="zero">المؤلف</item>

View File

@@ -39,6 +39,7 @@
<string name="smartbar__quick_action__private_mode" comment="Content-description for the private mode button in Smartbar">Ако се вижда, означава че е включен поверителния режим. При докосване показва информация за този режим.</string>
<!-- Settings UI strings -->
<string name="settings__title" comment="Title of Settings">Настройки</string>
<string name="settings__preview_keyboard" comment="Hint for try your setup box">Изпробвайте подредбата</string>
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Още настройки</string>
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Помощ и обратна връзка</string>
<string name="settings__help" comment="General label for help buttons in Settings">Помощ</string>
@@ -52,7 +53,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Добре дошли във %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">Клавиатурата FlorisBoard не е активна в системата и не е достъпна като метод за въвеждане. Докоснете тук, за да промените.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">Клавиатурата FlorisBoard не е избрана като метод за въвеждане по подразбиране. Докоснете тук, за да промените.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Благодарим ви, че изпробвате FlorisBoard! Проект все е още във фаза алфа и има липсващи възможности. Ако откриете грешки или искате да направите предложение прегледайте хранилището в GitHub и докладвайте дрфект. Така ще допринесете за подобряване на FlorisBoard за всички потребители!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Благодарим ви, че използвате FlorisBoard! Проект все е още във фаза на ранна бета и има липсващи възможности. Ако откриете грешки или искате да направите предложение прегледайте хранилището в GitHub и докладвайте дрфект. Така ще допринесете за подобряване на FlorisBoard за всички потребители!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Езици и клавиатурни подредби</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Изглежда не сте настроили подвидове. По подразбиране ще се използва English/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Добавяне</string>
@@ -160,6 +161,10 @@
<string name="pref__input_feedback__audio_enabled__summary" comment="Preference summary">Изпълняват се звуци при събития на въвеждане, зависи от системните настройки</string>
<string name="pref__input_feedback__audio_ignore_system_settings__label" comment="Preference title">Пренебрегване на системните настройки за звук</string>
<string name="pref__input_feedback__audio_ignore_system_settings__summary" comment="Preference summary">Използват се настройките по-долу даже и при изключени звуци от системата. Не работи при изключен звук на звънене</string>
<string name="pref__input_feedback__audio_volume__label" comment="Preference title">Сила на звука при събития на въвеждане</string>
<string name="pref__input_feedback__audio_feat_key_press__label" comment="Preference title">Звук при докосване на клавиш</string>
<string name="pref__input_feedback__audio_feat_key_long_press__label" comment="Preference title">Звук при задържане на клавиш</string>
<string name="pref__input_feedback__audio_feat_key_repeated_action__label" comment="Preference title">Звук при продължително задържане на клавиш</string>
<string name="pref__input_feedback__group_haptic__label" comment="Preference group title">Обратна връзка при докосване / вибрация</string>
<string name="pref__input_feedback__haptic_enabled__label" comment="Preference title">Обратна връзка при докосване</string>
<string name="pref__input_feedback__haptic_enabled__summary" comment="Preference summary">Вибриране при събития на въвеждане, зависи от системните настройки</string>
@@ -169,6 +174,8 @@
<string name="pref__input_feedback__haptic_vibration_strength__label" comment="Preference title">Сила на вибрацията</string>
<string name="pref__input_feedback__haptic_feat_key_press__label" comment="Preference title">Вибрация при докосване на клавиш</string>
<string name="pref__input_feedback__haptic_feat_key_long_press__label" comment="Preference title">Вибрация при задържане на клавиш</string>
<string name="pref__input_feedback__haptic_feat_key_repeated_action__label" comment="Preference title">Вибрация при продължително задържане на клавиш</string>
<string name="pref__input_feedback__any_feat_gesture_swipe__summary" comment="Preference summary">не е разработено</string>
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Настройки на клавиатурата</string>
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Клавиши</string>
<string name="pref__keyboard__number_row__label" comment="Preference title">Ред с цифрите</string>
@@ -316,13 +323,16 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Нормално</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Дълго</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Много дълго</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Разширени</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Разширени</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Тема на настройките</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Светла</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Тъмна</string>
<string name="pref__advanced__settings_theme__amoled_dark" comment="Possible value of Settings theme preference in Advanced">Тъмна AMOLED</string>
<string name="pref__advanced__settings_language__label" comment="Label of Settings language preference in Advanced">Език на настройките</string>
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Показване на иконата на приложението в стартовия панел</string>
<string name="pref__advanced__force_private_mode__label" comment="Label of Force private mode preference in Advanced">Принуждаване на поверителен режим</string>
<string name="pref__advanced__force_private_mode__summary" comment="Summary of Force private mode preference in Advanced">Изключват се всички функции, които временно работят с вашите входни данни</string>
<string name="settings__devtools__title" comment="Title of Devtools settings">Инструменти за разработка</string>
<string name="pref__devtools__enabled__label" comment="Label of Enable developer tools in Advanced">Развойни инструменти</string>
<string name="pref__devtools__enabled__summary" comment="Summary of Enable developer tools in Advanced">Използват се за отстраняване на дефекти</string>
<string name="pref__devtools__show_heap_memory_stats__label" comment="Label of Show heap memory stats in Advanced">Статистика за динамичната памет</string>
@@ -372,7 +382,18 @@
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Политика за поверителност</string>
<string name="about__view_source_code" comment="Label of View source code button in About">Изходен код</string>
<string name="about__license__title" comment="Title of Open-source licenses dialog">Лицензи с отворен код</string>
<string name="about__version__title" comment="Preference title">Издание</string>
<string name="about__version_copied__title" comment="Title of the toast for copying the version string">Номера на изданието е копирано в междинната памет</string>
<string name="about__version_copied__error" comment="Title of the error toast for copying the version string (%s will contain the generated crash message title)">Нещо се обърка: %s</string>
<string name="about__changelog__title" comment="Preference title">Дневник на промените</string>
<string name="about__changelog__summary" comment="Preference summary">Какво е новото</string>
<string name="about__repository__title" comment="Preference title">Хранилище (GitHub)</string>
<string name="about__repository__summary" comment="Preference summary">Изходен код, обсъждане, дефекти и помощ</string>
<string name="about__privacy_policy__title" comment="Preference title">Политика за личните данни</string>
<string name="about__privacy_policy__summary" comment="Preference summary">Политиката за личните данни на проекта</string>
<string name="about__project_license__title" comment="Preference title">Лиценз на проекта</string>
<string name="about__project_license__summary" comment="Preference summary (%s will insert license name)">FlorisBoard е лицензиран под %s</string>
<string name="about__project_license__error_license_text_failed" comment="Error text for license text loading failure">Грешка при зареждане на текста на лиценза.\n-&gt; Причина: %s</string>
<!-- Assets strings -->
<plurals name="assets__file__authors">
<item quantity="one">Автор</item>

View File

@@ -140,7 +140,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normalno</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Dugo</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Vrlo dugo</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Napredno</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Napredno</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Tema za podešavanja</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Svijetlo</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Tamno</string>

View File

@@ -52,7 +52,6 @@
<string name="settings__home__title" comment="Title of the Home fragment">Benvingut a %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard no està habilitat en el sistema i per tant no estarà disponible com a mètode d\'entrada en el selector d\'entrada. Feu clic aquí per resoldre aquest problema.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard no està seleccionat com a mètode d\'entrada per defecte. Feu clic aquí per resoldre aquest problema.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Gràcies per provar FlorisBoard! Aquest projecte encara està en alfa i, per tant, manquen les opcions. Si trobeu algun error o voleu fer un suggeriment, comproveu el dipòsit a GitHub i obriu un tiquet. Això ajuda a millorar FlorisBoard. Gràcies!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Idiomes &amp; Disposicions de teclat</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Sembla que no heu configurat cap subtipus. Com a alternativa s\'utilitzarà el subtipus anglès/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Afegir</string>

View File

@@ -52,7 +52,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">بەخێربێی بۆ %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">تەختەکلیلی FlorisBoard هێشتا چالاک نەکراوە لە ڕێکخستنەکانی سیستەمدا، پێویستە چالاکی بکەیت بۆ بەکارهێنان پەنجەبنێ بێرەدا.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">تەختەکلیلی FlorisBoard چالاککراوە لە ڕێکخستنەکانی سیستەمدا بەڵام هەڵنەبژێردراوە بۆ بەکارهێنان وەک تەختەکلیلی سەرەکی، پێویستە دیاریبکەیت بۆ بەکارهێنان پەنجەبنێ بێرەدا بۆ هەڵبژاردن.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">سپاس بۆ بەکارهێنانی تەختەکلیلی FlorisBoard! ئەم تەختەکلیلە هێشتا لە باری کارکردندایەوە وەشانی سەرەتاییە لەوانەیە سەرجەم تایبەتمەندییەکانی بەردەست نەبن، لەکاتی بوونی هەر کێشە و گرفتێکدا یان بۆ ناردنی سەرنج و پێشبینیەکانتان تکایە سەردانی بەشی تایبەتی پرۆژەکە بکە لە GitHub ، ئەمە ئەبێتە هۆی زیاتر بەرەوپێشبردنی تەختەکلیلەکە... سوپاس!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">سوپاس بۆ بەکارهێنانی تەختەکلیلی FlorisBoard! ئەم تەختەکلیلە هێشتا لە باری کارکردندایەوە وەشانی سەرەتاییە لەوانەیە سەرجەم تایبەتمەندییەکانی بەردەست نەبن، لەکاتی بوونی هەر کێشە و گرفتێکدا یان بۆ ناردنی سەرنج و پێشبینیەکانتان تکایە سەردانی بەشی تایبەتی پرۆژەکە بکە لە GitHub ، ئەمە ئەبێتە هۆی زیاتر بەرەوپێشبردنی تەختەکلیلەکە... سوپاس!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">تەختەکلیل و زمانەکان</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">وا دیارە کە هیچ زمانێکی زیادە دانەنراوە بۆ نووسین، لەبەر ئەوەزمانی زمانی ئینگلیزی(قوەرتی) بەبنەڕەتی بەکاردێت بۆ نووسین!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">زیادکردن</string>
@@ -334,7 +334,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">بنەڕەتی</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">درێژ</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">درێژترین</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">ڕێکخستنی زیاتر</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">ڕێکخستنی زیاتر</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">ڕووکاری بەرنامەکە</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">ڕووناک</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">تاریک</string>

View File

@@ -52,7 +52,6 @@
<string name="settings__home__title" comment="Title of the Home fragment">Vítejte ve %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBord není povolena v systému a proto nemůže být použita jako metoda zadávání. Klikněte sem pro vyřešení tohoto problému.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard není vybrán jako výchozí vstupní metoda. Kliknutím sem tento problém vyřešíte.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Díky za vyzkoušení FlorisBoard! Tento projekt je stále v alfa fázi, a proto chybí některé funkce. Pokud najdete nějaké chyby nebo chcete navrhnout, podívejte se na repozitář na Githubu a vytvořte issue. Tím pomáháte zlepšit FlorisBoard. Děkuji!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Jazyky &amp; rozložení klávesnice</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Zdá se, že jste nakonfigurovali žádné podtypy. Jako fallback bude použit podtyp angličtina/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Přidat</string>
@@ -297,7 +296,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normální</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Dlouhý</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Velmi dlouhý</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Pokročilé</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Pokročilé</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Motiv nastavení</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Světlý</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Tmavý</string>

View File

@@ -51,7 +51,6 @@
<string name="settings__home__title" comment="Title of the Home fragment">Velkommen til %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard er ikke slået til i systemet og er derfor ikke tilgængelig som inputsmetode i inputvælgeren. Klik her for at løse problemet.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard er ikke valgt som standard inputmetode. Klik her for at løse problemet.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Tak fordi du prøver FlorisBoard! Projektet er stadig i alpha og mangler derfor funktioner. Hvis du finder fejl eller ønsker at foreslå ændringer, kan du oprette det som et problem på vores Github. Det hjælper FlorisBoard med at blive bedre. Tak!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Sprog &amp; Tastaturlayout</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Det ser ud til, at der ikke er konfigureret nogle undertastaturer. I dette tilfælde faldes der tilbage på Engelsk/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Tilføj</string>
@@ -148,7 +147,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normal</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Lang</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Meget lang</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Avanceret</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Avanceret</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Lys</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Mørk</string>
<string name="settings__spelling__import_dict_s11__title" comment="Title for the import dict sheet (step 1-1)">Vælg sprog</string>

View File

@@ -52,7 +52,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Willkommen bei %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard ist in Ihrem System nicht aktiviert und kann daher nicht als Eingabemethode ausgewählt werden. Hier klicken, um dieses Problem zu lösen.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard ist nicht als Standard-Eingabemethode ausgewählt. Hier klicken, um dieses Problem zu lösen.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Vielen Dank, dass Sie FlorisBoard ausprobieren! Dieses Projekt befindet sich noch im Alpha-Entwicklungsstadium und es fehlen daher einige Funktionen. Wenn Sie Fehler finden oder Vorschläge zur Verbesserung haben, besuchen Sie unser Repository auf GitHub und erstellen Sie eine Fehlermeldung. Mit Ihrer Hilfe kann FlorisBoard noch besser werden. Vielen Dank!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Vielen Dank, dass Sie FlorisBoard nutzen! Dieses Projekt befindet sich noch im frühen Beta-Entwicklungsstadium und es fehlen daher einige Features. Wenn Sie Fehler finden oder Vorschläge zur Verbesserung haben, besuchen Sie unser Repository auf GitHub und erstellen sie eine Fehlermeldung. Mit Ihrer Hilfe kann FlorisBoard noch besser werden. Vielen Dank!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Sprachen &amp; Tastatur-Layout</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Es scheinen keine benutzerdefinierten Eingabestile konfiguriert zu sein. Als Ausweichlösung wird daher der Eingabestil English/QWERTY benutzt!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Hinzufügen</string>
@@ -322,7 +322,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normal</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Lang</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Sehr lang</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Erweitert</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Erweitert</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">App-Design</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Hell</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Dunkel</string>

View File

@@ -39,6 +39,7 @@
<string name="smartbar__quick_action__private_mode" comment="Content-description for the private mode button in Smartbar">Εάν είναι ορατό, υποδεικνύει ότι η ιδιωτική λειτουργία είναι ενεργή. Όταν πατηθεί, εμφανίζει πληροφορίες σχετικά με την ιδιωτική λειτουργία.</string>
<!-- Settings UI strings -->
<string name="settings__title" comment="Title of Settings">Ρυθμίσεις</string>
<string name="settings__preview_keyboard" comment="Hint for try your setup box">Δοκιμάστε τις ρυθμίσεις σας</string>
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Περισσότερες επιλογές</string>
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Βοήθεια &amp; σχόλια</string>
<string name="settings__help" comment="General label for help buttons in Settings">Βοήθεια</string>
@@ -52,7 +53,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Καλώς ήλθατε στο %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">Το FlorisBoard δεν είναι ενεργοποιημένο στο σύστημα και συνεπώς δε θα είναι διαθέσιμο ως μέθοδος εισαγωγής στον επιλογέα εισαγωγής. Πατήστε εδώ για να επιλύσετε αυτό το πρόβλημα.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">Το FlorisBoard δεν έχει επιλεχθεί ως η προεπιλεγμένη μέθοδος εισαγωγής. Πατήστε εδώ για να επιλύσετε αυτό το πρόβλημα.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Ευχαριστώ που δοκιμάζετε το FlorisBoard! Αυτό το πρότζεκτ βρίσκεται ακόμα σε alpha στάδιο και ως εκ τούτου ελλείπει χαρακτηριστικών. Εάν βρείτε προβλήματα ή θέλετε να κάνετε κάποια πρόταση, παρακαλώ ρίξτε μία ματιά στο αποθετήριο στο GitHub και υποβάλλετε ένα θέμα. Αυτό βοηθάει να γίνει το FlorisBoard καλύτερο. Ευχαριστώ!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Ευχαριστώ που δοκιμάζετε το FlorisBoard! Αυτό το πρότζεκτ βρίσκεται ακόμα σε πρώιμο beta στάδιο και ως εκ τούτου ελλείπει χαρακτηριστικών. Εάν εντοπίσετε προβλήματα ή θέλετε να κάνετε κάποια πρόταση, παρακαλώ ρίξτε μία ματιά στο αποθετήριο στο GitHub και υποβάλλετε ένα θέμα. Αυτό βοηθάει να γίνει το FlorisBoard καλύτερο. Ευχαριστώ!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Γλώσσες &amp; Διαρρυθμίσεις πληκτρολογίου</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Φαίνεται πως δεν έχετε ορίσει κανέναν υποτύπο. Ως εναλλακτική ο υποτύπος English/QWERTY θα χρησιμοποιηθεί!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Προσθήκη</string>
@@ -171,8 +172,12 @@
<string name="pref__input_feedback__haptic_enabled__summary" comment="Preference summary">Δόνηση για ενέργειες εισαγωγής, εξαρτώμενη από τις ρυθμίσεις συστήματος</string>
<string name="pref__input_feedback__haptic_ignore_system_settings__label" comment="Preference title">Αγνόηση ρυθμίσεων απτικής ανάδρασης συστήματος</string>
<string name="pref__input_feedback__haptic_ignore_system_settings__summary" comment="Preference summary">Χρήση των παρακάτω προτιμήσεων, ακόμα κι αν η απτική ανάδραση είναι απενεργοποιημένη στο σύστημα</string>
<string name="pref__input_feedback__haptic_use_vibrator__label" comment="Preference title">Εκκίνηση δόνησης άμεσα</string>
<string name="pref__input_feedback__haptic_use_vibrator__summary" comment="Preference summary">Εκκίνηση δόνησης άμεσα αντί για χρήση του συνόλου χαρακτηριστικών απτικής ανάδρασης του Android</string>
<string name="pref__input_feedback__haptic_vibration_duration__label" comment="Preference title">Διάρκεια δόνησης</string>
<string name="pref__input_feedback__haptic_vibration_strength__label" comment="Preference title">Ένταση δόνησης</string>
<string name="pref__input_feedback__haptic_vibration_strength__summary_no_amplitude_ctrl" comment="Preference summary">Αυτό το χαρακτηριστικό απαιτεί υποστήριξη ελέγχου εύρους στο υλισμικό, η οποία απουσιάζει από τη συσκευή σας</string>
<string name="pref__input_feedback__haptic_vibration_strength__summary_unsupported_android_version" comment="Preference summary">Αυτό το χαρακτηριστικό απαιτεί υποστήριξη ελέγχου εύρους, η οποία είναι διαθέσιμη μόνο στο Android 8.0 ή νεότερο</string>
<string name="pref__input_feedback__haptic_feat_key_press__label" comment="Preference title">Δόμηση πατήματος πλήκτρου</string>
<string name="pref__input_feedback__haptic_feat_key_long_press__label" comment="Preference title">Δόνηση παρατεταμένου πατήματος πλήκτρου</string>
<string name="pref__input_feedback__haptic_feat_key_repeated_action__label" comment="Preference title">Δόνηση επαναλαμβανόμενης ενέργειας πλήκτρου</string>
@@ -301,7 +306,7 @@
<string name="pref__gestures__swipe_action__move_cursor_end_of_line" comment="Preference value for swipe action">Μετακίνηση κέρσορα στο τέλος της γραμμής</string>
<string name="pref__gestures__swipe_action__move_cursor_start_of_page" comment="Preference value for swipe action">Μετακίνηση κέρσορα στην αρχή της σελίδας</string>
<string name="pref__gestures__swipe_action__move_cursor_end_of_page" comment="Preference value for swipe action">Μετακίνηση κέρσορα στο τέλος της σελίδας</string>
<string name="pref__gestures__swipe_action__switch_to_clipboard_context" comment="Preference value for swipe action">Άνοιγμα διαχειριστή προχείρου/ιστορικού</string>
<string name="pref__gestures__swipe_action__switch_to_clipboard_context" comment="Preference value for swipe action">Άνοιγμα διαχειριστή/ιστορικού προχείρου</string>
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Εναλλαγή κεφαλαίων</string>
<string name="pref__gestures__swipe_action__redo" comment="Preference value for swipe action">Επανάληψη</string>
<string name="pref__gestures__swipe_action__undo" comment="Preference value for swipe action">Αναίρεση</string>
@@ -319,8 +324,8 @@
<string name="pref__gestures__space_bar_long_press__label" comment="Preference title">Παρατεταμένο πάτημα πλήκτρου διαστήματος</string>
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Σάρωση αριστερά στο πλήκτρο διαγραφής</string>
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Όριο ταχύτητας σάρωσης</string>
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Πολύ αργό</string>
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Αργό</string>
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Πολύ αργά</string>
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Αργά</string>
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Κανονικό</string>
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Γρήγορα</string>
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Πολύ γρήγορα</string>
@@ -330,13 +335,17 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Κανονικό</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Μεγάλο</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Πολύ μεγάλο</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Προηγμένες επιλογές</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Προηγμένες επιλογές</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Θέμα ρυθμίσεων</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Φωτεινό</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Σκούρο</string>
<string name="pref__advanced__settings_theme__amoled_dark" comment="Possible value of Settings theme preference in Advanced">AMOLED Σκούρο</string>
<string name="pref__advanced__settings_language__label" comment="Label of Settings language preference in Advanced">Γλώσσα ρυθμίσεων</string>
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Εμφάνιση του εικονιδίου της εφαρμογής στον εκκινητή</string>
<string name="pref__advanced__show_app_icon__summary_atleast_q" comment="Summary of Show app icon preference in Advanced for Android 10+">Πάντα ενεργοποιημένο σε Android 10+ λόγω περιορισμών του συστήματος</string>
<string name="pref__advanced__force_private_mode__label" comment="Label of Force private mode preference in Advanced">Εξαναγκασμός ιδιωτικής λειτουργίας</string>
<string name="pref__advanced__force_private_mode__summary" comment="Summary of Force private mode preference in Advanced">Θα απενεργοποιήσει χαρακτηριστικά που χρησιμοποιούν προσωρινά τα δεδομένα που εισάγετε</string>
<string name="settings__devtools__title" comment="Title of Devtools settings">Εργαλεία για προγραμματιστές</string>
<string name="pref__devtools__enabled__label" comment="Label of Enable developer tools in Advanced">Ενεργοποίηση εργαλείων προγραμματιστή</string>
<string name="pref__devtools__enabled__summary" comment="Summary of Enable developer tools in Advanced">Εργαλεία σχεδιασμένα συγκεκριμένα για αποσφαλμάτωση και επίλυση προβλημάτων</string>
<string name="pref__devtools__show_heap_memory_stats__label" comment="Label of Show heap memory stats in Advanced">Εμφάνιση στατιστικών μνήμης σωρού</string>
@@ -386,7 +395,20 @@
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Πολιτική απορρήτου</string>
<string name="about__view_source_code" comment="Label of View source code button in About">Πηγαίος κώδικας</string>
<string name="about__license__title" comment="Title of Open-source licenses dialog">Άδειες λογισμικού ανοικτού κώδικα</string>
<string name="about__version__title" comment="Preference title">Έκδοση</string>
<string name="about__version_copied__title" comment="Title of the toast for copying the version string">Η έκδοση αντιγράφηκε στο πρόχειρο</string>
<string name="about__version_copied__error" comment="Title of the error toast for copying the version string (%s will contain the generated crash message title)">Κάτι πήγε στραβά: %s</string>
<string name="about__changelog__title" comment="Preference title">Κατάλογος αλλαγών</string>
<string name="about__changelog__summary" comment="Preference summary">Τι νέο υπάρχει</string>
<string name="about__repository__title" comment="Preference title">Αποθετήριο (GitHub)</string>
<string name="about__repository__summary" comment="Preference summary">Πηγαίος κώδικας, συζητήσεις, θέματα και πληροφορίες</string>
<string name="about__privacy_policy__title" comment="Preference title">Πολιτική απορρήτου</string>
<string name="about__privacy_policy__summary" comment="Preference summary">Η πολιτική απορρήτου αυτού του πρότζεκτ</string>
<string name="about__project_license__title" comment="Preference title">Άδεια πρότζεκτ</string>
<string name="about__project_license__summary" comment="Preference summary (%s will insert license name)">Το FlorisBoard είναι αδειοδοτημένο υπό την άδεια %s</string>
<string name="about__project_license__error_license_text_failed" comment="Error text for license text loading failure">Σφάλμα: Αποτυχία φόρτωσης κειμένου άδειας.\n-&gt; Λόγος: %s</string>
<string name="about__third_party_licenses__title" comment="Preference title">Άδειες χρήσης τρίτων</string>
<string name="about__third_party_licenses__summary" comment="Preference summary">Άδειες χρήσης βιβλιοθηκών τρίτων που έχουν συμπεριληφθεί σε αυτήν την εφαρμογή</string>
<!-- Assets strings -->
<plurals name="assets__file__authors">
<item quantity="one">Συντάκτης</item>
@@ -476,6 +498,6 @@
<string name="pref__unit_items">" στοιχεία"</string>
<!-- glide strings -->
<string name="pref__glide_trail_fade_duration">Διάρκεια εξασθένησης διαδρομής ολίσθησης</string>
<string name="pref__glide_preview_refresh_delay">Προεπισκόπηση καθυστέρησης ανανέωσης</string>
<string name="pref__glide_preview_refresh_delay">Καθυστέρηση ανανέωσης προεπισκόπησης</string>
<string name="pref__glide__show_preview">Εμφάνιση προεπισκόπησης κατά την πληκτρολόγηση με ολίσθηση</string>
</resources>

View File

@@ -120,7 +120,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Norma</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Longa</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Tre longa</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Progresinta</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Progresinta</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Agordoj etosa</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Hela</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Malhela</string>

View File

@@ -39,6 +39,7 @@
<string name="smartbar__quick_action__private_mode" comment="Content-description for the private mode button in Smartbar">Si está visible, indica que el modo privado está activo. Cuando se hace clic, muestra información sobre el modo privado.</string>
<!-- Settings UI strings -->
<string name="settings__title" comment="Title of Settings">Ajustes</string>
<string name="settings__preview_keyboard" comment="Hint for try your setup box">Pruebe su configuración</string>
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Más opciones</string>
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Ayuda &amp; comentarios</string>
<string name="settings__help" comment="General label for help buttons in Settings">Ayuda</string>
@@ -52,7 +53,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Bienvenido/a a %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard no está habilitado en el sistema y por lo tanto no estará disponible como método de entrada en el selector de entrada. Haga clic aquí para resolver este problema.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard no está seleccionado como método de entrada por defecto. Haga clic aquí para resolver este problema.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">¡Gracias por probar FlorisBoard! Este proyecto está todavía en fase alfa y por lo tanto le faltan características. Si encuentras algún error o quieres hacer alguna sugerencia, por favor, visita el repositorio en GitHub e informa sobre la incidencia. Esto ayuda a mejorar FlorisBoard. ¡Gracias!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">¡Gracias por usar Florisboard! Este proyecto todavía se encuentra en una temprana fase beta por lo cual aún carece de ciertas características. Si encuentra errores o quiere hacer una sugerencia, por favor dele un vistazo al repositorio en GitHub e informe sobre las incidencias. Esto ayuda a mejorar Florisboard. ¡Gracias!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Idiomas y distribuciones de teclado</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Parece que no has configurado ningún subtipo. ¡Como alternativa se usará el subtipo Inglés/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Añadir</string>
@@ -334,13 +335,17 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normal</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Larga</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Muy larga</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Avanzado</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Avanzado</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Ajustes del tema</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Claro</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Oscuro</string>
<string name="pref__advanced__settings_theme__amoled_dark" comment="Possible value of Settings theme preference in Advanced">AMOLED Oscuro</string>
<string name="pref__advanced__settings_language__label" comment="Label of Settings language preference in Advanced">Idioma de ajustes</string>
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Mostrar icono de la aplicación en el launcher</string>
<string name="pref__advanced__show_app_icon__summary_atleast_q" comment="Summary of Show app icon preference in Advanced for Android 10+">Habilitado siempre en Android 10+ debido a restricciones del sistema</string>
<string name="pref__advanced__force_private_mode__label" comment="Label of Force private mode preference in Advanced">Forzar modo privado</string>
<string name="pref__advanced__force_private_mode__summary" comment="Summary of Force private mode preference in Advanced">Desactivará cualquier característica que tenga que trabajar temporalmente con sus datos de entrada</string>
<string name="settings__devtools__title" comment="Title of Devtools settings">Herramientas de desarrollador</string>
<string name="pref__devtools__enabled__label" comment="Label of Enable developer tools in Advanced">Habilitar herramienta de desarrollador</string>
<string name="pref__devtools__enabled__summary" comment="Summary of Enable developer tools in Advanced">Herramientas diseñadas específicamente para depurar y detectar problemas</string>
<string name="pref__devtools__show_heap_memory_stats__label" comment="Label of Show heap memory stats in Advanced">Mostrar estadísticas de memoria</string>
@@ -390,7 +395,21 @@
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Política de privacidad</string>
<string name="about__view_source_code" comment="Label of View source code button in About">Código fuente</string>
<string name="about__license__title" comment="Title of Open-source licenses dialog">Licencias de código abierto</string>
<string name="about__version__title" comment="Preference title">Versión</string>
<string name="about__version_copied__title" comment="Title of the toast for copying the version string">Versión copiada al portapapeles</string>
<string name="about__version_copied__error" comment="Title of the error toast for copying the version string (%s will contain the generated crash message title)">Algo salió mal: %s</string>
<string name="about__changelog__title" comment="Preference title">Registro de cambios</string>
<string name="about__changelog__summary" comment="Preference summary">Qué hay de nuevo</string>
<string name="about__repository__title" comment="Preference title">Repositorio (GitHub)</string>
<string name="about__repository__summary" comment="Preference summary">Código fuente, discusiones, problemas e informaciones</string>
<string name="about__privacy_policy__title" comment="Preference title">Política de privacidad</string>
<string name="about__privacy_policy__summary" comment="Preference summary">La política de privacidad para este proyecto</string>
<string name="about__project_license__title" comment="Preference title">Licencia del proyecto</string>
<string name="about__project_license__summary" comment="Preference summary (%s will insert license name)">FlorisBoard está licenciado bajo %s</string>
<string name="about__project_license__error_license_text_failed" comment="Error text for license text loading failure">Error: Fallo al cargar texto de licencia.\n-&gt; Razón: %s</string>
<string name="about__project_license__error_reason_asset_manager_null" comment="Error text if asset manager is null">La referencia del gestor de activos es nula</string>
<string name="about__third_party_licenses__title" comment="Preference title">Licencias de terceros</string>
<string name="about__third_party_licenses__summary" comment="Preference summary">Licencias de las librerías de terceros incluidas en esta aplicación</string>
<!-- Assets strings -->
<plurals name="assets__file__authors">
<item quantity="one">Autor</item>

View File

@@ -52,7 +52,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">خوش آمدید به %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">فلوریس بورد در سیستم به عنوان روش ورودی فعلا نیست و به این علت به عنوان روش ورودی قابل انتخاب نیست. برای حل این مشکل اینجا کلیک کنید.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">فلوریس بود به عنوان روش ورودی پیش فرض انتخاب نشده. برای حل این مشکل اینجا کلیک کنید.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">با تشکر از شما برای امتحان فلوریس بورد! به علت قرار داشت در مراحل آلفا بود برای همین فاقد یک سری از ویژگی های اصلی است. اگر مشکلی پیدا کردید یا می خواهید پیشنهادی ارائه دهید ، لطفاً برنامه را در GitHub مشاهده و برای مشکل issue طراحی کنید. این کار به بهتر کردن فلوریس بورد کمک می کند. با تشکر!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">با تشکر از شما برای استفاده از فلوریس بورد! به علت قرار داشت در مراحل دسترسی زودهنگام بتا بود برای همین فاقد یک سری از ویژگی های اصلی است. اگر مشکلی پیدا کردید یا می خواهید پیشنهادی ارائه دهید ، لطفاً برنامه را در GitHub مشاهده و برای مشکل issue طراحی کنید. این کار به بهتر کردن فلوریس بورد کمک می کند. با تشکر!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">زبان ها &amp; چیدمان های صفحه کلید</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">به نظر میرسد که هیچگونه زیرگروه دیگری را انتخاب نکرده اید. به همین علت زیرگروه English/QWERTY استفاده خواهد شد!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">افزودن</string>
@@ -310,13 +310,17 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">متوسط</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">طولانی</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">بسیار طولانی</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">پیشرفته</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">پیشرفته</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">تنظیمات زمینه</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">روشن</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">تاریک</string>
<string name="pref__advanced__settings_theme__amoled_dark" comment="Possible value of Settings theme preference in Advanced">تاریک AMOLED</string>
<string name="pref__advanced__settings_language__label" comment="Label of Settings language preference in Advanced">زبان تنظیمات</string>
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">قرار دادن آیکون برنامه در لانچر</string>
<string name="pref__advanced__show_app_icon__summary_atleast_q" comment="Summary of Show app icon preference in Advanced for Android 10+">همیشه فعال شده بخاطر محدودیت های سیستم عامل های اندروید 10 به بالا</string>
<string name="pref__advanced__force_private_mode__label" comment="Label of Force private mode preference in Advanced">حالت خصوصی اجباری</string>
<string name="pref__advanced__force_private_mode__summary" comment="Summary of Force private mode preference in Advanced">هر ویژگی که که باید با ورودی شما کار کنند را موقتا غیرفعال می کند</string>
<string name="settings__devtools__title" comment="Title of Devtools settings">ابزار های توسعه دهنده</string>
<string name="pref__devtools__enabled__label" comment="Label of Enable developer tools in Advanced">فعال‌سازی ابزار های توسعه دهنده</string>
<string name="pref__devtools__enabled__summary" comment="Summary of Enable developer tools in Advanced">ابزار هایی که مخصوصا برای اشکال‌یابی و اشکال‌زدایی استفاده می‌شود</string>
<string name="pref__devtools__show_heap_memory_stats__label" comment="Label of Show heap memory stats in Advanced">نمایش وضعیت حافظه هیپ</string>
@@ -339,7 +343,20 @@
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">سیاست حفظ حریم خصوصی</string>
<string name="about__view_source_code" comment="Label of View source code button in About">کد منبع</string>
<string name="about__license__title" comment="Title of Open-source licenses dialog">مجوزهای متن باز</string>
<string name="about__version__title" comment="Preference title">نسخه</string>
<string name="about__version_copied__title" comment="Title of the toast for copying the version string">نسخه در کلیپ‌بورد کپی شد</string>
<string name="about__version_copied__error" comment="Title of the error toast for copying the version string (%s will contain the generated crash message title)">اوه! مشکلی پیش آمد: %s</string>
<string name="about__changelog__title" comment="Preference title">لیست تغییرات</string>
<string name="about__changelog__summary" comment="Preference summary">تغییرات جدید</string>
<string name="about__repository__title" comment="Preference title">رپو (گیت هاب)</string>
<string name="about__repository__summary" comment="Preference summary">کد منبع، مباحثه ها، مشکلات و اطلاعات</string>
<string name="about__privacy_policy__title" comment="Preference title">سیاست حریم خصوصی</string>
<string name="about__privacy_policy__summary" comment="Preference summary">سیاست حریم خصوصی برای این پروژه</string>
<string name="about__project_license__title" comment="Preference title">گواهی های پروژه</string>
<string name="about__project_license__summary" comment="Preference summary (%s will insert license name)">فلوریس بورد زیر نظر %s دارای گواهی می باشد</string>
<string name="about__project_license__error_license_text_failed" comment="Error text for license text loading failure">خطا: ناتوانی در بارگذاری متن گواهی.\n-&gt; دلیل: %s</string>
<string name="about__third_party_licenses__title" comment="Preference title">گواهی های شخص ثالث</string>
<string name="about__third_party_licenses__summary" comment="Preference summary">گواهی های استفاده از کتابخانه های شخص ثالث استفاده شده در این برنامه</string>
<!-- Assets strings -->
<plurals name="assets__file__authors">
<item quantity="one">سازنده</item>

View File

@@ -52,7 +52,6 @@
<string name="settings__home__title" comment="Title of the Home fragment">Tervetuloa %siin</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoardia ei ole otettu järjestelmäasetuksissa käyttöön eikä sen vuoksi ole valittavissa syöttötavaksi. Klikkaa tästä ratkaistaksesi ongelman.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoardia ei ole valittu oletussyöttötavaksi. Klikkaa tästä ratkaistaksesi ongelman.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Kiitos kun koitat FlorisBoardia! Projekti on yhä alpha-vaiheessa ja sen vuoksi sovelluksesta puuttuu ominaisuuksia. Jos kohtaat bugeja tai haluat ehdottaa parannuksia, suuntaa GitHub-tietovarastoon ja lähetä viesti. Tämä auttaa FlorisBoardin kehittämisessä. Kiitos!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Kielet &amp; näppäimistöasettelut</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Näyttää siltä, ettet ole määritellyt yhtään asetteluita. Sen vuoksi käytetään toistaiseksi Englanti/QWERTY-asettelua!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Lisää</string>
@@ -243,7 +242,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normaali</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Pitkä</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Erittäin pitkä</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Lisäasetukset</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Lisäasetukset</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Asetusten teema</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Vaalea</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Tumma</string>

View File

@@ -39,6 +39,7 @@
<string name="smartbar__quick_action__private_mode" comment="Content-description for the private mode button in Smartbar">Si visible, indique que le mode privé est actif. Lorsqu\'on clique dessus, affiche des informations à propos du mode privé.</string>
<!-- Settings UI strings -->
<string name="settings__title" comment="Title of Settings">Paramètres</string>
<string name="settings__preview_keyboard" comment="Hint for try your setup box">Essayez votre nouvelle configuration</string>
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Plus d\'options</string>
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Aide &amp; commentaires</string>
<string name="settings__help" comment="General label for help buttons in Settings">Aide</string>
@@ -52,7 +53,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Bienvenue dans %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard n\'est pas activé dans le système et ne sera donc pas disponible comme méthode de saisie dans le sélectionneur de saisie. Cliquez ici pour résoudre ce problème.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard n\'est pas sélectionné comme méthode de saisie par défaut. Cliquez ici pour résoudre ce problème.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Merci d\'essayer FlorisBoard ! Ce projet est encore en version alpha et manque donc certaines fonctionnalités. Si vous trouvez des bugs ou si vous voulez faire une suggestion, allez sur le répertoire GitHub et créez un ticket. Cela permet d\'améliorer FlorisBoard. Merci pour votre aide !</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Merci d\'utiliser FlorisBoard ! Ce projet est encore en version bêta et il manque donc des fonctionnalités. Si vous trouvez des bogues ou si vous voulez faire une suggestion, consultez le dépôt sur GitHub et posez un problème. Cela contribuera à améliorer FlorisBoard. Nous vous remercions !</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Langues &amp; Dispositions du clavier</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Il semble que vous n\'ayez pas configuré de disposition de clavier. Comme solution de repli, la disposition anglais/QWERTY sera utilisée !</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Ajouter</string>
@@ -165,19 +166,28 @@
<string name="pref__input_feedback__audio_feat_key_long_press__label" comment="Preference title">Sons d\'appui long</string>
<string name="pref__input_feedback__audio_feat_key_repeated_action__label" comment="Preference title">Sons de touche répétée</string>
<string name="pref__input_feedback__audio_feat_gesture_swipe__label" comment="Preference title">Sons de glissement de doigt</string>
<string name="pref__input_feedback__audio_feat_gesture_moving_swipe__label" comment="Preference title">Sons de balayage mobile par gestes</string>
<string name="pref__input_feedback__group_haptic__label" comment="Preference group title">Retour haptique / Vibration</string>
<string name="pref__input_feedback__haptic_enabled__label" comment="Preference title">Activer le retour haptique</string>
<string name="pref__input_feedback__haptic_enabled__summary" comment="Preference summary">Vibrer pour les événements d\'entrée, en fonction des paramètres du système</string>
<string name="pref__input_feedback__haptic_ignore_system_settings__label" comment="Preference title">Ignorer les réglages haptiques système</string>
<string name="pref__input_feedback__haptic_ignore_system_settings__summary" comment="Preference summary">Utilisez les préférences ci-dessous, même si l\'haptique est désactivé dans le système</string>
<string name="pref__input_feedback__haptic_use_vibrator__label" comment="Preference title">Déclenchement direct des vibrations</string>
<string name="pref__input_feedback__haptic_use_vibrator__summary" comment="Preference summary">Déclenchez directement les vibrations au lieu d\'utiliser les fonctions de retour haptique d\'Android.</string>
<string name="pref__input_feedback__haptic_vibration_duration__label" comment="Preference title">Durée des vibrations</string>
<string name="pref__input_feedback__haptic_vibration_strength__label" comment="Preference title">Intensité de la vibration</string>
<string name="pref__input_feedback__haptic_vibration_strength__summary_no_amplitude_ctrl" comment="Preference summary">Cette fonction nécessite la prise en charge du contrôle d\'amplitude du matériel, qui n\'est pas disponible sur votre appareil.</string>
<string name="pref__input_feedback__haptic_vibration_strength__summary_unsupported_android_version" comment="Preference summary">Cette fonction nécessite la prise en charge du contrôle d\'amplitude, qui n\'est disponible que sur Android 8.0 ou plus récent.</string>
<string name="pref__input_feedback__haptic_feat_key_press__label" comment="Preference title">Vibration des touches</string>
<string name="pref__input_feedback__haptic_feat_key_long_press__label" comment="Preference title">Vibration lors d\'un appuie long</string>
<string name="pref__input_feedback__haptic_feat_key_repeated_action__label" comment="Preference title">Vibration de la touche d\'action répétée</string>
<string name="pref__input_feedback__haptic_feat_gesture_swipe__label" comment="Preference title">Vibration des gestes de balayage</string>
<string name="pref__input_feedback__haptic_feat_gesture_moving_swipe__label" comment="Preference title">Vibration des gestes de balayage</string>
<string name="pref__input_feedback__any_feat_key_press__summary" comment="Preference summary">ex. touches, boutons, onglets emoji</string>
<string name="pref__input_feedback__any_feat_key_long_press__summary" comment="Preference summary">ex. menu contextuel</string>
<string name="pref__input_feedback__any_feat_key_repeated_action__summary" comment="Preference summary">ex. touche effacer</string>
<string name="pref__input_feedback__any_feat_gesture_swipe__summary" comment="Preference summary">non implementé</string>
<string name="pref__input_feedback__any_feat_gesture_moving_swipe__summary" comment="Preference summary">Par exemple, le contrôle du curseur par balayage</string>
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Préférences de clavier</string>
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Touches</string>
<string name="pref__keyboard__number_row__label" comment="Preference title">Rangée de chiffres</string>
@@ -325,10 +335,11 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normale</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Longue</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Très longue</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Avancé</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Avancé</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Thème des paramètres</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Clair</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Sombre</string>
<string name="pref__advanced__settings_theme__amoled_dark" comment="Possible value of Settings theme preference in Advanced">AMOLED sombre</string>
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Afficher l\'icône de l\'application dans le lanceur</string>
<string name="pref__advanced__force_private_mode__label" comment="Label of Force private mode preference in Advanced">Forcer le mode privé</string>
<string name="pref__advanced__force_private_mode__summary" comment="Summary of Force private mode preference in Advanced">Désactivera toutes les fonctions qui doivent fonctionner temporairement avec vos données de saisie</string>

View File

@@ -52,7 +52,6 @@
<string name="settings__home__title" comment="Title of the Home fragment">A %s üdvözli</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard nincs engedélyezve a rendszerben, így nem lesz elérhető, beviteli módszerként a bevitelválasztóban. A probléma megoldásához kattintson ide.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">A FlorisBoard nincs kiválasztva alapértelmezett beviteli módszerként. A probléma megoldásához kattintson ide.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Köszönjük, hogy kipróbálta FlorisBoard-ot! Ez a projekt még mindig alfa állapotban van, ezért vannak hiányzó funkciók. Ha bármilyen hibát talál, vagy javaslatot szeretne tenni, nézze meg a GitHub tárolóját, és küldjön egy hibajelentést. Ez segít abban, hogy a FlorisBoard jobb legyen. Köszönöm!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Nyelvek és billentyűzetkiosztások</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Úgy tűnik, hogy nem állított be altípusokat. Tartalékként az angol/QWERTY lesz használva!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Hozzáadás</string>
@@ -282,7 +281,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normál</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Hosszú</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Nagyon hosszú</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Haladó</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Haladó</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Beállítások témája</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Világos</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Sötét</string>

View File

@@ -53,7 +53,7 @@
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard tidak diaktifkan di sistem dan tidak akan tersedia sebagai metode input di pilihan input.
Klik di sini untuk menyelesaikan masalah ini.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard tidak dipilih sebagai metode input default. Klik di sini untuk menyelesaikan masalah ini.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Terima kasih telah mencoba FlorisBoard! Proyek ini masih dalam versi alpha dan karena itu banyak fitur belum ada. Jika Anda menemukan sebuah bug atau ingin memberikan saran, harap periksa repositori di GitHub dan membuat sebuah masalah (issue). Ini membantu membuat FlorisBoard lebih baik. Terima kasih!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Terima kasih karena telah menggunakan FlorisBoard! Proyek ini masih dalam beta-awal dan karena itu masih memiliki fitur yang kurang. Jika Anda menemukan bug atau ingin membuat saran, harap periksa repo di GitHub dan buat sebuah masalah (issue). Ini membantu membuat FlorisBoard menjadi lebih baik. Terima kasih!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Bahasa &amp; Tata letak papan ketik</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Sepertinya Anda belum mengkonfigurasi subtipe apapun. Sebagai penggantinya subtipe Inggris/QWERTY akan digunakan!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Tambahkan</string>
@@ -155,6 +155,9 @@ Klik di sini untuk menyelesaikan masalah ini.</string>
<string name="settings__theme__attr_semiTransparentColor" comment="Theme attribute label">Warna semi transparan</string>
<string name="settings__theme__attr_textColor" comment="Theme attribute label">Warna teks</string>
<string name="settings__theme__attr_custom" comment="Theme attribute label (%s is custom attribute name)">Atribut kustom (%s)</string>
<string name="pref__input_feedback__haptic_vibration_duration__label" comment="Preference title">Durasi getaran</string>
<string name="pref__input_feedback__haptic_vibration_strength__label" comment="Preference title">Kekuatan getaran</string>
<string name="pref__input_feedback__any_feat_gesture_swipe__summary" comment="Preference summary">tidak diimplementasikan</string>
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Preferensi Papan Ketik</string>
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Tombol</string>
<string name="pref__keyboard__number_row__label" comment="Preference title">Baris angka</string>
@@ -302,7 +305,7 @@ Klik di sini untuk menyelesaikan masalah ini.</string>
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normal</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Panjang</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Sangat panjang</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Tingkat lanjut</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Tingkat lanjut</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Tema pengaturan</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Cerah</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Gelap</string>

View File

@@ -52,7 +52,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Benvenuto in %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard non è abilitato nel sistema e quindi non sarà disponibile come metodo di immissione. Clicca quì per risolvere il problema.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard non è la tastiera predefinita. Clicca quì per risolvere questo problema.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Grazie per aver provato FlorisBoard! Questo progetto è ancora in fase alfa e quindi manca di alcune funzionalità. Se trovate qualche bug o volete dare un suggerimento, date un\'occhiata alla repo su GitHub e segnalate un problema. Questo aiuta a rendere FlorisBoard migliore. Grazie!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Grazie per aver usato FlorisBoard! Questo progetto è ancora in alpha e quindi mancano delle funzionalità. Se trovi qualche bug o vuoi dare un suggerimento, controlla il repo su GitHub e segnala un problema. Questo aiuta a rendere FlorisBoard migliore. Grazie!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Lingue &amp; Layout della tastiera</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Sembra che tu non abbia configurato nessuno stile di input personalizzato. Come ripiego verrà utilizzato lo stile input English/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Aggiungi</string>
@@ -165,6 +165,28 @@
<string name="pref__input_feedback__audio_feat_key_long_press__label" comment="Preference title">Suoni pressione prolungata tasti</string>
<string name="pref__input_feedback__audio_feat_key_repeated_action__label" comment="Preference title">Suoni azioni ripetute sui tasti</string>
<string name="pref__input_feedback__audio_feat_gesture_swipe__label" comment="Preference title">Suoni gesti di scorrimento</string>
<string name="pref__input_feedback__audio_feat_gesture_moving_swipe__label" comment="Preference title">Suoni di swipe in movimento a gesti</string>
<string name="pref__input_feedback__group_haptic__label" comment="Preference group title">Feedback aptico / vibrazione</string>
<string name="pref__input_feedback__haptic_enabled__label" comment="Preference title">Abilita il feedback aptico</string>
<string name="pref__input_feedback__haptic_enabled__summary" comment="Preference summary">Vibrare per eventi di ingresso, a seconda delle impostazioni del sistema</string>
<string name="pref__input_feedback__haptic_ignore_system_settings__label" comment="Preference title">Ignorare le impostazioni aptiche del sistema</string>
<string name="pref__input_feedback__haptic_ignore_system_settings__summary" comment="Preference summary">Usare le seguenti preferenze, anche se haptic è disabilitato nel sistema</string>
<string name="pref__input_feedback__haptic_use_vibrator__label" comment="Preference title">Attiva direttamente la vibrazione</string>
<string name="pref__input_feedback__haptic_use_vibrator__summary" comment="Preference summary">Attiva direttamente la vibrazione invece di usare il set di funzioni di feedback aptico di Android</string>
<string name="pref__input_feedback__haptic_vibration_duration__label" comment="Preference title">Durata della vibrazione</string>
<string name="pref__input_feedback__haptic_vibration_strength__label" comment="Preference title">Resistenza alle vibrazioni</string>
<string name="pref__input_feedback__haptic_vibration_strength__summary_no_amplitude_ctrl" comment="Preference summary">Questa funzione richiede il supporto del controllo dell\'ampiezza dell\'hardware, che manca sul tuo dispositivo</string>
<string name="pref__input_feedback__haptic_vibration_strength__summary_unsupported_android_version" comment="Preference summary">Questa funzione richiede il supporto del controllo dell\'ampiezza, che è disponibile solo su Android 8.0 o più recente</string>
<string name="pref__input_feedback__haptic_feat_key_press__label" comment="Preference title">Vibrazione dei tasti</string>
<string name="pref__input_feedback__haptic_feat_key_long_press__label" comment="Preference title">Vibrazione dei tasti premuti a lungo</string>
<string name="pref__input_feedback__haptic_feat_key_repeated_action__label" comment="Preference title">Vibrazione dell\'azione ripetuta del tasto</string>
<string name="pref__input_feedback__haptic_feat_gesture_swipe__label" comment="Preference title">Vibrazione del gesto swipe</string>
<string name="pref__input_feedback__haptic_feat_gesture_moving_swipe__label" comment="Preference title">Vibrazione dello swipe in movimento del gesto</string>
<string name="pref__input_feedback__any_feat_key_press__summary" comment="Preference summary">Per esempio tasti, pulsanti, schede emoji</string>
<string name="pref__input_feedback__any_feat_key_long_press__summary" comment="Preference summary">Es. Menu ha comparsa</string>
<string name="pref__input_feedback__any_feat_key_repeated_action__summary" comment="Preference summary">Ad esempio il tasto di cancellazione</string>
<string name="pref__input_feedback__any_feat_gesture_swipe__summary" comment="Preference summary">Non attuato</string>
<string name="pref__input_feedback__any_feat_gesture_moving_swipe__summary" comment="Preference summary">Per esempio, il controllo del cursore che striscia</string>
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Tastiera preferenze</string>
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Tasti</string>
<string name="pref__keyboard__number_row__label" comment="Preference title">Barra numerica</string>
@@ -312,7 +334,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normale</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Lunga</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Molto lunga</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Avanzate</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Avanzate</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Impostazioni tema</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Chiaro</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Scuro</string>
@@ -332,6 +354,7 @@
<string name="settings__spelling__dictionary_index_invalid" comment="String for the Dictionary index invalid error card. %s will be replaced by the app name.">Si è manifestato un errore durante l\'indicizzazione dei dizionari per il controllo ortografico installati. Prova a riavviare %s o presenta un bug report.</string>
<string name="settings__spelling__dict_sources_info" comment="String for the Dictionary sources info.">Dove ottengo i dizionari per il controllo ortografico?</string>
<string name="settings__spelling__fab_extension_archive" comment="FAB option Extension archive.">Estensione / Archivio</string>
<string name="settings__spelling__fab_affix_dictionary" comment="FAB option Affix dictionary.">Affisso + file dizionario</string>
<string name="pref__spelling__active_spellchecker__label" comment="Label of Active spellchecker pref">Controllo ortografico attivo</string>
<string name="pref__spelling__active_spellchecker__summary_none" comment="Summary of Active spellchecker pref">Non impostato</string>
<string name="pref__spelling__active_spellchecker__summary_check_in_system" comment="Summary of Active spellchecker pref">Controlla nelle impostazioni di sistema</string>

View File

@@ -51,7 +51,6 @@
<string name="settings__home__title" comment="Title of the Home fragment">ברוכים הבאים ל%s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard אינו מופעל במערכת ולכן לא יהיה זמין כשיטת קלט בעת בחירת סוג המלקדת. לחץ כאן כדי לפתור תקלה זו.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard אינו הוגדר כמקלדת ברירת המחדל. לחץ כאן כדי לפתור תקלה זו.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">תודה שניסיתם את FlorisBoard! פרויקט זה עדיין נמצא בגרסאת אלפא ולכן חסרות בו תכולות. אם מצאתם באגים או ברצונכם להציע הצעה, אנא בדקו את ה- repo ב- GitHub והגישו דיווח. זה עוזר לשפר את FlorisBoard. תודה!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">שפות &amp; ותצורת מקלדת</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">נראה שלא הגדרת שום תת-סוג. לכן יהיה שימוש בתת-סוג אנגלית/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">הוסף</string>
@@ -263,7 +262,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">רגיל</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">ארוך</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">ארוך מאוד</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">מתקדם</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">מתקדם</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">הגדרות ערכת נושא</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">בהיר</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">כהה</string>

View File

@@ -261,7 +261,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normal</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Dirêj</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Gelekî dirêj</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Pêşveçû</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Pêşveçû</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Mijara mîhengan</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Ronî</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Tarî</string>

View File

@@ -52,7 +52,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Laipni lūgts %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard nav iespējots sistēmas iestatījumos, tādēļ tā nebūs pieejama kā ievades avots atlasītājā. Klikšķināt šeit, lai atrisinātu to.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard nav atlasīts kā noklusējuma ievades veids. Klikšķināt šeit, lai to novērstu.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Paldies par FlorisBoard izmēģināšanu! Lietotne joprojām ir izstrādē, tādēļ var trūkt atsevišķas iespējas. Ja tiek atrastas nepilnības vai ir kāds ierosinājums, lūgums apskatīt GitHub glabātavu un iesniegt tur pieteikumu. Tas palīdzēs padarīt FlorisBoard labāku. Paldies!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Paldies par FlorisBoard izmantošanu! Lietotne joprojām ir izstrādē, tādēļ var trūkt atsevišķas iespēju. Ja tiek atrastas nepilnības vai ir kāds ierosinājums, lūgums apskatīt GitHub glabātavu un iesniegt tur pieteikumu. Tas palīdzēs padarīt FlorisBoard labāku. Paldies!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Valodas un tastatūras izkārtojumi</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Izskatās, ka nav iestatīts neviens apakšveids. Tādēļ tiks izmantots Angļu/QWERTY apakšveids!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Pievienot</string>
@@ -334,7 +334,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Vispārpieņemts</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Garš</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Ļoti garš</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Papildus</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Papildus</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Iestatījumu izskats</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Gaišs</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Tumšs</string>

View File

@@ -52,7 +52,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Welkom bij %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard is niet ingeschakeld in het systeem en zal dus niet beschikbaar zijn als een invoermethode in de invoermethode-kiezer. Klik hier om dit probleem op te lossen.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard is niet geselecteerd als de standaard invoermethode. Klik hier om dit probleem op te lossen.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Bedankt voor het uitproberen van FlorisBoard! Dit project is nog in alfa. Daarom kunnen er functies ontbreken. Als u bugs vindt of een suggestie wilt doen, controleer dan de repo op GitHub en open een issue. Dit helpt om FlorisBoard beter te maken. Bedankt!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Vielen Dank für die Nutzung von FlorisBoard! Dieses Projekt ist noch in der Early-Beta-Phase und daher fehlen noch Funktionen. Wenn Sie einen Fehler finden oder einen Vorschlag machen möchten, schauen Sie sich bitte das Repo auf GitHub an und melden Sie einen Fehler. Dies hilft, FlorisBoard besser zu machen. Herzlichen Dank dafür!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Talen &amp; Indelingen</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Het lijkt erop dat je geen indelingen hebt geconfigureerd. Als terugval wordt de indeling Engels / QWERTY gebruikt!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Toevoegen</string>
@@ -310,7 +310,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normaal</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Lang</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Heel lang</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Geavanceerd</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Geavanceerd</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Thema-instellingen</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Licht</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Donker</string>

View File

@@ -52,7 +52,6 @@
<string name="settings__home__title" comment="Title of the Home fragment">Witaj w %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">FlorisBoard nie jest włączony w systemie i dlatego nie będzie dostępny jako metoda wprowadzania danych w oknie wyboru. Kliknij tutaj, aby rozwiązać ten problem.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">FlorisBoard nie jest wybrany jako domyślna metoda wprowadzania danych. Kliknij tutaj, aby rozwiązać ten problem.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Dziękujemy za wypróbowanie FlorisBoard! Ten projekt jest wciąż w fazie alfa i dlatego brakuje w nim pewnych funkcji. Jeśli znajdziesz jakieś błędy lub chcesz coś zaproponować, sprawdź repozytorium na GitHubie i zgłoś problem. To pomoże ulepszyć FlorisBoard. Dziękujemy!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Języki i układy klawiatury</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Wygląda na to, że nie skonfigurowałeś żadnego układu. Jako alternatywa zostanie użyty układ Angielski/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Dodaj</string>
@@ -239,7 +238,7 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normalnie</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Długo</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Bardzo długo</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Zaawansowane</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Zaawansowane</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Motyw ustawień</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Jasny</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Ciemny</string>

View File

@@ -39,6 +39,7 @@
<string name="smartbar__quick_action__private_mode" comment="Content-description for the private mode button in Smartbar">Se visível, indica que o modo privado está ativo. Quando clicado, mostra informações sobre o modo privado.</string>
<!-- Settings UI strings -->
<string name="settings__title" comment="Title of Settings">Configurações</string>
<string name="settings__preview_keyboard" comment="Hint for try your setup box">Experimente sua configuração</string>
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Mais opções</string>
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Ajuda e feedback</string>
<string name="settings__help" comment="General label for help buttons in Settings">Ajuda</string>
@@ -52,7 +53,7 @@
<string name="settings__home__title" comment="Title of the Home fragment">Bem-vindo ao %s</string>
<string name="settings__home__ime_not_enabled" comment="Error message shown in Home fragment when FlorisBoard is not enabled in the system">O FlorisBoard não está ativado no sistema e, portanto, não estará disponível para ser selecionado no alternador de teclado. Clique aqui para resolver este problema.</string>
<string name="settings__home__ime_not_selected" comment="Warning message shown in Home fragment when FlorisBoard is not selected as the default keyboard">O FlorisBoard não foi selecionado como o teclado padrão. Clique aqui para resolver este problema.</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Obrigado por experimentar o FlorisBoard! Este projeto ainda está em alpha e, portanto, faltando recursos. Se você encontrar algum bug ou quiser fazer uma sugestão, por favor, confira o repo no GitHub e crie um issue. Isso ajuda a tornar o FlorisBoard melhor. Obrigado!</string>
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Obrigado por usar o FlorisBoard! Este projeto ainda está em uma versão beta inicial e, portanto, faltam recursos. Se você encontrar algum bug ou quiser fazer uma sugestão, verifique o repositório no GitHub e crie um issue. Isso ajuda a tornar o FlorisBoard melhor. Obrigado!</string>
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Idiomas e Formatos de Teclado</string>
<string name="settings__localization__subtype_no_subtypes_configured_warning" comment="Warning message that no subtype has been defined in the Typing fragment">Parece que você não configurou nenhum formato de digitação. Como alternativa, será utilizado o formato Inglês/QWERTY!</string>
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Adicionar</string>
@@ -334,13 +335,17 @@
<string name="pref__gestures__swipe_distance_threshold__normal" comment="Preference value for swipe distance threshold">Normal</string>
<string name="pref__gestures__swipe_distance_threshold__long" comment="Preference value for swipe distance threshold">Longa</string>
<string name="pref__gestures__swipe_distance_threshold__very_long" comment="Preference value for swipe distance threshold">Muito longa</string>
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Avançado</string>
<string name="settings__advanced__title" comment="Title of Advanced settings">Avançado</string>
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Configurações de tema</string>
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Claro</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Escuro</string>
<string name="pref__advanced__settings_theme__amoled_dark" comment="Possible value of Settings theme preference in Advanced">Escuro (AMOLED)</string>
<string name="pref__advanced__settings_language__label" comment="Label of Settings language preference in Advanced">Idioma das configurações</string>
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Mostrar ícone do aplicativo no launcher</string>
<string name="pref__advanced__show_app_icon__summary_atleast_q" comment="Summary of Show app icon preference in Advanced for Android 10+">Sempre ativado no Android 10+ devido a restrições do sistema</string>
<string name="pref__advanced__force_private_mode__label" comment="Label of Force private mode preference in Advanced">Forçar o modo privado</string>
<string name="pref__advanced__force_private_mode__summary" comment="Summary of Force private mode preference in Advanced">Isso desativará quaisquer recursos que tenham que trabalhar temporariamente com seus dados de digitação</string>
<string name="settings__devtools__title" comment="Title of Devtools settings">Ferramentas de desenvolvedor</string>
<string name="pref__devtools__enabled__label" comment="Label of Enable developer tools in Advanced">Ativar ferramentas de desenvolvedor</string>
<string name="pref__devtools__enabled__summary" comment="Summary of Enable developer tools in Advanced">Ferramentas especificamente projetadas para depuração e solução de problemas</string>
<string name="pref__devtools__show_heap_memory_stats__label" comment="Label of Show heap memory stats in Advanced">Mostrar estatísticas de memória heap</string>
@@ -390,7 +395,21 @@
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Política de privacidade</string>
<string name="about__view_source_code" comment="Label of View source code button in About">Código-fonte</string>
<string name="about__license__title" comment="Title of Open-source licenses dialog">Licenças de código aberto</string>
<string name="about__version__title" comment="Preference title">Versão</string>
<string name="about__version_copied__title" comment="Title of the toast for copying the version string">Versão copiada para a área de transferência</string>
<string name="about__version_copied__error" comment="Title of the error toast for copying the version string (%s will contain the generated crash message title)">Algo deu errado: %s</string>
<string name="about__changelog__title" comment="Preference title">Registro de alterações</string>
<string name="about__changelog__summary" comment="Preference summary">O que há de novo</string>
<string name="about__repository__title" comment="Preference title">Repositório (GitHub)</string>
<string name="about__repository__summary" comment="Preference summary">Código-fonte, discussões, problemas e informações</string>
<string name="about__privacy_policy__title" comment="Preference title">Política de privacidade</string>
<string name="about__privacy_policy__summary" comment="Preference summary">A política de privacidade para este projeto</string>
<string name="about__project_license__title" comment="Preference title">Licença do projeto</string>
<string name="about__project_license__summary" comment="Preference summary (%s will insert license name)">O FlorisBoard está licenciado sob %s</string>
<string name="about__project_license__error_license_text_failed" comment="Error text for license text loading failure">Erro: falha ao carregar o texto da licença.\n-&gt; Razão: %s</string>
<string name="about__project_license__error_reason_asset_manager_null" comment="Error text if asset manager is null">A referência do gerenciador de asset é nula</string>
<string name="about__third_party_licenses__title" comment="Preference title">Licenças de terceiros</string>
<string name="about__third_party_licenses__summary" comment="Preference summary">Licenças das bibliotecas de terceiros incluídas neste aplicativo</string>
<!-- Assets strings -->
<plurals name="assets__file__authors">
<item quantity="one">Autor</item>

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