Language selection popup (#798)
This commit is contained in:
parent
ea42b41a05
commit
2479cdc491
34 changed files with 702 additions and 131 deletions
|
|
@ -10,6 +10,7 @@ import io.github.sspanak.tt9.ime.modes.InputModeKind;
|
|||
import io.github.sspanak.tt9.languages.LanguageCollection;
|
||||
import io.github.sspanak.tt9.ui.UI;
|
||||
import io.github.sspanak.tt9.ui.dialogs.AddWordDialog;
|
||||
import io.github.sspanak.tt9.ui.dialogs.ChangeLanguageDialog;
|
||||
import io.github.sspanak.tt9.util.Logger;
|
||||
import io.github.sspanak.tt9.util.Ternary;
|
||||
import io.github.sspanak.tt9.util.sys.Clipboard;
|
||||
|
|
@ -166,16 +167,56 @@ abstract public class CommandHandler extends TextEditingHandler {
|
|||
}
|
||||
|
||||
|
||||
protected void nextLang() {
|
||||
protected void changeLang() {
|
||||
suggestionOps.cancelDelayedAccept();
|
||||
stopVoiceInput();
|
||||
ChangeLanguageDialog.show(this, mInputMode.getSequence(), textField.getComposingText());
|
||||
}
|
||||
|
||||
// select the next language
|
||||
|
||||
protected void nextLang() {
|
||||
int previous = mEnabledLanguages.indexOf(mLanguage.getId());
|
||||
int next = (previous + 1) % mEnabledLanguages.size();
|
||||
mLanguage = LanguageCollection.getLanguage(mEnabledLanguages.get(next));
|
||||
setLang(mEnabledLanguages.get(next));
|
||||
}
|
||||
|
||||
// validate and save it for the next time
|
||||
|
||||
public void setLang(int langId) {
|
||||
if (!mEnabledLanguages.contains(langId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
suggestionOps.cancelDelayedAccept();
|
||||
stopVoiceInput();
|
||||
|
||||
mLanguage = LanguageCollection.getLanguage(langId);
|
||||
validateLanguages();
|
||||
|
||||
detectRTL();
|
||||
|
||||
// for languages that do not have ABC or Predictive, make sure we remain in valid state
|
||||
if (mInputMode.changeLanguage(mLanguage)) {
|
||||
mInputMode.clearWordStem();
|
||||
} else {
|
||||
final String digits = mInputMode.getSequence();
|
||||
mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, determineInputModeId());
|
||||
mInputMode.setSequence(digits);
|
||||
}
|
||||
|
||||
getSuggestions(null);
|
||||
setStatusIcon(mInputMode, mLanguage);
|
||||
statusBar.setText(mInputMode);
|
||||
suggestionOps.setRTL(isLanguageRTL);
|
||||
mainView.render();
|
||||
if (settings.isMainLayoutStealth() && !settings.isStatusIconEnabled()) {
|
||||
UI.toastShortSingle(this, mInputMode.getClass().getSimpleName(), mInputMode.toString());
|
||||
}
|
||||
|
||||
if (InputModeKind.isPredictive(mInputMode)) {
|
||||
DictionaryLoader.autoLoad(this, mLanguage);
|
||||
}
|
||||
|
||||
forceShowWindow();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,9 +3,7 @@ package io.github.sspanak.tt9.ime;
|
|||
import android.view.KeyEvent;
|
||||
|
||||
import io.github.sspanak.tt9.R;
|
||||
import io.github.sspanak.tt9.db.words.DictionaryLoader;
|
||||
import io.github.sspanak.tt9.ime.helpers.TextField;
|
||||
import io.github.sspanak.tt9.ime.modes.InputMode;
|
||||
import io.github.sspanak.tt9.ime.modes.InputModeKind;
|
||||
import io.github.sspanak.tt9.languages.LanguageKind;
|
||||
import io.github.sspanak.tt9.ui.UI;
|
||||
|
|
@ -300,33 +298,12 @@ public abstract class HotkeyHandler extends CommandHandler {
|
|||
return true;
|
||||
}
|
||||
|
||||
suggestionOps.cancelDelayedAccept();
|
||||
nextLang();
|
||||
detectRTL();
|
||||
|
||||
// for languages that do not have ABC or Predictive, make sure we remain in valid state
|
||||
if (mInputMode.changeLanguage(mLanguage)) {
|
||||
mInputMode.clearWordStem();
|
||||
if (settings.getQuickSwitchLanguage()) {
|
||||
nextLang();
|
||||
} else {
|
||||
final String digits = mInputMode.getSequence();
|
||||
mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, determineInputModeId());
|
||||
mInputMode.setSequence(digits);
|
||||
changeLang();
|
||||
}
|
||||
|
||||
getSuggestions(null);
|
||||
setStatusIcon(mInputMode, mLanguage);
|
||||
statusBar.setText(mInputMode);
|
||||
suggestionOps.setRTL(isLanguageRTL);
|
||||
mainView.render();
|
||||
if (settings.isMainLayoutStealth() && !settings.isStatusIconEnabled()) {
|
||||
UI.toastShortSingle(this, mInputMode.getClass().getSimpleName(), mInputMode.toString());
|
||||
}
|
||||
|
||||
if (InputModeKind.isPredictive(mInputMode)) {
|
||||
DictionaryLoader.autoLoad(this, mLanguage);
|
||||
}
|
||||
|
||||
forceShowWindow();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import android.view.inputmethod.EditorInfo;
|
|||
import android.view.inputmethod.InputConnection;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import io.github.sspanak.tt9.R;
|
||||
import io.github.sspanak.tt9.db.DataStore;
|
||||
|
|
@ -19,6 +20,7 @@ import io.github.sspanak.tt9.ime.modes.InputModeKind;
|
|||
import io.github.sspanak.tt9.languages.LanguageCollection;
|
||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||
import io.github.sspanak.tt9.ui.UI;
|
||||
import io.github.sspanak.tt9.ui.dialogs.ChangeLanguageDialog;
|
||||
import io.github.sspanak.tt9.ui.dialogs.PopupDialog;
|
||||
import io.github.sspanak.tt9.util.Logger;
|
||||
import io.github.sspanak.tt9.util.sys.SystemSettings;
|
||||
|
|
@ -109,11 +111,20 @@ public class TraditionalT9 extends MainViewHandler {
|
|||
int result = super.onStartCommand(intent, flags, startId);
|
||||
|
||||
String message = intent != null ? intent.getStringExtra(PopupDialog.INTENT_CLOSE) : null;
|
||||
if (message != null) {
|
||||
forceShowWindow();
|
||||
if (!message.isEmpty()) {
|
||||
UI.toastLong(this, message);
|
||||
}
|
||||
if (message == null) {
|
||||
return result;
|
||||
}
|
||||
|
||||
forceShowWindow();
|
||||
|
||||
if (!message.isEmpty()) {
|
||||
UI.toastLong(this, message);
|
||||
} else if (ChangeLanguageDialog.INTENT_SET_LANGUAGE.equals(intent.getStringExtra(ChangeLanguageDialog.INTENT_SET_LANGUAGE))) {
|
||||
onResume(
|
||||
intent.getStringExtra(ChangeLanguageDialog.PARAMETER_LANGUAGE),
|
||||
intent.getStringExtra(ChangeLanguageDialog.PARAMETER_SEQUENCE),
|
||||
intent.getStringExtra(ChangeLanguageDialog.PARAMETER_WORD)
|
||||
);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
@ -168,6 +179,24 @@ public class TraditionalT9 extends MainViewHandler {
|
|||
}
|
||||
|
||||
|
||||
private void onResume(@Nullable String langStringId, @Nullable String sequence, @Nullable String word) {
|
||||
int languageId;
|
||||
try {
|
||||
langStringId = langStringId == null ? "(null)" : langStringId;
|
||||
languageId = Integer.parseInt(langStringId);
|
||||
} catch (NumberFormatException e) {
|
||||
Logger.e(LOG_TAG, "Can not resume typing. Failed to parse language ID '" + langStringId + "'. " + e);
|
||||
return;
|
||||
}
|
||||
|
||||
if (word != null && !word.isEmpty() && sequence != null && !sequence.isEmpty()) {
|
||||
mInputMode.setSequence(sequence);
|
||||
}
|
||||
|
||||
setLang(languageId);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
stopVoiceInput();
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import io.github.sspanak.tt9.db.DataStore;
|
|||
import io.github.sspanak.tt9.languages.LanguageCollection;
|
||||
import io.github.sspanak.tt9.preferences.custom.ScreenPreference;
|
||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||
import io.github.sspanak.tt9.ui.PopupBuilder;
|
||||
import io.github.sspanak.tt9.ui.UI;
|
||||
|
||||
public class PreferenceDeletableWord extends ScreenPreference {
|
||||
|
|
@ -48,17 +49,13 @@ public class PreferenceDeletableWord extends ScreenPreference {
|
|||
super.onClick();
|
||||
|
||||
Context context = getContext();
|
||||
|
||||
UI.confirm(
|
||||
context,
|
||||
context.getString(R.string.delete_words_deleted_confirm_deletion_title),
|
||||
context.getString(R.string.delete_words_deleted_confirm_deletion_question, word),
|
||||
context.getString(R.string.delete_words_delete),
|
||||
this::onDeletionConfirmed,
|
||||
true,
|
||||
null,
|
||||
null
|
||||
);
|
||||
new PopupBuilder(context)
|
||||
.setCancelable(true)
|
||||
.setTitle(context.getString(R.string.delete_words_deleted_confirm_deletion_title))
|
||||
.setMessage(context.getString(R.string.delete_words_deleted_confirm_deletion_question, word))
|
||||
.setNegativeButton(true, null)
|
||||
.setPositiveButton(context.getString(R.string.delete_words_delete), this::onDeletionConfirmed)
|
||||
.show();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import io.github.sspanak.tt9.R;
|
|||
import io.github.sspanak.tt9.ime.helpers.Key;
|
||||
import io.github.sspanak.tt9.preferences.custom.ScreenPreference;
|
||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||
import io.github.sspanak.tt9.ui.UI;
|
||||
import io.github.sspanak.tt9.ui.PopupBuilder;
|
||||
import io.github.sspanak.tt9.util.sys.DeviceInfo;
|
||||
|
||||
public class PreferenceHotkey extends ScreenPreference implements DialogInterface.OnKeyListener{
|
||||
|
|
@ -72,16 +72,12 @@ public class PreferenceHotkey extends ScreenPreference implements DialogInterfac
|
|||
|
||||
boolean enableCancelButton = !DeviceInfo.noTouchScreen(getContext());
|
||||
|
||||
UI.confirm(
|
||||
getContext(),
|
||||
getKey(),
|
||||
getContext().getString(R.string.function_assign_instructions, getTitle()),
|
||||
null,
|
||||
null,
|
||||
enableCancelButton,
|
||||
enableCancelButton ? ()->{} : null,
|
||||
this
|
||||
);
|
||||
new PopupBuilder(getContext())
|
||||
.setCancelable(false)
|
||||
.setMessage(getContext().getString(R.string.function_assign_instructions, getTitle()))
|
||||
.setNegativeButton(enableCancelButton, () -> {})
|
||||
.setOnKeyListener(this)
|
||||
.show();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -164,19 +160,17 @@ public class PreferenceHotkey extends ScreenPreference implements DialogInterfac
|
|||
getTitle()
|
||||
);
|
||||
|
||||
UI.confirm(
|
||||
getContext(),
|
||||
getKey(),
|
||||
question,
|
||||
getContext().getString(R.string.function_reassign),
|
||||
() -> {
|
||||
settings.setFunctionKey(otherFunction, KeyEvent.KEYCODE_UNKNOWN);
|
||||
onAssign(dialog, keyCode);
|
||||
},
|
||||
true,
|
||||
null,
|
||||
null
|
||||
);
|
||||
new PopupBuilder(getContext())
|
||||
.setCancelable(false)
|
||||
.setMessage(question)
|
||||
.setNegativeButton(true, null)
|
||||
.setPositiveButton(
|
||||
getContext().getString(R.string.function_reassign),
|
||||
() -> {
|
||||
settings.setFunctionKey(otherFunction, KeyEvent.KEYCODE_UNKNOWN);
|
||||
onAssign(dialog, keyCode);
|
||||
}
|
||||
).show();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,6 +75,10 @@ public class SettingsUI extends SettingsTyping {
|
|||
prefsEditor.apply();
|
||||
}
|
||||
|
||||
public boolean getQuickSwitchLanguage() {
|
||||
return prefs.getBoolean("pref_quick_switch_language", true);
|
||||
}
|
||||
|
||||
public int getSettingsFontSize() {
|
||||
int defaultSize = DeviceInfo.IS_QIN_F21 || DeviceInfo.IS_LG_X100S ? FONT_SIZE_LARGE : FONT_SIZE_DEFAULT;
|
||||
return getStringifiedInt("pref_font_size", defaultSize);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
package io.github.sspanak.tt9.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.LayoutInflater;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.content.res.AppCompatResources;
|
||||
|
||||
import io.github.sspanak.tt9.R;
|
||||
import io.github.sspanak.tt9.languages.Language;
|
||||
|
||||
public class LanguageRadioButton extends LinearLayout {
|
||||
private static Drawable highlightDrawable;
|
||||
|
||||
private TextView label;
|
||||
private RadioButton radio;
|
||||
|
||||
public LanguageRadioButton(Context context) { super(context); init(context); }
|
||||
public LanguageRadioButton(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context); }
|
||||
public LanguageRadioButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); }
|
||||
|
||||
private void init(Context context) {
|
||||
LayoutInflater.from(context).inflate(R.layout.radio_button_language, this, true);
|
||||
setOrientation(HORIZONTAL);
|
||||
label = findViewById(R.id.radio_label);
|
||||
radio = findViewById(R.id.radio_button);
|
||||
if (highlightDrawable == null) {
|
||||
highlightDrawable = AppCompatResources.getDrawable(context, R.color.key_num_ripple);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* autoHighlightCompat
|
||||
* Used to highlight the button when scrolling with the DPAD. Normally, this is done by setting
|
||||
* android:background="?android:attr/selectableItemBackground" in the styles. However, this does
|
||||
* not work on Sonim XP3800, which means it may not work on other devices as well. So... here is
|
||||
* one more device hack.
|
||||
*/
|
||||
public void autoHighlightCompat() {
|
||||
setBackground(hasFocus() ? highlightDrawable : null);
|
||||
}
|
||||
|
||||
public LanguageRadioButton setLanguage(@NonNull Language language, String labelPrefix) {
|
||||
setId(language.getId());
|
||||
radio.setId(language.getId());
|
||||
|
||||
final String text = labelPrefix != null ? labelPrefix + language.getName() : language.getName();
|
||||
label.setText(text);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public LanguageRadioButton setChecked(boolean checked) {
|
||||
radio.setChecked(checked);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* On Android 5, ensure there is no clickable="true" in the XML, otherwise the
|
||||
* listener will not be called.
|
||||
*/
|
||||
public LanguageRadioButton setOnClick(@Nullable OnClickListener l) {
|
||||
super.setOnClickListener(l);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
115
app/src/main/java/io/github/sspanak/tt9/ui/PopupBuilder.java
Normal file
115
app/src/main/java/io/github/sspanak/tt9/ui/PopupBuilder.java
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
package io.github.sspanak.tt9.ui;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.view.View;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import io.github.sspanak.tt9.util.sys.DeviceInfo;
|
||||
|
||||
public class PopupBuilder {
|
||||
private final Context context;
|
||||
private MaterialAlertDialogBuilder builder12;
|
||||
private AlertDialog.Builder builderLegacy;
|
||||
|
||||
|
||||
public PopupBuilder(Context context) {
|
||||
this.context = context;
|
||||
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
builder12 = new MaterialAlertDialogBuilder(context);
|
||||
} else {
|
||||
builderLegacy = new AlertDialog.Builder(context);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public PopupBuilder setCancelable(boolean cancelable) {
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
builder12.setCancelable(cancelable);
|
||||
} else {
|
||||
builderLegacy.setCancelable(cancelable);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public PopupBuilder setMessage(String message) {
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
builder12.setMessage(message);
|
||||
} else {
|
||||
builderLegacy.setMessage(message);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public PopupBuilder setNegativeButton(boolean yes, Runnable action) {
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
builder12.setNegativeButton(
|
||||
yes ? context.getString(android.R.string.cancel) : null,
|
||||
(dialog, whichButton) -> { if (action != null) action.run(); }
|
||||
);
|
||||
} else {
|
||||
builderLegacy.setNegativeButton(
|
||||
yes ? context.getString(android.R.string.cancel) : null,
|
||||
(dialog, whichButton) -> { if (action != null) action.run(); }
|
||||
);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public PopupBuilder setOnKeyListener(DialogInterface.OnKeyListener listener) {
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
builder12.setOnKeyListener(listener);
|
||||
} else {
|
||||
builderLegacy.setOnKeyListener(listener);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public PopupBuilder setPositiveButton(String text, Runnable action) {
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
builder12.setPositiveButton(
|
||||
text,
|
||||
(dialog, which) -> action.run()
|
||||
);
|
||||
} else {
|
||||
builderLegacy.setPositiveButton(
|
||||
text,
|
||||
(dialog, which) -> action.run()
|
||||
);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public PopupBuilder setTitle(String title) {
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
builder12.setTitle(title);
|
||||
} else {
|
||||
builderLegacy.setTitle(title);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public PopupBuilder setView(View view) {
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
builder12.setView(view);
|
||||
} else {
|
||||
builderLegacy.setView(view);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public Dialog show() {
|
||||
return DeviceInfo.AT_LEAST_ANDROID_12 ? builder12.show() : builderLegacy.show();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +1,7 @@
|
|||
package io.github.sspanak.tt9.ui;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.os.Looper;
|
||||
|
|
@ -13,12 +10,9 @@ import android.widget.Toast;
|
|||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import io.github.sspanak.tt9.preferences.PreferencesActivity;
|
||||
import io.github.sspanak.tt9.util.sys.DeviceInfo;
|
||||
|
||||
public class UI {
|
||||
private static final HashMap<String, Toast> singleToasts = new HashMap<>();
|
||||
|
|
@ -57,31 +51,6 @@ public class UI {
|
|||
}
|
||||
|
||||
|
||||
public static void confirm(@NonNull Context context, String title, String message, String OKLabel, Runnable onOk, boolean cancelLabel, Runnable onCancel, DialogInterface.OnKeyListener onKey) {
|
||||
Dialog dialogue;
|
||||
|
||||
if (DeviceInfo.AT_LEAST_ANDROID_12) {
|
||||
dialogue = new MaterialAlertDialogBuilder(context)
|
||||
.setMessage(message)
|
||||
.setPositiveButton(OKLabel, (dialog, whichButton) -> { if (onOk != null) onOk.run(); })
|
||||
.setNegativeButton(cancelLabel ? context.getString(android.R.string.cancel) : null, (dialog, whichButton) -> { if (onCancel != null) onCancel.run(); })
|
||||
.show();
|
||||
} else {
|
||||
dialogue = new AlertDialog.Builder(context)
|
||||
.setMessage(message)
|
||||
.setPositiveButton(OKLabel, (dialog, whichButton) -> { if (onOk != null) onOk.run(); })
|
||||
.setNegativeButton(cancelLabel ? context.getString(android.R.string.cancel) : null, (dialog, whichButton) -> { if (onCancel != null) onCancel.run(); })
|
||||
.show();
|
||||
}
|
||||
|
||||
dialogue.setTitle(title);
|
||||
dialogue.setCancelable(false);
|
||||
if (onKey != null) {
|
||||
dialogue.setOnKeyListener(onKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void toast(Context context, CharSequence msg) {
|
||||
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,12 +11,9 @@ import io.github.sspanak.tt9.db.DataStore;
|
|||
import io.github.sspanak.tt9.db.entities.AddWordResult;
|
||||
import io.github.sspanak.tt9.languages.Language;
|
||||
import io.github.sspanak.tt9.languages.LanguageCollection;
|
||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||
import io.github.sspanak.tt9.util.ConsumerCompat;
|
||||
import io.github.sspanak.tt9.util.ThemedContextBuilder;
|
||||
import io.github.sspanak.tt9.util.sys.DeviceInfo;
|
||||
|
||||
public class AddWordDialog extends PopupDialog {
|
||||
public class AddWordDialog extends ThemedPopupDialog {
|
||||
public static final String TYPE = "tt9.popup_dialog.add_word";
|
||||
public static final String PARAMETER_LANGUAGE = "lang";
|
||||
public static final String PARAMETER_WORD = "word";
|
||||
|
|
@ -26,18 +23,7 @@ public class AddWordDialog extends PopupDialog {
|
|||
|
||||
|
||||
AddWordDialog(@NonNull Context context, @NonNull Intent intent, ConsumerCompat<String> activityFinisher) {
|
||||
super(
|
||||
new ThemedContextBuilder()
|
||||
.setConfiguration(context.getApplicationContext().getResources().getConfiguration())
|
||||
.setContext(context)
|
||||
.setSettings(new SettingsStore(context))
|
||||
// The main theme does not work on Android <= 11 and the _AddWord theme does not work on 12+.
|
||||
// Not sure why since they inherit from the same parent, but it is what it is.
|
||||
.setTheme(DeviceInfo.AT_LEAST_ANDROID_12 ? R.style.TTheme : R.style.TTheme_AddWord)
|
||||
.build(),
|
||||
activityFinisher
|
||||
);
|
||||
|
||||
super(context, activityFinisher, R.style.TTheme_AddWord);
|
||||
title = context.getResources().getString(R.string.add_word_title);
|
||||
OKLabel = context.getResources().getString(R.string.add_word_add);
|
||||
parseIntent(context, intent);
|
||||
|
|
|
|||
|
|
@ -11,14 +11,14 @@ import io.github.sspanak.tt9.languages.LanguageCollection;
|
|||
import io.github.sspanak.tt9.util.ConsumerCompat;
|
||||
import io.github.sspanak.tt9.util.Logger;
|
||||
|
||||
public class AutoUpdateMonologue extends PopupDialog {
|
||||
public class AutoUpdateMonolog extends PopupDialog {
|
||||
public static final String TYPE = "tt9.popup_dialog.confirm_words_update";
|
||||
public static final String PARAMETER_LANGUAGE = "lang";
|
||||
|
||||
private Language language;
|
||||
|
||||
|
||||
AutoUpdateMonologue(@NonNull Context context, @NonNull Intent intent, ConsumerCompat<String> activityFinisher) {
|
||||
AutoUpdateMonolog(@NonNull Context context, @NonNull Intent intent, ConsumerCompat<String> activityFinisher) {
|
||||
super(context, activityFinisher);
|
||||
LanguageCollection.init(context);
|
||||
parseIntent(intent);
|
||||
|
|
@ -0,0 +1,199 @@
|
|||
package io.github.sspanak.tt9.ui.dialogs;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import io.github.sspanak.tt9.R;
|
||||
import io.github.sspanak.tt9.ime.helpers.Key;
|
||||
import io.github.sspanak.tt9.languages.Language;
|
||||
import io.github.sspanak.tt9.languages.LanguageCollection;
|
||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||
import io.github.sspanak.tt9.ui.LanguageRadioButton;
|
||||
import io.github.sspanak.tt9.ui.PopupBuilder;
|
||||
import io.github.sspanak.tt9.util.ConsumerCompat;
|
||||
import io.github.sspanak.tt9.util.sys.DeviceInfo;
|
||||
|
||||
public class ChangeLanguageDialog extends ThemedPopupDialog {
|
||||
public static final String TYPE = "tt9.popup_dialog.change_language";
|
||||
public static final String INTENT_SET_LANGUAGE = "tt9.popup_dialog.command.set_language";
|
||||
public static final String PARAMETER_LANGUAGE = "tt9.popup_dialog.parameter.language";
|
||||
public static final String PARAMETER_SEQUENCE = "tt9.popup_dialog.parameter.sequence";
|
||||
public static final String PARAMETER_WORD = "tt9.popup_dialog.parameter.word";
|
||||
|
||||
private final ConsumerCompat<HashMap<String, String>> activityFinisher;
|
||||
private final LayoutInflater inflater;
|
||||
private final ArrayList<Language> languages;
|
||||
private final SettingsStore settings;
|
||||
private final String currentSequence;
|
||||
private final String currentWord;
|
||||
|
||||
private final ArrayList<LanguageRadioButton> radioButtonsCache = new ArrayList<>();
|
||||
private Dialog popup;
|
||||
|
||||
|
||||
ChangeLanguageDialog(@NonNull AppCompatActivity context, @NonNull Intent intent, ConsumerCompat<HashMap<String, String>> activityFinisher) {
|
||||
super(context, null, R.style.TTheme_AddWord);
|
||||
|
||||
this.activityFinisher = activityFinisher;
|
||||
title = context.getResources().getString(R.string.language_popup_title);
|
||||
OKLabel = null;
|
||||
|
||||
inflater = context.getLayoutInflater();
|
||||
settings = new SettingsStore(context);
|
||||
languages = LanguageCollection.getAll(settings.getEnabledLanguageIds(), true);
|
||||
|
||||
currentSequence = intent.getStringExtra(PARAMETER_SEQUENCE);
|
||||
currentWord = intent.getStringExtra(PARAMETER_WORD);
|
||||
}
|
||||
|
||||
|
||||
private void onClick(View button) {
|
||||
changeLanguage(button.getId());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
|
||||
if (Key.isBack(keyCode)) {
|
||||
close();
|
||||
return true;
|
||||
}
|
||||
|
||||
int languageId = -1;
|
||||
|
||||
if (Key.isOK(keyCode)) {
|
||||
languageId = getSelected();
|
||||
} else if (Key.isNumber(keyCode)) {
|
||||
languageId = getByIndex(Key.codeToNumber(settings, keyCode) - 1);
|
||||
} else if (event.getAction() == KeyEvent.ACTION_UP && (keyCode == KeyEvent.KEYCODE_DPAD_DOWN || keyCode == KeyEvent.KEYCODE_DPAD_UP)) {
|
||||
for (LanguageRadioButton radio : radioButtonsCache) radio.autoHighlightCompat(); // yet another device hack
|
||||
}
|
||||
|
||||
if (languageId == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
changeLanguage(languageId);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private int getSelected() {
|
||||
for (LanguageRadioButton radio : radioButtonsCache) {
|
||||
if (radio.hasFocus()) {
|
||||
return radio.getId();
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
private int getByIndex(int index) {
|
||||
return (index < 0 || index >= languages.size()) ? -1 : languages.get(index).getId();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void close() {
|
||||
detachRadioButtons();
|
||||
if (popup != null) {
|
||||
popup.dismiss();
|
||||
popup = null;
|
||||
}
|
||||
activityFinisher.accept(null);
|
||||
}
|
||||
|
||||
|
||||
private void changeLanguage(int languageId) {
|
||||
detachRadioButtons();
|
||||
if (popup != null) {
|
||||
popup.dismiss();
|
||||
popup = null;
|
||||
}
|
||||
|
||||
if (activityFinisher != null) {
|
||||
HashMap<String, String> messages = new HashMap<>();
|
||||
messages.put(INTENT_SET_LANGUAGE, INTENT_SET_LANGUAGE);
|
||||
messages.put(PARAMETER_LANGUAGE, String.valueOf(languageId));
|
||||
messages.put(PARAMETER_SEQUENCE, currentSequence);
|
||||
messages.put(PARAMETER_WORD, currentWord);
|
||||
activityFinisher.accept(messages);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void detachRadioButtons() {
|
||||
for (LanguageRadioButton radio : radioButtonsCache) {
|
||||
radio.setOnClick(null);
|
||||
LinearLayout parent = (LinearLayout) radio.getParent();
|
||||
if (parent != null) {
|
||||
parent.removeView(radio);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private View generateRadioButtons() {
|
||||
final int currentLanguageId = settings.getInputLanguage();
|
||||
final View view = inflater.inflate(R.layout.popup_language_select, null);
|
||||
final LinearLayout radioGroup = view.findViewById(R.id.language_select_list);
|
||||
|
||||
radioButtonsCache.clear();
|
||||
|
||||
for (int i = 0, end = languages.size(); i < end; i++) {
|
||||
final String labelPrefix = DeviceInfo.noKeyboard(context) ? null : (i + 1) + ". ";
|
||||
|
||||
LanguageRadioButton radioButton = new LanguageRadioButton(context)
|
||||
.setOnClick(this::onClick)
|
||||
.setLanguage(languages.get(i), labelPrefix)
|
||||
.setChecked(languages.get(i).getId() == currentLanguageId);
|
||||
|
||||
radioButtonsCache.add(radioButton);
|
||||
radioGroup.addView(radioButton);
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
void render() {
|
||||
popup = new PopupBuilder(context)
|
||||
.setCancelable(false)
|
||||
.setTitle(title)
|
||||
.setMessage(message)
|
||||
.setNegativeButton(true, this::close)
|
||||
.setOnKeyListener(this)
|
||||
.setView(generateRadioButtons())
|
||||
.show();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open a popup dialog containing a list of the enabled languages. After a language is selected,
|
||||
* "currentSequence" and "currentWord" are passed back to the IME, in case it wants to recompose them.
|
||||
*/
|
||||
public static void show(InputMethodService ims, String currentSequence, String currentWord) {
|
||||
Intent intent = new Intent(ims, PopupDialogActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
|
||||
intent.putExtra(PARAMETER_DIALOG_TYPE, TYPE);
|
||||
intent.putExtra(PARAMETER_SEQUENCE, currentSequence);
|
||||
intent.putExtra(PARAMETER_WORD, currentWord);
|
||||
ims.startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +1,15 @@
|
|||
package io.github.sspanak.tt9.ui.dialogs;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import io.github.sspanak.tt9.ui.UI;
|
||||
import io.github.sspanak.tt9.ui.PopupBuilder;
|
||||
import io.github.sspanak.tt9.util.ConsumerCompat;
|
||||
|
||||
abstract public class PopupDialog {
|
||||
abstract public class PopupDialog implements DialogInterface.OnKeyListener {
|
||||
public static final String INTENT_CLOSE = "tt9.popup_dialog.close";
|
||||
public static final String PARAMETER_DIALOG_TYPE = "popup_type";
|
||||
|
||||
|
|
@ -29,8 +31,20 @@ abstract public class PopupDialog {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void render(Runnable OKAction) {
|
||||
UI.confirm(context, title, message, OKLabel, OKAction, true, () -> activityFinisher.accept(""), null);
|
||||
new PopupBuilder(context)
|
||||
.setCancelable(false)
|
||||
.setTitle(title)
|
||||
.setMessage(message)
|
||||
.setPositiveButton(OKLabel, OKAction)
|
||||
.setNegativeButton(true, () -> activityFinisher.accept(""))
|
||||
.setOnKeyListener(this)
|
||||
.show();
|
||||
}
|
||||
|
||||
abstract void render();
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ import android.os.Bundle;
|
|||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import io.github.sspanak.tt9.ime.TraditionalT9;
|
||||
import io.github.sspanak.tt9.util.Logger;
|
||||
|
||||
|
|
@ -33,7 +35,8 @@ public class PopupDialogActivity extends AppCompatActivity {
|
|||
|
||||
return switch (popupType) {
|
||||
case AddWordDialog.TYPE -> new AddWordDialog(this, i, this::onDialogClose);
|
||||
case AutoUpdateMonologue.TYPE -> new AutoUpdateMonologue(this, i, this::onDialogClose);
|
||||
case AutoUpdateMonolog.TYPE -> new AutoUpdateMonolog(this, i, this::onDialogClose);
|
||||
case ChangeLanguageDialog.TYPE -> new ChangeLanguageDialog(this, i, this::onDialogClose);
|
||||
default -> {
|
||||
Logger.w(LOG_TAG, "Unknown popup type: '" + popupType + "'. Not displaying anything.");
|
||||
yield null;
|
||||
|
|
@ -43,18 +46,30 @@ public class PopupDialogActivity extends AppCompatActivity {
|
|||
|
||||
private void onDialogClose(String message) {
|
||||
finish();
|
||||
sendMessageToMain(message);
|
||||
}
|
||||
|
||||
private void sendMessageToMain(String message) {
|
||||
Intent intent = new Intent(this, TraditionalT9.class);
|
||||
intent.putExtra(PopupDialog.INTENT_CLOSE, message);
|
||||
if (message != null) {
|
||||
intent.putExtra(PopupDialog.INTENT_CLOSE, message);
|
||||
}
|
||||
startService(intent);
|
||||
}
|
||||
|
||||
private void onDialogClose(HashMap<String, String> messages) {
|
||||
finish();
|
||||
Intent intent = new Intent(this, TraditionalT9.class);
|
||||
if (messages != null) {
|
||||
intent.putExtra(PopupDialog.INTENT_CLOSE, "");
|
||||
for (String key : messages.keySet()) {
|
||||
intent.putExtra(key, messages.get(key));
|
||||
}
|
||||
}
|
||||
|
||||
startService(intent);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
onDialogClose(null);
|
||||
onDialogClose((String) null);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
package io.github.sspanak.tt9.ui.dialogs;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import io.github.sspanak.tt9.R;
|
||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||
import io.github.sspanak.tt9.util.ConsumerCompat;
|
||||
import io.github.sspanak.tt9.util.ThemedContextBuilder;
|
||||
import io.github.sspanak.tt9.util.sys.DeviceInfo;
|
||||
|
||||
abstract class ThemedPopupDialog extends PopupDialog {
|
||||
ThemedPopupDialog(@NonNull Context context, ConsumerCompat<String> activityFinisher, int theme) {
|
||||
super(
|
||||
new ThemedContextBuilder()
|
||||
.setConfiguration(context.getApplicationContext().getResources().getConfiguration())
|
||||
.setContext(context)
|
||||
.setSettings(new SettingsStore(context))
|
||||
// The main theme does not work on Android <= 11 and the _AddWord theme does not work on 12+.
|
||||
// Not sure why since they inherit from the same parent, but it is what it is.
|
||||
.setTheme(DeviceInfo.AT_LEAST_ANDROID_12 ? R.style.TTheme : theme)
|
||||
.build(),
|
||||
activityFinisher
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ import androidx.core.app.NotificationCompat;
|
|||
|
||||
import io.github.sspanak.tt9.R;
|
||||
import io.github.sspanak.tt9.languages.Language;
|
||||
import io.github.sspanak.tt9.ui.dialogs.AutoUpdateMonologue;
|
||||
import io.github.sspanak.tt9.ui.dialogs.AutoUpdateMonolog;
|
||||
|
||||
public class DictionaryUpdateNotification extends DictionaryNotification {
|
||||
private final Language language;
|
||||
|
|
@ -25,7 +25,7 @@ public class DictionaryUpdateNotification extends DictionaryNotification {
|
|||
|
||||
@Override
|
||||
protected PendingIntent createNavigationIntent(@NonNull Context context, @Nullable Language language) {
|
||||
Intent intent = AutoUpdateMonologue.generateShowIntent(context, language != null ? language.getId() : -1);
|
||||
Intent intent = AutoUpdateMonolog.generateShowIntent(context, language != null ? language.getId() : -1);
|
||||
return PendingIntent.getActivity(context, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
}
|
||||
|
||||
|
|
|
|||
8
app/src/main/res/layout/popup_language_select.xml
Normal file
8
app/src/main/res/layout/popup_language_select.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fillViewport="true">
|
||||
|
||||
<LinearLayout style="@style/TTheme.LanguageSelect" android:id="@+id/language_select_list" />
|
||||
</ScrollView>
|
||||
20
app/src/main/res/layout/radio_button_language.xml
Normal file
20
app/src/main/res/layout/radio_button_language.xml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<LinearLayout
|
||||
style="@style/TTheme.LanguageSelect.RadioButton"
|
||||
android:id="@+id/radio_button_container"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true">
|
||||
|
||||
<RadioButton
|
||||
style="@style/TTheme.LanguageSelect.RadioButton.Radio"
|
||||
android:id="@+id/radio_button"
|
||||
android:clickable="false"
|
||||
android:focusableInTouchMode="false"
|
||||
android:focusable="false"
|
||||
/>
|
||||
|
||||
<TextView style="@style/TTheme.LanguageSelect.RadioButton.Label" android:id="@+id/radio_label" />
|
||||
|
||||
</LinearLayout>
|
||||
</merge>
|
||||
|
|
@ -31,6 +31,8 @@
|
|||
<string name="pref_predict_word_pairs">Запомняне на двойки думи</string>
|
||||
<string name="pref_predict_word_pairs_summary">Запомняй често ползвани фрази, за по-точно подсказване на думи.</string>
|
||||
<string name="pref_privacy_policy">Политика за поверителност</string>
|
||||
<string name="pref_quick_switch_language">Бързо превключване на езиците</string>
|
||||
<string name="pref_quick_switch_language_summary">Натискането на клавиша за език автоматично превключва към следващия език, вместо да показва изскачащ списък с всички активирани езици.</string>
|
||||
<string name="pref_status_icon">Икона за състояние</string>
|
||||
<string name="pref_status_icon_summary">Показвай икона, когато въвеждането с клавиатура е активно.</string>
|
||||
<string name="dictionary_cancel_load">Отмени зареждането</string>
|
||||
|
|
@ -194,6 +196,7 @@
|
|||
<string name="pref_backspace_acceleration">Бързо изтриване</string>
|
||||
<string name="pref_backspace_acceleration_summary">Изтривай цели думи при задържане или плъзване на Backspace. (Не работи в някои приложения.)</string>
|
||||
<string name="pref_category_punctuation_order">Ред на пунктуацията</string>
|
||||
<string name="language_popup_title">Изберете език</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Интервал и нов ред ще бъдат автоматично добавени в началото на списъка.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Липсва задължителен символ:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Липсват задължителни символи:%1$s</string>
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
<string name="pref_predict_word_pairs">Wortpaare lernen</string>
|
||||
<string name="pref_predict_word_pairs_summary">Häufig verwendete Phrasen merken, um die Genauigkeit der Vorschläge zu verbessern.</string>
|
||||
<string name="pref_privacy_policy">Datenschutzerklärung</string>
|
||||
<string name="pref_quick_switch_language_summary">Durch Drücken der Sprachentaste wird automatisch zur nächsten Sprache gewechselt, anstatt ein Popup mit allen aktivierten Sprachen anzuzeigen.</string>
|
||||
<string name="pref_status_icon">Statusicon</string>
|
||||
<string name="pref_status_icon_summary">Ein Icon anzeigen, wenn die Tastatureingabe aktiv ist.</string>
|
||||
<string name="pref_suggestion_font_size">Schriftgröße der Vorschläge</string>
|
||||
|
|
@ -183,6 +184,7 @@
|
|||
<string name="pref_backspace_acceleration">Schnelles Löschen</string>
|
||||
<string name="pref_backspace_acceleration_summary">Ganze Wörter löschen, indem Sie die Rücktaste gedrückt halten oder wischen. (Nicht in allen Apps unterstützt)</string>
|
||||
<string name="pref_category_punctuation_order">Interpunktionsreihenfolge</string>
|
||||
<string name="language_popup_title">Sprache auswählen</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Leer- und Zeilenumbruchzeichen werden automatisch am Anfang der Liste hinzugefügt.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Fehlendes erforderliches Zeichen:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Fehlende erforderliche Zeichen:%1$s</string>
|
||||
|
|
@ -227,4 +229,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Nur Tastencodes 1–8 sind erlaubt.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Eine Taste kann nicht in beiden Spalten platziert werden.</string>
|
||||
<string name="fn_key_order_column_1">Spalte 1</string>
|
||||
<string name="pref_quick_switch_language">Schneller Sprachwechsel</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@
|
|||
<string name="pref_predict_word_pairs">Aprender pares de palabras</string>
|
||||
<string name="pref_predict_word_pairs_summary">Recordar frases de uso común para mejorar las sugerencias de palabras.</string>
|
||||
<string name="pref_privacy_policy">Política de privacidad</string>
|
||||
<string name="pref_quick_switch_language_summary">Al presionar la tecla de idioma, se cambia automáticamente al siguiente idioma en lugar de mostrar una ventana emergente con todos los idiomas habilitados.</string>
|
||||
<string name="pref_status_icon">Icono de estado</string>
|
||||
<string name="pref_status_icon_summary">Mostrar un icono cuando la escritura esté activa.</string>
|
||||
<string name="dictionary_cancel_load">Cancelar la carga</string>
|
||||
|
|
@ -194,6 +195,7 @@
|
|||
<string name="pref_backspace_acceleration">Eliminación rápida</string>
|
||||
<string name="pref_backspace_acceleration_summary">Borrar palabras completas manteniendo pulsado o deslizando Retroceso. (No compatible con algunas aplicaciones)</string>
|
||||
<string name="pref_category_punctuation_order">Orden de puntuación</string>
|
||||
<string name="language_popup_title">Seleccionar idioma</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Los caracteres Espacio y Nueva línea se añadirán automáticamente al principio de la lista.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Falta carácter obligatorio:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Faltan caracteres obligatorios:%1$s</string>
|
||||
|
|
@ -225,4 +227,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Solo se permiten los códigos de tecla del 1 al 8.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Una tecla no puede colocarse en ambas columnas.</string>
|
||||
<string name="fn_key_order_column_1">Columna 1</string>
|
||||
<string name="pref_quick_switch_language">Cambio rápido de idioma</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
<string name="pref_predict_word_pairs">Mémoriser les paires de mots</string>
|
||||
<string name="pref_predict_word_pairs_summary">Apprendre des phrases couramment utilisées pour améliorer les suggestions.</string>
|
||||
<string name="pref_privacy_policy">Politique de confidentialité</string>
|
||||
<string name="pref_quick_switch_language_summary">Appuyer sur la touche de langue passe automatiquement à la langue suivante au lieu d\'afficher une fenêtre contextuelle avec toutes les langues activées.</string>
|
||||
<string name="pref_status_icon">Icône d\'état</string>
|
||||
<string name="pref_status_icon_summary">Afficher une icône lorsque la saisie au clavier est active</string>
|
||||
<string name="dictionary_cancel_load">Annuler le chargement</string>
|
||||
|
|
@ -192,6 +193,7 @@
|
|||
<string name="pref_backspace_acceleration">Suppression rapide</string>
|
||||
<string name="pref_backspace_acceleration_summary">Effacer des mots entiers en maintenant ou en glissant sur Retour arrière. (Non pris en charge dans certaines applications)</string>
|
||||
<string name="pref_category_punctuation_order">Ordre de ponctuation</string>
|
||||
<string name="language_popup_title">Sélectionner la langue</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Les caractères Espace et Retour à la ligne seront automatiquement ajoutés au début de la liste.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Caractère obligatoire manquant :%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Caractères obligatoires manquants :%1$s</string>
|
||||
|
|
@ -225,4 +227,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Seuls les codes de touche 1 à 8 sont autorisés.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Une touche ne peut pas être placée dans les deux colonnes.</string>
|
||||
<string name="fn_key_order_column_1">Colonne 1</string>
|
||||
<string name="pref_quick_switch_language">Changement rapide de langue</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@
|
|||
<string name="pref_predict_word_pairs">Memorizzare coppie di parole</string>
|
||||
<string name="pref_predict_word_pairs_summary">Ricordare frasi comunemente usate per migliorare i suggerimenti di parole.</string>
|
||||
<string name="pref_privacy_policy">Informativa sulla privacy</string>
|
||||
<string name="pref_quick_switch_language_summary">Premendo il tasto della lingua si passa automaticamente alla lingua successiva invece di mostrare un popup con tutte le lingue abilitate.</string>
|
||||
<string name="pref_status_icon">Icona di stato</string>
|
||||
<string name="pref_status_icon_summary">Mostrare un\'icona quando la digitazione è attiva.</string>
|
||||
<string name="dictionary_cancel_load">Annullare il caricamento</string>
|
||||
|
|
@ -181,6 +182,7 @@
|
|||
<string name="pref_backspace_acceleration">Cancellazione rapida</string>
|
||||
<string name="pref_backspace_acceleration_summary">Cancellare intere parole tenendo premuto o scorrendo Backspace. (Non supportato in alcune app)</string>
|
||||
<string name="pref_category_punctuation_order">Ordine di punteggiatura</string>
|
||||
<string name="language_popup_title">Seleziona la lingua</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">I caratteri Spazio e Nuova linea verranno automaticamente aggiunti all\'inizio dell\'elenco.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Carattere obbligatorio mancante:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Caratteri obbligatori mancanti:%1$s</string>
|
||||
|
|
@ -228,5 +230,6 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Sono consentiti solo i codici dei tasti da 1 a 8.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Un tasto non può essere inserito in entrambe le colonne.</string>
|
||||
<string name="fn_key_order_column_1">Colonna 1</string>
|
||||
<string name="pref_quick_switch_language">Cambio rapido lingua</string>
|
||||
</resources>
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@
|
|||
<string name="pref_predict_word_pairs">ללמוד צמדי מילים</string>
|
||||
<string name="pref_predict_word_pairs_summary">לזכור ביטויים נפוצים כדי לשפר את דיוק ההצעות.</string>
|
||||
<string name="pref_privacy_policy">מדיניות פרטיות</string>
|
||||
<string name="pref_quick_switch_language_summary">לחיצה על מקש השפה תעביר אוטומטית לשפה הבאה במקום להציג חלון קופץ עם כל השפות הפעילות.</string>
|
||||
<string name="pref_status_icon">סמל מצב</string>
|
||||
<string name="pref_status_icon_summary">הצגת סמל כאשר קלט המקלדת פעיל.</string>
|
||||
<string name="pref_suggestion_font_size">גודל גופן להצעות</string>
|
||||
|
|
@ -195,6 +196,7 @@
|
|||
<string name="pref_backspace_acceleration">מחיקה מהירה</string>
|
||||
<string name="pref_backspace_acceleration_summary">למחוק מילים שלמות על ידי החזקת Backspace או החלקה עליו. (לא נתמך בחלק מהאפליקציות)</string>
|
||||
<string name="pref_category_punctuation_order">סדר סימני פיסוק</string>
|
||||
<string name="language_popup_title">בחר שפה</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">תווי רווח ושורה חדשה יתווספו אוטומטית בתחילת הרשימה.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">תו חובה חסר: %1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">תווי חובה חסרים:%1$s</string>
|
||||
|
|
@ -232,4 +234,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">רק קודי מקשים 1–8 מותרים.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">לא ניתן למקם מקש אחד בשתי העמודות.</string>
|
||||
<string name="fn_key_order_column_1">עמודה 1</string>
|
||||
<string name="pref_quick_switch_language">החלפה מהירה של שפות</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@
|
|||
<string name="pref_predict_word_pairs">Išmokti žodžių poras</string>
|
||||
<string name="pref_predict_word_pairs_summary">Įsiminti dažnai naudojamas frazes, kad pagerintumėte žodžių pasiūlymus.</string>
|
||||
<string name="pref_privacy_policy">Privatumo politika</string>
|
||||
<string name="pref_quick_switch_language_summary">Paspaudus kalbos klavišą, automatiškai perjungiama į kitą kalbą, užuot rodžius iškylantį langą su visomis įjungtomis kalbomis.</string>
|
||||
<string name="pref_status_icon">Būsenos piktograma</string>
|
||||
<string name="pref_status_icon_summary">Rodyti piktogramą, kai aktyvus klaviatūros įvedimas</string>
|
||||
<string name="dictionary_cancel_load">Atšaukti įkėlimą</string>
|
||||
|
|
@ -203,6 +204,7 @@
|
|||
<string name="pref_backspace_acceleration">Greitas ištrynimas</string>
|
||||
<string name="pref_backspace_acceleration_summary">Ištrinti visus žodžius laikant arba perbraukiant Backspace. (Nepalaikoma kai kuriose programėlėse)</string>
|
||||
<string name="pref_category_punctuation_order">Skyrybos ženklų tvarka</string>
|
||||
<string name="language_popup_title">Pasirinkite kalbą</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Tarpas ir naujos eilutės simboliai bus automatiškai pridėti sąrašo pradžioje.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Trūksta privalomo simbolio:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Trūksta privalomų simbolių:%1$s</string>
|
||||
|
|
@ -234,4 +236,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Leidžiami tik klavišų kodai nuo 1 iki 8.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Vieno klavišo negalima dėti į abu stulpelius.</string>
|
||||
<string name="fn_key_order_column_1">Stulpelis 1</string>
|
||||
<string name="pref_quick_switch_language">Greitas kalbos keitimas</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
<string name="pref_predict_word_pairs">Woordenparen leren</string>
|
||||
<string name="pref_predict_word_pairs_summary">Veelgebruikte zinnen onthouden om de nauwkeurigheid van suggesties te verbeteren.</string>
|
||||
<string name="pref_privacy_policy">Privacybeleid</string>
|
||||
<string name="pref_quick_switch_language_summary">Door op de taaltoets te drukken, schakelt u automatisch naar de volgende taal in plaats van een pop-up met alle ingeschakelde talen weer te geven.</string>
|
||||
<string name="pref_status_icon">Statusicoon</string>
|
||||
<string name="pref_status_icon_summary">Een icoon tonen wanneer toetsenbordinvoer actief is.</string>
|
||||
<string name="pref_suggestion_font_size">Lettergrootte van suggesties</string>
|
||||
|
|
@ -183,6 +184,7 @@
|
|||
<string name="pref_backspace_acceleration">Snel verwijderen</string>
|
||||
<string name="pref_backspace_acceleration_summary">Hele woorden wissen door Backspace ingedrukt te houden of te vegen. (Niet ondersteund in sommige apps)</string>
|
||||
<string name="pref_category_punctuation_order">Interpunctievolgorde</string>
|
||||
<string name="language_popup_title">Selecteer taal</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Spatie- en nieuwe regeltekens worden automatisch aan het begin van de lijst toegevoegd.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Ontbrekend verplicht teken:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Ontbrekende verplichte tekens:%1$s</string>
|
||||
|
|
@ -226,4 +228,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Alleen toetscodes 1–8 zijn toegestaan.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Eén toets kan niet in beide kolommen staan.</string>
|
||||
<string name="fn_key_order_column_1">Kolom 1</string>
|
||||
<string name="pref_quick_switch_language">Snel schakelen tussen talen</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@
|
|||
<string name="pref_predict_word_pairs">Aprender pares de palavras</string>
|
||||
<string name="pref_predict_word_pairs_summary">Lembrar de frases comumente usadas para melhorar as sugestões de palavras.</string>
|
||||
<string name="pref_privacy_policy">Política de privacidade</string>
|
||||
<string name="pref_quick_switch_language_summary">Pressionar a tecla de idioma alterna automaticamente para o próximo idioma, em vez de mostrar um pop-up com todos os idiomas habilitados.</string>
|
||||
<string name="pref_status_icon">Ícone de status</string>
|
||||
<string name="pref_status_icon_summary">Mostrar um ícone quando a digitação estiver ativa.</string>
|
||||
<string name="dictionary_cancel_load">Cancelar Carregamento</string>
|
||||
|
|
@ -196,6 +197,7 @@
|
|||
<string name="pref_backspace_acceleration">Exclusão rápida</string>
|
||||
<string name="pref_backspace_acceleration_summary">Apagar palavras inteiras mantendo pressionado ou deslizando o Backspace. (Não suportado em alguns aplicativos)</string>
|
||||
<string name="pref_category_punctuation_order">Ordem de pontuação</string>
|
||||
<string name="language_popup_title">Selecione o idioma</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Os caracteres de Espaço e Nova linha serão automaticamente adicionados no início da lista.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Caractere obrigatório ausente:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Caracteres obrigatórios ausentes:%1$s</string>
|
||||
|
|
@ -232,4 +234,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Apenas os códigos de tecla de 1 a 8 são permitidos.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Uma tecla não pode estar nas duas colunas.</string>
|
||||
<string name="fn_key_order_column_1">Coluna 1</string>
|
||||
<string name="pref_quick_switch_language">Alternância rápida de idioma</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
<string name="pref_predict_word_pairs">Запоминать пары слов</string>
|
||||
<string name="pref_predict_word_pairs_summary">Запоминать часто используемые фразы для улучшения предложений слов.</string>
|
||||
<string name="pref_privacy_policy">Политика конфиденциальности</string>
|
||||
<string name="pref_quick_switch_language_summary">Нажатие клавиши языка автоматически переключает на следующий язык вместо отображения всплывающего окна со всеми включенными языками.</string>
|
||||
<string name="pref_status_icon">Иконка состояния</string>
|
||||
<string name="pref_status_icon_summary">Показывать иконку, когда активен режим ввода с клавиатуры.</string>
|
||||
<string name="dictionary_cancel_load">Отменить загрузку</string>
|
||||
|
|
@ -194,6 +195,7 @@
|
|||
<string name="pref_backspace_acceleration">Быстрое удаление</string>
|
||||
<string name="pref_backspace_acceleration_summary">Стереть целые слова, удерживая или проведя по клавише Backspace. (Не поддерживается в некоторых приложениях)</string>
|
||||
<string name="pref_category_punctuation_order">Порядок пунктуации</string>
|
||||
<string name="language_popup_title">Выберите язык</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Пробел и символ новой строки будут автоматически добавлены в начало списка.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Отсутствует обязательный символ:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Отсутствуют обязательные символы:%1$s</string>
|
||||
|
|
@ -225,4 +227,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Разрешены только коды клавиш от 1 до 8.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Одна клавиша не может находиться в обеих колонках.</string>
|
||||
<string name="fn_key_order_column_1">Столбец 1</string>
|
||||
<string name="pref_quick_switch_language">Быстрое переключение языков</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
<string name="pref_predict_word_pairs">Kelime çiftlerini öğren</string>
|
||||
<string name="pref_predict_word_pairs_summary">Öneri doğruluğunu artırmak için sık kullanılan ifadeleri hatırla.</string>
|
||||
<string name="pref_privacy_policy">Gizlilik politikası</string>
|
||||
<string name="pref_quick_switch_language_summary">Dil tuşuna basıldığında, etkin diller listesini göstermek yerine otomatik olarak bir sonraki dile geçilir.</string>
|
||||
<string name="pref_status_icon">Durum</string>
|
||||
<string name="pref_status_icon_summary">Klavye girişi etkin olduğunda bir simge göster.</string>
|
||||
<string name="dictionary_cancel_load">Yüklemeyi İptal Et</string>
|
||||
|
|
@ -196,6 +197,7 @@
|
|||
<string name="pref_backspace_acceleration">Hızlı Silme</string>
|
||||
<string name="pref_backspace_acceleration_summary">Geri tuşunu basılı tutarak veya kaydırarak tüm kelimeleri sil. (Bazı uygulamalarda desteklenmez)</string>
|
||||
<string name="pref_category_punctuation_order">Noktalama sırası</string>
|
||||
<string name="language_popup_title">Dil Seçin</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Boşluk ve Yeni Satır karakterleri listenin başına otomatik olarak eklenecektir.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Zorunlu karakter eksik:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Zorunlu karakterler eksik:%1$s</string>
|
||||
|
|
@ -230,4 +232,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Yalnızca 1–8 arası tuş kodlarına izin verilir.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Bir tuş her iki sütuna da yerleştirilemez.</string>
|
||||
<string name="fn_key_order_column_1">Sütun 1</string>
|
||||
<string name="pref_quick_switch_language">Hızlı dil geçişi</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@
|
|||
<string name="pref_predict_word_pairs">Запам’ятовувати пари слів</string>
|
||||
<string name="pref_predict_word_pairs_summary">Запам\'ятовувати часто вживані фрази для покращення пропозицій слів.</string>
|
||||
<string name="pref_privacy_policy">Політика конфіденційності</string>
|
||||
<string name="pref_quick_switch_language_summary">Натискання клавіші мови автоматично перемикає на наступну мову замість відображення спливаючого вікна з усіма активними мовами.</string>
|
||||
<string name="pref_status_icon">Іконка статусу</string>
|
||||
<string name="pref_status_icon_summary">Показати іконку, коли активне введення з клавіатури.</string>
|
||||
<string name="dictionary_cancel_load">Скасувати завантаження</string>
|
||||
|
|
@ -205,6 +206,7 @@
|
|||
<string name="pref_backspace_acceleration">Швидке видалення</string>
|
||||
<string name="pref_backspace_acceleration_summary">Видалити цілі слова, утримуючи або провівши клавішею Backspace. (Не підтримується в деяких додатках)</string>
|
||||
<string name="pref_category_punctuation_order">Порядок пунктуації</string>
|
||||
<string name="language_popup_title">Виберіть мову</string>
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Пробіл і символ нового рядка буде автоматично додано на початок списку.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Відсутній обов’язковий символ:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Відсутні обов’язкові символи:%1$s</string>
|
||||
|
|
@ -236,4 +238,5 @@
|
|||
<string name="fn_key_order_error_unsupported_key_code">Дозволено лише коди клавіш від 1 до 8.</string>
|
||||
<string name="fn_key_order_error_key_on_both_sides">Одна клавіша не може бути в обох стовпцях.</string>
|
||||
<string name="fn_key_order_column_1">Стовпець 1</string>
|
||||
<string name="pref_quick_switch_language">Швидке перемикання мов</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -25,6 +25,25 @@
|
|||
<item name="cornerRadius">8dp</item>
|
||||
</style>
|
||||
|
||||
<!--*******************************************
|
||||
Language Selection Dialog
|
||||
*******************************************-->
|
||||
|
||||
<style name="TTheme.LanguageSelect.RadioButton.Radio">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:paddingEnd">0dp</item>
|
||||
<item name="android:paddingStart">0dp</item>
|
||||
</style>
|
||||
|
||||
<style name="TTheme.LanguageSelect.RadioButton.Label">
|
||||
<item name="android:paddingTop">0dp</item>
|
||||
<item name="android:paddingBottom">0dp</item>
|
||||
<item name="android:paddingStart">0dp</item>
|
||||
<item name="android:paddingEnd">0dp</item>
|
||||
<item name="android:textAppearance">@style/TextAppearance.AppCompat.Widget.PopupMenu.Large</item>
|
||||
</style>
|
||||
|
||||
<!--*******************************************
|
||||
Preferences
|
||||
*******************************************-->
|
||||
|
|
|
|||
|
|
@ -102,6 +102,8 @@
|
|||
<string name="pref_predict_word_pairs">Learn Word Pairs</string>
|
||||
<string name="pref_predict_word_pairs_summary">Remember commonly used phrases to improve the suggestions accuracy.</string>
|
||||
<string name="pref_privacy_policy">Privacy Policy</string>
|
||||
<string name="pref_quick_switch_language">Quick Switch Languages</string>
|
||||
<string name="pref_quick_switch_language_summary">Pressing the Language key switches to the next language automatically, instead of showing a popup with all enabled languages.</string>
|
||||
<string name="pref_status_icon">Status Icon</string>
|
||||
<string name="pref_status_icon_summary">Show an icon when keyboard input is active.</string>
|
||||
<string name="pref_suggestion_font_size">Suggestion Font Size</string>
|
||||
|
|
@ -201,6 +203,8 @@
|
|||
<string name="language_selection_title">Enable Languages</string>
|
||||
<string name="language_selection_words">words</string>
|
||||
|
||||
<string name="language_popup_title">Select Language</string>
|
||||
|
||||
<string name="punctuation_order_whitespace_will_be_added_automatically">Space and Newline characters will be automatically added at the beginning of the list.</string>
|
||||
<string name="punctuation_order_mandatory_char_missing">Missing mandatory character:%1$s</string>
|
||||
<string name="punctuation_order_mandatory_chars_missing">Missing mandatory characters:%1$s</string>
|
||||
|
|
|
|||
|
|
@ -45,6 +45,45 @@
|
|||
<item name="android:background">@color/keyboard_wrapper_top_separator</item>
|
||||
</style>
|
||||
|
||||
<!--*******************************************
|
||||
Language Selection Dialog
|
||||
*******************************************-->
|
||||
|
||||
<style name="TTheme.LanguageSelect">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_marginTop">8dp</item>
|
||||
<item name="android:orientation">vertical</item>
|
||||
</style>
|
||||
|
||||
<style name="TTheme.LanguageSelect.RadioButton">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_marginTop">0dp</item>
|
||||
<item name="android:orientation">horizontal</item>
|
||||
<item name="android:paddingStart">24dp</item>
|
||||
<item name="android:paddingEnd">24dp</item>
|
||||
<item name="android:background">?attr/selectableItemBackground</item>
|
||||
</style>
|
||||
|
||||
<style name="TTheme.LanguageSelect.RadioButton.Radio">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:layout_marginTop">0dp</item>
|
||||
<item name="android:paddingTop">0dp</item>
|
||||
<item name="android:paddingBottom">0dp</item>
|
||||
<item name="android:paddingStart">0dp</item>
|
||||
<item name="android:paddingEnd">8dp</item>
|
||||
</style>
|
||||
|
||||
<style name="TTheme.LanguageSelect.RadioButton.Label">
|
||||
<item name="android:paddingStart">0dp</item>
|
||||
<item name="android:paddingEnd">0dp</item>
|
||||
<item name="android:paddingTop">12dp</item>
|
||||
<item name="android:paddingBottom">12dp</item>
|
||||
<item name="android:textAppearance">@style/TextAppearance.AppCompat.Widget.PopupMenu.Large</item>
|
||||
</style>
|
||||
|
||||
<!--*******************************************
|
||||
Small
|
||||
*******************************************-->
|
||||
|
|
|
|||
|
|
@ -29,6 +29,12 @@
|
|||
app:key="dictionary_truncate"
|
||||
app:title="@string/dictionary_truncate_title" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
app:defaultValue="true"
|
||||
app:key="pref_quick_switch_language"
|
||||
app:title="@string/pref_quick_switch_language"
|
||||
app:summary="@string/pref_quick_switch_language_summary" />
|
||||
|
||||
<PreferenceCategory
|
||||
app:title="@string/pref_category_custom_words"
|
||||
app:singleLineTitle="true">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue