Compare commits
33 Commits
v0.3.13-be
...
v0.3.14-be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a71c89d5d3 | ||
|
|
408716f4c4 | ||
|
|
005040df66 | ||
|
|
527b3b293e | ||
|
|
dec39e8bd9 | ||
|
|
eaa630b219 | ||
|
|
4217594dd4 | ||
|
|
96d01a28fb | ||
|
|
ec9f4a6654 | ||
|
|
1990916851 | ||
|
|
9ab49ff1c9 | ||
|
|
b4f08c38b3 | ||
|
|
5a375ec30f | ||
|
|
efded915c3 | ||
|
|
4bf335f4af | ||
|
|
643920c094 | ||
|
|
172eb54909 | ||
|
|
3d3d8f74c4 | ||
|
|
cf77038336 | ||
|
|
619e06be1b | ||
|
|
36dde9f7e0 | ||
|
|
58d0954fe4 | ||
|
|
17d28c9d9d | ||
|
|
46fb33b2a0 | ||
|
|
e36aa80cc0 | ||
|
|
3ce323596c | ||
|
|
abe67c2a6f | ||
|
|
5c1768a924 | ||
|
|
92086954de | ||
|
|
2b47d4a811 | ||
|
|
e977c512a7 | ||
|
|
0828c0a4db | ||
|
|
ecee7bfa56 |
5
.github/ISSUE_TEMPLATE/config.yml
vendored
5
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -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
|
||||
|
||||
15
.github/ISSUE_TEMPLATE/question.md
vendored
15
.github/ISSUE_TEMPLATE/question.md
vendored
@@ -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.
|
||||
-->
|
||||
@@ -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
149
README.md
@@ -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 [](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 [](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 . Thank
|
||||
information see the [contributing guidelines](CONTRIBUTING.md). Thank
|
||||
you for your help!
|
||||
|
||||
## List of permissions FlorisBoard requests
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -79,6 +79,9 @@
|
||||
{ "$": "auto_text_key", "code": 251, "label": "û" }
|
||||
]
|
||||
},
|
||||
"n": {
|
||||
"main": { "$": "auto_text_key", "code": 241, "label": "ñ" }
|
||||
},
|
||||
"~right": {
|
||||
"main": { "code": 44, "label": "," },
|
||||
"relevant": [
|
||||
|
||||
201
app/src/main/assets/ime/text/characters/thai_kedmanee.json
Normal file
201
app/src/main/assets/ime/text/characters/thai_kedmanee.json
Normal 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": "ฦ" }
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
151
app/src/main/assets/ime/text/characters/thai_manoonchai.json
Normal file
151
app/src/main/assets/ime/text/characters/thai_manoonchai.json
Normal 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": "?" }
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
75
app/src/main/assets/ime/text/numeric/row/thai.json
Normal file
75
app/src/main/assets/ime/text/numeric/row/thai.json
Normal 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": "ⁿ" }
|
||||
]
|
||||
} }
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -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": "‽" }
|
||||
]
|
||||
} }
|
||||
]
|
||||
]
|
||||
}
|
||||
201
app/src/main/assets/license/project_license.txt
Normal file
201
app/src/main/assets/license/project_license.txt
Normal 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.
|
||||
Submodule app/src/main/icu4c updated: 5536ec3bcd...c434a473c5
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
),
|
||||
)
|
||||
}
|
||||
@@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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) },
|
||||
)
|
||||
}
|
||||
@@ -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),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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()),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
)
|
||||
@@ -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,
|
||||
)
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
*/
|
||||
)
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)*/
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
@@ -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 {
|
||||
@@ -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 {
|
||||
@@ -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
|
||||
|
||||
@@ -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?) {
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>,
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
5
app/src/main/res/drawable/ic_build.xml
Normal file
5
app/src/main/res/drawable/ic_build.xml
Normal 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>
|
||||
5
app/src/main/res/drawable/ic_code.xml
Normal file
5
app/src/main/res/drawable/ic_code.xml
Normal 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>
|
||||
5
app/src/main/res/drawable/ic_description.xml
Normal file
5
app/src/main/res/drawable/ic_description.xml
Normal 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>
|
||||
5
app/src/main/res/drawable/ic_history.xml
Normal file
5
app/src/main/res/drawable/ic_history.xml
Normal 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>
|
||||
5
app/src/main/res/drawable/ic_info.xml
Normal file
5
app/src/main/res/drawable/ic_info.xml
Normal 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>
|
||||
5
app/src/main/res/drawable/ic_policy.xml
Normal file
5
app/src/main/res/drawable/ic_policy.xml
Normal 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>
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
@@ -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-> السبب: %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>
|
||||
|
||||
@@ -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-> Причина: %s</string>
|
||||
<!-- Assets strings -->
|
||||
<plurals name="assets__file__authors">
|
||||
<item quantity="one">Автор</item>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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! Αυτό το πρότζεκτ βρίσκεται ακόμα σε 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">Γλώσσες & Διαρρυθμίσεις πληκτρολογίου</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-> Λόγος: %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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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-> 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>
|
||||
|
||||
@@ -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">زبان ها & چیدمان های صفحه کلید</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-> دلیل: %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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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 & 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 & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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">שפות & ותצורת מקלדת</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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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-> 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
Reference in New Issue
Block a user