Compare commits

...

18 Commits

Author SHA1 Message Date
Jules Aguillon
deb611a0d2 Release 1.29.0 (41) 2024-07-15 00:21:59 +02:00
solokot
29f03d0e96 Update Russian translation (#702) 2024-07-14 16:55:34 +02:00
Jules Aguillon
4629410230 Fix unintended layout used for unsupported languages
The arabic layout was used as the default on devices where all the
installed languages are not supported by the keyboard. This is not
intended.
This is probably caused by 'getCurrentInputMethodSubtype' returning the
first layout in the list of disabled subtypes in alphabetical or
language tag order.
Re-ordering the subtypes in method.xml had no effect.

Setting 'overridesImplicitlyEnabledSubtype' in method.xml has no
measured effect.
2024-07-14 16:15:18 +02:00
Jules Aguillon
b9526d918d Fix crash when using a different script layout
This might happen when using a layout of a different script than the
installed languages.
2024-07-14 15:52:24 +02:00
Mehmet Ali
db3b021bfc Update Turkish Translations (#699) 2024-07-13 11:16:06 +02:00
Spike
3862f4d6ba doc: Re-add text for better overview (#697) 2024-07-10 22:47:58 +02:00
Edgars
555ede0fee Add missing Latvian translations (#698) 2024-07-09 19:36:05 +02:00
Spike
7b90294b57 Clerical edits related to locale_extra_keys (#696)
* Post-edit on Metadata

① Tell reader exactly what to type to disable locale_extra_keys, as with prev. bullet
② Values should be quoted
③ Rephrase one passive

* locale_extra_keys obviates 2nd example under modmap
2024-07-08 22:45:11 +02:00
Spike
69881e75c7 Update Spanish translations (#695) 2024-07-08 00:17:16 +02:00
Chasm Solacer
533e22ab4f Update Polish translation (#691) 2024-07-07 14:21:35 +02:00
Sergiy Stupar
46c86a05bd Update Ukrainian translation (#692) 2024-07-07 14:21:03 +02:00
Validbit
e053d4b20c Update Czech strings.xml (#693) 2024-07-07 14:20:13 +02:00
polyctena
c1e19a21d0 Update values-de/strings.xml (#694) 2024-07-07 14:19:33 +02:00
Jules Aguillon
3164215879 Add locale_extra_keys keyboard attribute
This attribute can be used to disable adding the extra keys from
method.xml.
2024-07-06 23:09:51 +02:00
Jules Aguillon
99367a9ec6 Update French translations 2024-07-06 22:42:56 +02:00
TadaCZE
cd0f61da74 Add support for Android 12+ dynamic colors (#647) 2024-07-06 22:32:01 +02:00
Jules Aguillon
ce57b5a4a2 Make the emoji and clipboard bottom rows consistent 2024-07-06 22:19:34 +02:00
Jules Aguillon
bf3b9c374e Clipboard pane (#681)
This adds the clipboard pane, which allows to save an arbitrary number of
clipboards and to paste them later. The key can be disabled in settings.

Checking the "Recently copied text" checkbox will cause the keyboard to keep a
temporary history of copied text. This history can only contain 3 elements
which expire after 5 minutes.
If this is unchecked, no history is collected.

History entries can be pinned into the persisted list of pins.
2024-07-06 22:16:37 +02:00
50 changed files with 906 additions and 101 deletions

Binary file not shown.

View File

@@ -10,8 +10,8 @@ android {
applicationId "juloo.keyboard2" applicationId "juloo.keyboard2"
minSdk 11 minSdk 11
targetSdkVersion 34 targetSdkVersion 34
versionCode 40 versionCode 41
versionName "1.28.0" versionName "1.29.0"
} }
sourceSets { sourceSets {

View File

@@ -63,7 +63,7 @@ Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {
0 warnings 0 warnings
# latn_bone # latn_bone
Layout includes some ASCII punctuation but not all, missing: $ Layout includes some ASCII punctuation but not all, missing: $
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_greekmath, loc voice_typing, switch_backward Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_clipboard, loc switch_greekmath, loc voice_typing, switch_backward
2 warnings 2 warnings
# latn_colemak # latn_colemak
Some keys contain whitespaces, unexpected: ́ Some keys contain whitespaces, unexpected: ́
@@ -71,7 +71,8 @@ Some keys contain whitespaces, unexpected: ́
# latn_dvorak # latn_dvorak
0 warnings 0 warnings
# latn_neo2 # latn_neo2
0 warnings Layout redefines the bottom row but some important keys are missing, missing: loc switch_clipboard
1 warnings
# latn_qwerty_br # latn_qwerty_br
0 warnings 0 warnings
# latn_qwerty_cz # latn_qwerty_cz

View File

@@ -6,7 +6,8 @@ warning_count = 0
KNOWN_NOT_LAYOUT = set([ KNOWN_NOT_LAYOUT = set([
"number_row", "numpad", "pin", "number_row", "numpad", "pin",
"bottom_row", "settings", "method", "bottom_row", "settings", "method",
"greekmath", "numeric", "emoji_bottom_row" ]) "greekmath", "numeric", "emoji_bottom_row",
"clipboard_bottom_row" ])
def warn(msg): def warn(msg):
global warning_count global warning_count

View File

@@ -38,7 +38,8 @@ The `<keyboard>`...`</keyboard>` pair follows the declaration tag and encloses t
* `name`: The name of the keyboard. The name you specify will appear in the Settings menu. If not present, the layout will just appear as “Custom layout”. * `name`: The name of the keyboard. The name you specify will appear in the Settings menu. If not present, the layout will just appear as “Custom layout”.
* `script`: The (main) writing system that the keyboard supports. The possible values are `arabic`, `armenian`, `bengali`, `cyrillic`, `devanagari`, `gujarati`, `hangul`, `hebrew`, `latin`, `persian`, `shavian`, and `urdu`. It defaults to `latin`. * `script`: The (main) writing system that the keyboard supports. The possible values are `arabic`, `armenian`, `bengali`, `cyrillic`, `devanagari`, `gujarati`, `hangul`, `hebrew`, `latin`, `persian`, `shavian`, and `urdu`. It defaults to `latin`.
* `numpad_script`: The script to use for the numpad. This is useful for scripts where a different, non-ASCII set of numerals is used, like Devanagari and Arabic. It defaults to the same as `script`. * `numpad_script`: The script to use for the numpad. This is useful for scripts where a different, non-ASCII set of numerals is used, like Devanagari and Arabic. It defaults to the same as `script`.
* `bottom_row`: Whether or not to show the common bottom row. It accepts `true` or `false`, and defaults to `true`. If your custom layout defines the bottom row, then specify `bottom_row=false` to disable the built-in bottom row. * `bottom_row`: Whether or not to show the common bottom row. It accepts `true` or `false`, and defaults to `true`. If your custom layout defines the bottom row, then specify `bottom_row="false"` to disable the built-in bottom row.
* `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`.
## Row ## Row
The `<row>`...`</row>` pair encloses one row on the keyboard. It has only one optional property: The `<row>`...`</row>` pair encloses one row on the keyboard. It has only one optional property:
@@ -98,11 +99,9 @@ Normally, a key's width is 1.0 unit. Unexpected Keyboard occupies the full width
* `indication`: An optional extra legend to show under the main label. For example, `<key key0="2" indication="ABC" />` displays ABC at the bottom of the 2 key, as on a pinpad or some telephones. If the key also defines a downward swipe with `s` or `key8`, the legends overlap. * `indication`: An optional extra legend to show under the main label. For example, `<key key0="2" indication="ABC" />` displays ABC at the bottom of the 2 key, as on a pinpad or some telephones. If the key also defines a downward swipe with `s` or `key8`, the legends overlap.
### Possible key values ### Possible key values
Built-in strings that assign a special function to a key are described in [this page](Possible-key-values.md). For example, `se="copy"` means a southeasterly swipe produces the Copy key. If a key value does not match any of the built-in strings, it outputs that text _verbatim_. For example, `key0="a"` simply outputs the letter a.
The possible key values are described in [this page](Possible-key-values.md). In a layout, a key value can also start with the `loc` prefix. These are place-holders; the tap or swipe does nothing unless enabled through the "Add keys to keyboard" option in the Settings menu, or implicitly enabled by the language the device is set to use. For example, `ne="loc accent_aigu"` says that a northeast swipe produces the acute accent combinatorial key—if enabled.
In a layout, a key value can also start with the `loc` prefix. These are place-holders, the tap or swipe does nothing unless enabled through the "Add keys to keyboard" option in the Settings menu, or implicitly enabled by the language the device is set to use.
For example, `ne="loc accent_aigu"` says that a northeast swipe produces the acute accent combinatorial key—if enabled.
## Modmap ## Modmap
The `<modmap>`...`</modmap>` pair encloses custom mappings for modifier keys. The modmap is placed inside the `<keyboard>`...`</keyboard>` pair, but outside any row. A layout can have at most one modmap. The `<modmap>`...`</modmap>` pair encloses custom mappings for modifier keys. The modmap is placed inside the `<keyboard>`...`</keyboard>` pair, but outside any row. A layout can have at most one modmap.
@@ -117,20 +116,12 @@ There can be as many of these tags inside `<modmap>` as needed.
The clockwise circle and the round-trip gestures are affected by both Shift and Fn modmaps. The Shift mappings are used first and if that did not modify the key, the Fn mappings are used instead. The clockwise circle and the round-trip gestures are affected by both Shift and Fn modmaps. The Shift mappings are used first and if that did not modify the key, the Fn mappings are used instead.
### Examples ### Example
Turkish keyboards use the Latin alphabet, but when "i" is shifted, it should produce "İ". This is achieved with the following modmap: Turkish keyboards use the Latin alphabet, but when "i" is shifted, it should produce "İ". This is achieved with the following modmap:
<modmap> <modmap>
<shift a="i" b="İ" /> <shift a="i" b="İ" />
</modmap> </modmap>
② By default, `Fn`+`e` produces the € character. This can be inhibited with the following modmap, which maps the modified `e` key to itself:
<modmap>
<fn a="e" b="e" />
</modmap>
These two examples are each shown in a modmap, for completeness. However, a layout can have at most one modmap, containing all the desired `<shift>` and `<fn>` tags.
## Portrait vs. landscape ## Portrait vs. landscape
Unexpected Keyboard remembers *separately* which layout has last been used in portrait and landscape orientation. So you may have one custom layout for portrait orientation, but another custom layout for landscape orientation, and Unexpected Keyboard will switch between them without your intervention. Unexpected Keyboard remembers *separately* which layout has last been used in portrait and landscape orientation. So you may have one custom layout for portrait orientation, but another custom layout for landscape orientation, and Unexpected Keyboard will switch between them without your intervention.

View File

@@ -0,0 +1,8 @@
Clipboard pane
New Monet theme
Improvements to custom layouts
Options to disable key repeat and the circle gesture
Options to disable the Tab and Esc keys
Many thanks to the contributors: @alotbsol555 @ChasmSolacer @eandersons @polyctena @Sestowner @solokot @Spike-from-NH @TadaCZE @V6lhost @Validbit

View File

@@ -0,0 +1 @@
<!-- drawable/file_send.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M14,2H6C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M12.54,19.37V17.37H8.54V15.38H12.54V13.38L15.54,16.38L12.54,19.37M13,9V3.5L18.5,9H13Z" /></vector>

View File

@@ -0,0 +1 @@
<!-- drawable/bookmark_plus.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M17,3A2,2 0 0,1 19,5V21L12,18L5,21V5C5,3.89 5.9,3 7,3H17M11,7V9H9V11H11V13H13V11H15V9H13V7H11Z" /></vector>

View File

@@ -0,0 +1 @@
<!-- drawable/delete.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z" /></vector>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:id="@+id/clipboard_entry_text" style="@style/clipboardEntry"/>
<LinearLayout style="@style/clipboardEntryButtons">
<View android:id="@+id/clipboard_entry_paste" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_paste"/>
<View android:id="@+id/clipboard_entry_addpin" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_save"/>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="?attr/colorKeyboard" android:hardwareAccelerated="false">
<ScrollView android:layout_width="fill_parent" android:layout_height="@dimen/clipboard_view_height">
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content">
<juloo.keyboard2.ClipboardHistoryCheckBox android:text="@string/clipboard_history_heading" style="@style/clipboardHeading" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
<juloo.keyboard2.ClipboardHistoryView android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="?attr/clipboard_divider_color" android:dividerHeight="?attr/clipboard_divider_height"/>
<TextView android:text="@string/clipboard_pin_heading" style="@style/clipboardHeading" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
<juloo.keyboard2.ClipboardPinView android:id="@+id/clipboard_pin_view" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="?attr/clipboard_divider_color" android:dividerHeight="?attr/clipboard_divider_height"/>
</LinearLayout>
</ScrollView>
<juloo.keyboard2.Keyboard2View layout="@xml/clipboard_bottom_row" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?attr/colorKeyboard"/>
</LinearLayout>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:id="@+id/clipboard_pin_text" style="@style/clipboardEntry" android:maxLines="3"/>
<LinearLayout style="@style/clipboardEntryButtons">
<View android:id="@+id/clipboard_pin_paste" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_paste"/>
<View android:id="@+id/clipboard_pin_remove" style="@style/clipboardEntryButton" android:background="@drawable/ic_delete"/>
</LinearLayout>
</LinearLayout>

View File

@@ -38,9 +38,9 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="pref_category_typing">Psaní</string> <string name="pref_category_typing">Psaní</string>
<string name="pref_swipe_dist_title">Vzdálenost posunutí prstem</string> <string name="pref_swipe_dist_title">Vzdálenost posunutí prstem</string>
<string name="pref_swipe_dist_summary">Jak daleko je třeba posunout prst pro zadání znaku/znaménka v rohu klávey (%s)</string> <string name="pref_swipe_dist_summary">Jak daleko je třeba posunout prst pro zadání znaku/znaménka v rohu klávey (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_long_timeout_title">Doba pro aktivaci dlouhého podržení</string>
<string name="pref_long_interval_title">Interval opakování znaků</string> <string name="pref_long_interval_title">Interval opakování znaků</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_keyrepeat_enabled">Opakování kláves při držení</string>
<string name="pref_lock_double_tap_title">Dvojklik pro aktivaci Capslock(u)</string> <string name="pref_lock_double_tap_title">Dvojklik pro aktivaci Capslock(u)</string>
<string name="pref_lock_double_tap_summary">Umožňuje zamknout Shift dvojklikem, namísto podržení</string> <string name="pref_lock_double_tap_summary">Umožňuje zamknout Shift dvojklikem, namísto podržení</string>
<string name="pref_category_behavior">Chování</string> <string name="pref_category_behavior">Chování</string>
@@ -68,6 +68,9 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="pref_theme_e_epaper">ePapír</string> <string name="pref_theme_e_epaper">ePapír</string>
<string name="pref_theme_e_desert">Poušťě</string> <string name="pref_theme_e_desert">Poušťě</string>
<string name="pref_theme_e_jungle">Džungle</string> <string name="pref_theme_e_jungle">Džungle</string>
<string name="pref_theme_e_monet">Monet (dle systému)</string>
<string name="pref_theme_e_monetlight">Monet (Světlý)</string>
<string name="pref_theme_e_monetdark">Monet (Tmavý)</string>
<string name="pref_swipe_dist_e_very_short">Velmi krátká</string> <string name="pref_swipe_dist_e_very_short">Velmi krátká</string>
<string name="pref_swipe_dist_e_short">Krátká</string> <string name="pref_swipe_dist_e_short">Krátká</string>
<string name="pref_swipe_dist_e_default">Běžná</string> <string name="pref_swipe_dist_e_default">Běžná</string>
@@ -78,11 +81,11 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="pref_border_config_title">Přizpůsobit okraje</string> <string name="pref_border_config_title">Přizpůsobit okraje</string>
<string name="pref_border_width_title">Šířka okraje</string> <string name="pref_border_width_title">Šířka okraje</string>
<string name="pref_corners_radius_title">Poloměr okraje</string> <string name="pref_corners_radius_title">Poloměr okraje</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <string name="pref_circle_sensitivity_title">Citlivost kruhového gesta</string>
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <string name="pref_circle_sensitivity_e_high">Vysoká</string>
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <string name="pref_circle_sensitivity_e_medium">Střední</string>
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <string name="pref_circle_sensitivity_e_low">Nízká</string>
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="pref_circle_sensitivity_e_disabled">Deaktivováno</string>
<string name="key_action_next">Další</string> <string name="key_action_next">Další</string>
<string name="key_action_done">Dokončit</string> <string name="key_action_done">Dokončit</string>
<string name="key_action_go">Spustit</string> <string name="key_action_go">Spustit</string>
@@ -116,4 +119,9 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Správce schránky</string>
<string name="clipboard_history_heading">Nedávno kopírovaný text</string>
<string name="clipboard_pin_heading">Připnout</string>
<string name="clipboard_remove_confirm">Odebrat ze schránky?</string>
<string name="clipboard_remove_confirmed">Ano</string>
</resources> </resources>

View File

@@ -38,9 +38,9 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
<string name="pref_category_typing">Tippen</string> <string name="pref_category_typing">Tippen</string>
<string name="pref_swipe_dist_title">Länge der Wischgeste</string> <string name="pref_swipe_dist_title">Länge der Wischgeste</string>
<string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string> <string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_long_timeout_title">Zeitüberschreitung durch langes Drücken</string>
<string name="pref_long_interval_title">Intervall der Tastenwiederholung</string> <string name="pref_long_interval_title">Intervall der Tastenwiederholung</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_keyrepeat_enabled">Tastenwiederholung bei langem Drücken</string>
<string name="pref_lock_double_tap_title">Umschalttaste mit Doppeltippen einrasten</string> <string name="pref_lock_double_tap_title">Umschalttaste mit Doppeltippen einrasten</string>
<string name="pref_lock_double_tap_summary">Anstatt Taste längere Zeit gedrückt zu halten</string> <string name="pref_lock_double_tap_summary">Anstatt Taste längere Zeit gedrückt zu halten</string>
<string name="pref_category_behavior">Verhalten</string> <string name="pref_category_behavior">Verhalten</string>
@@ -68,6 +68,9 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Wüste</string> <string name="pref_theme_e_desert">Wüste</string>
<string name="pref_theme_e_jungle">Dschungel</string> <string name="pref_theme_e_jungle">Dschungel</string>
<string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monetlight">Monet (Hell)</string>
<string name="pref_theme_e_monetdark">Monet (Dunkel)</string>
<string name="pref_swipe_dist_e_very_short">Sehr kurz</string> <string name="pref_swipe_dist_e_very_short">Sehr kurz</string>
<string name="pref_swipe_dist_e_short">Kurz</string> <string name="pref_swipe_dist_e_short">Kurz</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_default">Normal</string>
@@ -116,4 +119,9 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
<string name="key_descr_page_down">Bild ab</string> <string name="key_descr_page_down">Bild ab</string>
<string name="key_descr_home">Pos1</string> <string name="key_descr_home">Pos1</string>
<string name="key_descr_end">Ende</string> <string name="key_descr_end">Ende</string>
<string name="key_descr_clipboard">Clipboard-Manager</string>
<string name="clipboard_history_heading">Zuletzt kopierter Text</string>
<string name="clipboard_pin_heading">Angeheftet</string>
<string name="clipboard_remove_confirm">Aus der Zwischenablage entfernen?</string>
<string name="clipboard_remove_confirmed">Ja</string>
</resources> </resources>

View File

@@ -38,9 +38,9 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="pref_category_typing">Escritura</string> <string name="pref_category_typing">Escritura</string>
<string name="pref_swipe_dist_title">Distancia de deslizamiento</string> <string name="pref_swipe_dist_title">Distancia de deslizamiento</string>
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las teclas (%s)</string> <string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las teclas (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_long_timeout_title">Duración para toque largo</string>
<string name="pref_long_interval_title">Intervalo de repetición de tecla</string> <string name="pref_long_interval_title">Intervalo de repetición de tecla</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_keyrepeat_enabled">Permitir repetición de toque largo</string>
<string name="pref_lock_double_tap_title">Doble toque en Mayús para bloquear las mayúsculas</string> <string name="pref_lock_double_tap_title">Doble toque en Mayús para bloquear las mayúsculas</string>
<string name="pref_lock_double_tap_summary">Se puede bloquear cualquier modificador manteniéndolo presionado</string> <string name="pref_lock_double_tap_summary">Se puede bloquear cualquier modificador manteniéndolo presionado</string>
<string name="pref_category_behavior">Comportamiento</string> <string name="pref_category_behavior">Comportamiento</string>
@@ -68,6 +68,9 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desierto</string> <string name="pref_theme_e_desert">Desierto</string>
<string name="pref_theme_e_jungle">Selva</string> <string name="pref_theme_e_jungle">Selva</string>
<string name="pref_theme_e_monet">Monet (de sistema)</string>
<string name="pref_theme_e_monetlight">Monet (claro)</string>
<string name="pref_theme_e_monetdark">Monet (oscuro)</string>
<string name="pref_swipe_dist_e_very_short">Muy corta</string> <string name="pref_swipe_dist_e_very_short">Muy corta</string>
<string name="pref_swipe_dist_e_short">Corta</string> <string name="pref_swipe_dist_e_short">Corta</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_default">Normal</string>
@@ -78,11 +81,11 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="pref_border_config_title">Bordes personalizados</string> <string name="pref_border_config_title">Bordes personalizados</string>
<string name="pref_border_width_title">Ancho de bordes</string> <string name="pref_border_width_title">Ancho de bordes</string>
<string name="pref_corners_radius_title">Radio de rincones</string> <string name="pref_corners_radius_title">Radio de rincones</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <string name="pref_circle_sensitivity_title">Sensibilidad a gestos circulares</string>
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <string name="pref_circle_sensitivity_e_high">Alta</string>
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <string name="pref_circle_sensitivity_e_medium">Mediana</string>
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <string name="pref_circle_sensitivity_e_low">Baja</string>
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="pref_circle_sensitivity_e_disabled">Apagada</string>
<string name="key_action_next">Siguiente</string> <string name="key_action_next">Siguiente</string>
<string name="key_action_done">Hecho</string> <string name="key_action_done">Hecho</string>
<string name="key_action_go">Ir</string> <string name="key_action_go">Ir</string>
@@ -116,4 +119,9 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
<string name="key_descr_page_down">Re Pág</string> <string name="key_descr_page_down">Re Pág</string>
<string name="key_descr_home">Inicio</string> <string name="key_descr_home">Inicio</string>
<string name="key_descr_end">Fin</string> <string name="key_descr_end">Fin</string>
<string name="key_descr_clipboard">Arreglar portapapeles</string>
<string name="clipboard_history_heading">Textos recién copiados</string>
<string name="clipboard_pin_heading">Pegado</string>
<string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>
<string name="clipboard_remove_confirmed"></string>
</resources> </resources>

View File

@@ -68,6 +68,9 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="pref_theme_e_epaper">ای-پیپر</string> <string name="pref_theme_e_epaper">ای-پیپر</string>
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<string name="pref_swipe_dist_e_very_short">بسیار کوتاه</string> <string name="pref_swipe_dist_e_very_short">بسیار کوتاه</string>
<string name="pref_swipe_dist_e_short">کوتاه</string> <string name="pref_swipe_dist_e_short">کوتاه</string>
<string name="pref_swipe_dist_e_default">عادی</string> <string name="pref_swipe_dist_e_default">عادی</string>
@@ -116,4 +119,9 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="key_descr_page_down">Page Down</string> --> <!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> --> <!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> --> <!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources> </resources>

View File

@@ -38,9 +38,9 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_category_typing">Saisie</string> <string name="pref_category_typing">Saisie</string>
<string name="pref_swipe_dist_title">Distance de swipe</string> <string name="pref_swipe_dist_title">Distance de swipe</string>
<string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string> <string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_long_timeout_title">Delai de l\'appui long</string>
<string name="pref_long_interval_title">Écart entre les répétitions</string> <string name="pref_long_interval_title">Écart entre les répétitions</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_keyrepeat_enabled">Répétition par appui long</string>
<string name="pref_lock_double_tap_title">Appuyer deux fois pour bloquer la majuscule</string> <string name="pref_lock_double_tap_title">Appuyer deux fois pour bloquer la majuscule</string>
<string name="pref_lock_double_tap_summary">Un appui long bloque la majuscule</string> <string name="pref_lock_double_tap_summary">Un appui long bloque la majuscule</string>
<string name="pref_category_behavior">Comportement</string> <string name="pref_category_behavior">Comportement</string>
@@ -48,8 +48,8 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_autocapitalisation_summary">Activer Shift au début des phrases</string> <string name="pref_autocapitalisation_summary">Activer Shift au début des phrases</string>
<string name="pref_switch_input_immediate_title">Changer vers le clavier utilisé en dernier</string> <string name="pref_switch_input_immediate_title">Changer vers le clavier utilisé en dernier</string>
<string name="pref_switch_input_immediate_summary">Comportement de la touche de changement de clavier</string> <string name="pref_switch_input_immediate_summary">Comportement de la touche de changement de clavier</string>
<!-- <string name="pref_vibrate_custom">Custom vibration</string> --> <string name="pref_vibrate_custom">Vibrations personnalisées</string>
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> --> <string name="pref_vibrate_duration_title">Intensité des vibrations</string>
<string name="pref_pin_entry_enabled_title">Clavier PIN</string> <string name="pref_pin_entry_enabled_title">Clavier PIN</string>
<string name="pref_pin_entry_enabled_summary">Lors de la saisie de nombres, de dates et de numéros de téléphone</string> <string name="pref_pin_entry_enabled_summary">Lors de la saisie de nombres, de dates et de numéros de téléphone</string>
<string name="pref_category_style">Style</string> <string name="pref_category_style">Style</string>
@@ -68,6 +68,9 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desert</string> <string name="pref_theme_e_desert">Desert</string>
<string name="pref_theme_e_jungle">Jungle</string> <string name="pref_theme_e_jungle">Jungle</string>
<string name="pref_theme_e_monet">Monet (Système)</string>
<string name="pref_theme_e_monetlight">Monet (Clair)</string>
<string name="pref_theme_e_monetdark">Monet (Sombre)</string>
<string name="pref_swipe_dist_e_very_short">Très courte</string> <string name="pref_swipe_dist_e_very_short">Très courte</string>
<string name="pref_swipe_dist_e_short">Courte</string> <string name="pref_swipe_dist_e_short">Courte</string>
<string name="pref_swipe_dist_e_default">Normale</string> <string name="pref_swipe_dist_e_default">Normale</string>
@@ -75,14 +78,14 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="pref_swipe_dist_e_very_far">Très longue</string> <string name="pref_swipe_dist_e_very_far">Très longue</string>
<string name="pref_key_horizontal_space">Espacement horizontal entre les touches</string> <string name="pref_key_horizontal_space">Espacement horizontal entre les touches</string>
<string name="pref_key_vertical_space">Espacement vertical entre les touches</string> <string name="pref_key_vertical_space">Espacement vertical entre les touches</string>
<!-- <string name="pref_border_config_title">Customize borders</string> --> <string name="pref_border_config_title">Bordures personnalisées</string>
<!-- <string name="pref_border_width_title">Border Width</string> --> <string name="pref_border_width_title">Largeur des bordures</string>
<!-- <string name="pref_corners_radius_title">Corner radius</string> --> <string name="pref_corners_radius_title">Rayon des coins</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <string name="pref_circle_sensitivity_title">Sensibilité du mouvement en cercle</string>
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <string name="pref_circle_sensitivity_e_high">Haute</string>
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <string name="pref_circle_sensitivity_e_medium">Moyenne</string>
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <string name="pref_circle_sensitivity_e_low">Basse</string>
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="pref_circle_sensitivity_e_disabled">Désactivée</string>
<string name="key_action_next">Suiv.</string> <string name="key_action_next">Suiv.</string>
<string name="key_action_done">Fin</string> <string name="key_action_done">Fin</string>
<string name="key_action_go">Aller</string> <string name="key_action_go">Aller</string>
@@ -94,11 +97,11 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="launcher_description">Cette application est un clavier virtuel. Activez-le dans les paramètres système en cliquant sur le bouton ci-dessous.</string> <string name="launcher_description">Cette application est un clavier virtuel. Activez-le dans les paramètres système en cliquant sur le bouton ci-dessous.</string>
<string name="launcher_sourcecode">Cette application est libre et open-source. Lisez le source code et reportez des problèmes sur Github.</string> <string name="launcher_sourcecode">Cette application est libre et open-source. Lisez le source code et reportez des problèmes sur Github.</string>
<string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string> <string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string>
<!-- <string name="launcher_tryhere_hint">Try here</string> --> <string name="launcher_tryhere_hint">Essayer ici</string>
<string name="key_descr_capslock">Verrouillage majuscules</string> <string name="key_descr_capslock">Verrouillage majuscules</string>
<!-- <string name="key_descr_compose">Compose</string> --> <string name="key_descr_compose">Compose</string>
<string name="key_descr_switch_greekmath">Symboles mathématiques</string> <string name="key_descr_switch_greekmath">Symboles mathématiques</string>
<!-- <string name="key_descr_change_method">Switch keyboard</string> --> <string name="key_descr_change_method">Changer de clavier</string>
<string name="key_descr_voice_typing">Saisie vocale</string> <string name="key_descr_voice_typing">Saisie vocale</string>
<string name="key_descr_copy">Copier</string> <string name="key_descr_copy">Copier</string>
<string name="key_descr_paste">Coller</string> <string name="key_descr_paste">Coller</string>
@@ -116,4 +119,9 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
<string name="key_descr_page_down">Page suivante</string> <string name="key_descr_page_down">Page suivante</string>
<string name="key_descr_home">Début</string> <string name="key_descr_home">Début</string>
<string name="key_descr_end">Fin</string> <string name="key_descr_end">Fin</string>
<string name="key_descr_clipboard">Presse-papiers</string>
<string name="clipboard_history_heading">Texte récemment copié</string>
<string name="clipboard_pin_heading">Épinglé</string>
<string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>
<string name="clipboard_remove_confirmed">Oui</string>
</resources> </resources>

View File

@@ -68,6 +68,9 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="pref_theme_e_epaper">ePaper</string> --> <!-- <string name="pref_theme_e_epaper">ePaper</string> -->
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<string name="pref_swipe_dist_e_very_short">Veramente breve</string> <string name="pref_swipe_dist_e_very_short">Veramente breve</string>
<string name="pref_swipe_dist_e_short">Breve</string> <string name="pref_swipe_dist_e_short">Breve</string>
<string name="pref_swipe_dist_e_default">Normale</string> <string name="pref_swipe_dist_e_default">Normale</string>
@@ -116,4 +119,9 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="key_descr_page_down">Page Down</string> --> <!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> --> <!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> --> <!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources> </resources>

View File

@@ -68,6 +68,9 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="pref_theme_e_epaper">ePaper</string> --> <!-- <string name="pref_theme_e_epaper">ePaper</string> -->
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<string name="pref_swipe_dist_e_very_short">매우 짧음</string> <string name="pref_swipe_dist_e_very_short">매우 짧음</string>
<string name="pref_swipe_dist_e_short">짧음</string> <string name="pref_swipe_dist_e_short">짧음</string>
<string name="pref_swipe_dist_e_default">보통</string> <string name="pref_swipe_dist_e_default">보통</string>
@@ -116,4 +119,9 @@ This application contains no ads, doesn't make any network requests and is Open
<!-- <string name="key_descr_page_down">Page Down</string> --> <!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> --> <!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> --> <!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources> </resources>

View File

@@ -38,9 +38,9 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="pref_category_typing">Rakstīšana</string> <string name="pref_category_typing">Rakstīšana</string>
<string name="pref_swipe_dist_title">Pavilkšanas attālums</string> <string name="pref_swipe_dist_title">Pavilkšanas attālums</string>
<string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string> <string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_long_timeout_title">Ilgas piepiešanas noildze</string>
<string name="pref_long_interval_title">Taustiņa atkārtošanās aizture</string> <string name="pref_long_interval_title">Taustiņa atkārtošanās aizture</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_keyrepeat_enabled">Taustiņa atkārtošanās ar ilgu piespiešanu</string>
<string name="pref_lock_double_tap_title">Divkāršs piesitiens burtslēgam</string> <string name="pref_lock_double_tap_title">Divkāršs piesitiens burtslēgam</string>
<string name="pref_lock_double_tap_summary">Tā vietā, lai ilstoši piespiestu pārveidotāju</string> <string name="pref_lock_double_tap_summary">Tā vietā, lai ilstoši piespiestu pārveidotāju</string>
<string name="pref_category_behavior">Uzvedība</string> <string name="pref_category_behavior">Uzvedība</string>
@@ -68,6 +68,9 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="pref_theme_e_epaper">ePapīrs</string> <string name="pref_theme_e_epaper">ePapīrs</string>
<string name="pref_theme_e_desert">Tuksnesis</string> <string name="pref_theme_e_desert">Tuksnesis</string>
<string name="pref_theme_e_jungle">Džungļi</string> <string name="pref_theme_e_jungle">Džungļi</string>
<string name="pref_theme_e_monet">Monē (sistēmas)</string>
<string name="pref_theme_e_monetlight">Monē (gaišs)</string>
<string name="pref_theme_e_monetdark">Monē (tumšs)</string>
<string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string> <string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string>
<string name="pref_swipe_dist_e_short">Tuvs</string> <string name="pref_swipe_dist_e_short">Tuvs</string>
<string name="pref_swipe_dist_e_default">Vidējs</string> <string name="pref_swipe_dist_e_default">Vidējs</string>
@@ -78,11 +81,11 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="pref_border_config_title">Pielāgot apmales</string> <string name="pref_border_config_title">Pielāgot apmales</string>
<string name="pref_border_width_title">Apmales platums</string> <string name="pref_border_width_title">Apmales platums</string>
<string name="pref_corners_radius_title">Stūru rādiuss</string> <string name="pref_corners_radius_title">Stūru rādiuss</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <string name="pref_circle_sensitivity_title">Apļveida kustības jutīgums</string>
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <string name="pref_circle_sensitivity_e_high">Augsts</string>
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <string name="pref_circle_sensitivity_e_medium">Vidējs</string>
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <string name="pref_circle_sensitivity_e_low">Zems</string>
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="pref_circle_sensitivity_e_disabled">Atspējots</string>
<string name="key_action_next">Nākamais</string> <string name="key_action_next">Nākamais</string>
<string name="key_action_done">Darīts</string> <string name="key_action_done">Darīts</string>
<string name="key_action_go">Aiziet</string> <string name="key_action_go">Aiziet</string>
@@ -118,4 +121,9 @@ Tagad lieliski piemērota izmantošanai ikdienā.
<string name="key_descr_page_down">Lejupšķirt</string> <string name="key_descr_page_down">Lejupšķirt</string>
<string name="key_descr_home">Sākums</string> <string name="key_descr_home">Sākums</string>
<string name="key_descr_end">Beigas</string> <string name="key_descr_end">Beigas</string>
<string name="key_descr_clipboard">Starpliktuves pārvaldnieks</string>
<string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
<string name="clipboard_pin_heading">Piesprausts</string>
<string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>
<string name="clipboard_remove_confirmed"></string>
</resources> </resources>

View File

@@ -38,9 +38,9 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="pref_category_typing">Pisanie</string> <string name="pref_category_typing">Pisanie</string>
<string name="pref_swipe_dist_title">Odległość przesuwania</string> <string name="pref_swipe_dist_title">Odległość przesuwania</string>
<string name="pref_swipe_dist_summary">Odległość znaków od rogów klawiszy (%s)</string> <string name="pref_swipe_dist_summary">Odległość znaków od rogów klawiszy (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_long_timeout_title">Opóźnienie przytrzymania klawisza</string>
<string name="pref_long_interval_title">Czas pomiędzy powtórzeniami</string> <string name="pref_long_interval_title">Czas pomiędzy powtórzeniem klawisza</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_keyrepeat_enabled">Powtarzanie klawisza po przytrzymaniu</string>
<string name="pref_lock_double_tap_title">Naciśnij Shift podwójnie, aby włączyć caps lock</string> <string name="pref_lock_double_tap_title">Naciśnij Shift podwójnie, aby włączyć caps lock</string>
<string name="pref_lock_double_tap_summary">Możesz zablokować modyfikator poprzez jego długie naciśnięcie</string> <string name="pref_lock_double_tap_summary">Możesz zablokować modyfikator poprzez jego długie naciśnięcie</string>
<string name="pref_category_behavior">Zachowanie</string> <string name="pref_category_behavior">Zachowanie</string>
@@ -68,6 +68,9 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="pref_theme_e_epaper">e-paper</string> <string name="pref_theme_e_epaper">e-paper</string>
<string name="pref_theme_e_desert">Pustynny</string> <string name="pref_theme_e_desert">Pustynny</string>
<string name="pref_theme_e_jungle">Dżunglowy</string> <string name="pref_theme_e_jungle">Dżunglowy</string>
<string name="pref_theme_e_monet">Monet (Systemowy)</string>
<string name="pref_theme_e_monetlight">Monet (Jasny)</string>
<string name="pref_theme_e_monetdark">Monet (Ciemny)</string>
<string name="pref_swipe_dist_e_very_short">Bardzo mała</string> <string name="pref_swipe_dist_e_very_short">Bardzo mała</string>
<string name="pref_swipe_dist_e_short">Mała</string> <string name="pref_swipe_dist_e_short">Mała</string>
<string name="pref_swipe_dist_e_default">Normalna</string> <string name="pref_swipe_dist_e_default">Normalna</string>
@@ -78,11 +81,11 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="pref_border_config_title">Dostosuj krawędzie</string> <string name="pref_border_config_title">Dostosuj krawędzie</string>
<string name="pref_border_width_title">Grubość krawedzi</string> <string name="pref_border_width_title">Grubość krawedzi</string>
<string name="pref_corners_radius_title">Promień rogów</string> <string name="pref_corners_radius_title">Promień rogów</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <string name="pref_circle_sensitivity_title">Czułość gestu koła</string>
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <string name="pref_circle_sensitivity_e_high">Wysoka</string>
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <string name="pref_circle_sensitivity_e_medium">Średnia</string>
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <string name="pref_circle_sensitivity_e_low">Mała</string>
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="pref_circle_sensitivity_e_disabled">Wyłączona</string>
<string name="key_action_next">Dalej</string> <string name="key_action_next">Dalej</string>
<string name="key_action_done">OK</string> <string name="key_action_done">OK</string>
<string name="key_action_go">Przejdź</string> <string name="key_action_go">Przejdź</string>
@@ -116,4 +119,9 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Zarządzanie schowkiem</string>
<string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
<string name="clipboard_pin_heading">Przypięte</string>
<string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>
<string name="clipboard_remove_confirmed">Tak</string>
</resources> </resources>

View File

@@ -68,6 +68,9 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
<string name="pref_theme_e_epaper">Papel Eletrônico</string> <string name="pref_theme_e_epaper">Papel Eletrônico</string>
<string name="pref_theme_e_desert">Deserto</string> <string name="pref_theme_e_desert">Deserto</string>
<string name="pref_theme_e_jungle">Selva</string> <string name="pref_theme_e_jungle">Selva</string>
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<string name="pref_swipe_dist_e_very_short">Bem curto</string> <string name="pref_swipe_dist_e_very_short">Bem curto</string>
<string name="pref_swipe_dist_e_short">Curto</string> <string name="pref_swipe_dist_e_short">Curto</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_default">Normal</string>
@@ -116,4 +119,9 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources> </resources>

View File

@@ -68,6 +68,9 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_epaper">ePaper</string>
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<string name="pref_swipe_dist_e_very_short">Foarte apropiată</string> <string name="pref_swipe_dist_e_very_short">Foarte apropiată</string>
<string name="pref_swipe_dist_e_short">Apropiată</string> <string name="pref_swipe_dist_e_short">Apropiată</string>
<string name="pref_swipe_dist_e_default">Normală</string> <string name="pref_swipe_dist_e_default">Normală</string>
@@ -116,4 +119,9 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
<!-- <string name="key_descr_page_down">Page Down</string> --> <!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> --> <!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> --> <!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources> </resources>

View File

@@ -68,6 +68,9 @@
<string name="pref_theme_e_epaper">Электронная бумага</string> <string name="pref_theme_e_epaper">Электронная бумага</string>
<string name="pref_theme_e_desert">Пустыня</string> <string name="pref_theme_e_desert">Пустыня</string>
<string name="pref_theme_e_jungle">Джунгли</string> <string name="pref_theme_e_jungle">Джунгли</string>
<string name="pref_theme_e_monet">Моне (системная)</string>
<string name="pref_theme_e_monetlight">Моне (светлая)</string>
<string name="pref_theme_e_monetdark">Моне (темная)</string>
<string name="pref_swipe_dist_e_very_short">Очень короткая</string> <string name="pref_swipe_dist_e_very_short">Очень короткая</string>
<string name="pref_swipe_dist_e_short">Короткая</string> <string name="pref_swipe_dist_e_short">Короткая</string>
<string name="pref_swipe_dist_e_default">Обычная</string> <string name="pref_swipe_dist_e_default">Обычная</string>
@@ -116,4 +119,9 @@
<string name="key_descr_page_down">Страница вниз</string> <string name="key_descr_page_down">Страница вниз</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Менеджер буфера обмена</string>
<string name="clipboard_history_heading">Недавно скопированный текст</string>
<string name="clipboard_pin_heading">Закреплено</string>
<string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>
<string name="clipboard_remove_confirmed">Да</string>
</resources> </resources>

View File

@@ -38,9 +38,9 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="pref_category_typing">Yazma</string> <string name="pref_category_typing">Yazma</string>
<string name="pref_swipe_dist_title">Kaydırma mesafesi</string> <string name="pref_swipe_dist_title">Kaydırma mesafesi</string>
<string name="pref_swipe_dist_summary">Tuşların köşelerinden kaydırma mesafesi (%s)</string> <string name="pref_swipe_dist_summary">Tuşların köşelerinden kaydırma mesafesi (%s)</string>
<!-- <string name="pref_long_timeout_title">Long press timeout</string> --> <string name="pref_long_timeout_title">Uzun basma süresi</string>
<string name="pref_long_interval_title">Tuşların tekrarlama sıklığı</string> <string name="pref_long_interval_title">Tuşların tekrarlama sıklığı</string>
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> --> <string name="pref_keyrepeat_enabled">Uzun basınca tuş tekrarlamaları</string>
<string name="pref_lock_double_tap_title">CapsLock için Shift tuşuna çift bas</string> <string name="pref_lock_double_tap_title">CapsLock için Shift tuşuna çift bas</string>
<string name="pref_lock_double_tap_summary">Uzun basarak CapsLock açılabilir</string> <string name="pref_lock_double_tap_summary">Uzun basarak CapsLock açılabilir</string>
<string name="pref_category_behavior">Klavye davranışı</string> <string name="pref_category_behavior">Klavye davranışı</string>
@@ -68,6 +68,9 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="pref_theme_e_epaper">E-Kağıt</string> <string name="pref_theme_e_epaper">E-Kağıt</string>
<string name="pref_theme_e_desert">Çöl</string> <string name="pref_theme_e_desert">Çöl</string>
<string name="pref_theme_e_jungle">Orman</string> <string name="pref_theme_e_jungle">Orman</string>
<string name="pref_theme_e_monet">Monet (Sisteme uyarla)</string>
<string name="pref_theme_e_monetlight">Monet (Açık)</string>
<string name="pref_theme_e_monetdark">Monet (Koyu)</string>
<string name="pref_swipe_dist_e_very_short">Çok kısa</string> <string name="pref_swipe_dist_e_very_short">Çok kısa</string>
<string name="pref_swipe_dist_e_short">Kısa</string> <string name="pref_swipe_dist_e_short">Kısa</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_default">Normal</string>
@@ -75,14 +78,14 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="pref_swipe_dist_e_very_far">Çok uzun</string> <string name="pref_swipe_dist_e_very_far">Çok uzun</string>
<string name="pref_key_horizontal_space">Tuşlar arasındaki yatay boşluk</string> <string name="pref_key_horizontal_space">Tuşlar arasındaki yatay boşluk</string>
<string name="pref_key_vertical_space">Tuşlar arasındaki dikey boşluk</string> <string name="pref_key_vertical_space">Tuşlar arasındaki dikey boşluk</string>
<!-- <string name="pref_border_config_title">Customize borders</string> --> <string name="pref_border_config_title">Çerçeveyi özelleştir</string>
<!-- <string name="pref_border_width_title">Border Width</string> --> <string name="pref_border_width_title">Çerçeve kalınlığı</string>
<!-- <string name="pref_corners_radius_title">Corner radius</string> --> <string name="pref_corners_radius_title">Kenar yumuşaklığı</string>
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> --> <string name="pref_circle_sensitivity_title">Dairesel hareket hassasiyeti</string>
<!-- <string name="pref_circle_sensitivity_e_high">High</string> --> <string name="pref_circle_sensitivity_e_high">Yüksek</string>
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> --> <string name="pref_circle_sensitivity_e_medium">Orta</string>
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> --> <string name="pref_circle_sensitivity_e_low">Düşük</string>
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> --> <string name="pref_circle_sensitivity_e_disabled">Devre dışı</string>
<string name="key_action_next">Sonraki</string> <string name="key_action_next">Sonraki</string>
<string name="key_action_done">Tamam</string> <string name="key_action_done">Tamam</string>
<string name="key_action_go">ileri</string> <string name="key_action_go">ileri</string>
@@ -94,9 +97,9 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="launcher_description">Bu uygulama bir sanal klavye uygulamasıdır. Aşağıdaki butona basarak sistem ayarlarında etkinleştiriniz.</string> <string name="launcher_description">Bu uygulama bir sanal klavye uygulamasıdır. Aşağıdaki butona basarak sistem ayarlarında etkinleştiriniz.</string>
<string name="launcher_sourcecode">Bu uygulama ücretsiz ve açık kaynaklıdır. Kaynak koduna erişmek veya bir hata raporlamak için GitHub</string> <string name="launcher_sourcecode">Bu uygulama ücretsiz ve açık kaynaklıdır. Kaynak koduna erişmek veya bir hata raporlamak için GitHub</string>
<string name="launcher_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string> <string name="launcher_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string>
<!-- <string name="launcher_tryhere_hint">Try here</string> --> <string name="launcher_tryhere_hint">Burada dene</string>
<string name="key_descr_capslock">CapsLock</string> <string name="key_descr_capslock">CapsLock</string>
<!-- <string name="key_descr_compose">Compose</string> --> <string name="key_descr_compose">Oluştur</string>
<string name="key_descr_switch_greekmath">Greek &amp; math sembolleri</string> <string name="key_descr_switch_greekmath">Greek &amp; math sembolleri</string>
<string name="key_descr_change_method">Klavye değiştir</string> <string name="key_descr_change_method">Klavye değiştir</string>
<string name="key_descr_voice_typing">Sesle yazma</string> <string name="key_descr_voice_typing">Sesle yazma</string>
@@ -116,4 +119,9 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
<string name="key_descr_page_down">Aşağı</string> <string name="key_descr_page_down">Aşağı</string>
<string name="key_descr_home">BAŞ(Sol yön tuşu)</string> <string name="key_descr_home">BAŞ(Sol yön tuşu)</string>
<string name="key_descr_end">SON(Sağ yön tuşu)</string> <string name="key_descr_end">SON(Sağ yön tuşu)</string>
<string name="key_descr_clipboard">Pano</string>
<string name="clipboard_history_heading">Son kopyalanan metin</string>
<string name="clipboard_pin_heading">Sabitlendi</string>
<string name="clipboard_remove_confirm">Bu sabitlemeyi sil</string>
<string name="clipboard_remove_confirmed">Evet</string>
</resources> </resources>

View File

@@ -68,6 +68,9 @@
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Пустеля</string> <string name="pref_theme_e_desert">Пустеля</string>
<string name="pref_theme_e_jungle">Джунглі</string> <string name="pref_theme_e_jungle">Джунглі</string>
<string name="pref_theme_e_monet">Моне (Системна)</string>
<string name="pref_theme_e_monetlight">Моне (Світла)</string>
<string name="pref_theme_e_monetdark">Моне (Темна)</string>
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string> <string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
<string name="pref_swipe_dist_e_short">Коротка</string> <string name="pref_swipe_dist_e_short">Коротка</string>
<string name="pref_swipe_dist_e_default">Звичайна</string> <string name="pref_swipe_dist_e_default">Звичайна</string>
@@ -116,4 +119,9 @@
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Менеджер буфера обміну</string>
<string name="clipboard_history_heading">Нещодавно скопійований текст</string>
<string name="clipboard_pin_heading">Закріплено</string>
<string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>
<string name="clipboard_remove_confirmed">Так</string>
</resources> </resources>

View File

@@ -68,6 +68,9 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_epaper">ePaper</string>
<!-- <string name="pref_theme_e_desert">Desert</string> --> <!-- <string name="pref_theme_e_desert">Desert</string> -->
<!-- <string name="pref_theme_e_jungle">Jungle</string> --> <!-- <string name="pref_theme_e_jungle">Jungle</string> -->
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<string name="pref_swipe_dist_e_very_short">Rất gần</string> <string name="pref_swipe_dist_e_very_short">Rất gần</string>
<string name="pref_swipe_dist_e_short">Gần</string> <string name="pref_swipe_dist_e_short">Gần</string>
<string name="pref_swipe_dist_e_default">Trungbình</string> <string name="pref_swipe_dist_e_default">Trungbình</string>
@@ -116,4 +119,9 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
<!-- <string name="key_descr_page_down">Page Down</string> --> <!-- <string name="key_descr_page_down">Page Down</string> -->
<!-- <string name="key_descr_home">Home</string> --> <!-- <string name="key_descr_home">Home</string> -->
<!-- <string name="key_descr_end">End</string> --> <!-- <string name="key_descr_end">End</string> -->
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources> </resources>

View File

@@ -68,6 +68,9 @@
<string name="pref_theme_e_epaper">白色带边框</string> <string name="pref_theme_e_epaper">白色带边框</string>
<string name="pref_theme_e_desert">沙漠</string> <string name="pref_theme_e_desert">沙漠</string>
<string name="pref_theme_e_jungle">雨林</string> <string name="pref_theme_e_jungle">雨林</string>
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
<string name="pref_swipe_dist_e_very_short">非常短</string> <string name="pref_swipe_dist_e_very_short">非常短</string>
<string name="pref_swipe_dist_e_short"></string> <string name="pref_swipe_dist_e_short"></string>
<string name="pref_swipe_dist_e_default">中(默认)</string> <string name="pref_swipe_dist_e_default">中(默认)</string>
@@ -116,4 +119,9 @@
<string name="key_descr_page_down">下一页</string> <string name="key_descr_page_down">下一页</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
</resources> </resources>

View File

@@ -28,6 +28,9 @@
<item>@string/pref_theme_e_epaper</item> <item>@string/pref_theme_e_epaper</item>
<item>@string/pref_theme_e_desert</item> <item>@string/pref_theme_e_desert</item>
<item>@string/pref_theme_e_jungle</item> <item>@string/pref_theme_e_jungle</item>
<item>@string/pref_theme_e_monet</item>
<item>@string/pref_theme_e_monetlight</item>
<item>@string/pref_theme_e_monetdark</item>
</string-array> </string-array>
<string-array name="pref_theme_values"> <string-array name="pref_theme_values">
<item>system</item> <item>system</item>
@@ -39,6 +42,9 @@
<item>epaper</item> <item>epaper</item>
<item>desert</item> <item>desert</item>
<item>jungle</item> <item>jungle</item>
<item>monet</item>
<item>monetlight</item>
<item>monetdark</item>
</string-array> </string-array>
<string-array name="pref_swipe_dist_entries"> <string-array name="pref_swipe_dist_entries">
<item>@string/pref_swipe_dist_e_very_short</item> <item>@string/pref_swipe_dist_e_very_short</item>

View File

@@ -68,6 +68,9 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="pref_theme_e_epaper">ePaper</string> <string name="pref_theme_e_epaper">ePaper</string>
<string name="pref_theme_e_desert">Desert</string> <string name="pref_theme_e_desert">Desert</string>
<string name="pref_theme_e_jungle">Jungle</string> <string name="pref_theme_e_jungle">Jungle</string>
<string name="pref_theme_e_monet">Monet (System)</string>
<string name="pref_theme_e_monetlight">Monet (Light)</string>
<string name="pref_theme_e_monetdark">Monet (Dark)</string>
<string name="pref_swipe_dist_e_very_short">Very short</string> <string name="pref_swipe_dist_e_very_short">Very short</string>
<string name="pref_swipe_dist_e_short">Short</string> <string name="pref_swipe_dist_e_short">Short</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_default">Normal</string>
@@ -116,4 +119,9 @@ This application contains no ads, doesn't make any network requests and is Open
<string name="key_descr_page_down">Page Down</string> <string name="key_descr_page_down">Page Down</string>
<string name="key_descr_home">Home</string> <string name="key_descr_home">Home</string>
<string name="key_descr_end">End</string> <string name="key_descr_end">End</string>
<string name="key_descr_clipboard">Clipboard manager</string>
<string name="clipboard_history_heading">Recently copied text</string>
<string name="clipboard_pin_heading">Pinned</string>
<string name="clipboard_remove_confirm">Remove this clipboard?</string>
<string name="clipboard_remove_confirmed">Yes</string>
</resources> </resources>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- Emoji pane -->
<style name="emojiTypeButton"> <style name="emojiTypeButton">
<item name="android:padding">1px</item> <item name="android:padding">1px</item>
<item name="android:gravity">center</item> <item name="android:gravity">center</item>
@@ -15,6 +16,39 @@
<item name="android:textSize">@dimen/emoji_text_size</item> <item name="android:textSize">@dimen/emoji_text_size</item>
<item name="android:textColor">?attr/emoji_color</item> <item name="android:textColor">?attr/emoji_color</item>
</style> </style>
<!-- Clipboard pane -->
<style name="clipboardEntry">
<item name="android:layout_weight">1</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginHorizontal">14dp</item>
<item name="android:layout_marginVertical">14dp</item>
<item name="android:textSize">16dp</item>
<item name="android:textColor">?attr/colorLabel</item>
</style>
<style name="clipboardHeading">
<item name="android:layout_marginHorizontal">6dp</item>
<item name="android:layout_marginTop">14dp</item>
<item name="android:layout_marginBottom">0dp</item>
<item name="android:textSize">14dp</item>
<item name="android:fontWeight">700</item>
<item name="android:textColor">?attr/colorSubLabel</item>
</style>
<style name="clipboardEntryButtons">
<item name="android:orientation">horizontal</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center_vertical</item>
<item name="android:layout_marginRight">12dp</item>
</style>
<style name="clipboardEntryButton">
<item name="android:layout_width">24dp</item>
<item name="android:layout_height">24dp</item>
<item name="android:layout_marginHorizontal">2dp</item>
<item name="android:backgroundTint">?attr/colorLabel</item>
<item name="android:backgroundTintMode">src_in</item>
</style>
<!-- Launcher activity -->
<style name="paragraph"> <style name="paragraph">
<item name="android:layout_width">fill_parent</item> <item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>

View File

@@ -23,11 +23,14 @@
<attr name="keyBorderColorTop" format="color"/> <attr name="keyBorderColorTop" format="color"/>
<attr name="keyBorderColorRight" format="color"/> <attr name="keyBorderColorRight" format="color"/>
<attr name="keyBorderColorBottom" format="color"/> <attr name="keyBorderColorBottom" format="color"/>
<!-- Emoji panel --> <!-- Emoji pane -->
<attr name="emoji_button_bg" type="color" format="color"/> <attr name="emoji_button_bg" type="color" format="color"/>
<attr name="emoji_color" type="color" format="color"/> <attr name="emoji_color" type="color" format="color"/>
<attr name="emoji_key_bg" type="color" format="color"/> <attr name="emoji_key_bg" type="color" format="color"/>
<attr name="emoji_key_text" type="color" format="color"/> <attr name="emoji_key_text" type="color" format="color"/>
<!-- Clipboard pane -->
<attr name="clipboard_divider_color" type="color" format="color"/>
<attr name="clipboard_divider_height" format="dimension"/>
<!-- System integration --> <!-- System integration -->
<attr name="navigationBarColor" format="color"/> <attr name="navigationBarColor" format="color"/>
<attr name="windowLightNavigationBar" format="boolean"/> <attr name="windowLightNavigationBar" format="boolean"/>
@@ -43,6 +46,8 @@
<item name="greyedDimming">0.5</item> <item name="greyedDimming">0.5</item>
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item> <item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
<item name="emoji_key_text" type="color">?attr/colorLabel</item> <item name="emoji_key_text" type="color">?attr/colorLabel</item>
<item name="clipboard_divider_color" type="color">?attr/colorKey</item>
<item name="clipboard_divider_height">1px</item>
</style> </style>
<style name="Dark" parent="BaseTheme"> <style name="Dark" parent="BaseTheme">
<item name="android:isLightTheme">false</item> <item name="android:isLightTheme">false</item>
@@ -116,6 +121,7 @@
<item name="colorSubLabel">#333333</item> <item name="colorSubLabel">#333333</item>
<item name="emoji_button_bg">#ffffff</item> <item name="emoji_button_bg">#ffffff</item>
<item name="emoji_color">#000000</item> <item name="emoji_color">#000000</item>
<item name="clipboard_divider_color" type="color">#eeeeee</item>
</style> </style>
<style name="ePaper" parent="BaseTheme"> <style name="ePaper" parent="BaseTheme">
<item name="android:isLightTheme">true</item> <item name="android:isLightTheme">true</item>
@@ -134,6 +140,8 @@
<item name="colorSubLabel">#333333</item> <item name="colorSubLabel">#333333</item>
<item name="emoji_button_bg">#ffffff</item> <item name="emoji_button_bg">#ffffff</item>
<item name="emoji_color">#000000</item> <item name="emoji_color">#000000</item>
<item name="clipboard_divider_color" type="color">#000000</item>
<item name="clipboard_divider_height">2dp</item>
</style> </style>
<style name="Desert" parent="@style/BaseTheme"> <style name="Desert" parent="@style/BaseTheme">
<item name="android:isLightTheme">true</item> <item name="android:isLightTheme">true</item>
@@ -171,4 +179,28 @@
<item name="emoji_button_bg">?colorKeyActivated</item> <item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">#000000</item> <item name="emoji_color">#000000</item>
</style> </style>
<style name="MonetLight" parent="@style/BaseTheme">
<item name="android:isLightTheme">true</item>
<item name="colorKeyboard">@android:color/system_accent1_100</item>
<item name="colorKey">@android:color/system_accent1_0</item>
<item name="colorKeyActivated">@android:color/system_accent1_300</item>
<item name="colorLabel">@android:color/system_accent1_1000</item>
<item name="colorLabelActivated">@android:color/system_accent1_1000</item>
<item name="colorLabelLocked">@android:color/system_accent1_500</item>
<item name="colorSubLabel">@android:color/system_accent1_900</item>
<item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">@android:color/system_accent1_1000</item>
</style>
<style name="MonetDark" parent="@style/BaseTheme">
<item name="android:isLightTheme">false</item>
<item name="colorKeyboard">@android:color/system_accent1_900</item>
<item name="colorKey">@android:color/system_accent1_800</item>
<item name="colorKeyActivated">@android:color/system_accent1_600</item>
<item name="colorLabel">@android:color/system_neutral1_0</item>
<item name="colorLabelActivated">@android:color/system_accent2_300</item>
<item name="colorLabelLocked">@android:color/system_accent2_100</item>
<item name="colorSubLabel">@android:color/system_neutral1_300</item>
<item name="emoji_button_bg">?colorKeyActivated</item>
<item name="emoji_color">@android:color/system_accent1_900</item>
</style>
</resources> </resources>

View File

@@ -4,6 +4,7 @@
<dimen name="key_padding">2dp</dimen> <dimen name="key_padding">2dp</dimen>
<dimen name="emoji_grid_height">250dp</dimen> <dimen name="emoji_grid_height">250dp</dimen>
<dimen name="emoji_text_size">28dp</dimen> <dimen name="emoji_text_size">28dp</dimen>
<dimen name="clipboard_view_height">300dp</dimen>
<dimen name="pref_button_size">28dp</dimen> <dimen name="pref_button_size">28dp</dimen>
<bool name="debug_logs">false</bool> <!-- Will be overwritten automatically by Gradle for the debug build variant --> <bool name="debug_logs">false</bool> <!-- Will be overwritten automatically by Gradle for the debug build variant -->
</resources> </resources>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<row height="0.95"> <row height="0.95">
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/> <key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key3="loc switch_clipboard" key4="switch_numeric"/>
<key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/> <key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/> <key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
<key width="1.1" key0="loc compose" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/> <key width="1.1" key0="loc compose" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- The bottom row used in the clipboard history pane. -->
<keyboard bottom_row="false">
<row height="0.95">
<key key0="switch_back_clipboard"/>
<key width="3" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
<key key0="backspace" key2="delete"/>
<key key0="enter" key2="action"/>
</row>
</keyboard>

View File

@@ -3,8 +3,8 @@
<keyboard bottom_row="false"> <keyboard bottom_row="false">
<row height="0.95"> <row height="0.95">
<key key0="switch_back_emoji"/> <key key0="switch_back_emoji"/>
<key width="4" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/> <key width="3" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
<key key0="backspace"/> <key key0="backspace" key2="delete"/>
<key key0="enter"/> <key key0="enter" key2="action"/>
</row> </row>
</keyboard> </keyboard>

View File

@@ -12,7 +12,7 @@
<subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£@l|€"/> <subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£@l|€"/>
<subtype android:label="%s" android:languageTag="en-CA" android:imeSubtypeLocale="en_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/> <subtype android:label="%s" android:languageTag="en-CA" android:imeSubtypeLocale="en_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£@l"/> <subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£@l"/>
<subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/> <subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us" android:overridesImplicitlyEnabledSubtype="true"/>
<subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_es,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_tilde:ñ@n|accent_grave@f|accent_trema@u|€"/> <subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_es,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_tilde:ñ@n|accent_grave@f|accent_trema@u|€"/>
<subtype android:label="%s" android:languageTag="fa" android:imeSubtypeLocale="fa_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_pc_ir"/> <subtype android:label="%s" android:languageTag="fa" android:imeSubtypeLocale="fa_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_pc_ir"/>
<subtype android:label="%s" android:languageTag="fr-CA" android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:â:ê:ô@f|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@u"/> <subtype android:label="%s" android:languageTag="fr-CA" android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:â:ê:ô@f|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@u"/>

View File

@@ -0,0 +1,22 @@
package juloo.keyboard2;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.CheckBox;
import android.widget.CompoundButton;
final class ClipboardHistoryCheckBox extends CheckBox
implements CompoundButton.OnCheckedChangeListener
{
public ClipboardHistoryCheckBox(Context ctx, AttributeSet attrs)
{
super(ctx, attrs);
setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton _v, boolean isChecked)
{
ClipboardHistoryService.set_history_enabled(isChecked);
}
}

View File

@@ -0,0 +1,180 @@
package juloo.keyboard2;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Build.VERSION;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public final class ClipboardHistoryService
{
/** Start the service on startup and start listening to clipboard changes. */
public static void on_startup(Context ctx, ClipboardPasteCallback cb)
{
get_service(ctx);
_paste_callback = cb;
}
/** Start the service if it hasn't been started before. Returns [null] if the
feature is unsupported. */
public static ClipboardHistoryService get_service(Context ctx)
{
if (VERSION.SDK_INT <= 11)
return null;
if (_service == null)
_service = new ClipboardHistoryService(ctx);
return _service;
}
public static void set_history_enabled(boolean e)
{
if (_service == null)
return;
Config.globalPrefs().edit()
.putBoolean("clipboard_history_enabled", e)
.commit();
if (e)
_service.add_current_clip();
else
_service.clear_history();
}
/** Send the given string to the editor. */
public static void paste(String clip)
{
if (_paste_callback != null)
_paste_callback.paste_from_clipboard_pane(clip);
}
/** The maximum size limits the amount of user data stored in memory but also
gives a sense to the user that the history is not persisted and can be
forgotten as soon as the app stops. */
public static final int MAX_HISTORY_SIZE = 3;
/** Time in ms until history entries expire. */
public static final long HISTORY_TTL_MS = 5 * 60 * 1000;
static ClipboardHistoryService _service = null;
static ClipboardPasteCallback _paste_callback = null;
ClipboardManager _cm;
List<HistoryEntry> _history;
OnClipboardHistoryChange _listener = null;
ClipboardHistoryService(Context ctx)
{
_history = new ArrayList<HistoryEntry>();
_cm = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE);
_cm.addPrimaryClipChangedListener(this.new SystemListener());
}
public List<String> clear_expired_and_get_history()
{
long now_ms = System.currentTimeMillis();
List<String> dst = new ArrayList<String>();
Iterator<HistoryEntry> it = _history.iterator();
while (it.hasNext())
{
HistoryEntry ent = it.next();
if (ent.expiry_timestamp <= now_ms)
it.remove();
else
dst.add(ent.content);
}
return dst;
}
/** This will call [on_clipboard_history_change]. */
public void remove_history_entry(String clip)
{
int last_pos = _history.size() - 1;
for (int pos = last_pos; pos >= 0; pos--)
{
if (!_history.get(pos).content.equals(clip))
continue;
// Removing the current clipboard, clear the system clipboard.
if (pos == last_pos)
{
if (VERSION.SDK_INT >= 28)
_cm.clearPrimaryClip();
else
_cm.setText("");
}
_history.remove(pos);
if (_listener != null)
_listener.on_clipboard_history_change();
}
}
/** Add clipboard entries to the history, skipping consecutive duplicates and
empty strings. */
public void add_clip(String clip)
{
if (!Config.globalConfig().clipboard_history_enabled)
return;
int size = _history.size();
if (clip.equals("") || (size > 0 && _history.get(size - 1).content.equals(clip)))
return;
if (size >= MAX_HISTORY_SIZE)
_history.remove(0);
_history.add(new HistoryEntry(clip));
if (_listener != null)
_listener.on_clipboard_history_change();
}
public void clear_history()
{
_history.clear();
if (_listener != null)
_listener.on_clipboard_history_change();
}
public void set_on_clipboard_history_change(OnClipboardHistoryChange l) { _listener = l; }
public static interface OnClipboardHistoryChange
{
public void on_clipboard_history_change();
}
/** Add what is currently in the system clipboard into the history. */
void add_current_clip()
{
ClipData clip = _cm.getPrimaryClip();
if (clip == null)
return;
int count = clip.getItemCount();
for (int i = 0; i < count; i++)
add_clip(clip.getItemAt(i).getText().toString());
}
final class SystemListener implements ClipboardManager.OnPrimaryClipChangedListener
{
public SystemListener() {}
@Override
public void onPrimaryClipChanged()
{
add_current_clip();
}
}
static final class HistoryEntry
{
public final String content;
/** Time at which the entry expires. */
public final long expiry_timestamp;
public HistoryEntry(String c)
{
content = c;
expiry_timestamp = System.currentTimeMillis() + HISTORY_TTL_MS;
}
}
public interface ClipboardPasteCallback
{
public void paste_from_clipboard_pane(String content);
}
}

View File

@@ -0,0 +1,125 @@
package juloo.keyboard2;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public final class ClipboardHistoryView extends NonScrollListView
implements ClipboardHistoryService.OnClipboardHistoryChange
{
List<String> _history;
ClipboardHistoryService _service;
ClipboardEntriesAdapter _adapter;
public ClipboardHistoryView(Context ctx, AttributeSet attrs)
{
super(ctx, attrs);
_history = Collections.EMPTY_LIST;
_adapter = this.new ClipboardEntriesAdapter();
_service = ClipboardHistoryService.get_service(ctx);
if (_service != null)
{
_service.set_on_clipboard_history_change(this);
_history = _service.clear_expired_and_get_history();
}
setAdapter(_adapter);
}
/** The history entry at index [pos] is removed from the history and added to
the list of pinned clipboards. */
public void pin_entry(int pos)
{
ClipboardPinView v = (ClipboardPinView)((ViewGroup)getParent().getParent()).findViewById(R.id.clipboard_pin_view);
String clip = _history.get(pos);
v.add_entry(clip);
_service.remove_history_entry(clip);
}
/** Send the specified entry to the editor. */
public void paste_entry(int pos)
{
ClipboardHistoryService.paste(_history.get(pos));
}
@Override
public void on_clipboard_history_change()
{
update_data();
}
@Override
protected void onWindowVisibilityChanged(int visibility)
{
if (visibility == View.VISIBLE)
update_data();
}
void update_data()
{
_history = _service.clear_expired_and_get_history();
_adapter.notifyDataSetChanged();
invalidate();
}
class ClipboardEntriesAdapter extends BaseAdapter
{
public ClipboardEntriesAdapter() {}
@Override
public int getCount() { return _history.size(); }
@Override
public Object getItem(int pos) { return _history.get(pos); }
@Override
public long getItemId(int pos) { return _history.get(pos).hashCode(); }
@Override
public View getView(final int pos, View v, ViewGroup _parent)
{
if (v == null)
v = View.inflate(getContext(), R.layout.clipboard_history_entry, null);
((TextView)v.findViewById(R.id.clipboard_entry_text))
.setText(_history.get(pos));
v.findViewById(R.id.clipboard_entry_addpin).setOnClickListener(
new View.OnClickListener()
{
@Override
public void onClick(View v) { pin_entry(pos); }
});
v.findViewById(R.id.clipboard_entry_paste).setOnClickListener(
new View.OnClickListener()
{
@Override
public void onClick(View v) { paste_entry(pos); }
});
// v.findViewById(R.id.clipboard_entry_removehist).setOnClickListener(
// new View.OnClickListener()
// {
// @Override
// public void onClick(View v)
// {
// AlertDialog d = new AlertDialog.Builder(getContext())
// .setTitle(R.string.clipboard_remove_confirm)
// .setPositiveButton(R.string.clipboard_remove_confirmed,
// new DialogInterface.OnClickListener(){
// public void onClick(DialogInterface _dialog, int _which)
// {
// _service.remove_history_entry(_history.get(pos));
// }
// })
// .setNegativeButton(android.R.string.cancel, null)
// .create();
// Utils.show_dialog_on_ime(d, v.getWindowToken());
// }
// });
return v;
}
}
}

View File

@@ -0,0 +1,139 @@
package juloo.keyboard2;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
public final class ClipboardPinView extends NonScrollListView
{
/** Preference file name that store pinned clipboards. */
static final String PERSIST_FILE_NAME = "clipboards";
/** Preference name for pinned clipboards. */
static final String PERSIST_PREF = "pinned";
List<String> _entries;
ClipboardPinEntriesAdapter _adapter;
SharedPreferences _persist_store;
public ClipboardPinView(Context ctx, AttributeSet attrs)
{
super(ctx, attrs);
_entries = new ArrayList<String>();
_persist_store =
ctx.getSharedPreferences("pinned_clipboards", Context.MODE_PRIVATE);
load_from_prefs(_persist_store, _entries);
_adapter = this.new ClipboardPinEntriesAdapter();
setAdapter(_adapter);
}
/** Pin a clipboard and persist the change. */
public void add_entry(String text)
{
_entries.add(text);
_adapter.notifyDataSetChanged();
persist();
invalidate();
}
/** Remove the entry at index [pos] and persist the change. */
public void remove_entry(int pos)
{
if (pos < 0 || pos >= _entries.size())
return;
_entries.remove(pos);
_adapter.notifyDataSetChanged();
persist();
invalidate();
}
/** Send the specified entry to the editor. */
public void paste_entry(int pos)
{
ClipboardHistoryService.paste(_entries.get(pos));
}
void persist() { save_to_prefs(_persist_store, _entries); }
static void load_from_prefs(SharedPreferences store, List<String> dst)
{
String arr_s = store.getString(PERSIST_PREF, null);
if (arr_s == null)
return;
try
{
JSONArray arr = new JSONArray(arr_s);
for (int i = 0; i < arr.length(); i++)
dst.add(arr.getString(i));
}
catch (JSONException _e) {}
}
static void save_to_prefs(SharedPreferences store, List<String> entries)
{
JSONArray arr = new JSONArray();
for (int i = 0; i < entries.size(); i++)
arr.put(entries.get(i));
store.edit()
.putString(PERSIST_PREF, arr.toString())
.commit();
}
class ClipboardPinEntriesAdapter extends BaseAdapter
{
public ClipboardPinEntriesAdapter() {}
@Override
public int getCount() { return _entries.size(); }
@Override
public Object getItem(int pos) { return _entries.get(pos); }
@Override
public long getItemId(int pos) { return _entries.get(pos).hashCode(); }
@Override
public View getView(final int pos, View v, ViewGroup _parent)
{
if (v == null)
v = View.inflate(getContext(), R.layout.clipboard_pin_entry, null);
((TextView)v.findViewById(R.id.clipboard_pin_text))
.setText(_entries.get(pos));
v.findViewById(R.id.clipboard_pin_paste).setOnClickListener(
new View.OnClickListener()
{
@Override
public void onClick(View v) { paste_entry(pos); }
});
v.findViewById(R.id.clipboard_pin_remove).setOnClickListener(
new View.OnClickListener()
{
@Override
public void onClick(View v)
{
AlertDialog d = new AlertDialog.Builder(getContext())
.setTitle(R.string.clipboard_remove_confirm)
.setPositiveButton(R.string.clipboard_remove_confirmed,
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface _dialog, int _which)
{
remove_entry(pos);
}
})
.setNegativeButton(android.R.string.cancel, null)
.create();
Utils.show_dialog_on_ime(d, v.getWindowToken());
}
});
return v;
}
}
}

View File

@@ -67,6 +67,7 @@ public final class Config
public boolean pin_entry_enabled; public boolean pin_entry_enabled;
public boolean borderConfig; public boolean borderConfig;
public int circle_sensitivity; public int circle_sensitivity;
public boolean clipboard_history_enabled;
// Dynamically set // Dynamically set
public boolean shouldOfferVoiceTyping; public boolean shouldOfferVoiceTyping;
@@ -185,6 +186,7 @@ public final class Config
current_layout_portrait = _prefs.getInt("current_layout_portrait", 0); current_layout_portrait = _prefs.getInt("current_layout_portrait", 0);
current_layout_landscape = _prefs.getInt("current_layout_landscape", 0); current_layout_landscape = _prefs.getInt("current_layout_landscape", 0);
circle_sensitivity = Integer.valueOf(_prefs.getString("circle_sensitivity", "2")); circle_sensitivity = Integer.valueOf(_prefs.getString("circle_sensitivity", "2"));
clipboard_history_enabled = _prefs.getBoolean("clipboard_history_enabled", false);
} }
public int get_current_layout() public int get_current_layout()
@@ -232,7 +234,7 @@ public final class Config
extra_keys.put(KeyValue.getKeyByName("config"), KeyboardData.PreferredPos.ANYWHERE); extra_keys.put(KeyValue.getKeyByName("config"), KeyboardData.PreferredPos.ANYWHERE);
extra_keys.putAll(extra_keys_param); extra_keys.putAll(extra_keys_param);
extra_keys.putAll(extra_keys_custom); extra_keys.putAll(extra_keys_custom);
if (extra_keys_subtype != null) if (extra_keys_subtype != null && kw.locale_extra_keys)
{ {
Set<KeyValue> present = new HashSet<KeyValue>(); Set<KeyValue> present = new HashSet<KeyValue>();
present.addAll(kw.getKeys().keySet()); present.addAll(kw.getKeys().keySet());
@@ -403,6 +405,7 @@ public final class Config
private int getThemeId(Resources res, String theme_name) private int getThemeId(Resources res, String theme_name)
{ {
int night_mode = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (theme_name) switch (theme_name)
{ {
case "light": return R.style.Light; case "light": return R.style.Light;
@@ -413,9 +416,14 @@ public final class Config
case "epaper": return R.style.ePaper; case "epaper": return R.style.ePaper;
case "desert": return R.style.Desert; case "desert": return R.style.Desert;
case "jungle": return R.style.Jungle; case "jungle": return R.style.Jungle;
case "monetlight": return R.style.MonetLight;
case "monetdark": return R.style.MonetDark;
case "monet":
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
return R.style.MonetLight;
return R.style.MonetDark;
default: default:
case "system": case "system":
int night_mode = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0) if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
return R.style.Light; return R.style.Light;
return R.style.Dark; return R.style.Dark;

View File

@@ -10,7 +10,9 @@ import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnection;
import java.util.Iterator; import java.util.Iterator;
public final class KeyEventHandler implements Config.IKeyEventHandler public final class KeyEventHandler
implements Config.IKeyEventHandler,
ClipboardHistoryService.ClipboardPasteCallback
{ {
IReceiver _recv; IReceiver _recv;
Autocapitalisation _autocap; Autocapitalisation _autocap;
@@ -105,6 +107,12 @@ public final class KeyEventHandler implements Config.IKeyEventHandler
update_meta_state(mods); update_meta_state(mods);
} }
@Override
public void paste_from_clipboard_pane(String content)
{
send_text(content);
}
/** Update [_mods] to be consistent with the [mods], sending key events if /** Update [_mods] to be consistent with the [mods], sending key events if
needed. */ needed. */
void update_meta_state(Pointers.Modifiers mods) void update_meta_state(Pointers.Modifiers mods)

View File

@@ -12,6 +12,8 @@ public final class KeyValue implements Comparable<KeyValue>
SWITCH_NUMERIC, SWITCH_NUMERIC,
SWITCH_EMOJI, SWITCH_EMOJI,
SWITCH_BACK_EMOJI, SWITCH_BACK_EMOJI,
SWITCH_CLIPBOARD,
SWITCH_BACK_CLIPBOARD,
CHANGE_METHOD_PICKER, CHANGE_METHOD_PICKER,
CHANGE_METHOD_AUTO, CHANGE_METHOD_AUTO,
ACTION, ACTION,
@@ -460,6 +462,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "switch_numeric": return eventKey("123+", Event.SWITCH_NUMERIC, FLAG_SMALLER_FONT); case "switch_numeric": return eventKey("123+", Event.SWITCH_NUMERIC, FLAG_SMALLER_FONT);
case "switch_emoji": return eventKey(0xE001, Event.SWITCH_EMOJI, FLAG_SMALLER_FONT); case "switch_emoji": return eventKey(0xE001, Event.SWITCH_EMOJI, FLAG_SMALLER_FONT);
case "switch_back_emoji": return eventKey("ABC", Event.SWITCH_BACK_EMOJI, 0); case "switch_back_emoji": return eventKey("ABC", Event.SWITCH_BACK_EMOJI, 0);
case "switch_clipboard": return eventKey(0xE017, Event.SWITCH_CLIPBOARD, 0);
case "switch_back_clipboard": return eventKey("ABC", Event.SWITCH_BACK_CLIPBOARD, 0);
case "switch_forward": return eventKey(0xE013, Event.SWITCH_FORWARD, FLAG_SMALLER_FONT); case "switch_forward": return eventKey(0xE013, Event.SWITCH_FORWARD, FLAG_SMALLER_FONT);
case "switch_backward": return eventKey(0xE014, Event.SWITCH_BACKWARD, FLAG_SMALLER_FONT); case "switch_backward": return eventKey(0xE014, Event.SWITCH_BACKWARD, FLAG_SMALLER_FONT);
case "switch_greekmath": return eventKey("πλ∇¬", Event.SWITCH_GREEKMATH, FLAG_SMALLER_FONT); case "switch_greekmath": return eventKey("πλ∇¬", Event.SWITCH_GREEKMATH, FLAG_SMALLER_FONT);

View File

@@ -36,6 +36,7 @@ public class Keyboard2 extends InputMethodService
/** Layout associated with the currently selected locale. Not 'null'. */ /** Layout associated with the currently selected locale. Not 'null'. */
private KeyboardData _localeTextLayout; private KeyboardData _localeTextLayout;
private ViewGroup _emojiPane = null; private ViewGroup _emojiPane = null;
private ViewGroup _clipboard_pane = null;
public int actionId; // Action performed by the Action key. public int actionId; // Action performed by the Action key.
private Config _config; private Config _config;
@@ -113,6 +114,7 @@ public class Keyboard2 extends InputMethodService
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard); _keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
_keyboardView.reset(); _keyboardView.reset();
Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs)); Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs));
ClipboardHistoryService.on_startup(this, _keyeventhandler);
} }
private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm) private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm)
@@ -134,13 +136,9 @@ public class Keyboard2 extends InputMethodService
return ExtraKeys.EMPTY; return ExtraKeys.EMPTY;
} }
@TargetApi(12) private void refreshAccentsOption(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes)
private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype)
{ {
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
List<ExtraKeys> extra_keys = new ArrayList<ExtraKeys>(); List<ExtraKeys> extra_keys = new ArrayList<ExtraKeys>();
// Gather extra keys from all enabled subtypes
extra_keys.add(extra_keys_of_subtype(subtype));
for (InputMethodSubtype s : enabled_subtypes) for (InputMethodSubtype s : enabled_subtypes)
extra_keys.add(extra_keys_of_subtype(s)); extra_keys.add(extra_keys_of_subtype(s));
_config.extra_keys_subtype = ExtraKeys.merge(extra_keys); _config.extra_keys_subtype = ExtraKeys.merge(extra_keys);
@@ -151,6 +149,18 @@ public class Keyboard2 extends InputMethodService
return (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); return (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
} }
@TargetApi(12)
private String defaultLayoutForSubtypes(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes)
{
// Android might return a random subtype, for example, the first in the
// list alphabetically.
InputMethodSubtype current_subtype = imm.getCurrentInputMethodSubtype();
for (InputMethodSubtype s : enabled_subtypes)
if (s.getLanguageTag().equals(current_subtype.getLanguageTag()))
return s.getExtraValueOf("default_layout");
return null;
}
private void refreshSubtypeImm() private void refreshSubtypeImm()
{ {
InputMethodManager imm = get_imm(); InputMethodManager imm = get_imm();
@@ -159,13 +169,14 @@ public class Keyboard2 extends InputMethodService
_config.extra_keys_subtype = null; _config.extra_keys_subtype = null;
if (VERSION.SDK_INT >= 12) if (VERSION.SDK_INT >= 12)
{ {
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype(); InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype();
if (subtype != null) if (subtype != null)
{ {
String s = subtype.getExtraValueOf("default_layout"); String s = defaultLayoutForSubtypes(imm, enabled_subtypes);
if (s != null) if (s != null)
default_layout = LayoutsPreference.layout_of_string(getResources(), s); default_layout = LayoutsPreference.layout_of_string(getResources(), s);
refreshAccentsOption(imm, subtype); refreshAccentsOption(imm, enabled_subtypes);
} }
} }
if (default_layout == null) if (default_layout == null)
@@ -223,6 +234,7 @@ public class Keyboard2 extends InputMethodService
{ {
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard); _keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
_emojiPane = null; _emojiPane = null;
_clipboard_pane = null;
setInputView(_keyboardView); setInputView(_keyboardView);
} }
_keyboardView.reset(); _keyboardView.reset();
@@ -384,7 +396,14 @@ public class Keyboard2 extends InputMethodService
setInputView(_emojiPane); setInputView(_emojiPane);
break; break;
case SWITCH_CLIPBOARD:
if (_clipboard_pane == null)
_clipboard_pane = (ViewGroup)inflate_view(R.layout.clipboard_pane);
setInputView(_clipboard_pane);
break;
case SWITCH_BACK_EMOJI: case SWITCH_BACK_EMOJI:
case SWITCH_BACK_CLIPBOARD:
setInputView(_keyboardView); setInputView(_keyboardView);
break; break;

View File

@@ -31,6 +31,8 @@ public final class KeyboardData
public final String name; public final String name;
/** Whether the bottom row should be added. */ /** Whether the bottom row should be added. */
public final boolean bottom_row; public final boolean bottom_row;
/** Whether extra keys from [method.xml] should be added to this layout. */
public final boolean locale_extra_keys;
/** Position of every keys on the layout, see [getKeys()]. */ /** Position of every keys on the layout, see [getKeys()]. */
private Map<KeyValue, KeyPos> _key_pos = null; private Map<KeyValue, KeyPos> _key_pos = null;
@@ -69,13 +71,15 @@ public final class KeyboardData
KeyPos next_to_pos = getKeys().get(pos.next_to); KeyPos next_to_pos = getKeys().get(pos.next_to);
// Use preferred direction if some preferred pos match // Use preferred direction if some preferred pos match
if (next_to_pos != null) if (next_to_pos != null)
{
for (KeyPos p : pos.positions) for (KeyPos p : pos.positions)
if ((p.row == -1 || p.row == next_to_pos.row) if ((p.row == -1 || p.row == next_to_pos.row)
&& (p.col == -1 || p.col == next_to_pos.col) && (p.col == -1 || p.col == next_to_pos.col)
&& add_key_to_pos(rows, kv, next_to_pos.with_dir(p.dir))) && add_key_to_pos(rows, kv, next_to_pos.with_dir(p.dir)))
return true; return true;
if (add_key_to_pos(rows, kv, next_to_pos.with_dir(-1))) if (add_key_to_pos(rows, kv, next_to_pos.with_dir(-1)))
return true; return true;
}
} }
for (KeyPos p : pos.positions) for (KeyPos p : pos.positions)
if (add_key_to_pos(rows, kv, p)) if (add_key_to_pos(rows, kv, p))
@@ -234,6 +238,7 @@ public final class KeyboardData
if (!expect_tag(parser, "keyboard")) if (!expect_tag(parser, "keyboard"))
throw error(parser, "Expected tag <keyboard>"); throw error(parser, "Expected tag <keyboard>");
boolean bottom_row = attribute_bool(parser, "bottom_row", true); boolean bottom_row = attribute_bool(parser, "bottom_row", true);
boolean locale_extra_keys = attribute_bool(parser, "locale_extra_keys", true);
float specified_kw = attribute_float(parser, "width", 0f); float specified_kw = attribute_float(parser, "width", 0f);
String script = parser.getAttributeValue(null, "script"); String script = parser.getAttributeValue(null, "script");
if (script != null && script.equals("")) if (script != null && script.equals(""))
@@ -263,7 +268,7 @@ public final class KeyboardData
} }
} }
float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows); float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows);
return new KeyboardData(rows, kw, modmap, script, numpad_script, name, bottom_row); return new KeyboardData(rows, kw, modmap, script, numpad_script, name, bottom_row, locale_extra_keys);
} }
private static float compute_max_width(List<Row> rows) private static float compute_max_width(List<Row> rows)
@@ -282,7 +287,7 @@ public final class KeyboardData
} }
protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc, protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc,
String npsc, String name_, boolean bottom_row_) String npsc, String name_, boolean bottom_row_, boolean locale_extra_keys_)
{ {
float kh = 0.f; float kh = 0.f;
for (Row r : rows_) for (Row r : rows_)
@@ -295,13 +300,14 @@ public final class KeyboardData
keysWidth = Math.max(kw, 1f); keysWidth = Math.max(kw, 1f);
keysHeight = kh; keysHeight = kh;
bottom_row = bottom_row_; bottom_row = bottom_row_;
locale_extra_keys = locale_extra_keys_;
} }
/** Copies the fields of an other keyboard, with rows changed. */ /** Copies the fields of a keyboard, with rows changed. */
protected KeyboardData(KeyboardData src, List<Row> rows) protected KeyboardData(KeyboardData src, List<Row> rows)
{ {
this(rows, compute_max_width(rows), src.modmap, src.script, this(rows, compute_max_width(rows), src.modmap, src.script,
src.numpad_script, src.name, src.bottom_row); src.numpad_script, src.name, src.bottom_row, src.locale_extra_keys);
} }
public static class Row public static class Row

View File

@@ -0,0 +1,38 @@
package juloo.keyboard2;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.widget.ListView;
/** A non-scrollable list view that can be embedded in a bigger ScrollView.
Credits to Dedaniya HirenKumar in
https://stackoverflow.com/questions/18813296/non-scrollable-listview-inside-scrollview */
public class NonScrollListView extends ListView
{
public NonScrollListView(Context context)
{
super(context);
}
public NonScrollListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
}

View File

@@ -24,6 +24,7 @@ public class ExtraKeysPreference extends PreferenceCategory
"meta", "meta",
"compose", "compose",
"voice_typing", "voice_typing",
"switch_clipboard",
"accent_aigu", "accent_aigu",
"accent_grave", "accent_grave",
"accent_double_aigu", "accent_double_aigu",
@@ -79,6 +80,7 @@ public class ExtraKeysPreference extends PreferenceCategory
{ {
case "voice_typing": case "voice_typing":
case "change_method": case "change_method":
case "switch_clipboard":
case "compose": case "compose":
case "tab": case "tab":
case "esc": case "esc":
@@ -117,6 +119,7 @@ public class ExtraKeysPreference extends PreferenceCategory
case "voice_typing": id = R.string.key_descr_voice_typing; break; case "voice_typing": id = R.string.key_descr_voice_typing; break;
case "ª": id = R.string.key_descr_ª; break; case "ª": id = R.string.key_descr_ª; break;
case "º": id = R.string.key_descr_º; break; case "º": id = R.string.key_descr_º; break;
case "switch_clipboard": id = R.string.key_descr_clipboard; break;
} }
if (id == 0) if (id == 0)
return null; return null;

2
srcs/special_font/17.svg Normal file
View File

@@ -0,0 +1,2 @@
<!-- Material Design Icons -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>clipboard-text-multiple-outline</title><path d="M4 7V21H18V23H4C2.9 23 2 22.1 2 21V7H4M20 3C21.1 3 22 3.9 22 5V17C22 18.1 21.1 19 20 19H8C6.9 19 6 18.1 6 17V5C6 3.9 6.9 3 8 3H11.18C11.6 1.84 12.7 1 14 1C15.3 1 16.4 1.84 16.82 3H20M14 3C13.45 3 13 3.45 13 4C13 4.55 13.45 5 14 5C14.55 5 15 4.55 15 4C15 3.45 14.55 3 14 3M10 7V5H8V17H20V5H18V7M15 15H10V13H15M18 11H10V9H18V11Z" /></svg>

After

Width:  |  Height:  |  Size: 483 B

View File

@@ -1,2 +1,2 @@
<!-- Material Design Icons --> <!-- Material Design Icons -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>clipboard-multiple-outline</title><path d="M4 7V21H18V23H4C2.9 23 2 22.1 2 21V7H4M20 3C21.1 3 22 3.9 22 5V17C22 18.1 21.1 19 20 19H8C6.9 19 6 18.1 6 17V5C6 3.9 6.9 3 8 3H11.18C11.6 1.84 12.7 1 14 1C15.3 1 16.4 1.84 16.82 3H20M14 3C13.45 3 13 3.45 13 4C13 4.55 13.45 5 14 5C14.55 5 15 4.55 15 4C15 3.45 14.55 3 14 3M10 7V5H8V17H20V5H18V7H10Z" /></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>content-paste (modified)</title><path d="M19,20H5V4H7V7H17V4H19M12,2A1,1 0 0,1 13,3A1,1 0 0,1 12,4A1,1 0 0,1 11,3A1,1 0 0,1 12,2M19,2H14.82C14.4,0.84 13.3,0 12,0C10.7,0 9.6,0.84 9.18,2H5A2,2 0 0,0 3,4V20A2,2 0 0,0 5,22H19A2,2 0 0,0 21,20V4A2,2 0 0,0 19,2M8 12H16V14H8V12Z" /></svg>

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 380 B