Compare commits
95 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe6930fb76 | ||
|
|
6a10f0a01a | ||
|
|
30717eeb90 | ||
|
|
a664ab18c9 | ||
|
|
f50983d7ab | ||
|
|
be858802c5 | ||
|
|
1ba690e53a | ||
|
|
e16f81d350 | ||
|
|
0de2039d72 | ||
|
|
50b6a63468 | ||
|
|
8cb644b418 | ||
|
|
f138124670 | ||
|
|
0f76d7f9df | ||
|
|
27b9ec4628 | ||
|
|
ac733ed1dc | ||
|
|
6d15708f95 | ||
|
|
4377f3e41c | ||
|
|
1e690018d7 | ||
|
|
93bb5d2714 | ||
|
|
ad2b08a342 | ||
|
|
9e6508cee4 | ||
|
|
f735c138fb | ||
|
|
d663947fec | ||
|
|
c800617e26 | ||
|
|
f47c7abaf3 | ||
|
|
faf06ee234 | ||
|
|
07c41f9c27 | ||
|
|
80a0d9edab | ||
|
|
cd943a9d4a | ||
|
|
c3d3107b12 | ||
|
|
b91fac8e76 | ||
|
|
e2c784f4cf | ||
|
|
f83bdd8a28 | ||
|
|
dc10a459ca | ||
|
|
4bea68f151 | ||
|
|
daa8ce71ac | ||
|
|
f06f475e89 | ||
|
|
b784d0805c | ||
|
|
c245c6a37c | ||
|
|
264a287171 | ||
|
|
82d82466c6 | ||
|
|
0242d24cd1 | ||
|
|
76e683bfec | ||
|
|
ee1988d98e | ||
|
|
fe5f0d18ac | ||
|
|
41527e4f23 | ||
|
|
66fb1c5873 | ||
|
|
05103214dd | ||
|
|
bf9e2e4438 | ||
|
|
4209bdcfbe | ||
|
|
31db482bb4 | ||
|
|
e33499dab5 | ||
|
|
92b99ff34e | ||
|
|
f991c6479b | ||
|
|
5a45b1600a | ||
|
|
79f884b2a0 | ||
|
|
22330ad67b | ||
|
|
7f50a5aa77 | ||
|
|
de389918be | ||
|
|
4a57829105 | ||
|
|
bc6ca8c7fc | ||
|
|
0ffe0c915e | ||
|
|
392699f333 | ||
|
|
cf801c02fd | ||
|
|
665356f77b | ||
|
|
48c356a569 | ||
|
|
60eb92e92a | ||
|
|
602ffc2a93 | ||
|
|
dbacc0e466 | ||
|
|
1307f401cc | ||
|
|
ca6006767b | ||
|
|
2202db53ba | ||
|
|
321f19272e | ||
|
|
06a8a04020 | ||
|
|
2a1f7c3217 | ||
|
|
76952d55fe | ||
|
|
1f560f8b6b | ||
|
|
33bdc52354 | ||
|
|
97b795aed0 | ||
|
|
bb44362701 | ||
|
|
bab20c5baa | ||
|
|
a3000fe111 | ||
|
|
d4d2f52683 | ||
|
|
10ef340559 | ||
|
|
5b77262186 | ||
|
|
8ce56b1bf9 | ||
|
|
94667e8363 | ||
|
|
970b5eb82a | ||
|
|
a2ceed4521 | ||
|
|
6d7825e129 | ||
|
|
10c1a82995 | ||
|
|
267a39e870 | ||
|
|
f6fcbbcc34 | ||
|
|
f98b3cec4b | ||
|
|
e5a942be9f |
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -27,8 +27,8 @@ assignees: ''
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
<!--
|
||||
<!-- (remove this line if you paste a log)
|
||||
```
|
||||
If applicable, paste the captured debug log here.
|
||||
```
|
||||
-->
|
||||
(remove this line if you paste a log) -->
|
||||
|
||||
32
.github/workflows/android.yml
vendored
Normal file
32
.github/workflows/android.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
name: FlorisBoard CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
pull_request:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: set up JDK 1.8
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 1.8
|
||||
- uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
~/.gradle/wrapper
|
||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-gradle-
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew clean assemble
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: app-debug.apk
|
||||
path: app/build/outputs/apk/debug/app-debug.apk
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
First off, thanks for considering contributing to FlorisBoard!
|
||||
|
||||
There are several ways to contribute to FlorisBoard. This document provides some
|
||||
general guidelines for each type of contribution.
|
||||
There are several ways to contribute to FlorisBoard. This document
|
||||
provides some general guidelines for each type of contribution.
|
||||
|
||||
## Giving general feedback
|
||||
|
||||
@@ -11,60 +11,33 @@ Either use the review function within Google Play or email me at
|
||||
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev). I
|
||||
love to hear from you!
|
||||
|
||||
## Translations
|
||||
|
||||
To make FlorisBoard accessible in as many languages as possible, the
|
||||
platform [Crowdin](https://crowdin.florisboard.patrickgold.dev) is used
|
||||
to crowdsource and manage translations. This is the only source of
|
||||
translations from now on - **PRs that add/update translations are no
|
||||
longer accepted.** The list of languages in Crowdin covers the top 20
|
||||
languages, but feel free to email me at
|
||||
[florisboard@patrickgold.dev](mailto:florisboard@patrickgold.dev) to
|
||||
request a language and I'll add it.
|
||||
|
||||
## Adding a new feature or making large changes
|
||||
|
||||
If you intend to add a new feature or to make large changes, please discuss this
|
||||
first through a proposal on GitHub. Discussing your idea enables both you and the
|
||||
dev team that we are on the same page before you start on working on your change.
|
||||
If you have any questions, feel free to ask for help at any time!
|
||||
If you intend to add a new feature or to make large changes, please
|
||||
discuss this first through a proposal on GitHub. Discussing your idea
|
||||
enables both you and the dev team that we are on the same page before
|
||||
you start on working on your change. If you have any questions, feel
|
||||
free to ask for help at any time!
|
||||
|
||||
## Adding a new keyboard layout / dictionary for locale
|
||||
|
||||
As FlorisBoard is currently in alpha stage, things might change drastically. This
|
||||
also includes the config scheme of keyboard layouts. To prevent incompatible
|
||||
configs because some features and structures may change, please do not add this
|
||||
kind of content yet. As FlorisBoard's state progresses and its core stabilizes,
|
||||
you will be able to add keyboard layouts.
|
||||
|
||||
## Translating FlorisBoard
|
||||
|
||||
Before starting to translate, when adding a new translation please file
|
||||
an issue stating that you want to translate FlorisBoard into a language.
|
||||
Once this gets approved you can start translating. When updating an
|
||||
already existing translation file you can just send a PR directly.
|
||||
|
||||
If you are not familiar with PRs, check out this guide:
|
||||
[https://www.gun.io/blog/how-to-github-fork-branch-and-pull-request](https://www.gun.io/blog/how-to-github-fork-branch-and-pull-request)
|
||||
|
||||
Notes for tips below:
|
||||
- Replace `<language>` with the language you want to add
|
||||
- Replace `<code>` with the ISO 639-1 code of the language you want to
|
||||
add
|
||||
([List of codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes))
|
||||
|
||||
### Tips when adding a new translation
|
||||
|
||||
- To add the new translation file, navigate to `app/src/main/res/values`
|
||||
and copy the file `strings.xml` into the folder
|
||||
`app/src/main/res/values-<code>` (you have to create this folder)
|
||||
- Translate only the phrases inside the brackets, leave the name
|
||||
attribute as it is
|
||||
E.g.: `<string name="hello_string">Hello World!</string>`
|
||||
`<string name="hello_string">Ciao mondo!</string>`
|
||||
- When finished translating, commit your changes locally, as the commit
|
||||
message use `Add <language> translation`
|
||||
- Push your change(s) and create the PR. When everything checks out, it
|
||||
will get accepted.
|
||||
|
||||
### Tips when updating a translation
|
||||
|
||||
- To update a translation, check the `strings.xml` in
|
||||
`app/src/main/res/values` for newly added strings and add them to the
|
||||
translation file in `app/src/main/res/values-<code>`
|
||||
- When finished translating, commit your changes locally, as the commit
|
||||
message use `Update <language> translation`
|
||||
- Push your change(s) and create the PR. When everything checks out, it
|
||||
will get accepted.
|
||||
As FlorisBoard is currently in alpha stage, things might change
|
||||
drastically. This also includes the config scheme of keyboard layouts.
|
||||
To prevent incompatible configs because some features and structures may
|
||||
change, please do not add this kind of content yet. As FlorisBoard's
|
||||
state progresses and its core stabilizes, you will be able to add
|
||||
keyboard layouts.
|
||||
|
||||
## Bug reporting
|
||||
|
||||
@@ -75,6 +48,11 @@ use the premade [issue template](.github/ISSUE_TEMPLATE/bug_report.md)
|
||||
for bug reporting. This makes it easy for us to understand what the bug
|
||||
is and how to solve it.
|
||||
|
||||
### Capturing ADB debug logs
|
||||
### Capturing error logs
|
||||
|
||||
[[ TODO: create tutorial ]]
|
||||
Logs are captured by FlorisBoard's crash handler, which gives you the
|
||||
ability to copy it to the clipboard and paste it in GitHub. This is the
|
||||
preferred way to capture logs.
|
||||
|
||||
Alternatively, you can also use ADB (Android Debug Bridge) to capture
|
||||
the error log. This is recommended for experienced users only.
|
||||
|
||||
118
README.md
118
README.md
@@ -1,8 +1,13 @@
|
||||
# FlorisBoard
|
||||
<img align="left" width="80" height="80"
|
||||
src="fastlane/metadata/android/en-US/images/icon.png" alt="App icon">
|
||||
|
||||
An open-source keyboard for Android. Currently in alpha stage.
|
||||
# FlorisBoard [](https://github.com/florisboard/florisboard/releases) [](https://crowdin.florisboard.patrickgold.dev) 
|
||||
|
||||
#### Public Alpha Test Programme
|
||||
**FlorisBoard** is a free and open-source keyboard for Android 6.0+
|
||||
devices. It aims at being modern, user-friendly and customizable while
|
||||
fully respecting your privacy. Currently in alpha/early-beta state.
|
||||
|
||||
## Public Alpha Test Programme
|
||||
Wanna try it out on your device? Use one of the following options:
|
||||
|
||||
_A. IzzySoft's repo for F-Droid_:
|
||||
@@ -28,23 +33,25 @@ tester, follow these steps:
|
||||
|
||||
_C. Use the APK provided in the release section of this repo_
|
||||
|
||||
##### Giving feedback
|
||||
### Giving feedback
|
||||
If you want to give feedback to FlorisBoard, there are several ways to
|
||||
do so, as listed in the [contribution guidelines](CONTRIBUTING.md).
|
||||
do so, as listed [here](CONTRIBUTING.md#giving-general-feedback).
|
||||
|
||||
Thank you for contributing to FlorisBoard!
|
||||
|
||||
##### Note on F-Droid release
|
||||
### Note on F-Droid release
|
||||
FlorisBoard is currently available through Google Play and IzzySoft's
|
||||
repo for F-Droid, but is currently in the inclusion process for the main
|
||||
F-Droid repo. Planned proper F-Droid release is version 0.3.0.
|
||||
repo for F-Droid, but is in the inclusion process for the main F-Droid
|
||||
repo.
|
||||
|
||||
---
|
||||
|
||||
<img src="https://patrickgold.dev/media/previews/florisboard.png"
|
||||
height="256" alt="Preview Image">
|
||||
<img align="right" height="256"
|
||||
src="https://patrickgold.dev/media/previews/florisboard-preview-day.png"
|
||||
alt="Preview image">
|
||||
|
||||
## Feature roadmap
|
||||
## 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)
|
||||
@@ -55,21 +62,19 @@ height="256" alt="Preview Image">
|
||||
* [x] Key press sound/vibration
|
||||
* [x] Portrait orientation support
|
||||
* [x] Landscape orientation support (needs tweaks)
|
||||
* [ ] Tablet screen support (0.4.0)
|
||||
|
||||
### Layouts
|
||||
* [x] Latin character layouts (QWERTY, QWERTZ, AZERTY, Swiss, Spanish,
|
||||
Norwegian, Swedish/Finnish, Icelandic, Danish); more coming in
|
||||
future versions
|
||||
* [x] Non-latin character layouts (Persian)
|
||||
Norwegian, Swedish/Finnish, Icelandic, Danish, Hungarian); more
|
||||
coming in future versions
|
||||
* [x] Non-latin character layouts (Arabic, Persian)
|
||||
* [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 (tweaks: 0.3.0)
|
||||
* [x] Emoji layout
|
||||
* [x] Emoticon layout
|
||||
* [ ] Kaomoji layout (0.3.0)
|
||||
|
||||
### Preferences
|
||||
* [x] Setup wizard
|
||||
@@ -77,25 +82,15 @@ height="256" alt="Preview Image">
|
||||
* [x] Customize look and behaviour of keyboard
|
||||
* [x] Theme presets (currently only day/night theme)
|
||||
* [x] Theme customization
|
||||
* [ ] Theme import/export (0.4.0 or 0.5.0)
|
||||
* [x] Subtype selection (language/layout)
|
||||
* [x] Keyboard behaviour preferences
|
||||
* [ ] Text suggestion / Auto correct preferences (0.4.0 or 0.5.0)
|
||||
* [x] Gesture preferences (0.3.0)
|
||||
|
||||
### Composing suggestions (0.4.0 or 0.5.0)
|
||||
* [ ] Auto suggest words from precompiled dictionary
|
||||
* [ ] Auto suggest words from user dictionary
|
||||
* [ ] Auto suggest contacts
|
||||
* [ ] Multilingual typing
|
||||
* [x] Gesture preferences
|
||||
|
||||
### Other useful features
|
||||
* [x] One-handed mode
|
||||
* [x] Clipboard/cursor tools
|
||||
* [x] Integrated number row / symbols in character layouts (0.3.0)
|
||||
* [ ] Floating keyboard (0.4.0)
|
||||
* [x] Gesture support (0.3.0)
|
||||
* [ ] Glide typing (0.4.0)
|
||||
* [x] Integrated number row / symbols in character layouts
|
||||
* [x] Gesture support
|
||||
* [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
|
||||
@@ -104,11 +99,64 @@ height="256" alt="Preview Image">
|
||||
* [ ] (dev only) Generate well-structured documentation of code
|
||||
* [ ] ...
|
||||
|
||||
Note:
|
||||
## Feature roadmap
|
||||
This section describes the features which are planned to be implemented
|
||||
in FlorisBoard for the next major versions, modularized into sections.
|
||||
Please note that the milestone due dates are only raw estimates and will
|
||||
most likely be delayed back, even though I'm eager to stick to these as
|
||||
close as possible.
|
||||
|
||||
(?) = not sure if it will be implemented
|
||||
### [v0.4.0](https://github.com/florisboard/florisboard/milestone/4)
|
||||
- Module A: Smartbar rework (Implemented with #91)
|
||||
- Ability to enable/disable Smartbar (features below thus only work if
|
||||
Smartbar is enabled)
|
||||
- Dynamic switching between clipboard tools and word suggestions
|
||||
- Ability to show both the number row and word suggestions at once
|
||||
- Better icons in quick actions
|
||||
- Complete rework of the Smartbar code base and the Smartbar layout
|
||||
definition in XML
|
||||
|
||||
(0.x.0) = planned version when feature will be implemented.
|
||||
- Module B: Composing suggestions
|
||||
- Auto-suggestion of words based of precompiled dictionaries
|
||||
- Management of custom dictionary entries
|
||||
- Opt-in only: Learning of often typed word pais to better predict next
|
||||
words over time. Data collected here is stored locally and never leaves
|
||||
the user's device.
|
||||
|
||||
- Module C: Extension packs
|
||||
- Ability to load dictionaries (and later potentionally other cool
|
||||
features too) only if needed to keep the core APK size small
|
||||
- Currently unclear how exactly this will work, but this is definitely
|
||||
a must-have feature
|
||||
|
||||
- Module D: Glide typing
|
||||
- Swiping over the characters will automatically convert this to a word
|
||||
- Possibly also add improvements based on the Flow keyboard
|
||||
|
||||
### [v0.5.0](https://github.com/florisboard/florisboard/milestone/5)
|
||||
There's no exact roadmap yet but it is planned that the media part of
|
||||
FlorisBoard (emojis, emoticons, kaomoji) gets a rework. Also as an extension
|
||||
(requires v0.4.0/Module C) GIF support is planned.
|
||||
|
||||
### > v0.5.0
|
||||
This is completely open as of now and will gather planned features as time
|
||||
passes...
|
||||
|
||||
Backlog (currently not assigned to any milestone):
|
||||
|
||||
- Theme import/export
|
||||
- Floating keyboard
|
||||
|
||||
## 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
|
||||
you for your help!
|
||||
|
||||
## List of permissions FlorisBoard requests
|
||||
Please refer to this [page](https://github.com/florisboard/florisboard/wiki/List-of-permissions-FlorisBoard-requests)
|
||||
to get more information on this topic.
|
||||
|
||||
## Used libraries, components and icons
|
||||
* [Google Flexbox Layout for Android](https://github.com/google/flexbox-layout)
|
||||
|
||||
@@ -10,8 +10,8 @@ android {
|
||||
applicationId "dev.patrickgold.florisboard"
|
||||
minSdkVersion 23
|
||||
targetSdkVersion 29
|
||||
versionCode 15
|
||||
versionName "0.2.3"
|
||||
versionCode 21
|
||||
versionName "0.3.2"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
@@ -21,9 +21,14 @@ android {
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
debug {
|
||||
applicationIdSuffix ".debug"
|
||||
resValue "string", "app_name", "FlorisBoard Debug"
|
||||
}
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
resValue "string", "app_name", "FlorisBoard"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,19 +38,20 @@ dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
|
||||
implementation 'androidx.appcompat:appcompat:1.2.0'
|
||||
implementation 'androidx.core:core-ktx:1.3.1'
|
||||
implementation 'androidx.preference:preference:1.1.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.0'
|
||||
implementation 'androidx.core:core-ktx:1.3.2'
|
||||
implementation 'androidx.preference:preference-ktx:1.1.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'androidx.test:core:1.2.0'
|
||||
testImplementation 'androidx.test:core:1.3.0'
|
||||
testImplementation 'org.mockito:mockito-core:1.10.19'
|
||||
testImplementation 'org.mockito:mockito-inline:2.13.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||
implementation 'com.google.android:flexbox:2.0.1'
|
||||
implementation "com.squareup.moshi:moshi-kotlin:1.9.2"
|
||||
implementation 'com.google.android.material:material:1.2.0'
|
||||
implementation 'com.google.android.material:material:1.2.1'
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7"
|
||||
implementation 'com.jaredrummler:colorpicker:1.1.0'
|
||||
implementation 'com.jakewharton.timber:timber:4.7.1'
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
|
||||
<application
|
||||
android:name=".ime.core.FlorisApplication"
|
||||
android:allowBackup="false"
|
||||
android:extractNativeLibs="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
@@ -90,6 +91,13 @@
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:theme="@style/SettingsTheme"/>
|
||||
|
||||
<!-- Crash Dialog Activity -->
|
||||
<activity
|
||||
android:name="dev.patrickgold.florisboard.crashutility.CrashDialogActivity"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/crash_dialog__title"
|
||||
android:theme="@style/CrashDialogTheme"/>
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
||||
@@ -12,176 +12,150 @@
|
||||
"swiss_german": "Swiss German (QWERTZ)",
|
||||
"swiss_french": "Swiss French (QWERTZ)",
|
||||
"swiss_italian": "Swiss Italian (QWERTZ)",
|
||||
"persian": "Persian"
|
||||
"hungarian": "Hungarian (QWERTZ)",
|
||||
"persian": "Persian",
|
||||
"arabic": "Arabic",
|
||||
"esperanto": "Esperanto",
|
||||
"esperanto_with_hx": "Esperanto with 'ĥ'",
|
||||
"colemak": "Colemak",
|
||||
"dvorak": "Dvorak",
|
||||
"canadian_french": "Canadian French (QWERTY)"
|
||||
},
|
||||
"defaultSubtypes": [
|
||||
{
|
||||
"id": 101,
|
||||
"languageTag": "en-US",
|
||||
"preferredLayout": "qwerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwerty"
|
||||
},
|
||||
{
|
||||
"id": 102,
|
||||
"languageTag": "en-UK",
|
||||
"preferredLayout": "qwerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwerty"
|
||||
},
|
||||
{
|
||||
"id": 103,
|
||||
"languageTag": "en-CA",
|
||||
"preferredLayout": "qwerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwerty"
|
||||
},
|
||||
{
|
||||
"id": 104,
|
||||
"languageTag": "en-AU",
|
||||
"preferredLayout": "qwerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwerty"
|
||||
},
|
||||
{
|
||||
"id": 201,
|
||||
"languageTag": "de-DE",
|
||||
"preferredLayout": "qwertz",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwertz"
|
||||
},
|
||||
{
|
||||
"id": 202,
|
||||
"languageTag": "de-AT",
|
||||
"preferredLayout": "qwertz",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwertz"
|
||||
},
|
||||
{
|
||||
"id": 203,
|
||||
"languageTag": "de-CH",
|
||||
"preferredLayout": "swiss_german",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "swiss_german"
|
||||
},
|
||||
{
|
||||
"id": 301,
|
||||
"languageTag": "fr-FR",
|
||||
"preferredLayout": "azerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "azerty"
|
||||
},
|
||||
{
|
||||
"id": 302,
|
||||
"languageTag": "fr-CA",
|
||||
"preferredLayout": "qwerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "canadian_french"
|
||||
},
|
||||
{
|
||||
"id": 303,
|
||||
"languageTag": "fr-CH",
|
||||
"preferredLayout": "swiss_french",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "swiss_french"
|
||||
},
|
||||
{
|
||||
"id": 401,
|
||||
"languageTag": "it-IT",
|
||||
"preferredLayout": "qwerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwerty"
|
||||
},
|
||||
{
|
||||
"id": 402,
|
||||
"languageTag": "it-CH",
|
||||
"preferredLayout": "swiss_italian",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "swiss_italian"
|
||||
},
|
||||
{
|
||||
"id": 501,
|
||||
"languageTag": "es-ES",
|
||||
"preferredLayout": "spanish",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "spanish"
|
||||
},
|
||||
{
|
||||
"id": 502,
|
||||
"languageTag": "es-US",
|
||||
"preferredLayout": "spanish",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "spanish"
|
||||
},
|
||||
{
|
||||
"id": 503,
|
||||
"languageTag": "es-419",
|
||||
"preferredLayout": "spanish",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "spanish"
|
||||
},
|
||||
{
|
||||
"id": 601,
|
||||
"languageTag": "pt-PT",
|
||||
"preferredLayout": "qwerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwerty"
|
||||
},
|
||||
{
|
||||
"id": 602,
|
||||
"languageTag": "pt-BR",
|
||||
"preferredLayout": "qwerty",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "qwerty"
|
||||
},
|
||||
{
|
||||
"id": 701,
|
||||
"languageTag": "nb-NO",
|
||||
"preferredLayout": "norwegian",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "norwegian"
|
||||
},
|
||||
{
|
||||
"id": 702,
|
||||
"languageTag": "nn-NO",
|
||||
"preferredLayout": "norwegian",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "norwegian"
|
||||
},
|
||||
{
|
||||
"id": 711,
|
||||
"languageTag": "sv-SE",
|
||||
"preferredLayout": "swedish_finnish",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "swedish_finnish"
|
||||
},
|
||||
{
|
||||
"id": 721,
|
||||
"languageTag": "fi-FI",
|
||||
"preferredLayout": "swedish_finnish",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "swedish_finnish"
|
||||
},
|
||||
{
|
||||
"id": 731,
|
||||
"languageTag": "da-DK",
|
||||
"preferredLayout": "danish",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "danish"
|
||||
},
|
||||
{
|
||||
"id": 741,
|
||||
"languageTag": "is-IS",
|
||||
"preferredLayout": "icelandic",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "icelandic"
|
||||
},
|
||||
{
|
||||
"id": 800,
|
||||
"id": 801,
|
||||
"languageTag": "fa-FA",
|
||||
"preferredLayout": "persian",
|
||||
"isAsciiCapable": true,
|
||||
"isEmojiCapable": true
|
||||
"preferredLayout": "persian"
|
||||
},
|
||||
{
|
||||
"id": 901,
|
||||
"languageTag": "ar",
|
||||
"preferredLayout": "arabic"
|
||||
},
|
||||
{
|
||||
"id": 1001,
|
||||
"languageTag": "hu",
|
||||
"preferredLayout": "hungarian"
|
||||
},
|
||||
{
|
||||
"id": 1101,
|
||||
"languageTag": "eo",
|
||||
"preferredLayout": "esperanto"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
46
app/src/main/assets/ime/text/characters/arabic.json
Normal file
46
app/src/main/assets/ime/text/characters/arabic.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "characters",
|
||||
"name": "arabic",
|
||||
"direction": "rtl",
|
||||
"modifier": "arabic",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 1590, "label": "ض" },
|
||||
{ "code": 1589, "label": "ص" },
|
||||
{ "code": 1579, "label": "ث" },
|
||||
{ "code": 1602, "label": "ق" },
|
||||
{ "code": 1601, "label": "ف" },
|
||||
{ "code": 1594, "label": "غ" },
|
||||
{ "code": 1593, "label": "ع" },
|
||||
{ "code": 1607, "label": "ه" },
|
||||
{ "code": 1582, "label": "خ" },
|
||||
{ "code": 1581, "label": "ح" },
|
||||
{ "code": 1580, "label": "ج" }
|
||||
],
|
||||
[
|
||||
{ "code": 1588, "label": "ش" },
|
||||
{ "code": 1587, "label": "س" },
|
||||
{ "code": 1610, "label": "ي" },
|
||||
{ "code": 1576, "label": "ب" },
|
||||
{ "code": 1604, "label": "ل" },
|
||||
{ "code": 1575, "label": "ا" },
|
||||
{ "code": 1578, "label": "ت" },
|
||||
{ "code": 1606, "label": "ن" },
|
||||
{ "code": 1605, "label": "م" },
|
||||
{ "code": 1603, "label": "ك" },
|
||||
{ "code": 1591, "label": "ط" }
|
||||
],
|
||||
[
|
||||
{ "code": 1584, "label": "ذ" },
|
||||
{ "code": 1569, "label": "ء" },
|
||||
{ "code": 65157, "label": "ﺅ" },
|
||||
{ "code": 1585, "label": "ر" },
|
||||
{ "code": 1609, "label": "ى" },
|
||||
{ "code": 1577, "label": "ة" },
|
||||
{ "code": 1608, "label": "و" },
|
||||
{ "code": 1586, "label": "ز" },
|
||||
{ "code": 1592, "label": "ظ" },
|
||||
{ "code": 1583, "label": "د" }
|
||||
]
|
||||
]
|
||||
}
|
||||
40
app/src/main/assets/ime/text/characters/canadian_french.json
Normal file
40
app/src/main/assets/ime/text/characters/canadian_french.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"type": "characters",
|
||||
"name": "canadian_french",
|
||||
"direction": "ltr",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 113, "label": "q" },
|
||||
{ "code": 119, "label": "w" },
|
||||
{ "code": 101, "label": "e" },
|
||||
{ "code": 114, "label": "r" },
|
||||
{ "code": 116, "label": "t" },
|
||||
{ "code": 121, "label": "y" },
|
||||
{ "code": 117, "label": "u" },
|
||||
{ "code": 105, "label": "i" },
|
||||
{ "code": 111, "label": "o" },
|
||||
{ "code": 112, "label": "p" },
|
||||
{ "code": 232, "label": "è" }
|
||||
], [
|
||||
{ "code": 97, "label": "a" },
|
||||
{ "code": 115, "label": "s" },
|
||||
{ "code": 100, "label": "d" },
|
||||
{ "code": 102, "label": "f" },
|
||||
{ "code": 103, "label": "g" },
|
||||
{ "code": 104, "label": "h" },
|
||||
{ "code": 106, "label": "j" },
|
||||
{ "code": 107, "label": "k" },
|
||||
{ "code": 108, "label": "l" },
|
||||
{ "code": 233, "label": "é" },
|
||||
{ "code": 224, "label": "à" }
|
||||
], [
|
||||
{ "code": 122, "label": "z" },
|
||||
{ "code": 120, "label": "x" },
|
||||
{ "code": 99, "label": "c" },
|
||||
{ "code": 118, "label": "v" },
|
||||
{ "code": 98, "label": "b" },
|
||||
{ "code": 110, "label": "n" },
|
||||
{ "code": 109, "label": "m" }
|
||||
]
|
||||
]
|
||||
}
|
||||
40
app/src/main/assets/ime/text/characters/colemak.json
Normal file
40
app/src/main/assets/ime/text/characters/colemak.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"type": "characters",
|
||||
"name": "colemak",
|
||||
"direction": "ltr",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 113, "label": "q" },
|
||||
{ "code": 119, "label": "w" },
|
||||
{ "code": 102, "label": "f" },
|
||||
{ "code": 112, "label": "p" },
|
||||
{ "code": 103, "label": "g" },
|
||||
{ "code": 106, "label": "j" },
|
||||
{ "code": 108, "label": "l" },
|
||||
{ "code": 117, "label": "u" },
|
||||
{ "code": 121, "label": "y" },
|
||||
{ "code": 59, "label": ";", "popup": [
|
||||
{ "code": 58, "label": ":" }
|
||||
] }
|
||||
], [
|
||||
{ "code": 97, "label": "a" },
|
||||
{ "code": 114, "label": "r" },
|
||||
{ "code": 115, "label": "s" },
|
||||
{ "code": 116, "label": "t" },
|
||||
{ "code": 100, "label": "d" },
|
||||
{ "code": 104, "label": "h" },
|
||||
{ "code": 110, "label": "n" },
|
||||
{ "code": 101, "label": "e" },
|
||||
{ "code": 105, "label": "i" },
|
||||
{ "code": 111, "label": "o" }
|
||||
], [
|
||||
{ "code": 122, "label": "z" },
|
||||
{ "code": 120, "label": "x" },
|
||||
{ "code": 99, "label": "c" },
|
||||
{ "code": 118, "label": "v" },
|
||||
{ "code": 98, "label": "b" },
|
||||
{ "code": 107, "label": "k" },
|
||||
{ "code": 109, "label": "m" }
|
||||
]
|
||||
]
|
||||
}
|
||||
49
app/src/main/assets/ime/text/characters/dvorak.json
Normal file
49
app/src/main/assets/ime/text/characters/dvorak.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"type": "characters",
|
||||
"name": "dvorak",
|
||||
"direction": "ltr",
|
||||
"modifier": "dvorak",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 64, "label": "@", "variation": "email_address" },
|
||||
{ "code": 39, "label": "'", "variation": "normal", "popup": [
|
||||
{ "code": 33, "label": "!" },
|
||||
{ "code": 34, "label": "\"" }
|
||||
] },
|
||||
{ "code": 47, "label": "/", "variation": "uri" },
|
||||
{ "code": 44, "label": ",", "popup": [
|
||||
{ "code": 60, "label": "<" },
|
||||
{ "code": 63, "label": "?" }
|
||||
] },
|
||||
{ "code": 46, "label": ".", "popup": [
|
||||
{ "code": 62, "label": ">" }
|
||||
] },
|
||||
{ "code": 112, "label": "p" },
|
||||
{ "code": 121, "label": "y" },
|
||||
{ "code": 102, "label": "f" },
|
||||
{ "code": 103, "label": "g" },
|
||||
{ "code": 99, "label": "c" },
|
||||
{ "code": 114, "label": "r" },
|
||||
{ "code": 108, "label": "l" }
|
||||
], [
|
||||
{ "code": 97, "label": "a" },
|
||||
{ "code": 111, "label": "o" },
|
||||
{ "code": 101, "label": "e" },
|
||||
{ "code": 117, "label": "u" },
|
||||
{ "code": 105, "label": "i" },
|
||||
{ "code": 100, "label": "d" },
|
||||
{ "code": 104, "label": "h" },
|
||||
{ "code": 116, "label": "t" },
|
||||
{ "code": 110, "label": "n" },
|
||||
{ "code": 115, "label": "s" }
|
||||
], [
|
||||
{ "code": 106, "label": "j" },
|
||||
{ "code": 107, "label": "k" },
|
||||
{ "code": 120, "label": "x" },
|
||||
{ "code": 98, "label": "b" },
|
||||
{ "code": 109, "label": "m" },
|
||||
{ "code": 119, "label": "w" },
|
||||
{ "code": 118, "label": "v" }
|
||||
]
|
||||
]
|
||||
}
|
||||
38
app/src/main/assets/ime/text/characters/esperanto.json
Normal file
38
app/src/main/assets/ime/text/characters/esperanto.json
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"type": "characters",
|
||||
"name": "esperanto",
|
||||
"direction": "ltr",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 349, "label": "ŝ" },
|
||||
{ "code": 285, "label": "ĝ" },
|
||||
{ "code": 101, "label": "e" },
|
||||
{ "code": 114, "label": "r" },
|
||||
{ "code": 116, "label": "t" },
|
||||
{ "code": 365, "label": "ŭ" },
|
||||
{ "code": 117, "label": "u" },
|
||||
{ "code": 105, "label": "i" },
|
||||
{ "code": 111, "label": "o" },
|
||||
{ "code": 112, "label": "p" }
|
||||
], [
|
||||
{ "code": 97, "label": "a" },
|
||||
{ "code": 115, "label": "s" },
|
||||
{ "code": 100, "label": "d" },
|
||||
{ "code": 102, "label": "f" },
|
||||
{ "code": 103, "label": "g" },
|
||||
{ "code": 104, "label": "h" },
|
||||
{ "code": 106, "label": "j" },
|
||||
{ "code": 107, "label": "k" },
|
||||
{ "code": 108, "label": "l" },
|
||||
{ "code": 309, "label": "ĵ" }
|
||||
], [
|
||||
{ "code": 122, "label": "z" },
|
||||
{ "code": 265, "label": "ĉ" },
|
||||
{ "code": 99, "label": "c" },
|
||||
{ "code": 118, "label": "v" },
|
||||
{ "code": 98, "label": "b" },
|
||||
{ "code": 110, "label": "n" },
|
||||
{ "code": 109, "label": "m" }
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"type": "characters",
|
||||
"name": "esperanto_with_hx",
|
||||
"direction": "ltr",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 349, "label": "ŝ" },
|
||||
{ "code": 285, "label": "ĝ" },
|
||||
{ "code": 101, "label": "e" },
|
||||
{ "code": 114, "label": "r" },
|
||||
{ "code": 116, "label": "t" },
|
||||
{ "code": 365, "label": "ŭ" },
|
||||
{ "code": 117, "label": "u" },
|
||||
{ "code": 105, "label": "i" },
|
||||
{ "code": 111, "label": "o" },
|
||||
{ "code": 112, "label": "p" }
|
||||
], [
|
||||
{ "code": 97, "label": "a" },
|
||||
{ "code": 115, "label": "s" },
|
||||
{ "code": 100, "label": "d" },
|
||||
{ "code": 102, "label": "f" },
|
||||
{ "code": 103, "label": "g" },
|
||||
{ "code": 104, "label": "h" },
|
||||
{ "code": 106, "label": "j" },
|
||||
{ "code": 107, "label": "k" },
|
||||
{ "code": 108, "label": "l" },
|
||||
{ "code": 309, "label": "ĵ" }
|
||||
], [
|
||||
{ "code": 122, "label": "z" },
|
||||
{ "code": 265, "label": "ĉ" },
|
||||
{ "code": 99, "label": "c" },
|
||||
{ "code": 118, "label": "v" },
|
||||
{ "code": 98, "label": "b" },
|
||||
{ "code": 110, "label": "n" },
|
||||
{ "code": 109, "label": "m" },
|
||||
{ "code": 293, "label": "ĥ" }
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"ض": [
|
||||
{ "code": 1633, "label": "١" }
|
||||
],
|
||||
"ص": [
|
||||
{ "code": 1634, "label": "٢" }
|
||||
],
|
||||
"ث": [
|
||||
{ "code": 1635, "label": "٣" }
|
||||
],
|
||||
"ق": [
|
||||
{ "code": 1704, "label": "ڨ"},
|
||||
{ "code": 1636, "label": "٤" }
|
||||
],
|
||||
"ف": [
|
||||
{ "code": 1701, "label": "ڥ" },
|
||||
{ "code": 1700, "label": "ڤ" },
|
||||
{ "code": 1698, "label": "ڢ" },
|
||||
{ "code": 1637, "label": "٥" }
|
||||
],
|
||||
"غ": [
|
||||
{ "code": 1638, "label": "٦" }
|
||||
],
|
||||
"ع": [
|
||||
{ "code": 1639, "label": "٧" }
|
||||
],
|
||||
"ه": [
|
||||
{ "code": 1726, "label": "ھ" },
|
||||
{ "code": 1640, "label": "٨" }
|
||||
],
|
||||
"خ": [
|
||||
{ "code": 1641, "label": "٩" }
|
||||
],
|
||||
"ح": [
|
||||
{ "code": 1632, "label": "٠" }
|
||||
],
|
||||
"ج": [
|
||||
{ "code": 1670, "label": "چ" }
|
||||
],
|
||||
"ش": [
|
||||
{ "code": 1692, "label": "ڜ" }
|
||||
],
|
||||
"ي": [
|
||||
{ "code": 1574, "label": "ئ" },
|
||||
{ "code": 1609, "label": "ى" }
|
||||
],
|
||||
"ب": [
|
||||
{ "code": 1662, "label": "پ" }
|
||||
],
|
||||
"ل": [
|
||||
{ "code": 65275, "label": "لا" },
|
||||
{ "code": 65273, "label": "لإ" },
|
||||
{ "code": 65271, "label": "لأ" },
|
||||
{ "code": 65269, "label": "لآ" }
|
||||
],
|
||||
"ا": [
|
||||
{ "code": 1570, "label": "آ" },
|
||||
{ "code": 1569, "label": "ء" },
|
||||
{ "code": 1571, "label": "أ" },
|
||||
{ "code": 1573, "label": "إ" },
|
||||
{ "code": 1649, "label": "ٱ" }
|
||||
],
|
||||
"ك": [
|
||||
{ "code": 1705, "label": "ک"},
|
||||
{ "code": 1711, "label": "گ" }
|
||||
],
|
||||
"ى": [
|
||||
{ "code": 1574, "label": "ئ" }
|
||||
],
|
||||
"ز": [
|
||||
{ "code": 1688, "label": "ژ" }
|
||||
],
|
||||
".~normal": [
|
||||
{ "code": 1611, "label": "ً" },
|
||||
{ "code": 1622, "label": "ٖ" },
|
||||
{ "code": 1648, "label": "ٰ" },
|
||||
{ "code": 1619, "label": "ٓ" },
|
||||
{ "code": 1615, "label": "ُ" },
|
||||
{ "code": 1616, "label": "ِ" },
|
||||
{ "code": 1614, "label": "َ" },
|
||||
{ "code": 1600, "label": "ـ" },
|
||||
{ "code": 1621, "label": "ٕ" },
|
||||
{ "code": 1620, "label": "ٔ" },
|
||||
{ "code": 1617, "label": "ّ" },
|
||||
{ "code": 1612, "label": "ٌ" },
|
||||
{ "code": 1613, "label": "ٍ" },
|
||||
{ "code": 1618, "label": "ْ" }
|
||||
],
|
||||
".~uri": [
|
||||
{ "code": -255, "label": ".ir"},
|
||||
{ "code": -255, "label": ".gov" },
|
||||
{ "code": -255, "label": ".edu" },
|
||||
{ "code": -255, "label": ".org" },
|
||||
{ "code": -255, "label": ".com" },
|
||||
{ "code": -255, "label": ".net" }
|
||||
]
|
||||
}
|
||||
@@ -50,6 +50,18 @@
|
||||
{ "code": 251, "label": "û" },
|
||||
{ "code": 249, "label": "ù" }
|
||||
],
|
||||
"ŝ": [
|
||||
{ "code": 113, "label": "q" }
|
||||
],
|
||||
"ĝ": [
|
||||
{ "code": 119, "label": "w" }
|
||||
],
|
||||
"ĉ": [
|
||||
{ "code": 120, "label": "x" }
|
||||
],
|
||||
"ŭ": [
|
||||
{ "code": 121, "label": "y" }
|
||||
],
|
||||
".~normal": [
|
||||
{ "code": 44, "label": "," },
|
||||
{ "code": 38, "label": "&" },
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"c": [
|
||||
{ "code": 265, "label": "ĉ" }
|
||||
],
|
||||
"g": [
|
||||
{ "code": 285, "label": "ĝ" }
|
||||
],
|
||||
"h": [
|
||||
{ "code": 293, "label": "ĥ" }
|
||||
],
|
||||
"j": [
|
||||
{ "code": 309, "label": "ĵ" }
|
||||
],
|
||||
"s": [
|
||||
{ "code": 349, "label": "ŝ" }
|
||||
],
|
||||
"u": [
|
||||
{ "code": 365, "label": "ŭ" }
|
||||
],
|
||||
"q": [
|
||||
{ "code": 349, "label": "ŝ" }
|
||||
],
|
||||
"w": [
|
||||
{ "code": 285, "label": "ĝ" }
|
||||
],
|
||||
"x": [
|
||||
{ "code": 265, "label": "ĉ" }
|
||||
],
|
||||
"y": [
|
||||
{ "code": 365, "label": "ŭ" }
|
||||
],
|
||||
".~normal": [
|
||||
{ "code": 44, "label": "," },
|
||||
{ "code": 38, "label": "&" },
|
||||
{ "code": 37, "label": "%" },
|
||||
{ "code": 43, "label": "+" },
|
||||
{ "code": 34, "label": "\"" },
|
||||
{ "code": 45, "label": "-" },
|
||||
{ "code": 58, "label": ":" },
|
||||
{ "code": 39, "label": "'" },
|
||||
{ "code": 64, "label": "@" },
|
||||
{ "code": 59, "label": ";" },
|
||||
{ "code": 47, "label": "/" },
|
||||
{ "code": 40, "label": "(" },
|
||||
{ "code": 41, "label": ")" },
|
||||
{ "code": 35, "label": "#" },
|
||||
{ "code": 33, "label": "!" },
|
||||
{ "code": 63, "label": "?" },
|
||||
{ "code": 61, "label": "=" }
|
||||
],
|
||||
".~uri": [
|
||||
{ "code": -255, "label": ".com" },
|
||||
{ "code": -255, "label": ".gov" },
|
||||
{ "code": -255, "label": ".edu" },
|
||||
{ "code": -255, "label": ".org" },
|
||||
{ "code": -255, "label": ".net" }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"a": [
|
||||
{ "code": 225, "label": "á" }
|
||||
],
|
||||
"e": [
|
||||
{ "code": 233, "label": "é" }
|
||||
],
|
||||
"i": [
|
||||
{ "code": 237, "label": "í" }
|
||||
],
|
||||
"o": [
|
||||
{ "code": 243, "label": "ó" },
|
||||
{ "code": 246, "label": "ö" },
|
||||
{ "code": 337, "label": "ő" }
|
||||
],
|
||||
"ö": [
|
||||
{ "code": 337, "label": "ő" }
|
||||
],
|
||||
"u": [
|
||||
{ "code": 250, "label": "ú" },
|
||||
{ "code": 252, "label": "ü" },
|
||||
{ "code": 369, "label": "ű" }
|
||||
],
|
||||
"ü": [
|
||||
{ "code": 369, "label": "ű" }
|
||||
],
|
||||
".~normal": [
|
||||
{ "code": 44, "label": "," },
|
||||
{ "code": 38, "label": "&" },
|
||||
{ "code": 37, "label": "%" },
|
||||
{ "code": 43, "label": "+" },
|
||||
{ "code": 34, "label": "\"" },
|
||||
{ "code": 45, "label": "-" },
|
||||
{ "code": 58, "label": ":" },
|
||||
{ "code": 39, "label": "'" },
|
||||
{ "code": 64, "label": "@" },
|
||||
{ "code": 59, "label": ";" },
|
||||
{ "code": 47, "label": "/" },
|
||||
{ "code": 40, "label": "(" },
|
||||
{ "code": 41, "label": ")" },
|
||||
{ "code": 35, "label": "#" },
|
||||
{ "code": 33, "label": "!" },
|
||||
{ "code": 63, "label": "?" }
|
||||
],
|
||||
".~uri": [
|
||||
{ "code": -255, "label": ".com" },
|
||||
{ "code": -255, "label": ".hu" },
|
||||
{ "code": -255, "label": ".gov" },
|
||||
{ "code": -255, "label": ".edu" },
|
||||
{ "code": -255, "label": ".org" },
|
||||
{ "code": -255, "label": ".net" }
|
||||
]
|
||||
}
|
||||
41
app/src/main/assets/ime/text/characters/hungarian.json
Normal file
41
app/src/main/assets/ime/text/characters/hungarian.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"type": "characters",
|
||||
"name": "hungarian",
|
||||
"direction": "ltr",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 113, "label": "q" },
|
||||
{ "code": 119, "label": "w" },
|
||||
{ "code": 101, "label": "e" },
|
||||
{ "code": 114, "label": "r" },
|
||||
{ "code": 116, "label": "t" },
|
||||
{ "code": 122, "label": "z" },
|
||||
{ "code": 117, "label": "u" },
|
||||
{ "code": 105, "label": "i" },
|
||||
{ "code": 111, "label": "o" },
|
||||
{ "code": 112, "label": "p" },
|
||||
{ "code": 246, "label": "ö" }
|
||||
], [
|
||||
{ "code": 97, "label": "a" },
|
||||
{ "code": 115, "label": "s" },
|
||||
{ "code": 100, "label": "d" },
|
||||
{ "code": 102, "label": "f" },
|
||||
{ "code": 103, "label": "g" },
|
||||
{ "code": 104, "label": "h" },
|
||||
{ "code": 106, "label": "j" },
|
||||
{ "code": 107, "label": "k" },
|
||||
{ "code": 108, "label": "l" },
|
||||
{ "code": 233, "label": "é" },
|
||||
{ "code": 225, "label": "á" }
|
||||
], [
|
||||
{ "code": 121, "label": "y" },
|
||||
{ "code": 120, "label": "x" },
|
||||
{ "code": 99, "label": "c" },
|
||||
{ "code": 118, "label": "v" },
|
||||
{ "code": 98, "label": "b" },
|
||||
{ "code": 110, "label": "n" },
|
||||
{ "code": 109, "label": "m" },
|
||||
{ "code": 252, "label": "ü" }
|
||||
]
|
||||
]
|
||||
}
|
||||
32
app/src/main/assets/ime/text/characters/mod/arabic.json
Normal file
32
app/src/main/assets/ime/text/characters/mod/arabic.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"type": "characters/mod",
|
||||
"name": "arabic",
|
||||
"direction": "rtl",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 0 },
|
||||
{ "code": -5, "label": "delete", "type": "enter_editing" }
|
||||
],
|
||||
[
|
||||
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
|
||||
{ "code": 64, "label": "@", "variation": "email_address" },
|
||||
{ "code": 1548, "label": "،", "variation": "normal" },
|
||||
{ "code": 47, "label": "/", "variation": "uri" },
|
||||
{ "code": -210, "label": "language_switch", "type": "system_gui", "popup": [
|
||||
{ "code": -213, "label": "switch_to_media_context", "type": "system_gui" },
|
||||
{ "code": -100, "label": "settings", "type": "system_gui" }
|
||||
] },
|
||||
{ "code": -213, "label": "switch_to_media_context", "type": "system_gui", "popup": [
|
||||
{ "code": -100, "label": "settings", "type": "system_gui" }
|
||||
] },
|
||||
{ "code": 32, "label": " " },
|
||||
{ "code": 46, "label": ".", "variation": "email_address" },
|
||||
{ "code": 46, "label": ".", "variation": "normal" },
|
||||
{ "code": 46, "label": ".", "variation": "uri" },
|
||||
{ "code": 10, "label": "enter", "type": "enter_editing", "popup": [
|
||||
{ "code": -215, "label": "toggle_one_handed_mode", "type": "system_gui" },
|
||||
{ "code": -213, "label": "switch_to_media_context", "type": "system_gui" }
|
||||
] }
|
||||
]
|
||||
]
|
||||
}
|
||||
30
app/src/main/assets/ime/text/characters/mod/dvorak.json
Normal file
30
app/src/main/assets/ime/text/characters/mod/dvorak.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "characters/mod",
|
||||
"name": "dvorak",
|
||||
"direction": "ltr",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": -1, "label": "shift", "type": "modifier" },
|
||||
{ "code": 0 },
|
||||
{ "code": -5, "label": "delete", "type": "enter_editing" }
|
||||
], [
|
||||
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
|
||||
{ "code": 113, "label": "q" },
|
||||
{ "code": -210, "label": "language_switch", "type": "system_gui", "popup": [
|
||||
{ "code": -213, "label": "switch_to_media_context", "type": "system_gui" },
|
||||
{ "code": -100, "label": "settings", "type": "system_gui" }
|
||||
] },
|
||||
{ "code": -213, "label": "switch_to_media_context", "type": "system_gui", "popup": [
|
||||
{ "code": -100, "label": "settings", "type": "system_gui" }
|
||||
] },
|
||||
{ "code": 32, "label": " " },
|
||||
{ "code": 122, "label": "z", "variation": "email_address" },
|
||||
{ "code": 122, "label": "z", "variation": "normal" },
|
||||
{ "code": 122, "label": "z", "variation": "uri" },
|
||||
{ "code": 10, "label": "enter", "type": "enter_editing", "popup": [
|
||||
{ "code": -215, "label": "toggle_one_handed_mode", "type": "system_gui" },
|
||||
{ "code": -213, "label": "switch_to_media_context", "type": "system_gui" }
|
||||
] }
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "extension",
|
||||
"name": "clipboard_cursor_row",
|
||||
"direction": "ltr",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": -135, "label": "clipboard_select_all", "type": "enter_editing" },
|
||||
{ "code": -130, "label": "clipboard_copy", "type": "enter_editing" },
|
||||
{ "code": -20, "label": "arrow_left", "type": "navigation" },
|
||||
{ "code": -21, "label": "arrow_right", "type": "navigation" },
|
||||
{ "code": -131, "label": "clipboard_cut", "type": "enter_editing" },
|
||||
{ "code": -132, "label": "clipboard_paste", "type": "enter_editing" }
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -12,7 +12,9 @@
|
||||
{ "code": 44, "label": ",", "popup": [] },
|
||||
{ "code": -205, "label": "view_numeric_advanced", "type": "system_gui" },
|
||||
{ "code": 32, "label": " ", "popup": [] },
|
||||
{ "code": 46, "label": ".", "popup": [] },
|
||||
{ "code": 46, "label": ".", "popup": [
|
||||
{ "code": 8230, "label": "…" }
|
||||
] },
|
||||
{ "code": 10, "label": "enter", "type": "enter_editing" }
|
||||
]
|
||||
]
|
||||
|
||||
@@ -15,7 +15,10 @@
|
||||
{ "code": 163, "label": "£" },
|
||||
{ "code": 165, "label": "¥" }
|
||||
] },
|
||||
{ "code": 95, "label": "_", "popup": [] },
|
||||
{ "code": 37, "label": "%", "popup": [
|
||||
{ "code": 8240, "label": "‰" },
|
||||
{ "code": 8453, "label": "℅" }
|
||||
] },
|
||||
{ "code": 38, "label": "&", "popup": [] },
|
||||
{ "code": 45, "label": "-", "popup": [
|
||||
{ "code": 8212, "label": "—" },
|
||||
|
||||
@@ -54,10 +54,7 @@
|
||||
] },
|
||||
{ "code": 92, "label": "\\", "popup": [] }
|
||||
], [
|
||||
{ "code": 37, "label": "%", "popup": [
|
||||
{ "code": 8240, "label": "‰" },
|
||||
{ "code": 8453, "label": "℅" }
|
||||
] },
|
||||
{ "code": 95, "label": "_", "popup": [] },
|
||||
{ "code": 169, "label": "©", "popup": [] },
|
||||
{ "code": 174, "label": "®", "popup": [] },
|
||||
{ "code": 8482, "label": "™", "popup": [] },
|
||||
|
||||
@@ -47,6 +47,10 @@
|
||||
"oneHandedButton": {
|
||||
"fgColor": "#424242"
|
||||
},
|
||||
"privateMode": {
|
||||
"bgColor": "#A000FF",
|
||||
"fgColor": "#FFFFFF"
|
||||
},
|
||||
"smartbar": {
|
||||
"bgColor": "transparent",
|
||||
"fgColor": "@window/textColor",
|
||||
|
||||
@@ -47,6 +47,10 @@
|
||||
"oneHandedButton": {
|
||||
"fgColor": "#EEEEEE"
|
||||
},
|
||||
"privateMode": {
|
||||
"bgColor": "#A000FF",
|
||||
"fgColor": "#FFFFFF"
|
||||
},
|
||||
"smartbar": {
|
||||
"bgColor": "transparent",
|
||||
"fgColor": "@window/textColor",
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Patrick Goldinger
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.patrickgold.florisboard.crashutility
|
||||
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.databinding.CrashDialogBinding
|
||||
|
||||
class CrashDialogActivity : AppCompatActivity() {
|
||||
private lateinit var binding: CrashDialogBinding
|
||||
private var stacktrace: String = ""
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = CrashDialogBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
stacktrace = CrashUtility.getUnhandledStacktrace(this)
|
||||
binding.stacktrace.text = stacktrace
|
||||
|
||||
binding.copyToClipboard.setOnClickListener {
|
||||
val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE)
|
||||
if (clipboardManager != null && clipboardManager is ClipboardManager) {
|
||||
clipboardManager.setPrimaryClip(ClipData.newPlainText(stacktrace, stacktrace))
|
||||
}
|
||||
}
|
||||
|
||||
binding.openBugReportForm.setOnClickListener {
|
||||
val browserIntent = Intent(
|
||||
Intent.ACTION_VIEW,
|
||||
Uri.parse(resources.getString(R.string.florisboard__issue_tracker_new_issue_url))
|
||||
)
|
||||
startActivity(browserIntent)
|
||||
}
|
||||
|
||||
binding.close.setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,401 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Patrick Goldinger
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.patrickgold.florisboard.crashutility
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.*
|
||||
import android.app.Application.ActivityLifecycleCallbacks
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.Process
|
||||
import android.util.Log
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.core.FlorisBoard
|
||||
import timber.log.Timber
|
||||
import java.io.File
|
||||
import java.lang.ref.WeakReference
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
/**
|
||||
* Abstract class which holds several static methods used for handling unexpected errors.
|
||||
*
|
||||
* Parts of this class (especially the install() function and the uncaughtException() handler) have
|
||||
* been inspired by the great CustomActivityOnCrash library:
|
||||
* https://github.com/Ereza/CustomActivityOnCrash (licensed under Apache 2.0)
|
||||
* https://github.com/Ereza/CustomActivityOnCrash/blob/master/library/src/main/java/cat/ereza/customactivityoncrash/CustomActivityOnCrash.java
|
||||
*/
|
||||
abstract class CrashUtility private constructor() {
|
||||
companion object {
|
||||
private const val SHARED_PREFS_FILE = "crash_utility"
|
||||
private const val SHARED_PREFS_LAST_CRASH_TIMESTAMP = "last_crash_timestamp"
|
||||
|
||||
private const val NOTIFICATION_CHANNEL_ID = "dev.patrickgold.florisboard.crashutility"
|
||||
private const val NOTIFICATION_ID = 0xFBAD0100
|
||||
|
||||
private const val UNHANDLED_STACKTRACE_FILE_EXT = "stacktrace"
|
||||
|
||||
private var lastActivityCreated: WeakReference<Activity?> = WeakReference(null)
|
||||
|
||||
/**
|
||||
* Installs the CrashUtility crash handler for the given package [context]. Also registers
|
||||
* a notification channel for devices with Android 8.0+.
|
||||
*
|
||||
* @param context The current package context. If null is supplied, this function does
|
||||
* nothing.
|
||||
* @return True if the installation was successful, false otherwise.
|
||||
*/
|
||||
fun install(context: Context?): Boolean {
|
||||
if (context == null) {
|
||||
Timber.e(
|
||||
"install($context): Can't install crash handler with a null Context object, doing nothing!"
|
||||
)
|
||||
return false
|
||||
}
|
||||
val oldHandler = Thread.getDefaultUncaughtExceptionHandler()
|
||||
if (oldHandler is UncaughtExceptionHandler) {
|
||||
Timber.i("install($context): Crash handler is already installed, doing nothing!")
|
||||
} else {
|
||||
val application = context.applicationContext
|
||||
if (application != null && application is Application) {
|
||||
try {
|
||||
Thread.setDefaultUncaughtExceptionHandler(
|
||||
UncaughtExceptionHandler(
|
||||
WeakReference(application),
|
||||
WeakReference(oldHandler),
|
||||
application.filesDir.absolutePath
|
||||
)
|
||||
)
|
||||
Timber.i(
|
||||
"install($context): Successfully installed crash handler for this application!"
|
||||
)
|
||||
} catch (e: SecurityException) {
|
||||
Timber.e(
|
||||
"install($context): Failed to install crash handler, probably due to missing runtime permission 'setDefaultUncaughtExceptionHandler':\n$e"
|
||||
)
|
||||
return false
|
||||
} catch (e: Exception) {
|
||||
Timber.e(
|
||||
"install($context): Failed to install crash handler due to an unspecified error:\n$e"
|
||||
)
|
||||
return false
|
||||
}
|
||||
application.registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
|
||||
override fun onActivityCreated(
|
||||
activity: Activity,
|
||||
savedInstanceState: Bundle?
|
||||
) {
|
||||
if (activity !is CrashDialogActivity) {
|
||||
lastActivityCreated = WeakReference(activity)
|
||||
}
|
||||
}
|
||||
override fun onActivityStarted(activity: Activity) {}
|
||||
override fun onActivityResumed(activity: Activity) {}
|
||||
override fun onActivityPaused(activity: Activity) {}
|
||||
override fun onActivityStopped(activity: Activity) {}
|
||||
override fun onActivitySaveInstanceState(
|
||||
activity: Activity,
|
||||
outState: Bundle
|
||||
) {}
|
||||
override fun onActivityDestroyed(activity: Activity) {}
|
||||
})
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
try {
|
||||
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE)
|
||||
if (notificationManager != null && notificationManager is NotificationManager) {
|
||||
val notificationChannel = NotificationChannel(
|
||||
NOTIFICATION_CHANNEL_ID,
|
||||
context.resources.getString(R.string.crash_notification_channel__title),
|
||||
NotificationManager.IMPORTANCE_HIGH
|
||||
)
|
||||
notificationManager.createNotificationChannel(notificationChannel)
|
||||
}
|
||||
Timber.i(
|
||||
"install($context): Successfully created crash handler notification channel!"
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
Timber.e(
|
||||
"install($context): Failed to create crash handler notification channel due to an unspecified error:\n$e"
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Timber.e(
|
||||
"install($context): Can't install crash handler with a null Application object, doing nothing!"
|
||||
)
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads and returns all unhandled stacktrace files.
|
||||
*
|
||||
* @param context The current package context. If null is supplied, this function returns
|
||||
* an empty string.
|
||||
* @return All unhandled stacktrace files or an empty string.
|
||||
*/
|
||||
fun getUnhandledStacktrace(context: Context?): String {
|
||||
context ?: return ""
|
||||
val retString: StringBuilder = StringBuilder()
|
||||
val ustDir = getUstDir(context)
|
||||
if (ustDir.isDirectory) {
|
||||
(ustDir.listFiles { pathname ->
|
||||
pathname.name.endsWith(".$UNHANDLED_STACKTRACE_FILE_EXT")
|
||||
})?.forEach { file ->
|
||||
val newLine = System.lineSeparator()
|
||||
Timber.i("Reading unhandled stacktrace: ${file.name}")
|
||||
retString.append("~~~ ${file.name} ~~~$newLine$newLine")
|
||||
retString.append(readFile(file))
|
||||
file.delete()
|
||||
}
|
||||
}
|
||||
return retString.toString()
|
||||
}
|
||||
|
||||
fun hasUnhandledStacktraceFiles(context: Context): Boolean {
|
||||
val ustDir = getUstDir(context)
|
||||
return if (ustDir.isDirectory) {
|
||||
(ustDir.listFiles { pathname ->
|
||||
pathname.name.endsWith(".$UNHANDLED_STACKTRACE_FILE_EXT")
|
||||
})?.isNotEmpty() ?: false
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last crash timestamp from the shared preferences.
|
||||
*
|
||||
* @param context The current package context. If null is supplied, this function returns
|
||||
* the default value for the timestamp (0).
|
||||
* @return The last time crash timestamp or 0.
|
||||
*/
|
||||
private fun getLastCrashTimestamp(context: Context?): Long {
|
||||
context ?: return 0
|
||||
return context.getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE)
|
||||
.getLong(SHARED_PREFS_LAST_CRASH_TIMESTAMP, 0)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the last crash timestamp in the shared preferences.
|
||||
*
|
||||
* @param context The current package context. If null is supplied, this function does
|
||||
* nothing.
|
||||
* @param value The timestamp of the current crash.
|
||||
*/
|
||||
@SuppressLint("ApplySharedPref")
|
||||
private fun setLastCrashTimestamp(context: Context?, value: Long) {
|
||||
context ?: return
|
||||
// Note: must use commit() instead of apply(), as the value must be immediately written
|
||||
// to be possibly instantly read again.
|
||||
context.getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE)
|
||||
.edit()
|
||||
.putLong(SHARED_PREFS_LAST_CRASH_TIMESTAMP, value)
|
||||
.commit()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a reference to the current unhandled stacktrace directory.
|
||||
*
|
||||
* @param context The current package context.
|
||||
* @return The File object for the directory.
|
||||
*/
|
||||
private fun getUstDir(context: Context): File {
|
||||
val path = context.filesDir.absolutePath
|
||||
return File(path)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a reference to the stacktrace file for given [timestamp].
|
||||
*
|
||||
* @param context The current package context.
|
||||
* @param timestamp The timestamp of the stacktrace file to get.
|
||||
* @return The File object for the stacktrace file.
|
||||
*/
|
||||
private fun getUstFile(context: Context, timestamp: Long): File {
|
||||
val path = context.filesDir.absolutePath
|
||||
return File("$path/$timestamp.$UNHANDLED_STACKTRACE_FILE_EXT")
|
||||
}
|
||||
|
||||
/**
|
||||
* Push a notification which opens [CrashDialogActivity] with given parameters.
|
||||
*
|
||||
* @param context The current package context. If null is supplied, this function does
|
||||
* nothing.
|
||||
* @param id The ID of the notification.
|
||||
* @param title The title of the notification.
|
||||
* @param body The body of the notification.
|
||||
*/
|
||||
private fun pushNotification(context: Context?, id: Int, title: String, body: String) {
|
||||
context ?: return
|
||||
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE)
|
||||
if (notificationManager != null && notificationManager is NotificationManager) {
|
||||
val notificationBuilder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
Notification.Builder(context.applicationContext, NOTIFICATION_CHANNEL_ID)
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
Notification.Builder(context.applicationContext).apply {
|
||||
setPriority(Notification.PRIORITY_MAX)
|
||||
}
|
||||
}
|
||||
val crashDialogIntent = Intent(context, CrashDialogActivity::class.java)
|
||||
val notification = notificationBuilder.run {
|
||||
setContentTitle(title)
|
||||
style = Notification.BigTextStyle().bigText(body)
|
||||
setContentText(body)
|
||||
setSmallIcon(android.R.drawable.stat_notify_error)
|
||||
setContentIntent(PendingIntent.getActivity(context, 0, crashDialogIntent, 0)).setAutoCancel(
|
||||
true
|
||||
)
|
||||
build()
|
||||
}
|
||||
notificationManager.notify(id, notification)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Push a notification configured for a single crash.
|
||||
*
|
||||
* @param context The current package context. If null is supplied, this function does
|
||||
* nothing.
|
||||
*/
|
||||
private fun pushCrashOnceNotification(context: Context?) {
|
||||
context ?: return
|
||||
pushNotification(
|
||||
context,
|
||||
NOTIFICATION_ID.toInt(),
|
||||
context.resources.getString(R.string.crash_once_notification__title),
|
||||
context.resources.getString(R.string.crash_once_notification__body)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Push a notification configured for multiple crashes.
|
||||
*
|
||||
* @param context The current package context. If null is supplied, this function does
|
||||
* nothing.
|
||||
*/
|
||||
private fun pushCrashMultipleNotification(context: Context?) {
|
||||
context ?: return
|
||||
pushNotification(
|
||||
context,
|
||||
NOTIFICATION_ID.toInt(),
|
||||
context.resources.getString(R.string.crash_multiple_notification__title),
|
||||
context.resources.getString(R.string.crash_multiple_notification__body)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a given [file] and returns its content.
|
||||
*
|
||||
* @param file The file object.
|
||||
* @return The contents of the file or an empty string, if the file does not exist.
|
||||
*/
|
||||
private fun readFile(file: File): String {
|
||||
val retText = StringBuilder()
|
||||
if (file.exists()) {
|
||||
val newLine = System.lineSeparator()
|
||||
file.forEachLine {
|
||||
retText.append(it)
|
||||
retText.append(newLine)
|
||||
}
|
||||
}
|
||||
return retText.toString()
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes given [text] to given [file]. If the file already exists, its current content
|
||||
* will be overwritten.
|
||||
*
|
||||
* @param file The file object.
|
||||
* @param text The text to write to the file.
|
||||
* @return The contents of the file or an empty string, if the file does not exist.
|
||||
*/
|
||||
private fun writeToFile(file: File, text: String) {
|
||||
try {
|
||||
file.writeText(text)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom UncaughtExceptionHandler, which writes the captured stacktrace of the crash to the
|
||||
* internal storage, pushes a crash notification and kills the current process.
|
||||
*/
|
||||
class UncaughtExceptionHandler(
|
||||
private val application: WeakReference<Application>,
|
||||
private val oldHandler: WeakReference<Thread.UncaughtExceptionHandler?>,
|
||||
private val path: String
|
||||
) : Thread.UncaughtExceptionHandler {
|
||||
override fun uncaughtException(thread: Thread?, throwable: Throwable?) {
|
||||
Timber.e("Detected application crash, executing custom crash handler.")
|
||||
thread ?: return
|
||||
throwable ?: return
|
||||
val timestamp = System.currentTimeMillis()
|
||||
val stacktrace = Log.getStackTraceString(throwable)
|
||||
val ustFile = File("$path/$timestamp.$UNHANDLED_STACKTRACE_FILE_EXT")
|
||||
writeToFile(ustFile, stacktrace)
|
||||
val application = application.get()
|
||||
if (application != null) {
|
||||
val lastTimestamp = getLastCrashTimestamp(application)
|
||||
if (lastTimestamp > 0) {
|
||||
val lastFile = getUstFile(application, lastTimestamp)
|
||||
val lastStacktrace = readFile(lastFile)
|
||||
if (lastStacktrace == stacktrace) {
|
||||
// Delete last stacktrace if it matches previous unhandled one
|
||||
lastFile.delete()
|
||||
}
|
||||
}
|
||||
setLastCrashTimestamp(application, timestamp)
|
||||
if (timestamp - lastTimestamp < 5000) {
|
||||
pushCrashMultipleNotification(application)
|
||||
val florisboard = FlorisBoard.getInstanceOrNull()
|
||||
if (florisboard != null) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
florisboard.switchToPreviousInputMethod()
|
||||
} else {
|
||||
val imm = application.getSystemService(Context.INPUT_METHOD_SERVICE)
|
||||
if (imm != null && imm is InputMethodManager) {
|
||||
@Suppress("DEPRECATION")
|
||||
imm.switchToNextInputMethod(
|
||||
florisboard.window?.window?.attributes?.token,
|
||||
false
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pushCrashOnceNotification(application)
|
||||
}
|
||||
}
|
||||
val lastActivity = lastActivityCreated.get()
|
||||
if (lastActivity != null) {
|
||||
//oldHandler.get()?.uncaughtException(thread, throwable)
|
||||
lastActivity.finish()
|
||||
lastActivityCreated.clear()
|
||||
}
|
||||
Process.killProcess(Process.myPid())
|
||||
exitProcess(10)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,15 +16,23 @@
|
||||
|
||||
package dev.patrickgold.florisboard.ime.core
|
||||
|
||||
import android.content.ClipData
|
||||
import android.content.ClipDescription
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.inputmethodservice.InputMethodService
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.SystemClock
|
||||
import android.text.InputType
|
||||
import android.view.KeyCharacterMap
|
||||
import android.view.KeyEvent
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.view.inputmethod.ExtractedTextRequest
|
||||
import android.view.inputmethod.InputConnection
|
||||
import android.view.inputmethod.InputContentInfo
|
||||
import androidx.annotation.RequiresApi
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyCode
|
||||
import java.lang.StringBuilder
|
||||
|
||||
// Constants for detectLastUnicodeCharacterLengthBeforeCursor method
|
||||
private const val LIGHT_SKIN_TONE = 0x1F3FB
|
||||
@@ -58,6 +66,7 @@ private val emojiVariationArray: Array<Int> = arrayOf(
|
||||
* object which also holds the state of the currently focused input editor.
|
||||
*/
|
||||
class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
var contentMimeTypes: Array<out String?>? = null
|
||||
val cursorCapsMode: InputAttributes.CapsMode
|
||||
get() {
|
||||
val ic = ims?.currentInputConnection ?: return InputAttributes.CapsMode.NONE
|
||||
@@ -74,8 +83,8 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
var isComposingEnabled: Boolean = false
|
||||
set(v) {
|
||||
field = v
|
||||
reevaluate()
|
||||
if (v) {
|
||||
reevaluateCurrentWord()
|
||||
if (v && !isRawInputEditor) {
|
||||
markComposingRegion(currentWord)
|
||||
} else {
|
||||
markComposingRegion(null)
|
||||
@@ -83,13 +92,23 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
}
|
||||
var isNewSelectionInBoundsOfOld: Boolean = false
|
||||
private set
|
||||
var isPrivateMode: Boolean = false
|
||||
var isRawInputEditor: Boolean = true
|
||||
private set
|
||||
var packageName: String = "undefined"
|
||||
private set
|
||||
var selection: Selection = Selection(this)
|
||||
private set
|
||||
val cachedText: String
|
||||
get() = cachedTextInternal.toString()
|
||||
private var cachedTextInternal: StringBuilder = StringBuilder("")
|
||||
var cachedText: String = ""
|
||||
|
||||
private var clipboardManager: ClipboardManager? = null
|
||||
|
||||
init {
|
||||
val tmpClipboardManager = ims?.getSystemService(Context.CLIPBOARD_SERVICE)
|
||||
if (tmpClipboardManager != null && tmpClipboardManager is ClipboardManager) {
|
||||
clipboardManager = tmpClipboardManager
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun default(): EditorInstance {
|
||||
@@ -99,6 +118,9 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
fun from(editorInfo: EditorInfo?, ims: InputMethodService?): EditorInstance {
|
||||
return if (editorInfo == null) { default() } else {
|
||||
EditorInstance(ims).apply {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
||||
contentMimeTypes = editorInfo.contentMimeTypes
|
||||
}
|
||||
imeOptions = ImeOptions.fromImeOptionsInt(editorInfo.imeOptions)
|
||||
inputAttributes = InputAttributes.fromInputTypeInt(editorInfo.inputType)
|
||||
packageName = editorInfo.packageName
|
||||
@@ -112,8 +134,8 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
}
|
||||
|
||||
init {
|
||||
fetchExtractedTextFromInputConnection()
|
||||
reevaluate()
|
||||
updateEditorState()
|
||||
reevaluateCurrentWord()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -123,7 +145,7 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
oldSelStart: Int, oldSelEnd: Int,
|
||||
newSelStart: Int, newSelEnd: Int
|
||||
) {
|
||||
fetchExtractedTextFromInputConnection()
|
||||
updateEditorState()
|
||||
isNewSelectionInBoundsOfOld =
|
||||
newSelStart >= (oldSelStart - 1) &&
|
||||
newSelStart <= (oldSelStart + 1) &&
|
||||
@@ -133,8 +155,8 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
start = newSelStart
|
||||
end = newSelEnd
|
||||
}
|
||||
reevaluate()
|
||||
if (selection.isCursorMode && isComposingEnabled) {
|
||||
reevaluateCurrentWord()
|
||||
if (selection.isCursorMode && isComposingEnabled && !isRawInputEditor) {
|
||||
markComposingRegion(currentWord)
|
||||
} else {
|
||||
markComposingRegion(null)
|
||||
@@ -147,10 +169,54 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
*
|
||||
* @param text The text to complete in this editor's composing region.
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun commitCompletion(text: String): Boolean {
|
||||
return false
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
return if (isRawInputEditor) {
|
||||
false
|
||||
} else {
|
||||
ic.beginBatchEdit()
|
||||
ic.setComposingText(text, 1)
|
||||
markComposingRegion(null)
|
||||
updateEditorState()
|
||||
reevaluateCurrentWord()
|
||||
ic.endBatchEdit()
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Commits the given [content] to this editor instance and adjusts both the cursor position and
|
||||
* composing region, if any.
|
||||
*
|
||||
* @param content The content to commit.
|
||||
*
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun commitContent(content: Uri, description: ClipDescription): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
val contentMimeTypes = contentMimeTypes
|
||||
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1 || contentMimeTypes == null || contentMimeTypes.isEmpty()) {
|
||||
commitText(content.toString())
|
||||
} else {
|
||||
var mimeTypesDoMatch = false
|
||||
for (contentMimeType in contentMimeTypes) {
|
||||
if (description.hasMimeType(contentMimeType)) {
|
||||
mimeTypesDoMatch = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if (mimeTypesDoMatch) {
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
val ret = ic.commitContent(InputContentInfo(content, description), 0, null)
|
||||
ic.endBatchEdit()
|
||||
ret
|
||||
} else {
|
||||
commitText(content.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -163,29 +229,24 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
*
|
||||
* @param text The text to commit.
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun commitText(text: String): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
if (selection.isCursorMode) {
|
||||
cachedTextInternal.insert(selection.start, text)
|
||||
} else if (selection.isSelectionMode) {
|
||||
cachedTextInternal.replace(selection.start, selection.end, text)
|
||||
return if (isRawInputEditor) {
|
||||
ic.commitText(text, 1)
|
||||
} else {
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
ic.commitText(text, 1)
|
||||
updateEditorState()
|
||||
reevaluateCurrentWord()
|
||||
if (isComposingEnabled) {
|
||||
markComposingRegion(currentWord)
|
||||
}
|
||||
ic.endBatchEdit()
|
||||
true
|
||||
}
|
||||
selection.apply {
|
||||
start += text.length
|
||||
end = start
|
||||
}
|
||||
reevaluate()
|
||||
ic.commitText(text, 1)
|
||||
if (isComposingEnabled) {
|
||||
markComposingRegion(currentWord)
|
||||
}
|
||||
ic.setSelection(selection.start, selection.end)
|
||||
ic.endBatchEdit()
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -193,34 +254,24 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
* characters inside this selection will be removed, else only the left-most character from
|
||||
* the cursor's position.
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun deleteBackwards(): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
if (selection.isCursorMode && selection.start > 0) {
|
||||
val length = detectLastUnicodeCharacterLengthBeforeCursor()
|
||||
cachedTextInternal.replace(selection.start - length, selection.start, "")
|
||||
selection.apply {
|
||||
start -= length
|
||||
end = start
|
||||
return if (isRawInputEditor) {
|
||||
sendSystemKeyEvent(KeyEvent.KEYCODE_DEL)
|
||||
} else {
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
sendSystemKeyEvent(KeyEvent.KEYCODE_DEL)
|
||||
updateEditorState()
|
||||
reevaluateCurrentWord()
|
||||
if (isComposingEnabled) {
|
||||
markComposingRegion(currentWord)
|
||||
}
|
||||
ic.deleteSurroundingText(length, 0)
|
||||
} else if (selection.isSelectionMode) {
|
||||
cachedTextInternal.replace(selection.start, selection.end, "")
|
||||
selection.apply {
|
||||
end = start
|
||||
}
|
||||
ic.commitText("", 1)
|
||||
ic.endBatchEdit()
|
||||
true
|
||||
}
|
||||
reevaluate()
|
||||
if (isComposingEnabled) {
|
||||
markComposingRegion(currentWord)
|
||||
}
|
||||
ic.setSelection(selection.start, selection.end)
|
||||
ic.endBatchEdit()
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -231,28 +282,91 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
* @param n The number of words to delete before the cursor. Must be greater than 0 or this
|
||||
* method will fail.
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun deleteWordsBeforeCursor(n: Int): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
if (n < 1) {
|
||||
return false
|
||||
}
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
if (currentWord.isValid) {
|
||||
cachedTextInternal.replace(currentWord.start, currentWord.end, "")
|
||||
selection.apply {
|
||||
start = currentWord.start
|
||||
end = start
|
||||
return if (n < 1 || isRawInputEditor || !selection.isValid || !selection.isCursorMode) {
|
||||
false
|
||||
} else {
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
|
||||
getWordsInString(cachedText.substring(0, selection.start)).run {
|
||||
get(size - n.coerceAtLeast(0)).range
|
||||
}.run {
|
||||
ic.setSelection(first, selection.start)
|
||||
}
|
||||
ic.setSelection(currentWord.start, currentWord.end)
|
||||
|
||||
ic.commitText("", 1)
|
||||
|
||||
updateEditorState()
|
||||
reevaluateCurrentWord()
|
||||
ic.endBatchEdit()
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds all words in the given string with the correct regex for current subtype.
|
||||
* TODO: currently only supports en-US
|
||||
*
|
||||
* @param string String to select words from
|
||||
* @return Words in [string] as a List of [MatchResult]
|
||||
*/
|
||||
private fun getWordsInString(string: String):List<MatchResult>{
|
||||
val wordRegexPattern = "[\\p{L}]+".toRegex()
|
||||
return wordRegexPattern.findAll(
|
||||
string
|
||||
).toList()
|
||||
}
|
||||
|
||||
/**
|
||||
* Undoes the last action
|
||||
*
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun performUndo(): Boolean{
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
return if (isRawInputEditor) {
|
||||
sendSystemKeyEventCtrl(KeyEvent.KEYCODE_Z)
|
||||
true
|
||||
} else {
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
sendSystemKeyEventCtrl(KeyEvent.KEYCODE_Z)
|
||||
updateEditorState()
|
||||
reevaluateCurrentWord()
|
||||
if (isComposingEnabled) {
|
||||
markComposingRegion(currentWord)
|
||||
}
|
||||
ic.endBatchEdit()
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Redoes the last Undo action
|
||||
*
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun performRedo(): Boolean{
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
return if (isRawInputEditor) {
|
||||
sendSystemKeyEventCtrlShift(KeyEvent.KEYCODE_Z)
|
||||
true
|
||||
} else {
|
||||
ic.beginBatchEdit()
|
||||
markComposingRegion(null)
|
||||
sendSystemKeyEventCtrlShift(KeyEvent.KEYCODE_Z)
|
||||
updateEditorState()
|
||||
reevaluateCurrentWord()
|
||||
if (isComposingEnabled) {
|
||||
markComposingRegion(currentWord)
|
||||
}
|
||||
ic.endBatchEdit()
|
||||
true
|
||||
}
|
||||
reevaluate()
|
||||
ic.setSelection(selection.start, selection.end)
|
||||
ic.endBatchEdit()
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -262,15 +376,15 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
* @param n The number of characters to get after the cursor. Must be greater than 0 or this
|
||||
* method will fail.
|
||||
*
|
||||
* @returns [n] or less characters after the cursor.
|
||||
* @return [n] or less characters after the cursor.
|
||||
*/
|
||||
fun getTextAfterCursor(n: Int): String {
|
||||
if (!selection.isValid || n < 1) {
|
||||
if (!selection.isValid || n < 1 || isRawInputEditor) {
|
||||
return ""
|
||||
}
|
||||
val from = selection.end
|
||||
val to = (selection.end + n).coerceAtMost(cachedTextInternal.length)
|
||||
return cachedTextInternal.substring(from, to)
|
||||
val from = selection.end.coerceIn(0, cachedText.length)
|
||||
val to = (selection.end + n).coerceIn(0, cachedText.length)
|
||||
return cachedText.substring(from, to)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -280,15 +394,86 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
* @param n The number of characters to get before the cursor. Must be greater than 0 or this
|
||||
* method will fail.
|
||||
*
|
||||
* @returns [n] or less characters after the cursor.
|
||||
* @return [n] or less characters after the cursor.
|
||||
*/
|
||||
fun getTextBeforeCursor(n: Int): String {
|
||||
if (!selection.isValid || n < 1) {
|
||||
if (!selection.isValid || n < 1 || isRawInputEditor) {
|
||||
return ""
|
||||
}
|
||||
val from = (selection.start - n).coerceAtLeast(0)
|
||||
val to = selection.start
|
||||
return cachedTextInternal.substring(from, to)
|
||||
val from = (selection.start - n).coerceIn(0, cachedText.length)
|
||||
val to = selection.start.coerceIn(0, cachedText.length)
|
||||
return cachedText.substring(from, to)
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a cut command on this editor instance and adjusts both the cursor position and
|
||||
* composing region, if any.
|
||||
*
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun performClipboardCut(): Boolean {
|
||||
return if (selection.isSelectionMode) {
|
||||
val clipData: ClipData = ClipData.newPlainText(selection.text, selection.text)
|
||||
clipboardManager?.setPrimaryClip(clipData)
|
||||
deleteBackwards()
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a copy command on this editor instance and adjusts both the cursor position and
|
||||
* composing region, if any.
|
||||
*
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun performClipboardCopy(): Boolean {
|
||||
return if (selection.isSelectionMode) {
|
||||
val clipData: ClipData = ClipData.newPlainText(selection.text, selection.text)
|
||||
clipboardManager?.setPrimaryClip(clipData)
|
||||
setSelection(selection.end, selection.end)
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a paste command on this editor instance and adjusts both the cursor position and
|
||||
* composing region, if any.
|
||||
*
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun performClipboardPaste(): Boolean {
|
||||
// val clipData: ClipData? = clipboardManager?.primaryClip
|
||||
// val item: ClipData.Item? = clipData?.getItemAt(0)
|
||||
// return when {
|
||||
// item?.text != null -> {
|
||||
// commitText(item.text.toString())
|
||||
// }
|
||||
// item?.uri != null -> {
|
||||
// commitContent(item.uri, clipData.description)
|
||||
// }
|
||||
// else -> {
|
||||
// false
|
||||
// }
|
||||
// }
|
||||
sendSystemKeyEventCtrl(KeyEvent.KEYCODE_V)
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs an enter key press on the current input editor.
|
||||
*
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun performEnter(): Boolean {
|
||||
return if (isRawInputEditor) {
|
||||
sendSystemKeyEvent(KeyEvent.KEYCODE_ENTER)
|
||||
} else {
|
||||
commitText("\n")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -296,7 +481,7 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
*
|
||||
* @param action The action to be performed on this editor instance.
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun performEnterAction(action: ImeOptions.Action): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
@@ -306,11 +491,10 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
/**
|
||||
* Sends a given [keyCode] as a [KeyEvent.ACTION_DOWN].
|
||||
*
|
||||
* @param ic The input connection on which this operation should be performed.
|
||||
* @param keyCode The key code to send, use a key code defined in Android's [KeyEvent], not in
|
||||
* [KeyCode] or this call may send a weird character, as this key codes do not match!!
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun sendSystemKeyEvent(keyCode: Int): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
@@ -320,11 +504,10 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
/**
|
||||
* Sends a given [keyCode] as a [KeyEvent.ACTION_DOWN] with ALT pressed.
|
||||
*
|
||||
* @param ic The input connection on which this operation should be performed.
|
||||
* @param keyCode The key code to send, use a key code defined in Android's [KeyEvent], not in
|
||||
* [KeyCode] or this call may send a weird character, as this key codes do not match!!
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun sendSystemKeyEventAlt(keyCode: Int): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
@@ -339,21 +522,127 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a given [keyCode] with Ctrl pressed with [sendDownUpKeyEvents]
|
||||
*
|
||||
* @param keyCode The key code to send, use a key code defined in Android's [KeyEvent], not in
|
||||
* [KeyCode] or this call may send a weird character, as this key codes do not match!!
|
||||
*/
|
||||
fun sendSystemKeyEventCtrl(keyCode: Int) {
|
||||
val ic = ims?.currentInputConnection ?: return
|
||||
sendDownUpKeyEvents(keyCode, KeyEvent.META_CTRL_ON)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sends a given [keyCode] with Ctrl and Shift pressed with [sendDownUpKeyEvents]
|
||||
*
|
||||
* @param keyCode The key code to send, use a key code defined in Android's [KeyEvent], not in
|
||||
* [KeyCode] or this call may send a weird character, as this key codes do not match!!
|
||||
*/
|
||||
fun sendSystemKeyEventCtrlShift(keyCode: Int) {
|
||||
val ic = ims?.currentInputConnection ?: return
|
||||
sendDownUpKeyEvents(keyCode, KeyEvent.META_SHIFT_ON or KeyEvent.META_CTRL_ON)
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as [InputMethodService.sendDownUpKeyEvents] but also allows to set metaStae
|
||||
*
|
||||
* @param keyEventCode The key code to send, use a key code defined in Android's [KeyEvent]
|
||||
* @param metaState Flags indicating which meta keys are currently pressed.
|
||||
*/
|
||||
fun sendDownUpKeyEvents(keyEventCode: Int, metaState: Int) {
|
||||
val ic = ims?.currentInputConnection ?: return
|
||||
val eventTime = SystemClock.uptimeMillis()
|
||||
ic.sendKeyEvent(
|
||||
KeyEvent(
|
||||
eventTime,
|
||||
eventTime,
|
||||
KeyEvent.ACTION_DOWN,
|
||||
keyEventCode,
|
||||
0,
|
||||
metaState,
|
||||
KeyCharacterMap.VIRTUAL_KEYBOARD,
|
||||
0,
|
||||
KeyEvent.FLAG_SOFT_KEYBOARD or KeyEvent.FLAG_KEEP_TOUCH_MODE
|
||||
)
|
||||
)
|
||||
ic.sendKeyEvent(
|
||||
KeyEvent(
|
||||
eventTime,
|
||||
SystemClock.uptimeMillis(),
|
||||
KeyEvent.ACTION_UP,
|
||||
keyEventCode,
|
||||
0,
|
||||
metaState,
|
||||
KeyCharacterMap.VIRTUAL_KEYBOARD,
|
||||
0,
|
||||
KeyEvent.FLAG_SOFT_KEYBOARD or KeyEvent.FLAG_KEEP_TOUCH_MODE
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the selection region of this instance and notifies the input connection.
|
||||
*
|
||||
* @param from The start index of the selection in characters (inclusive).
|
||||
* @param to The end index of the selection in characters (exclusive).
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
fun setSelection(from: Int, to: Int): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
selection.apply {
|
||||
start = from
|
||||
end = to
|
||||
return if (isRawInputEditor) {
|
||||
selection.apply {
|
||||
start = -1
|
||||
end = -1
|
||||
}
|
||||
false
|
||||
} else {
|
||||
selection.apply {
|
||||
start = from
|
||||
end = to
|
||||
}
|
||||
ic.setSelection(from, to)
|
||||
}
|
||||
return ic.setSelection(from, to)
|
||||
}
|
||||
|
||||
/**
|
||||
*Adds one word on the left of selection to it
|
||||
*
|
||||
* @return True on success, false if no new words are selected
|
||||
*/
|
||||
fun leftAppendWordToSelection(): Boolean{
|
||||
// no words left to select
|
||||
if (selection.start <= 0)
|
||||
return false
|
||||
val stringBeforeSelection = cachedText.substring(
|
||||
0,
|
||||
selection.start
|
||||
)
|
||||
getWordsInString(stringBeforeSelection).last().range.apply {
|
||||
setSelection(first, selection.end)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
*Removes one word on the left from the selection
|
||||
*
|
||||
* @return True on success, false if no new words are deselected
|
||||
*/
|
||||
fun leftPopWordFromSelection(): Boolean{
|
||||
// no words left to pop
|
||||
if (selection.start >= selection.end)
|
||||
return false
|
||||
val stringInsideSelection = cachedText.substring(
|
||||
selection.start,
|
||||
selection.end
|
||||
)
|
||||
getWordsInString(stringInsideSelection).first().range.apply {
|
||||
setSelection(selection.start + last + 1, selection.end)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -362,7 +651,7 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
* deleting only half of an emoji...
|
||||
* Is used primarily in [deleteBackwards].
|
||||
*
|
||||
* @returns The length of the last Unicode character, in Java characters or 0 if the current
|
||||
* @return The length of the last Unicode character, in Java characters or 0 if the current
|
||||
* selection is invalid.
|
||||
*/
|
||||
private fun detectLastUnicodeCharacterLengthBeforeCursor(): Int {
|
||||
@@ -372,7 +661,7 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
var charIndex = 0
|
||||
var charLength = 0
|
||||
var charShouldGlue = false
|
||||
val textToSearch = cachedTextInternal.substring(0, selection.start.coerceAtMost(cachedTextInternal.length))
|
||||
val textToSearch = cachedText.substring(0, selection.start.coerceAtMost(cachedText.length))
|
||||
var i = 0
|
||||
while (i < textToSearch.length) {
|
||||
val cp = textToSearch.codePointAt(i)
|
||||
@@ -397,31 +686,12 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
return textToSearch.length - charIndex
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current text from the app's editor view.
|
||||
*
|
||||
* @returns The target editor's content string.
|
||||
*/
|
||||
private fun fetchExtractedTextFromInputConnection() {
|
||||
val ic = ims?.currentInputConnection ?: return
|
||||
val et = ic.getExtractedText(
|
||||
ExtractedTextRequest(), 0
|
||||
) ?: return
|
||||
val text = et.text ?: ""
|
||||
cachedTextInternal.setLength(0)
|
||||
cachedTextInternal.append(text)
|
||||
selection.apply {
|
||||
start = et.selectionStart.coerceAtMost(cachedTextInternal.length)
|
||||
end = et.selectionEnd.coerceAtMost(cachedTextInternal.length)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks a given [region] as composing and notifies the input connection.
|
||||
*
|
||||
* @param region The region which should be marked as composing.
|
||||
*
|
||||
* @returns True on success, false if an error occurred or the input connection is invalid.
|
||||
* @return True on success, false if an error occurred or the input connection is invalid.
|
||||
*/
|
||||
private fun markComposingRegion(region: Region?): Boolean {
|
||||
val ic = ims?.currentInputConnection ?: return false
|
||||
@@ -442,7 +712,7 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
* @param regex The delimiter regex which should be used to split up the content text and find
|
||||
* words. May differ from locale to locale.
|
||||
*
|
||||
* @returns True on success, false if no current word could be found.
|
||||
* @return True on success, false if no current word could be found.
|
||||
*/
|
||||
private fun reevaluateCurrentWord(regex: Regex): Boolean {
|
||||
var foundValidWord = false
|
||||
@@ -473,12 +743,42 @@ class EditorInstance private constructor(private val ims: InputMethodService?) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers all reevaluation processes.
|
||||
* Evaluates the current word with the correct delimiter regex for current subtype.
|
||||
* TODO: currently only supports en-US
|
||||
*/
|
||||
private fun reevaluate() {
|
||||
private fun reevaluateCurrentWord() {
|
||||
val regex = "[^\\p{L}]".toRegex()
|
||||
reevaluateCurrentWord(regex)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current text from the app's editor view.
|
||||
*
|
||||
* @return The target editor's content string.
|
||||
*/
|
||||
private fun updateEditorState() {
|
||||
val ic = ims?.currentInputConnection
|
||||
val et = ic?.getExtractedText(
|
||||
ExtractedTextRequest(), 0
|
||||
)
|
||||
val text = et?.text
|
||||
if (ic == null || et == null || text == null) {
|
||||
isRawInputEditor = true
|
||||
cachedText = ""
|
||||
selection.apply {
|
||||
start = -1
|
||||
end = -1
|
||||
}
|
||||
} else {
|
||||
isRawInputEditor = false
|
||||
cachedText = text.toString()
|
||||
selection.apply {
|
||||
start = et.selectionStart.coerceAtMost(cachedText.length)
|
||||
end = et.selectionEnd.coerceAtMost(cachedText.length)
|
||||
}
|
||||
}
|
||||
reevaluateCurrentWord()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -498,6 +798,10 @@ class ImeOptions private constructor(imeOptions: Int) {
|
||||
val flagNoPersonalizedLearning: Boolean = imeOptions and EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING > 0
|
||||
|
||||
companion object {
|
||||
fun default(): ImeOptions {
|
||||
return fromImeOptionsInt(EditorInfo.IME_NULL)
|
||||
}
|
||||
|
||||
fun fromImeOptionsInt(imeOptions: Int): ImeOptions {
|
||||
return ImeOptions(imeOptions)
|
||||
}
|
||||
@@ -538,7 +842,7 @@ class ImeOptions private constructor(imeOptions: Int) {
|
||||
PREVIOUS -> EditorInfo.IME_ACTION_PREVIOUS
|
||||
SEARCH -> EditorInfo.IME_ACTION_SEARCH
|
||||
SEND -> EditorInfo.IME_ACTION_SEND
|
||||
UNSPECIFIED-> EditorInfo.IME_ACTION_UNSPECIFIED
|
||||
UNSPECIFIED -> EditorInfo.IME_ACTION_UNSPECIFIED
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Patrick Goldinger
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.patrickgold.florisboard.ime.core
|
||||
|
||||
import android.app.Application
|
||||
import dev.patrickgold.florisboard.BuildConfig
|
||||
import dev.patrickgold.florisboard.crashutility.CrashUtility
|
||||
import timber.log.Timber
|
||||
|
||||
class FlorisApplication : Application() {
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
CrashUtility.install(this)
|
||||
if (BuildConfig.DEBUG)
|
||||
Timber.plant(Timber.DebugTree())
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.res.ColorStateList
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Color
|
||||
import android.inputmethodservice.InputMethodService
|
||||
import android.media.AudioManager
|
||||
import android.os.*
|
||||
@@ -41,8 +42,11 @@ import dev.patrickgold.florisboard.ime.text.TextInputManager
|
||||
import dev.patrickgold.florisboard.ime.text.gestures.SwipeAction
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyCode
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyData
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardMode
|
||||
import dev.patrickgold.florisboard.settings.SettingsMainActivity
|
||||
import dev.patrickgold.florisboard.util.*
|
||||
import timber.log.Timber
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
/**
|
||||
* Variable which holds the current [FlorisBoard] instance. To get this instance from another
|
||||
@@ -54,7 +58,7 @@ private var florisboardInstance: FlorisBoard? = null
|
||||
* Core class responsible to link together both the text and media input managers as well as
|
||||
* managing the one-handed UI.
|
||||
*/
|
||||
class FlorisBoard : InputMethodService() {
|
||||
class FlorisBoard : InputMethodService(), ClipboardManager.OnPrimaryClipChangedListener {
|
||||
lateinit var prefs: PrefHelper
|
||||
private set
|
||||
|
||||
@@ -63,7 +67,7 @@ class FlorisBoard : InputMethodService() {
|
||||
var inputView: InputView? = null
|
||||
private set
|
||||
private var inputWindowView: InputWindowView? = null
|
||||
private var eventListeners: MutableList<EventListener> = mutableListOf()
|
||||
private var eventListeners: MutableList<WeakReference<EventListener?>?> = mutableListOf()
|
||||
|
||||
private var audioManager: AudioManager? = null
|
||||
var clipboardManager: ClipboardManager? = null
|
||||
@@ -76,6 +80,7 @@ class FlorisBoard : InputMethodService() {
|
||||
lateinit var activeSubtype: Subtype
|
||||
private var currentThemeIsNight: Boolean = false
|
||||
private var currentThemeResId: Int = 0
|
||||
private var isNumberRowVisible: Boolean = false
|
||||
|
||||
val textInputManager: TextInputManager
|
||||
val mediaInputManager: MediaInputManager
|
||||
@@ -89,15 +94,22 @@ class FlorisBoard : InputMethodService() {
|
||||
|
||||
companion object {
|
||||
private const val IME_ID: String = "dev.patrickgold.florisboard/.ime.core.FlorisBoard"
|
||||
private val TAG: String? = FlorisBoard::class.simpleName
|
||||
private const val IME_ID_DEBUG: String = "dev.patrickgold.florisboard.debug/dev.patrickgold.florisboard.ime.core.FlorisBoard"
|
||||
|
||||
fun checkIfImeIsEnabled(context: Context): Boolean {
|
||||
val activeImeIds = Settings.Secure.getString(
|
||||
context.contentResolver,
|
||||
Settings.Secure.ENABLED_INPUT_METHODS
|
||||
)
|
||||
if (BuildConfig.DEBUG) Log.i(FlorisBoard::class.simpleName, "List of active IMEs: $activeImeIds")
|
||||
return activeImeIds.split(":").contains(IME_ID)
|
||||
Timber.i("List of active IMEs: $activeImeIds")
|
||||
return when {
|
||||
BuildConfig.DEBUG -> {
|
||||
activeImeIds.split(":").contains(IME_ID_DEBUG)
|
||||
}
|
||||
else -> {
|
||||
activeImeIds.split(":").contains(IME_ID)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun checkIfImeIsSelected(context: Context): Boolean {
|
||||
@@ -105,8 +117,15 @@ class FlorisBoard : InputMethodService() {
|
||||
context.contentResolver,
|
||||
Settings.Secure.DEFAULT_INPUT_METHOD
|
||||
)
|
||||
if (BuildConfig.DEBUG) Log.i(FlorisBoard::class.simpleName, "Selected IME: $selectedImeId")
|
||||
return selectedImeId == IME_ID
|
||||
Timber.i("Selected IME: $selectedImeId")
|
||||
return when {
|
||||
BuildConfig.DEBUG -> {
|
||||
selectedImeId == IME_ID_DEBUG
|
||||
}
|
||||
else -> {
|
||||
selectedImeId == IME_ID
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
@@ -146,10 +165,11 @@ class FlorisBoard : InputMethodService() {
|
||||
.build()
|
||||
)
|
||||
}
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onCreate()")
|
||||
Timber.i("onCreate()")
|
||||
|
||||
audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
||||
clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||
clipboardManager?.addPrimaryClipChangedListener(this)
|
||||
vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
|
||||
prefs = PrefHelper.getDefaultInstance(this)
|
||||
prefs.initDefaultPreferences()
|
||||
@@ -159,30 +179,31 @@ class FlorisBoard : InputMethodService() {
|
||||
|
||||
currentThemeIsNight = prefs.internal.themeCurrentIsNight
|
||||
currentThemeResId = getDayNightBaseThemeId(currentThemeIsNight)
|
||||
isNumberRowVisible = prefs.keyboard.numberRow
|
||||
setTheme(currentThemeResId)
|
||||
updateTheme()
|
||||
|
||||
AppVersionUtils.updateVersionOnInstallAndLastUse(this, prefs)
|
||||
|
||||
super.onCreate()
|
||||
eventListeners.toList().forEach { it.onCreate() }
|
||||
eventListeners.toList().forEach { it?.get()?.onCreate() }
|
||||
}
|
||||
|
||||
@SuppressLint("InflateParams")
|
||||
override fun onCreateInputView(): View? {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onCreateInputView()")
|
||||
Timber.i("onCreateInputView()")
|
||||
|
||||
baseContext.setTheme(currentThemeResId)
|
||||
|
||||
inputWindowView = layoutInflater.inflate(R.layout.florisboard, null) as InputWindowView
|
||||
|
||||
eventListeners.toList().forEach { it.onCreateInputView() }
|
||||
eventListeners.toList().forEach { it?.get()?.onCreateInputView() }
|
||||
|
||||
return inputWindowView
|
||||
}
|
||||
|
||||
fun registerInputView(inputView: InputView) {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "registerInputView($inputView)")
|
||||
Timber.i("registerInputView($inputView)")
|
||||
|
||||
this.inputView = inputView
|
||||
initializeOneHandedEnvironment()
|
||||
@@ -190,60 +211,66 @@ class FlorisBoard : InputMethodService() {
|
||||
updateSoftInputWindowLayoutParameters()
|
||||
updateOneHandedPanelVisibility()
|
||||
|
||||
eventListeners.toList().forEach { it.onRegisterInputView(inputView) }
|
||||
eventListeners.toList().forEach { it?.get()?.onRegisterInputView(inputView) }
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onDestroy()")
|
||||
Timber.i("onDestroy()")
|
||||
|
||||
clipboardManager?.removePrimaryClipChangedListener(this)
|
||||
osHandler.removeCallbacksAndMessages(null)
|
||||
florisboardInstance = null
|
||||
|
||||
eventListeners.toList().forEach { it.onDestroy() }
|
||||
eventListeners.toList().forEach { it?.get()?.onDestroy() }
|
||||
eventListeners.clear()
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onStartInput(attribute: EditorInfo?, restarting: Boolean) {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onStartInput($attribute, $restarting)")
|
||||
Timber.i("onStartInput($attribute, $restarting)")
|
||||
|
||||
super.onStartInput(attribute, restarting)
|
||||
currentInputConnection?.requestCursorUpdates(InputConnection.CURSOR_UPDATE_IMMEDIATE)
|
||||
}
|
||||
|
||||
override fun onStartInputView(info: EditorInfo?, restarting: Boolean) {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onStartInputView($info, $restarting)")
|
||||
Log.i(TAG, "onStartInputView: " + info?.debugSummarize())
|
||||
Timber.i("onStartInputView($info, $restarting)")
|
||||
Timber.i("onStartInputView: ${info?.debugSummarize()}")
|
||||
|
||||
super.onStartInputView(info, restarting)
|
||||
activeEditorInstance = EditorInstance.from(info, this)
|
||||
eventListeners.toList().forEach {
|
||||
it.onStartInputView(activeEditorInstance, restarting)
|
||||
it?.get()?.onStartInputView(activeEditorInstance, restarting)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFinishInputView(finishingInput: Boolean) {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onFinishInputView($finishingInput)")
|
||||
Timber.i( "onFinishInputView($finishingInput)")
|
||||
|
||||
if (finishingInput) {
|
||||
activeEditorInstance = EditorInstance.default()
|
||||
}
|
||||
|
||||
super.onFinishInputView(finishingInput)
|
||||
eventListeners.toList().forEach { it.onFinishInputView(finishingInput) }
|
||||
eventListeners.toList().forEach { it?.get()?.onFinishInputView(finishingInput) }
|
||||
}
|
||||
|
||||
override fun onFinishInput() {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onFinishInput()")
|
||||
Timber.i("onFinishInput()")
|
||||
|
||||
super.onFinishInput()
|
||||
currentInputConnection?.requestCursorUpdates(0)
|
||||
}
|
||||
|
||||
override fun onWindowShown() {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onWindowShown()")
|
||||
Timber.i("onWindowShown()")
|
||||
|
||||
prefs.sync()
|
||||
val newIsNumberRowVisible = prefs.keyboard.numberRow
|
||||
if (isNumberRowVisible != newIsNumberRowVisible) {
|
||||
textInputManager.layoutManager.clearLayoutCache(KeyboardMode.CHARACTERS)
|
||||
isNumberRowVisible = newIsNumberRowVisible
|
||||
}
|
||||
updateTheme()
|
||||
updateOneHandedPanelVisibility()
|
||||
activeSubtype = subtypeManager.getActiveSubtype() ?: Subtype.DEFAULT
|
||||
@@ -251,18 +278,18 @@ class FlorisBoard : InputMethodService() {
|
||||
setActiveInput(R.id.text_input)
|
||||
|
||||
super.onWindowShown()
|
||||
eventListeners.toList().forEach { it.onWindowShown() }
|
||||
eventListeners.toList().forEach { it?.get()?.onWindowShown() }
|
||||
}
|
||||
|
||||
override fun onWindowHidden() {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onWindowHidden()")
|
||||
Timber.i("onWindowHidden()")
|
||||
|
||||
super.onWindowHidden()
|
||||
eventListeners.toList().forEach { it.onWindowHidden() }
|
||||
eventListeners.toList().forEach { it?.get()?.onWindowHidden() }
|
||||
}
|
||||
|
||||
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onConfigurationChanged($newConfig)")
|
||||
Timber.i("onConfigurationChanged($newConfig)")
|
||||
if (isInputViewShown) {
|
||||
updateOneHandedPanelVisibility()
|
||||
}
|
||||
@@ -275,7 +302,7 @@ class FlorisBoard : InputMethodService() {
|
||||
newSelStart: Int, newSelEnd: Int,
|
||||
candidatesStart: Int, candidatesEnd: Int
|
||||
) {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onUpdateSelection($oldSelStart, $oldSelEnd, $newSelStart, $newSelEnd, $candidatesStart, $candidatesEnd)")
|
||||
Timber.i("onUpdateSelection($oldSelStart, $oldSelEnd, $newSelStart, $newSelEnd, $candidatesStart, $candidatesEnd)")
|
||||
|
||||
super.onUpdateSelection(
|
||||
oldSelStart, oldSelEnd,
|
||||
@@ -286,13 +313,17 @@ class FlorisBoard : InputMethodService() {
|
||||
oldSelStart, oldSelEnd,
|
||||
newSelStart, newSelEnd
|
||||
)
|
||||
eventListeners.toList().forEach { it.onUpdateSelection() }
|
||||
eventListeners.toList().forEach { it?.get()?.onUpdateSelection() }
|
||||
}
|
||||
|
||||
/**
|
||||
* Reapplies the supplies colors and settings from prefs to navigation bar.
|
||||
* Updates the theme of the IME Window, status and navigation bar, as well as the InputView and
|
||||
* some of its components.
|
||||
*/
|
||||
private fun updateTheme() {
|
||||
// Rebuild the UI if the theme has changed from day to night or vice versa to prevent
|
||||
// theme glitches with scrollbars and hints of buttons in the media UI. If the UI must be
|
||||
// rebuild, quit this method, as it will be called again by the newly created UI.
|
||||
val newThemeIsNightMode = prefs.internal.themeCurrentIsNight
|
||||
if (currentThemeIsNight != newThemeIsNightMode) {
|
||||
currentThemeResId = getDayNightBaseThemeId(newThemeIsNightMode)
|
||||
@@ -300,29 +331,43 @@ class FlorisBoard : InputMethodService() {
|
||||
setInputView(onCreateInputView())
|
||||
return
|
||||
}
|
||||
|
||||
// Get Window and the flags of the DecorView
|
||||
val w = window?.window ?: return
|
||||
inputView?.setBackgroundColor(prefs.theme.keyboardBgColor)
|
||||
var flags = w.decorView.systemUiVisibility
|
||||
|
||||
// Update navigation bar theme
|
||||
w.navigationBarColor = prefs.theme.navBarColor
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
|
||||
var flags = w.decorView.systemUiVisibility
|
||||
flags = if (prefs.theme.navBarIsLight) {
|
||||
flags or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
|
||||
} else {
|
||||
flags and View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv()
|
||||
}
|
||||
w.decorView.systemUiVisibility = flags
|
||||
}
|
||||
|
||||
// Update status bar to be transparent
|
||||
// Done as starting with Android 11 the IME Window takes the primaryColorDark value and
|
||||
// colors the status bar, which isn't the desired behavior. (See issue #43)
|
||||
flags = flags or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
||||
w.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
||||
w.statusBarColor = Color.TRANSPARENT
|
||||
|
||||
// Apply the new flags to the DecorView
|
||||
w.decorView.systemUiVisibility = flags
|
||||
|
||||
// Update InputView theme
|
||||
inputView?.setBackgroundColor(prefs.theme.keyboardBgColor)
|
||||
inputView?.oneHandedCtrlPanelStart?.setBackgroundColor(prefs.theme.oneHandedBgColor)
|
||||
inputView?.oneHandedCtrlPanelEnd?.setBackgroundColor(prefs.theme.oneHandedBgColor)
|
||||
inputView?.findViewById<ImageButton>(R.id.one_handed_ctrl_move_start)
|
||||
?.imageTintList = ColorStateList.valueOf(prefs.theme.oneHandedButtonFgColor)
|
||||
inputView?.findViewById<ImageButton>(R.id.one_handed_ctrl_move_end)
|
||||
?.imageTintList = ColorStateList.valueOf(prefs.theme.oneHandedButtonFgColor)
|
||||
inputView?.findViewById<ImageButton>(R.id.one_handed_ctrl_close_start)
|
||||
?.imageTintList = ColorStateList.valueOf(prefs.theme.oneHandedButtonFgColor)
|
||||
inputView?.findViewById<ImageButton>(R.id.one_handed_ctrl_close_end)
|
||||
?.imageTintList = ColorStateList.valueOf(prefs.theme.oneHandedButtonFgColor)
|
||||
eventListeners.toList().forEach { it.onApplyThemeAttributes() }
|
||||
ColorStateList.valueOf(prefs.theme.oneHandedButtonFgColor).also {
|
||||
inputView?.oneHandedCtrlMoveStart?.imageTintList = it
|
||||
inputView?.oneHandedCtrlMoveEnd?.imageTintList = it
|
||||
inputView?.oneHandedCtrlCloseStart?.imageTintList = it
|
||||
inputView?.oneHandedCtrlCloseEnd?.imageTintList = it
|
||||
}
|
||||
eventListeners.toList().forEach { it?.get()?.onApplyThemeAttributes() }
|
||||
}
|
||||
|
||||
override fun onComputeInsets(outInsets: Insets?) {
|
||||
@@ -470,14 +515,12 @@ class FlorisBoard : InputMethodService() {
|
||||
}
|
||||
|
||||
private fun initializeOneHandedEnvironment() {
|
||||
inputView?.findViewById<ImageButton>(R.id.one_handed_ctrl_move_start)
|
||||
?.setOnClickListener { v -> onOneHandedPanelButtonClick(v) }
|
||||
inputView?.findViewById<ImageButton>(R.id.one_handed_ctrl_move_end)
|
||||
?.setOnClickListener { v -> onOneHandedPanelButtonClick(v) }
|
||||
inputView?.findViewById<ImageButton>(R.id.one_handed_ctrl_close_start)
|
||||
?.setOnClickListener { v -> onOneHandedPanelButtonClick(v) }
|
||||
inputView?.findViewById<ImageButton>(R.id.one_handed_ctrl_close_end)
|
||||
?.setOnClickListener { v -> onOneHandedPanelButtonClick(v) }
|
||||
{ v:View -> onOneHandedPanelButtonClick(v) }.also {
|
||||
inputView?.oneHandedCtrlMoveStart?.setOnClickListener(it)
|
||||
inputView?.oneHandedCtrlMoveEnd?.setOnClickListener(it)
|
||||
inputView?.oneHandedCtrlCloseStart?.setOnClickListener(it)
|
||||
inputView?.oneHandedCtrlCloseEnd?.setOnClickListener(it)
|
||||
}
|
||||
}
|
||||
|
||||
private fun onOneHandedPanelButtonClick(v: View) {
|
||||
@@ -534,25 +577,36 @@ class FlorisBoard : InputMethodService() {
|
||||
}, 0)
|
||||
}
|
||||
|
||||
override fun onPrimaryClipChanged() {
|
||||
eventListeners.toList().forEach { it?.get()?.onPrimaryClipChanged() }
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a given [listener] to the list which will receive FlorisBoard events.
|
||||
*
|
||||
* @param listener The listener object which receives the events.
|
||||
* @returns True if the listener has been added successfully, false otherwise.
|
||||
* @return True if the listener has been added successfully, false otherwise.
|
||||
*/
|
||||
fun addEventListener(listener: EventListener): Boolean {
|
||||
return eventListeners.add(listener)
|
||||
return eventListeners.add(WeakReference(listener))
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a given [listener] from the list which will receive FlorisBoard events.
|
||||
*
|
||||
* TODO: implement this function with a proper iterator
|
||||
*
|
||||
* @param listener The same listener object which was used in [addEventListener].
|
||||
* @returns True if the listener has been removed successfully, false otherwise. A false return
|
||||
* @return True if the listener has been removed successfully, false otherwise. A false return
|
||||
* value may also indicate that the [listener] was not added previously.
|
||||
*/
|
||||
fun removeEventListener(listener: EventListener): Boolean {
|
||||
return eventListeners.remove(listener)
|
||||
eventListeners.toList().forEach {
|
||||
if (it?.get() == listener) {
|
||||
return eventListeners.remove(it)
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
interface EventListener {
|
||||
@@ -570,6 +624,7 @@ class FlorisBoard : InputMethodService() {
|
||||
fun onUpdateSelection() {}
|
||||
|
||||
fun onApplyThemeAttributes() {}
|
||||
fun onPrimaryClipChanged() {}
|
||||
fun onSubtypeChanged(newSubtype: Subtype) {}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,12 +19,17 @@ package dev.patrickgold.florisboard.ime.core
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import android.util.AttributeSet
|
||||
import android.util.DisplayMetrics
|
||||
import android.util.Log
|
||||
import android.widget.ImageButton
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.ViewFlipper
|
||||
import dev.patrickgold.florisboard.BuildConfig
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyVariation
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardMode
|
||||
import dev.patrickgold.florisboard.util.ViewLayoutUtils
|
||||
import timber.log.Timber
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
/**
|
||||
@@ -34,13 +39,13 @@ class InputView : LinearLayout {
|
||||
private var florisboard: FlorisBoard = FlorisBoard.getInstance()
|
||||
private val prefs: PrefHelper = PrefHelper.getDefaultInstance(context)
|
||||
|
||||
var desiredInputViewHeight: Int = resources.getDimension(R.dimen.inputView_baseHeight).roundToInt()
|
||||
var desiredInputViewHeight: Float = resources.getDimension(R.dimen.inputView_baseHeight)
|
||||
private set
|
||||
var desiredSmartbarHeight: Int = resources.getDimension(R.dimen.smartbar_baseHeight).roundToInt()
|
||||
var desiredSmartbarHeight: Float = resources.getDimension(R.dimen.smartbar_baseHeight)
|
||||
private set
|
||||
var desiredTextKeyboardViewHeight: Int = resources.getDimension(R.dimen.textKeyboardView_baseHeight).roundToInt()
|
||||
var desiredTextKeyboardViewHeight: Float = resources.getDimension(R.dimen.textKeyboardView_baseHeight)
|
||||
private set
|
||||
var desiredMediaKeyboardViewHeight: Int = resources.getDimension(R.dimen.mediaKeyboardView_baseHeight).roundToInt()
|
||||
var desiredMediaKeyboardViewHeight: Float = resources.getDimension(R.dimen.mediaKeyboardView_baseHeight)
|
||||
private set
|
||||
|
||||
var mainViewFlipper: ViewFlipper? = null
|
||||
@@ -49,26 +54,42 @@ class InputView : LinearLayout {
|
||||
private set
|
||||
var oneHandedCtrlPanelEnd: LinearLayout? = null
|
||||
private set
|
||||
var oneHandedCtrlMoveStart: ImageButton? = null
|
||||
private set
|
||||
var oneHandedCtrlMoveEnd: ImageButton? = null
|
||||
private set
|
||||
var oneHandedCtrlCloseStart: ImageButton? = null
|
||||
private set
|
||||
var oneHandedCtrlCloseEnd: ImageButton? = null
|
||||
private set
|
||||
|
||||
constructor(context: Context) : this(context, null)
|
||||
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
|
||||
context,
|
||||
attrs,
|
||||
defStyleAttr
|
||||
)
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
if (BuildConfig.DEBUG) Log.i(this::class.simpleName, "onAttachedToWindow()")
|
||||
Timber.i("onAttachedToWindow()")
|
||||
|
||||
super.onAttachedToWindow()
|
||||
|
||||
mainViewFlipper = findViewById(R.id.main_view_flipper)
|
||||
oneHandedCtrlPanelStart = findViewById(R.id.one_handed_ctrl_panel_start)
|
||||
oneHandedCtrlPanelEnd = findViewById(R.id.one_handed_ctrl_panel_end)
|
||||
oneHandedCtrlMoveStart = findViewById(R.id.one_handed_ctrl_move_start)
|
||||
oneHandedCtrlMoveEnd = findViewById(R.id.one_handed_ctrl_move_end)
|
||||
oneHandedCtrlCloseStart = findViewById(R.id.one_handed_ctrl_close_start)
|
||||
oneHandedCtrlCloseEnd = findViewById(R.id.one_handed_ctrl_close_end)
|
||||
|
||||
florisboard.registerInputView(this)
|
||||
}
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
val heightFactor = when (resources.configuration.orientation) {
|
||||
Configuration.ORIENTATION_LANDSCAPE -> 0.85f
|
||||
Configuration.ORIENTATION_LANDSCAPE -> 1.0f
|
||||
else -> if (prefs.keyboard.oneHandedMode != "off") {
|
||||
0.9f
|
||||
} else {
|
||||
@@ -82,17 +103,71 @@ class InputView : LinearLayout {
|
||||
"mid_tall" -> 1.05f
|
||||
"tall" -> 1.10f
|
||||
"extra_tall" -> 1.15f
|
||||
"custom" -> prefs.keyboard.heightFactorCustom.toFloat() / 100.0f
|
||||
else -> 1.00f
|
||||
}
|
||||
var height = (resources.getDimension(R.dimen.inputView_baseHeight) * heightFactor).roundToInt()
|
||||
desiredInputViewHeight = height
|
||||
desiredSmartbarHeight = (0.16129 * height).roundToInt()
|
||||
desiredTextKeyboardViewHeight = height - desiredSmartbarHeight
|
||||
desiredMediaKeyboardViewHeight = height
|
||||
var baseHeight = calcInputViewHeight() * heightFactor
|
||||
var baseSmartbarHeight = 0.16129f * baseHeight
|
||||
var baseTextInputHeight = baseHeight - baseSmartbarHeight
|
||||
val tim = florisboard.textInputManager
|
||||
val shouldGiveAdditionalSpace = prefs.keyboard.numberRow &&
|
||||
!(tim.getActiveKeyboardMode() == KeyboardMode.NUMERIC ||
|
||||
tim.getActiveKeyboardMode() == KeyboardMode.PHONE ||
|
||||
tim.getActiveKeyboardMode() == KeyboardMode.PHONE2)
|
||||
if (shouldGiveAdditionalSpace) {
|
||||
val additionalHeight = desiredTextKeyboardViewHeight * 0.18f
|
||||
baseHeight += additionalHeight
|
||||
baseTextInputHeight += additionalHeight
|
||||
}
|
||||
val smartbarDisabled = !prefs.smartbar.enabled ||
|
||||
tim.keyVariation == KeyVariation.PASSWORD && prefs.keyboard.numberRow ||
|
||||
tim.getActiveKeyboardMode() == KeyboardMode.NUMERIC ||
|
||||
tim.getActiveKeyboardMode() == KeyboardMode.PHONE ||
|
||||
tim.getActiveKeyboardMode() == KeyboardMode.PHONE2
|
||||
if (smartbarDisabled) {
|
||||
baseHeight = baseTextInputHeight
|
||||
baseSmartbarHeight = 0.0f
|
||||
}
|
||||
desiredInputViewHeight = baseHeight
|
||||
desiredSmartbarHeight = baseSmartbarHeight
|
||||
desiredTextKeyboardViewHeight = baseTextInputHeight
|
||||
desiredMediaKeyboardViewHeight = baseHeight
|
||||
// Add bottom offset for curved screens here. As the desired heights have already been set,
|
||||
// adding a value to the height now will result in a bottom padding (aka offset).
|
||||
height += ViewLayoutUtils.convertDpToPixel(florisboard.prefs.keyboard.bottomOffset.toFloat(), context).toInt()
|
||||
baseHeight += ViewLayoutUtils.convertDpToPixel(
|
||||
florisboard.prefs.keyboard.bottomOffset.toFloat(),
|
||||
context
|
||||
)
|
||||
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY))
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(baseHeight.roundToInt(), MeasureSpec.EXACTLY))
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the input view height based on the current screen dimensions and the auto
|
||||
* selected dimension values.
|
||||
*
|
||||
* This method and the fraction values have been inspired by [OpenBoard](https://github.com/dslul/openboard)
|
||||
* but are not 1:1 the same. This implementation differs from the
|
||||
* [original](https://github.com/dslul/openboard/blob/90ae4c8aec034a8935e1fd02b441be25c7dba6ce/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ResourceUtils.java)
|
||||
* by calculating the average of the min and max height values, then taking at least the input
|
||||
* view base height and return this resulting value.
|
||||
*/
|
||||
private fun calcInputViewHeight(): Float {
|
||||
val dm: DisplayMetrics = resources.displayMetrics
|
||||
val minBaseSize: Float = when (resources.configuration.orientation) {
|
||||
Configuration.ORIENTATION_LANDSCAPE -> resources.getFraction(
|
||||
R.fraction.inputView_minHeightFraction, dm.heightPixels, dm.heightPixels
|
||||
)
|
||||
else -> resources.getFraction(
|
||||
R.fraction.inputView_minHeightFraction, dm.widthPixels, dm.widthPixels
|
||||
)
|
||||
}
|
||||
val maxBaseSize: Float = resources.getFraction(
|
||||
R.fraction.inputView_maxHeightFraction, dm.heightPixels, dm.heightPixels
|
||||
)
|
||||
return ((minBaseSize + maxBaseSize) / 2.0f).coerceAtLeast(
|
||||
resources.getDimension(R.dimen.inputView_baseHeight)
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.text.gestures.DistanceThreshold
|
||||
import dev.patrickgold.florisboard.ime.text.gestures.SwipeAction
|
||||
import dev.patrickgold.florisboard.ime.text.gestures.VelocityThreshold
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyHintMode
|
||||
import dev.patrickgold.florisboard.util.VersionName
|
||||
import kotlin.collections.HashMap
|
||||
|
||||
@@ -45,6 +46,7 @@ class PrefHelper(
|
||||
val internal = Internal(this)
|
||||
val keyboard = Keyboard(this)
|
||||
val localization = Localization(this)
|
||||
val smartbar = Smartbar(this)
|
||||
val suggestion = Suggestion(this)
|
||||
val theme = Theme(this)
|
||||
|
||||
@@ -165,6 +167,7 @@ class PrefHelper(
|
||||
companion object {
|
||||
const val SETTINGS_THEME = "advanced__settings_theme"
|
||||
const val SHOW_APP_ICON = "advanced__show_app_icon"
|
||||
const val FORCE_PRIVATE_MODE = "advanced__force_private_mode"
|
||||
}
|
||||
|
||||
var settingsTheme: String = ""
|
||||
@@ -173,6 +176,9 @@ class PrefHelper(
|
||||
var showAppIcon: Boolean = false
|
||||
get() = prefHelper.getPref(SHOW_APP_ICON, true)
|
||||
private set
|
||||
var forcePrivateMode: Boolean
|
||||
get() = prefHelper.getPref(FORCE_PRIVATE_MODE, false)
|
||||
set(v) = prefHelper.setPref(FORCE_PRIVATE_MODE, v)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -301,34 +307,50 @@ class PrefHelper(
|
||||
*/
|
||||
class Keyboard(private val prefHelper: PrefHelper) {
|
||||
companion object {
|
||||
const val BOTTOM_OFFSET = "keyboard__bottom_offset"
|
||||
const val HEIGHT_FACTOR = "keyboard__height_factor"
|
||||
const val HINTED_NUMBER_ROW = "keyboard__hinted_number_row"
|
||||
const val HINTED_SYMBOLS = "keyboard__hinted_symbols"
|
||||
const val LONG_PRESS_DELAY = "keyboard__long_press_delay"
|
||||
const val ONE_HANDED_MODE = "keyboard__one_handed_mode"
|
||||
const val POPUP_ENABLED = "keyboard__popup_enabled"
|
||||
const val SOUND_ENABLED = "keyboard__sound_enabled"
|
||||
const val SOUND_VOLUME = "keyboard__sound_volume"
|
||||
const val VIBRATION_ENABLED = "keyboard__vibration_enabled"
|
||||
const val VIBRATION_STRENGTH = "keyboard__vibration_strength"
|
||||
const val BOTTOM_OFFSET = "keyboard__bottom_offset"
|
||||
const val FONT_SIZE_MULTIPLIER_PORTRAIT = "keyboard__font_size_multiplier_portrait"
|
||||
const val FONT_SIZE_MULTIPLIER_LANDSCAPE = "keyboard__font_size_multiplier_landscape"
|
||||
const val HEIGHT_FACTOR = "keyboard__height_factor"
|
||||
const val HEIGHT_FACTOR_CUSTOM = "keyboard__height_factor_custom"
|
||||
const val HINTED_NUMBER_ROW_MODE = "keyboard__hinted_number_row_mode"
|
||||
const val HINTED_SYMBOLS_MODE = "keyboard__hinted_symbols_mode"
|
||||
const val LONG_PRESS_DELAY = "keyboard__long_press_delay"
|
||||
const val NUMBER_ROW = "keyboard__number_row"
|
||||
const val ONE_HANDED_MODE = "keyboard__one_handed_mode"
|
||||
const val POPUP_ENABLED = "keyboard__popup_enabled"
|
||||
const val SOUND_ENABLED = "keyboard__sound_enabled"
|
||||
const val SOUND_VOLUME = "keyboard__sound_volume"
|
||||
const val VIBRATION_ENABLED = "keyboard__vibration_enabled"
|
||||
const val VIBRATION_STRENGTH = "keyboard__vibration_strength"
|
||||
}
|
||||
|
||||
var bottomOffset: Int = 0
|
||||
get() = prefHelper.getPref(BOTTOM_OFFSET, 0)
|
||||
private set
|
||||
var fontSizeMultiplierPortrait: Int
|
||||
get() = prefHelper.getPref(FONT_SIZE_MULTIPLIER_PORTRAIT, 100)
|
||||
set(v) = prefHelper.setPref(FONT_SIZE_MULTIPLIER_PORTRAIT, v)
|
||||
var fontSizeMultiplierLandscape: Int
|
||||
get() = prefHelper.getPref(FONT_SIZE_MULTIPLIER_LANDSCAPE, 100)
|
||||
set(v) = prefHelper.setPref(FONT_SIZE_MULTIPLIER_LANDSCAPE, v)
|
||||
var heightFactor: String = ""
|
||||
get() = prefHelper.getPref(HEIGHT_FACTOR, "normal")
|
||||
private set
|
||||
var hintedNumberRow: Boolean
|
||||
get() = prefHelper.getPref(HINTED_NUMBER_ROW, true)
|
||||
set(v) = prefHelper.setPref(HINTED_NUMBER_ROW, v)
|
||||
var hintedSymbols: Boolean
|
||||
get() = prefHelper.getPref(HINTED_SYMBOLS, true)
|
||||
set(v) = prefHelper.setPref(HINTED_SYMBOLS, v)
|
||||
var heightFactorCustom: Int
|
||||
get() = prefHelper.getPref(HEIGHT_FACTOR_CUSTOM, 100)
|
||||
set(v) = prefHelper.setPref(HEIGHT_FACTOR_CUSTOM, v)
|
||||
var hintedNumberRowMode: KeyHintMode
|
||||
get() = KeyHintMode.fromString(prefHelper.getPref(HINTED_NUMBER_ROW_MODE, KeyHintMode.ENABLED_ACCENT_PRIORITY.toString()))
|
||||
set(v) = prefHelper.setPref(HINTED_NUMBER_ROW_MODE, v)
|
||||
var hintedSymbolsMode: KeyHintMode
|
||||
get() = KeyHintMode.fromString(prefHelper.getPref(HINTED_SYMBOLS_MODE, KeyHintMode.ENABLED_ACCENT_PRIORITY.toString()))
|
||||
set(v) = prefHelper.setPref(HINTED_SYMBOLS_MODE, v)
|
||||
var longPressDelay: Int = 0
|
||||
get() = prefHelper.getPref(LONG_PRESS_DELAY, 300)
|
||||
private set
|
||||
var numberRow: Boolean
|
||||
get() = prefHelper.getPref(NUMBER_ROW, false)
|
||||
set(v) = prefHelper.setPref(NUMBER_ROW, v)
|
||||
var oneHandedMode: String
|
||||
get() = prefHelper.getPref(ONE_HANDED_MODE, "off")
|
||||
set(value) = prefHelper.setPref(ONE_HANDED_MODE, value)
|
||||
@@ -368,25 +390,38 @@ class PrefHelper(
|
||||
set(v) = prefHelper.setPref(SUBTYPES, v)
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper class for Smartbar preferences.
|
||||
*/
|
||||
class Smartbar(private val prefHelper: PrefHelper) {
|
||||
companion object {
|
||||
const val ENABLED = "smartbar__enabled"
|
||||
}
|
||||
|
||||
var enabled: Boolean
|
||||
get() = prefHelper.getPref(ENABLED, true)
|
||||
set(v) = prefHelper.setPref(ENABLED, v)
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper class for suggestion preferences.
|
||||
*/
|
||||
class Suggestion(private val prefHelper: PrefHelper) {
|
||||
companion object {
|
||||
const val ENABLED = "suggestion__enabled"
|
||||
const val SHOW_INSTEAD = "suggestion__show_instead"
|
||||
const val USE_PREV_WORDS = "suggestion__use_prev_words"
|
||||
const val ENABLED = "suggestion__enabled"
|
||||
const val SUGGEST_CLIPBOARD_CONTENT = "suggestion__suggest_clipboard_content"
|
||||
const val USE_PREV_WORDS = "suggestion__use_prev_words"
|
||||
}
|
||||
|
||||
var enabled: Boolean = false
|
||||
get() = prefHelper.getPref(ENABLED, true)
|
||||
private set
|
||||
var showInstead: String = ""
|
||||
get() = prefHelper.getPref(SHOW_INSTEAD, "number_row")
|
||||
private set
|
||||
var usePrevWords: Boolean = false
|
||||
get() = prefHelper.getPref(USE_PREV_WORDS, true)
|
||||
private set
|
||||
var enabled: Boolean
|
||||
get() = prefHelper.getPref(ENABLED, true)
|
||||
set(v) = prefHelper.setPref(ENABLED, v)
|
||||
var suggestClipboardContent: Boolean
|
||||
get() = prefHelper.getPref(SUGGEST_CLIPBOARD_CONTENT, false)
|
||||
set(v) = prefHelper.setPref(SUGGEST_CLIPBOARD_CONTENT, v)
|
||||
var usePrevWords: Boolean
|
||||
get() = prefHelper.getPref(USE_PREV_WORDS, true)
|
||||
set(v) = prefHelper.setPref(USE_PREV_WORDS, v)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -417,6 +452,8 @@ class PrefHelper(
|
||||
const val MEDIA_FG_COLOR_ALT = "theme__media_fgColorAlt"
|
||||
const val ONE_HANDED_BG_COLOR = "theme__oneHanded_bgColor"
|
||||
const val ONE_HANDED_BUTTON_FG_COLOR = "theme__oneHandedButton_fgColor"
|
||||
const val PRIVATE_MODE_BG_COLOR = "theme__privateMode_bgColor"
|
||||
const val PRIVATE_MODE_FG_COLOR = "theme__privateMode_fgColor"
|
||||
const val SMARTBAR_BG_COLOR = "theme__smartbar_bgColor"
|
||||
const val SMARTBAR_FG_COLOR = "theme__smartbar_fgColor"
|
||||
const val SMARTBAR_FG_COLOR_ALT = "theme__smartbar_fgColorAlt"
|
||||
@@ -493,6 +530,12 @@ class PrefHelper(
|
||||
var oneHandedButtonFgColor: Int
|
||||
get() = prefHelper.getPref(ONE_HANDED_BUTTON_FG_COLOR, 0)
|
||||
set(v) = prefHelper.setPref(ONE_HANDED_BUTTON_FG_COLOR, v)
|
||||
var privateModeBgColor: Int
|
||||
get() = prefHelper.getPref(PRIVATE_MODE_BG_COLOR, 0)
|
||||
set(v) = prefHelper.setPref(PRIVATE_MODE_BG_COLOR, v)
|
||||
var privateModeFgColor: Int
|
||||
get() = prefHelper.getPref(PRIVATE_MODE_FG_COLOR, 0)
|
||||
set(v) = prefHelper.setPref(PRIVATE_MODE_FG_COLOR, v)
|
||||
var smartbarBgColor: Int
|
||||
get() = prefHelper.getPref(SMARTBAR_BG_COLOR, 0)
|
||||
set(v) = prefHelper.setPref(SMARTBAR_BG_COLOR, v)
|
||||
|
||||
@@ -87,16 +87,10 @@ data class Subtype(
|
||||
* Must be a string which also exists in [FlorisBoard.ImeConfig.characterLayouts]. If the value is
|
||||
* not included within this list, no layout will be shown to the user if the user selects the
|
||||
* predefined layout value.
|
||||
* @property isAsciiCapable Legacy attribute for Android's InputMethodSubtype. Currently no real
|
||||
* use within this project.
|
||||
* @property isEmojiCapable Legacy attribute for Android's InputMethodSubtype. Currently no real
|
||||
* use within this project.
|
||||
*/
|
||||
data class DefaultSubtype(
|
||||
var id: Int,
|
||||
@Json(name = "languageTag")
|
||||
var locale: Locale,
|
||||
var preferredLayout: String,
|
||||
var isAsciiCapable: Boolean,
|
||||
var isEmojiCapable: Boolean
|
||||
var preferredLayout: String
|
||||
)
|
||||
|
||||
@@ -71,7 +71,7 @@ class SubtypeManager(
|
||||
* Loads the [FlorisBoard.ImeConfig] from ime/config.json.
|
||||
*
|
||||
* @param path The path to to IME config file.
|
||||
* @returns The [FlorisBoard.ImeConfig] or a default config.
|
||||
* @return The [FlorisBoard.ImeConfig] or a default config.
|
||||
*/
|
||||
private fun loadImeConfig(path: String): FlorisBoard.ImeConfig {
|
||||
val rawJsonData: String = try {
|
||||
@@ -93,7 +93,7 @@ class SubtypeManager(
|
||||
* Adds a given [subtypeToAdd] to the subtype list, if it does not exist.
|
||||
*
|
||||
* @param subtypeToAdd The subtype which should be added.
|
||||
* @returns True if the subtype was added, false otherwise. A return value of false indicates
|
||||
* @return True if the subtype was added, false otherwise. A return value of false indicates
|
||||
* that the subtype already exists.
|
||||
*/
|
||||
private fun addSubtype(subtypeToAdd: Subtype): Boolean {
|
||||
@@ -112,7 +112,7 @@ class SubtypeManager(
|
||||
*
|
||||
* @param locale The locale of the subtype to be added.
|
||||
* @param layoutName The layout name of the subtype to be added.
|
||||
* @returns True if the subtype was added, false otherwise. A return value of false indicates
|
||||
* @return True if the subtype was added, false otherwise. A return value of false indicates
|
||||
* that the subtype already exists.
|
||||
*/
|
||||
fun addSubtype(locale: Locale, layoutName: String): Boolean {
|
||||
@@ -129,7 +129,7 @@ class SubtypeManager(
|
||||
* Gets the active subtype and returns it. If the activeSubtypeId points to a non-existent
|
||||
* subtype, this method tries to determine a new active subtype.
|
||||
*
|
||||
* @returns The active subtype or null, if the subtype list is empty or no new active subtype
|
||||
* @return The active subtype or null, if the subtype list is empty or no new active subtype
|
||||
* could be determined.
|
||||
*/
|
||||
fun getActiveSubtype(): Subtype? {
|
||||
@@ -152,7 +152,7 @@ class SubtypeManager(
|
||||
* Gets a subtype by the given [id].
|
||||
*
|
||||
* @param id The id of the subtype you want to get.
|
||||
* @returns The subtype or null, if no matching subtype could be found.
|
||||
* @return The subtype or null, if no matching subtype could be found.
|
||||
*/
|
||||
fun getSubtypeById(id: Int): Subtype? {
|
||||
for (subtype in subtypes) {
|
||||
@@ -167,7 +167,7 @@ class SubtypeManager(
|
||||
* Gets the default system subtype for a given [locale].
|
||||
*
|
||||
* @param locale The locale of the default system subtype to get.
|
||||
* @returns The default system locale or null, if no matching default system subtype could be
|
||||
* @return The default system locale or null, if no matching default system subtype could be
|
||||
* found.
|
||||
*/
|
||||
fun getDefaultSubtypeForLocale(locale: Locale): DefaultSubtype? {
|
||||
@@ -220,7 +220,7 @@ class SubtypeManager(
|
||||
/**
|
||||
* Switch to the previous subtype in the subtype list if possible.
|
||||
*
|
||||
* @returns The new active subtype or null if the determination process failed.
|
||||
* @return The new active subtype or null if the determination process failed.
|
||||
*/
|
||||
fun switchToPrevSubtype(): Subtype? {
|
||||
val subtypeList = subtypes
|
||||
@@ -248,7 +248,7 @@ class SubtypeManager(
|
||||
/**
|
||||
* Switch to the next subtype in the subtype list if possible.
|
||||
*
|
||||
* @returns The new active subtype or null if the determination process failed.
|
||||
* @return The new active subtype or null if the determination process failed.
|
||||
*/
|
||||
fun switchToNextSubtype(): Subtype? {
|
||||
val subtypeList = subtypes
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package dev.patrickgold.florisboard.ime.media
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Handler
|
||||
import android.util.Log
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
@@ -34,7 +35,10 @@ import dev.patrickgold.florisboard.ime.media.emoticon.EmoticonKeyboardView
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyCode
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyData
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyType
|
||||
import dev.patrickgold.florisboard.util.cancelAll
|
||||
import dev.patrickgold.florisboard.util.postAtScheduledRate
|
||||
import kotlinx.coroutines.*
|
||||
import timber.log.Timber
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
@@ -56,7 +60,7 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
|
||||
private var activeTab: Tab? = null
|
||||
private var mediaViewFlipper: ViewFlipper? = null
|
||||
private var osTimer: Timer? = null
|
||||
private var repeatedKeyPressHandler: Handler? = null
|
||||
private var tabLayout: TabLayout? = null
|
||||
private val tabViews = EnumMap<Tab, LinearLayout>(Tab::class.java)
|
||||
|
||||
@@ -78,6 +82,11 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
florisboard.addEventListener(this)
|
||||
}
|
||||
|
||||
override fun onCreateInputView() {
|
||||
super.onCreateInputView()
|
||||
repeatedKeyPressHandler = Handler(florisboard.context.mainLooper)
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a new input view has been registered. Used to initialize all media-relevant
|
||||
* views and layouts.
|
||||
@@ -85,7 +94,7 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
*/
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
override fun onRegisterInputView(inputView: InputView) {
|
||||
if (BuildConfig.DEBUG) Log.i(this::class.simpleName, "onRegisterInputView(inputView)")
|
||||
Timber.i("onRegisterInputView(inputView)")
|
||||
|
||||
launch(Dispatchers.Default) {
|
||||
mediaViewGroup = inputView.findViewById(R.id.media_input)
|
||||
@@ -111,15 +120,12 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
override fun onTabReselected(tab: TabLayout.Tab) {}
|
||||
})
|
||||
|
||||
for (tab in Tab.values()) {
|
||||
val tabView = createTabViewFor(tab)
|
||||
tabViews[tab] = tabView
|
||||
withContext(Dispatchers.Main) {
|
||||
withContext(Dispatchers.Main) {
|
||||
for (tab in Tab.values()) {
|
||||
val tabView = createTabViewFor(tab)
|
||||
tabViews[tab] = tabView
|
||||
mediaViewFlipper?.addView(tabView)
|
||||
}
|
||||
}
|
||||
|
||||
withContext(Dispatchers.Main) {
|
||||
tabLayout?.selectTab(tabLayout?.getTabAt(0))
|
||||
}
|
||||
}
|
||||
@@ -129,7 +135,7 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
* Clean-up of resources and stopping all coroutines.
|
||||
*/
|
||||
override fun onDestroy() {
|
||||
if (BuildConfig.DEBUG) Log.i(this::class.simpleName, "onDestroy()")
|
||||
Timber.i("onDestroy()")
|
||||
|
||||
cancel()
|
||||
instance = null
|
||||
@@ -154,17 +160,14 @@ class MediaInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
florisboard.keyPressVibrate()
|
||||
florisboard.keyPressSound(data)
|
||||
if (data?.code == KeyCode.DELETE && data.type == KeyType.ENTER_EDITING) {
|
||||
osTimer = Timer()
|
||||
osTimer?.scheduleAtFixedRate(object : TimerTask() {
|
||||
override fun run() {
|
||||
florisboard.textInputManager.sendKeyPress(data)
|
||||
}
|
||||
}, 500, 50)
|
||||
val delayMillis = florisboard.prefs.keyboard.longPressDelay.toLong()
|
||||
repeatedKeyPressHandler?.postAtScheduledRate(delayMillis, 25) {
|
||||
florisboard.textInputManager.sendKeyPress(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
osTimer?.cancel()
|
||||
osTimer = null
|
||||
repeatedKeyPressHandler?.cancelAll()
|
||||
if (event.actionMasked != MotionEvent.ACTION_CANCEL && data != null) {
|
||||
florisboard.textInputManager.sendKeyPress(data)
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import com.google.android.material.tabs.TabLayout
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.core.FlorisBoard
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class MediaInputView : LinearLayout, FlorisBoard.EventListener {
|
||||
private val florisboard: FlorisBoard? = FlorisBoard.getInstanceOrNull()
|
||||
@@ -61,7 +62,7 @@ class MediaInputView : LinearLayout, FlorisBoard.EventListener {
|
||||
}
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
val height = florisboard?.inputView?.desiredMediaKeyboardViewHeight ?: 0
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY))
|
||||
val height = florisboard?.inputView?.desiredMediaKeyboardViewHeight ?: 0.0f
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height.roundToInt(), MeasureSpec.EXACTLY))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.graphics.Paint
|
||||
import android.graphics.Typeface
|
||||
import android.util.Log
|
||||
import androidx.core.graphics.PaintCompat
|
||||
import timber.log.Timber
|
||||
import java.io.BufferedReader
|
||||
import java.io.IOException
|
||||
import java.io.InputStreamReader
|
||||
@@ -171,13 +172,13 @@ fun parseRawEmojiSpecsFile(
|
||||
}
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
Log.e("EmojiLayoutDataMap", "parseRawEmojiSpecsFile(): $e")
|
||||
Timber.e("parseRawEmojiSpecsFile(): $e")
|
||||
} finally {
|
||||
if (reader != null) {
|
||||
try {
|
||||
reader.close()
|
||||
} catch (e: IOException) {
|
||||
Log.e("EmojiLayoutDataMap", "parseRawEmojiSpecsFile(): $e")
|
||||
Timber.e("parseRawEmojiSpecsFile(): $e")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,16 +18,15 @@ package dev.patrickgold.florisboard.ime.popup
|
||||
|
||||
import android.content.res.Configuration
|
||||
import android.util.TypedValue
|
||||
import android.view.Gravity
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.*
|
||||
import android.widget.*
|
||||
import androidx.core.content.ContextCompat.getDrawable
|
||||
import androidx.core.view.get
|
||||
import com.google.android.flexbox.FlexboxLayout
|
||||
import com.google.android.flexbox.JustifyContent
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.databinding.KeyPopupExtendedViewBinding
|
||||
import dev.patrickgold.florisboard.databinding.KeyPopupViewBinding
|
||||
import dev.patrickgold.florisboard.ime.media.emoji.EmojiKeyData
|
||||
import dev.patrickgold.florisboard.ime.media.emoji.EmojiKeyView
|
||||
import dev.patrickgold.florisboard.ime.media.emoji.EmojiKeyboardView
|
||||
@@ -35,6 +34,7 @@ import dev.patrickgold.florisboard.ime.text.key.KeyCode
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyData
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyView
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardView
|
||||
import dev.patrickgold.florisboard.util.ViewLayoutUtils
|
||||
|
||||
/**
|
||||
* Manages the creation and dismissal of key popups as well as the checks if the pointer moved
|
||||
@@ -55,9 +55,10 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
)
|
||||
private var keyPopupWidth: Int
|
||||
private var keyPopupHeight: Int
|
||||
var keyPopupTextSize: Float = keyboardView.resources.getDimension(R.dimen.key_popup_textSize)
|
||||
private var keyPopupDiffX: Int = 0
|
||||
private val popupView: LinearLayout
|
||||
private val popupViewExt: FlexboxLayout
|
||||
private val popupView: KeyPopupViewBinding
|
||||
private val popupViewExt: KeyPopupExtendedViewBinding
|
||||
private var row0count: Int = 0
|
||||
private var row1count: Int = 0
|
||||
private var window: PopupWindow
|
||||
@@ -65,25 +66,20 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
|
||||
/** Is true if the preview popup is visible to the user, else false */
|
||||
val isShowingPopup: Boolean
|
||||
get() = popupView.visibility == View.VISIBLE
|
||||
get() = popupView.root.visibility == View.VISIBLE
|
||||
/** Is true if the extended popup is visible to the user, else false */
|
||||
val isShowingExtendedPopup: Boolean
|
||||
get() = windowExt.isShowing
|
||||
|
||||
init {
|
||||
val inflater = LayoutInflater.from(keyboardView.context)
|
||||
keyPopupWidth = keyboardView.resources.getDimension(R.dimen.key_width).toInt()
|
||||
keyPopupHeight = keyboardView.resources.getDimension(R.dimen.key_height).toInt()
|
||||
popupView = View.inflate(
|
||||
keyboardView.context,
|
||||
R.layout.key_popup, null
|
||||
) as LinearLayout
|
||||
popupView.visibility = View.INVISIBLE
|
||||
popupViewExt = View.inflate(
|
||||
keyboardView.context,
|
||||
R.layout.key_popup_extended, null
|
||||
) as FlexboxLayout
|
||||
window = createPopupWindow(popupView)
|
||||
windowExt = createPopupWindow(popupViewExt)
|
||||
popupView = KeyPopupViewBinding.inflate(inflater, null, false)
|
||||
popupView.root.visibility = View.INVISIBLE
|
||||
popupViewExt = KeyPopupExtendedViewBinding.inflate(inflater, null, false)
|
||||
window = createPopupWindow(popupView.root)
|
||||
windowExt = createPopupWindow(popupViewExt.root)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -102,11 +98,11 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
isWrapBefore: Boolean = false
|
||||
): KeyPopupExtendedSingleView? {
|
||||
val textView = KeyPopupExtendedSingleView(keyView.context, k, isInitActive)
|
||||
val lp = FlexboxLayout.LayoutParams(keyPopupWidth, keyView.measuredHeight)
|
||||
val lp = FlexboxLayout.LayoutParams(keyPopupWidth, (keyPopupHeight * 0.4f).toInt())
|
||||
lp.isWrapBefore = isWrapBefore
|
||||
textView.layoutParams = lp
|
||||
textView.gravity = Gravity.CENTER
|
||||
val textSize = keyboardView.resources.getDimension(R.dimen.key_popup_textSize)
|
||||
val textSize = keyPopupTextSize
|
||||
if (keyView is KeyView) {
|
||||
when (keyView.dataPopupWithHint[k].code) {
|
||||
KeyCode.SETTINGS -> {
|
||||
@@ -124,7 +120,7 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
}
|
||||
KeyCode.TOGGLE_ONE_HANDED_MODE -> {
|
||||
textView.iconDrawable = getDrawable(
|
||||
keyView.context, R.drawable.ic_keyboard_arrow_right
|
||||
keyView.context, R.drawable.ic_smartphone
|
||||
)
|
||||
}
|
||||
else -> {
|
||||
@@ -151,11 +147,13 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
* @return A new [PopupWindow] already preconfigured and ready-to-go.
|
||||
*/
|
||||
private fun createPopupWindow(view: View): PopupWindow {
|
||||
return PopupWindow(keyboardView.context).apply {
|
||||
return PopupWindow(view.context).apply {
|
||||
animationStyle = 0
|
||||
contentView = view
|
||||
elevation = ViewLayoutUtils.convertDpToPixel(2.0f, view.context)
|
||||
enterTransition = null
|
||||
exitTransition = null
|
||||
isAttachedInDecor = false
|
||||
isClippingEnabled = false
|
||||
isFocusable = false
|
||||
isTouchable = false
|
||||
@@ -171,12 +169,22 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
if (keyboardView is KeyboardView) {
|
||||
when (keyboardView.resources.configuration.orientation) {
|
||||
Configuration.ORIENTATION_LANDSCAPE -> {
|
||||
keyPopupWidth = (keyboardView.desiredKeyWidth * 0.6f).toInt()
|
||||
keyPopupHeight = (keyboardView.desiredKeyHeight * 3.0f).toInt()
|
||||
if (keyboardView.isSmartbarKeyboardView) {
|
||||
keyPopupWidth = (keyView.measuredWidth * 0.6f).toInt()
|
||||
keyPopupHeight = (keyboardView.desiredKeyHeight * 3.0f * 1.2f).toInt()
|
||||
} else {
|
||||
keyPopupWidth = (keyboardView.desiredKeyWidth * 0.6f).toInt()
|
||||
keyPopupHeight = (keyboardView.desiredKeyHeight * 3.0f).toInt()
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
keyPopupWidth = (keyboardView.desiredKeyWidth * 1.1f).toInt()
|
||||
keyPopupHeight = (keyboardView.desiredKeyHeight * 2.5f).toInt()
|
||||
if (keyboardView.isSmartbarKeyboardView) {
|
||||
keyPopupWidth = (keyView.measuredWidth * 1.1f).toInt()
|
||||
keyPopupHeight = (keyboardView.desiredKeyHeight * 2.5f * 1.2f).toInt()
|
||||
} else {
|
||||
keyPopupWidth = (keyboardView.desiredKeyWidth * 1.1f).toInt()
|
||||
keyPopupHeight = (keyboardView.desiredKeyHeight * 2.5f).toInt()
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (keyboardView is EmojiKeyboardView) {
|
||||
@@ -209,19 +217,21 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
window.showAsDropDown(keyView, keyPopupX, keyPopupY, Gravity.NO_GRAVITY)
|
||||
}
|
||||
if (keyView is KeyView) {
|
||||
popupView.findViewById<TextView>(R.id.key_popup_text)?.text = keyView.getComputedLetter()
|
||||
popupView.findViewById<ImageView>(R.id.key_popup_threedots)?.visibility = when {
|
||||
popupView.symbol.layoutParams.height = (keyPopupHeight * 0.4f).toInt()
|
||||
popupView.symbol.setTextSize(TypedValue.COMPLEX_UNIT_PX, keyPopupTextSize)
|
||||
popupView.symbol.text = keyView.getComputedLetter()
|
||||
popupView.threedots.visibility = when {
|
||||
keyView.dataPopupWithHint.isEmpty() -> View.INVISIBLE
|
||||
else -> View.VISIBLE
|
||||
}
|
||||
} else if (keyView is EmojiKeyView) {
|
||||
popupView.findViewById<TextView>(R.id.key_popup_text)?.text = keyView.data.getCodePointsAsString()
|
||||
popupView.findViewById<ImageView>(R.id.key_popup_threedots)?.visibility = when {
|
||||
popupView.symbol.text = keyView.data.getCodePointsAsString()
|
||||
popupView.threedots.visibility = when {
|
||||
keyView.data.popup.isEmpty() -> View.INVISIBLE
|
||||
else -> View.VISIBLE
|
||||
}
|
||||
}
|
||||
popupView.visibility = View.VISIBLE
|
||||
popupView.root.visibility = View.VISIBLE
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -308,7 +318,7 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
}
|
||||
|
||||
// Build UI
|
||||
popupViewExt.removeAllViews()
|
||||
popupViewExt.root.removeAllViews()
|
||||
val indices = when (keyView) {
|
||||
is KeyView -> keyView.dataPopupWithHint.indices
|
||||
is EmojiKeyView -> keyView.data.popup.indices
|
||||
@@ -330,7 +340,7 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
}
|
||||
else -> k
|
||||
}
|
||||
popupViewExt.addView(
|
||||
popupViewExt.root.addView(
|
||||
createTextView(
|
||||
keyView, kk, isInitActive, (row1count > 0) && (k - row1count == 0)
|
||||
)
|
||||
@@ -339,23 +349,23 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
activeExtIndex = k
|
||||
}
|
||||
}
|
||||
popupView.findViewById<ImageView>(R.id.key_popup_threedots)?.visibility = View.INVISIBLE
|
||||
popupView.threedots.visibility = View.INVISIBLE
|
||||
|
||||
// Calculate layout params
|
||||
val extWidth = row0count * keyPopupWidth
|
||||
val extHeight = when {
|
||||
row1count > 0 -> keyView.measuredHeight * 2
|
||||
else -> keyView.measuredHeight
|
||||
}
|
||||
popupViewExt.justifyContent = if (anchorLeft) {
|
||||
row1count > 0 -> keyPopupHeight * 0.4f * 2.0f
|
||||
else -> keyPopupHeight * 0.4f
|
||||
}.toInt()
|
||||
popupViewExt.root.justifyContent = if (anchorLeft) {
|
||||
JustifyContent.FLEX_START
|
||||
} else {
|
||||
JustifyContent.FLEX_END
|
||||
}
|
||||
if (popupViewExt.layoutParams == null) {
|
||||
popupViewExt.layoutParams = ViewGroup.LayoutParams(extWidth, extHeight)
|
||||
if (popupViewExt.root.layoutParams == null) {
|
||||
popupViewExt.root.layoutParams = ViewGroup.LayoutParams(extWidth, extHeight)
|
||||
} else {
|
||||
popupViewExt.layoutParams.apply {
|
||||
popupViewExt.root.layoutParams.apply {
|
||||
width = extWidth
|
||||
height = extHeight
|
||||
}
|
||||
@@ -366,7 +376,7 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
else -> 0
|
||||
}
|
||||
val y = -keyPopupHeight - when {
|
||||
row1count > 0 -> keyView.measuredHeight
|
||||
row1count > 0 -> (keyPopupHeight * 0.4f).toInt()
|
||||
else -> 0
|
||||
}
|
||||
|
||||
@@ -449,7 +459,7 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
|
||||
if (keyView is KeyView) {
|
||||
for (k in keyView.dataPopupWithHint.indices) {
|
||||
val view = popupViewExt.getChildAt(k)
|
||||
val view = popupViewExt.root.getChildAt(k)
|
||||
if (view != null) {
|
||||
val textView = view as KeyPopupExtendedSingleView
|
||||
textView.isActive = k == activeExtIndex
|
||||
@@ -457,7 +467,7 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
}
|
||||
} else if (keyView is EmojiKeyView) {
|
||||
for (k in keyView.data.popup.indices) {
|
||||
val view = popupViewExt.getChildAt(k)
|
||||
val view = popupViewExt.root.getChildAt(k)
|
||||
if (view != null) {
|
||||
val textView = view as KeyPopupExtendedSingleView
|
||||
textView.isActive = k == activeExtIndex
|
||||
@@ -480,8 +490,12 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
return if (keyView is KeyView) {
|
||||
val activeExtIndex = activeExtIndex
|
||||
if (activeExtIndex != null) {
|
||||
val singleView = popupViewExt[activeExtIndex] as KeyPopupExtendedSingleView
|
||||
keyView.dataPopupWithHint.getOrNull(singleView.adjustedIndex) ?: keyView.data
|
||||
val singleView = popupViewExt.root[activeExtIndex]
|
||||
if (singleView is KeyPopupExtendedSingleView) {
|
||||
keyView.dataPopupWithHint.getOrNull(singleView.adjustedIndex) ?: keyView.data
|
||||
} else {
|
||||
keyView.data
|
||||
}
|
||||
} else {
|
||||
keyView.data
|
||||
}
|
||||
@@ -510,7 +524,7 @@ class KeyPopupManager<T_KBD: View, T_KV: View>(private val keyboardView: T_KBD)
|
||||
* Hides the key preview popup as well as the extended popup.
|
||||
*/
|
||||
fun hide() {
|
||||
popupView.visibility = View.INVISIBLE
|
||||
popupView.root.visibility = View.INVISIBLE
|
||||
if (windowExt.isShowing) {
|
||||
windowExt.dismiss()
|
||||
}
|
||||
|
||||
@@ -23,13 +23,13 @@ import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.databinding.KeyPopupViewBinding
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import dev.patrickgold.florisboard.util.*
|
||||
|
||||
class KeyPopupView : LinearLayout {
|
||||
private val prefs: PrefHelper = PrefHelper.getDefaultInstance(context)
|
||||
private lateinit var text: TextView
|
||||
private lateinit var threedots: ImageView
|
||||
private lateinit var binding: KeyPopupViewBinding
|
||||
|
||||
constructor(context: Context) : this(context, null)
|
||||
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
|
||||
@@ -37,14 +37,13 @@ class KeyPopupView : LinearLayout {
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
text = findViewById(R.id.key_popup_text)
|
||||
threedots = findViewById(R.id.key_popup_threedots)
|
||||
binding = KeyPopupViewBinding.bind(this)
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas?) {
|
||||
setBackgroundTintColor2(this, prefs.theme.keyPopupBgColor)
|
||||
text.setTextColor(prefs.theme.keyPopupFgColor)
|
||||
setImageTintColor2(threedots, prefs.theme.keyPopupFgColor)
|
||||
binding.symbol.setTextColor(prefs.theme.keyPopupFgColor)
|
||||
setImageTintColor2(binding.threedots, prefs.theme.keyPopupFgColor)
|
||||
super.onDraw(canvas)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
|
||||
package dev.patrickgold.florisboard.ime.text
|
||||
|
||||
import android.content.ClipData
|
||||
import android.content.Context
|
||||
import android.os.Handler
|
||||
import android.util.Log
|
||||
import android.view.KeyEvent
|
||||
import android.view.inputmethod.*
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.Toast
|
||||
import android.widget.ViewFlipper
|
||||
import dev.patrickgold.florisboard.BuildConfig
|
||||
import dev.patrickgold.florisboard.R
|
||||
@@ -36,8 +36,9 @@ import dev.patrickgold.florisboard.ime.text.key.KeyVariation
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardMode
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardView
|
||||
import dev.patrickgold.florisboard.ime.text.layout.LayoutManager
|
||||
import dev.patrickgold.florisboard.ime.text.smartbar.SmartbarManager
|
||||
import dev.patrickgold.florisboard.ime.text.smartbar.SmartbarView
|
||||
import kotlinx.coroutines.*
|
||||
import timber.log.Timber
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
@@ -48,12 +49,11 @@ import java.util.*
|
||||
* are separated from media-related UI. The core [FlorisBoard] will pass any event defined in
|
||||
* [FlorisBoard.EventListener] through to this class.
|
||||
*
|
||||
* TextInputManager also keeps track of the current composing word and syncs this value with the
|
||||
* Smartbar, which, depending on the mode and variation, may create candidates.
|
||||
* @see SmartbarManager.generateCandidatesFromComposing for more information.
|
||||
* TextInputManager is also the hub in the communication between the system, the active editor
|
||||
* instance and the Smartbar.
|
||||
*/
|
||||
class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
FlorisBoard.EventListener {
|
||||
FlorisBoard.EventListener, SmartbarView.EventListener {
|
||||
|
||||
private val florisboard = FlorisBoard.getInstance()
|
||||
private val activeEditorInstance: EditorInstance
|
||||
@@ -67,8 +67,8 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
var textViewGroup: LinearLayout? = null
|
||||
|
||||
var keyVariation: KeyVariation = KeyVariation.NORMAL
|
||||
private val layoutManager = LayoutManager(florisboard)
|
||||
private lateinit var smartbarManager: SmartbarManager
|
||||
val layoutManager = LayoutManager(florisboard)
|
||||
private var smartbarView: SmartbarView? = null
|
||||
|
||||
// Caps/Space related properties
|
||||
var caps: Boolean = false
|
||||
@@ -84,7 +84,6 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
private var isManualSelectionModeRight: Boolean = false
|
||||
|
||||
companion object {
|
||||
private val TAG: String? = TextInputManager::class.simpleName
|
||||
private var instance: TextInputManager? = null
|
||||
|
||||
@Synchronized
|
||||
@@ -105,7 +104,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
* background).
|
||||
*/
|
||||
override fun onCreate() {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onCreate()")
|
||||
Timber.i("onCreate()")
|
||||
|
||||
var subtypes = florisboard.subtypeManager.subtypes
|
||||
if (subtypes.isEmpty()) {
|
||||
@@ -113,15 +112,14 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
}
|
||||
for (subtype in subtypes) {
|
||||
for (mode in KeyboardMode.values()) {
|
||||
layoutManager.preloadComputedLayout(mode, subtype)
|
||||
layoutManager.preloadComputedLayout(mode, subtype, florisboard.prefs)
|
||||
}
|
||||
}
|
||||
smartbarManager = SmartbarManager.getInstance()
|
||||
}
|
||||
|
||||
private suspend fun addKeyboardView(mode: KeyboardMode) {
|
||||
val keyboardView = KeyboardView(florisboard.context)
|
||||
keyboardView.computedLayout = layoutManager.fetchComputedLayoutAsync(mode, florisboard.activeSubtype).await()
|
||||
keyboardView.computedLayout = layoutManager.fetchComputedLayoutAsync(mode, florisboard.activeSubtype, florisboard.prefs).await()
|
||||
keyboardViews[mode] = keyboardView
|
||||
withContext(Dispatchers.Main) {
|
||||
textViewFlipper?.addView(keyboardView)
|
||||
@@ -132,7 +130,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
* Sets up the newly registered input view.
|
||||
*/
|
||||
override fun onRegisterInputView(inputView: InputView) {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onRegisterInputView(inputView)")
|
||||
Timber.i("onRegisterInputView(inputView)")
|
||||
|
||||
launch(Dispatchers.Default) {
|
||||
textViewGroup = inputView.findViewById(R.id.text_input)
|
||||
@@ -145,23 +143,27 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
setActiveKeyboardMode(activeKeyboardMode)
|
||||
}
|
||||
for (mode in KeyboardMode.values()) {
|
||||
if (mode != activeKeyboardMode) {
|
||||
if (mode != activeKeyboardMode && mode != KeyboardMode.SMARTBAR_NUMBER_ROW) {
|
||||
addKeyboardView(mode)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun registerSmartbarView(view: SmartbarView) {
|
||||
smartbarView = view
|
||||
smartbarView?.setEventListener(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels all coroutines and cleans up.
|
||||
*/
|
||||
override fun onDestroy() {
|
||||
if (BuildConfig.DEBUG) Log.i(TAG, "onDestroy()")
|
||||
Timber.i("onDestroy()")
|
||||
|
||||
cancel()
|
||||
osHandler.removeCallbacksAndMessages(null)
|
||||
layoutManager.onDestroy()
|
||||
smartbarManager.onDestroy()
|
||||
instance = null
|
||||
}
|
||||
|
||||
@@ -205,33 +207,37 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
KeyboardMode.CHARACTERS
|
||||
}
|
||||
}
|
||||
instance.isComposingEnabled = when (keyboardMode) {
|
||||
KeyboardMode.NUMERIC,
|
||||
KeyboardMode.PHONE,
|
||||
KeyboardMode.PHONE2 -> false
|
||||
else -> keyVariation != KeyVariation.PASSWORD &&
|
||||
florisboard.prefs.suggestion.enabled &&
|
||||
//!instance.inputAttributes.flagTextAutoComplete &&
|
||||
!instance.inputAttributes.flagTextNoSuggestions
|
||||
instance.apply {
|
||||
isComposingEnabled = when (keyboardMode) {
|
||||
KeyboardMode.NUMERIC,
|
||||
KeyboardMode.PHONE,
|
||||
KeyboardMode.PHONE2 -> false
|
||||
else -> keyVariation != KeyVariation.PASSWORD &&
|
||||
florisboard.prefs.suggestion.enabled// &&
|
||||
//!instance.inputAttributes.flagTextAutoComplete &&
|
||||
//!instance.inputAttributes.flagTextNoSuggestions
|
||||
}
|
||||
isPrivateMode = florisboard.prefs.advanced.forcePrivateMode ||
|
||||
imeOptions.flagNoPersonalizedLearning
|
||||
}
|
||||
if (!florisboard.prefs.correction.rememberCapsLockState) {
|
||||
capsLock = false
|
||||
}
|
||||
updateCapsState()
|
||||
setActiveKeyboardMode(keyboardMode)
|
||||
smartbarManager.onStartInputView(keyboardMode, instance.isComposingEnabled)
|
||||
smartbarView?.updateSmartbarState()
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle stuff when finishing to interact with a input editor.
|
||||
*/
|
||||
override fun onFinishInputView(finishingInput: Boolean) {
|
||||
smartbarManager.onFinishInputView()
|
||||
smartbarView?.updateSmartbarState()
|
||||
}
|
||||
|
||||
override fun onWindowShown() {
|
||||
keyboardViews[KeyboardMode.CHARACTERS]?.updateVisibility()
|
||||
smartbarManager.onWindowShown()
|
||||
smartbarView?.updateSmartbarState()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -244,7 +250,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets [activeKeyboardMode] and updates the [SmartbarManager.isQuickActionsVisible].
|
||||
* Sets [activeKeyboardMode] and updates the [SmartbarView.isQuickActionsVisible] state.
|
||||
*/
|
||||
fun setActiveKeyboardMode(mode: KeyboardMode) {
|
||||
textViewFlipper?.displayedChild = textViewFlipper?.indexOfChild(when (mode) {
|
||||
@@ -255,35 +261,37 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
keyboardViews[mode]?.requestLayout()
|
||||
keyboardViews[mode]?.requestLayoutAllKeys()
|
||||
activeKeyboardMode = mode
|
||||
smartbarManager.isQuickActionsVisible = false
|
||||
isManualSelectionMode = false
|
||||
isManualSelectionModeLeft = false
|
||||
isManualSelectionModeRight = false
|
||||
smartbarView?.isQuickActionsVisible = false
|
||||
smartbarView?.updateSmartbarState()
|
||||
}
|
||||
|
||||
override fun onSubtypeChanged(newSubtype: Subtype) {
|
||||
launch {
|
||||
val keyboardView = keyboardViews[KeyboardMode.CHARACTERS]
|
||||
keyboardView?.computedLayout = layoutManager.fetchComputedLayoutAsync(KeyboardMode.CHARACTERS, newSubtype).await()
|
||||
keyboardView?.computedLayout = layoutManager.fetchComputedLayoutAsync(KeyboardMode.CHARACTERS, newSubtype, florisboard.prefs).await()
|
||||
keyboardView?.updateVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Main logic point for processing cursor updates as well as parsing the current composing word
|
||||
* and passing this info on to the [SmartbarManager] to turn it into candidate suggestions.
|
||||
* and passing this info on to the [SmartbarView] to turn it into candidate suggestions.
|
||||
*/
|
||||
override fun onUpdateSelection() {
|
||||
if (activeEditorInstance.selection.isCursorMode) {
|
||||
smartbarManager.generateCandidatesFromComposing(activeEditorInstance.currentWord.text)
|
||||
}
|
||||
if (!activeEditorInstance.isNewSelectionInBoundsOfOld) {
|
||||
isManualSelectionMode = false
|
||||
isManualSelectionModeLeft = false
|
||||
isManualSelectionModeRight = false
|
||||
}
|
||||
updateCapsState()
|
||||
smartbarManager.onUpdateSelection()
|
||||
smartbarView?.updateSmartbarState()
|
||||
}
|
||||
|
||||
override fun onPrimaryClipChanged() {
|
||||
smartbarView?.onPrimaryClipChanged()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -294,7 +302,9 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
if (!capsLock) {
|
||||
caps = florisboard.prefs.correction.autoCapitalization &&
|
||||
activeEditorInstance.cursorCapsMode != InputAttributes.CapsMode.NONE
|
||||
keyboardViews[activeKeyboardMode]?.invalidateAllKeys()
|
||||
launch(Dispatchers.Main) {
|
||||
keyboardViews[activeKeyboardMode]?.invalidateAllKeys()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -314,6 +324,47 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSmartbarBackButtonPressed() {
|
||||
setActiveKeyboardMode(KeyboardMode.CHARACTERS)
|
||||
}
|
||||
|
||||
override fun onSmartbarPrivateModeButtonClicked() {
|
||||
Toast.makeText(florisboard.context, R.string.private_mode_dialog__title, Toast.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
override fun onSmartbarQuickActionPressed(quickActionId: Int) {
|
||||
when (quickActionId) {
|
||||
R.id.quick_action_switch_to_editing_context -> {
|
||||
if (activeKeyboardMode == KeyboardMode.EDITING) {
|
||||
setActiveKeyboardMode(KeyboardMode.CHARACTERS)
|
||||
} else {
|
||||
setActiveKeyboardMode(KeyboardMode.EDITING)
|
||||
}
|
||||
}
|
||||
R.id.quick_action_switch_to_media_context -> florisboard.setActiveInput(R.id.media_input)
|
||||
R.id.quick_action_open_settings -> florisboard.launchSettings()
|
||||
R.id.quick_action_one_handed_toggle -> florisboard.toggleOneHandedMode()
|
||||
R.id.quick_action_undo -> {
|
||||
handleUndo()
|
||||
return
|
||||
}
|
||||
R.id.quick_action_redo -> {
|
||||
handleRedo()
|
||||
return
|
||||
}
|
||||
}
|
||||
smartbarView?.isQuickActionsVisible = false
|
||||
smartbarView?.updateSmartbarState()
|
||||
}
|
||||
|
||||
private fun handleUndo(){
|
||||
activeEditorInstance.performUndo()
|
||||
}
|
||||
|
||||
private fun handleRedo(){
|
||||
activeEditorInstance.performRedo()
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a [KeyCode.DELETE] event.
|
||||
*/
|
||||
@@ -339,7 +390,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
*/
|
||||
private fun handleEnter() {
|
||||
if (activeEditorInstance.imeOptions.flagNoEnterAction) {
|
||||
activeEditorInstance.commitText("\n")
|
||||
activeEditorInstance.performEnter()
|
||||
} else {
|
||||
when (activeEditorInstance.imeOptions.action) {
|
||||
ImeOptions.Action.DONE,
|
||||
@@ -350,7 +401,7 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
ImeOptions.Action.SEND -> {
|
||||
activeEditorInstance.performEnterAction(activeEditorInstance.imeOptions.action)
|
||||
}
|
||||
else -> activeEditorInstance.commitText("\n")
|
||||
else -> activeEditorInstance.performEnter()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -514,40 +565,6 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a [KeyCode.CLIPBOARD_CUT] event.
|
||||
* TODO: handle other data than text too, e.g. Uri, Intent, ...
|
||||
*/
|
||||
private fun handleClipboardCut() {
|
||||
val selectedText = activeEditorInstance.selection.text
|
||||
florisboard.clipboardManager
|
||||
?.setPrimaryClip(ClipData.newPlainText(selectedText, selectedText))
|
||||
activeEditorInstance.commitText("")
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a [KeyCode.CLIPBOARD_COPY] event.
|
||||
* TODO: handle other data than text too, e.g. Uri, Intent, ...
|
||||
*/
|
||||
private fun handleClipboardCopy() {
|
||||
val selectedText = activeEditorInstance.selection.text
|
||||
florisboard.clipboardManager
|
||||
?.setPrimaryClip(ClipData.newPlainText(selectedText, selectedText))
|
||||
activeEditorInstance.apply { setSelection(selection.end, selection.end) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a [KeyCode.CLIPBOARD_PASTE] event.
|
||||
* TODO: handle other data than text too, e.g. Uri, Intent, ...
|
||||
*/
|
||||
private fun handleClipboardPaste() {
|
||||
val item = florisboard.clipboardManager?.primaryClip?.getItemAt(0)
|
||||
val pasteText = item?.text
|
||||
if (pasteText != null) {
|
||||
activeEditorInstance.commitText(pasteText.toString())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a [KeyCode.CLIPBOARD_SELECT] event.
|
||||
*/
|
||||
@@ -588,13 +605,22 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
KeyCode.ARROW_UP,
|
||||
KeyCode.MOVE_HOME,
|
||||
KeyCode.MOVE_END -> handleArrow(keyData.code)
|
||||
KeyCode.CLIPBOARD_CUT -> handleClipboardCut()
|
||||
KeyCode.CLIPBOARD_COPY -> handleClipboardCopy()
|
||||
KeyCode.CLIPBOARD_PASTE -> handleClipboardPaste()
|
||||
KeyCode.CLIPBOARD_CUT -> activeEditorInstance.performClipboardCut()
|
||||
KeyCode.CLIPBOARD_COPY -> activeEditorInstance.performClipboardCopy()
|
||||
KeyCode.CLIPBOARD_PASTE -> {
|
||||
activeEditorInstance.performClipboardPaste()
|
||||
smartbarView?.resetClipboardSuggestion()
|
||||
}
|
||||
KeyCode.CLIPBOARD_SELECT -> handleClipboardSelect()
|
||||
KeyCode.CLIPBOARD_SELECT_ALL -> handleClipboardSelectAll()
|
||||
KeyCode.DELETE -> handleDelete()
|
||||
KeyCode.ENTER -> handleEnter()
|
||||
KeyCode.DELETE -> {
|
||||
handleDelete()
|
||||
smartbarView?.resetClipboardSuggestion()
|
||||
}
|
||||
KeyCode.ENTER -> {
|
||||
handleEnter()
|
||||
smartbarView?.resetClipboardSuggestion()
|
||||
}
|
||||
KeyCode.LANGUAGE_SWITCH -> florisboard.switchToNextSubtype()
|
||||
KeyCode.SETTINGS -> florisboard.launchSettings()
|
||||
KeyCode.SHIFT -> handleShift()
|
||||
@@ -652,11 +678,16 @@ class TextInputManager private constructor() : CoroutineScope by MainScope(),
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
Log.e(TAG,"sendKeyPress(keyData): Received unknown key: $keyData")
|
||||
Timber.e("sendKeyPress(keyData): Received unknown key: $keyData")
|
||||
}
|
||||
}
|
||||
}
|
||||
smartbarView?.resetClipboardSuggestion()
|
||||
}
|
||||
}
|
||||
if (keyData.code != KeyCode.SHIFT && !capsLock) {
|
||||
updateCapsState()
|
||||
}
|
||||
smartbarView?.updateSmartbarState()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.content.res.Configuration
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Paint
|
||||
import android.graphics.Typeface
|
||||
import android.os.Handler
|
||||
import android.util.AttributeSet
|
||||
import android.view.MotionEvent
|
||||
import android.widget.Button
|
||||
@@ -32,7 +33,8 @@ import dev.patrickgold.florisboard.ime.core.FlorisBoard
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyCode
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyData
|
||||
import java.util.*
|
||||
import dev.patrickgold.florisboard.util.cancelAll
|
||||
import dev.patrickgold.florisboard.util.postAtScheduledRate
|
||||
|
||||
/**
|
||||
* View class for managing and rendering an editing key.
|
||||
@@ -42,7 +44,7 @@ class EditingKeyView : AppCompatImageButton {
|
||||
private val prefs: PrefHelper = PrefHelper.getDefaultInstance(context)
|
||||
private val data: KeyData
|
||||
private var isKeyPressed: Boolean = false
|
||||
private var osTimer: Timer? = null
|
||||
private val repeatedKeyPressHandler: Handler = Handler(context.mainLooper)
|
||||
|
||||
private var label: String? = null
|
||||
private var labelPaint: Paint = Paint().apply {
|
||||
@@ -100,23 +102,20 @@ class EditingKeyView : AppCompatImageButton {
|
||||
KeyCode.ARROW_RIGHT,
|
||||
KeyCode.ARROW_UP,
|
||||
KeyCode.DELETE -> {
|
||||
osTimer = Timer()
|
||||
osTimer?.scheduleAtFixedRate(object : TimerTask() {
|
||||
override fun run() {
|
||||
val delayMillis = prefs.keyboard.longPressDelay.toLong()
|
||||
repeatedKeyPressHandler.postAtScheduledRate(delayMillis, 25) {
|
||||
if (isKeyPressed) {
|
||||
florisboard?.textInputManager?.sendKeyPress(data)
|
||||
if (!isKeyPressed) {
|
||||
osTimer?.cancel()
|
||||
osTimer = null
|
||||
}
|
||||
} else {
|
||||
repeatedKeyPressHandler.cancelAll()
|
||||
}
|
||||
}, 500, 50)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
isKeyPressed = false
|
||||
osTimer?.cancel()
|
||||
osTimer = null
|
||||
repeatedKeyPressHandler.cancelAll()
|
||||
if (event.actionMasked != MotionEvent.ACTION_CANCEL) {
|
||||
florisboard?.textInputManager?.sendKeyPress(data)
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.core.FlorisBoard
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import dev.patrickgold.florisboard.util.setBackgroundTintColor2
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
/**
|
||||
* View class for updating the key views depending on the current selection and clipboard state.
|
||||
@@ -79,7 +80,7 @@ class EditingKeyboardView : ConstraintLayout, FlorisBoard.EventListener {
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
|
||||
val heightSize = MeasureSpec.getSize(heightMeasureSpec)
|
||||
val heightSize = MeasureSpec.getSize(heightMeasureSpec).toFloat()
|
||||
val height = when (heightMode) {
|
||||
MeasureSpec.EXACTLY -> {
|
||||
// Must be this size
|
||||
@@ -87,15 +88,15 @@ class EditingKeyboardView : ConstraintLayout, FlorisBoard.EventListener {
|
||||
}
|
||||
MeasureSpec.AT_MOST -> {
|
||||
// Can't be bigger than...
|
||||
(florisboard?.inputView?.desiredTextKeyboardViewHeight ?: 0).coerceAtMost(heightSize)
|
||||
(florisboard?.inputView?.desiredTextKeyboardViewHeight ?: 0.0f).coerceAtMost(heightSize)
|
||||
}
|
||||
else -> {
|
||||
// Be whatever you want
|
||||
florisboard?.inputView?.desiredTextKeyboardViewHeight ?: 0
|
||||
florisboard?.inputView?.desiredTextKeyboardViewHeight ?: 0.0f
|
||||
}
|
||||
}
|
||||
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY))
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height.roundToInt(), MeasureSpec.EXACTLY))
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas?) {
|
||||
|
||||
@@ -23,7 +23,9 @@ import java.util.*
|
||||
*/
|
||||
enum class SwipeAction {
|
||||
NO_ACTION,
|
||||
DELETE_CHARACTERS_PRECISELY,
|
||||
DELETE_WORD,
|
||||
DELETE_WORDS_PRECISELY,
|
||||
HIDE_KEYBOARD,
|
||||
MOVE_CURSOR_UP,
|
||||
MOVE_CURSOR_DOWN,
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package dev.patrickgold.florisboard.ime.text.gestures
|
||||
|
||||
import android.content.Context
|
||||
import android.util.DisplayMetrics
|
||||
import android.view.MotionEvent
|
||||
import dev.patrickgold.florisboard.R
|
||||
import java.lang.Exception
|
||||
@@ -54,7 +53,7 @@ abstract class SwipeGesture {
|
||||
val lastEvent = eventList[indexLastMoveRecognized]
|
||||
val diffX = event.x - lastEvent.x
|
||||
val diffY = event.y - lastEvent.y
|
||||
val distanceThresholdNV = numericValue(distanceThreshold) / 2.0f
|
||||
val distanceThresholdNV = numericValue(distanceThreshold) / 4.0f
|
||||
return if (abs(diffX) > distanceThresholdNV || abs(diffY) > distanceThresholdNV) {
|
||||
indexLastMoveRecognized = eventList.size - 1
|
||||
val direction = detectDirection(diffX.toDouble(), diffY.toDouble())
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Patrick Goldinger
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package dev.patrickgold.florisboard.ime.text.key
|
||||
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* Enum for the key hint modes.
|
||||
*/
|
||||
enum class KeyHintMode {
|
||||
DISABLED,
|
||||
ENABLED_HINT_PRIORITY,
|
||||
ENABLED_ACCENT_PRIORITY,
|
||||
ENABLED_SMART_PRIORITY;
|
||||
|
||||
companion object {
|
||||
fun fromString(string: String): KeyHintMode {
|
||||
return valueOf(string.toUpperCase(Locale.ROOT))
|
||||
}
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return super.toString().toLowerCase(Locale.ROOT)
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@
|
||||
package dev.patrickgold.florisboard.ime.text.key
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.*
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.os.Handler
|
||||
@@ -24,7 +25,6 @@ import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.ViewOutlineProvider
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import androidx.core.content.ContextCompat.getDrawable
|
||||
import androidx.core.graphics.BlendModeColorFilterCompat
|
||||
import androidx.core.graphics.BlendModeCompat
|
||||
@@ -32,13 +32,17 @@ import androidx.core.view.children
|
||||
import com.google.android.flexbox.FlexboxLayout
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.core.FlorisBoard
|
||||
import dev.patrickgold.florisboard.ime.core.ImeOptions
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import dev.patrickgold.florisboard.ime.text.gestures.SwipeAction
|
||||
import dev.patrickgold.florisboard.ime.text.gestures.SwipeGesture
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardMode
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardView
|
||||
import dev.patrickgold.florisboard.util.cancelAll
|
||||
import dev.patrickgold.florisboard.util.postAtScheduledRate
|
||||
import dev.patrickgold.florisboard.util.postDelayed
|
||||
import dev.patrickgold.florisboard.util.setBackgroundTintColor2
|
||||
import java.util.*
|
||||
import kotlin.math.abs
|
||||
|
||||
/**
|
||||
* View class for managing the rendering and the events of a single keyboard key.
|
||||
@@ -59,8 +63,9 @@ class KeyView(
|
||||
field = value
|
||||
updateKeyPressedBackground()
|
||||
}
|
||||
private var osHandler: Handler? = null
|
||||
private var osTimer: Timer? = null
|
||||
private var hasTriggeredGestureMove: Boolean = false
|
||||
private val longKeyPressHandler: Handler = Handler(context.mainLooper)
|
||||
private val repeatedKeyPressHandler: Handler = Handler(context.mainLooper)
|
||||
private val prefs: PrefHelper = PrefHelper.getDefaultInstance(context)
|
||||
private var shouldBlockNextKeyCode: Boolean = false
|
||||
|
||||
@@ -68,13 +73,14 @@ class KeyView(
|
||||
private var desiredHeight: Int = 0
|
||||
private var drawable: Drawable? = null
|
||||
private var drawableColor: Int = 0
|
||||
private var drawablePadding: Int = 0
|
||||
private var drawablePaddingH: Int = 0
|
||||
private var drawablePaddingV: Int = 0
|
||||
private var label: String? = null
|
||||
private var labelPaint: Paint = Paint().apply {
|
||||
alpha = 255
|
||||
color = 0
|
||||
isAntiAlias = true
|
||||
isFakeBoldText = true
|
||||
isFakeBoldText = false
|
||||
textAlign = Paint.Align.CENTER
|
||||
textSize = resources.getDimension(R.dimen.key_textSize)
|
||||
typeface = Typeface.DEFAULT
|
||||
@@ -84,7 +90,7 @@ class KeyView(
|
||||
alpha = 120
|
||||
color = 0
|
||||
isAntiAlias = true
|
||||
isFakeBoldText = true
|
||||
isFakeBoldText = false
|
||||
textAlign = Paint.Align.CENTER
|
||||
textSize = resources.getDimension(R.dimen.key_textHintSize)
|
||||
typeface = Typeface.DEFAULT
|
||||
@@ -140,19 +146,26 @@ class KeyView(
|
||||
elevation = 4.0f
|
||||
|
||||
var hintKeyData: KeyData? = null
|
||||
var hintKeyMode: KeyHintMode = KeyHintMode.DISABLED
|
||||
val hintedNumber = data.hintedNumber
|
||||
if (prefs.keyboard.hintedNumberRow && hintedNumber != null) {
|
||||
if (prefs.keyboard.hintedNumberRowMode != KeyHintMode.DISABLED && hintedNumber != null) {
|
||||
hintKeyData = hintedNumber
|
||||
hintKeyMode = prefs.keyboard.hintedNumberRowMode
|
||||
}
|
||||
val hintedSymbol = data.hintedSymbol
|
||||
if (prefs.keyboard.hintedSymbols && hintedSymbol != null) {
|
||||
if (prefs.keyboard.hintedSymbolsMode != KeyHintMode.DISABLED && hintedSymbol != null) {
|
||||
hintKeyData = hintedSymbol
|
||||
hintKeyMode = prefs.keyboard.hintedSymbolsMode
|
||||
}
|
||||
dataPopupWithHint = if (hintKeyData == null) {
|
||||
data.popup.toMutableList()
|
||||
} else {
|
||||
val popupList = data.popup.toMutableList()
|
||||
popupList.add(hintKeyData)
|
||||
if (hintKeyMode == KeyHintMode.ENABLED_HINT_PRIORITY) {
|
||||
popupList.add(0, hintKeyData)
|
||||
} else {
|
||||
popupList.add(hintKeyData)
|
||||
}
|
||||
popupList
|
||||
}
|
||||
|
||||
@@ -204,17 +217,18 @@ class KeyView(
|
||||
* go look at which child the pointer is actually above.
|
||||
*/
|
||||
fun onFlorisTouchEvent(event: MotionEvent?): Boolean {
|
||||
event ?: return false
|
||||
if (event == null || !isEnabled) return false
|
||||
if (swipeGestureDetector.onTouchEvent(event)) {
|
||||
isKeyPressed = false
|
||||
osHandler?.removeCallbacksAndMessages(null)
|
||||
osTimer?.cancel()
|
||||
osTimer = null
|
||||
longKeyPressHandler.cancelAll()
|
||||
repeatedKeyPressHandler.cancelAll()
|
||||
keyboardView.popupManager.hide()
|
||||
return true
|
||||
}
|
||||
when (event.actionMasked) {
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
val delayMillis = prefs.keyboard.longPressDelay.toLong()
|
||||
hasTriggeredGestureMove = false
|
||||
shouldBlockNextKeyCode = false
|
||||
florisboard?.prefs?.keyboard?.let {
|
||||
if (it.popupEnabled){
|
||||
@@ -224,23 +238,22 @@ class KeyView(
|
||||
isKeyPressed = true
|
||||
florisboard?.keyPressVibrate()
|
||||
florisboard?.keyPressSound(data)
|
||||
if (data.code == KeyCode.DELETE && data.type == KeyType.ENTER_EDITING) {
|
||||
osTimer = Timer()
|
||||
osTimer?.scheduleAtFixedRate(object : TimerTask() {
|
||||
override fun run() {
|
||||
florisboard?.textInputManager?.sendKeyPress(data)
|
||||
if (!isKeyPressed) {
|
||||
osTimer?.cancel()
|
||||
osTimer = null
|
||||
when (data.code) {
|
||||
KeyCode.ARROW_DOWN,
|
||||
KeyCode.ARROW_LEFT,
|
||||
KeyCode.ARROW_RIGHT,
|
||||
KeyCode.ARROW_UP,
|
||||
KeyCode.DELETE -> {
|
||||
repeatedKeyPressHandler.postAtScheduledRate(delayMillis, 25) {
|
||||
if (isKeyPressed) {
|
||||
florisboard?.textInputManager?.sendKeyPress(data)
|
||||
} else {
|
||||
repeatedKeyPressHandler.cancelAll()
|
||||
}
|
||||
}
|
||||
}, 500, 50)
|
||||
}
|
||||
}
|
||||
val delayMillis = prefs.keyboard.longPressDelay
|
||||
if (osHandler == null) {
|
||||
osHandler = Handler()
|
||||
}
|
||||
osHandler?.postDelayed({
|
||||
longKeyPressHandler.postDelayed(delayMillis) {
|
||||
if (dataPopupWithHint.isNotEmpty()) {
|
||||
keyboardView.popupManager.extend(this)
|
||||
}
|
||||
@@ -253,7 +266,7 @@ class KeyView(
|
||||
)
|
||||
shouldBlockNextKeyCode = true
|
||||
}
|
||||
}, delayMillis.toLong())
|
||||
}
|
||||
}
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
if (keyboardView.popupManager.isShowingExtendedPopup) {
|
||||
@@ -277,16 +290,23 @@ class KeyView(
|
||||
}
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
isKeyPressed = false
|
||||
osHandler?.removeCallbacksAndMessages(null)
|
||||
osTimer?.cancel()
|
||||
osTimer = null
|
||||
val retData = keyboardView.popupManager.getActiveKeyData(this)
|
||||
keyboardView.popupManager.hide()
|
||||
if (event.actionMasked != MotionEvent.ACTION_CANCEL && !shouldBlockNextKeyCode && retData != null) {
|
||||
florisboard?.textInputManager?.sendKeyPress(retData)
|
||||
performClick()
|
||||
longKeyPressHandler.cancelAll()
|
||||
repeatedKeyPressHandler.cancelAll()
|
||||
if (hasTriggeredGestureMove && data.code == KeyCode.DELETE) {
|
||||
hasTriggeredGestureMove = false
|
||||
florisboard?.activeEditorInstance?.apply {
|
||||
if (selection.isSelectionMode) {
|
||||
deleteBackwards()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
shouldBlockNextKeyCode = false
|
||||
val retData = keyboardView.popupManager.getActiveKeyData(this)
|
||||
keyboardView.popupManager.hide()
|
||||
if (event.actionMasked != MotionEvent.ACTION_CANCEL && !shouldBlockNextKeyCode && retData != null) {
|
||||
florisboard?.textInputManager?.sendKeyPress(retData)
|
||||
} else {
|
||||
shouldBlockNextKeyCode = false
|
||||
}
|
||||
}
|
||||
}
|
||||
else -> return false
|
||||
@@ -300,17 +320,65 @@ class KeyView(
|
||||
*/
|
||||
override fun onSwipe(direction: SwipeGesture.Direction, type: SwipeGesture.Type): Boolean {
|
||||
return when (data.code) {
|
||||
KeyCode.DELETE -> when (type) {
|
||||
SwipeGesture.Type.TOUCH_MOVE -> when (direction) {
|
||||
SwipeGesture.Direction.LEFT -> when (prefs.gestures.deleteKeySwipeLeft) {
|
||||
SwipeAction.DELETE_CHARACTERS_PRECISELY -> {
|
||||
florisboard?.activeEditorInstance?.apply {
|
||||
setSelection(
|
||||
if (selection.start > 0) { selection.start - 1 } else { selection.start },
|
||||
selection.end
|
||||
)
|
||||
}
|
||||
hasTriggeredGestureMove = true
|
||||
shouldBlockNextKeyCode = true
|
||||
true
|
||||
}
|
||||
SwipeAction.DELETE_WORDS_PRECISELY -> {
|
||||
florisboard?.activeEditorInstance?.apply {
|
||||
leftAppendWordToSelection()
|
||||
}
|
||||
|
||||
hasTriggeredGestureMove = true
|
||||
shouldBlockNextKeyCode = true
|
||||
true
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
SwipeGesture.Direction.RIGHT -> when (prefs.gestures.deleteKeySwipeLeft) {
|
||||
SwipeAction.DELETE_CHARACTERS_PRECISELY -> {
|
||||
florisboard?.activeEditorInstance?.apply {
|
||||
setSelection(
|
||||
if (selection.start < selection.end) { selection.start + 1 } else { selection.start },
|
||||
selection.end
|
||||
)
|
||||
}
|
||||
shouldBlockNextKeyCode = true
|
||||
true
|
||||
}
|
||||
|
||||
SwipeAction.DELETE_WORDS_PRECISELY -> {
|
||||
florisboard?.activeEditorInstance?.apply {
|
||||
leftPopWordFromSelection()
|
||||
}
|
||||
shouldBlockNextKeyCode = true
|
||||
true
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
KeyCode.SPACE -> when (type) {
|
||||
SwipeGesture.Type.TOUCH_MOVE -> when (direction) {
|
||||
SwipeGesture.Direction.LEFT -> {
|
||||
florisboard?.executeSwipeAction(prefs.gestures.spaceBarSwipeLeft)
|
||||
osHandler?.removeCallbacksAndMessages(null)
|
||||
shouldBlockNextKeyCode = true
|
||||
true
|
||||
}
|
||||
SwipeGesture.Direction.RIGHT -> {
|
||||
florisboard?.executeSwipeAction(prefs.gestures.spaceBarSwipeRight)
|
||||
osHandler?.removeCallbacksAndMessages(null)
|
||||
shouldBlockNextKeyCode = true
|
||||
true
|
||||
}
|
||||
@@ -387,7 +455,8 @@ class KeyView(
|
||||
}
|
||||
}
|
||||
|
||||
drawablePadding = (0.2f * height).toInt()
|
||||
drawablePaddingH = (0.2f * width).toInt()
|
||||
drawablePaddingV = (0.2f * height).toInt()
|
||||
|
||||
// MUST CALL THIS
|
||||
setMeasuredDimension(width, height)
|
||||
@@ -403,34 +472,69 @@ class KeyView(
|
||||
outlineProvider = KeyViewOutline(w, h)
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the enabled state of a key depending on the [data] and its parameters.
|
||||
*/
|
||||
private fun updateEnabledState() {
|
||||
isEnabled = when (data.code) {
|
||||
KeyCode.CLIPBOARD_COPY,
|
||||
KeyCode.CLIPBOARD_CUT -> {
|
||||
florisboard?.activeEditorInstance?.selection?.isSelectionMode == true &&
|
||||
florisboard?.activeEditorInstance?.isRawInputEditor == false
|
||||
}
|
||||
KeyCode.CLIPBOARD_PASTE -> florisboard?.clipboardManager?.hasPrimaryClip() == true
|
||||
KeyCode.CLIPBOARD_SELECT_ALL -> {
|
||||
florisboard?.activeEditorInstance?.isRawInputEditor == false
|
||||
}
|
||||
else -> true
|
||||
}
|
||||
if (!isEnabled) {
|
||||
isKeyPressed = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the background depending on [isKeyPressed] and [data].
|
||||
*/
|
||||
private fun updateKeyPressedBackground() {
|
||||
when (data.code) {
|
||||
KeyCode.ENTER -> {
|
||||
when {
|
||||
keyboardView.isSmartbarKeyboardView -> {
|
||||
elevation = 0.0f
|
||||
setBackgroundTintColor2(
|
||||
this, when {
|
||||
isKeyPressed -> prefs.theme.keyEnterBgColorPressed
|
||||
else -> prefs.theme.keyEnterBgColor
|
||||
}
|
||||
)
|
||||
}
|
||||
KeyCode.SHIFT -> {
|
||||
setBackgroundTintColor2(
|
||||
this, when {
|
||||
isKeyPressed -> prefs.theme.keyShiftBgColorPressed
|
||||
else -> prefs.theme.keyShiftBgColor
|
||||
isKeyPressed && isEnabled -> prefs.theme.smartbarButtonBgColor
|
||||
else -> prefs.theme.smartbarBgColor
|
||||
}
|
||||
)
|
||||
}
|
||||
else -> {
|
||||
setBackgroundTintColor2(
|
||||
this, when {
|
||||
isKeyPressed -> prefs.theme.keyBgColorPressed
|
||||
else -> prefs.theme.keyBgColor
|
||||
elevation = 4.0f
|
||||
when (data.code) {
|
||||
KeyCode.ENTER -> {
|
||||
setBackgroundTintColor2(
|
||||
this, when {
|
||||
isKeyPressed && isEnabled -> prefs.theme.keyEnterBgColorPressed
|
||||
else -> prefs.theme.keyEnterBgColor
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
KeyCode.SHIFT -> {
|
||||
setBackgroundTintColor2(
|
||||
this, when {
|
||||
isKeyPressed && isEnabled -> prefs.theme.keyShiftBgColorPressed
|
||||
else -> prefs.theme.keyShiftBgColor
|
||||
}
|
||||
)
|
||||
}
|
||||
else -> {
|
||||
setBackgroundTintColor2(
|
||||
this, when {
|
||||
isKeyPressed && isEnabled -> prefs.theme.keyBgColorPressed
|
||||
else -> prefs.theme.keyBgColor
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -467,6 +571,7 @@ class KeyView(
|
||||
* TextInputManager.
|
||||
*/
|
||||
fun updateVisibility() {
|
||||
updateEnabledState()
|
||||
when (data.code) {
|
||||
KeyCode.SWITCH_TO_TEXT_CONTEXT,
|
||||
KeyCode.SWITCH_TO_MEDIA_CONTEXT -> {
|
||||
@@ -504,39 +609,33 @@ class KeyView(
|
||||
* Automatically sets the text size of [boxPaint] for given [text] so it fits within the given
|
||||
* bounds.
|
||||
*
|
||||
* Implementation based on this SO answer by Michael Scheper, but has been modified to
|
||||
* incorporate the height as well: https://stackoverflow.com/a/21895626/6801193
|
||||
* Implementation based on this blog post by Lucas (SketchingDev), written on Aug 20, 2015
|
||||
* https://sketchingdev.co.uk/blog/resizing-text-to-fit-into-a-container-on-android.html
|
||||
*
|
||||
* @param boxPaint The [Paint] object which the text size should be applied to.
|
||||
* @param boxWidth The max width for the surrounding box of [text].
|
||||
* @param boxHeight The max height for the surrounding box of [text].
|
||||
* @param text The text for which the size should be calculated.
|
||||
*/
|
||||
private fun setTextSizeFor(boxPaint: Paint, boxWidth: Float, boxHeight: Float, text: String) {
|
||||
var textSize = 64.0f
|
||||
// Must loop twice as there can be bot with and height which are too big, which requires
|
||||
// 2 iterations to adjust
|
||||
for (n in 0..1) {
|
||||
private fun setTextSizeFor(boxPaint: Paint, boxWidth: Float, boxHeight: Float, text: String, multiplier: Float = 1.0f): Float {
|
||||
var stage = 1
|
||||
var textSize = 0.0f
|
||||
while (stage < 3) {
|
||||
if (stage == 1) {
|
||||
textSize += 10.0f
|
||||
} else if (stage == 2) {
|
||||
textSize -= 1.0f
|
||||
}
|
||||
boxPaint.textSize = textSize
|
||||
boxPaint.getTextBounds(text, 0, text.length, tempRect)
|
||||
val diffWidth = tempRect.width() - boxWidth
|
||||
val diffHeight = tempRect.height() - boxHeight
|
||||
val factor = if (diffWidth < 0 && diffHeight < 0) {
|
||||
// Text box is smaller as given box, text size must be increased
|
||||
if (abs(diffWidth) < abs(diffHeight)) {
|
||||
boxWidth / tempRect.width()
|
||||
} else {
|
||||
boxHeight / tempRect.height()
|
||||
}
|
||||
} else if (diffWidth > diffHeight) {
|
||||
// Text box is larger on minimum one side than given box, text size must be decreased
|
||||
boxWidth / tempRect.width()
|
||||
} else {
|
||||
boxHeight / tempRect.height()
|
||||
val fits = tempRect.width() < boxWidth && tempRect.height() < boxHeight
|
||||
if (stage == 1 && !fits || stage == 2 && fits) {
|
||||
stage++
|
||||
}
|
||||
textSize *= factor
|
||||
}
|
||||
textSize *= multiplier
|
||||
boxPaint.textSize = textSize
|
||||
return textSize
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -554,34 +653,58 @@ class KeyView(
|
||||
) {
|
||||
label = getComputedLetter()
|
||||
val hintedNumber = data.hintedNumber
|
||||
if (prefs.keyboard.hintedNumberRow && hintedNumber != null) {
|
||||
if (prefs.keyboard.hintedNumberRowMode != KeyHintMode.DISABLED && hintedNumber != null) {
|
||||
hintedLabel = getComputedLetter(hintedNumber)
|
||||
}
|
||||
val hintedSymbol = data.hintedSymbol
|
||||
if (prefs.keyboard.hintedSymbols && hintedSymbol != null) {
|
||||
if (prefs.keyboard.hintedSymbolsMode != KeyHintMode.DISABLED && hintedSymbol != null) {
|
||||
hintedLabel = getComputedLetter(hintedSymbol)
|
||||
}
|
||||
|
||||
} else {
|
||||
when (data.code) {
|
||||
KeyCode.ARROW_LEFT -> {
|
||||
drawable = getDrawable(context, R.drawable.ic_keyboard_arrow_left)
|
||||
drawableColor = prefs.theme.keyFgColor
|
||||
}
|
||||
KeyCode.ARROW_RIGHT -> {
|
||||
drawable = getDrawable(context, R.drawable.ic_keyboard_arrow_right)
|
||||
drawableColor = prefs.theme.keyFgColor
|
||||
}
|
||||
KeyCode.CLIPBOARD_COPY -> {
|
||||
drawable = getDrawable(context, R.drawable.ic_content_copy)
|
||||
drawableColor = prefs.theme.keyFgColor
|
||||
}
|
||||
KeyCode.CLIPBOARD_CUT -> {
|
||||
drawable = getDrawable(context, R.drawable.ic_content_cut)
|
||||
drawableColor = prefs.theme.keyFgColor
|
||||
}
|
||||
KeyCode.CLIPBOARD_PASTE -> {
|
||||
drawable = getDrawable(context, R.drawable.ic_content_paste)
|
||||
drawableColor = prefs.theme.keyFgColor
|
||||
}
|
||||
KeyCode.CLIPBOARD_SELECT_ALL -> {
|
||||
drawable = getDrawable(context, R.drawable.ic_select_all)
|
||||
drawableColor = prefs.theme.keyFgColor
|
||||
}
|
||||
KeyCode.DELETE -> {
|
||||
drawable = getDrawable(context, R.drawable.ic_backspace)
|
||||
drawableColor = prefs.theme.keyFgColor
|
||||
}
|
||||
KeyCode.ENTER -> {
|
||||
val action = florisboard?.currentInputEditorInfo?.imeOptions ?: 0
|
||||
drawable = getDrawable(context, when (action and EditorInfo.IME_MASK_ACTION) {
|
||||
EditorInfo.IME_ACTION_DONE -> R.drawable.ic_done
|
||||
EditorInfo.IME_ACTION_GO -> R.drawable.ic_arrow_right_alt
|
||||
EditorInfo.IME_ACTION_NEXT -> R.drawable.ic_arrow_right_alt
|
||||
EditorInfo.IME_ACTION_NONE -> R.drawable.ic_keyboard_return
|
||||
EditorInfo.IME_ACTION_PREVIOUS -> R.drawable.ic_arrow_right_alt
|
||||
EditorInfo.IME_ACTION_SEARCH -> R.drawable.ic_search
|
||||
EditorInfo.IME_ACTION_SEND -> R.drawable.ic_send
|
||||
else -> R.drawable.ic_arrow_right_alt
|
||||
val imeOptions = florisboard?.activeEditorInstance?.imeOptions ?: ImeOptions.default()
|
||||
drawable = getDrawable(context, when (imeOptions.action) {
|
||||
ImeOptions.Action.DONE -> R.drawable.ic_done
|
||||
ImeOptions.Action.GO -> R.drawable.ic_arrow_right_alt
|
||||
ImeOptions.Action.NEXT -> R.drawable.ic_arrow_right_alt
|
||||
ImeOptions.Action.NONE -> R.drawable.ic_keyboard_return
|
||||
ImeOptions.Action.PREVIOUS -> R.drawable.ic_arrow_right_alt
|
||||
ImeOptions.Action.SEARCH -> R.drawable.ic_search
|
||||
ImeOptions.Action.SEND -> R.drawable.ic_send
|
||||
ImeOptions.Action.UNSPECIFIED -> R.drawable.ic_keyboard_return
|
||||
})
|
||||
drawableColor = prefs.theme.keyEnterFgColor
|
||||
if (action and EditorInfo.IME_FLAG_NO_ENTER_ACTION > 0) {
|
||||
if (imeOptions.flagNoEnterAction) {
|
||||
drawable = getDrawable(context, R.drawable.ic_keyboard_return)
|
||||
}
|
||||
}
|
||||
@@ -658,6 +781,9 @@ class KeyView(
|
||||
// Draw drawable
|
||||
val drawable = drawable
|
||||
if (drawable != null) {
|
||||
if (keyboardView.isSmartbarKeyboardView && !isEnabled) {
|
||||
drawableColor = prefs.theme.smartbarFgColorAlt
|
||||
}
|
||||
var marginV = 0
|
||||
var marginH = 0
|
||||
if (measuredWidth > measuredHeight) {
|
||||
@@ -665,11 +791,12 @@ class KeyView(
|
||||
} else {
|
||||
marginV = (measuredHeight - measuredWidth) / 2
|
||||
}
|
||||
// Note: using the vertical padding for horizontal as well on purpose here
|
||||
drawable.setBounds(
|
||||
marginH + drawablePadding,
|
||||
marginV + drawablePadding,
|
||||
measuredWidth - marginH - drawablePadding,
|
||||
measuredHeight - marginV - drawablePadding)
|
||||
marginH + drawablePaddingV,
|
||||
marginV + drawablePaddingV,
|
||||
measuredWidth - marginH - drawablePaddingV,
|
||||
measuredHeight - marginV - drawablePaddingV)
|
||||
drawable.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(
|
||||
drawableColor,
|
||||
BlendModeCompat.SRC_ATOP
|
||||
@@ -685,22 +812,33 @@ class KeyView(
|
||||
labelPaint.textSize = resources.getDimension(R.dimen.key_numeric_textSize)
|
||||
}
|
||||
else -> when {
|
||||
data.type == KeyType.CHARACTER && data.code != KeyCode.SPACE -> {
|
||||
setTextSizeFor(
|
||||
(data.type == KeyType.CHARACTER || data.type == KeyType.NUMERIC) &&
|
||||
data.code != KeyCode.SPACE -> {
|
||||
val cachedTextSize = setTextSizeFor(
|
||||
labelPaint,
|
||||
desiredWidth - (2.6f * drawablePadding),
|
||||
desiredHeight - (3.6f * drawablePadding),
|
||||
desiredWidth - (2.6f * drawablePaddingH),
|
||||
desiredHeight - (3.4f * drawablePaddingV),
|
||||
// Note: taking a "X" here because it is one of the biggest letters and
|
||||
// the keys must have the same base character for calculation, else
|
||||
// they will all look different and weird...
|
||||
"X"
|
||||
"X",
|
||||
when (resources.configuration.orientation) {
|
||||
Configuration.ORIENTATION_PORTRAIT -> {
|
||||
prefs.keyboard.fontSizeMultiplierPortrait.toFloat() / 100.0f
|
||||
}
|
||||
Configuration.ORIENTATION_LANDSCAPE -> {
|
||||
prefs.keyboard.fontSizeMultiplierLandscape.toFloat() / 100.0f
|
||||
}
|
||||
else -> 1.0f
|
||||
}
|
||||
)
|
||||
keyboardView.popupManager.keyPopupTextSize = cachedTextSize
|
||||
}
|
||||
else -> {
|
||||
setTextSizeFor(
|
||||
labelPaint,
|
||||
measuredWidth - (2.6f * drawablePadding),
|
||||
measuredHeight - (3.6f * drawablePadding),
|
||||
measuredWidth - (1.2f * drawablePaddingH),
|
||||
measuredHeight - (3.6f * drawablePaddingV),
|
||||
when (data.code) {
|
||||
KeyCode.VIEW_CHARACTERS, KeyCode.VIEW_SYMBOLS, KeyCode.VIEW_SYMBOLS2 -> {
|
||||
resources.getString(R.string.key__view_symbols)
|
||||
|
||||
@@ -24,5 +24,7 @@ enum class KeyboardMode {
|
||||
NUMERIC,
|
||||
NUMERIC_ADVANCED,
|
||||
PHONE,
|
||||
PHONE2
|
||||
PHONE2,
|
||||
SMARTBAR_CLIPBOARD_CURSOR_ROW,
|
||||
SMARTBAR_NUMBER_ROW
|
||||
}
|
||||
|
||||
@@ -60,6 +60,7 @@ class KeyboardView : LinearLayout, FlorisBoard.EventListener, SwipeGesture.Liste
|
||||
var florisboard: FlorisBoard? = FlorisBoard.getInstanceOrNull()
|
||||
private var initialKeyCode: Int = 0
|
||||
var isPreviewMode: Boolean = false
|
||||
var isSmartbarKeyboardView: Boolean = false
|
||||
var popupManager = KeyPopupManager<KeyboardView, KeyView>(this)
|
||||
private val prefs: PrefHelper = PrefHelper.getDefaultInstance(context)
|
||||
private val swipeGestureDetector = SwipeGesture.Detector(context, this)
|
||||
@@ -132,7 +133,7 @@ class KeyboardView : LinearLayout, FlorisBoard.EventListener, SwipeGesture.Liste
|
||||
return false
|
||||
}
|
||||
val eventFloris = MotionEvent.obtainNoHistory(event)
|
||||
if (swipeGestureDetector.onTouchEvent(event)) {
|
||||
if (!isSmartbarKeyboardView && swipeGestureDetector.onTouchEvent(event)) {
|
||||
sendFlorisTouchEvent(eventFloris, MotionEvent.ACTION_CANCEL)
|
||||
activeKeyView = null
|
||||
activePointerId = null
|
||||
@@ -222,7 +223,8 @@ class KeyboardView : LinearLayout, FlorisBoard.EventListener, SwipeGesture.Liste
|
||||
override fun onSwipe(direction: SwipeGesture.Direction, type: SwipeGesture.Type): Boolean {
|
||||
return when {
|
||||
initialKeyCode == KeyCode.DELETE -> {
|
||||
if (type == SwipeGesture.Type.TOUCH_UP && direction == SwipeGesture.Direction.LEFT) {
|
||||
if (type == SwipeGesture.Type.TOUCH_UP && direction == SwipeGesture.Direction.LEFT &&
|
||||
prefs.gestures.deleteKeySwipeLeft == SwipeAction.DELETE_WORD) {
|
||||
florisboard?.executeSwipeAction(prefs.gestures.deleteKeySwipeLeft)
|
||||
true
|
||||
} else {
|
||||
@@ -287,20 +289,29 @@ class KeyboardView : LinearLayout, FlorisBoard.EventListener, SwipeGesture.Liste
|
||||
* The desired key heights/widths are being calculated here.
|
||||
*/
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
val widthSize = MeasureSpec.getSize(widthMeasureSpec)
|
||||
|
||||
val keyMarginH = resources.getDimension((R.dimen.key_marginH)).toInt()
|
||||
desiredKeyWidth = (widthSize / 10) - (2 * keyMarginH)
|
||||
|
||||
val keyMarginV = resources.getDimension((R.dimen.key_marginV)).toInt()
|
||||
val keyHeightFactor = when (isPreviewMode) {
|
||||
true -> 0.90f
|
||||
else -> 1.00f
|
||||
}
|
||||
val desiredHeight = keyHeightFactor * (florisboard?.inputView?.desiredTextKeyboardViewHeight ?: resources.getDimension(R.dimen.textKeyboardView_baseHeight).toInt())
|
||||
desiredKeyHeight = (desiredHeight / 4 - 2 * keyMarginV).roundToInt()
|
||||
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(desiredHeight.roundToInt(), MeasureSpec.EXACTLY))
|
||||
val desiredWidth = MeasureSpec.getSize(widthMeasureSpec).toFloat()
|
||||
desiredKeyWidth = if (isSmartbarKeyboardView) {
|
||||
(desiredWidth / 6.0f - 2.0f * keyMarginH).roundToInt()
|
||||
} else {
|
||||
(desiredWidth / 10.0f - 2.0f * keyMarginH).roundToInt()
|
||||
}
|
||||
val desiredHeight = if (isSmartbarKeyboardView || isPreviewMode) {
|
||||
MeasureSpec.getSize(heightMeasureSpec).toFloat()
|
||||
} else {
|
||||
(florisboard?.inputView?.desiredTextKeyboardViewHeight ?: MeasureSpec.getSize(heightMeasureSpec).toFloat())
|
||||
} * if (isPreviewMode) { 0.90f } else { 1.00f }
|
||||
desiredKeyHeight = when {
|
||||
isSmartbarKeyboardView -> desiredHeight - 1.5f * keyMarginV
|
||||
else -> desiredHeight / (computedLayout?.arrangement?.size?.toFloat() ?: 4.0f) - 2.0f * keyMarginV
|
||||
}.roundToInt()
|
||||
|
||||
super.onMeasure(
|
||||
MeasureSpec.makeMeasureSpec(desiredWidth.roundToInt(), MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(desiredHeight.roundToInt(), MeasureSpec.EXACTLY)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onApplyThemeAttributes() {
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.squareup.moshi.JsonAdapter
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.squareup.moshi.Types
|
||||
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import dev.patrickgold.florisboard.ime.core.Subtype
|
||||
import dev.patrickgold.florisboard.ime.text.key.*
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardMode
|
||||
@@ -39,7 +40,7 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
/**
|
||||
* Loads the layout for the specified type and name.
|
||||
*
|
||||
* @returns the [LayoutData] or null.
|
||||
* @return the [LayoutData] or null.
|
||||
*/
|
||||
private fun loadLayout(ltn: LTN?) = loadLayout(ltn?.first, ltn?.second)
|
||||
private fun loadLayout(type: LayoutType?, name: String?): LayoutData? {
|
||||
@@ -106,14 +107,15 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
* @param main The main layout type and name.
|
||||
* @param modifier The modifier (mod) layout type and name.
|
||||
* @param extension The extension layout type and name.
|
||||
* @returns a [ComputedLayoutData] object, regardless of the specified LTNs or errors.
|
||||
* @return a [ComputedLayoutData] object, regardless of the specified LTNs or errors.
|
||||
*/
|
||||
private suspend fun mergeLayoutsAsync(
|
||||
keyboardMode: KeyboardMode,
|
||||
subtype: Subtype,
|
||||
main: LTN? = null,
|
||||
modifier: LTN? = null,
|
||||
extension: LTN? = null
|
||||
extension: LTN? = null,
|
||||
prefs: PrefHelper
|
||||
): ComputedLayoutData {
|
||||
val computedArrangement: ComputedLayoutDataArrangement = mutableListOf()
|
||||
|
||||
@@ -172,20 +174,23 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
for (computedRow in computedArrangement) {
|
||||
for (keyData in computedRow) {
|
||||
if (keyData.variation != KeyVariation.ALL) {
|
||||
if (keyData.variation == KeyVariation.NORMAL ||
|
||||
keyData.variation == KeyVariation.PASSWORD) {
|
||||
if (extendedPopups.containsKey(keyData.label + "~normal")) {
|
||||
keyData.popup.addAll(extendedPopups[keyData.label + "~normal"] ?: listOf())
|
||||
if (keyData.label == "." && modifierLayout?.name != "dvorak" ||
|
||||
keyData.label == "z" && modifierLayout?.name == "dvorak") {
|
||||
val label = "." // keyData.label
|
||||
if (keyData.variation == KeyVariation.NORMAL ||
|
||||
keyData.variation == KeyVariation.PASSWORD) {
|
||||
if (extendedPopups.containsKey("$label~normal")) {
|
||||
keyData.popup.addAll(extendedPopups["$label~normal"] ?: listOf())
|
||||
}
|
||||
}
|
||||
if (keyData.variation == KeyVariation.EMAIL_ADDRESS ||
|
||||
keyData.variation == KeyVariation.URI) {
|
||||
if (extendedPopups.containsKey("$label~uri")) {
|
||||
keyData.popup.addAll(extendedPopups["$label~uri"] ?: listOf())
|
||||
}
|
||||
}
|
||||
}
|
||||
if (keyData.variation == KeyVariation.EMAIL_ADDRESS ||
|
||||
keyData.variation == KeyVariation.URI) {
|
||||
if (extendedPopups.containsKey(keyData.label + "~uri")) {
|
||||
keyData.popup.addAll(extendedPopups[keyData.label + "~uri"] ?: listOf())
|
||||
}
|
||||
}
|
||||
}
|
||||
if (extendedPopups.containsKey(keyData.label)) {
|
||||
} else if (extendedPopups.containsKey(keyData.label)) {
|
||||
keyData.popup.addAll(extendedPopups[keyData.label] ?: listOf())
|
||||
}
|
||||
}
|
||||
@@ -194,18 +199,25 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
|
||||
// Add hints to keys
|
||||
if (keyboardMode == KeyboardMode.CHARACTERS) {
|
||||
val symbolsComputedArrangement = fetchComputedLayoutAsync(KeyboardMode.SYMBOLS, subtype).await().arrangement
|
||||
val symbolsComputedArrangement = fetchComputedLayoutAsync(KeyboardMode.SYMBOLS, subtype, prefs).await().arrangement
|
||||
val minRow = if (prefs.keyboard.numberRow) { 1 } else { 0 }
|
||||
for ((r, row) in computedArrangement.withIndex()) {
|
||||
if (r >= 3) {
|
||||
break
|
||||
if (r >= (3 + minRow) || r < minRow) {
|
||||
continue
|
||||
}
|
||||
if (symbolsComputedArrangement.getOrNull(r) != null) {
|
||||
var kOffset = 0
|
||||
val symbolRow = symbolsComputedArrangement.getOrNull(r - minRow)
|
||||
if (symbolRow != null) {
|
||||
for ((k, key) in row.withIndex()) {
|
||||
if (key.type == KeyType.CHARACTER) {
|
||||
val symbol = symbolsComputedArrangement[r].getOrNull(k)
|
||||
if (r == 0) {
|
||||
val lastKey = row.getOrNull(k - 1)
|
||||
if (key.variation != KeyVariation.ALL && lastKey != null && lastKey.variation != KeyVariation.ALL) {
|
||||
kOffset++
|
||||
}
|
||||
val symbol = symbolRow.getOrNull(k - kOffset)
|
||||
if (key.type == KeyType.CHARACTER && symbol?.type == KeyType.CHARACTER) {
|
||||
if (r == minRow) {
|
||||
key.hintedNumber = symbol
|
||||
} else {
|
||||
} else if (r > minRow) {
|
||||
key.hintedSymbol = symbol
|
||||
}
|
||||
}
|
||||
@@ -232,7 +244,8 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
*/
|
||||
private suspend fun computeLayoutFor(
|
||||
keyboardMode: KeyboardMode,
|
||||
subtype: Subtype
|
||||
subtype: Subtype,
|
||||
prefs: PrefHelper
|
||||
): ComputedLayoutData {
|
||||
var main: LTN? = null
|
||||
var modifier: LTN? = null
|
||||
@@ -240,6 +253,9 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
|
||||
when (keyboardMode) {
|
||||
KeyboardMode.CHARACTERS -> {
|
||||
if (prefs.keyboard.numberRow) {
|
||||
extension = LTN(LayoutType.EXTENSION, "number_row")
|
||||
}
|
||||
main = LTN(LayoutType.CHARACTERS, subtype.layout)
|
||||
modifier = LTN(LayoutType.CHARACTERS_MOD, "default")
|
||||
}
|
||||
@@ -259,17 +275,43 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
main = LTN(LayoutType.PHONE2, "default")
|
||||
}
|
||||
KeyboardMode.SYMBOLS -> {
|
||||
extension = LTN(LayoutType.EXTENSION, "number_row")
|
||||
main = LTN(LayoutType.SYMBOLS, "western_default")
|
||||
modifier = LTN(LayoutType.SYMBOLS_MOD, "default")
|
||||
extension = LTN(LayoutType.EXTENSION, "number_row")
|
||||
}
|
||||
KeyboardMode.SYMBOLS2 -> {
|
||||
main = LTN(LayoutType.SYMBOLS2, "western_default")
|
||||
modifier = LTN(LayoutType.SYMBOLS2_MOD, "default")
|
||||
}
|
||||
KeyboardMode.SMARTBAR_CLIPBOARD_CURSOR_ROW -> {
|
||||
extension = LTN(LayoutType.EXTENSION, "clipboard_cursor_row")
|
||||
}
|
||||
KeyboardMode.SMARTBAR_NUMBER_ROW -> {
|
||||
extension = LTN(LayoutType.EXTENSION, "number_row")
|
||||
}
|
||||
}
|
||||
|
||||
return mergeLayoutsAsync(keyboardMode, subtype, main, modifier, extension)
|
||||
return mergeLayoutsAsync(keyboardMode, subtype, main, modifier, extension, prefs)
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the layout cache for the specified [keyboardMode].
|
||||
*
|
||||
* @param keyboardMode The keyboard mode for which the layout cache should be cleared. If null
|
||||
* is passed, the entire cache will be cleared. Defaults to null.
|
||||
*/
|
||||
fun clearLayoutCache(keyboardMode: KeyboardMode? = null) {
|
||||
if (keyboardMode == null) {
|
||||
computedLayoutCache.clear()
|
||||
} else {
|
||||
val it = computedLayoutCache.iterator()
|
||||
while (it.hasNext()) {
|
||||
val kms = it.next().key
|
||||
if (kms.first == keyboardMode) {
|
||||
it.remove()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -283,7 +325,8 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
@Synchronized
|
||||
fun fetchComputedLayoutAsync(
|
||||
keyboardMode: KeyboardMode,
|
||||
subtype: Subtype
|
||||
subtype: Subtype,
|
||||
prefs: PrefHelper
|
||||
): Deferred<ComputedLayoutData> {
|
||||
val kms = KMS(keyboardMode, subtype)
|
||||
val cachedComputedLayout = computedLayoutCache[kms]
|
||||
@@ -291,7 +334,7 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
cachedComputedLayout
|
||||
} else {
|
||||
val computedLayout = async(Dispatchers.IO) {
|
||||
computeLayoutFor(keyboardMode, subtype)
|
||||
computeLayoutFor(keyboardMode, subtype, prefs)
|
||||
}
|
||||
computedLayoutCache[kms] = computedLayout
|
||||
computedLayout
|
||||
@@ -309,12 +352,13 @@ class LayoutManager(private val context: Context) : CoroutineScope by MainScope(
|
||||
@Synchronized
|
||||
fun preloadComputedLayout(
|
||||
keyboardMode: KeyboardMode,
|
||||
subtype: Subtype
|
||||
subtype: Subtype,
|
||||
prefs: PrefHelper
|
||||
) {
|
||||
val kms = KMS(keyboardMode, subtype)
|
||||
if (computedLayoutCache[kms] == null) {
|
||||
computedLayoutCache[kms] = async(Dispatchers.IO) {
|
||||
computeLayoutFor(keyboardMode, subtype)
|
||||
computeLayoutFor(keyboardMode, subtype, prefs)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,234 +0,0 @@
|
||||
package dev.patrickgold.florisboard.ime.text.smartbar
|
||||
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.inputmethod.CursorAnchorInfo
|
||||
import android.widget.Button
|
||||
import android.widget.ImageButton
|
||||
import android.widget.LinearLayout
|
||||
import androidx.core.view.children
|
||||
import dev.patrickgold.florisboard.BuildConfig
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.core.FlorisBoard
|
||||
import dev.patrickgold.florisboard.ime.text.TextInputManager
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyCode
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyData
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardMode
|
||||
|
||||
// TODO: Implement suggestion creation functionality
|
||||
// TODO: Cleanup and reorganize SmartbarManager
|
||||
class SmartbarManager private constructor() : FlorisBoard.EventListener {
|
||||
|
||||
private val florisboard: FlorisBoard = FlorisBoard.getInstance()
|
||||
private var isComposingEnabled: Boolean = false
|
||||
private val textInputManager: TextInputManager = TextInputManager.getInstance()
|
||||
var smartbarView: SmartbarView? = null
|
||||
private set
|
||||
|
||||
var isQuickActionsVisible: Boolean = false
|
||||
set(value) { field = value; updateActiveContainerVisibility() }
|
||||
|
||||
private val candidateViewOnClickListener = View.OnClickListener { v ->
|
||||
val view = v as Button
|
||||
val text = view.text.toString()
|
||||
if (text.isNotEmpty()) {
|
||||
florisboard.activeEditorInstance.commitCompletion(text)
|
||||
}
|
||||
}
|
||||
private val candidateViewOnLongClickListener = View.OnLongClickListener { v ->
|
||||
true
|
||||
}
|
||||
private val keyButtonOnClickListener = View.OnClickListener { v ->
|
||||
val keyData = when (v.id) {
|
||||
R.id.number_row_0 -> KeyData(48, "0")
|
||||
R.id.number_row_1 -> KeyData(49, "1")
|
||||
R.id.number_row_2 -> KeyData(50, "2")
|
||||
R.id.number_row_3 -> KeyData(51, "3")
|
||||
R.id.number_row_4 -> KeyData(52, "4")
|
||||
R.id.number_row_5 -> KeyData(53, "5")
|
||||
R.id.number_row_6 -> KeyData(54, "6")
|
||||
R.id.number_row_7 -> KeyData(55, "7")
|
||||
R.id.number_row_8 -> KeyData(56, "8")
|
||||
R.id.number_row_9 -> KeyData(57, "9")
|
||||
R.id.cc_select_all -> KeyData(KeyCode.CLIPBOARD_SELECT_ALL)
|
||||
R.id.cc_copy -> KeyData(KeyCode.CLIPBOARD_COPY)
|
||||
R.id.cc_arrow_left -> KeyData(KeyCode.ARROW_LEFT)
|
||||
R.id.cc_arrow_right -> KeyData(KeyCode.ARROW_RIGHT)
|
||||
R.id.cc_cut -> KeyData(KeyCode.CLIPBOARD_CUT)
|
||||
R.id.cc_paste -> KeyData(KeyCode.CLIPBOARD_PASTE)
|
||||
else -> KeyData(0)
|
||||
}
|
||||
florisboard.textInputManager.sendKeyPress(keyData)
|
||||
}
|
||||
private val quickActionOnClickListener = View.OnClickListener { v ->
|
||||
when (v.id) {
|
||||
R.id.back_button -> {
|
||||
florisboard.textInputManager.setActiveKeyboardMode(KeyboardMode.CHARACTERS)
|
||||
smartbarView?.setActiveVariant(R.id.smartbar_variant_default)
|
||||
}
|
||||
R.id.quick_action_switch_to_editing_context -> {
|
||||
if (florisboard.textInputManager.getActiveKeyboardMode() == KeyboardMode.EDITING) {
|
||||
florisboard.textInputManager.setActiveKeyboardMode(KeyboardMode.CHARACTERS)
|
||||
smartbarView?.setActiveVariant(R.id.smartbar_variant_default)
|
||||
} else {
|
||||
florisboard.textInputManager.setActiveKeyboardMode(KeyboardMode.EDITING)
|
||||
smartbarView?.setActiveVariant(R.id.smartbar_variant_back_only)
|
||||
}
|
||||
}
|
||||
R.id.quick_action_switch_to_media_context -> florisboard.setActiveInput(R.id.media_input)
|
||||
R.id.quick_action_open_settings -> florisboard.launchSettings()
|
||||
R.id.quick_action_one_handed_toggle -> florisboard.toggleOneHandedMode()
|
||||
else -> return@OnClickListener
|
||||
}
|
||||
isQuickActionsVisible = false
|
||||
}
|
||||
private val quickActionToggleOnClickListener = View.OnClickListener {
|
||||
isQuickActionsVisible = !isQuickActionsVisible
|
||||
}
|
||||
|
||||
companion object {
|
||||
private var instance: SmartbarManager? = null
|
||||
|
||||
@Synchronized
|
||||
fun getInstance(): SmartbarManager {
|
||||
if (instance == null) {
|
||||
instance = SmartbarManager()
|
||||
}
|
||||
return instance!!
|
||||
}
|
||||
}
|
||||
|
||||
fun registerSmartbarView(smartbarView: SmartbarView) {
|
||||
if (BuildConfig.DEBUG) Log.i(this::class.simpleName, "registerSmartbarView(smartbarView)")
|
||||
|
||||
this.smartbarView = smartbarView
|
||||
|
||||
smartbarView.findViewById<View>(R.id.quick_action_toggle)?.setOnClickListener(quickActionToggleOnClickListener)
|
||||
val quickActions = smartbarView.findViewById<LinearLayout>(R.id.quick_actions)
|
||||
for (quickAction in quickActions.children) {
|
||||
if (quickAction is ImageButton) {
|
||||
quickAction.setOnClickListener(quickActionOnClickListener)
|
||||
}
|
||||
}
|
||||
val numberRow = smartbarView.findViewById<LinearLayout>(R.id.number_row)
|
||||
for (numberRowButton in numberRow.children) {
|
||||
if (numberRowButton is Button) {
|
||||
numberRowButton.setOnClickListener(keyButtonOnClickListener)
|
||||
}
|
||||
}
|
||||
val clipboardCursorRow = smartbarView.findViewById<ViewGroup>(R.id.clipboard_cursor_row)
|
||||
for (clipboardCursorRowButton in clipboardCursorRow.children) {
|
||||
if (clipboardCursorRowButton is ImageButton) {
|
||||
clipboardCursorRowButton.setOnClickListener(keyButtonOnClickListener)
|
||||
}
|
||||
}
|
||||
val backButton = smartbarView.findViewById<View>(R.id.back_button)
|
||||
backButton.setOnClickListener(quickActionOnClickListener)
|
||||
for (candidateView in smartbarView.candidateViewList) {
|
||||
candidateView.setOnClickListener(candidateViewOnClickListener)
|
||||
candidateView.setOnLongClickListener(candidateViewOnLongClickListener)
|
||||
}
|
||||
|
||||
smartbarView.setActiveVariant(R.id.smartbar_variant_default)
|
||||
}
|
||||
|
||||
override fun onWindowShown() {
|
||||
isQuickActionsVisible = false
|
||||
}
|
||||
|
||||
// TODO: clean up resources here
|
||||
override fun onDestroy() {
|
||||
if (BuildConfig.DEBUG) Log.i(this::class.simpleName, "onDestroy()")
|
||||
|
||||
instance = null
|
||||
}
|
||||
|
||||
fun onStartInputView(keyboardMode: KeyboardMode, isComposingEnabled: Boolean) {
|
||||
this.isComposingEnabled = isComposingEnabled
|
||||
when (keyboardMode) {
|
||||
KeyboardMode.NUMERIC, KeyboardMode.PHONE, KeyboardMode.PHONE2 -> {
|
||||
smartbarView?.setActiveVariant(null)
|
||||
}
|
||||
else -> {
|
||||
smartbarView?.setActiveVariant(R.id.smartbar_variant_default)
|
||||
isQuickActionsVisible = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun onFinishInputView() {
|
||||
//spellCheckerSession?.close()
|
||||
}
|
||||
|
||||
override fun onUpdateSelection() {
|
||||
val isSelectionActive = florisboard.activeEditorInstance.selection.isSelectionMode
|
||||
smartbarView?.findViewById<View>(R.id.cc_cut)?.isEnabled = isSelectionActive
|
||||
smartbarView?.findViewById<View>(R.id.cc_copy)?.isEnabled = isSelectionActive
|
||||
smartbarView?.findViewById<View>(R.id.cc_paste)?.isEnabled =
|
||||
florisboard.clipboardManager?.hasPrimaryClip() ?: false
|
||||
smartbarView?.invalidate()
|
||||
}
|
||||
|
||||
fun deleteCandidateFromDictionary(candidate: String) {
|
||||
//
|
||||
}
|
||||
|
||||
fun resetCandidates() {
|
||||
//
|
||||
}
|
||||
|
||||
fun generateCandidatesFromComposing(composingText: String) {
|
||||
val smartbarView = smartbarView ?: return
|
||||
|
||||
if (composingText == "") {
|
||||
smartbarView.candidateViewList[0].text = "candidate"
|
||||
smartbarView.candidateViewList[1].text = "suggestions"
|
||||
smartbarView.candidateViewList[2].text = "nyi"
|
||||
} else {
|
||||
smartbarView.candidateViewList[0].text = ""
|
||||
smartbarView.candidateViewList[1].text = composingText + "test"
|
||||
smartbarView.candidateViewList[2].text = ""
|
||||
}
|
||||
//spellCheckerSession?.getSentenceSuggestions(arrayOf(TextInfo(composing)), 3)
|
||||
//android.util.Log.i("SPELL", "GEN")
|
||||
/*val dic: Uri = UserDictionary.Words.CONTENT_URI
|
||||
val resolver: ContentResolver = florisboard.contentResolver
|
||||
val cursor: Cursor = resolver.query(dic, null, null, null, null) ?: return
|
||||
var count = 0
|
||||
while (cursor.moveToNext()) {
|
||||
val word = cursor.getString(cursor.getColumnIndex(UserDictionary.Words.WORD))
|
||||
candidateViewList[count].text = word
|
||||
if (count++ > 2) {
|
||||
break
|
||||
}
|
||||
}
|
||||
cursor.close()*/
|
||||
}
|
||||
|
||||
fun writeCandidate(candidate: String) {
|
||||
//
|
||||
}
|
||||
|
||||
private fun updateActiveContainerVisibility() {
|
||||
val smartbarView = smartbarView ?: return
|
||||
|
||||
if (isQuickActionsVisible) {
|
||||
smartbarView.setActiveContainer(R.id.quick_actions)
|
||||
smartbarView.findViewById<View>(R.id.quick_action_toggle)?.rotation = -180.0f
|
||||
} else {
|
||||
if (isComposingEnabled) {
|
||||
smartbarView.setActiveContainer(R.id.candidates)
|
||||
} else if (textInputManager.getActiveKeyboardMode() == KeyboardMode.CHARACTERS) {
|
||||
smartbarView.setActiveContainer(when (florisboard.prefs.suggestion.showInstead) {
|
||||
"number_row" -> R.id.number_row
|
||||
"clipboard_cursor_tools" -> R.id.clipboard_cursor_row
|
||||
else -> null
|
||||
})
|
||||
} else {
|
||||
smartbarView.setActiveContainer(null)
|
||||
}
|
||||
smartbarView.findViewById<View>(R.id.quick_action_toggle)?.rotation = 0.0f
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ package dev.patrickgold.florisboard.ime.text.smartbar
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.util.AttributeSet
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import dev.patrickgold.florisboard.util.setBackgroundTintColor2
|
||||
|
||||
@@ -33,6 +34,10 @@ class SmartbarQuickActionButton : androidx.appcompat.widget.AppCompatImageButton
|
||||
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||
|
||||
init {
|
||||
updateTheme()
|
||||
}
|
||||
|
||||
/**
|
||||
* Override onMeasure() to automatically set the height of the button equal to the width of
|
||||
* the button. The height is MATCH_PARENT and the exact same calculated pixel size should be
|
||||
@@ -43,8 +48,17 @@ class SmartbarQuickActionButton : androidx.appcompat.widget.AppCompatImageButton
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas?) {
|
||||
updateTheme()
|
||||
super.onDraw(canvas)
|
||||
setBackgroundTintColor2(this, prefs.theme.smartbarButtonBgColor)
|
||||
setColorFilter(prefs.theme.smartbarButtonFgColor)
|
||||
}
|
||||
|
||||
private fun updateTheme() {
|
||||
if (id == R.id.private_mode_button) {
|
||||
setBackgroundTintColor2(this, prefs.theme.privateModeBgColor)
|
||||
setColorFilter(prefs.theme.privateModeFgColor)
|
||||
} else {
|
||||
setBackgroundTintColor2(this, prefs.theme.smartbarButtonBgColor)
|
||||
setColorFilter(prefs.theme.smartbarButtonFgColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,97 +19,284 @@ package dev.patrickgold.florisboard.ime.text.smartbar
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.util.AttributeSet
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Button
|
||||
import android.widget.ImageButton
|
||||
import android.widget.LinearLayout
|
||||
import androidx.annotation.IdRes
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.core.view.children
|
||||
import dev.patrickgold.florisboard.BuildConfig
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.databinding.SmartbarBinding
|
||||
import dev.patrickgold.florisboard.ime.core.FlorisBoard
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import dev.patrickgold.florisboard.util.setImageTintColor2
|
||||
import kotlinx.android.synthetic.main.florisboard.view.*
|
||||
import dev.patrickgold.florisboard.ime.core.Subtype
|
||||
import dev.patrickgold.florisboard.ime.text.key.KeyVariation
|
||||
import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardMode
|
||||
import dev.patrickgold.florisboard.util.setBackgroundTintColor2
|
||||
import dev.patrickgold.florisboard.util.setDrawableTintColor2
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.MainScope
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
import java.lang.ref.WeakReference
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
/**
|
||||
* View class which keeps the references to important children and informs [SmartbarManager] that
|
||||
* it is now the active [SmartbarView] (useful when resetting the input view of FlorisBoard due to
|
||||
* a theme change).
|
||||
* View class which manages the state and the UI of the Smartbar, a key element in the usefulness
|
||||
* of FlorisBoard. The view automatically tries to get the current FlorisBoard instance, which it
|
||||
* needs to decide when a specific feature component is shown.
|
||||
*/
|
||||
class SmartbarView : LinearLayout {
|
||||
class SmartbarView : ConstraintLayout {
|
||||
private val florisboard: FlorisBoard? = FlorisBoard.getInstanceOrNull()
|
||||
private val prefs: PrefHelper = PrefHelper.getDefaultInstance(context)
|
||||
private val smartbarManager = SmartbarManager.getInstance()
|
||||
private var eventListener: WeakReference<EventListener?>? = null
|
||||
private val mainScope = MainScope()
|
||||
|
||||
private var variants: MutableList<ViewGroup> = mutableListOf()
|
||||
private var containers: MutableList<ViewGroup> = mutableListOf()
|
||||
private var cachedActionStartAreaVisible: Boolean = false
|
||||
@IdRes private var cachedActionStartAreaId: Int? = null
|
||||
@IdRes private var cachedMainAreaId: Int? = null
|
||||
private var cachedActionEndAreaVisible: Boolean = false
|
||||
@IdRes private var cachedActionEndAreaId: Int? = null
|
||||
|
||||
var candidateViewList: MutableList<Button> = mutableListOf()
|
||||
private set
|
||||
var isQuickActionsVisible: Boolean = false
|
||||
set(v) {
|
||||
binding.quickActionToggle.rotation = if (v) 180.0f else 0.0f
|
||||
field = v
|
||||
}
|
||||
private var shouldSuggestClipboardContents: Boolean = false
|
||||
|
||||
private lateinit var binding: SmartbarBinding
|
||||
private var indexedActionStartArea: MutableList<Int> = mutableListOf()
|
||||
private var indexedMainArea: MutableList<Int> = mutableListOf()
|
||||
private var indexedActionEndArea: MutableList<Int> = mutableListOf()
|
||||
|
||||
private var candidateViewList: MutableList<Button> = mutableListOf()
|
||||
|
||||
constructor(context: Context) : this(context, null)
|
||||
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||
|
||||
/**
|
||||
* Called by Android when this view has been attached to a window. At this point we can be
|
||||
* certain that all children have been instantiated and that we can begin working with them.
|
||||
* After initializing all child views, this method registers the SmartbarView in the
|
||||
* TextInputManager, which then starts working together with this view.
|
||||
*/
|
||||
override fun onAttachedToWindow() {
|
||||
if (BuildConfig.DEBUG) Log.i(this::class.simpleName, "onAttachedToWindow()")
|
||||
Timber.i("onAttachedToWindow()")
|
||||
|
||||
super.onAttachedToWindow()
|
||||
|
||||
variants.add(findViewById(R.id.smartbar_variant_default))
|
||||
variants.add(findViewById(R.id.smartbar_variant_back_only))
|
||||
binding = SmartbarBinding.bind(this)
|
||||
|
||||
containers.add(findViewById(R.id.candidates))
|
||||
containers.add(findViewById(R.id.clipboard_cursor_row))
|
||||
containers.add(findViewById(R.id.number_row))
|
||||
containers.add(findViewById(R.id.quick_actions))
|
||||
for (view in binding.actionStartArea.children) {
|
||||
indexedActionStartArea.add(view.id)
|
||||
}
|
||||
for (view in binding.mainArea.children) {
|
||||
indexedMainArea.add(view.id)
|
||||
}
|
||||
for (view in binding.actionEndArea.children) {
|
||||
indexedActionEndArea.add(view.id)
|
||||
}
|
||||
|
||||
candidateViewList.add(findViewById(R.id.candidate0))
|
||||
candidateViewList.add(findViewById(R.id.candidate1))
|
||||
candidateViewList.add(findViewById(R.id.candidate2))
|
||||
candidateViewList.add(binding.candidate0)
|
||||
candidateViewList.add(binding.candidate1)
|
||||
candidateViewList.add(binding.candidate2)
|
||||
|
||||
smartbarManager.registerSmartbarView(this)
|
||||
binding.backButton.setOnClickListener { eventListener?.get()?.onSmartbarBackButtonPressed() }
|
||||
|
||||
binding.clipboardCursorRow.isSmartbarKeyboardView = true
|
||||
mainScope.launch(Dispatchers.Default) {
|
||||
florisboard?.let {
|
||||
val layout = florisboard.textInputManager.layoutManager.fetchComputedLayoutAsync(
|
||||
KeyboardMode.SMARTBAR_CLIPBOARD_CURSOR_ROW,
|
||||
Subtype.DEFAULT,
|
||||
prefs
|
||||
).await()
|
||||
launch(Dispatchers.Main) {
|
||||
binding.clipboardCursorRow.computedLayout = layout
|
||||
binding.clipboardCursorRow.updateVisibility()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
binding.clipboardSuggestion.setOnClickListener {
|
||||
florisboard?.activeEditorInstance?.performClipboardPaste()
|
||||
shouldSuggestClipboardContents = false
|
||||
updateSmartbarState()
|
||||
}
|
||||
|
||||
binding.numberRow.isSmartbarKeyboardView = true
|
||||
mainScope.launch(Dispatchers.Default) {
|
||||
florisboard?.let {
|
||||
val layout = it.textInputManager.layoutManager.fetchComputedLayoutAsync(
|
||||
KeyboardMode.SMARTBAR_NUMBER_ROW,
|
||||
Subtype.DEFAULT,
|
||||
prefs
|
||||
).await()
|
||||
launch(Dispatchers.Main) {
|
||||
binding.numberRow.computedLayout = layout
|
||||
binding.numberRow.updateVisibility()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
binding.privateModeButton.setOnClickListener {
|
||||
eventListener?.get()?.onSmartbarPrivateModeButtonClicked()
|
||||
}
|
||||
|
||||
for (quickAction in binding.quickActions.children) {
|
||||
if (quickAction is SmartbarQuickActionButton) {
|
||||
quickAction.setOnClickListener { eventListener?.get()?.onSmartbarQuickActionPressed(quickAction.id) }
|
||||
}
|
||||
}
|
||||
|
||||
binding.quickActionToggle.setOnClickListener {
|
||||
isQuickActionsVisible = !isQuickActionsVisible
|
||||
updateSmartbarState()
|
||||
}
|
||||
|
||||
configureFeatureVisibility(
|
||||
actionStartAreaVisible = false,
|
||||
actionStartAreaId = null,
|
||||
mainAreaId = null,
|
||||
actionEndAreaVisible = false,
|
||||
actionEndAreaId = null
|
||||
)
|
||||
|
||||
florisboard?.textInputManager?.registerSmartbarView(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the active Smartbar variant based on the given id. Pass null to hide all variants and
|
||||
* show an empty Smartbar.
|
||||
* Updates the visibility of features based on the provided attributes.
|
||||
*
|
||||
* @param which Which variant to show. Pass null to hide all.
|
||||
* @param actionStartAreaVisible True if the action start area should be shown, else false.
|
||||
* @param actionStartAreaId The ID of the element to show within the action start area. Set to
|
||||
* null to leave this area blank.
|
||||
* @param mainAreaId The ID of the element to show within the main area. Set to null to leave
|
||||
* this area blank.
|
||||
* @param actionEndAreaVisible True if the action end area should be shown, else false.
|
||||
* @param actionEndAreaId The ID of the element to show within the action end area. Set to null
|
||||
* to leave this area blank.
|
||||
*/
|
||||
fun setActiveVariant(@IdRes which: Int?) {
|
||||
for (variant in variants) {
|
||||
if (variant.id == which) {
|
||||
variant.visibility = View.VISIBLE
|
||||
} else {
|
||||
variant.visibility = View.GONE
|
||||
}
|
||||
private fun configureFeatureVisibility(
|
||||
actionStartAreaVisible: Boolean = cachedActionStartAreaVisible,
|
||||
@IdRes actionStartAreaId: Int? = cachedActionStartAreaId,
|
||||
@IdRes mainAreaId: Int? = cachedMainAreaId,
|
||||
actionEndAreaVisible: Boolean = cachedActionEndAreaVisible,
|
||||
@IdRes actionEndAreaId: Int? = cachedActionEndAreaId
|
||||
) {
|
||||
binding.actionStartArea.visibility = when {
|
||||
actionStartAreaVisible && actionStartAreaId != null -> View.VISIBLE
|
||||
actionStartAreaVisible && actionStartAreaId == null -> View.INVISIBLE
|
||||
else -> View.GONE
|
||||
}
|
||||
if (actionStartAreaId != null) {
|
||||
binding.actionStartArea.displayedChild =
|
||||
indexedActionStartArea.indexOf(actionStartAreaId).coerceAtLeast(0)
|
||||
}
|
||||
binding.mainArea.visibility = when (mainAreaId) {
|
||||
null -> View.INVISIBLE
|
||||
else -> View.VISIBLE
|
||||
}
|
||||
if (mainAreaId != null) {
|
||||
binding.mainArea.displayedChild =
|
||||
indexedMainArea.indexOf(mainAreaId).coerceAtLeast(0)
|
||||
}
|
||||
binding.actionEndArea.visibility = when {
|
||||
actionEndAreaVisible && actionEndAreaId != null -> View.VISIBLE
|
||||
actionEndAreaVisible && actionEndAreaId == null -> View.INVISIBLE
|
||||
else -> View.GONE
|
||||
}
|
||||
if (actionEndAreaId != null) {
|
||||
binding.actionEndArea.displayedChild =
|
||||
indexedActionEndArea.indexOf(actionEndAreaId).coerceAtLeast(0)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the active Smartbar container based on the given id. Does only work if the currently
|
||||
* shown Smartbar variant is [R.id.smartbar_variant_default]. Pass null to hide all containers
|
||||
* and show only the quick action toggle.
|
||||
*
|
||||
* @param which Which container to show. Pass null to hide all.
|
||||
* Updates the Smartbar UI state by looking at the current keyboard mode, key variation, active
|
||||
* editor instance, etc. Passes the evaluated attributes to [configureFeatureVisibility].
|
||||
*/
|
||||
fun setActiveContainer(@IdRes which: Int?) {
|
||||
for (container in containers) {
|
||||
if (container.id == which) {
|
||||
container.visibility = View.VISIBLE
|
||||
} else {
|
||||
container.visibility = View.GONE
|
||||
}
|
||||
fun updateSmartbarState() {
|
||||
binding.clipboardCursorRow.updateVisibility()
|
||||
when (florisboard) {
|
||||
null -> configureFeatureVisibility(
|
||||
actionStartAreaVisible = false,
|
||||
actionStartAreaId = null,
|
||||
mainAreaId = null,
|
||||
actionEndAreaVisible = false,
|
||||
actionEndAreaId = null
|
||||
)
|
||||
else -> configureFeatureVisibility(
|
||||
actionStartAreaVisible = when (florisboard.textInputManager.keyVariation) {
|
||||
KeyVariation.PASSWORD -> false
|
||||
else -> true
|
||||
},
|
||||
actionStartAreaId = when (florisboard.textInputManager.getActiveKeyboardMode()) {
|
||||
KeyboardMode.EDITING -> R.id.back_button
|
||||
else -> R.id.quick_action_toggle
|
||||
},
|
||||
mainAreaId = when (florisboard.textInputManager.keyVariation) {
|
||||
KeyVariation.PASSWORD -> R.id.number_row
|
||||
else -> when (isQuickActionsVisible) {
|
||||
true -> R.id.quick_actions
|
||||
else -> when (florisboard.textInputManager.getActiveKeyboardMode()) {
|
||||
KeyboardMode.EDITING,
|
||||
KeyboardMode.NUMERIC,
|
||||
KeyboardMode.PHONE,
|
||||
KeyboardMode.PHONE2 -> null
|
||||
else -> when {
|
||||
florisboard.activeEditorInstance.isComposingEnabled &&
|
||||
shouldSuggestClipboardContents
|
||||
-> R.id.clipboard_suggestion_row
|
||||
florisboard.activeEditorInstance.isComposingEnabled &&
|
||||
florisboard.activeEditorInstance.selection.isCursorMode
|
||||
-> R.id.candidates
|
||||
else -> R.id.clipboard_cursor_row
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
actionEndAreaVisible = when (florisboard.textInputManager.keyVariation) {
|
||||
KeyVariation.PASSWORD -> false
|
||||
else -> true
|
||||
},
|
||||
actionEndAreaId = when {
|
||||
florisboard.activeEditorInstance.isPrivateMode -> R.id.private_mode_button
|
||||
else -> null
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun onPrimaryClipChanged() {
|
||||
if (prefs.suggestion.enabled && prefs.suggestion.suggestClipboardContent &&
|
||||
florisboard?.activeEditorInstance?.isPrivateMode == false) {
|
||||
shouldSuggestClipboardContents = true
|
||||
val item = florisboard.clipboardManager?.primaryClip?.getItemAt(0)
|
||||
when {
|
||||
item?.text != null -> {
|
||||
binding.clipboardSuggestion.text = item.text
|
||||
}
|
||||
item?.uri != null -> {
|
||||
binding.clipboardSuggestion.text = "(Image) " + item.uri.toString()
|
||||
}
|
||||
else -> {
|
||||
binding.clipboardSuggestion.text = item?.text ?: "(Error while retrieving clipboard data)"
|
||||
}
|
||||
}
|
||||
updateSmartbarState()
|
||||
}
|
||||
}
|
||||
|
||||
fun resetClipboardSuggestion() {
|
||||
shouldSuggestClipboardContents = false
|
||||
updateSmartbarState()
|
||||
}
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
|
||||
val heightSize = MeasureSpec.getSize(heightMeasureSpec)
|
||||
val heightSize = MeasureSpec.getSize(heightMeasureSpec).toFloat()
|
||||
val height = when (heightMode) {
|
||||
MeasureSpec.EXACTLY -> {
|
||||
// Must be this size
|
||||
@@ -117,48 +304,41 @@ class SmartbarView : LinearLayout {
|
||||
}
|
||||
MeasureSpec.AT_MOST -> {
|
||||
// Can't be bigger than...
|
||||
(florisboard?.inputView?.desiredSmartbarHeight ?: 0).coerceAtMost(heightSize)
|
||||
(florisboard?.inputView?.desiredSmartbarHeight ?: resources.getDimension(R.dimen.smartbar_baseHeight)).coerceAtMost(heightSize)
|
||||
}
|
||||
else -> {
|
||||
// Be whatever you want
|
||||
florisboard?.inputView?.desiredSmartbarHeight ?: 0
|
||||
florisboard?.inputView?.desiredSmartbarHeight ?: resources.getDimension(R.dimen.smartbar_baseHeight)
|
||||
}
|
||||
}
|
||||
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY))
|
||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height.roundToInt(), MeasureSpec.EXACTLY))
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas?) {
|
||||
super.onDraw(canvas)
|
||||
setBackgroundColor(prefs.theme.smartbarBgColor)
|
||||
for (container in containers) {
|
||||
when (container.id) {
|
||||
R.id.number_row -> {
|
||||
for (button in container.children) {
|
||||
if (button is Button) {
|
||||
button.setTextColor(prefs.theme.smartbarFgColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
R.id.clipboard_cursor_row -> {
|
||||
for (button in container.children) {
|
||||
if (button is ImageButton) {
|
||||
if (button.isEnabled) {
|
||||
setImageTintColor2(button, prefs.theme.smartbarFgColor)
|
||||
} else {
|
||||
setImageTintColor2(button, prefs.theme.smartbarFgColorAlt)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
R.id.candidates -> {
|
||||
for (view in container.children) {
|
||||
if (view is Button) {
|
||||
view.setTextColor(prefs.theme.smartbarFgColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
setBackgroundTintColor2(binding.clipboardSuggestion, prefs.theme.smartbarButtonBgColor)
|
||||
setDrawableTintColor2(binding.clipboardSuggestion, prefs.theme.smartbarButtonFgColor)
|
||||
binding.clipboardSuggestion.setTextColor(prefs.theme.smartbarButtonFgColor)
|
||||
for (view in candidateViewList) {
|
||||
view.setTextColor(prefs.theme.smartbarFgColor)
|
||||
}
|
||||
}
|
||||
|
||||
fun setEventListener(listener: EventListener) {
|
||||
eventListener = WeakReference(listener)
|
||||
}
|
||||
|
||||
/**
|
||||
* Event listener interface which can be used by other classes to receive updates when something
|
||||
* important happens in the Smartbar.
|
||||
*/
|
||||
interface EventListener {
|
||||
fun onSmartbarBackButtonPressed() {}
|
||||
//fun onSmartbarCandidatePressed() {}
|
||||
//fun onSmartbarCandidateLongPressed() {}
|
||||
fun onSmartbarPrivateModeButtonClicked() {}
|
||||
fun onSmartbarQuickActionPressed(@IdRes quickActionId: Int) {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ data class Theme(
|
||||
* @param context A reference to the current [Context]. Used to request
|
||||
* asset file.
|
||||
* @param path The path to the json theme file in the asset folder.
|
||||
* @returns A parsed [Theme] or null. A null value may indicate that
|
||||
* @return A parsed [Theme] or null. A null value may indicate that
|
||||
* the file does not exist or that an error during the reading
|
||||
* of the file occurred.
|
||||
*/
|
||||
@@ -105,7 +105,7 @@ data class Theme(
|
||||
* Loads a theme from the given [rawData].
|
||||
*
|
||||
* @param rawData The raw json theme file as a string.
|
||||
* @returns A parsed [Theme] or null. A null value may indicate that an error
|
||||
* @return A parsed [Theme] or null. A null value may indicate that an error
|
||||
* during the reading of the [rawData] occurred.
|
||||
*/
|
||||
fun fromJsonString(rawData: String): Theme? {
|
||||
@@ -162,6 +162,9 @@ data class Theme(
|
||||
|
||||
prefs.theme.oneHandedButtonFgColor = theme.getAttr("oneHandedButton/fgColor", "#424242")
|
||||
|
||||
prefs.theme.privateModeBgColor = theme.getAttr("privateMode/bgColor", "#A000FF")
|
||||
prefs.theme.privateModeFgColor = theme.getAttr("privateMode/fgColor", "#FFFFFF")
|
||||
|
||||
prefs.theme.smartbarBgColor = theme.getAttr("smartbar/bgColor", "#E0E0E0")
|
||||
prefs.theme.smartbarFgColor = theme.getAttr("smartbar/fgColor", "#000000")
|
||||
prefs.theme.smartbarFgColorAlt = theme.getAttr("smartbar/fgColorAlt", "#4A000000")
|
||||
@@ -259,7 +262,7 @@ data class ThemeMetaOnly(
|
||||
* @param context A reference to the current [Context]. Used to request
|
||||
* asset file.
|
||||
* @param path The path to the json theme file in the asset folder.
|
||||
* @returns [ThemeMetaOnly] or null. A null value may indicate that
|
||||
* @return [ThemeMetaOnly] or null. A null value may indicate that
|
||||
* the file does not exist or that an error during the reading
|
||||
* of the file occurred.
|
||||
*/
|
||||
@@ -282,7 +285,7 @@ data class ThemeMetaOnly(
|
||||
* @param context A reference to the current [Context]. Used to request
|
||||
* asset file.
|
||||
* @param path The path to the dir in the asset folder.
|
||||
* @returns [ThemeMetaOnly] or null. A null value may indicate that
|
||||
* @return [ThemeMetaOnly] or null. A null value may indicate that
|
||||
* the file does not exist or that an error during the reading
|
||||
* of the file occurred.
|
||||
*/
|
||||
|
||||
@@ -146,7 +146,7 @@ class DialogSeekBarPreference : Preference {
|
||||
* handle. (Android's SeekBar step is fixed at 1 and min at 0)
|
||||
*
|
||||
* @param actual The actual value.
|
||||
* @returns the internal value which is used to allow different min and step values.
|
||||
* @return the internal value which is used to allow different min and step values.
|
||||
*/
|
||||
private fun actualValueToSeekBarProgress(actual: Int): Int {
|
||||
return (actual - min) / step
|
||||
@@ -156,7 +156,7 @@ class DialogSeekBarPreference : Preference {
|
||||
* Converts the Android SeekBar value to the actual value.
|
||||
*
|
||||
* @param progress The progress value of the SeekBar.
|
||||
* @returns the actual value which is ready to use.
|
||||
* @return the actual value which is ready to use.
|
||||
*/
|
||||
private fun seekBarProgressToActualValue(progress: Int): Int {
|
||||
return (progress * step) + min
|
||||
|
||||
@@ -16,12 +16,40 @@
|
||||
|
||||
package dev.patrickgold.florisboard.settings.fragments
|
||||
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Bundle
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.PreferenceManager
|
||||
import dev.patrickgold.florisboard.R
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
import dev.patrickgold.florisboard.settings.components.DialogSeekBarPreference
|
||||
|
||||
class KeyboardFragment : PreferenceFragmentCompat(),
|
||||
SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
private var heightFactorCustom: DialogSeekBarPreference? = null
|
||||
private var sharedPrefs: SharedPreferences? = null
|
||||
|
||||
class KeyboardFragment : PreferenceFragmentCompat() {
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
addPreferencesFromResource(R.xml.prefs_keyboard)
|
||||
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
|
||||
heightFactorCustom = findPreference(PrefHelper.Keyboard.HEIGHT_FACTOR_CUSTOM)
|
||||
onSharedPreferenceChanged(null, PrefHelper.Keyboard.HEIGHT_FACTOR)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
sharedPrefs?.registerOnSharedPreferenceChangeListener(this)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
sharedPrefs?.unregisterOnSharedPreferenceChangeListener(this)
|
||||
}
|
||||
|
||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||
if (key == PrefHelper.Keyboard.HEIGHT_FACTOR) {
|
||||
heightFactorCustom?.isVisible = sharedPrefs?.getString(key, "") == "custom"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import dev.patrickgold.florisboard.ime.text.keyboard.KeyboardView
|
||||
import dev.patrickgold.florisboard.ime.text.layout.LayoutManager
|
||||
import dev.patrickgold.florisboard.settings.SettingsMainActivity
|
||||
import kotlinx.coroutines.*
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class ThemeFragment : SettingsMainActivity.SettingsFragment(), CoroutineScope by MainScope(),
|
||||
SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
@@ -54,7 +55,7 @@ class ThemeFragment : SettingsMainActivity.SettingsFragment(), CoroutineScope by
|
||||
keyboardView = KeyboardView(themeContext)
|
||||
keyboardView.layoutParams = LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT
|
||||
resources.getDimension(R.dimen.textKeyboardView_baseHeight).roundToInt()
|
||||
).apply {
|
||||
val m = resources.getDimension(R.dimen.keyboard_preview_margin).toInt()
|
||||
setMargins(m, m, m, m)
|
||||
@@ -62,7 +63,7 @@ class ThemeFragment : SettingsMainActivity.SettingsFragment(), CoroutineScope by
|
||||
prefs.sync()
|
||||
keyboardView.isPreviewMode = true
|
||||
val subtype = subtypeManager.getActiveSubtype() ?: Subtype.DEFAULT
|
||||
keyboardView.computedLayout = layoutManager.fetchComputedLayoutAsync(KeyboardMode.CHARACTERS, subtype).await()
|
||||
keyboardView.computedLayout = layoutManager.fetchComputedLayoutAsync(KeyboardMode.CHARACTERS, subtype, prefs).await()
|
||||
keyboardView.updateVisibility()
|
||||
keyboardView.onApplyThemeAttributes()
|
||||
withContext(Dispatchers.Main) {
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package dev.patrickgold.florisboard.util
|
||||
|
||||
import android.os.Handler
|
||||
|
||||
fun Handler.postAtScheduledRate(delayMillis: Long, periodMillis: Long, r: Runnable) {
|
||||
val internalRunnable = object : Runnable {
|
||||
override fun run() {
|
||||
this@postAtScheduledRate.postDelayed(this, periodMillis)
|
||||
r.run()
|
||||
}
|
||||
}
|
||||
this.postDelayed(internalRunnable, delayMillis)
|
||||
}
|
||||
|
||||
fun Handler.postDelayed(delayMillis: Long, r: Runnable) {
|
||||
this.postDelayed(r, delayMillis)
|
||||
}
|
||||
|
||||
fun Handler.cancelAll() {
|
||||
this.removeCallbacksAndMessages(null)
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_enabled="false" android:color="?android:colorButtonNormal"/>
|
||||
<item android:color="#FFFFFF"/>
|
||||
</selector>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:left="8dp"
|
||||
android:right="8dp"
|
||||
android:drawable="@drawable/ic_content_paste"/>
|
||||
</layer-list>
|
||||
9
app/src/main/res/drawable/ic_redo.xml
Normal file
9
app/src/main/res/drawable/ic_redo.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M18.4,10.6C16.55,8.99 14.15,8 11.5,8c-4.65,0 -8.58,3.03 -9.96,7.22L3.9,16c1.05,-3.19 4.05,-5.5 7.6,-5.5 1.95,0 3.73,0.72 5.12,1.88L13,16h9V7l-3.6,3.6z"/>
|
||||
</vector>
|
||||
5
app/src/main/res/drawable/ic_security.xml
Normal file
5
app/src/main/res/drawable/ic_security.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="#FF000000" android:pathData="M12,1L3,5v6c0,5.55 3.84,10.74 9,12 5.16,-1.26 9,-6.45 9,-12L21,5l-9,-4zM12,11.99h7c-0.53,4.12 -3.28,7.79 -7,8.94L12,12L5,12L5,6.3l7,-3.11v8.8z"/>
|
||||
</vector>
|
||||
5
app/src/main/res/drawable/ic_smartphone.xml
Normal file
5
app/src/main/res/drawable/ic_smartphone.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="#FF000000" android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19H7V5h10v14z"/>
|
||||
</vector>
|
||||
9
app/src/main/res/drawable/ic_undo.xml
Normal file
9
app/src/main/res/drawable/ic_undo.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M12.5,8c-2.65,0 -5.05,0.99 -6.9,2.6L2,7v9h9l-3.62,-3.62c1.39,-1.16 3.16,-1.88 5.12,-1.88 3.54,0 6.55,2.31 7.6,5.5l2.37,-0.78C21.08,11.03 17.15,8 12.5,8z"/>
|
||||
</vector>
|
||||
@@ -1,13 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape>
|
||||
<padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/>
|
||||
<solid android:color="#CDAFAFAF"/>
|
||||
<corners android:radius="@dimen/key_borderRadius"/>
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@android:color/white"/>
|
||||
|
||||
6
app/src/main/res/drawable/shape_rect_rounded_2.xml
Normal file
6
app/src/main/res/drawable/shape_rect_rounded_2.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="@android:color/black" />
|
||||
<corners android:radius="@dimen/smartbar_radius" />
|
||||
</shape>
|
||||
49
app/src/main/res/layout/crash_dialog.xml
Normal file
49
app/src/main/res/layout/crash_dialog.xml
Normal file
@@ -0,0 +1,49 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:padding="8dp"
|
||||
android:theme="@style/CrashDialogTheme">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"
|
||||
android:text="@string/crash_dialog__description"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/copy_to_clipboard"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"
|
||||
android:text="@string/crash_dialog__copy_to_clipboard"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/open_bug_report_form"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"
|
||||
android:text="@string/crash_dialog__open_bug_report_form"/>
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/stacktrace"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"/>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
<Button
|
||||
android:id="@+id/close"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"
|
||||
android:text="@string/crash_dialog__close"/>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -6,7 +6,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="bottom"
|
||||
android:orientation="vertical">
|
||||
android:orientation="vertical"
|
||||
android:layoutDirection="ltr">
|
||||
|
||||
<dev.patrickgold.florisboard.ime.core.InputView
|
||||
android:id="@+id/inner_input_view_container"
|
||||
|
||||
@@ -9,14 +9,13 @@
|
||||
android:backgroundTintMode="multiply">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/key_popup_text"
|
||||
android:id="@+id/symbol"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/key_height"
|
||||
android:gravity="center"
|
||||
android:textSize="@dimen/key_popup_textSize"/>
|
||||
android:gravity="center"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/key_popup_threedots"
|
||||
android:id="@+id/threedots"
|
||||
android:layout_width="16dp"
|
||||
android:layout_height="16dp"
|
||||
android:layout_margin="0dp"
|
||||
@@ -1,52 +1,95 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/smartbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/transparent">
|
||||
android:orientation="horizontal"
|
||||
android:layoutDirection="locale">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/smartbar_variant_default"
|
||||
android:layout_width="match_parent"
|
||||
<dev.patrickgold.florisboard.ime.core.FlorisViewFlipper
|
||||
android:id="@+id/action_start_area"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone">
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarQuickActionButton
|
||||
android:id="@+id/quick_action_toggle"
|
||||
style="@style/SmartbarQuickAction.Toggle"
|
||||
android:contentDescription="@string/smartbar__quick_action_toggle__alt"
|
||||
android:src="@drawable/ic_keyboard_arrow_right" />
|
||||
android:src="@drawable/ic_keyboard_arrow_right"/>
|
||||
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarQuickActionButton
|
||||
android:id="@+id/back_button"
|
||||
style="@style/SmartbarQuickAction"
|
||||
android:contentDescription="@string/smartbar__quick_action__exit_editing"
|
||||
android:src="@drawable/ic_arrow_back"/>
|
||||
|
||||
</dev.patrickgold.florisboard.ime.core.FlorisViewFlipper>
|
||||
|
||||
<dev.patrickgold.florisboard.ime.core.FlorisViewFlipper
|
||||
android:id="@+id/main_area"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintStart_toEndOf="@id/action_start_area"
|
||||
app:layout_constraintEnd_toStartOf="@id/action_end_area"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/candidates"
|
||||
style="@style/SmartbarContainer"
|
||||
android:visibility="gone">
|
||||
style="@style/SmartbarContainer">
|
||||
|
||||
<Button
|
||||
android:id="@+id/candidate0"
|
||||
style="@style/SmartbarCandidate"/>
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="suggestions"/>
|
||||
|
||||
<View style="@style/SmartbarDivider"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/candidate1"
|
||||
style="@style/SmartbarCandidate"/>
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="not yet"/>
|
||||
|
||||
<View style="@style/SmartbarDivider"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/candidate2"
|
||||
style="@style/SmartbarCandidate"/>
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="implemented"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/clipboard_suggestion_row"
|
||||
style="@style/SmartbarContainer">
|
||||
|
||||
<Button
|
||||
android:id="@+id/clipboard_suggestion"
|
||||
android:drawableStart="@drawable/ic_content_paste_with_padding"
|
||||
style="@style/SmartbarQuickAction.ClipboardSuggestion"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/quick_actions"
|
||||
style="@style/SmartbarContainer"
|
||||
android:visibility="gone">
|
||||
style="@style/SmartbarContainer">
|
||||
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarQuickActionButton
|
||||
android:id="@+id/quick_action_undo"
|
||||
style="@style/SmartbarQuickAction"
|
||||
android:contentDescription="@string/smartbar__quick_action__undo"
|
||||
android:src="@drawable/ic_undo"/>
|
||||
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarQuickActionButton
|
||||
android:id="@+id/quick_action_redo"
|
||||
style="@style/SmartbarQuickAction"
|
||||
android:contentDescription="@string/smartbar__quick_action__redo"
|
||||
android:src="@drawable/ic_redo"/>
|
||||
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarQuickActionButton
|
||||
android:id="@+id/quick_action_switch_to_media_context"
|
||||
@@ -65,7 +108,7 @@
|
||||
android:id="@+id/quick_action_one_handed_toggle"
|
||||
style="@style/SmartbarQuickAction"
|
||||
android:contentDescription="@string/smartbar__quick_action__one_handed_mode"
|
||||
android:src="@drawable/ic_keyboard_arrow_right"/>
|
||||
android:src="@drawable/ic_smartphone"/>
|
||||
|
||||
<!-- TODO: find better icon for editing -->
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarQuickActionButton
|
||||
@@ -76,133 +119,33 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- TODO: integrate a KeyboardView instead of hardcoding these buttons -->
|
||||
<LinearLayout
|
||||
android:id="@+id/number_row"
|
||||
style="@style/SmartbarContainer"
|
||||
android:visibility="gone"
|
||||
tools:ignore="HardcodedText">
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_1"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="1"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_2"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="2"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_3"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="3"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_4"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="4"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_5"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="5"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_6"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="6"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_7"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="7"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_8"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="8"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_9"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="9"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/number_row_0"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:text="0"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- TODO: integrate a KeyboardView instead of hardcoding these buttons -->
|
||||
<LinearLayout
|
||||
<dev.patrickgold.florisboard.ime.text.keyboard.KeyboardView
|
||||
android:id="@+id/clipboard_cursor_row"
|
||||
style="@style/SmartbarContainer"
|
||||
android:visibility="gone"
|
||||
tools:ignore="HardcodedText">
|
||||
android:layoutDirection="ltr"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/cc_select_all"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:src="@drawable/ic_select_all"
|
||||
android:tint="@drawable/button_key_enable_color_selector"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/cc_copy"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:src="@drawable/ic_content_copy"
|
||||
android:tint="@drawable/button_key_enable_color_selector"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/cc_arrow_left"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:src="@drawable/ic_keyboard_arrow_left"
|
||||
android:tint="@drawable/button_key_enable_color_selector"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/cc_arrow_right"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:src="@drawable/ic_keyboard_arrow_right"
|
||||
android:tint="@drawable/button_key_enable_color_selector"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/cc_cut"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:src="@drawable/ic_content_cut"
|
||||
android:tint="@drawable/button_key_enable_color_selector"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/cc_paste"
|
||||
style="@style/SmartbarCandidate"
|
||||
android:src="@drawable/ic_content_paste"
|
||||
android:tint="@drawable/button_key_enable_color_selector"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Placeholder on the right which reserves the space for a second button -->
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarQuickActionButton
|
||||
android:layout_width="wrap_content"
|
||||
<dev.patrickgold.florisboard.ime.text.keyboard.KeyboardView
|
||||
android:id="@+id/number_row"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_margin="@dimen/smartbar_button_margin"
|
||||
android:clickable="false"
|
||||
android:visibility="invisible"/>
|
||||
android:layoutDirection="ltr"/>
|
||||
|
||||
</LinearLayout>
|
||||
</dev.patrickgold.florisboard.ime.core.FlorisViewFlipper>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/smartbar_variant_back_only"
|
||||
android:layout_width="match_parent"
|
||||
<dev.patrickgold.florisboard.ime.core.FlorisViewFlipper
|
||||
android:id="@+id/action_end_area"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone">
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<dev.patrickgold.florisboard.ime.text.smartbar.SmartbarQuickActionButton
|
||||
android:id="@+id/back_button"
|
||||
style="@style/SmartbarQuickAction"
|
||||
android:contentDescription="@string/smartbar__quick_action__exit_editing"
|
||||
android:src="@drawable/ic_arrow_back"/>
|
||||
android:id="@+id/private_mode_button"
|
||||
style="@style/SmartbarQuickAction.PrivateModeButton"
|
||||
android:contentDescription="@string/smartbar__quick_action__private_mode"
|
||||
android:src="@drawable/ic_security"/>
|
||||
|
||||
</LinearLayout>
|
||||
</dev.patrickgold.florisboard.ime.core.FlorisViewFlipper>
|
||||
|
||||
</dev.patrickgold.florisboard.ime.text.smartbar.SmartbarView>
|
||||
|
||||
222
app/src/main/res/values-ar/strings.xml
Normal file
222
app/src/main/res/values-ar/strings.xml
Normal file
@@ -0,0 +1,222 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">إيقاف مؤقت</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">انتظار</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">أيقونة ثلاث نقاط. إذا كانت ظاهرة ، تشير إلى أنه يمكن استخدام المزيد من الأحرف إذا تم الضغط عليها لفترة أطول.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">غلق وضع اليد الواحدة.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">نقل لوحة المفاتيح إلى اليسار.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">نقل لوحة المفاتيح إلى اليمين.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">ايموجي</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">رموز تعبيرية</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">كاوموجي</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">وجوه تعبيرية و عواطف</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">أشخاص و أجسام</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">حيوانات و طبيعة</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">مأكولات و مشروبات</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">سفر و أماكن</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">أنشطة</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">أشياء</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">رموز</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">أعلام</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">زر اﻹجراءات السريعة. عند الضغط عليه ، يمكنك التبديل بين اقتراحات الكلمات و أزرار الإجراءات السريعة.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">الخروج من لوحة التعديل النصي.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">تغيير حالة وضع اليد الواحدة.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">فتح الإعدادات.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">الإنتقال إلى لوحة التعديل النصي.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">الإنتقال إلى لوحة إدخال الوسائط.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">الاعدادات</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__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">الصفحة الرئيسية</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">لوحة المفاتيح</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">الكتابة</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">المظهر</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">الإيماءات</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">الإفتراضي</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">الإعداد الافتراضي</string>
|
||||
<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__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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">إضافة نوع فرعي</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">تطبيق</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">إلغاء</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">حذف</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">تعديل نوع فرعي</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">اللغة</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">تخطيط لوحة المفاتيح</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">هذا النوع الفرعي موجود مسبقا!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">مظهر لوحة المفاتيح</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">غير محدد</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">المظهر</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">مخصص (بناء على %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">المظهر المحدد:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">المظاهر المتاحة:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">سهم لليمين</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">لون الخلفية</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">لون الخلفية عند التنشيط</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">لون الخلفية عند الضغط</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">لون الواجهة</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">لون الواجهة (البديل)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">لون الواجهة (وضع الحروف الكبيرة)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">اختر اللون</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">النافذة والنظام</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">لوحة المفاتيح</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">المفتاح</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">مفتاح الإدخال</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">نافذة المفتاح المنبثقة</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">مفتاح التحويل</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">سياق الوسائط</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">اليد الواحدة</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">زر اليد الواحدة</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">الشريط الذكـي</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">زر الشريط الذكي</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">اللون الأساسي</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">يتم تطبيقه على تموج علامة تبويب الوسائط الرئيسية وإبراز الاختيار</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">اللون الأساسي (داكن)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">غير مستخدم حاليا ، محجوز للتنفيذ المستقبلي</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">لون التمييز</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">يتم تطبيقه على علامة تبويب الإيموجي</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">لون شريط التصفّح</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">خلفية شريط التصفّح.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">واجهة شريط التصفّح</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">ضبط على التشغيل للواجهة الداكنة أو على إيقاف التشغيل للواجهة الفاتحة.</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>
|
||||
<string name="pref__keyboard__number_row__summary" comment="Preference summary">إظهار صف الأعداد فوق تخطيط الحروف</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">مضاعف حجم الخط (عمودي)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">مضاعف حجم الخط (أفقي)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">نظام التخطيط</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">وضع اليد الواحدة</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">إيقاف</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">وضع اليد اليمنى</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">وضع اليد اليسرى</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">ارتفاع لوحة المفاتيح</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">قصير جدا</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">قصير</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">قصير قليلا</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">عادي</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">طويل قليلا</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">طويل</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">طويل جدا</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">مخصص</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">قيمة ارتفاع لوحة المفاتيح المخصصة</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">الإزاحة السفلية (للشاشات المقوسة)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">ضغط المفتاح</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">الصوت عند ضغط المفتاح</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">حجم الصوت عند ضغط المفتاح</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">إهتزاز عند ضغط المفتاح</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">شدة الإهتزاز عند ضغط المفتاح</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">رؤية النافذة المنبثقة</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">إظهار النافذة المنبثقة عندما تضغط على مفتاح</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">مدة الضغط المطوّل على المفتاح</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">تجربة الكتابة</string>
|
||||
<string name="pref__smartbar__enabled__label" comment="Preference title">تفعيل الشريط الذكي</string>
|
||||
<string name="pref__smartbar__enabled__summary" comment="Preference summary">سوف يظهر أعلى لوحة المفاتيح</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">الإقتراحات</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] إظهار الإقتراحات عند الكتابة</string>
|
||||
<string name="pref__suggestion__enabled__summary" comment="Preference summary">سوف يظهر الشريط الذكي</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">إقتراحات محتوى الحافظة</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">إقتراح لصق محتوى الحافظة إذا تم نسخه مسبقًا</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] إقتراحات الكلمة التالية</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">إستخدام الكلمات السابقة لتحسين الاقتراحات</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">الإصلاحات</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">استخدام الأحرف الكبيرة تلقائيًا</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">استخدام الأحرف الكبيرة في الكلمات على حسب سياق نص الإدخال الحالي</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">تذكر حالة زر الأحرف الكبيرة</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">يضل وضع الأحرف الكبيرة قيد التشغيل عند الإنتقال إلى حقل نصي آخر</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">نقطة المسافة المزدوجة</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">الضغط مرتين على مفتاح المسافة يضيف نقطة متبوعة بمسافة</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">الإيماءات و الكتابة بالتمرير</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">الكتابة بالتمرير</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] تفعيل الكتابة بالتمرير</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">أكتب كلمة بتمرير إصبعك عبر حروفها</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] إظهار آثار التمرير</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">سوف يختفي بعد كل كلمة</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">الإيماءات</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">بدون إجراء</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">حذف الحروف بدقة</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">حذف الكلمة الحالية</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">حذف الكلمات بدقة</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">إخفاء لوحة المفاتيح</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">تحريك المؤشر إلى الأعلى</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">تحريك المؤشر إلى الأسفل</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">تحريك المؤشر إلى اليسار</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" 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__switch_to_prev_subtype" comment="Preference value for swipe action">التبديل إلى النوع الفرعي السابق</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">التبديل إلى النوع الفرعي التالي</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">السحب للأعلى</string>
|
||||
<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_left__label" comment="Preference title">السحب لليسار من خلال مفتاح المسافة</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__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__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>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">عتبة مسافة السحب</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">قصيرة جداً</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">قصيرة</string>
|
||||
<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="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__show_app_icon__label" comment="Label of Show app icon preference in Advanced">إظهار أيقونة البرنامج في صفحة الهاتف الرئيسية</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">حول التطبيق</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">أيقونة التطبيق FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">تراخيص البرامج مفتوحة المصدر</string>
|
||||
<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>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">الإعداد</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">السابق</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">إلغاء</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">التالي</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">إنهاء</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">حسنًا</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">مرحبا!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">شكرا على تجربة FlorisBoard! قبل أن تتمكن من البدء في استخدامه ، يتعين علينا القيام بالأشياء المعتادة وذلك بتمكينه في إعدادات النظام ، وإعداد لغتك / تخطيطك المفضل ، إلخ... ولكن لا تقلق - سيرشدك معالج الإعداد خلال هذا!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">يحترم FlorisBoard خصوصيتك تمامًا ولا يجمع أي بيانات مستخدم. لمزيد من المعلومات انظر هنا:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">مصدر التعليمات البرمجية لـ FlorisBoard متاح للجميع ، لذا يمكنك بسهولة مراجعة ما يفعله FlorisBoard في الخلفية. يرجى مراجعة الرابط الخاص بالمستودع أدناه.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">شيء أخير قبل بدء الإعداد - إذا واجهت أي أخطاء / أعطال / مشكلات في FlorisBoard أو كان لديك طلب ميزة - توجه إلى مستودع GitHub الموجود في الرابط أدناه واطرح مشكلة. هذا يساعد في تحسين التجربة لجميع المستخدمين!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">لبدء الإعداد إضغط على <i>التالي</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">تفعيل FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">يتطلب Android تمكين كل لوحة مفاتيح مخصصة يدويًا قبل أن تتمكن من استخدامها. إضغط على الزر أدناه للتوجه إلى <i>اللغات و الإدخال</i> الإعدادات, ثم تأكد من إختيار \'<i>FlorisBoard</i>\'.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">تم تفعيل FlorisBoard بنجاح. للمواصلة إضغط على <i>التالي</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">فتح إعدادات اللغات و الإدخال</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">جعل FlorisBoard افتراضيًا</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">تم تمكين FlorisBoard الآن في نظامك. لاستخدامه بشكل دائم ، قم بالتبديل إلى FlorisBoard عن طريق تحديده في مربع حوار محدد الإدخال!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">تم تبديل لوحة المفاتيح الإفتراضية إلى FlorisBoard بنجاح!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">تبديل لوحة المفاتيح</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">تم إنهاء الاعداد!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">تقرير حول خطأ في FlorisBoard</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">نأسف للإزعاج ، ولكن FlorisBoard تعطل بسبب خطأ غير متوقع.\n\nإذا كنت ترغب في الإبلاغ عن هذا الخطأ ، انقر على \"نسخ إلى الحافظة\" ، ثم على الزر \"فتح تقرير الخطأ\". املأ تقرير الخطأ والصق السجل. هذا يساعد في جعل FlorisBoard أفضل وأكثر استقرارًا للجميع. شكرا جزيلا!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">نسخ إلى الحافظة</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">فتح نموذج تقرير الخطأ (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">إغلاق</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">تقارير حول خطأ في FlorisBoard</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">توقف FlorisBoard عن العمل…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">انقر لعرض تفاصيل الخطأ</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">يبدو أن FlorisBoard يوقف عن العمل بشكل متكرر…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">العودة إلى لوحة المفاتيح السابقة لإيقاف حلقة التعطل الغير منتهية. انقر لعرض تفاصيل الخطأ</string>
|
||||
</resources>
|
||||
11
app/src/main/res/values-bs/strings.xml
Normal file
11
app/src/main/res/values-bs/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
217
app/src/main/res/values-cs/strings.xml
Normal file
217
app/src/main/res/values-cs/strings.xml
Normal file
@@ -0,0 +1,217 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Pauza</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Počkat</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Tří-tečková ikona. Pokud je viditelná, tak se po delším podržení nabídne více písmen.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Zavřít režim jedné ruky.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Posunout klávesnici doleva.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Posunout klávesnici doprava.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emoji</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Emotikony</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Smajlíky & Emoce</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Člověk & Tělo</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Zvířata & Příroda</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Jídlo & Pití</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Cestování & Místa</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Aktivity</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Předměty</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Symboly</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Vlajky</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Přepínač rychlé akce. Pokud ho podržíte, přepne mezi návrhy na slova a tlačítky rychlé akce.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Opustit editor textu.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Přepne režim jedné ruky.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Otevřít nastavení.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Přepnout na editor textu.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Přepnout na vkládaní médií.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Nastavení</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Více možností</string>
|
||||
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Pomoc & odezva</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Domov</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Klávesnice</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Psaní</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Motiv</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gesta</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Výchozí</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Výchozí nastavení systému</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">Vítej v %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 nebude moci být použita jako možnost psaní. 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, a proto chybí funkce. Pokud najdete nějaké chyby nebo chcete navrhnout, podívejte se na repo na Githubu a podejte problém. To pomáhá 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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Přidat podtyp</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Potvrdit</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Zrušit</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Vymazat</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Upravit podtyp</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Místní</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Rozpoložení klávesnice</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Tento podtyp již existuje!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Motiv klávesnice</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Definován</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Téma</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Vlastní (na základě %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Vybrané téma:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Dostupná témata:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Šipka vpravo</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Pozadí</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Barva pozadí při aktivní</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Barva pozadí při stisknutí</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Barva popředí</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Barva popředí (alternativní)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Barva popředí (caps lock)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Vyberte barvu</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Okno & systém</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Klávesnice</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Klíč</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Klávesa</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Vyskakovací okno klíče</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Shift</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Mediální kontext</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Jednoruční</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Tlačítko s jednou rukou</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Smartbar</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Tlačítko Smartbar</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Primární barva</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Aplikováno na hlavní kartu Media ripple a zvýraznění výběru</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Primární barva (tmavá)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">V současné době se nepoužívá, vyhrazeno pro budoucí implementaci</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Barva přízvuku</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Aplikováno na kartu Emoji ripple</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Barva navigačního panelu</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">Pozadí navigační lišty.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Navigační lišta tmavé popředí</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Nastavte na Zapnuto pro tmavé nebo vypnuté pro světlé popředí.</string>
|
||||
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Předvolby Klávesnice</string>
|
||||
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Šipka</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">Multiplikátor velikosti písma (portrét)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Multiplikátor velikosti písma (Krajina)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Rozložení</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Režim s jednou rukou</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Z</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Režim pravé ruky</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Režim levé ruky</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Výška klávesnice</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Extra-krátká</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Krátká</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Středně krátká</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normální</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Středně vysoká</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Vysoká</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Extra vysoká</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Vlastní</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Vlastní hodnota výšky klávesnice</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Odstup zdola (pro zahnuté displeje)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Stisk klávesy</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Zvuk při stisku klávesy</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Hlasitost zvuku při stisku klávesy</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Vibrace při stisku klávesy</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Síla vibrací na stisknutí tlačítka</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Vyskakovací Viditelnost</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Zobrazit vyskakovací okno, když stisknete klávesu</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Dlouhé zpoždění stisknutí tlačítka</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Psaní zkušenosti</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Návrh</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] zobrazit návrhy při psaní</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Návrhy obsahu schránky</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Navrhněte obsah schránky, který chcete vložit, pokud byl dříve zkopírován</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] návrhy dalšího slova</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Použijte předchozí slova pro generování návrhů</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Oprava</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Automatická kapitalizace</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Vydělávejte slova na základě aktuálního vstupního kontextu</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Pamatovat caps lock stav</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Caps lock zůstane při přesunu do jiného textového pole</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Doba dvojitého prostoru</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Poklepáním dvakrát na mezerník vloží období následuje prostor</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Gesta & Glide psan</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Glide psan</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] povolit glide psan</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Zadejte slovo posunutím prstu jeho písmeny</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Zobrazit sestupovou stopu</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Zmizí po každém slově</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gesto</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Žádná akce</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Smazat znaky přesně</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Smazat aktuální slovo</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Smazat slova přesně</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Skrýt klávesnici</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Přesunout kurzor nahoru</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Přesunout kurzor dolů</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Přesunout kurzor doleva</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Přesunout kurzor doprava</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Posun</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Přepněte na předchozí podtyp</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Přepněte na další podtyp</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Přejeďte nahoru</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Přejet</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Přejeďte doleva</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Přejeďte prstem doprava</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Mezerník přejeďte doleva</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Mezerník přejeďte doprava</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Odstranit klíč přejeďte doleva</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Práh rychlosti přejetí prstem</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Velmi pomalé</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Pomalý</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normální</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Rychlý</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Velmi rychle</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Práh vzdálenosti přejetím prstem</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Velmi krátká</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Krátký</string>
|
||||
<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">Dlouhý</string>
|
||||
<string name="settings__advanced__title" comment="Title of Advanced settings activity">Upřesnit</string>
|
||||
<string name="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Téma nastavení</string>
|
||||
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Světlo</string>
|
||||
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Tma</string>
|
||||
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Zobrazit ikonu aplikace v launcher</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">O</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">Ikona aplikace FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Open source licence</string>
|
||||
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Soukromí</string>
|
||||
<string name="about__view_source_code" comment="Label of View source code button in About">Kód</string>
|
||||
<string name="about__license__title" comment="Title of Open-source licenses dialog">Open-source licence</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Nastavení</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Náhled</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Zrušit</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Další</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Dokončit</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">OK</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Vítejte!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Díky za vyzkoušení FlorisBoard! Než jej začnete používat, musíme udělat obvyklé věci a povolit je v nastavení systému, nastavit preferovaný jazyk/rozvržení atd.... ale bez obav - průvodce nastavením vás provede tímto!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">FlorisBoard plně respektuje vaše soukromí a neshromažďuje žádná uživatelská data. Pro více informací viz zde:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">Zdrojový kód pro FlorisBoard je veřejně přístupný pro každého, takže můžete snadno zkontrolovat, co FlorisBoard dělá na pozadí. Podívejte se na odkaz úložiště níže.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Jedna poslední věc, než začnete nastavení - pokud narazíte na nějaké chyby/pády/problémy s FlorisBoard, nebo máte požadavek na funkci - přes hlavu na GitHub úložiště google níže a soubor problém. To pomáhá při zlepšování zkušeností pro všechny uživatele!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Chcete-li spustit nastavení, klikněte na <i>další</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">Povolit FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">Android vyžaduje, abyste před použitím mohli každou vlastní klávesnici ručně povolit. Kliknutím na tlačítko níže přejděte do nabídky <i> Jazyk & Zadejte </i> nastavení a nezapomeňte zkontrolovat „<i> FlorisBoard </i>“.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">FlorisBoard byl úspěšně povolen. Chcete-li pokračovat, klikněte na <i>další</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Otevřený Jazyk & Nastavení vstupu</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">Aby FlorisBoard výchozí</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">FlorisBoard je nyní povolen ve vašem systému. Chcete-li ji aktivně používat, přepněte na FlorisBoard výběrem v dialogu pro výběr vstupu!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">Úspěšně přepnul výchozí klávesnici na FlorisBoard!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Přepnout klávesnici</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Nastavení dokončeno!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">Zpráva o chybě florisboardu</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Omlouváme se za nepříjemnosti, ale FlorisBoard se zhroutil kvůli neočekávané chybě. \n\nChcete-li tuto chybu nahlásit, klikněte na „Kopírovat do schránky“ a poté na tlačítko „Otevřít hlášení o chybě“. Vyplňte hlášení o chybě a vložte protokol. To pomáhá zlepšovat a stabilizovat FlorisBoard pro všechny. Děkuju!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Kopírovat do schránky</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Otevřít formulář hlášení chyb (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Uzavřít</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">FlorisBoard chybové hlášení</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard přestal fungovat…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Klepnutím zobrazíte podrobnosti o chybě</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">Zdá se, že FlorisBoard přestane pracovat opakovaně…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Klesající zpět na předchozí klávesnici zastavit nekonečné crash loop. Klepnutím zobrazíte podrobnosti o chybě</string>
|
||||
</resources>
|
||||
16
app/src/main/res/values-da/strings.xml
Normal file
16
app/src/main/res/values-da/strings.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">FlorisBoard er nu aktiveret i dit system. For aktivt at bruge det, skifte til FlorisBoard ved at vælge det i dialogboksen input selector!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">Succesfuldt skiftede standardtastaturet til FlorisBoard!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Skift tastatur</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Opsætning færdig!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">FlorisBoard fejl rapport</string>
|
||||
</resources>
|
||||
217
app/src/main/res/values-de/strings.xml
Normal file
217
app/src/main/res/values-de/strings.xml
Normal file
@@ -0,0 +1,217 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Pausieren</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Warten</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Drei-Punkte-Symbol. Zeigt an, dass durch langes Drücken mehr Zeichen verwendet werden können.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Einhandmodus schließen.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Tastatur nach links verschieben.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Tastatur nach rechts verschieben.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emojis</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Emoticons</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Smileys & Emotionen</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Menschen</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Tiere & Natur</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Essen & Trinken</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Reisen & Orte</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Aktivitäten</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Objekte</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Symbole</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Flaggen</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Schaltet mit einem Klick zwischen Wortvorschlägen und Schnellzugriffsleiste um.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Textbearbeitung verlassen.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Einhandmodus umschalten.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Einstellungen öffnen.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Zur Textbearbeitung wechseln.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Zur Medieneingabe wechseln.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Einstellungen</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Weitere Optionen</string>
|
||||
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Hilfe & Feedback</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Start</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Tastatur</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Schreiben</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Design</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gesten</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Standard</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Systemstandard</string>
|
||||
<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__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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Stil hinzufügen</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Übernehmen</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Abbrechen</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Entfernen</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Benutzerdefinierten Eingabestil bearbeiten</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Gebietsschema</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Tastatur-Layout</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Dieser Eingabestil ist bereits vorhanden!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Tastaturdesign</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Nicht definiert</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Design</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Benutzerdefiniert (basierend auf %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Ausgewähltes Design:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Verfügbare Designs:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Pfeil rechts</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Hintergrundfarbe</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Hintergrundfarbe wenn aktiv</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Hintergrundfarbe wenn gedrückt</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Vordergrundfarbe</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Vordergrundfarbe (Alternativ)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Vordergrundfarbe (Umschalttaste festgestellt)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Farbe wählen</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Fenster & System</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Tastatur</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Taste</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Eingabetaste</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Tasten Pop-Up</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Umschalttaste</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Medienkontext</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Einhandmodus</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Einhandmodus Schalter</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Schnellzugriffsleiste</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Schnellzugriffsleiste Schalter</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Hauptfarbe</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Wird auf Medien-Reiter und aktuelle Auswahl angewandt</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Hauptfarbe (dunkel)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Zurzeit nicht in Benutzung, für zukünftige Funktionen reserviert</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Akzentfarbe</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Wird auf den Emoji-Reiter angewandt</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Farbe der Navigationsleiste</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">Der Hintergrund der Navigationsleiste.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Dunkler Vordergrund der Navigationsleiste</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">EIN für dunklen oder AUS für hellen Vordergrund.</string>
|
||||
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Tastatur-Einstellungen</string>
|
||||
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Tasten</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">Schriftgröße anpassen (Hochformat)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Schriftgröße anpassen (Querformat)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Layout</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Einhandmodus</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Aus</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Rechtshändermodus</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Linkshändermodus</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Tastaturhöhe</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Sehr klein</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Klein</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Etwas kleiner</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normal</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Etwas größer</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Groß</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Sehr groß</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Benutzerdefiniert</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Benutzerdefinierte Tastaturhöhe</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Unteres Ende absetzen (für abgerundete Bildschirme)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Tastendruck</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Ton bei Tastendruck</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Lautstärke der Tastendrucktöne</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Vibration bei Tastendruck</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Vibrationsstärke bei Tastendruck</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Pop-Up Sichtbarkeit</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Pop-Up bei Tastendruck anzeigen</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Verzögerung bei langem Tastendruck</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Tipperlebnis</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Vorschläge</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] Vorschläge während des Tippens anzeigen</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Inhalt der Zwischenablage</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Inhalte der Zwischenablage einfügen, die zuvor kopiert wurden</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] Vorschläge für nächstes Wort</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Vorschläge anhand der vorherigen Wörter machen</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Korrekturen</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Autom. Groß-/Kleinschreibung</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Automatisches Großschreiben je nach aktuellem Kontext</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Status der festgestellten Umschalttaste merken</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Die festgestellte Umschalttaste bleibt auch beim Wechsel in ein anderes Textfeld aktiviert</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Doppeltes Leerzeichen durch Punkt ersetzen</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Doppeltes Tippen auf die Leertaste fügt Punkt und ein Leerzeichen ein</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Gesten & Glide Typing</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Glide Typing</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] Glide Typing einschalten</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Durch Gleiten über die Buchstaben Wort eingeben</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Bewegungsspur anzeigen</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Wird jeweils nach einem Wort ausgeblendet</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gesten</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Keine Aktion</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Einzelne Zeichen exakt löschen</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Aktuelles Wort löschen</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Einzelne Wörter exakt löschen</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Tastatur verstecken</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Cursor nach oben bewegen</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Cursor nach unten bewegen</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Cursor nach links bewegen</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Cursor nach rechts bewegen</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Umschalttaste</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Zum vorherigen Eingabestil wechseln</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Zum nächsten Eingabestil wechseln</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Nach oben wischen</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Nach unten streichen</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Nach links streichen</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Nach rechts streichen</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Leertaste nach links streichen</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Leertaste nach rechts streichen</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Löschtaste nach links streichen</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Gesten-Geschwindigkeitsschwelle</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Sehr langsam</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Langsam</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normal</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Schnell</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Sehr schnell</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Gesten-Distanzschwelle</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Sehr kurz</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Kurz</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">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="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>
|
||||
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Zeige die App in der Übersicht</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">Über</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">App-Icon von FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Open Source-Lizenzen</string>
|
||||
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Datenschutzrichtlinien</string>
|
||||
<string name="about__view_source_code" comment="Label of View source code button in About">Quellcode</string>
|
||||
<string name="about__license__title" comment="Title of Open-source licenses dialog">Open Source-Lizenzen</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Einrichtung</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Zurück</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Abbrechen</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Weiter</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Abschließen</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">Okay</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Herzlich willkommen!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Vielen Dank, dass Sie FlorisBoard ausprobieren! Bevor Sie loslegen können, muss FlorisBoard in den Systemeinstellungen aktiviert und Sprache, Design, etc. eingerichtet werden... Aber keine Sorge - Der Einrichtungsassistenz wird sie durch die Konfiguration leiten!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">FlorisBoard respektiert Ihre Privatsphäre vollständig und sammelt keine Nutzungsdaten. Für mehr Informationen:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">Der Quellcode für FlorisBoard ist für alle öffentlich zugänglich, so können Sie leicht selbst überprüfen, wie FlorisBoard im Hintergrund arbeitet. Besuchen Sie dafür das Repository.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Ein letzter Hinweis, bevor die Einrichtung startet - 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!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Um die Einrichtung zu starten, klicken sie auf <i>WEITER</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">FlorisBoard aktivieren</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">Android verlangt, dass Tastaturen manuell aktiviert werden müssen, bevor sie benutzt werden können. Klicken Sie auf die Schaltfläche um in die Einstellungen für <i>Sprache und Eingabe</i> zu gelangen, stellen Sie sicher, dass dort \'<i>FlorisBoard</i>\' aktiviert ist.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">FlorisBoard wurde erfolgreich aktiviert. Um fortzufahren klicken sie auf <i>WEITER</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Öffne Sprachen und Eingabe</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">FlorisBoard als Standard einrichten</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">FlorisBoard ist nun auf ihrem System aktiviert. Um es zu benutzen, wählen Sie bei der Standard-Eingabemethode FlorisBoard aus!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">FlorisBoard wurde erfolgreich als Standard-Tastatur ausgewählt!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Tastatur wechseln</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Einrichtung abgeschlossen!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">FlorisBoard Fehlermeldung</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Wir bitten die Unannehmlichkeiten zu entschuldigen, aber FlorisBoard wurde wegen eines Fehlers unerwartet geschlossen.\n\nWenn Sie diesen Fehler melden möchten, klicken Sie auf \"In die Zwischenablage kopieren\" und danach auf \"Fehlermeldung erstellen\". Füllen Sie die Fehlermeldung aus und fügen Sie das Protokoll ein. Mit Ihrer Hilfe kann FlorisBoard besser und stabiler für alle werden. Vielen Dank!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">In die Zwischenablage kopieren</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Fehler melden (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Schließen</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">FlorisBoard Fehlermeldungen</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard funktioniert nicht mehr…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Tippen, um Details anzuzeigen</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">FlorisBoard funktioniert zum wiederholten Male nicht…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Um eine endlose Absturzschleife zu verhindern, wurde automatisch auf die zuvor benutzte Tastatur zurückgegriffen. Tippen, um die Fehlermeldung anzuzeigen</string>
|
||||
</resources>
|
||||
217
app/src/main/res/values-el/strings.xml
Normal file
217
app/src/main/res/values-el/strings.xml
Normal file
@@ -0,0 +1,217 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Παύση</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Αναμονή</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Εικονίδιο με τρεις τελείες. Εάν εμφανιστεί, υποδεικνύει πως περισσότερα γράμματα μπορούν να χρησιμοποιηθούν εάν πατηθεί παρατεταμένα.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Κλείσιμο λειτουργίας ενός χεριού.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Μεταφορά πληκτρολογίου στα αριστερά.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Μεταφορά πληκτρολογίου στα δεξιά.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Εικονίδια Emoji</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Εικονίδια emoticon</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Εικονίδια smiley & Συναισθήματα</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Άνθρωποι & Σώμα</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Ζώα & Φύση</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Φαγητό & Ποτό</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Ταξίδι & Μέρη</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Δραστηριότητες</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Αντικείμενα</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Σύμβολα</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Σημαίες</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Διακόπτης γρήγορης ενέργειας. Εάν πατηθεί, προκαλεί εναλλαγή μεταξύ των προτάσεων λέξεων και των πλήκτρων γρήγορης ενέργειας.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Έξοδος από την επιφάνεια επεξεργασίας κειμένου.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Εναλλαγή κατάστασης της λειτουργίας ενός χεριού.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Άνοιγμα ρυθμίσεων.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Εναλλαγή στην επιφάνεια επεξεργασίας κειμένου.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Εναλλαγή στην όψη εισαγωγής μέσων.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Ρυθμίσεις</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__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Αρχική</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Πληκτρολόγιο</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Πληκτρολόγηση</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Θέμα</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Κινήσεις</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Προεπιλογή</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Προεπιλογή συστήματος</string>
|
||||
<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__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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Προσθήκη υποτύπου</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Εφαρμογή</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Ακύρωση</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Διαγραφή</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Επεξεργασία υποτύπου</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Ρυθμίσεις γλώσσας</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Διάταξη πληκτρολογίου</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Αυτός ο υποτύπος υπάρχει ήδη!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Θέμα πληκτρολογίου</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Μη ορισμένο</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Θέμα</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Ειδικό (βασισμένο σε %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Επιλεγμένο θέμα:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Διαθέσιμα θέματα:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Βέλος δεξιά</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Χρώμα φόντου</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Χρώμα φόντου όταν είναι ενεργό</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Χρώμα φόντου όταν πατηθεί</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Χρώμα προσκηνίου</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Χρώμα προσκηνίου (εναλλακτικό)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Χρώμα προσκηνίου (κεφαλαία)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Επιλέξτε ένα χρώμα</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Παράθυρο & Σύστημα</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Πληκτρολόγιο</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Πλήκτρο</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Πλήκτρο εισαγωγής</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Εμφάνιση πλήκτρων</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Πλήκτρο κεφαλαίων</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Περιεχόμενο μέσων</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Με το ένα χέρι</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Πλήκτρο λειτουργίας ενός-χεριού</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Έξυπνη Μπάρα</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Πλήκτρο έξυπνης μπάρας</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Κυρίως χρώμα</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Εφαρμόζεται στην μπάρα κυματισμού των κυρίως μέσων και στην επισήμανση επιλογής</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Κυρίως χρώμα (σκούρο)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Δεν χρησιμοποιείται προς το παρόν, δεσμευμένο για μελλοντική εφαρμογή</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Χρώμα έμφασης</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Εφαρμόζεται στον κυματισμό μπάρας των emoji</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Χρώμα μπάρας πλοήγησης</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">To φόντο της μπάρας πλοήγησης.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Σκούρο προσκήνιο μπάρας πλοήγησης</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Ορίστε ΕΝΕΡΓΟΠΟΙΗΜΈΝΟ για σκούρο ή ΑΠΕΝΕΡΓΟΠΟΙΗΜΈΝΟ για φωτεινό προσκήνιο.</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__font_size_multiplier_portrait__label" comment="Preference title">Πολλαπλασιαστής μεγέθους γραμματοσειράς (πορτραίτο)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Πολλαπλασιαστής μεγέθους γραμματοσειράς (τοπίο)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Διάταξη</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Λειτουργία ενός χεριού</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Ανενεργό</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Λειτουργία για δεξιόχειρες</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Λειτουργία για αριστερόχειρες</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Ύψος πληκτρολογίου</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Πολύ-χαμηλό</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Χαμηλό</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Μέτρια-χαμηλό</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Κανονικό</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Μέτρια-ψηλό</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Ψηλό</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Πολύ-ψηλό</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Προσαρμοσμένο</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Προσαρμοσμένη τιμή ύψους πληκτρολογίου</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Αντιστάθμιση βάσης (για κυρτές οθόνες)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Πάτημα πλήκτρου</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Ήχος κατά το πάτημα πλήκτρου</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Ένταση ήχου κατά το πάτημα πλήκτρου</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Δόνηση κατά το πάτημα πλήκτρου</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Ένταση δόνησης κατά το πάτημα πλήκτρου</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Εμφάνιση κατά το πάτημα πλήκτρου</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Επιπλέον εμφάνιση πλήκτρου όταν πατήσετε ένα πλήκτρο</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Καθυστέρηση παρατεταμένου πατήματος πλήκτρου</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Εμπειρία πληκτρολόγησης</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Προτάσεις</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] Εμφάνιση προτάσεων κατά την πληκτρολόγηση</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Προτάσεις περιεχομένου προχείρου</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Πρόταση περιεχομένου προχείρου για επικόλληση εάν έχει αντιγραφεί προηγουμένως</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] Προτάσεις επόμενων-λέξεων</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Χρήση προηγούμενων λέξεων για τη βελτίωση των πρότασεων</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Διορθώσεις</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Αυτόματη χρήση κεφαλαίων</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Κεφαλαιοποίηση λέξεων βάσει του παρόντος περιεχομένου εισαγωγής</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Διατήρηση κατάστασης κεφαλαίων</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Τα κεφαλαία θα παραμείνουν ενεργοποιημένα όταν μεταβείτε σε διαφορετικό πεδίο κειμένου</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Τελεία με διπλό-κενό</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Πατώντας δύο φορές στο πλήκτρο διαστήματος εισάγει μία τελεία ακολουθούμενη από ένα κενό</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Κινήσεις & Πληκτρολόγηση με ολίσθηση</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Πληκτρολόγηση με ολίσθηση</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] Ενεργοποίηση πληκτρολόγησης με ολίσθηση</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Πληκτρολογήστε μία λέξη με ολίσθηση του δαχτύλου μέσα από τα γράμματά της</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Εμφάνιση διαδρομής ολίσθησης</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Θα εξαφανίζεται μετά από κάθε λέξη</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Κινήσεις</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Καμία ενέργεια</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Διαγραφή χαρακτήρων με ακρίβεια</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Διαγραφή της τρέχουσας λέξης</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Διαγραφή λέξεων με ακρίβεια</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Απόκρυψη πληκτρολογίου</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Μετακίνηση κέρσορα πάνω</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Μετακίνηση κέρσορα κάτω</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Μετακίνηση κέρσορα αριστερά</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" 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__switch_to_prev_subtype" comment="Preference value for swipe action">Εναλλαγή στον προηγούμενο υποτύπο</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Εναλλαγή στον επόμενο υποτύπο</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Σάρωση πάνω</string>
|
||||
<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_left__label" comment="Preference title">Σάρωση αριστερά στο πλήκτρο διαστήματος</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__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__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>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Όριο απόστασης σάρωσης</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Πολύ σύντομο</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Σύντομο</string>
|
||||
<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="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__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Εμφάνιση του εικονιδίου της εφαρμογής στον εκκινητή</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">Σχετικά με</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">Εικονίδιο εφαρμογής του FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Άδειες λογισμικού ανοικτού κώδικα</string>
|
||||
<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>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Ρύθμιση</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Προηγ</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Ακύρωση</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Επόμενο</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Ολοκλήρωση</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">ΟΚ</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Καλώς ήλθατε!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Ευχαριστώ που δοκιμάζετε το FlorisBoard! Προτού να μπορέσετε να ξεκινήσετε να το χρησιμοποιείτε, πρέπει να κάνουμε τα συνηθισμένα πράγματα και να το ενεργοποιήσουμε στις ρυθμίσεις συστήματος, να ορίσουμε τη προτιμώμενη γλώσσα/διάταξη, κτλ... Άλλα μην ανησυχείτε - ο βοηθός ρύθμισης θα σας καθοδηγήσει σε αυτό!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">Το FlorisBoard σέβεται πλήρως την ιδιωτικότητά σας και δε συλλέγει καθόλου δεδομένα χρήστη. Για περισσότερες πληροφορίες δείτε εδώ:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">Ο πηγαίος κώδικας του FlorisBoard είναι δημοσίως προσβάσιμος για τον καθένα, οπότε μπορείτε εύκολα να εξετάσετε τί κάνει το FlorisBoard στο παρασκήνιο. Ρίξτε μία ματιά στο σύνδεσμο αποθετηρίου παρακάτω.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Ένα τελευταίο πράγμα προτού ξεκινήσετε τη ρύθμιση - εάν αντιμετωπίσετε προβλήματα/κρασαρίσματα/θέματα με το FlorisBoard ή εάν έχετε μία πρόταση για χαρακτηριστικό - μεταβείτε στο αποθετήριο του GitHub με τον παρακάτω σύνδεσμο και υποβάλλετε ένα θέμα. Αυτό βοηθάει στη βελτίωση της εμπειρίας για όλους τους χρήστες!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Για να ξεκινήσετε τη ρύθμιση, πατήστε<i>ΕΠΌΜΕΝΟ</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">Ενεργοποίηση FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">Το android απαιτεί κάθε ειδικό πληκτρολόγιο να ενεργοποιείται χειροκίνητα πριν τη χρήση. Πατήστε το κουμπί παρακάτω για να μεταβείτε στις ρυθμίσεις <i>Γλώσσας & Εισαγωγής</i>, έπειτα φροντίστε να επιλέξετε το \'<i>FlorisBoard</i>\'.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">Το FlorisBoard έχει ενεργοποιηθεί επιτυχώς. Για να συνεχίσετε πατήστε <i>ΕΠΌΜΕΝΟ</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Άνοιγμα ρυθμίσεων Γλώσσας & Εισαγωγής</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">Ορισμός FlorisBoard ως προεπιλογή</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">Το FlorisBoard είναι τώρα ενεργοποιημένο στο σύστημα σας. Για να το χρησιμοποιήσετε ενεργά, αλλάξτε στο FlorisBoard επιλέγοντας το στο διάλογο επιλογέα εισαγωγής!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">Αλλάξατε επιτυχώς το προεπιλεγμένο πληκτρολόγιο στο FlorisBoard!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Εναλλαγή πληκτρολογίου</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Η ρύθμιση ολοκληρώθηκε!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">Αναφορά σφάλματος FlorisBoard</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Συγγνώμη για την ταλαιπωρία, άλλα το FlorisBoard έχει κρασάρει εξαιτίας ενός απρόβλεπτου σφάλματος.\n\nΕάν επιθυμείτε να αναφέρετε αυτό το σφάλμα, πατήστε στο πλήκτρο \"Αντιγραφή στο πρόχειρο\", έπειτα στο πλήκτρο \"Άνοιγμα αναφοράς προβλήματος\". Συμπληρώστε την αναφορά προβλήματος και αντιγράψτε το αρχείο καταγραφής. Αυτό βοηθάει στο να γίνει το FlorisBoard καλύτερο και πιο σταθερό για όλους. Σας ευχαριστώ!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Αντιγραφή στο πρόχειρο</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Άνοιγμα φόρμας αναφοράς προβλήματος (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Κλείσιμο</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">Αναφορές σφάλματος FlorisBoard</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">Το FlorisBoard έχει σταματήσει να λειτουργεί…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Πατήστε για προβολή λεπτομερειών σφάλματος</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">Φαίνεται πως το FlorisBoard σταματά να λειτουργεί επανειλημμένα…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Χρήση εναλλακτικά του προηγούμενου πληκτρολογίου για να σταματήσει ο αδιάκοπος κύκλος κρασαρισμάτων. Πατήστε για να δείτε λεπτομέρειες του σφάλματος</string>
|
||||
</resources>
|
||||
108
app/src/main/res/values-eo/strings.xml
Normal file
108
app/src/main/res/values-eo/strings.xml
Normal file
@@ -0,0 +1,108 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Paŭzigi</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Atendi</string>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emoĝioj</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Miensimboloj</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Mienetoj & Emocioj</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Homoj & Korpo</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Bestoj & Misvojo</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Manĝaĵo & Trinkaĵo</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Vojaĝo & Lokoj</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Aktivaĵoj</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Objektoj</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Simboloj</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Flagoj</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Malfermi agordojn.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Agordoj</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Pliaj opcioj</string>
|
||||
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Helpo & kuplado</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Hejmo</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Klavaro</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Tajpado</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Etoso</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gestoj</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Defaŭlta</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Sistema defaŭlta</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">Bonvenon al %s</string>
|
||||
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Aldoni</string>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Aldoni subspeco</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Apliki</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Nuligi</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Forigi</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Redakti subspeco</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Lokaĵaro</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Klavaro</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Klavaro etoso</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Nedifinita</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Etoso</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Selektado etoso:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Disponataj etosoj:</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Fona koloro</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Fona koloro kiam aktiva</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Fona koloro kiam depremos</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Malfona koloro</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Malfona koloro (alternativo)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Malfona koloro (fiksiĝema ĉeflitera registrumo)</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Klavaro</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Klavo</string>
|
||||
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Klavaro agordoj</string>
|
||||
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Klavoj</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Aranĝo</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Malvalidigita</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Klavaro alteco</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Pli kurta</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Kurta</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Norma</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Granda</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Pli granda</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Laŭmenda</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Laŭmenda klavaro alteca valora</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Klavaĵo ekdepremi</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gestoj</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Neniu ago</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Ŝovumi supre</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Ŝovumi sube</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Ŝovumi maldekstre</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Ŝovumi dekstre</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Tre malrapida</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Malrapida</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Norma</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Rapida</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Tre rapida</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Tre mallonga</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Mallonga</string>
|
||||
<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="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>
|
||||
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Montri aplikaĵo bildeto en aplikaĵolanĉilo</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">Pri</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">Aplikaĵo bildeto de FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Malfermitkodaj permesiloj</string>
|
||||
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Privateca politiko</string>
|
||||
<string name="about__view_source_code" comment="Label of View source code button in About">Fontkodo</string>
|
||||
<string name="about__license__title" comment="Title of Open-source licenses dialog">Malfermitkodaj permesiloj</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Agordaĵo</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Antaŭa</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Nuligi</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Sekva</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Finigi</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">Bone</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Bonvenon!</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">Aktivigi FlorisBoard</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Ŝalti klavaro</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Kopii al tondejo</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Fermi</string>
|
||||
</resources>
|
||||
11
app/src/main/res/values-es/strings.xml
Normal file
11
app/src/main/res/values-es/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
108
app/src/main/res/values-fa/strings.xml
Normal file
108
app/src/main/res/values-fa/strings.xml
Normal file
@@ -0,0 +1,108 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">مکث</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">صبرکنید</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">جابهجایی صفحه کلید به سمت چپ.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">جابهجایی صفحه کلید به سمت راست.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">ایموجی ها</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Emoticons</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">لبخندی & احساسات</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">مردم & بدن</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">حیوانات & طبیعت</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">غذا ها & نوشیدنی ها</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">صفر & مکان ها</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">فعالیت ها</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">اشیاء</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">نشانه ها</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">پرچم ها</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">باز کردن تنظیمات.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">تنظیمات</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__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">خانه</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">صفحه کلید</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">نوشتن</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">تم</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">اشارات</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">پیشفرض</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">پیشفرض سیستم</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">خوش آمدید به %s</string>
|
||||
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">افزودن</string>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">افزودن زیر-نوعی</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">اعمال</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">لغو</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">حذف</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">ویرایش زیر-نوعی</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>
|
||||
<string name="pref__keyboard__number_row__summary" comment="Preference summary">ردیف عددی که بالای چیدمان کاراکتر ها نمایش داده می شود</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">اندازه فونت چند برابری(عمودی)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">اندازه فونت چند برابری(افقی)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">چیدمان</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">حالت تک دستی</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">خاموش</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">حالت دست راستی</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">حالت دست چپی</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">ارتفاع صفحه کلید</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">بیشتر-کوتاه</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">کوتاه</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">متوسط-کوتاه</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">عادی</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">متوسط-بلند</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">بلند</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">بیشتر-بلند</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">سفارشی</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">مقدار ارتفاع سفارشی صفحهکلید</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">فاصله از کف (برای صفحه های منحنی)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">فشردن کلید</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">صدای فشردن کلید</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">میزان صدای فشردن کلید</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">لرزش هنگام فشردن کلید</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">قدرت لرزش هنگام فشردن کلید</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">نمایش پاپآپ</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">نمایش پاپآپ وقتی کلیدی را می فشارید</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">تاخیر فشردن طولانی کلید</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">تجربه در تایپ کردن</string>
|
||||
<string name="pref__smartbar__enabled__label" comment="Preference title">فعال سازی نوار هوشمند</string>
|
||||
<string name="pref__smartbar__enabled__summary" comment="Preference summary">بالای صفحهکلید نمایش داده خواهند شد</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">پیشنهادات</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] نمایش پیشنهادات حین تایپ کردن</string>
|
||||
<string name="pref__suggestion__enabled__summary" comment="Preference summary">در نوار هوشمند نمایش داده خواهد شد</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] پیشنهادات کلمه بعدی</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">استفاده از کلمه قبلی برای پیشنهادات</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">تصحیح</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">حرف اول بزرگ به صورت خودکار</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">بزرگ کردن حرف اول بر اساس محتوای ورودی</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">به یاد داشتن حالت caps lock</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Caps lock با رفتن به محل نوشتن بعدی همانگونه بماند</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">فاصله زمانی دوبار-فاصله</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">فشردن دو بار فاصله در فاصله زمانی باعث ادامه دادن فاصله گذاشتن شود</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">اشارات & نوشتن گلایدی</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">نوشتن گلایدی</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] فعال سازی نوشتن گلایدی</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">نوشتن حروف با حرکت مداوم و نگه داشتن روی حرف مورد نظر</string>
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">لغو</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">بعدی</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">پایان</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">تأیید</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">خوش آمدید!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">ممنون از اینکه FlorisBoard رو امتحان کردین! قبل از اینکه شروع به استفاده کنید، ما هم چیزای همیشگی که باید برای فعال کردنش در تنظیمات انجام بدهید را داریم، تنظیم زبان/چیدمان و… ولی نگران نباشید - تنظیم جادویی شما را در این کار راهنمایی خواد کرد!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">FlorisBoard به طور کامل به حریم خصوصی شما احترام می گذارد و هیچ اطلاعاتی از کاربر دریافت نمی کند. برای اطلاعات بیشتر به اینجا مراجعه کنید:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">کد سورس FlorisBoard به طور عمومی در دسترس همگان قرار دارد، پس شما می توانید به راحتی اینکه پشت صحنه FlorisBoard چه اتفاقی می افتد را مرور کنید. لینک مخزن را از زیر مشاهده کنید.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">یک تنظیم پایانی قبل از شروع - اگر شما به ایرادی/خراب شدنی/مشکلی با FlorisBoard برخورد کردید یا درخواست خواصه خود را دارید - به مخزن GitHub که لینکش در زیر واقع شده بروید و مشکل را استناد کنید. این در تجربه به همه کاربران کمک می کند!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">برای شروع راه انداز تنظیمات روی <i>بعدی</i> کلیک کنید.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">فعال سازی FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">در اندروید هر صفحه کلید سفارشی باید به طور دستی قبل از استفاده فعال شود. روی دکمه زیر کلیک کنید تا به تنظیمات <i>زبان & ورودی</i> بروید، بعد مطمعن شوید که <i>FlorisBoard</i> را چک و فعال کرده اید.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">FlorisBoard با موفقیت فعال شد. برای ادامه روی <i>بعدی</i> بزنید!</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">تنظیم FlorisBoard به پیشفرض</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
217
app/src/main/res/values-fi/strings.xml
Normal file
217
app/src/main/res/values-fi/strings.xml
Normal file
@@ -0,0 +1,217 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Tauko</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Odota</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Kolmen pisteen kuvake. Se tarkoittaa, että lisää kirjaimia on saatavilla pitkällä painalluksella.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Sulje yhden käden tila.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Siirrä näppäimistö vasemmalle.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Siirrä näppäimistö oikealle.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emojit</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Hymiöt</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomojit</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Hymiöt & tunteet</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Ihmiset & keho</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Eläimet & luonto</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Ruoka & juoma</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Matkustus & kohteet</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Aktiviteetit</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Esineet</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Symbolit</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Liput</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Toimintojen pikavaihto. Painettaessa vaihtaa sanaehdotusten ja pikatoimintopainikkeiden välillä.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Poistu tekstinmuokkauspaneelista.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Ota käyttöön tai poista käytöstä yksikätinen tila.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Avaa asetukset.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Näytä tekstinmuokkauspaneeli.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Vaihda mediansyöttönäkymään.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Asetukset</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Lisää asetuksia</string>
|
||||
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Ohjeet & palaute</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Etusivu</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Näppäimistö</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Kirjoittaminen</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Teema</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Eleet</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Oletus</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Järjestelmän oletus</string>
|
||||
<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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Lisää asettelu</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Käytä</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Peruuta</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Poista</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Muokkaa asettelua</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Kielialue</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Näppäimistöasettelu</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Tämä asettelu on jo lisätty!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Näppäimistön teema</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Ei määritelty</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Teema</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Muokattu (perustuu teemaan %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Valittu teema:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Käytettävissä olevat teemat:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Nuoli oikealle</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Taustaväri</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Taustaväri aktiivisena</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Taustaväri painettuna</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Merkin väri</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Merkin väri (vaihtoehtoinen)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Merkin väri (caps lock)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Valitse väri</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Ikkuna & järjestelmä</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Näppäimistö</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Painike</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Enter-painike</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Painikkeen ponnahdus</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Shift-painike</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Mediakonteksti</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Yksikätinen</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Yksikätisyyspainike</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Älypalkki</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Älypalkin painike</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Ensisijainen väri</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Sovelletaan tärkein media välilehti aaltoilu ja valinta korosta</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Ensisijainen väri (tumma teema)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Ei toistaiseksi käytössä, valmiina tulevia toimintoja varten</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Aksenttiväri</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Sovellettu emoji-välilehteen ripple</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Navigointipalkin väri</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">Navigointipalkin tausta.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Navigointipalkin tummat painikkeet</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Aseta päälle tummia tai pois päältä vaaleita painikkeita varten.</string>
|
||||
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Näppäimistön asetukset</string>
|
||||
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Painikkeet</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">Fonttikoon kerroin (pystysuunnassa)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Fonttikoon kerroin (vaakasuunnassa)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Ulkoasu</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Yksikätinen tila</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Pois päältä</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Oikean käden tila</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Vasemman käden tila</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Näppäimistön korkeus</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Extra-matala</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Matala</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Melko matala</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normaali</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Keskikorkea</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Korkea</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Erittäin korkea</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Mukautettu</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Mukautettu näppäimistön korkeus</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Alareunan sijainnin korjaus (kaareville näytöille)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Painallus</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Painikeääni</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Painikeäänen voimakkuus</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Värinä painalluksella</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Värinän voimakkuus painalluksella</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Ponnahdusikkunoiden Näkyvyys</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Näytä ponnahdusikkuna, kun painat näppäintä</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Pitkän painalluksen viive</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Kirjoituskokemus</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Ehdotukset</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[EVS] Näytä ehdotukset kirjoittaessa</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Leikepöydän sisällön ehdotukset</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Ehdota leikepöydän sisältöä liittämään, jos se on aiemmin kopioitu</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[EVS] Sanaehdotukset</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Käytä edellisiä sanoja ehdotuksiin</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Korjaukset</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Automaattiset isot kirjaimet</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Automaattinen iso kirjain syöttökontekstin perusteella</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Muista caps lockin tila</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Caps lock pysyy päällä, kun siirrytään seuraavaan tekstikenttään</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Piste tuplavälilyönnillä</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Kun välilyöntiä napautetaan kahdesti, lisätään piste ja välilyönti</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Eleet & liukukirjoitus</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Liukukirjoitus</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[EVS] Ota liukukirjoitus käyttöön</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Syötä sana liu\'uttamalla sormea sen kirjaimilla</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[EVS] Näytä liu\'un jälki</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Häviää joka sanan jälkeen</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Eleet</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Ei toimintoa</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Tarkka merkkien poisto</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Poista nykyinen sana</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Poista sanat tarkasti</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Piilota näppäimistö</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Siirrä kursori ylös</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Siirrä kursori alas</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Siirrä kursori vasemmalle</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Siirrä kursori oikealle</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Shift</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Vaihda edelliseen asetelmaan</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Vaihda seuraavaan asetelmaan</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Pyyhkäisy ylös</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Pyyhkäisy alas</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Pyyhkäisy vasemmalle</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Pyyhkäisy oikealle</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Pyyhkäisy vasemmalle välilyöntinäppäimessä</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Pyyhkäisy oikealle välilyöntinäppäimessä</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Pyyhkäisy vasemmalle delete-painikkeessa</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Pyyhkäisynopeuden kynnys</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Erittäin hidas</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Hidas</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normaali</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Nopea</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Erittäin nopea</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Pyyhkäisyn pituuden kynnys</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Erittäin lyhyt</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Lyhyt</string>
|
||||
<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="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>
|
||||
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Näytä sovellus sovellusvalikossa</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">Tietoa</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">FlorisBoardin kuvake</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Avoimen lähdekoodin lisenssit</string>
|
||||
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Tietosuojakäytäntö</string>
|
||||
<string name="about__view_source_code" comment="Label of View source code button in About">Lähdekoodi</string>
|
||||
<string name="about__license__title" comment="Title of Open-source licenses dialog">Avoimen lähdekoodin lisenssit</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Asennus</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Edellinen</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Peruuta</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Seuraava</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Valmis</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">OK</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Tervetuloa!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Kiitos kun otit käyttöön FlorisBoardin! Ennen kuin aloitat sen käytön, täytyy se tavalliseen tapaan ottaa käyttöön järjestelmän asetuksista, asettaa haluamasi kieli ja näppäinasettelu jne... Mutta ei huolta - ohjattu asennus opastaa sinua!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">FlorisBoard kunnioittaa täysin yksityisyyttäsi eikä kerää mitään käyttäjädataa. Lisää tietoa täältä:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">FlorisBoardin lähdekoodi on julkisesti kaikkien saatavilla, joten voit itse arvioida mitä FlorisBoard on ohjelmoitu tekemään. Avaa tietovarasto allaolevasta linkistä.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Yksi asia ennen kuin aloitat asennuksen - jos törmäät bugeihin/ongelmiin tai sovellus kaatuu tai sinulla on toiveita lisäominaisuuksista - suuntaa GitHub-tietovarastoon allaolevasta linkistä ja lähetä uusi aihe. Tämä auttaa käyttökokemuksen parantamista kaikille käyttäjille!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Klikkaa <i>SEURAAVA</i> aloittaaksesi asennuksen.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">Ota FlorisBoard käyttöön</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">Android vaatii, että jokainen erikseen asennettu näppäimistösovellus otetaan käyttöön manuaalisesti. Klikkaa allaolevaa painiketta avataksesi <i>Kielet ja syöttötapa</i>-asetukset ja varmista, että olet valinnut \'<i>FlorisBoardin</i>\'.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">FlorisBoard on otettu onnistuneesti käyttöön. Klikkaa <i>SEURAAVA</i> jatkaaksesi!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Avaa Kielet ja syöttötapa-asetukset</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">Käytä FlorisBoardia oletuksena</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">Florisboard on nyt otettu järjestelmän käyttöön. Käyttääksesi sitä aktiivisesti, valitse FlorisBoard syöttötavaksi valintaikkunassa!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">Oletusnäppäimistö muutettu FlorisBoardiksi!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Vaihda näppäimistö</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Asennus valmis!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">FlorisBoardin virheraportti</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Pahoittelemme, mutta FlorisBoard on kaatunut odottamattomasta virheestä.\n\nJos haluat lähettää virheraportin, klikkaa \"Kopioi leikepöydälle\" ja paina sitten \"Avaa virheraportti\"-painiketta. Täytä virheraportti ja liitä loki. Tämä auttaa FlorisBoardin kehittämisessä paremmaksi ja vakaammaksi kaikille. Kiitos!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Kopioi leikepöydälle</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Avaa virheraportti (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Sulje</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">FlorisBoard-virheraportit</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard on lopettanut toimintansa…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Napauta nähdäksesi virheen tiedot</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">FlorisBoard vaikuttaa lopettavan toimintansa toistuvasti…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Vaihdetaan edelliseen näppäimistöön, jotta kaatumiskierre loppuu. Napauta nähdäksesi virheen tiedot</string>
|
||||
</resources>
|
||||
222
app/src/main/res/values-fr/strings.xml
Normal file
222
app/src/main/res/values-fr/strings.xml
Normal file
@@ -0,0 +1,222 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Pause</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Attendre</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Icône avec trois points. Si elle est visible, elle indique qu\'il est possible d\'utiliser plus de lettres si l\'on appuie plus longtemps.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Fermer le mode à une main.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Déplacez le clavier vers la gauche.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Déplacez le clavier vers la droite.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Émojis</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Émoticônes</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Smileys & Émotions</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Personnes & Corps</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Animaux & Nature</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Nourriture & Boissons</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Voyage & Lieux</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Activités</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Objets</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Symboles</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Drapeaux</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Commutateur d\'action rapide. Si vous appuyez dessus, vous basculez entre les suggestions de mots et les boutons d\'action rapide.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Quitter le panneau d\'édition de texte.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Commutez l\'état du mode à une main.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Ouvrir les paramètres.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Passez au panneau d\'édition de texte.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Passez à la vue d\'entrée multimédia.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Paramètres</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__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Accueil</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Clavier</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Dactylographie</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Thème</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gestes</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Par défaut</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Défaut du système</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">Bienvenue sur %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 il lui manque donc des fonctionnalités. Si vous trouvez des bugs ou si vous voulez faire une suggestion, veuillez consulter le répertoire sur GitHub et signaler un problème. Cela permet d\'améliorer FlorisBoard. Merci pour votre aide !</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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Ajouter une disposition</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Appliquer</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Annuler</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Supprimer</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Modifier la disposition</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Locale</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Disposition du clavier</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Cette disposition existe déjà !</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Thème du clavier</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Non défini</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Thème</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Personnalisé (basé sur %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Thème choisi:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Thèmes disponibles:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Flèche droite</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Couleur d\'arrière-plan</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Couleur d\'arrière-plan lorsque actif</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Couleur d\'arrière-plan lorsqu\'on appuie sur une touche</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Couleur du premier plan</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Couleur d\'avant-plan (alternative)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Couleur d\'avant-plan (verrouillage des majuscules)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Sélectionnez une couleur</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Fenêtre & Système</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Clavier</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Touche</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">La touche Entrer</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Pop-up de touche</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">La touche Maj</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Contexte médiatique</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">À une main</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Bouton à une main</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Barre intelligente</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Bouton de la barre intelligente</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Couleur primaire</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Appliqué à la sélection et à l\'ondulation de l\'onglet principal des médias</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Couleur primaire (sombre)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Non utilisé actuellement, réservé pour une implémentation future</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Couleur d\'accentuation</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Appliqué à l\'ondulation de l\'onglet emoji</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Couleur de la barre de navigation</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">L\'arrière-plan de la barre de navigation.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Avant-plan sombre de la barre de navigation</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Réglez sur ON pour sombre ou sur OFF pour clair en avant-plan.</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 numéros</string>
|
||||
<string name="pref__keyboard__number_row__summary" comment="Preference summary">Afficher la rangée de numéros au dessus de la disposition des caractères</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">Multiplicateur de la taille de la police (portrait)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Multiplicateur de la taille de la police (paysage)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Disposition</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Mode à une main</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Désactivé</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Mode droitier</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Mode gaucher</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Hauteur du clavier</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Très court</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Court</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Mi-court</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normal</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Mi-haut</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Haut</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Très haut</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Personnalisée</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Valeur personnalisée de la hauteur du clavier</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Décalage du fond (pour les écrans courbes)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Touche pressée</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Tonalité des touches</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Volume sonore des touches</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Vibrer à chaque touche pressée</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">La force de vibration lors de l\'appui sur une touche</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Visibilité des pop-ups</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Afficher un pop-up lorsque vous appuyez sur une touche</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Délai d\'appui prolongé</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Expérience de la dactylographie</string>
|
||||
<string name="pref__smartbar__enabled__label" comment="Preference title">Activer la Smartbar</string>
|
||||
<string name="pref__smartbar__enabled__summary" comment="Preference summary">S\'affichera en haut du clavier</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Suggestions</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] Afficher les suggestions lorsque que vous tapez</string>
|
||||
<string name="pref__suggestion__enabled__summary" comment="Preference summary">Sera affiché dans la Smartbar</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Suggestions pour le contenu du presse-papiers</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Suggérer le contenu du presse-papiers à coller s\'il a déjà été copié</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] Suggestions de mots suivants</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Utilisez les mots précédents pour faire des suggestions</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Corrections</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Auto-capitalisation</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Capitaliser les mots en fonction du contexte de saisie actuel</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Se souvenir de l\'état de verrouillage des majuscules</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Le verrouillage des majuscules reste activé lorsque l\'on passe à un autre champ de texte</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Point de double espace</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Entappant deux fois sur la barre d\'espacement, on insère un point suivi d\'un espace</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Gestes & Dactylographie en glissant</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Dactylographie en glissant</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] Activer la dactylographie en glissant</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Tapez un mot en faisant glisser votre doigt entre ses lettres</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Montrer la piste de glissement</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Disparaîtra après chaque mot</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gestes</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Aucune action</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Effacer les caractères avec précision</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Supprimer le mot courant</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Supprimer les mots avec précision</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Masquer le clavier</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Déplacer le curseur vers le haut</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Déplacer le curseur vers le bas</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Déplacer le curseur vers la gauche</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Déplacer le curseur vers la droite</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Maj</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Passer à la disposition précédente</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Passer à la disposition suivante</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Glisser vers le haut</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Glisser vers le bas</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Glisser vers la gauche</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Glisser vers la droite</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Glisser de la barre d\'espace vers la gauche</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Glisser de la barre d\'espace vers la droite</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Glisser de la touche de suppression vers la gauche</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Seuil de vitesse de glissement</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Très lente</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Lente</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normale</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Rapide</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Très rapide</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Seuil de la distance de glissement</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Très courte</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Courte</string>
|
||||
<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="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__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Afficher l\'icône de l\'application dans le lanceur</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">À propos</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">Icône de l\'application FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Licences de logiciels libres</string>
|
||||
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Politique de confidentialité</string>
|
||||
<string name="about__view_source_code" comment="Label of View source code button in About">Code source</string>
|
||||
<string name="about__license__title" comment="Title of Open-source licenses dialog">Licences de logiciels libres</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Configuration</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Préc</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Annuler</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Suivant</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Terminer</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">OK</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Bienvenue !</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Merci d\'essayé FlorisBoard ! Avant que vous puissiez commencer à l\'utiliser, nous devons faire les choses habituelles et l\'activer dans les paramètres du système, configurer votre langue/configuration préférée, etc… Mais ne vous inquiétez pas - l\'assistant de configuration vous guidera à travers tout cela !</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">FlorisBoard respecte pleinement votre vie privée et ne collecte aucune donnée sur les utilisateurs. Pour plus d\'informations, voir ici :</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">Le code source de FlorisBoard est accessible à tous, ce qui vous permet de voir facilement ce que fait FlorisBoard en arrière-plan. Consultez le lien du répertoire ci-dessous.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Une dernière chose avant de commencer l\'installation - si vous rencontrez des bugs/plantages/problèmes avec FlorisBoard ou si vous avez une demande de fonctionnalité - allez dans le répertoire GitHub ci-dessous et posez un problème. Cela permet d\'améliorer l\'expérience pour tous les utilisateurs !</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Pour démarrer la configuration, cliquez sur <i>SUIVANT</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">Activer FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">Android exige que chaque clavier personnalisé soit activé manuellement avant que vous puissiez l\'utiliser. Cliquez sur le bouton ci-dessous pour accéder au paramètres de <i>Langue & Saisie</i>, ensuite assurez-vous de de cocher \'<i>FlorisBoard</i>\'.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">FlorisBoard a été activé avec succès. Pour continuer, cliquez sur <i>SUIVANT</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Ouvrir les paramètres de Langue & Saisie</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">Mettre FlorisBoard par défaut</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">FlorisBoard est maintenant activé dans votre système. Pour l\'utiliser activement, passez à FlorisBoard en le sélectionnant dans le menu de sélection des saisies !</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">Le changement du clavier par défaut à FlorisBoard a été effectué avec succès !</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Changer le clavier</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Configuration terminée !</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">Rapport d\'erreur de FlorisBoard</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Désolé pour le dérangement, mais FlorisBoard a planté à cause d\'une erreur inattendue.\n\nSi vous souhaitez signaler cette erreur, cliquez sur \"Copier dans le presse-papiers\", puis sur le bouton \"Ouvrir le rapport de bug\". Remplissez le rapport de bug et collez le journal. Cela permet de rendre FlorisBoard meilleur et plus stable pour tout le monde. Merci !</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Copier dans le presse-papiers</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Ouvrir le formulaire de rapport de bug (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Fermer</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">Rapports d\'erreur de FlorisBoard</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard a cessé de fonctionner…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Appuyez sur pour afficher les détails de l\'erreur</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">FlorisBoard semble cesser de fonctionner de façon répétitive…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Retour au clavier précédent pour arrêter la boucle de plantage infinie. Appuyez pour afficher les détails de l\'erreur</string>
|
||||
</resources>
|
||||
142
app/src/main/res/values-he/strings.xml
Normal file
142
app/src/main/res/values-he/strings.xml
Normal file
@@ -0,0 +1,142 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">הפסק</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">חכה</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">סגור מצב שימוש ביד אחת.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">הזז את המקלדת לשמאל.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">הזז את המקלדת לימין.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">אמוג\'י</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">אמוטיקונים</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">קמוג\'י</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__activities" comment="Emoji category name">פעילויות</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">אובייקטים</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">סמלים</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">דגלים</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">פתח הגדרות.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">הגדרות</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">אפשרויות נוספות</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">מסך הבית</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">מקלדת</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">הקלדה</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">ערכת נושא</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">מחוות</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">ברירת מחדל</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">ברירת המחדל של המערכת</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">ברוכים הבאים ל%s</string>
|
||||
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">הוסף</string>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">הוסף תת-סוג</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">החל</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">בטל</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">מחק</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">ערוך תת-סוג</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">שפה</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">תצורת מקשים</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">תת הסוג הזה כבר קיים!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">ערכת נושא של המקלדת</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">לא מוגדר</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">ערכת נושא</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">מותאם אישית (בהתבסס על %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">ערכת הנושא שנבחרה:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">ערכות נושא:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">חץ ימינה</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">צבע רקע</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">צבע הרקע כאשר מופעל</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">צבע הרקע כאשר נלחץ</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">צבע רקע קדמי</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">צבע רקע קדמי (אלטרנטיבי)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">בחר צבע</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">מקלדת</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">מקש</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">מקש enter</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">מקש shift</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">ביד אחת</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">כפתור יד אחת</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">שורה חכמה</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">כפתור שורה חכמה</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">צבע ראשי</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">צבע ראשי (כהה)</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">צבע הדגשה</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>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">אופן תצוגה</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">מצב יד אחת</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">כבה</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">מצב ליד ימין</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">מצב לשמאליים</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">גובה המקלדת</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">קצר במיוחד</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">קצר</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">רגיל</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">גבוה</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">גבוה במיוחד</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">מותאם אישית</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">גובה מקלדת מותאם אישית</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">לחיצת מקש</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">שמע בעת לחיצה על מקש</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">השמע צליל בעת לחיצה על מקש</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">הפעל רטט בעת לחיצה על מקש</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">חווית הקלדה</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">הצעות</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] הצג הצעות בעת הקלדה</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">תיקונים</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">שימוש אוטומטי באותיות גדולות</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">מחוות</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">ללא פעולה</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">מחק מילה נוכחית</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">הסתר מקשים</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">הזז סמן למעלה</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">הזז סמן למטה</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">הזז סמן שמאלה</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">הזז סמן ימינה</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Shift</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">החלף לתת-סוג הקודם</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">החלף לתת-סוג הבא</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">החלק למעלה</string>
|
||||
<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__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>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">קצר מאוד</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">קצר</string>
|
||||
<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="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>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">אודות</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">רשיונות קוד פתוח</string>
|
||||
<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>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">הגדרות</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">הקודם</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">ביטול</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">הבא</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">סיים</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">אישור</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">ברוכים הבאים!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">כדי להתחיל את ההתקנה, לחץ על <i>הבא</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">אפשר את FlorisBoard</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">הפוך את FlorisBoard לברירת המחדל</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">החלף מקלדת</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">ההתקנה הושלמה!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">העתקה ללוח העריכה</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">סגור</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard הפסיק לעבוד…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">לחץ להצגת פרטי השגיאה</string>
|
||||
</resources>
|
||||
11
app/src/main/res/values-hr/strings.xml
Normal file
11
app/src/main/res/values-hr/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
222
app/src/main/res/values-hu/strings.xml
Normal file
222
app/src/main/res/values-hu/strings.xml
Normal file
@@ -0,0 +1,222 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Szünet</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Várakozás</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Hárompontos ikon. Ha látható, azt jelzi, hogy több betű használható, ha hosszabb ideig megnyomja.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Egykezes mód bezárása.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Billentyűzet balra helyezése.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Billentyűzet jobbra helyezése.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emojik</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Emotikonok</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Mosolyok & érzelmek</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Emberek & test</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Állatok & természet</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Étel & ital</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Utazás & helyek</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Tevékenységek</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Tárgyak</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Szimbólumok</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Zászlók</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Gyors művelet váltás. Ha megnyomja a gombot, váltson a szójavaslatok és a gyors művelet gombok között.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Kilépés a szövegszerkesztő panelből.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Kapcsolja be az egykezes mód állapotát.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Beállítások megnyitása.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Váltás szövegszerkesztő panelre.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Váltás média bemeneti nézetre.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Beállítások</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">További beállítások</string>
|
||||
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Segítség & visszajelzés</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Kezdés</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Billentyűzet</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Gépelés</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Téma</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gesztusok</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Alapértelmezett</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Rendszer alapértelmezett</string>
|
||||
<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ő, mint egy beviteli módszer a bemenetvá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ódké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ánízó funkciók. Ha bármilyen hibát talál, vagy javaslatot szeretne tenni, kérjük, nézze meg a GitHub repo-ját, majd tegyen egy kérdé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 & 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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Altípus hozzáadása</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Alkamaz</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Mégse</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Törlés</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Altípus szerkesztése</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Terület</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Billentyűzetkiosztás</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Ez az altípus már létezik!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Billentyűzet téma</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Nem meghatározott</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Téma</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Egyéni (%s alapján)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Kiválasztott téma:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Elérhető témák:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Nyíl jobbra</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Háttérszín</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Aktív háttérszín</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Megnyomott háttérszín</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Előtérszín</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Előtérszín (alternatív)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Előtérszín (caps lock)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Szín kiválasztása</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Ablak & rendszer</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Billentyűzet</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Billentyű</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Enter billentyű</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Felugró billentyű</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Shift billentyű</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Média kontextus</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Egykezes</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Egykezes gomb</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Okossáv</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Okossáv-gomb</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Elsődleges szín</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Alkalmazás a fő média lapon ripple and selection highlight</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Elsődleges szín (sötét)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Jelenleg nem használt, a jövőbeli megvalósításra fenntartva</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Kiemelés színe</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Alkalmazott emoji tab ripple</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Navigációs sáv színe</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">A navigációs sáv háttere.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Navigációs sáv sötét előtér</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Állítsa BE-re sötét, KI-re pedig világos előtérnél.</string>
|
||||
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Billentyűzet beállítások</string>
|
||||
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Billentyűk</string>
|
||||
<string name="pref__keyboard__number_row__label" comment="Preference title">Számsor</string>
|
||||
<string name="pref__keyboard__number_row__summary" comment="Preference summary">Számsor megjelenítése a karakterelrendezés felett</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">Betűméret szorzó (álló)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Betűméret szorzó (fekvő)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Elrendezés</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Egykezes mód</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Ki</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Jobbkezes mód</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Balkezes mód</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Billentyűzet magassága</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Nagyon alacsony</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Alacsony</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Közép-alacsony</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normál</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Közép-magas</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Magas</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Nagyon magas</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Egyéni</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Egyedi billentyűzet magasság értéke</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Alsó eltolás (ívelt képernyőkhöz)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Gombnyomás</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Hang gombnyomáskor</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Gombnyomás hangereje</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Rezgés gombnyomásra</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Rezgés erőssége gombnyomásra</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Felugró láthatósága</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Felugró megjelenítése gombnyomáskor</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Hosszú gombnyomás késleltetése</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Gépelési élmény</string>
|
||||
<string name="pref__smartbar__enabled__label" comment="Preference title">Okossáv engedélyezése</string>
|
||||
<string name="pref__smartbar__enabled__summary" comment="Preference summary">A billentyűzet tetején fog megjelenni</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Javaslatok</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] A javaslatok megjelenítése gépelés közben</string>
|
||||
<string name="pref__suggestion__enabled__summary" comment="Preference summary">A számsorban fog megjelenni</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Vágólap tartalom javaslatok</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">A vágólap tartalmának beillesztése, ha korábban ki lett másolva</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] Javaslatok következő szóra</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Használja az előző szavakat a javaslatok generálásához</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Javítások</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Automatikus nagybetű</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Kezdje nagybetűvel a szavakat a bemeneti környezet alapján</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Caps lock állapot megjegyzése</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Caps lock marad, ha mozog egy másik szövegmezőbe</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Dupla szóköz: pont</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Ha kétszer megérinti a szóközt, beszúr egy pontot, amelyet egy szóköz követ</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Gesztusok & csúsztatott gépelés</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Csúsztatott gépelés</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] Csúsztatott gépelés engedélyezése</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Írjon be egy szót úgy, hogy ujját a betűin keresztül csúsztatja</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Nyomvonal megjelenítése</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Minden szó után eltűnik</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gesztusok</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Nincs művelet</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Karakterek pontos törlése</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">A jelenlegi szó törlése</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Szavak pontos törlése</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Billentyűzet elrejtése</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Kurzor felfelé mozgatása</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Kurzor lefelé mozgatása</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Kurzor balra mozgatása</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Kurzor jobbra mozgatása</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Shift</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Váltás az előző altípusra</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Váltás a következő altípusra</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Felhúzás</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Lehúzás</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Balra húzás</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Jobbra húzás</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Szóköz balra húzás</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Szóköz jobbra húzás</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Törlés gomb balra húzás</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Húzás sebesség küszöb</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Nagyon lassú</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Lassú</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normál</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Gyors</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Nagyon gyors</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Húzás távolság küszöb</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Nagyon rövid</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Rövid</string>
|
||||
<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="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Beállítások Téma</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>
|
||||
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Alkalmazás megjelenítése a kezdőképernyőn</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">Névjegy</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">A FlorisBoard alkalmazás ikonja</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Nyílt forráskódú licencek</string>
|
||||
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Adatvédelmi Irányelvek</string>
|
||||
<string name="about__view_source_code" comment="Label of View source code button in About">Forráskód</string>
|
||||
<string name="about__license__title" comment="Title of Open-source licenses dialog">Nyílt forráskódú licencek</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Beállítás</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Előző</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Mégse</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Következő</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Befejezés</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">OK</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Üdvözöljük!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Köszönjük, hogy kipróbálta FlorisBoard-ot! Mielőtt elkezdené használni, meg kell tennünk a szokásos dolgokat, engedélyeznünk kell a rendszerbeállításokban, be kell állítanunk a kívánt nyelvet/elrendezést stb.... de ne aggódjon a telepítő varázsló végigvezeti önt ezen!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">A FlorisBoard teljes mértékben tiszteletben tartja az Ön személyes adatait, és nem gyűjt felhasználói adatokat. További információkért látogassa meg:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">A FlorisBoard forráskódja bárki számára nyilvánosan elérhető, így könnyen áttekintheti, hogy mit csinál a FlorisBoard a háttérben. Nézze meg a tároló linkjét lejjebb.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Még egy utolsó dolog a beállítás megkezdése előtt - ha bármilyen hibával/összeomlással/problémával találkozik a FlorisBoard alkalmazásban, vagy ha egy funkciót szeretne kérni - menjen át az alább linkelt GitHub tárolóba, és nyújtson be egy hibajelentést. Ez segít javítani a felhasználói élményt!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">A beállítás megkezdéséhez kattintson a <i>Következő</i> gombra.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">FlorisBoard engedélyezése</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">Az Android megköveteli, hogy minden egyéni billentyűzetet manuálisan engedélyezzen, mielőtt használná. Kattintson az alábbi gombra a <i>Nyelv & bemenet</i> beállításokhoz, majd jelölje be a \'<i>FlorisBoard</i> \'-ot.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">A FlorisBoard sikeresen engedélyezve lett. A folytatáshoz kattintson a <i>Következő</i> gombra!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Nyelv & bemenet beállítások megnyitása</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">FlorisBoard alapértelmezetté tétele</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">FlorisBoard most már engedélyezve van a rendszerben. Ahhoz, hogy aktívan használja, váltson a FlorisBoard-ra annak kiválasztásával azt a bemenet választó párbeszédablakban!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">Sikeresen átváltotta az alapértelmezett billentyűzetet a Florisboardra!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Billentyűzet váltása</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">A beállítás kész!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">FlorisBoard hibajelentés</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Elnézést a kellemetlenségért, de a FlorisBoard váratlan hiba miatt összeomlott.\n\nIf ezt a hibát be szeretné jelenteni, kattintson a \"Másolás a vágólapra\", majd a \"Hibajelentés megnyitása\" gombra. Töltse ki a hibajelentést, majd illessze be a naplót. Ez segít abban, hogy a FlorisBoard mindenki számára jobb és stabilabb legyen. Köszönöm!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Másolás a vágólapra</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Hibajelentési űrlap megnyitása (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Bezárás</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">FlorisBoard hibajelentések</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">A FlorisBoard leállt…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Érintse meg a hiba részleteinek megtekintéséhez</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">Úgy tűnik, hogy a FlorisBoard többször leállt…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Visszalépés az előző billentyűzethez, hogy megakadályozza a végtelen összeomlást. Érintse meg a hiba részleteinek megtekintéséhez</string>
|
||||
</resources>
|
||||
@@ -1,123 +1,217 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause">Pausa</string>
|
||||
<string name="key__phone_wait">Attendi</string>
|
||||
<string name="key_popup__threedots_alt">Icona a tre puntini.Se visibile, indica che è possibile utilizzare più lettere se premuto a lungo.</string>
|
||||
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Pausa</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Attendi</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Icona a tre puntini.Se visibile, indica che è possibile utilizzare più lettere se premuto a lungo.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Chiudi modalità mano singola.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Muovi tastiera a sinistra.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Muovi tastiera a destra.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis">Emojis</string>
|
||||
<string name="media__tab__emoticons">Emoticons</string>
|
||||
<string name="media__tab__kaomoji">Kaomoji</string>
|
||||
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emoji</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Emoticons</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion">Smileys & Emotions</string>
|
||||
<string name="emoji__category__people_body">Persone & Corpo</string>
|
||||
<string name="emoji__category__animals_nature">Animali & Natura</string>
|
||||
<string name="emoji__category__food_drink">Cibo & Bevande</string>
|
||||
<string name="emoji__category__travel_places">Viaggi & Luoghi</string>
|
||||
<string name="emoji__category__activities">Attività</string>
|
||||
<string name="emoji__category__objects">Oggetti</string>
|
||||
<string name="emoji__category__symbols">Simboli</string>
|
||||
<string name="emoji__category__flags">Bandiere</string>
|
||||
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Faccine & Emoticons</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Persone & Corpo</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Animali & Natura</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Cibo & Bevande</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Viaggi & Luoghi</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Attività</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Oggetti</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Simboli</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Bandiere</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt">Attiva / disattiva azione rapida. Se premuto, alterna i suggerimenti di parole ed i pulsanti di azione rapida.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode">Attiva / disattiva la modalità a una mano.</string>
|
||||
<string name="smartbar__quick_action__open_settings">Apri Impostazioni.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context">Passa alla visualizzazione dei media.</string>
|
||||
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Attiva / disattiva azione rapida. Se premuto, alterna i suggerimenti di parole ed i pulsanti di azione rapida.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Pannello di modifica del testo.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Attiva / disattiva la modalità a una mano.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Apri Impostazioni.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Vai a pannello di modifica del testo.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Passa alla visualizzazione dei media.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title">Impostazioni</string>
|
||||
<string name="settings__menu">Altre opzioni</string>
|
||||
<string name="settings__menu_about">Informazioni su</string>
|
||||
<string name="settings__menu_help">Aiuto & feedback</string>
|
||||
<string name="settings__navigation__home">Home</string>
|
||||
<string name="settings__navigation__keyboard">Tastiera</string>
|
||||
<string name="settings__navigation__typing">Digitazione</string>
|
||||
<string name="settings__navigation__theme">Tema</string>
|
||||
<string name="settings__navigation__gestures">Gesti</string>
|
||||
|
||||
<string name="settings__home__title">Benvenuto in %s</string>
|
||||
<string name="settings__home__ime_not_enabled">FlorisBoard non è abilitato nel sistema e quindi non sarà disponibile come metodo di immissione.Clicca quì per risolvere questo problema.</string>
|
||||
<string name="settings__home__ime_not_selected">FlorisBoard non è la tastiera predefinita. Clicca quì per risolvere questo problema.</string>
|
||||
<string name="settings__home__contribute">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 al repo su GitHub e segnalate un problema. Questo aiuta a rendere FlorisBoard migliore. Grazie!</string>
|
||||
|
||||
<string name="settings__localization__title">Lingue & Layout della tastiera</string>
|
||||
<string name="settings__localization__subtype_no_subtypes_configured_warning">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">Aggiungi</string>
|
||||
<string name="settings__localization__subtype_add_title">Aggiungi stile input</string>
|
||||
<string name="settings__localization__subtype_apply">Applica</string>
|
||||
<string name="settings__localization__subtype_cancel">Annulla</string>
|
||||
<string name="settings__localization__subtype_delete">Elimina</string>
|
||||
<string name="settings__localization__subtype_edit_title">Modifica stile di input</string>
|
||||
<string name="settings__localization__subtype_locale">Locale</string>
|
||||
<string name="settings__localization__subtype_layout">Layout della tastiera</string>
|
||||
<string name="settings__localization__subtype_error_already_exists">Questo stile di input esiste già !</string>
|
||||
|
||||
<string name="settings__theme__title">Tema tastiera</string>
|
||||
<string name="pref__theme__name__label">Tema tastiera</string>
|
||||
|
||||
<string name="settings__keyboard__title">Tastiera preferenze</string>
|
||||
<string name="pref__keyboard__group_layout__label">Layout</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label">Modalità ad una mano</string>
|
||||
<string name="pref__keyboard__height_factor__label">Altezza tastiera</string>
|
||||
<string name="pref__keyboard__group_keypress__label">Pressione tasti</string>
|
||||
<string name="pref__keyboard__sound_enabled__label">Suono pressione tasti</string>
|
||||
<string name="pref__keyboard__sound_volume__label">Volume del suono alla pressione dei tasti</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label">Vibrazione alla pressione dei tasti</string>
|
||||
<string name="pref__keyboard__vibration_strength__label">Intensità della vibrazione alla pressione dei tasti</string>
|
||||
<string name="pref__keyboard__popup_visible__label">Visibilità Popup</string>
|
||||
<string name="pref__keyboard__popup_visible__summary">Mostra popup quando si preme un tasto</string>
|
||||
<string name="pref__keyboard__long_press_delay__label">Ritardo lunga pressione tasti</string>
|
||||
|
||||
<string name="settings__typing__title">Esperienza di digitazione</string>
|
||||
<string name="pref__suggestion__title">Suggerimenti</string>
|
||||
<string name="pref__suggestion__enabled__label">Visualizza suggerimenti mentre digiti</string>
|
||||
<string name="pref__suggestion__enabled__summary">Verrà visualizzato nella parte superiore della tastiera</string>
|
||||
<string name="pref__suggestion__use_pref_words__label">Suggerimenti per la parola successiva</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary">Utilizzare le parole precedenti per generare suggerimenti</string>
|
||||
<string name="pref__correction__title">Correzioni</string>
|
||||
<string name="pref__correction__double_space_period__label">Doppio tocco barra spaziatrice</string>
|
||||
<string name="pref__correction__double_space_period__summary">Doppio tocco su barra spaziatrice per mettere il punto (.) seguito da uno spazio</string>
|
||||
|
||||
<string name="settings__gestures__title">Gesti & Digitazione a scorrimento</string>
|
||||
|
||||
<string name="settings__advanced__title">Avanzate</string>
|
||||
<string name="pref__advanced__settings_theme__label">Impostazioni tema</string>
|
||||
<string name="pref__advanced__show_app_icon__label">Mostra icona nel launcher</string>
|
||||
|
||||
<string name="settings__title" comment="Title of Settings">Impostazioni</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Altre opzioni</string>
|
||||
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Aiuto & feedback</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Home</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Tastiera</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Digitazione</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Tema</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gesti</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Predefinito</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Predefinito di sistema</string>
|
||||
<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 questo 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 al repo su GitHub e segnalate 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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Aggiungi stile input</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Applica</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Annulla</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Elimina</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Modifica stile di input</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Localizzazione</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Layout della tastiera</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Questo stile di input esiste già !</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Tema tastiera</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Sconosciuto</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Tema</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Personalizzato (basato su %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Seleziona tema:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Temi disponibili:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Freccia a destra</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Colore di sfondo</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Colore di sfondo quando attivo</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Colore di sfondo quando premuto</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Colore di primo piano</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Colore di primo piano (alternativo)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Colore di primo piano (maiuscolo)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Seleziona un colore</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Finestra & Sistema</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Tastiera</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Tasto</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Inserisci tasto</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Popup tasto</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Tasto Shift</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Contesto multimediale</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Una mano</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Pulsante una mano</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Smartbar</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Pulsante smartbar</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Colore primario</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Applicato alla tab principale e alla selezione</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Colore primario (scuro)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Attualmente non utilizzato, riservato per implementazioni future</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Colore di accento</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Applicato alla tab delle emoji</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Colore della barra di navigazione</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">Il colore di sfondo della barra di navigazione.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Colore scuro di primo piano della barra di navigazione</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Imposta a ON per un colore di primo piano scuro e OFF per uno chiaro.</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__font_size_multiplier_portrait__label" comment="Preference title">Moltiplicatore della dimensione del testo (ritratto)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Moltiplicatore della dimensione del testo (panorama)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Layout</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Modalità ad una mano</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Off</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Modalità destrimano</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Modalità mancino</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Altezza tastiera</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Cortissimo</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Corto</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Medio-bassa</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normale</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Medio-alta</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Alta</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Altissima</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Personalizzato</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Valore Altezza tastiera personalizzata</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Offset dal basso (per schermi curvi)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Pressione tasti</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Suono pressione tasti</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Volume del suono alla pressione dei tasti</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Vibrazione alla pressione dei tasti</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Intensità della vibrazione alla pressione dei tasti</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Visibilità Popup</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Mostra popup quando si preme un tasto</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Ritardo lunga pressione tasti</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Esperienza di digitazione</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Suggerimenti</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">Visualizza suggerimenti mentre digiti</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Suggerimenti sui contenuti degli appunti</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Suggerisci contenuti degli appunti copiati in precedenza da incollare</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">Suggerimenti per la parola successiva</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Utilizzare le parole precedenti per generare suggerimenti</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Correzioni</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Auto-maiuscolo</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Rendi maiuscole le parole in base al contesto attuale</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Ricorda lo stato del maiuscolo</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Il maiuscolo rimarrà attivo quando ti sposti ad un altro campo di testo</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Doppio tocco barra spaziatrice</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Doppio tocco su barra spaziatrice per mettere il punto (.) seguito da uno spazio</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Gesti & Digitazione a scorrimento</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Scrittura con swype</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] Abilità scrittura con swype</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Scrivi una parola facendo scivolare il dito sulle lettere che la compongono</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Mostra scia dello swype</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Scomparirà dopo ogni parola</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gesti</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Nessuna azione</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Cancella lettere con precisione</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Cancella la parola attuale</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Cancella parole con precisione</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Nascondi tastiera</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Muovi cursore su</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Muovi cursore giù</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Muovi cursore a sinistra</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Muovi cursore a destra</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Shift</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Vai allo stile di input precedente</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Vai allo stile di input successivo</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Swipe su</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Swipe giù</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Swipe a sinistra</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Swipe a destra</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Swipe a sinistra sulla barra spaziatrice</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Swipe a destra sulla barra spaziatrice</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Swipe a sinistra sul tasto di cancellazione all\'indietro</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Soglia di velocità dello swipe</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Molto lenta</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Lento</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normale</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Veloce</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Molto veloce</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Soglia di distanza dello swipe</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Molto corta</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Corta</string>
|
||||
<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="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>
|
||||
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Mostra icona nel launcher</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title">Informazioni su</string>
|
||||
<string name="about__app_icon_content_description">Icona dell\'app FlorisBoard</string>
|
||||
<string name="about__view_licenses">Licenze open source</string>
|
||||
<string name="about__view_privacy_policy">Norme sulla privacy</string>
|
||||
<string name="about__view_source_code">Codice sorgente</string>
|
||||
|
||||
<string name="about__license__title">Licenze open source</string>
|
||||
|
||||
<string name="about__title" comment="Title of About activity">Informazioni su</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">Icona dell\'app FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Licenze open source</string>
|
||||
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Norme sulla privacy</string>
|
||||
<string name="about__view_source_code" comment="Label of View source code button in About">Codice sorgente</string>
|
||||
<string name="about__license__title" comment="Title of Open-source licenses dialog">Licenze open source</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title">Configurazione</string>
|
||||
<string name="setup__prev_button">Precedente</string>
|
||||
<string name="setup__cancel_button">Annulla</string>
|
||||
<string name="setup__next_button">Avanti</string>
|
||||
<string name="setup__finish_button">Fine</string>
|
||||
<string name="setup__ok_button">OK</string>
|
||||
|
||||
<string name="setup__welcome__title">Benvenuto!</string>
|
||||
<string name="setup__welcome__intro">Grazie per aver provato FlorisBoard! Prima che possiate iniziare ad usarlo, dobbiamo fare le solite cose e abilitarlo nelle impostazioni di sistema, impostare la vostra lingua/ il layout preferito, ecc... Ma non preoccuparti: segui questa procedura guidata </string>
|
||||
<string name="setup__welcome__privacy">[[ TODO: inserisci quì la descrizione della privacy ]]</string>
|
||||
<string name="setup__welcome__trust">Il codice sorgente di FlorisBoard è accessibile pubblicamente a chiunque, quindi puoi facilmente rivedere cosa fa FlorisBoard in background. Controlla il link nel repository in basso.</string>
|
||||
<string name="setup__welcome__contribute">Un\'ultima cosa prima di iniziare l\'installazione - se riscontri errori / arresti anomali / problemi con FlorisBoard o hai una richiesta di funzionalità - vai al repository GitHub collegato di seguito e presenta un problema. Questo aiuta a migliorare l\'esperienza per tutti gli utenti!</string>
|
||||
<string name="setup__welcome__outro">Per avviare l\'installazione, fai clic su <i>AVANTI</i>.</string>
|
||||
|
||||
<string name="setup__enable_ime__title">Abilita FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled">Android richiede che ogni tastiera personalizzata debba essere abilitata manualmente prima di poterla utilizzare. Fai clic sul pulsante in basso per passare a <i>Lingua & Input</i>impostazioni, quindi assicurati di selezionare\'<i>FlorisBoard</i>\'.</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input">Apri lingue & Impostazioni di input</string>
|
||||
<string name="setup__enable_ime__text_after_enabled">FlorisBoard è stato abilitato con successo. Per continuare, fai clic su <i>AVANTI</i>!</string>
|
||||
|
||||
<string name="setup__make_default__title">Rendi FlorisBoard predefinita</string>
|
||||
<string name="setup__make_default__text_before_switch">FlorisBoard è ora abilitato nel tuo sistema. Per usarlo attivamente, passa a FlorisBoard selezionandolo nella finestra di dialogo del selettore di input!</string>
|
||||
<string name="setup__make_default__text_switch_button">Cambia tastiera</string>
|
||||
<string name="setup__make_default__text_after_switch">Hai cambiato con successo la tastiera predefinita su FlorisBoard!</string>
|
||||
|
||||
<string name="setup__finish__title">Installazione terminata!</string>
|
||||
<string name="setup__title" comment="Title of Setup">Configurazione</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Precedente</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Annulla</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Avanti</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Fine</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">OK</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Benvenuto!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Grazie per aver provato FlorisBoard! Prima che possiate iniziare ad usarlo, dobbiamo fare le solite cose e abilitarlo nelle impostazioni di sistema, impostare la vostra lingua/ il layout preferito, ecc… Ma non preoccuparti: segui questa procedura guidata </string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">FlorisBoard rispetta completamente la tua privacy e non colleziona nessun dato dell\'utente. Per maggiori informazioni visita:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">Il codice sorgente di FlorisBoard è accessibile pubblicamente a chiunque, quindi puoi facilmente rivedere cosa fa FlorisBoard in background. Controlla il link nel repository in basso.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Un\'ultima cosa prima di iniziare l\'installazione - se riscontri errori / arresti anomali / problemi con FlorisBoard o hai una richiesta di funzionalità - vai al repository GitHub collegato di seguito e presenta un problema. Questo aiuta a migliorare l\'esperienza per tutti gli utenti!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Per avviare l\'installazione, fai clic su <i>AVANTI</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">Abilita FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">Android richiede che ogni tastiera personalizzata debba essere abilitata manualmente prima di poterla utilizzare. Fai clic sul pulsante in basso per passare a <i>Lingua & Input</i>impostazioni, quindi assicurati di selezionare\'<i>FlorisBoard</i>\'.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">FlorisBoard è stato abilitato con successo. Per continuare, fai clic su <i>AVANTI</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Apri lingue & Impostazioni di input</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">Rendi FlorisBoard predefinita</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">FlorisBoard è ora abilitato nel tuo sistema. Per usarlo attivamente, passa a FlorisBoard selezionandolo nella finestra di dialogo del selettore di input!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">Hai cambiato con successo la tastiera predefinita su FlorisBoard!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Cambia tastiera</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Installazione terminata!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">Segnalazione errore</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Ci dispiace per l\'inconveniente, ma FlorisBoard è crashato a causa di un errore inaspettato.\n\nSe desideri inviare questo errore allora clicca su \"copia negli appunti\", e poi \"apri segnalazione errore\". Compila la segnalazione e incolla il log. Questo ci aiuta a migliorare FlorisBoard e a renderla più stabile per tutti. Grazie!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Copia negli appunti</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Apri modulo di segnalazione bug (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Chiudi</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">Segnalazioni di errore di FlorisBoard</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard ha smesso di funzionare…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Tocca per visualizzare i dettagli dell\'errore</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">FlorisBoard sembra aver ripetutamente smesso di funzionare…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Ripiega alla tastiera precedente per porre fine ai crash ripetuti. Tocca per visualizzare i dettagli dell\'errore</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="inputView_baseHeight">214dp</dimen>
|
||||
<dimen name="smartbar_baseHeight">34dp</dimen>
|
||||
<dimen name="textKeyboardView_baseHeight">184dp</dimen>
|
||||
<dimen name="mediaKeyboardView_baseHeight">@dimen/inputView_baseHeight</dimen>
|
||||
|
||||
<fraction name="inputView_minHeightFraction">45%p</fraction>
|
||||
<fraction name="inputView_maxHeightFraction">46%p</fraction>
|
||||
|
||||
<dimen name="media_tab_paddingH">10dp</dimen>
|
||||
</resources>
|
||||
|
||||
42
app/src/main/res/values-mk/strings.xml
Normal file
42
app/src/main/res/values-mk/strings.xml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Помести ја тастатурата налево.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Помести ја тастатурата надесно.</string>
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Луѓе & Тело</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Животни & Природа</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Храна & Пијалоци</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Патувања & Места</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Активности</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Објекти</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Симболи</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Знамиња</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Отвори подесувања.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Подесувања</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Пoвеќе oпции</string>
|
||||
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Помош & повратни информации</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Дома</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Тастатура</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Тема</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Стандардно</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Системски</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">Добредојдовте во %s</string>
|
||||
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Додади</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Примени</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Откажи</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Избриши</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Локално</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Тема за тастатура</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Неодредено</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Тема</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Прилагоден (заснован на %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Одбери тема:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Достапни теми:</string>
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
217
app/src/main/res/values-nl/strings.xml
Normal file
217
app/src/main/res/values-nl/strings.xml
Normal file
@@ -0,0 +1,217 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Pauzeren</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Wachten</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Driepunts icoon. Indien zichtbaar, geeft aan dat meer letters kunnen worden gebruikt als langer geperst.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Sluit eenhandige modus.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Toetsenbord naar links verplaatsen.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Toetsenbord naar rechts verplaatsen.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emojis</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Smiley</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Smileys & Emoties</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Mensen &; Lichaam</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Dieren & Natuur</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Eten & Drinken</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Reis & plaatsen</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Activiteit</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Object</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Symbool</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Vlaggen</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Snelle actie aan / uit. Indien ingedrukt, schakelt u tussen de woordsuggesties en de snelle actieknoppen.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Tekstbewerkingspaneel afsluiten.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Schakel de toestand van de eenhandige modus.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Open instellingen.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Schakel over op tekstbewerkingspaneel.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Schakel over op media input view.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Instelling</string>
|
||||
<string name="settings__menu" comment="Hint of top-right three-dot icon in Settings">Meer opties</string>
|
||||
<string name="settings__menu_help" comment="Three-dot menu entry for Help and Feedback web link">Help & feedback</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Huis</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Toetsenbord</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Type</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Thema</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gebaar</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Standaard</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Systeem standaard</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">Welkom to %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 invoer picker. 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 steeds in alfa en daarom missen functies. Als u bugs vindt of een suggestie wilt doen, controleer dan de repo op GitHub en dien een probleem in. Dit helpt om FlorisBoard beter te maken. Dank je!</string>
|
||||
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Languages & toetsenbordlay-outs</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 subtypes hebt geconfigureerd. Als een terugval wordt het subtype Engels / QWERTY gebruikt!</string>
|
||||
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Toevoegen</string>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Subtype toevoegen</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Toepassing</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Annuleren</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Verwijderen</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Subtype bewerken</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Landinstelling</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Toetsenbordindeling</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Dit subtype bestaat al!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Toetsenbord thema</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Ongedefinieerd</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Thema</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Aangepast (gebaseerd op %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Geselecteerd thema:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Beschikbare thema \' s:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Pijl rechts</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Achtergrondkleur</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Achtergrondkleur indien actief</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Achtergrondkleur wanneer ingedrukt</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Voorgrondkleur</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Voorgrondkleur (alternatief)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Voorgrondkleur (CapsLock)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Selecteer een kleur</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Venster & Systeem</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Toetsenbord</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Toets</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Entertoets</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Sleutel popup</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Shift</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Mediacontext</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Met één hand</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Knop met één hand</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Smartbar</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Smartbar bewerken</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Hoofdkleur</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Toegepast op de belangrijkste Media tab ripple en selectiemarkering</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Primaire kleur (Donker)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Momenteel niet gebruikt, gereserveerd voor toekomstige implementatie</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Accentkleur</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Toegepast op emoji tab rimpel</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Navigatie balk kleur</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">De achtergrond van de navigatiebalk.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Navigatiebalk donkere voorgrond</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Start op voor donker of uit voor lichte voorgrond.</string>
|
||||
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Toetsenbordvoorkeuren</string>
|
||||
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Toets</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">Lettergrootte multiplier (portret)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Lettergrootte multiplier (landschap)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Lay</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Eenhandige modus</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Van</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Rechtshandige modus</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Linkshandige modus</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Toetsenbordhoogte</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Extra-kort</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Kort</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Midden-kort</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normaal</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Mid Hoog</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Hoog</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Extra Hoog</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Aangepast</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Aangepaste hoogte van toetsenbord</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Onderste offset (voor gebogen schermen)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Toetsaanslag</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Geluid op sleutelpers</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Geluidsvolume op sleutelpers</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Vibreren op toetsdruk</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Trillingssterkte op toetsdruk</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">PopUp Zicht</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Popup tonen als je op een toets drukt</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Lange toetsvertraging indrukken</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Type-ervaring</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Suggestie</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] toon suggesties terwijl u typt</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Suggesties voor de inhoud van het klembord</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Klembordinhoud suggereren om te plakken als eerder gekopieerd</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] Volgende woord suggesties</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Gebruik vorige woorden voor het genereren van suggesties</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Correctie</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Automatische kapitalisatie</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Woorden kapitaliseren op basis van de huidige invoercontext</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Onthoud CapsLock status</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">CapsLock blijft aan bij het verplaatsen naar een ander tekstveld</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Periode met twee spaties</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Twee keer tikken op spatiebar voegt een periode toe gevolgd door een ruimte</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Gebaren & glijden</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Glijdend type</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] glijden inschakelen</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Typ een woord door je vinger door zijn letters te schuiven</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Glijpad tonen</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Zal verdwijnen na elk woord</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gebaar</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Geen actie</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Tekens precies verwijderen</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Huidige woord verwijderen</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Woorden juist verwijderen</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Toetsenbord verbergen</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Cursor naar boven verplaatsen</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Cursor naar beneden verplaatsen</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Cursor naar links verplaatsen</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Cursor rechts verplaatsen</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Shift</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Overschakelen naar het vorige subtype</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Overschakelen naar het volgende subtype</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Veeg omhoog</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Haal naar beneden</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Sla linksaf</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Naar rechts</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Spatiebalk links</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Spatiebalk rechts</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Verwijder sleutel swipe links</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Snelheidsdrempel</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Zeer langzaam</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Langzaam</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normaal</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Snel</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Heel snel</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Drempelwaarde voor Swipe-afstand</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Zeer kort</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Kort</string>
|
||||
<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">Zeer lang</string>
|
||||
<string name="settings__advanced__title" comment="Title of Advanced settings activity">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>
|
||||
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">App-pictogram in starter tonen</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">Over</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">App-pictogram van FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Open source licenties</string>
|
||||
<string name="about__view_privacy_policy" comment="Label of View privacy policy button in About">Privacybeleid</string>
|
||||
<string name="about__view_source_code" comment="Label of View source code button in About">Broncode</string>
|
||||
<string name="about__license__title" comment="Title of Open-source licenses dialog">Open source licenties</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Setup</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Vorige</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Annuleren</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Volgend</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Afwerking</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">OK</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Welkom!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Bedankt voor het uitproberen van FlorisBoard! Voordat u kunt beginnen met het gebruik, moeten we de gebruikelijke dingen te doen en in te schakelen in de systeeminstellingen, het instellen van uw voorkeur taal/lay - out, enz... maar geen zorgen-de setup wizard zal u door dit!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">FlorisBoard respecteert uw privacy volledig en verzamelt geen gebruikersgegevens. Voor meer informatie zie hier:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">De broncode voor FlorisBoard is voor iedereen toegankelijk, zodat u gemakkelijk kunt bekijken wat FlorisBoard doet op de achtergrond. Bekijk de repository link hieronder.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Nog één ding voordat u start met de setup - als u bugs/crashes/problemen tegenkomt met FlorisBoard of als u een feature request - head naar de GitHub repository links hieronder en bestand een probleem. Dit helpt bij het verbeteren van de ervaring voor alle gebruikers!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Om de setup te starten, klikt u op <i>VOLGEND</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">FlorisBoard Inschakelen</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">Android vereist dat elk aangepast toetsenbord handmatig moet worden ingeschakeld voordat u het kunt gebruiken. Klik op de onderstaande knop om naar de <i>Language & Input</i> instellingen te gaan en controleer vervolgens \'<i>FlorisBoard</i>\'.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">FlorisBoard is succesvol ingeschakeld. Om door te gaan klik op <i>Volgende</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Open Language & invoerinstellingen</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">Standaard FlorisBoard maken</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">FlorisBoard is nu ingeschakeld in uw systeem. Om het actief te gebruiken, schakelt u over naar FlorisBoard door het te selecteren in het dialoogvenster in de input-selector!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">Met succes het standaard toetsenbord naar FlorisBoard verwisseld!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Toetsenbord wisselen</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Klaar!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">Foutenrapport FlorisBoard</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Sorry voor het ongemak, maar FlorisBoard is gecrasht door een onverwachte fout.\n\nIf als u deze fout wilt melden, klikt u op \"Kopiëren naar klembord\", dan op de \"open bug report\" knop. Vul het foutenrapport in en plak het logboek. Dit helpt bij het maken van FlorisBoard beter en stabieler voor iedereen. Dank je!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Kopiëren naar klembord</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Bug-rapportformulier openen (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Sluiten</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">Foutenrapporten van FlorisBoard</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard werkt niet meer…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Tap om foutdetails te bekijken</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">FlorisBoard lijkt te stoppen met herhaaldelijk te werken…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Terugvallen op het vorige toetsenbord om oneindige crash loop te stoppen. Tap om foutdetails te bekijken</string>
|
||||
</resources>
|
||||
11
app/src/main/res/values-no/strings.xml
Normal file
11
app/src/main/res/values-no/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
11
app/src/main/res/values-pl/strings.xml
Normal file
11
app/src/main/res/values-pl/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
222
app/src/main/res/values-pt-rBR/strings.xml
Normal file
222
app/src/main/res/values-pt-rBR/strings.xml
Normal file
@@ -0,0 +1,222 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Pausar</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Esperar</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Ícone de três pontos. Se mostrado, indica que mais letras podem ser usadas ao apertar e segurar a tecla.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Fechar o modo uma mão.</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Mover teclado para a esquerda.</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Mover teclado para a direita.</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emojis</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Emoticons</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Sorrisos e Emoções</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Pessoas e Corpo</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Animais e Natureza</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Comida e Bebida</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Viagem e Lugares</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Atividades</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Objetos</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Símbolos</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Bandeiras</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Alternar ação rápida. Se pressionado, alterna entre as sugestões de palavra e os botões de ação rápida.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Sair do painel de edição de texto.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Alternar estado do modo uma mão.</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Abrir configurações.</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Mudar para painel de edição de texto.</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Mudar para visualização de entrada de mídia.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Configurações</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 & feedback</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Início</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Teclado</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Digitação</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Tema</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gestos</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Padrão</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Padrão do sistema</string>
|
||||
<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__localization__title" comment="Title of languages and layout box in the Typing fragment">Idiomas & Formatos do 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>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Adicionar formato de digitação</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Aplicar</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Cancelar</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Excluir</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Editar formato de digitação</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Idioma</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Formato do teclado</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Este formato de digitação já existe!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Tema do teclado</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Indefinido</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference">Tema</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Personalizado (baseado no %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Tema selecionado:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Temas disponíveis:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Seta à direita</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Cor do plano de fundo</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Cor do plano de fundo quando ativa</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Cor do plano fundo quando pressionada</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Cor do primeiro plano</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Cor do primeiro plano (alternativa)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Cor do primeiro plano (caps lock)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Selecionar uma cor</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Janela & Sistema</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Teclado</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Tecla</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Tecla Enter</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Popup da tecla</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Tecla Shift</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Contexto de mídia</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Modo uma mão</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Botões do modo uma mão</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Barra inteligente</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Botão da barra inteligente</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Cor primária</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Aplicado à barra de indicação da aba de mídia principal e destaque de seleção</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Cor primária (escuro)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Atualmente não utilizado, reservado para implementação futura</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Cor de destaque</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Aplicado à barra de indicação da aba emoji</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Cor da barra de navegação</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">O plano de fundo da barra de navegação.</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Barra de navegação escura em primeiro plano</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Ligue para escurecer ou desligue para clarear o primeiro plano.</string>
|
||||
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Preferências do Teclado</string>
|
||||
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Teclas</string>
|
||||
<string name="pref__keyboard__number_row__label" comment="Preference title">Linha de números</string>
|
||||
<string name="pref__keyboard__number_row__summary" comment="Preference summary">Mostrar linha de números em cima do teclado</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">Multiplicador de tamanho da fonte (retrato)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Multiplicador de tamanho da fonte (paisagem)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Layout</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Modo uma mão</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Desligado</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Modo destro</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Modo canhoto</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Altura do teclado</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Muito baixo</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Baixo</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Relativamente baixo</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normal</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Relativamente alto</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Alto</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Muito alto</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Personalizado</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Valor personalizado da altura do teclado</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Deslocamento inferior (para telas curvas)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Pressionar tecla</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Som ao pressionar uma tecla</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Volume do som ao pressionar uma tecla</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Vibrar ao pressionar uma tecla</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Força da vibração ao pressionar uma tecla</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Visibilidade do PopUp</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Mostrar popup quando pressionar uma tecla</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Atraso ao pressionar e segurar uma tecla</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Experiência de digitação</string>
|
||||
<string name="pref__smartbar__enabled__label" comment="Preference title">Ativar barra inteligente</string>
|
||||
<string name="pref__smartbar__enabled__summary" comment="Preference summary">Mostrar na parte superior do teclado</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Sugestões</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] Mostrar sugestões enquanto você digita</string>
|
||||
<string name="pref__suggestion__enabled__summary" comment="Preference summary">Mostrar na barra inteligente</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Sugestões de conteúdo da área de transferência</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Sugerir conteúdo da área de transferência para colar se foi copiado anteriormente</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] Sugestões de próxima palavra</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Usar palavras anteriores para gerar sugestões</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Correções</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Capitalização automática</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Deixar palavras em maiúsculo com base no contexto de entrada atual</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Lembrar do estado do caps lock</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">O caps lock permanecerá ligado ao mudar para outro campo de texto</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Dois espaços para ponto final</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Tocar duas vezes na barra de espaço insere um ponto final seguido por um espaço</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Gestos & Digitação deslizante</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Digitação deslizante</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] Ativar digitação deslizante</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Digitar uma palavra deslizando o dedo através de suas letras</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Mostrar trilha de deslizamento</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">Desaparecerá após cada palavra</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gestos</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Nenhuma ação</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Excluir caracteres com precisão</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Excluir palavra atual</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Excluir palavras com precisão</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Esconder teclado</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Mover cursor para cima</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Mover cursor para baixo</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Mover cursor para esquerda</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Mover cursor para direita</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Shift</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Mudar para formato de digitação anterior</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Mudar para próximo formato de digitação</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Deslizar para cima</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Deslizar para baixo</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Deslizar para esquerda</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Deslizar para direita</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Deslizar barra de espaço para esquerda</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Deslizar barra de espaço para direita</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Deslizar tecla excluir para esquerda</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Limite de velocidade do deslizamento</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Muito lento</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Lento</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normal</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Rápido</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Muito rápido</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Limite de distância do deslizamento</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Muito curta</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Curta</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">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="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__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Mostrar ícone do aplicativo no launcher</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">Sobre</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">Ícone do aplicativo FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Licenças de código aberto</string>
|
||||
<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>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Configurar</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Anterior</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Cancelar</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Próximo</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Concluir</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">OK</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Bem-vindo!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Obrigado por experimentar o FlorisBoard! Antes de começar a usá-lo, temos que fazer as coisas usuais e ativá-lo nas configurações do sistema, configurar seu idioma/formato de digitação preferido, etc… Mas não se preocupe - o assistente de configuração vai guiá-lo através disso!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">O FlorisBoard respeita totalmente sua privacidade e não coleta dados do usuário. Para mais informações acesse:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">O código-fonte do FlorisBoard é acessível publicamente para qualquer pessoa, para que você possa facilmente rever o que o FlorisBoard faz em segundo plano. Confira o link do repositório abaixo.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Uma última coisa antes de iniciar a configuração - se você encontrar alguns bugs/travamentos/problemas com o FlorisBoard ou quiser fazer alguma solicitação de recurso - vá até o repositório do GitHub vinculado abaixo e crie um issue. Isso ajuda a melhorar a experiência de todos os usuários!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Para iniciar a configuração, clique em <i>PRÓXIMO</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">Ativar FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">O Android exige que todo teclado personalizado tenha que ser ativado manualmente antes de usá-lo. Clique no botão abaixo para ir as configurações de <i>Idioma & Entrada</i>, em seguida, certifique-se de ativar o \'<i>FlorisBoard</i>\'.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">FlorisBoard foi ativado com sucesso. Para continuar clique em <i>PRÓXIMO</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Abrir configurações de Idioma & Entrada</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">Selecionar FlorisBoard como padrão</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">O FlorisBoard agora está ativado em seu sistema. Para usá-lo ativamente, selecione o FlorisBoard como teclado padrão na caixa de seleção de teclado!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">O FlorisBoard foi selecionado como teclado padrão com sucesso!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Selecionar teclado</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Configuração concluída!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">Relatório de erro do FlorisBoard</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Desculpe pelo inconveniente, mas o FlorisBoard travou devido a um erro inesperado.\n\nSe deseja reportar esse erro, clique em \"Copiar para a área de transferência\", em seguida, no botão \"Abrir relatório de bug\". Preencha o relatório do bug e cole o registro. Isso ajuda a tornar o FlorisBoard melhor e mais estável para todos. Obrigado!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Copiar para a área de transferência</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Abrir relatório de bug no (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Fechar</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">Relatórios de erros do FlorisBoard</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard parou de funcionar…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Toque para ver os detalhes do erro</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">FlorisBoard parece parar de funcionar repetidamente…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Recuando para o teclado anterior para parar o loop infinito de travamento. Toque para ver os detalhes do erro</string>
|
||||
</resources>
|
||||
222
app/src/main/res/values-pt/strings.xml
Normal file
222
app/src/main/res/values-pt/strings.xml
Normal file
@@ -0,0 +1,222 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Pausa</string>
|
||||
<string name="key__phone_wait" comment="Label for the Wait key in the telephone keyboard layout">Aguarde</string>
|
||||
<string name="key_popup__threedots_alt" comment="Content description for the three-dots icon in a key popup">Ícone 3 pontos. Se mostrado, indica que pode utilizar mais letras com um toque longo.</string>
|
||||
<!-- One-handed strings -->
|
||||
<string name="one_handed__close_btn_content_description" comment="Content description for the one-handed close button">Fechar modo de uma mão</string>
|
||||
<string name="one_handed__move_start_btn_content_description" comment="Content description for the one-handed move to left button">Mover teclado para a esquerda</string>
|
||||
<string name="one_handed__move_end_btn_content_description" comment="Content description for the one-handed move to right button">Mover teclado para a direita</string>
|
||||
<!-- Media strings -->
|
||||
<string name="media__tab__emojis" comment="Tab description for emojis in the media UI">Emojis</string>
|
||||
<string name="media__tab__emoticons" comment="Tab description for emoticons in the media UI">Ícones emotivos</string>
|
||||
<string name="media__tab__kaomoji" comment="Tab description for kaomoji in the media UI">Kaomoji</string>
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Sorrisos e ícones emotivos</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Pessoas e corpos</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Animais e natureza</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Comida e bebida</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Viagens e locais</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Atividades</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Objetos</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Símbolos</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Bandeiras</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Alternar ação rápida. Se premida, alterna entre a sugestão de palavras e os botões de ação rápida.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Sair do painel de edição de texto</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Alterna o estado do modo de uma mão</string>
|
||||
<string name="smartbar__quick_action__open_settings" comment="Content-description for the settings quick action in Smartbar">Abrir definições</string>
|
||||
<string name="smartbar__quick_action__switch_to_editing_context" comment="Content-description for the editing quick action in Smartbar">Trocar para o painel de edição de texto</string>
|
||||
<string name="smartbar__quick_action__switch_to_media_context" comment="Content-description for the media quick action in Smartbar">Mudar para a introdução multimédia</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Definições</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 comentários</string>
|
||||
<string name="settings__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Início</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Teclado</string>
|
||||
<string name="settings__navigation__typing" comment="Long-press hint of bottom nav item Typing in Settings">Digitação</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings"> Tema</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Gestos</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">Padrão</string>
|
||||
<string name="settings__system_default" comment="General string which is used when a preference has the system default value set">Definição do sistema</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">Bem-vindo 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 não está ativo no sistema e não pode ser utilizado como método de introdução no seletor. Toque aqui para resolver esta situação.</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ão está selecionado como método de introdução padrão. Toque aqui para resolver esta situação.</string>
|
||||
<string name="settings__home__contribute" comment="Contributing message shown in Home fragment">Obrigado por testar FlorisBoard. Este projeto ainda está em fase Alfa e, obviamente, algumas funcionalidades não estão disponíveis. Se encontrar erros ou se quiser propor sugestões, aceda ao nosso repositório GitHub. A sua ajuda permite melhorar a aplicação. Obrigado!</string>
|
||||
<string name="settings__localization__title" comment="Title of languages and layout box in the Typing fragment">Idiomas e disposições 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 ainda não configurou quaisquer subtipos. Como recurso será utilizado o subtipo Inglês/QWERTY!</string>
|
||||
<string name="settings__localization__subtype_add" comment="Subtype dialog add button">Adicionar</string>
|
||||
<string name="settings__localization__subtype_add_title" comment="Title of subtype dialog when adding a new subtype">Adicionar subtipo</string>
|
||||
<string name="settings__localization__subtype_apply" comment="Subtype dialog apply button">Aplicar</string>
|
||||
<string name="settings__localization__subtype_cancel" comment="Subtype dialog cancel button">Cancelar</string>
|
||||
<string name="settings__localization__subtype_delete" comment="Subtype dialog delete button">Remover</string>
|
||||
<string name="settings__localization__subtype_edit_title" comment="Title of subtype dialog when editing an existing subtype">Editar subtipo</string>
|
||||
<string name="settings__localization__subtype_locale" comment="Label for locale dropdown in subtype dialog">Configuração regional</string>
|
||||
<string name="settings__localization__subtype_layout" comment="Label for keyboard layout dropdown in subtype dialog">Disposição de teclado</string>
|
||||
<string name="settings__localization__subtype_error_already_exists" comment="Error message shown in subtype dialog when a subtype to add already exists">Este subtipo já existe!</string>
|
||||
<string name="settings__theme__title" comment="Title of the Theme fragment">Tema do teclado</string>
|
||||
<string name="settings__theme__undefined" comment="General string for an undefined preference value">Indefinido</string>
|
||||
<string name="settings__theme__preset_title" comment="Label of the theme preset preference"> Tema</string>
|
||||
<string name="settings__theme__preset_summary" comment="Summary of the theme preset preference">Personalizado (baseado em %s)</string>
|
||||
<string name="settings__theme__preset_dialog_selected_theme" comment="Label of the selected themes list">Tema selecionado:</string>
|
||||
<string name="settings__theme__preset_dialog_available_themes" comment="Label of the available themes list">Temas disponíveis:</string>
|
||||
<string name="settings__theme__preset_dialog_alt_arrow_right" comment="Content description of the theme selection button in theme dialog">Seta direita</string>
|
||||
<string name="settings__theme__background" comment="General label for a background preference">Cor de fundo</string>
|
||||
<string name="settings__theme__background_active" comment="General label for an active background preference">Cor de fundo quando ativo</string>
|
||||
<string name="settings__theme__background_pressed" comment="General label for a pressed background preference">Cor de fundo quando premida</string>
|
||||
<string name="settings__theme__foreground" comment="General label for a foreground preference">Cor principal</string>
|
||||
<string name="settings__theme__foreground_alt" comment="General label for an alternate foreground preference">Cor principal (alternativa)</string>
|
||||
<string name="settings__theme__foreground_capslock" comment="General label for a capslock foreground preference">Cor principal (CapsLock)</string>
|
||||
<string name="settings__theme__dialog_title" comment="Title of the color selection dialog for a single theme preference">Selecione uma cor</string>
|
||||
<string name="settings__theme__group_window" comment="Theme group label">Janela e sistema</string>
|
||||
<string name="settings__theme__group_keyboard" comment="Theme group label">Teclado</string>
|
||||
<string name="settings__theme__group_key" comment="Theme group label">Tecla</string>
|
||||
<string name="settings__theme__group_key_enter" comment="Theme group label">Tecla Enter</string>
|
||||
<string name="settings__theme__group_key_popup" comment="Theme group label">Ampliação de teclas</string>
|
||||
<string name="settings__theme__group_key_shift" comment="Theme group label">Tecla Shift</string>
|
||||
<string name="settings__theme__group_media" comment="Theme group label">Contexto multimédia</string>
|
||||
<string name="settings__theme__group_one_handed" comment="Theme group label">Uma mão</string>
|
||||
<string name="settings__theme__group_one_handed_button" comment="Theme group label">Botão do modo uma mão</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Barra inteligente</string>
|
||||
<string name="settings__theme__group_smartbar_button" comment="Theme group label">Botão da barra inteligente</string>
|
||||
<string name="pref__theme__colorPrimary_title" comment="Title of Color primary theme preference">Cor primária</string>
|
||||
<string name="pref__theme__colorPrimary_summary" comment="Summary of Color primary theme preference">Aplicada ao separador multimédia e ao destaque de seleção</string>
|
||||
<string name="pref__theme__colorPrimaryDark_title" comment="Title of Color primary dark theme preference">Cor primária (escura)</string>
|
||||
<string name="pref__theme__colorPrimaryDark_summary" comment="Summary of Color primary dark theme preference">Opção reservada para implementações futuras</string>
|
||||
<string name="pref__theme__colorAccent_title" comment="Title of Color accent theme preference">Cor de destaque</string>
|
||||
<string name="pref__theme__colorAccent_summary" comment="Summary of Color accent theme preference">Aplicada ao separador de emojis</string>
|
||||
<string name="pref__theme__navBarColor_title" comment="Title of Nav bar color theme preference">Cor da barra de navegação</string>
|
||||
<string name="pref__theme__navBarColor_summary" comment="Summary of Nav bar color theme preference">A cor de fundo da barra de navegação</string>
|
||||
<string name="pref__theme__navBarIsLight_title" comment="Title of Nav bar is light theme preference">Botões da barra de navegação escura</string>
|
||||
<string name="pref__theme__navBarIsLight_summary" comment="Summary of Nav bar is light theme preference">Ative para usar a cor escura ou desative para cor clara.</string>
|
||||
<string name="settings__keyboard__title" comment="Title of Keyboard preferences fragment">Preferências do teclado</string>
|
||||
<string name="pref__keyboard__group_keys__label" comment="Preference group title">Teclas</string>
|
||||
<string name="pref__keyboard__number_row__label" comment="Preference title">Linha de números</string>
|
||||
<string name="pref__keyboard__number_row__summary" comment="Preference summary">Mostrar linha de números em cima do teclado</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_portrait__label" comment="Preference title">Multiplicador do tipo de letra (vertical)</string>
|
||||
<string name="pref__keyboard__font_size_multiplier_landscape__label" comment="Preference title">Multiplicador do tipo de letra (horizontal)</string>
|
||||
<string name="pref__keyboard__group_layout__label" comment="Preference group title">Disposição</string>
|
||||
<string name="pref__keyboard__one_handed_mode__label" comment="Preference value">Modo de uma mão</string>
|
||||
<string name="pref__keyboard__one_handed_mode__off" comment="Preference value">Desligado</string>
|
||||
<string name="pref__keyboard__one_handed_mode__right" comment="Preference value">Modo destro</string>
|
||||
<string name="pref__keyboard__one_handed_mode__left" comment="Preference value">Modo esquerdino</string>
|
||||
<string name="pref__keyboard__height_factor__label" comment="Preference title">Altura do teclado</string>
|
||||
<string name="pref__keyboard__height_factor__extra_short" comment="Preference value">Mínima</string>
|
||||
<string name="pref__keyboard__height_factor__short" comment="Preference value">Muito pequena</string>
|
||||
<string name="pref__keyboard__height_factor__mid_short" comment="Preference value">Pequena</string>
|
||||
<string name="pref__keyboard__height_factor__normal" comment="Preference value">Normal</string>
|
||||
<string name="pref__keyboard__height_factor__mid_tall" comment="Preference value">Grande</string>
|
||||
<string name="pref__keyboard__height_factor__tall" comment="Preference value">Muito grande</string>
|
||||
<string name="pref__keyboard__height_factor__extra_tall" comment="Preference value">Enorme</string>
|
||||
<string name="pref__keyboard__height_factor__custom" comment="Preference value">Personalizada</string>
|
||||
<string name="pref__keyboard__height_factor_custom__label" comment="Preference title">Valor para a altura do teclado</string>
|
||||
<string name="pref__keyboard__bottom_offset__label" comment="Preference title">Distância desde a margem inferior (ecrãs curvos)</string>
|
||||
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Pressão de teclas</string>
|
||||
<string name="pref__keyboard__sound_enabled__label" comment="Preference title">Som ao premir a tecla</string>
|
||||
<string name="pref__keyboard__sound_volume__label" comment="Preference title">Volume do som ao premir a tecla</string>
|
||||
<string name="pref__keyboard__vibration_enabled__label" comment="Preference title">Vibrar ao premir a tecla</string>
|
||||
<string name="pref__keyboard__vibration_strength__label" comment="Preference title">Intensidade de vibração ao premir a tecla</string>
|
||||
<string name="pref__keyboard__popup_visible__label" comment="Preference title">Destaque de teclas</string>
|
||||
<string name="pref__keyboard__popup_visible__summary" comment="Preference summary">Ampliar caracteres ao premir uma tecla</string>
|
||||
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Atraso para a pressão longa de teclas</string>
|
||||
<string name="settings__typing__title" comment="Title of Typing experience fragment">Experiência de digitação</string>
|
||||
<string name="pref__smartbar__enabled__label" comment="Preference title">Ativar barra inteligente</string>
|
||||
<string name="pref__smartbar__enabled__summary" comment="Preference summary">Mostrar na parte superior do teclado</string>
|
||||
<string name="pref__suggestion__title" comment="Preference group title">Sugestões</string>
|
||||
<string name="pref__suggestion__enabled__label" comment="Preference title">[NYI] Mostrar sugestões ao escrever</string>
|
||||
<string name="pref__suggestion__enabled__summary" comment="Preference summary">Mostrar na barra inteligente</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__label" comment="Preference title">Sugerir conteúdo da área de transferência</string>
|
||||
<string name="pref__suggestion__suggest_clipboard_content__summary" comment="Preference summary">Sugerir conteúdo existente na área de transferência</string>
|
||||
<string name="pref__suggestion__use_pref_words__label" comment="Preference title">[NYI] Sugerir palavra seguinte</string>
|
||||
<string name="pref__suggestion__use_pref_words__summary" comment="Preference summary">Recorrer às palavras anteriores para sugerir as seguintes</string>
|
||||
<string name="pref__correction__title" comment="Preference group title">Correções</string>
|
||||
<string name="pref__correction__auto_capitalization__label" comment="Preference title">Maiúsculas automáticas</string>
|
||||
<string name="pref__correction__auto_capitalization__summary" comment="Preference summary">Capitalizar as palavras tendo em conta o seu contexto</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__label" comment="Preference title">Memorizar estado CapsLock</string>
|
||||
<string name="pref__correction__remember_caps_lock_state__summary" comment="Preference summary">Manter CapsLock nas movimentações entre campos de texto</string>
|
||||
<string name="pref__correction__double_space_period__label" comment="Preference title">Duplo espaço insere ponto final</string>
|
||||
<string name="pref__correction__double_space_period__summary" comment="Preference summary">Ao tocar 2 vezes na barra de espaços, inserir um ponto final e um espaço</string>
|
||||
<string name="settings__gestures__title" comment="Title of Gestures fragment">Gestos e deslize</string>
|
||||
<string name="pref__glide__title" comment="Preference group title">Digitar ao deslizar</string>
|
||||
<string name="pref__glide__enabled__label" comment="Preference title">[NYI] Ativar escrita por deslize</string>
|
||||
<string name="pref__glide__enabled__summary" comment="Preference summary">Digitar uma palavra deslizando o dedo através das teclas</string>
|
||||
<string name="pref__glide__show_trail__label" comment="Preference title">[NYI] Mostrar rasto de escrita</string>
|
||||
<string name="pref__glide__show_trail__summary" comment="Preference summary">O rasto desparece no final da palavra</string>
|
||||
<string name="pref__gestures__title" comment="Preference group title">Gestos</string>
|
||||
<string name="pref__gestures__swipe_action__no_action" comment="Preference value for swipe action">Sem ação</string>
|
||||
<string name="pref__gestures__swipe_action__delete_characters_precisely" comment="Preference value for swipe action">Remover caracteres com precisão</string>
|
||||
<string name="pref__gestures__swipe_action__delete_word" comment="Preference value for swipe action">Remover palavra atual</string>
|
||||
<string name="pref__gestures__swipe_action__delete_words_precisely" comment="Preference value for swipe action">Remover palavras com precisão</string>
|
||||
<string name="pref__gestures__swipe_action__hide_keyboard" comment="Preference value for swipe action">Ocultar teclado</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_up" comment="Preference value for swipe action">Mover cursor para cima</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_down" comment="Preference value for swipe action">Mover cursor para baixo</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_left" comment="Preference value for swipe action">Mover cursor para a esquerda</string>
|
||||
<string name="pref__gestures__swipe_action__move_cursor_right" comment="Preference value for swipe action">Mover cursor para a direita</string>
|
||||
<string name="pref__gestures__swipe_action__shift" comment="Preference value for swipe action">Tecla Shift</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_prev_subtype" comment="Preference value for swipe action">Trocar para o subtipo anterior</string>
|
||||
<string name="pref__gestures__swipe_action__switch_to_next_subtype" comment="Preference value for swipe action">Trocar para o subtipo seguinte</string>
|
||||
<string name="pref__gestures__swipe_up__label" comment="Preference title">Deslizar para cima</string>
|
||||
<string name="pref__gestures__swipe_down__label" comment="Preference title">Deslizar para baixo</string>
|
||||
<string name="pref__gestures__swipe_left__label" comment="Preference title">Deslizar para a esquerda</string>
|
||||
<string name="pref__gestures__swipe_right__label" comment="Preference title">Deslizar para a direita</string>
|
||||
<string name="pref__gestures__space_bar_swipe_left__label" comment="Preference title">Deslizar à esquerda na barra de espaços</string>
|
||||
<string name="pref__gestures__space_bar_swipe_right__label" comment="Preference title">Deslizar à direita na barra de espaços</string>
|
||||
<string name="pref__gestures__delete_key_swipe_left__label" comment="Preference title">Deslizar à esquerda na tecla Delete</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__label" comment="Preference title">Velocidade de deslize</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_slow" comment="Preference value for swipe velocity threshold">Muito lenta</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__slow" comment="Preference value for swipe velocity threshold">Lenta</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__normal" comment="Preference value for swipe velocity threshold">Normal</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__fast" comment="Preference value for swipe velocity threshold">Rápida</string>
|
||||
<string name="pref__gestures__swipe_velocity_threshold__very_fast" comment="Preference value for swipe velocity threshold">Muito rápida</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__label" comment="Preference title">Distância de deslize</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__very_short" comment="Preference value for swipe distance threshold">Muito curta</string>
|
||||
<string name="pref__gestures__swipe_distance_threshold__short" comment="Preference value for swipe distance threshold">Curta</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">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="pref__advanced__settings_theme__label" comment="Label of Settings theme preference in Advanced">Tema das definições</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__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Mostrar ícone no \'launcher\'</string>
|
||||
<!-- About UI strings -->
|
||||
<string name="about__title" comment="Title of About activity">Acerca</string>
|
||||
<string name="about__app_icon_content_description" comment="Content description of app icon in About">Ícone FlorisBoard</string>
|
||||
<string name="about__view_licenses" comment="Label of View licenses button in About">Licenças Open Source</string>
|
||||
<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 Open Source</string>
|
||||
<!-- Setup UI strings -->
|
||||
<string name="setup__title" comment="Title of Setup">Configuração</string>
|
||||
<string name="setup__prev_button" comment="Label of Previous button in Setup (try to find a short translation due to limited space in UI)">Recuar</string>
|
||||
<string name="setup__cancel_button" comment="Label of Cancel button in Setup">Cancelar</string>
|
||||
<string name="setup__next_button" comment="Label of Next button in Setup (try to find a short translation due to limited space in UI)">Avançar</string>
|
||||
<string name="setup__finish_button" comment="Label of Finish button in Setup">Terminar</string>
|
||||
<string name="setup__ok_button" comment="Label of OK button in Setup">OK</string>
|
||||
<string name="setup__welcome__title" comment="Title of Welcome fragment in Setup">Boas vindas!</string>
|
||||
<string name="setup__welcome__intro" comment="Paragraph in Welcome fragment in Setup">Obrigado por testar FlorisBoard! Antes de poder utilizar a aplicação, tem que a ativar nas definições do sistema, configurar o seu idioma e a disposição do teclado. Mas não se preocupe porque o assistente vai ajudar nestas tarefas!</string>
|
||||
<string name="setup__welcome__privacy" comment="Paragraph in Welcome fragment in Setup">FlorisBoard respeita a sua privacidade e não recolhe quaisquer dados pessoais. Para mais informação, consulte:</string>
|
||||
<string name="setup__welcome__trust" comment="Paragraph in Welcome fragment in Setup">O código-fonte de FlorisBoard está disponível publicamente e você tem todo o direito de o analisar e propor correções. Consulte o repositório na ligação abaixo indicada.</string>
|
||||
<string name="setup__welcome__contribute" comment="Paragraph in Welcome fragment in Setup">Mais uma coisa antes de iniciar a configuração - se encontrar erros ou problemas na aplicação ou ainda caso pretenda sugerir alterações ou funcionalidades, aceda ao GitHub a deixe-nos os seus comentários. Desta forma, ajuda-nos a melhorar a aplicação!</string>
|
||||
<string name="setup__welcome__outro" comment="Paragraph in Welcome fragment in Setup">Para iniciar a configuração, toque em <i>Avançar</i>.</string>
|
||||
<string name="setup__enable_ime__title" comment="Title of Enable IME fragment in Setup">Ativar FlorisBoard</string>
|
||||
<string name="setup__enable_ime__text_before_enabled" comment="Description of state in Enable IME fragment before user enabled">O sistema Android necessita que, antes de ser utilizado, qualquer teclado tem que ser ativado nas definições. Toque no botão abaixo para aceder às definições de <i>Idiomas e introdução</i> e assinale <i>FlorisBoard</i>.</string>
|
||||
<string name="setup__enable_ime__text_after_enabled" comment="Description of state in Enable IME fragment after user enabled">O teclado FlorisBoard foi ativado com sucesso. Para continuar, toque em <i>Avançar</i>!</string>
|
||||
<string name="setup__enable_ime__text_button_language_and_input" comment="Label of language and input button in Enable IME fragment">Abrir definições de Idioma e introdução</string>
|
||||
<string name="setup__make_default__title" comment="Title of Make IME default fragment in Setup">Utilizar FlorisBoard como teclado padrão</string>
|
||||
<string name="setup__make_default__text_before_switch" comment="Description of state in Make IME default fragment before user switched">O teclado FloriBoard está agora ativado. Para o utilizar, selecione FlorisBoard na caixa de diálogo!</string>
|
||||
<string name="setup__make_default__text_after_switch" comment="Description of state in Make IME default fragment after user switched">FlorisBoard foi definido como o teclado padrão do sistema!</string>
|
||||
<string name="setup__make_default__text_switch_button" comment="Label of switch button in Make IME default fragment">Trocar de teclado</string>
|
||||
<string name="setup__finish__title" comment="Title of Setup finished fragment in Setup">Configuração terminada!</string>
|
||||
<!-- Crash Dialog strings -->
|
||||
<string name="crash_dialog__title" comment="Title of crash dialog">Relatório de erros FlorisBoard</string>
|
||||
<string name="crash_dialog__description" comment="Description of crash dialog">Pedimos desculpa por esta situação mas FlorisBoard encerrou em virtude de um erro inesperado.\n\nSe quiser reportar este erro, toque em \"Copiar para a área de transferência\" e depois no botão \"Abrir relatório de erro\". Preencha o relatório e cole o registo. Desta forma, ajuda a melhorar a aplicação para todos os que a quiserem usar. Obrigado!</string>
|
||||
<string name="crash_dialog__copy_to_clipboard" comment="Label of Copy to clipboard button in crash dialog">Copiar para a área de transferência</string>
|
||||
<string name="crash_dialog__open_bug_report_form" comment="Label of Open bug report button in crash dialog">Abrir formulário de erros (github.com)</string>
|
||||
<string name="crash_dialog__close" comment="Label of Close button in crash dialog">Fechar</string>
|
||||
<string name="crash_notification_channel__title" comment="Title of crash notification channel">Relatórios de erros FlorisBoard</string>
|
||||
<string name="crash_once_notification__title" comment="Title of the notification for a single crash">FlorisBoard parou de funcionar…</string>
|
||||
<string name="crash_once_notification__body" comment="Body of the notification for a single crash">Toque para ver os detalhes do erro</string>
|
||||
<string name="crash_multiple_notification__title" comment="Title of the notification for consecutive crashes">Parece que FlorisBoard não está a funcionar muito bem…</string>
|
||||
<string name="crash_multiple_notification__body" comment="Body of the notification for consecutive crashes">Vamos ativar o teclado usado anteriormente para parar este ciclo. Toque para ver os detalhes do erro.</string>
|
||||
</resources>
|
||||
33
app/src/main/res/values-ru/strings.xml
Normal file
33
app/src/main/res/values-ru/strings.xml
Normal file
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="key__phone_pause" comment="Label for the Pause key in the telephone keyboard layout">Пауза</string>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Смайлы & Эмоции</string>
|
||||
<string name="emoji__category__people_body" comment="Emoji category name">Люди & Тело</string>
|
||||
<string name="emoji__category__animals_nature" comment="Emoji category name">Животные & Природа</string>
|
||||
<string name="emoji__category__food_drink" comment="Emoji category name">Еда & Напитки</string>
|
||||
<string name="emoji__category__travel_places" comment="Emoji category name">Путешествия & Места</string>
|
||||
<string name="emoji__category__activities" comment="Emoji category name">Действия</string>
|
||||
<string name="emoji__category__objects" comment="Emoji category name">Объекты</string>
|
||||
<string name="emoji__category__symbols" comment="Emoji category name">Символы</string>
|
||||
<string name="emoji__category__flags" comment="Emoji category name">Флаги</string>
|
||||
<!-- Smartbar strings -->
|
||||
<string name="smartbar__quick_action_toggle__alt" comment="Content description for the quick action toggle button in Smartbar">Переключатель быстрого действия. При нажатии переключает между предложениями слов и кнопками быстрого действия.</string>
|
||||
<string name="smartbar__quick_action__exit_editing" comment="Content-description for the exit editing layout button in Smartbar">Закрыть панель редактирования текста.</string>
|
||||
<string name="smartbar__quick_action__one_handed_mode" comment="Content-description for the one-handed quick action in Smartbar">Переключить одноручный режим.</string>
|
||||
<!-- Settings UI strings -->
|
||||
<string name="settings__title" comment="Title of Settings">Настройки</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__navigation__home" comment="Long-press hint of bottom nav item Home in Settings">Главная</string>
|
||||
<string name="settings__navigation__keyboard" comment="Long-press hint of bottom nav item Keyboard in Settings">Клавиатура</string>
|
||||
<string name="settings__navigation__theme" comment="Long-press hint of bottom nav item Theme in Settings">Тема</string>
|
||||
<string name="settings__navigation__gestures" comment="Long-press hint of bottom nav item Gestures in Settings">Жесты</string>
|
||||
<string name="settings__default" comment="General string which is used when a preference has the default value set">По умолчанию</string>
|
||||
<string name="settings__home__title" comment="Title of the Home fragment">Добро пожаловать в %s</string>
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
11
app/src/main/res/values-sk/strings.xml
Normal file
11
app/src/main/res/values-sk/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
11
app/src/main/res/values-sl/strings.xml
Normal file
11
app/src/main/res/values-sl/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
11
app/src/main/res/values-sr/strings.xml
Normal file
11
app/src/main/res/values-sr/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
11
app/src/main/res/values-sv/strings.xml
Normal file
11
app/src/main/res/values-sv/strings.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- One-handed strings -->
|
||||
<!-- Media strings -->
|
||||
<!-- Emoji strings -->
|
||||
<!-- Smartbar strings -->
|
||||
<!-- Settings UI strings -->
|
||||
<!-- About UI strings -->
|
||||
<!-- Setup UI strings -->
|
||||
<!-- Crash Dialog strings -->
|
||||
</resources>
|
||||
5
app/src/main/res/values-sw600dp-land/dimens.xml
Normal file
5
app/src/main/res/values-sw600dp-land/dimens.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<fraction name="inputView_minHeightFraction">40%p</fraction>
|
||||
<fraction name="inputView_maxHeightFraction">46%p</fraction>
|
||||
</resources>
|
||||
5
app/src/main/res/values-sw600dp/dimens.xml
Normal file
5
app/src/main/res/values-sw600dp/dimens.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<fraction name="inputView_minHeightFraction">35%p</fraction>
|
||||
<fraction name="inputView_maxHeightFraction">46%p</fraction>
|
||||
</resources>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user