chore(web): Merge branch 'chore/web/fixup-unit-test-fixups' into chore/web/merge-web-version-environment

This commit is contained in:
jahorton 2022-05-27 10:30:16 +07:00
commit 3855a25d26
188 changed files with 10730 additions and 398 deletions

View file

@ -1,5 +1,147 @@
# Keyman Version History
## 16.0.10 alpha 2022-05-15
* chore: beta to master A16S1 (#6614)
## 16.0.9 alpha 2022-04-29
* chore(common): merge beta to master B15S7 (Part 2) (#6579)
## 16.0.8 alpha 2022-04-17
* chore: merge beta to master B15S7 (#6537)
## 16.0.7 alpha 2022-04-07
* chore: beta to master B15S6 (#6490)
* fix(ios): use CFBundleShortVersionString for version (#6496)
## 16.0.6 alpha 2022-04-05
* chore(deps): bump ansi-regex from 3.0.0 to 3.0.1 in /web/testing/regression-tests (#6470)
* chore(deps-dev): bump minimist from 1.2.5 to 1.2.6 in /web/testing/regression-tests (#6471)
* chore(deps): bump minimist from 1.2.5 to 1.2.6 in /developer/server (#6472)
## 16.0.5 alpha 2022-04-04
* chore(common): beta to master B15S6 (#6467)
## 16.0.4 alpha 2022-03-22
* chore: B15S4 beta->alpha (#6402)
## 16.0.3 alpha 2022-03-16
* chore: merge beta changes to alpha B15S4 (#6376)
* chore(common/core/desktop): Improve meson build file (#6183)
## 16.0.2 alpha 2022-03-03
* chore(deps-dev): bump karma from 6.3.14 to 6.3.16 in /web/testing/regression-tests (#6322)
## 16.0.1 alpha 2022-03-02
* chore: move to 16.0 (#6318)
## 15.0.252 beta 2022-05-25
* fix(ios): fixes OSK mispositioning bug in iOS 15 (#6631)
## 15.0.251 beta 2022-05-23
* fix(ios): stops leaking memory on system keyboard rotation (#6552)
* fix(android/engine): Fix sticky long-press keys (#6637)
## 15.0.250 beta 2022-05-20
* feat(android/app): Provide haptic feedback when typing (#6626)
* fix(ios): disables transparent nav bar for ios 15 (#6633)
## 15.0.249 beta 2022-05-19
* chore(common): improve PR reporting of changes (#6624)
## 15.0.248 beta 2022-05-17
* fix(windows): use GlobalGetAtomName to access global list (#6580)
## 15.0.247 beta 2022-05-16
* chore(common/resources): Update langtags.json (#6594)
* fix(android/engine): Refresh OSK when changing spacebar text (#6620)
## 15.0.246 beta 2022-05-11
* chore(ios): Set transparent background on "more" icons (#6598)
* chore(common): Add crowdin strings for Polish (#6593)
## 15.0.245 beta 2022-05-10
* chore(common): Add crowdin strings for Italian (#6592)
## 15.0.244 beta 2022-05-09
* fix(windows): Don't reset defaults on Keyman upgrade (#6491)
## 15.0.243 beta 2022-05-03
* chore(web): report on file size (#6584)
* chore(android/engine): Ignore DownloadManager if ID not found (#6581)
* fix(common/models): prevents preemptive tokenization of potential contractions (#6574)
* fix(web): fixes fat-finger distrib when subkey selected (#6526)
## 15.0.242 beta 2022-04-29
* docs(windows): Update OS and whatsnew in help (#6560)
* fix(android/engine): Check suggestion banner after setting keyboard (#6559)
* chore(common): Update Crowdin strings for Fula (#6562)
## 15.0.241 beta 2022-04-27
* change(web): touch alias optimization followup (#6566)
* fix(common/core/web): Fix forEach loop in SentryManager (#6569)
* fix(linux): Fix shared keyboard (un-)installation in Bionic (#6565)
## 15.0.240 beta 2022-04-26
* feat(web): adds .getKeyboard().IsRTL, .HasLoaded (#6567)
* fix(android): Don't show welcome.htm on keyboard package update (#6555)
* fix(android/engine): Localize some Toast notifications (#6561)
## 15.0.239 beta 2022-04-22
* fix(web): optimizes, enhances caret placement within text on mobile devices (#6551)
## 15.0.238 beta 2022-04-21
* chore(linux): Fix failure in Debian reproducibility testing (#6548)
* chore(linux): Update Linux dependencies (#6549)
## 15.0.237 beta 2022-04-20
* feat(linux): WIP - implement capslock handling with Wayland (#6213)
## 15.0.236 beta 2022-04-19
* fix(android): key tip sticky with multitap (#6494)
* fix(web): blocks modifier key fat-fingering (#6473)
## 15.0.235 beta 2022-04-18
* chore(android,windows): Update crowdin strings for bwr-NG (#6532)
## 15.0.234 beta 2022-04-14
* chore(common): Add Crowdin strings for Portuguese (pt-PT) (#6509)
* chore(linux): Fix l10n language mappings (#6529)
* chore(linux): Update Debian changelog (#6530)
## 15.0.233 beta 2022-04-13
* chore(android/app): Add description for referrer response error (#6524)
* fix(linux): test fileVersion during package install (#6522)
## 15.0.232 beta 2022-04-11
* fix(linux): Remove tab completion warning (#6482)
@ -145,6 +287,9 @@
* change(web): tightens call signature for banner selection (#4966)
* fix(windows): cleanup edge cases in k32_load (#5197)
* feat(ios): refinement of spacebar-captioning PR (#5368)
## 15.0.205 alpha 2022-03-02
* fix(developer): move ngrok to Server/bin/ (#6304)
* fix(linux): Gracefully handle keyboard download failure (#6285)
* fix(linux): Gracefully handle makedirs failures (#6287)

View file

@ -1 +1 @@
beta
alpha

View file

@ -1 +1 @@
15.0.233
16.0.11

View file

@ -29,6 +29,7 @@ import com.android.installreferrer.api.InstallReferrerStateListener;
import com.android.installreferrer.api.ReferrerDetails;
import com.tavultesoft.kmapro.MainActivity;
import com.tavultesoft.kmapro.R;
import com.tavultesoft.kmea.KmpInstallMode;
import com.tavultesoft.kmea.util.KMLog;
import com.tavultesoft.kmea.util.KMString;
@ -79,6 +80,9 @@ public class CheckInstallReferrer {
// Connection couldn't be established; log to Sentry
KMLog.LogError(TAG, "onInstallReferrerSetupFinished:SERVICE_UNAVAILABLE");
break;
case InstallReferrerClient.InstallReferrerResponse.PERMISSION_ERROR:
KMLog.LogError(TAG, "onInstallReferrerSetupFinished.PERMISSION_ERROR");
break;
default:
// There are some other error codes; log to Sentry
KMLog.LogError(TAG, "onInstallReferrerSetupFinished: Unexpected code: " +

View file

@ -5,6 +5,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.ResultReceiver;
import com.tavultesoft.kmea.KmpInstallMode;
import com.tavultesoft.kmea.util.FileUtils;
import com.tavultesoft.kmea.util.KMLog;
@ -22,8 +23,7 @@ public class DownloadIntentService extends IntentService {
String filename = intent.getStringExtra("filename");
String destination = intent.getStringExtra("destination");
String languageID = intent.getStringExtra("language");
KmpInstallMode installMode = (KmpInstallMode) intent.getSerializableExtra("installMode");
if(installMode == null) installMode = KmpInstallMode.Full;
KmpInstallMode installMode = KmpInstallMode.fromString(intent.getStringExtra("installMode"));
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
Bundle bundle = new Bundle();
@ -34,7 +34,7 @@ public class DownloadIntentService extends IntentService {
bundle.putString("filename", filename);
bundle.putString("destination", destination);
bundle.putString("language", languageID);
bundle.putSerializable("installMode", installMode);
bundle.putString("installMode", installMode.toString());
receiver.send(FileUtils.DOWNLOAD_SUCCESS, bundle);
} else {
receiver.send(FileUtils.DOWNLOAD_CANCELLED, bundle);

View file

@ -1,8 +0,0 @@
package com.keyman.android;
public enum KmpInstallMode {
Silent, // Show no UI while installing a package. Errors may be shown as toasts
WelcomeOnly, // Show only the welcome screen after installing a package; language will
// be automatically selected if not provided as an input parameter
Full // Show readme, language picker (if applicable), and welcome after install.
}

View file

@ -69,6 +69,9 @@ public class SystemKeyboard extends InputMethodService implements OnKeyboardEven
KMManager.SpacebarText spacebarText = KMManager.SpacebarText.fromString(prefs.getString(KeymanSettingsActivity.spacebarTextKey, KMManager.SpacebarText.LANGUAGE_KEYBOARD.toString()));
KMManager.setSpacebarText(spacebarText);
boolean mayHaveHapticFeedback = prefs.getBoolean(KeymanSettingsActivity.hapticFeedbackKey, false);
KMManager.setHapticFeedback(mayHaveHapticFeedback);
KMManager.executeResourceUpdate(this);
}

View file

@ -10,8 +10,8 @@ import android.os.Handler;
import android.os.ResultReceiver;
import android.widget.Toast;
import com.keyman.android.KmpInstallMode;
import com.tavultesoft.kmea.BaseActivity;
import com.tavultesoft.kmea.KmpInstallMode;
import com.tavultesoft.kmea.util.FileUtils;
import java.io.File;
@ -36,13 +36,12 @@ public class DownloadResultReceiver extends ResultReceiver {
String downloadedFilename = resultData.getString("filename");
String languageID = resultData.getString("language");
String kmpFilename = resultData.getString("destination") + File.separator + downloadedFilename;
KmpInstallMode installMode = (KmpInstallMode) resultData.getSerializable("installMode");
if(installMode == null) installMode = KmpInstallMode.Full;
KmpInstallMode installMode = KmpInstallMode.fromString(resultData.getString("installMode"));
Bundle bundle = new Bundle();
bundle.putString("kmpFile", kmpFilename);
bundle.putString("language", languageID);
bundle.putSerializable("installMode", installMode);
bundle.putString("installMode", installMode.toString());
Intent packageIntent = new Intent(context, PackageActivity.class);
packageIntent.putExtras(bundle);
context.startActivity(packageIntent);

View file

@ -13,6 +13,7 @@ public class KeymanSettingsActivity extends BaseActivity {
protected static final String showBannerKey = "ShowBanner";
protected static final String sendCrashReport = "SendCrashReport";
public static final String spacebarTextKey = "SpacebarText";
public static final String hapticFeedbackKey = "HapticFeedback";
protected KeymanSettingsFragment innerFragment;

View file

@ -149,6 +149,21 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat {
}
});
SwitchPreference hapticFeedbackPreference = new SwitchPreference(context);
hapticFeedbackPreference.setKey(KeymanSettingsActivity.hapticFeedbackKey);
hapticFeedbackPreference.setTitle(getString(R.string.haptic_feedback));
hapticFeedbackPreference.setDefaultValue(false);
hapticFeedbackPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue == null) {
return false;
}
KMManager.setHapticFeedback((boolean)newValue);
return true;
}
});
/*
Automatically does the following:
SharedPreferences.Editor editor = prefs.edit();
@ -184,6 +199,7 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat {
screen.addPreference(adjustKeyboardHeight);
screen.addPreference(spacebarTextPreference);
screen.addPreference(hapticFeedbackPreference);
screen.addPreference(bannerPreference);
screen.addPreference(getStartedPreference);
screen.addPreference(sendCrashReportPreference);

View file

@ -18,12 +18,12 @@ import java.util.List;
import java.util.Map;
import com.keyman.android.CheckInstallReferrer;
import com.keyman.android.KmpInstallMode;
import com.tavultesoft.kmea.BaseActivity;
import com.tavultesoft.kmea.KMHelpFileActivity;
import com.tavultesoft.kmea.KMKeyboardDownloaderActivity;
import com.tavultesoft.kmea.KMManager;
import com.tavultesoft.kmea.KMManager.KeyboardType;
import com.tavultesoft.kmea.KmpInstallMode;
import com.tavultesoft.kmea.KMTextView;
import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardDownloadEventListener;
import com.tavultesoft.kmea.KeyboardEventHandler.OnKeyboardEventListener;
@ -184,6 +184,8 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
KMManager.SpacebarText spacebarText = KMManager.SpacebarText.fromString(prefs.getString(KeymanSettingsActivity.spacebarTextKey, KMManager.SpacebarText.LANGUAGE_KEYBOARD.toString()));
KMManager.setSpacebarText(spacebarText);
checkHapticFeedback();
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.titlebar);
@ -495,6 +497,7 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
* Parse the URI data to determine the filename and URL for the .kmp keyboard package.
* If URL is valid, download the kmp.
* @param packageUri URI to download the package.
* @param installMode KMP installation mode (silent, welcome only, or full)
* TODO: only ever pass packageId and bcp47 from callers, as KMPLink should be responsible for
* URL parsing, not this function.
*/
@ -540,7 +543,7 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
downloadIntent.putExtra("language", languageID);
downloadIntent.putExtra("destination", MainActivity.this.getCacheDir().toString());
downloadIntent.putExtra("receiver", resultReceiver);
downloadIntent.putExtra("installMode", installMode);
downloadIntent.putExtra("installMode", installMode.toString());
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage(String.format(getString(R.string.downloading_keyboard_package), filename));
@ -742,6 +745,12 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
KMManager.setMaySendCrashReport(maySendCrashReport);
}
private void checkHapticFeedback() {
SharedPreferences prefs = getSharedPreferences(getString(R.string.kma_prefs_name), Context.MODE_PRIVATE);
boolean mayHaveHapticFeedback = prefs.getBoolean(KeymanSettingsActivity.hapticFeedbackKey, false);
KMManager.setHapticFeedback(mayHaveHapticFeedback);
}
private void checkChromeVersion(WebView webView) {
if (KMManager.getEngineWebViewVersionStatus() != EngineWebViewVersionStatus.FULL) {
LinearLayout updateChromeLayout = (LinearLayout) findViewById(R.id.updateChromeLayout);
@ -926,6 +935,7 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
String packageID = null;
String customHelpLink = null;
KmpInstallMode installMode = KmpInstallMode.Full;
for (int i = 0; i < keyboardsInstalled.size(); i++) {
HashMap<String, String> hashMap = new HashMap<>(keyboardsInstalled.get(i));
String languageID = hashMap.get(KMManager.KMKey_LanguageID);
@ -942,6 +952,9 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
hashMap.get(KMManager.KMKey_Font),
hashMap.get(KMManager.KMKey_OskFont));
if (hashMap.containsKey(KMManager.KMKey_KMPInstall_Mode)) {
installMode = KmpInstallMode.fromString(hashMap.get(KMManager.KMKey_KMPInstall_Mode));
}
if (i == 0) {
packageID = keyboardInfo.getPackageID();
customHelpLink = keyboardInfo.getHelpLink();
@ -983,7 +996,7 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
}
// Display welcome.htm help file -- if we are not doing a silent install
if (PackageActivity.lastInstallMode != KmpInstallMode.Silent &&
if (installMode != KmpInstallMode.Silent &&
customHelpLink != null && !customHelpLink.isEmpty() &&
packageID != null && !packageID.isEmpty() && FileUtils.isWelcomeFile(customHelpLink)) {
// Display local welcome.htm help file, including associated assets
@ -993,10 +1006,6 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene
i.putExtra(KMManager.KMKey_CustomHelpLink, customHelpLink);
startActivity(i);
}
// We'll reset the global installMode flag now so that future package
// installs that don't go through PackageActivity are not affected.
PackageActivity.lastInstallMode = KmpInstallMode.Full;
}
@Override

View file

@ -16,11 +16,11 @@ import android.view.View;
import android.widget.Toast;
import com.keyman.android.KmpInstallMode;
import com.stepstone.stepper.StepperLayout;
import com.stepstone.stepper.VerificationError;
import com.tavultesoft.kmea.KMManager;
import com.tavultesoft.kmea.KeyboardEventHandler;
import com.tavultesoft.kmea.KmpInstallMode;
import com.tavultesoft.kmea.data.Keyboard;
import com.tavultesoft.kmea.packages.PackageProcessor;
import com.tavultesoft.kmea.packages.LexicalModelPackageProcessor;
@ -47,10 +47,6 @@ public class PackageActivity extends AppCompatActivity implements
private StepperLayout mStepperLayout;
private StepperAdapter mStepperAdapter;
// Due to the disconnection between the package install and the welcome
// display, this flag currently has to be globally accessible.
public static KmpInstallMode lastInstallMode = KmpInstallMode.Full;
@SuppressLint({"SetJavaScriptEnabled", "InflateParams"})
@Override
public void onCreate(Bundle savedInstanceState) {
@ -70,9 +66,7 @@ public class PackageActivity extends AppCompatActivity implements
showErrorToast(context, getString(R.string.failed_to_extract));
return;
}
installMode = (KmpInstallMode) bundle.getSerializable("installMode");
if(installMode == null) installMode = KmpInstallMode.Full;
lastInstallMode = installMode;
installMode = KmpInstallMode.fromString(bundle.getString("installMode"));
languageID = bundle.getString("language", null);
if (languageID != null && !languageID.isEmpty()) {
languageList.add(languageID);

View file

@ -151,4 +151,6 @@
<string name="no_associated_languages" comment="Notification when a keyboard package doesn't contain languages">Keyboard package aɗika hulfur mnyayeri natǝ kǝ kǝɓa kari natǝ mda ata hara instal wa</string>
<!-- Context: KMP Package strings -->
<string name="invalid_metadata" comment="kmp.json metadata file is invalid or missing in package">Metadata aɗi kalkal wa/ku sha akwa package</string>
<!-- Context: KMP Package strings -->
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> Keyboard requires a newer version of Keyman</string>
</resources>

View file

@ -18,6 +18,10 @@
<string name="action_install_updates" comment="Menu notification that keyboard or dictionary updates available">Aaf Kesɗitine</string>
<!-- Context: Title -->
<string name="title_version" comment="Title of Keyman for Android version">Yamre %1$s</string>
<!-- Context: Text label when old Chrome version installed -->
<string name="text_require_chrome_57" comment="Banner text when old version of Chrome is installed"> Keyman ena naamndii Chrome yamre 57 or walla ko ɓuri ɗum hesɗude.</string>
<!-- Context: Button label -->
<string name="button_update_chrome" comment="Prompt to upgrade Chrome in the Play Store">Hesɗitin Chrome</string>
<!-- Context: Textfield prompt (&#8230; is the ellipsis character "...") -->
<string name="textview_hint" comment="Prompt to start typing">Fuɗɗo tappude ɗoo&#8230;</string>
<!-- Context: Splash screen (version/copyright info currently disabled -->
@ -56,7 +60,27 @@
<!-- Context: Keyman Settings menu -->
<string name="install_keyboard_or_dictionary" comment="Menu item to install keyboard or dictionary">Aaf Tappirde walla Saggitorde</string>
<!-- Context: Keyman Settings menu -->
<string name="change_display_language" comment="Menu action to change interface language">Waylu ɗemngal jaytino</string>
<string name="change_display_language" comment="Menu action to change interface language">Hollu ɗemngal</string>
<!-- Context: Keyman Settings menu -->
<string name="adjust_keyboard_height" comment="Menu action to adjust keyboard height">Fonndit tooweendi tappirde</string>
<!-- Context: Keyman Settings menu -->
<string name="spacebar_caption" comment="Menu action to set the spacebar caption">Cifol palal boowe</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_keyboard" comment="Spacebar caption option - keyboard">Tappirde</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_language" comment="Spacebar caption option - language">Ɗemngal</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_language_keyboard" comment="Spacebar caption option - language + keyboard">Ɗemngal + Tappirde</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_blank" comment="Spacebar caption option - blank">Mehum</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_keyboard" comment="Spacebar caption hint - keyboard">Hollu innde tappirde e palal boowe</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_language" comment="Spacebar caption hint - language">Hollu innde ɗemngal e palal boowe</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_language_keyboard" comment="Spacebar caption hint - language + keyboard">Ɗemngal e tappirɗe e palal boowe</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_blank" comment="Spacebar caption hint - blank">Hoto hollu cifol e palal boowe</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner" comment="text suggestions banner">Hollu beywal sahaa kala</string>
<!-- Context: Keyman Settings menu -->
@ -87,6 +111,12 @@
<string name="added_language_to_keyboard" comment="Notification that a language name is added to a keyboard">Ɓeydii ɗemngal %1$s e %2$s</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="all_languages_installed" comment="Text when all languages from a keyboard package have been installed">Ɗemɗe fof aafaama kisa</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="drag_the_keyboard" comment="First line of adjusting keyboard height">Daas tappirde ndee ngam waylude tooweendi</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="rotate_the_device" comment="Second line of adjusting keyboard height">Yiiltu kaɓirgol ngol ngam fotndude naddaro e leddaro</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="reset_to_defaults" comment="Button to reset to default heights">Artir e Goowaaɗe</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_text" comment="Prompt to type in the browser search bar">Yiylo walla tappu URL</string>
<!-- Context: Keyman Web Browser -->
@ -121,4 +151,6 @@
<string name="no_associated_languages" comment="Notification when a keyboard package doesn't contain languages">Kaɓɓol tappirɗe alaa ɗemngal jahdowal aafeteengal</string>
<!-- Context: KMP Package strings -->
<string name="invalid_metadata" comment="kmp.json metadata file is invalid or missing in package">Metaakeɓe ena ŋakki/njaalɗaani e kaɓɓol</string>
<!-- Context: KMP Package strings -->
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman">Tappirde ena naamndii yamre Keyman ɓurnde hesɗude</string>
</resources>

View file

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Context: Menu Action -->
<string name="action_share" comment="Menu action to send text content to another app">Condividi</string>
<!-- Context: Menu Action -->
<string name="action_web" comment="Menu action to open Keyman browser">Browser Web</string>
<!-- Context: Menu Action -->
<string name="action_text_size" comment="Menu action to adjust text size">Dimensione Testo</string>
<!-- Context: Menu Action -->
<string name="action_overflow" comment="Show additional menu items">Altro</string>
<!-- Context: Menu Action -->
<string name="action_clear_text" comment="Menu action to erase text">Cancella Testo</string>
<!-- Context: Menu Action -->
<string name="action_info" comment="Menu action to display Keyman help page">Informazioni</string>
<!-- Context: Menu Action -->
<string name="action_settings" comment="Menu action to open Settings menu">Impostazioni</string>
<!-- Context: Menu Action -->
<string name="action_install_updates" comment="Menu notification that keyboard or dictionary updates available">Installa Aggiornamenti</string>
<!-- Context: Title -->
<string name="title_version" comment="Title of Keyman for Android version">Versione: %1$s</string>
<!-- Context: Text label when old Chrome version installed -->
<string name="text_require_chrome_57" comment="Banner text when old version of Chrome is installed"> Keyman richiede la versione 57 di Chrome o superiore.</string>
<!-- Context: Button label -->
<string name="button_update_chrome" comment="Prompt to upgrade Chrome in the Play Store">Aggiorna Chrome</string>
<!-- Context: Textfield prompt (&#8230; is the ellipsis character "...") -->
<string name="textview_hint" comment="Prompt to start typing">Inizia a digitare qui&#8230;</string>
<!-- Context: Splash screen (version/copyright info currently disabled -->
<!-- Context: Splash screen (version/copyright info currently disabled -->
<!-- Context: Text Size dialog -->
<string name="text_size" comment="Current text size (number)">Dimensione testo: %1$d</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_up" comment="Make text bigger">Dimensione testo in alto</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_down" comment="Make text smaller">Dimensione del testo giù</string>
<!-- Context: Clear Text dialog -->
<string name="all_text_will_be_cleared" comment="Erase all the text">\nTutto il testo sarà cancellato\n</string>
<!-- Context: Get Started menu -->
<string name="get_started" comment="Menu for getting started">Per Iniziare</string>
<!-- Context: Get Started menu -->
<string name="add_a_keyboard" comment="Menu item to add a keyboard">Aggiungi una tastiera per la tua lingua</string>
<!-- Context: Get Started menu -->
<string name="enable_system_keyboard" comment="Menu item to enable Keyman as system keyboard">Abilita Keyman come tastiera di sistema</string>
<!-- Context: Get Started menu -->
<string name="set_keyman_as_default" comment="Menu item to set Keyman as default system keyboard">Imposta Keyman come tastiera predefinita</string>
<!-- Context: Get Started menu -->
<string name="more_info" comment="Open the Keyman for Android help page">Maggiori informazioni</string>
<!-- Context: Get Started menu -->
<string name="show_get_started" comment="Show the &quot;Get Started&quot; menu on startup">Mostra \"%1$s\" all\'avvio</string>
<!-- Context: Android Storage Permission -->
<string name="request_storage_permission" comment="Request storage permission to access keyboard packages"> Per installare pacchetti di tastiera, consentire a Keyman di leggere la memoria esterna.</string>
<!-- Context: Android Storage Permission -->
<string name="storage_permission_denied" comment="Keyboard package installation may fail since Android storage permission not granted"> La richiesta di autorizzazione all\'archiviazione è stata negata. Potrebbe non essere stato possibile installare il pacchetto tastiera</string>
<!-- Context: Keyman Settings menu -->
<string name="keyman_settings" comment="Settings menu title">Impostazioni</string>
<!-- Context: Keyman Settings menu -->
<plurals name="installed_languages">
<item quantity="one">Lingue installate (%1$d)</item>
<item quantity="other">Lingue installate (%1$d)</item>
</plurals>
<!-- Context: Keyman Settings menu -->
<string name="install_keyboard_or_dictionary" comment="Menu item to install keyboard or dictionary">Installa tastiera o dizionario</string>
<!-- Context: Keyman Settings menu -->
<string name="change_display_language" comment="Menu action to change interface language">Visualizza lingua</string>
<!-- Context: Keyman Settings menu -->
<string name="adjust_keyboard_height" comment="Menu action to adjust keyboard height">Regola altezza tastiera</string>
<!-- Context: Keyman Settings menu -->
<string name="spacebar_caption" comment="Menu action to set the spacebar caption">Didascalia barra spaziatrice</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_keyboard" comment="Spacebar caption option - keyboard">Keyboard</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_language" comment="Spacebar caption option - language">Lingua</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_language_keyboard" comment="Spacebar caption option - language + keyboard">Lingua + Tastiera</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_blank" comment="Spacebar caption option - blank">Vuoto</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_keyboard" comment="Spacebar caption hint - keyboard">Mostra il nome della tastiera nella barra spaziatrice</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_language" comment="Spacebar caption hint - language">Mostra il nome della lingua nella barra spaziatrice</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_language_keyboard" comment="Spacebar caption hint - language + keyboard">Lingua e tastiera nella barra spaziatrice</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_blank" comment="Spacebar caption hint - blank">Non mostrare la didascalia sulla barra spaziatrice</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner" comment="text suggestions banner">Mostra sempre il banner</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner_on" comment="Description when toggle is on">Da attuare</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner_off" comment="Description when toggle is off">Quando è spento, mostrato solo quando il testo predittivo è abilitato</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report" comment="permission for sending crash reports">Consenti l\'invio di segnalazioni di crash attraverso la rete</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report_on" comment="Description when toggle is on">Quando acceso, verranno inviate segnalazioni di crash</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report_off" comment="Description when toggle is off">Quando è spento, i report dei crash non verranno inviati</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_keyman_dot_com" comment="Install package from Keyman server">Installa da keyman.com</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_local_file" comment="Install package file from local device">Installa da file locale</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_other_device" comment="Scan QR Code">Installa da un altro dispositivo</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="add_languages_to_installed_keyboard" comment="Install additional languages from a keyboard package">Aggiungi lingue alla tastiera installata</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="add_language_subtext" comment="Additional information for adding another language">(dal pacchetto della tastiera)</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="title_select_keyboard_package_list" comment="Select a keyboard package to add languages">Seleziona Pacchetto Tastiera</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="title_select_languages_for_package" comment="Select language names from the keyboard package">Seleziona le lingue per %1$s</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="added_language_to_keyboard" comment="Notification that a language name is added to a keyboard">Aggiunta lingua %1$s a %2$s</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="all_languages_installed" comment="Text when all languages from a keyboard package have been installed">Tutte le lingue già installate</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="drag_the_keyboard" comment="First line of adjusting keyboard height">Trascina la tastiera per ridimensionare l\'altezza</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="rotate_the_device" comment="Second line of adjusting keyboard height">Ruota il dispositivo per regolare verticale e orizzontale</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="reset_to_defaults" comment="Button to reset to default heights">Ripristina impostazioni predefinite</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_text" comment="Prompt to type in the browser search bar">Cerca o digita URL</string>
<!-- Context: Keyman Web Browser -->
<string name="title_bookmarks" comment="Title for bookmarks">Segnalibri</string>
<!-- Context: Keyman Web Browser -->
<string name="no_bookmarks" comment="Text when bookmark list is empty">Nessun Segnalibro</string>
<!-- Context: Keyman Web Browser -->
<string name="add_bookmark" comment="Confirmation to add bookmark">Aggiungi Segnalibro</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_title" comment="Page title for saved bookmark">Titolo</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_url" comment="Page URL for saved bookmark">Url</string>
<!-- Context: KMP Package strings -->
<string name="title_package_failed_to_install" comment="Error dialog title when package failed to install">Impossibile installare il pacchetto %1$s</string>
<!-- Context: KMP Package strings -->
<string name="downloading_keyboard_package" comment="Confirmation to download keyboard package filename">Scaricamento pacchetto tastiera\n%1$s&#8230;</string>
<!-- Context: KMP Package strings -->
<string name="failed_to_extract" comment="Notification that keyboard package failed to unzip">Impossibile estrarre</string>
<!-- Context: KMP Package strings -->
<string name="install_keyboard_package" comment="Title to install keyboard package">Installa Tastiera</string>
<!-- Context: KMP Package strings -->
<string name="install_predictive_text_package" comment="Title to install dictionary package">Installa Dizionario</string>
<!-- Context: KMP Package strings -->
<string name="not_valid_package_file" comment="Notification when invalid package file cannot be installed">%1$s non è un file di pacchetto Keyman valido.\n%2$s\"</string>
<!-- Context: KMP Package strings -->
<string name="no_new_touch_keyboards_to_install" comment="Notification when no touch-optimized keyboards can be installed">Il pacchetto tastiera non ha tastiere ottimizzate al tocco da installare</string>
<!-- Context: KMP Package strings -->
<string name="no_new_predictive_text_to_install" comment="Notification when no dictionaries can be installed">Nessun nuovo testo predittivo da installare</string>
<!-- Context: KMP Package strings -->
<string name="no_targets_to_install" comment="Notification when a package doesn't contain keyboards or dictionaries">Nessuna tastiera o testo predittivo da installare</string>
<!-- Context: KMP Package strings -->
<string name="no_associated_languages" comment="Notification when a keyboard package doesn't contain languages">Il pacchetto tastiera non ha lingue associate da installare</string>
<!-- Context: KMP Package strings -->
<string name="invalid_metadata" comment="kmp.json metadata file is invalid or missing in package">Metadati non validi/mancanti nel pacchetto</string>
<!-- Context: KMP Package strings -->
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> Keyboard requires a newer version of Keyman</string>
</resources>

View file

@ -0,0 +1,158 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Context: Menu Action -->
<string name="action_share" comment="Menu action to send text content to another app">Udostępnij</string>
<!-- Context: Menu Action -->
<string name="action_web" comment="Menu action to open Keyman browser">Przeglądarka internetowa</string>
<!-- Context: Menu Action -->
<string name="action_text_size" comment="Menu action to adjust text size">Rozmiar tekstu</string>
<!-- Context: Menu Action -->
<string name="action_overflow" comment="Show additional menu items">Więcej</string>
<!-- Context: Menu Action -->
<string name="action_clear_text" comment="Menu action to erase text">Wyczyść tekst</string>
<!-- Context: Menu Action -->
<string name="action_info" comment="Menu action to display Keyman help page">Informacja</string>
<!-- Context: Menu Action -->
<string name="action_settings" comment="Menu action to open Settings menu">Ustawienia</string>
<!-- Context: Menu Action -->
<string name="action_install_updates" comment="Menu notification that keyboard or dictionary updates available">Zainstaluj aktualizację</string>
<!-- Context: Title -->
<string name="title_version" comment="Title of Keyman for Android version">Wersja: %1$s</string>
<!-- Context: Text label when old Chrome version installed -->
<string name="text_require_chrome_57" comment="Banner text when old version of Chrome is installed"> Keyman wymaga wersji Chrome 57 lub nowszej.</string>
<!-- Context: Button label -->
<string name="button_update_chrome" comment="Prompt to upgrade Chrome in the Play Store">Aktualizuj Chrome</string>
<!-- Context: Textfield prompt (&#8230; is the ellipsis character "...") -->
<string name="textview_hint" comment="Prompt to start typing">Zacznij wpisywać tutaj&#8230;</string>
<!-- Context: Splash screen (version/copyright info currently disabled -->
<!-- Context: Splash screen (version/copyright info currently disabled -->
<!-- Context: Text Size dialog -->
<string name="text_size" comment="Current text size (number)">Rozmiar tekstu: %1$d</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_up" comment="Make text bigger">Zwiększ rozmiar tekstu</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_down" comment="Make text smaller">Zmniejsz rozmiar tekstu</string>
<!-- Context: Clear Text dialog -->
<string name="all_text_will_be_cleared" comment="Erase all the text">\nCały tekst zostanie wyczyszczony\n</string>
<!-- Context: Get Started menu -->
<string name="get_started" comment="Menu for getting started">Zacznij</string>
<!-- Context: Get Started menu -->
<string name="add_a_keyboard" comment="Menu item to add a keyboard">Dodaj klawiaturę dla Twojego języka</string>
<!-- Context: Get Started menu -->
<string name="enable_system_keyboard" comment="Menu item to enable Keyman as system keyboard">Włącz klawiaturę jako klawiaturę systemową</string>
<!-- Context: Get Started menu -->
<string name="set_keyman_as_default" comment="Menu item to set Keyman as default system keyboard">Ustaw Keyman jako domyślną klawiaturę</string>
<!-- Context: Get Started menu -->
<string name="more_info" comment="Open the Keyman for Android help page">Więcej informacji</string>
<!-- Context: Get Started menu -->
<string name="show_get_started" comment="Show the &quot;Get Started&quot; menu on startup">Pokaż \"%1$s\" przy starcie</string>
<!-- Context: Android Storage Permission -->
<string name="request_storage_permission" comment="Request storage permission to access keyboard packages"> Aby zainstalować pakiety klawiatury, zezwól Keyman na odczyt pamięci zewnętrznej.</string>
<!-- Context: Android Storage Permission -->
<string name="storage_permission_denied" comment="Keyboard package installation may fail since Android storage permission not granted"> Żądanie dostępu do pamięci masowej zostało odrzucone. Może nie zainstalować pakietu klawiatury</string>
<!-- Context: Keyman Settings menu -->
<string name="keyman_settings" comment="Settings menu title">Ustawienia</string>
<!-- Context: Keyman Settings menu -->
<plurals name="installed_languages">
<item quantity="one">Zainstalowany język (%1$d)</item>
<item quantity="few">Zainstalowane języki (%1$d)</item>
<item quantity="many">Zainstalowane języki (%1$d)</item>
<item quantity="other">Zainstalowane języki (%1$d)</item>
</plurals>
<!-- Context: Keyman Settings menu -->
<string name="install_keyboard_or_dictionary" comment="Menu item to install keyboard or dictionary">Zainstaluj klawiaturę lub słownik</string>
<!-- Context: Keyman Settings menu -->
<string name="change_display_language" comment="Menu action to change interface language">Wyświetl język</string>
<!-- Context: Keyman Settings menu -->
<string name="adjust_keyboard_height" comment="Menu action to adjust keyboard height">Dostosuj wysokość klawiatury</string>
<!-- Context: Keyman Settings menu -->
<string name="spacebar_caption" comment="Menu action to set the spacebar caption">Podpis paska spacji</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_keyboard" comment="Spacebar caption option - keyboard">Keyboard</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_language" comment="Spacebar caption option - language">Język</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_language_keyboard" comment="Spacebar caption option - language + keyboard">Język + Klawiatura</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_blank" comment="Spacebar caption option - blank">Puste</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_keyboard" comment="Spacebar caption hint - keyboard">Pokaż nazwę klawiatury na spacji</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_language" comment="Spacebar caption hint - language">Pokaż nazwę języka na spacji</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_language_keyboard" comment="Spacebar caption hint - language + keyboard">Język i klawiatura na pasku kosmicznym</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_blank" comment="Spacebar caption hint - blank">Nie pokazuj podpisu na spacji</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner" comment="text suggestions banner">Zawsze pokazuj baner</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner_on" comment="Description when toggle is on">Do wdrożenia</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner_off" comment="Description when toggle is off">Gdy wyłączone, wyświetlane tylko gdy tekst predykcyjny jest włączony</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report" comment="permission for sending crash reports">Zezwalaj na wysyłanie raportów o awariach przez sieć</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report_on" comment="Description when toggle is on">Kiedy włączone, raporty awarii zostaną wysłane</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report_off" comment="Description when toggle is off">Gdy wyłączone, raporty awarii nie zostaną wysłane</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_keyman_dot_com" comment="Install package from Keyman server">Zainstaluj z keyman.com</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_local_file" comment="Install package file from local device">Zainstaluj z pliku lokalnego</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_other_device" comment="Scan QR Code">Zainstaluj z innego urządzenia</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="add_languages_to_installed_keyboard" comment="Install additional languages from a keyboard package">Dodaj języki do zainstalowanej klawiatury</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="add_language_subtext" comment="Additional information for adding another language">(z pakietu klawiatury)</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="title_select_keyboard_package_list" comment="Select a keyboard package to add languages">Wybierz pakiet klawiatury</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="title_select_languages_for_package" comment="Select language names from the keyboard package">Wybierz języki dla %1$s</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="added_language_to_keyboard" comment="Notification that a language name is added to a keyboard">Dodano język %1$s do %2$s</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="all_languages_installed" comment="Text when all languages from a keyboard package have been installed">Wszystkie języki są już zainstalowane</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="drag_the_keyboard" comment="First line of adjusting keyboard height">Przeciągnij klawiaturę, aby zmienić wysokość</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="rotate_the_device" comment="Second line of adjusting keyboard height">Obróć urządzenie, aby dostosować pionowo i poziomo</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="reset_to_defaults" comment="Button to reset to default heights">Przywróć domyślne</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_text" comment="Prompt to type in the browser search bar">Wyszukaj lub wpisz adres URL</string>
<!-- Context: Keyman Web Browser -->
<string name="title_bookmarks" comment="Title for bookmarks">Zakładki</string>
<!-- Context: Keyman Web Browser -->
<string name="no_bookmarks" comment="Text when bookmark list is empty">Brak zakładek</string>
<!-- Context: Keyman Web Browser -->
<string name="add_bookmark" comment="Confirmation to add bookmark">Dodaj zakładkę</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_title" comment="Page title for saved bookmark">Tytuł</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_url" comment="Page URL for saved bookmark">Adres Url</string>
<!-- Context: KMP Package strings -->
<string name="title_package_failed_to_install" comment="Error dialog title when package failed to install">Pakiet %1$s nie został zainstalowany</string>
<!-- Context: KMP Package strings -->
<string name="downloading_keyboard_package" comment="Confirmation to download keyboard package filename">Pobieranie pakietu klawiatury\n%1$s&#8230;</string>
<!-- Context: KMP Package strings -->
<string name="failed_to_extract" comment="Notification that keyboard package failed to unzip">Nie udało się wyodrębnić</string>
<!-- Context: KMP Package strings -->
<string name="install_keyboard_package" comment="Title to install keyboard package">Zainstaluj klawiaturę</string>
<!-- Context: KMP Package strings -->
<string name="install_predictive_text_package" comment="Title to install dictionary package">Zainstaluj Słownik</string>
<!-- Context: KMP Package strings -->
<string name="not_valid_package_file" comment="Notification when invalid package file cannot be installed">%1$s nie jest prawidłowym plikiem pakietu Keyman.\n%2$s\"</string>
<!-- Context: KMP Package strings -->
<string name="no_new_touch_keyboards_to_install" comment="Notification when no touch-optimized keyboards can be installed">Pakiet klawiatury nie ma zoptymalizowanego dotyku klawiatury do zainstalowania</string>
<!-- Context: KMP Package strings -->
<string name="no_new_predictive_text_to_install" comment="Notification when no dictionaries can be installed">Brak nowego predykcyjnego tekstu do zainstalowania</string>
<!-- Context: KMP Package strings -->
<string name="no_targets_to_install" comment="Notification when a package doesn't contain keyboards or dictionaries">Brak klawiatury lub tekstu predykcyjnego do zainstalowania</string>
<!-- Context: KMP Package strings -->
<string name="no_associated_languages" comment="Notification when a keyboard package doesn't contain languages">Pakiet klawiatury nie ma powiązanych języków do zainstalowania</string>
<!-- Context: KMP Package strings -->
<string name="invalid_metadata" comment="kmp.json metadata file is invalid or missing in package">Niepoprawne/brakujące metadane w pakiecie</string>
<!-- Context: KMP Package strings -->
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> Keyboard requires a newer version of Keyman</string>
</resources>

View file

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Context: Menu Action -->
<string name="action_share" comment="Menu action to send text content to another app">Compartilhar</string>
<!-- Context: Menu Action -->
<string name="action_web" comment="Menu action to open Keyman browser">Navegador da Web</string>
<!-- Context: Menu Action -->
<string name="action_text_size" comment="Menu action to adjust text size">Tamanho do Texto</string>
<!-- Context: Menu Action -->
<string name="action_overflow" comment="Show additional menu items">MAIS</string>
<!-- Context: Menu Action -->
<string name="action_clear_text" comment="Menu action to erase text">Limpar Texto</string>
<!-- Context: Menu Action -->
<string name="action_info" comment="Menu action to display Keyman help page">Info</string>
<!-- Context: Menu Action -->
<string name="action_settings" comment="Menu action to open Settings menu">Configurações</string>
<!-- Context: Menu Action -->
<string name="action_install_updates" comment="Menu notification that keyboard or dictionary updates available">Instalar Atualizações</string>
<!-- Context: Title -->
<string name="title_version" comment="Title of Keyman for Android version">Versão: %1$s</string>
<!-- Context: Text label when old Chrome version installed -->
<string name="text_require_chrome_57" comment="Banner text when old version of Chrome is installed"> O Keyman requer a versão 57 ou mais recente.</string>
<!-- Context: Button label -->
<string name="button_update_chrome" comment="Prompt to upgrade Chrome in the Play Store">Atualizar Chrome</string>
<!-- Context: Textfield prompt (&#8230; is the ellipsis character "...") -->
<string name="textview_hint" comment="Prompt to start typing">Comece a digitar aqui&#8230;</string>
<!-- Context: Splash screen (version/copyright info currently disabled -->
<!-- Context: Splash screen (version/copyright info currently disabled -->
<!-- Context: Text Size dialog -->
<string name="text_size" comment="Current text size (number)">Tamanho do texto: %1$d</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_up" comment="Make text bigger">Tamanho do texto para cima</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_down" comment="Make text smaller">Tamanho do texto para baixo</string>
<!-- Context: Clear Text dialog -->
<string name="all_text_will_be_cleared" comment="Erase all the text">\nTodo o texto será limpo\n</string>
<!-- Context: Get Started menu -->
<string name="get_started" comment="Menu for getting started">Comece Agora</string>
<!-- Context: Get Started menu -->
<string name="add_a_keyboard" comment="Menu item to add a keyboard">Adicione um teclado para o seu idioma</string>
<!-- Context: Get Started menu -->
<string name="enable_system_keyboard" comment="Menu item to enable Keyman as system keyboard">Habilitar Keyman como teclado de todo o sistema</string>
<!-- Context: Get Started menu -->
<string name="set_keyman_as_default" comment="Menu item to set Keyman as default system keyboard">Definir Keyman como teclado padrão</string>
<!-- Context: Get Started menu -->
<string name="more_info" comment="Open the Keyman for Android help page">Mais informações</string>
<!-- Context: Get Started menu -->
<string name="show_get_started" comment="Show the &quot;Get Started&quot; menu on startup">Mostrar \"%1$s\" na inicialização</string>
<!-- Context: Android Storage Permission -->
<string name="request_storage_permission" comment="Request storage permission to access keyboard packages"> Para instalar pacotes de teclado, permita que o Keyman leia o armazenamento externo.</string>
<!-- Context: Android Storage Permission -->
<string name="storage_permission_denied" comment="Keyboard package installation may fail since Android storage permission not granted"> A solicitação de permissão de armazenamento foi negada. Pode falhar na instalação do pacote de teclado</string>
<!-- Context: Keyman Settings menu -->
<string name="keyman_settings" comment="Settings menu title">Configurações</string>
<!-- Context: Keyman Settings menu -->
<plurals name="installed_languages">
<item quantity="one">Idiomas instalados (%1$d)</item>
<item quantity="other">Idiomas instalados (%1$d)</item>
</plurals>
<!-- Context: Keyman Settings menu -->
<string name="install_keyboard_or_dictionary" comment="Menu item to install keyboard or dictionary">Instalar teclado ou dicionário</string>
<!-- Context: Keyman Settings menu -->
<string name="change_display_language" comment="Menu action to change interface language">Exibir idioma</string>
<!-- Context: Keyman Settings menu -->
<string name="adjust_keyboard_height" comment="Menu action to adjust keyboard height">Ajustar altura do teclado</string>
<!-- Context: Keyman Settings menu -->
<string name="spacebar_caption" comment="Menu action to set the spacebar caption">Barra de espaço</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_keyboard" comment="Spacebar caption option - keyboard">Teclado</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_language" comment="Spacebar caption option - language">Idioma</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_language_keyboard" comment="Spacebar caption option - language + keyboard">Idioma + Teclado</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_blank" comment="Spacebar caption option - blank">Vazio</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_keyboard" comment="Spacebar caption hint - keyboard">Mostrar o nome do teclado na barra de espaço</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_language" comment="Spacebar caption hint - language">Mostrar nome do idioma na barra de espaço</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_language_keyboard" comment="Spacebar caption hint - language + keyboard">Idioma e teclado na barra de espaço</string>
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_blank" comment="Spacebar caption hint - blank">Não mostrar legenda na barra de espaço</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner" comment="text suggestions banner">Sempre mostrar banner</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner_on" comment="Description when toggle is on">A ser implementado</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner_off" comment="Description when toggle is off">Quando desativado, apenas mostrado quando o texto preditivo é ativado</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report" comment="permission for sending crash reports">Permitir o envio de relatórios de erro pela rede</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report_on" comment="Description when toggle is on">Quando ativado, relatórios de falhas serão enviados</string>
<!-- Context: Keyman Settings menu -->
<string name="show_send_crash_report_off" comment="Description when toggle is off">Quando desativado, relatórios de erros não serão enviados</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_keyman_dot_com" comment="Install package from Keyman server">Instalar de keyman.com</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_local_file" comment="Install package file from local device">Instalar a partir do arquivo local</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="install_from_other_device" comment="Scan QR Code">Instalar de outro dispositivo</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="add_languages_to_installed_keyboard" comment="Install additional languages from a keyboard package">Adicionar idiomas ao teclado instalado</string>
<!-- Context: Keyman Settings "Install Keyboard or Dictionary" menu -->
<string name="add_language_subtext" comment="Additional information for adding another language">(de pacote de teclado)</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="title_select_keyboard_package_list" comment="Select a keyboard package to add languages">Selecionar Pacote de Teclado</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="title_select_languages_for_package" comment="Select language names from the keyboard package">Selecione os idiomas para %1$s</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="added_language_to_keyboard" comment="Notification that a language name is added to a keyboard">Adicionado idioma %1$s a %2$s</string>
<!-- Context: Select Package and Select Languages menu -->
<string name="all_languages_installed" comment="Text when all languages from a keyboard package have been installed">Todos os idiomas já instalados</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="drag_the_keyboard" comment="First line of adjusting keyboard height">Arraste o teclado para redimensionar a altura</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="rotate_the_device" comment="Second line of adjusting keyboard height">Gire o dispositivo para ajustar o retrato e a paisagem</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="reset_to_defaults" comment="Button to reset to default heights">Restaurar padrões</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_text" comment="Prompt to type in the browser search bar">Pesquise ou digite um endereço</string>
<!-- Context: Keyman Web Browser -->
<string name="title_bookmarks" comment="Title for bookmarks">Favoritos</string>
<!-- Context: Keyman Web Browser -->
<string name="no_bookmarks" comment="Text when bookmark list is empty">Sem Favoritos</string>
<!-- Context: Keyman Web Browser -->
<string name="add_bookmark" comment="Confirmation to add bookmark">Adicionar aos favoritos</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_title" comment="Page title for saved bookmark">Título</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_url" comment="Page URL for saved bookmark">URL</string>
<!-- Context: KMP Package strings -->
<string name="title_package_failed_to_install" comment="Error dialog title when package failed to install">O pacote %1$s falhou ao instalar</string>
<!-- Context: KMP Package strings -->
<string name="downloading_keyboard_package" comment="Confirmation to download keyboard package filename">Baixando pacote de teclado\n%1$s&#8230;</string>
<!-- Context: KMP Package strings -->
<string name="failed_to_extract" comment="Notification that keyboard package failed to unzip">Falha ao extrair</string>
<!-- Context: KMP Package strings -->
<string name="install_keyboard_package" comment="Title to install keyboard package">Instalar teclado</string>
<!-- Context: KMP Package strings -->
<string name="install_predictive_text_package" comment="Title to install dictionary package">Instalar Dicionário</string>
<!-- Context: KMP Package strings -->
<string name="not_valid_package_file" comment="Notification when invalid package file cannot be installed">%1$s não é um arquivo de pacote de Keyman.\n%2$s\"</string>
<!-- Context: KMP Package strings -->
<string name="no_new_touch_keyboards_to_install" comment="Notification when no touch-optimized keyboards can be installed">Pacote de teclado não tem teclados otimizados para instalar</string>
<!-- Context: KMP Package strings -->
<string name="no_new_predictive_text_to_install" comment="Notification when no dictionaries can be installed">Nenhum texto novo preditivo para instalar</string>
<!-- Context: KMP Package strings -->
<string name="no_targets_to_install" comment="Notification when a package doesn't contain keyboards or dictionaries">Nenhum teclado ou texto preditivo para instalar</string>
<!-- Context: KMP Package strings -->
<string name="no_associated_languages" comment="Notification when a keyboard package doesn't contain languages">O pacote de teclado não tem idiomas associados para instalar</string>
<!-- Context: KMP Package strings -->
<string name="invalid_metadata" comment="kmp.json metadata file is invalid or missing in package">Metadados inválidos/ausentes no pacote</string>
<!-- Context: KMP Package strings -->
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> Keyboard requires a newer version of Keyman</string>
</resources>

View file

@ -135,6 +135,9 @@
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_blank" comment="Spacebar caption hint - blank">Do not show caption on spacebar</string>
<!-- Context: Keyman Settings menu / Haptic feedback -->
<string name="haptic_feedback" comment="haptic feedback on key press">Vibrate when typing</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner" comment="text suggestions banner">Always show banner</string>

View file

@ -141,6 +141,9 @@ function setKeymanLanguage(k) {
function setSpacebarText(mode) {
keyman.options['spacebarText'] = mode;
keyman.osk.show(true);
// Refresh KMW OSK
keyman.correctOSKTextSize();
}
/**
@ -238,7 +241,18 @@ function updateKMSelectionRange(start, end) {
}
}
var lastKeyTip = null;
function oskCreateKeyPreview(x,y,w,h,t) {
if(lastKeyTip &&
lastKeyTip.t == t &&
lastKeyTip.x == x &&
lastKeyTip.y == y &&
lastKeyTip.w == w &&
lastKeyTip.h == h) {
return;
}
lastKeyTip = {x:x,y:y,w:w,h:h,t:t};
fragmentToggle = (fragmentToggle + 1) % 100;
var div = document.createElement('div');
div.innerHTML = t;
@ -247,6 +261,7 @@ function oskCreateKeyPreview(x,y,w,h,t) {
}
function oskClearKeyPreview() {
lastKeyTip = null;
fragmentToggle = (fragmentToggle + 1) % 100;
window.location.hash = 'dismissKeyPreview-'+fragmentToggle;
}

View file

@ -106,7 +106,7 @@ public class ConfirmDialogFragment extends DialogFragment {
KMKeyboardDownloaderActivity.downloadKeyboard(
getActivity(), _langId, _kbId,_preparedCloudApiParams);
} else {
Toast.makeText(getActivity(), "No internet connection", Toast.LENGTH_SHORT).show();
Toast.makeText(getActivity(), getActivity().getString(R.string.no_internet_connection), Toast.LENGTH_SHORT).show();
}
break;
case DIALOG_TYPE_DELETE_KEYBOARD :
@ -121,7 +121,7 @@ public class ConfirmDialogFragment extends DialogFragment {
KMKeyboardDownloaderActivity.downloadLexicalModel(getActivity(),
_modelId, _preparedCloudApiParams);
} else {
Toast.makeText(getActivity(), "No internet connection", Toast.LENGTH_SHORT).show();
Toast.makeText(getActivity(), getActivity().getString(R.string.no_internet_connection), Toast.LENGTH_SHORT).show();
}
break;
case DIALOG_TYPE_DELETE_MODEL :

View file

@ -41,13 +41,14 @@ public class DisplayLanguages {
new DisplayLanguageType(unspecifiedLocale, context.getString(R.string.default_locale)),
new DisplayLanguageType("am-ET", "አማርኛ (Amharic)"),
new DisplayLanguageType("az-AZ", "Azərbaycanca (Azəricə)"),
new DisplayLanguageType("bwr-NT", "Bura-Pabir"),
new DisplayLanguageType("bwr-NG", "Bura-Pabir"),
new DisplayLanguageType("ff-NG", "Ɗemngal Fulfulde"),
new DisplayLanguageType("en", "English"),
new DisplayLanguageType("es-419", "Español (Spanish - Latin America)"),
new DisplayLanguageType("fr-FR", "French"),
new DisplayLanguageType("ha-HG", "Hausa"),
new DisplayLanguageType("in-ID", "Indonesian"),
new DisplayLanguageType("it-IT", "Italiana"),
new DisplayLanguageType("de-DE", "German"),
new DisplayLanguageType("kr-NG", "Kanuri"),
new DisplayLanguageType("km-KH", "Khmer"),
@ -55,6 +56,8 @@ public class DisplayLanguages {
new DisplayLanguageType("mfi-NG", "Mandara (Wandala)"),
new DisplayLanguageType("mrt-NG", "Marghi"),
new DisplayLanguageType("ann", "Obolo"),
new DisplayLanguageType("pl-PL", "Polski (Polish)"),
new DisplayLanguageType("pt-PT", "Português do Portugal"),
new DisplayLanguageType("ff-ZA", "Pulaar-Fulfulde"), // or Fulah
new DisplayLanguageType("shu-latn", "Shuwa (Latin)"),
new DisplayLanguageType("hia-NG", "Waha"),

View file

@ -187,7 +187,7 @@ final class KMKeyboard extends WebView {
@Override
public void onLongPress(MotionEvent event) {
// This is also called for banner longpresses! Need a way to differentiate the sources.
if (subKeysList != null) {
if (subKeysList != null && subKeysWindow != null && !subKeysWindow.isShowing()) {
showSubKeys(context);
return;
} else if (KMManager.getGlobeKeyState() == KMManager.GlobeKeyState.GLOBE_KEY_STATE_DOWN) {
@ -276,6 +276,7 @@ final class KMKeyboard extends WebView {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
// JH: I'm not sure if we even USE the suggestionMenuWindow construct anywhere, but either way,
// this if block is designed explicitly for handling the subKeysWindow.
//
@ -289,16 +290,18 @@ final class KMKeyboard extends WebView {
} else {
//handleTouchEvent(event);
gestureDetector.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_UP) {
subKeysList = null;
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (subKeysList != null && subKeysWindow == null) {
// Display subkeys during move
showSubKeys(context);
}
if (action == MotionEvent.ACTION_MOVE && subKeysList != null && subKeysWindow == null) {
// Display subkeys during move
showSubKeys(context);
}
}
if (action == MotionEvent.ACTION_UP) {
// Cleanup popups. #6636
dismissKeyPreview(0);
dismissSubKeysWindow();
}
return super.onTouchEvent(event);
}

View file

@ -40,6 +40,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.text.InputType;
import android.util.Log;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
@ -206,6 +207,9 @@ public final class KMManager {
protected static String currentBanner = KM_BANNER_STATE_BLANK;
// Special override for when the keyboard may have haptic feedback when typing
private static boolean mayHaveHapticFeedback = false;
// Special override for when keyboard is entering a password text field.
// When mayPredictOverride is true, the option {'mayPredict' = false} is set in the lm-layer
// regardless what the Settings preference is.
@ -235,6 +239,7 @@ public final class KMManager {
public static final String KMKey_FontSource = "source";
public static final String KMKey_FontFiles = "files";
public static final String KMKey_FontFamily = "family";
public static final String KMKey_KMPInstall_Mode = "kmpInstallMode";
public static final String KMKey_KeyboardModified = "lastModified";
public static final String KMKey_KeyboardRTL = "rtl";
public static final String KMKey_KeyboardHeightPortrait = "keyboardHeightPortrait";
@ -1206,6 +1211,20 @@ public final class KMManager {
((inputType & InputType.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_PHONE));
}
/**
* If the override is true, vibrate when user types on the Keyman keyboard
* @param override - boolean
*/
public static void setHapticFeedback(boolean override) {
mayHaveHapticFeedback = override;
}
/**
* Get the value of mayHaveHapticFeedback. Default is false
* @return boolean
*/
public static boolean getHapticFeedback() { return mayHaveHapticFeedback; };
/**
* If override is true, embedded KMW crash reports are allowed to be sent to sentry.keyman.com
* @param override - boolean
@ -1492,7 +1511,9 @@ public final class KMManager {
result2 = SystemKeyboard.setKeyboard(keyboardInfo);
if (keyboardInfo != null) {
registerAssociatedLexicalModel(keyboardInfo.getLanguageID());
String languageID = keyboardInfo.getLanguageID();
toggleSuggestionBanner(languageID, result1, result2);
registerAssociatedLexicalModel(languageID);
}
return (result1 || result2);
@ -1521,19 +1542,7 @@ public final class KMManager {
result2 = SystemKeyboard.prepareKeyboardSwitch(packageID, keyboardID, languageID,keyboardName);
}
if(result1 || result2)
{
//reset banner state if new language has no lexical model
if(currentBanner.equals(KMManager.KM_BANNER_STATE_SUGGESTION)
&& getAssociatedLexicalModel(languageID)==null)
currentBanner = KMManager.KM_BANNER_STATE_BLANK;
if(result1)
InAppKeyboard.setLayoutParams(getKeyboardLayoutParams());
if(result2)
SystemKeyboard.setLayoutParams(getKeyboardLayoutParams());
}
toggleSuggestionBanner(languageID, result1, result2);
registerAssociatedLexicalModel(languageID);
return (result1 || result2);
@ -2126,6 +2135,21 @@ public final class KMManager {
globeKeyState = state;
}
private static void toggleSuggestionBanner(String languageID, boolean inappKeyboardChanged, boolean systemKeyboardChanged) {
//reset banner state if new language has no lexical model
if (currentBanner.equals(KMManager.KM_BANNER_STATE_SUGGESTION)
&& getAssociatedLexicalModel(languageID)==null) {
currentBanner = KMManager.KM_BANNER_STATE_BLANK;
}
if(inappKeyboardChanged) {
InAppKeyboard.setLayoutParams(getKeyboardLayoutParams());
}
if(systemKeyboardChanged) {
SystemKeyboard.setLayoutParams(getKeyboardLayoutParams());
}
}
/**
* Return if the lock screen is locked (prevents keyboard picker menu from being displayed)
* @return boolean
@ -2791,6 +2815,9 @@ public final class KMManager {
// Collapse the selection
textView.setSelection(start + s.length());
textView.endBatchEdit();
if (mayHaveHapticFeedback) {
textView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
}
}
});
}
@ -2932,6 +2959,10 @@ public final class KMManager {
}
ic.endBatchEdit();
ViewGroup parent = (ViewGroup) SystemKeyboard.getParent();
if (parent != null && mayHaveHapticFeedback) {
parent.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
}
}
});
}

View file

@ -428,7 +428,7 @@ public final class KeyboardPickerActivity extends BaseActivity {
boolean result = removeKeyboard(context, position);
if (result) {
Toast.makeText(context, "Keyboard deleted", Toast.LENGTH_SHORT).show();
Toast.makeText(context, context.getString(R.string.keyboard_deleted_toast), Toast.LENGTH_SHORT).show();
BaseAdapter adapter = (BaseAdapter) listAdapter;
if(adapter != null) {
adapter.notifyDataSetChanged();
@ -500,7 +500,7 @@ public final class KeyboardPickerActivity extends BaseActivity {
if (result) {
if(!silenceNotification) {
Toast.makeText(context, "" + "Model deleted", Toast.LENGTH_SHORT).show();
Toast.makeText(context, context.getString(R.string.model_deleted), Toast.LENGTH_SHORT).show();
}
KMManager.deregisterLexicalModel(modelID);
}

View file

@ -0,0 +1,19 @@
package com.tavultesoft.kmea;
public enum KmpInstallMode {
Silent, // Show no UI while installing a package. Errors may be shown as toasts
WelcomeOnly, // Show only the welcome screen after installing a package; language will
// be automatically selected if not provided as an input parameter
Full; // Show readme, language picker (if applicable), and welcome after install.
public static KmpInstallMode fromString(String mode) {
if(mode == null) return Full;
switch(mode.toLowerCase()) {
case "silent": return Silent;
case "welcomeonly": return WelcomeOnly;
case "full": return Full;
}
return Full;
}
}

View file

@ -140,7 +140,7 @@ public class CloudDownloadMgr{
CloudApiTypes.CloudDownloadSet _parentSet = getDownloadSetForInternalDownloadId(anInternalDownloadId);
if(_parentSet==null) {
KMLog.LogError(TAG, "Download with ID " + anInternalDownloadId + " is not available");
// Download ID didn't match, so nothing to cleanup
return;
}
_parentSet.setDone(anInternalDownloadId);

View file

@ -6,7 +6,9 @@ import android.widget.Toast;
import com.tavultesoft.kmea.BaseActivity;
import com.tavultesoft.kmea.KMKeyboardDownloaderActivity;
import com.tavultesoft.kmea.KMManager;
import com.tavultesoft.kmea.KeyboardEventHandler;
import com.tavultesoft.kmea.KmpInstallMode;
import com.tavultesoft.kmea.R;
import com.tavultesoft.kmea.cloud.CloudApiTypes;
import com.tavultesoft.kmea.cloud.ICloudDownloadCallback;
@ -88,6 +90,11 @@ public class CloudKeyboardPackageDownloadCallback implements ICloudDownloadCallb
languageList.add(languageID);
}
installedKeyboards.addAll(kbdKMPProcessor.processKMP(kmpFile, unzipPath, PackageProcessor.PP_KEYBOARDS_KEY, languageList));
// Set "silent install" so cloud updates don't display welcome.htm
for(Map<String, String> kbdMap : installedKeyboards) {
kbdMap.put(KMManager.KMKey_KMPInstall_Mode, KmpInstallMode.Silent.toString());
}
}
}
}

View file

@ -8,6 +8,11 @@
<item quantity="other">Keyboardyeri</item>
</plurals>
<!-- Context: Title for list -->
<plurals name="title_other_input_methods">
<item quantity="one">Other Input Method</item>
<item quantity="other">Other Input Methods</item>
</plurals>
<!-- Context: Title for list -->
<string name="title_add_keyboard" comment="Add a new keyboard">Jaktǝ keyboard na bǝlin</string>
<!-- Context: Title for list -->
<string name="title_languages_settings" comment="List of installed languages">Hulfur mnyayeri natǝ mdǝkǝ hara installari</string>
@ -21,7 +26,7 @@
<string name="label_cancel" comment="Button to cancel an action">Awo</string>
<!-- Context: Button label -->
<string name="label_close" comment="Close a dialog">Harta</string>
<!-- Context: Button label -->
<!-- Context: Button label. Removed in Keyman 15 -->
<string name="label_close_keyman" comment="Close the Keyman application">Hartǝ Keyman</string>
<!-- Context: Button label -->
<string name="label_forward" comment="Button to go forward">Lǝkǝma</string>
@ -77,6 +82,7 @@
<string name="fatal_keyboard_error_short" comment="Error in keyboard (keyboard ID::packageID for language)."> Dametǝdzi akwa keyboard %1$s:%2$s na ar %3$s hulfur mnya.</string>
<!-- Context: Query for associated dictionary -->
<string name="query_associated_model" comment="Check if there's an available dictionary to download">Akwa pakǝ dictionary na kǝɓa kari kamnyar katsa hara dawunlodi ni</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> Cannot connect to Keyman server to check for associated dictionary to download</string>
<!-- Context: Model Updates -->
<string name="confirm_download_model" comment="Confirmation to download a dictionary update">Ga ata bara kara hara dawunlodi ar jili dictionary na ngǝni na bǝlin ni ya?</string>
<!-- Context: No associated dictionary found -->
@ -127,8 +133,13 @@
<string name="enable_predictions" comment="Enable predictions from the suggestion banner">Vu katsa hamta sauri su natǝ asi</string>
<!-- Context: Language Settings menu strings -->
<string name="model_label">Dictionari</string>
<plurals name="model_count">
<item quantity="one">Dictionary</item>
<item quantity="other">Dictionaries</item>
</plurals>
<!-- Context: Language Settings menu substring - Check for available dictionary -->
<string name="check_available_model" comment="Check for available dictionary">Pakǝ dictionari na aɗi</string>
<string name="check_model_online" comment="Check for dictionaries online">Check for dictionaries online</string>
<!-- Context: Language Settings menu strings -->
<string name="model_info_header" comment="Dictionary name">Dictionary: %1$s</string>
<!-- Context: Language Settings menu strings -->

View file

@ -8,6 +8,11 @@
<item quantity="other">Tappirɗe</item>
</plurals>
<!-- Context: Title for list -->
<plurals name="title_other_input_methods">
<item quantity="one">Feere Naatnal Woɗnde</item>
<item quantity="other">Peeje Naatnal Goɗɗe</item>
</plurals>
<!-- Context: Title for list -->
<string name="title_add_keyboard" comment="Add a new keyboard">Ɓeydu Tappirde Hesere</string>
<!-- Context: Title for list -->
<string name="title_languages_settings" comment="List of installed languages">Ɗemɗe aafaaɗe</string>
@ -21,9 +26,13 @@
<string name="label_cancel" comment="Button to cancel an action">Haaytu</string>
<!-- Context: Button label -->
<string name="label_close" comment="Close a dialog">Uddu</string>
<!-- Context: Button label -->
<!-- Context: Button label. Removed in Keyman 15 -->
<string name="label_close_keyman" comment="Close the Keyman application">Uddu Keyman</string>
<!-- Context: Button label -->
<string name="label_forward" comment="Button to go forward">Yeeso</string>
<!-- Context: Button label -->
<string name="label_next_input_method" comment="Switch to next input method (replaces label_close_keyman)">Feere Naatnal Garowal</string>
<!-- Context: Button label -->
<string name="label_download" comment="Button to confirm downloading an item">Aawto</string>
<!-- Context: Button label -->
<string name="label_install" comment="Confirmation to install a package">Aaf</string>
@ -69,8 +78,11 @@
<string name="fileprovider_undefined" comment="FileProvider library needed to view help file">Deftordu FileProvider ena soklaa ngam yiyde fiilde ballal: %1$s</string>
<!-- Context: Fatal keyboard error. Will load default keyboard -->
<string name="fatal_keyboard_error" comment="Fatal keyboard error (keyboard ID::packageID for language). Will load default keyboard">Juumre tappirde halkoore e %1$s: %2$s mo ɗemngal %3$s. Nana loowa tappirde woowaande.</string>
<!-- Context: Fatal keyboard error. -->
<string name="fatal_keyboard_error_short" comment="Error in keyboard (keyboard ID::packageID for language)."> Juumre e tappirde %1$s:%2$s ɗemngal %3$s language.</string>
<!-- Context: Query for associated dictionary -->
<string name="query_associated_model" comment="Check if there's an available dictionary to download">Nana ƴeewtoo saggitorde yahdiinde ngam aawtaade</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download">Waawaa seŋaade e sarworde Keyman ngam ƴeewtaade so saggitorde aawtoonde ena woodi</string>
<!-- Context: Model Updates -->
<string name="confirm_download_model" comment="Confirmation to download a dictionary update">Aɗa hatojini e aawtaade yamre sakkitiinde ndee saggitorde?</string>
<!-- Context: No associated dictionary found -->
@ -121,8 +133,13 @@
<string name="enable_predictions" comment="Enable predictions from the suggestion banner">Hurmin basiyol</string>
<!-- Context: Language Settings menu strings -->
<string name="model_label">Saggitorde</string>
<plurals name="model_count">
<item quantity="one">Saggitorde</item>
<item quantity="other">Caggitorɗe</item>
</plurals>
<!-- Context: Language Settings menu substring - Check for available dictionary -->
<string name="check_available_model" comment="Check for available dictionary">Yiylo saggitorde woodnde</string>
<string name="check_model_online" comment="Check for dictionaries online">Yiylo caggitorɗe e enternet</string>
<!-- Context: Language Settings menu strings -->
<string name="model_info_header" comment="Dictionary name">Saggitotde: %1$s</string>
<!-- Context: Language Settings menu strings -->

View file

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Device type -->
<!-- Application name (Keyman Engine for Android) -->
<!-- Context: Title for list -->
<plurals name="title_keyboards">
<item quantity="one">Tastiera</item>
<item quantity="other">Tastiere</item>
</plurals>
<!-- Context: Title for list -->
<plurals name="title_other_input_methods">
<item quantity="one">Altro Metodo Di Ingresso</item>
<item quantity="other">Altri Metodi Di Ingresso</item>
</plurals>
<!-- Context: Title for list -->
<string name="title_add_keyboard" comment="Add a new keyboard">Aggiungi Nuova Tastiera</string>
<!-- Context: Title for list -->
<string name="title_languages_settings" comment="List of installed languages">Lingue Installate</string>
<!-- Context: Title for list -->
<string name="title_language_settings" comment="Keyman Settings for a language">Impostazioni %1$s</string>
<!-- Context: Button label -->
<string name="label_add" comment="Button to add an item">Aggiungi</string>
<!-- Context: Button label -->
<string name="label_back" comment="Button to go back">Indietro</string>
<!-- Context: Button label -->
<string name="label_cancel" comment="Button to cancel an action">Annulla</string>
<!-- Context: Button label -->
<string name="label_close" comment="Close a dialog">Chiudi</string>
<!-- Context: Button label. Removed in Keyman 15 -->
<string name="label_close_keyman" comment="Close the Keyman application">Chiudi Keyman</string>
<!-- Context: Button label -->
<string name="label_forward" comment="Button to go forward">Avanti</string>
<!-- Context: Button label -->
<string name="label_next_input_method" comment="Switch to next input method (replaces label_close_keyman)">Metodo Di Ingresso Successivo</string>
<!-- Context: Button label -->
<string name="label_download" comment="Button to confirm downloading an item">Scarica</string>
<!-- Context: Button label -->
<string name="label_install" comment="Confirmation to install a package">Installa</string>
<!-- Context: Button label -->
<string name="label_later" comment="Do an action at a later time">Dopo</string>
<!-- Context: Button label -->
<string name="label_next" comment="Go to the next screen">Successivo</string>
<!-- Context: Button label -->
<string name="label_ok" comment="Button to acknowledge a dialog">OK</string>
<!-- Context: Button label -->
<string name="label_update" comment="Dialog button to update a resource">Aggiorna</string>
<!-- Context: No internet for updates -->
<string name="no_internet_connection" comment="Internet connection missing">No internet connection</string>
<!-- Context: Keyboard Updates -->
<string name="cannot_connect" comment="Error message when network connection fails">Impossibile connettersi al server Keyman!</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_delete_keyboard" comment="Confirmation to delete a keyboard">Vuoi eliminare questa tastiera?</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_download_keyboard" comment="Confirmation to download a keyboard update">Vuoi scaricare l\'ultima versione di questa tastiera?</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_update" comment="Confirmation to update several resources">Vuoi aggiornare ora tastiere e dizionari?</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_updates_channel">Aggiornamenti Risorsa</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_updates_available" comment="Notification when resource updates are available">Aggiornamenti Risorse Disponibili</string>
<!-- Context: Keyboard Updates -->
<string name="update_available" comment="Currently installed version of a resource with an available update">%1$s (Aggiornamento Disponibile)</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_update_message" comment="language name: keyboard name"> Aggiornamenti disponibili per la tastiera %1$s: %2$s </string>
<!-- Context: Keyboard Updates -->
<string name="dictionary_update_message">Aggiornamenti disponibili per il dizionario %1$s: %2$s </string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_version" comment="Label for keyboard version">Versione tastiera</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="help_link" comment="Label for help link">Link di aiuto</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="uninstall_keyboard" comment="Label for uninstalling keyboard">Disinstalla tastiera</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_picker_new_keyboard" comment="Mark a language name that's newly installed in keyboard list">[new] %1$s</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_qr_code" comment="QR Code description"> Scansiona questo codice per caricare questa tastiera\nsu un altro dispositivo</string>
<!-- Context: Keyboard Help welcome.htm title -->
<string name="welcome_package" comment="Title to welcome.htm page (name and version)">Benvenuto in %1$s</string>
<!-- Context: Keyboard app doesn't include FileProvider library needed to view help file -->
<string name="fileprovider_undefined" comment="FileProvider library needed to view help file"> Libreria FileProvider necessaria per visualizzare il file d\'aiuto: %1$s</string>
<!-- Context: Fatal keyboard error. Will load default keyboard -->
<string name="fatal_keyboard_error" comment="Fatal keyboard error (keyboard ID::packageID for language). Will load default keyboard"> Errore fatale della tastiera con %1$s:%2$s per %3$s lingua. Caricamento tastiera predefinita.</string>
<!-- Context: Fatal keyboard error. -->
<string name="fatal_keyboard_error_short" comment="Error in keyboard (keyboard ID::packageID for language)."> Errore nella tastiera %1$s:%2$s per %3$s lingua.</string>
<!-- Context: Query for associated dictionary -->
<string name="query_associated_model" comment="Check if there's an available dictionary to download">Controllo del dizionario associato da scaricare</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> Cannot connect to Keyman server to check for associated dictionary to download</string>
<!-- Context: Model Updates -->
<string name="confirm_download_model" comment="Confirmation to download a dictionary update">Vuoi scaricare l\'ultima versione di questo dizionario?</string>
<!-- Context: No associated dictionary found -->
<string name="no_associated_model" comment="Confirmation there's no available dictionary to download">Nessun dizionario da scaricare</string>
<!-- Context: Model Updates -->
<string name="catalog_unavailable" comment="Notification that the cloud resource catalog can't be updated">Il catalogo delle risorse non è disponibile</string>
<!-- Context: Background download messages-->
<string name="catalog_download_start_in_background" comment="Notification that the resource catalog update will begin">Aggiornamento catalogo avviato in background</string>
<!-- Context: Background download messages-->
<string name="catalog_download_is_running_in_background" comment="Notification that the resource catalog update is still downloading"> Il catalogo è ancora in download; riprova tra un attimo!</string>
<!-- Context: Background download messages-->
<string name="progress_message_checking_resource_is_running" comment="Progress notification that the check for a resource is still running ">Controllo della risorsa</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_start_in_background" comment="Notification that a keyboard download has started">Scaricamento tastiera avviato in background</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_is_running_in_background" comment="Notification that a keyboard download is still running">La tastiera selezionata è già in download; riprova tra un momento!</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_finished" comment="Notification that a keyboard download has finished">Il download della tastiera è terminato!</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_start_in_background" comment="Notification that a dictionary download has started">Scaricamento del dizionario avviato in background</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_is_running_in_background" comment="Notification that a dictionary download is still running">Il dizionario selezionato è già in download; riprova tra un momento!</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_finished" comment="Notification that a dictionary download has finished">Il download del dizionario è terminato.</string>
<!-- Context: Background download messages -->
<string name="download_failed" comment="Notification that a download failed">Download non riuscito</string>
<!-- Context: Background download messages -->
<string name="failed_to_retrieve_file" comment="Failed to retrieve downloaded file">Recupero del file scaricato non riuscito</string>
<!-- Context: General Updates -->
<string name="update_check_unavailable" comment="Error message when a Keyman server can't be reached">Accesso al server non riuscito!</string>
<!-- Context: General Updates -->
<string name="update_check_current" comment="Notification that all resources are up to date">"Tutte le risorse sono aggiornate!"</string>
<!-- Context: General Updates -->
<string name="update_failed" comment="Notification that a resource update failed">Una o più risorse non sono state aggiornate!</string>
<!-- Context: General Updates -->
<string name="update_success" comment="Notification that a resource update successfully updated">Risorse aggiornate con successo!</string>
<!-- Context: Model Info -->
<string name="model_version" comment="Title for a dictionary version">Versione dizionario</string>
<!-- Context: Model Info -->
<string name="uninstall_model" comment="Label to uninstall a dictionary">Disinstalla dizionario</string>
<!-- Context: Model Info -->
<string name="confirm_delete_model" comment="Confirmation to delete a dictionary">Vuoi eliminare questo dizionario?</string>
<!-- Context: Model Deleted -->
<string name="model_deleted" comment="Notification when a dictionary is deleted">Dictionary deleted</string>
<!-- Context: Language Settings Keyboard install strings -->
<string name="keyboard_install_toast" comment="Notification when a keyboard is installed">%1$s tastiera installata</string>
<!-- Context: Language Settings Keyboard uninstall strings -->
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">Keyboard deleted</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_corrections" comment="Enable corrections from the suggestion banner">Abilita correzioni</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_predictions" comment="Enable predictions from the suggestion banner">Abilita previsioni</string>
<!-- Context: Language Settings menu strings -->
<string name="model_label">Dizionario</string>
<plurals name="model_count">
<item quantity="one">Dictionary</item>
<item quantity="other">Dictionaries</item>
</plurals>
<!-- Context: Language Settings menu substring - Check for available dictionary -->
<string name="check_available_model" comment="Check for available dictionary">Controlla il dizionario disponibile</string>
<string name="check_model_online" comment="Check for dictionaries online">Check for dictionaries online</string>
<!-- Context: Language Settings menu strings -->
<string name="model_info_header" comment="Dictionary name">Dizionario: %1$s</string>
<!-- Context: Language Settings menu strings -->
<string name="model_picker_header" comment="Dictionaries for a specified language">%1$s dizionari</string>
<!-- Context: Language Settings menu strings -->
<!-- Context: Language Settings menu strings -->
<string name="model_install_toast" comment="Notification when a dictionary is installed">Dizionario installato</string>
<!-- Context: Language Settings menu strings -->
<plurals name="keyboard_count">
<item quantity="one">(%1$d tastiera)</item>
<item quantity="other">(%1$d tastiere)</item>
</plurals>
<!-- Context: "Change Display Language" menu -->
<string name="default_locale" comment="Use the device's current locale">Locale Predefinito</string>
<!-- Context: Content descriptions -->
<!-- Context: Content descriptions -->
<!-- Context: Popup menu labels -->
<string name="label_delete" comment="Confirmation to delete an item">Elimina</string>
<!-- Context: Shared preferences name -->
<!-- Context: Other strings -->
<string name="help_bubble_text">Tocca qui per cambiare la tastiera</string>
</resources>

View file

@ -125,6 +125,8 @@
<string name="confirm_delete_model" comment="Confirmation to delete a dictionary">តើ​អ្នក​ចង់​លុប​បញ្ជី​ពាក្យនេះ​ឬ?</string>
<!-- Context: Language Settings Keyboard install strings -->
<string name="keyboard_install_toast" comment="Notification when a keyboard is installed">បានដំឡើង​ក្ដារចុច %1$s</string>
<!-- Context: Language Settings Keyboard uninstall strings -->
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">ក្ដារចុចត្រូវបានលុបចេញ</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_corrections" comment="Enable corrections from the suggestion banner">បើក​ការកែពាក្យ</string>
<!-- Context: Language Settings menu strings -->

View file

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Device type -->
<!-- Application name (Keyman Engine for Android) -->
<!-- Context: Title for list -->
<plurals name="title_keyboards">
<item quantity="one">Klawiatura</item>
<item quantity="few">Klawiatury</item>
<item quantity="many">Klawiatur</item>
<item quantity="other">Klawiatury</item>
</plurals>
<!-- Context: Title for list -->
<plurals name="title_other_input_methods">
<item quantity="one">Inna metoda wprowadzania</item>
<item quantity="few">Inne metody wprowadzania</item>
<item quantity="many">Inne metody wprowadzania</item>
<item quantity="other">Inne metody wprowadzania</item>
</plurals>
<!-- Context: Title for list -->
<string name="title_add_keyboard" comment="Add a new keyboard">Dodaj nową klawiaturę</string>
<!-- Context: Title for list -->
<string name="title_languages_settings" comment="List of installed languages">Zainstalowane języki</string>
<!-- Context: Title for list -->
<string name="title_language_settings" comment="Keyman Settings for a language">%1$s Ustawienia</string>
<!-- Context: Button label -->
<string name="label_add" comment="Button to add an item">Dodaj</string>
<!-- Context: Button label -->
<string name="label_back" comment="Button to go back">Wróć</string>
<!-- Context: Button label -->
<string name="label_cancel" comment="Button to cancel an action">Anuluj</string>
<!-- Context: Button label -->
<string name="label_close" comment="Close a dialog">Zamknij</string>
<!-- Context: Button label. Removed in Keyman 15 -->
<string name="label_close_keyman" comment="Close the Keyman application">Zamknij Keyman</string>
<!-- Context: Button label -->
<string name="label_forward" comment="Button to go forward">Przekaż</string>
<!-- Context: Button label -->
<string name="label_next_input_method" comment="Switch to next input method (replaces label_close_keyman)">Następna metoda wprowadzania</string>
<!-- Context: Button label -->
<string name="label_download" comment="Button to confirm downloading an item">Pobierz</string>
<!-- Context: Button label -->
<string name="label_install" comment="Confirmation to install a package">Zainstaluj</string>
<!-- Context: Button label -->
<string name="label_later" comment="Do an action at a later time">Później</string>
<!-- Context: Button label -->
<string name="label_next" comment="Go to the next screen">Następny</string>
<!-- Context: Button label -->
<string name="label_ok" comment="Button to acknowledge a dialog">OK</string>
<!-- Context: Button label -->
<string name="label_update" comment="Dialog button to update a resource">Zaktualizuj</string>
<!-- Context: No internet for updates -->
<string name="no_internet_connection" comment="Internet connection missing">No internet connection</string>
<!-- Context: Keyboard Updates -->
<string name="cannot_connect" comment="Error message when network connection fails">Nie można połączyć się z serwerem Keyman!</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_delete_keyboard" comment="Confirmation to delete a keyboard">Czy chcesz usunąć tę klawiaturę?</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_download_keyboard" comment="Confirmation to download a keyboard update">Czy chcesz pobrać najnowszą wersję tej klawiatury?</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_update" comment="Confirmation to update several resources">Czy chcesz teraz zaktualizować klawiatury i słowniki?</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_updates_channel">Aktualizacje zasobów</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_updates_available" comment="Notification when resource updates are available">Dostępne aktualizacje zasobów</string>
<!-- Context: Keyboard Updates -->
<string name="update_available" comment="Currently installed version of a resource with an available update">%1$s (Aktualizacja Dostępna)</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_update_message" comment="language name: keyboard name"> Aktualizacje dostępne dla klawiatury %1$s: %2$s </string>
<!-- Context: Keyboard Updates -->
<string name="dictionary_update_message">Aktualizacje dostępne dla słownika %1$s: %2$s </string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_version" comment="Label for keyboard version">Wersja klawiatury</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="help_link" comment="Label for help link">Pomocne linki</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="uninstall_keyboard" comment="Label for uninstalling keyboard">Odinstaluj klawiaturę</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_picker_new_keyboard" comment="Mark a language name that's newly installed in keyboard list">[new] %1$s</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_qr_code" comment="QR Code description"> Zeskanuj ten kod, aby załadować tę klawiaturę\nna innym urządzeniu</string>
<!-- Context: Keyboard Help welcome.htm title -->
<string name="welcome_package" comment="Title to welcome.htm page (name and version)">Witamy w %1$s</string>
<!-- Context: Keyboard app doesn't include FileProvider library needed to view help file -->
<string name="fileprovider_undefined" comment="FileProvider library needed to view help file"> Biblioteka FileProvider potrzebna, aby wyświetlić plik pomocy: %1$s</string>
<!-- Context: Fatal keyboard error. Will load default keyboard -->
<string name="fatal_keyboard_error" comment="Fatal keyboard error (keyboard ID::packageID for language). Will load default keyboard"> Błąd krytycznej klawiatury z %1$s:%2$s dla %3$s języka. Ładowanie domyślnej klawiatury.</string>
<!-- Context: Fatal keyboard error. -->
<string name="fatal_keyboard_error_short" comment="Error in keyboard (keyboard ID::packageID for language)."> Błąd w klawiaturze %1$s:%2$s dla %3$s języka.</string>
<!-- Context: Query for associated dictionary -->
<string name="query_associated_model" comment="Check if there's an available dictionary to download">Sprawdzanie dla skojarzonego słownika do pobrania</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> Cannot connect to Keyman server to check for associated dictionary to download</string>
<!-- Context: Model Updates -->
<string name="confirm_download_model" comment="Confirmation to download a dictionary update">Czy chcesz pobrać najnowszą wersję tego słownika?</string>
<!-- Context: No associated dictionary found -->
<string name="no_associated_model" comment="Confirmation there's no available dictionary to download">Brak słownika do pobrania</string>
<!-- Context: Model Updates -->
<string name="catalog_unavailable" comment="Notification that the cloud resource catalog can't be updated">Katalog zasobów jest niedostępny</string>
<!-- Context: Background download messages-->
<string name="catalog_download_start_in_background" comment="Notification that the resource catalog update will begin">Aktualizacja katalogu rozpoczęta w tle</string>
<!-- Context: Background download messages-->
<string name="catalog_download_is_running_in_background" comment="Notification that the resource catalog update is still downloading"> Katalog jest nadal pobierany. Spróbuj ponownie za chwilę!</string>
<!-- Context: Background download messages-->
<string name="progress_message_checking_resource_is_running" comment="Progress notification that the check for a resource is still running ">Sprawdzanie zasobu</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_start_in_background" comment="Notification that a keyboard download has started">Pobieranie klawiatury rozpoczęte w tle</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_is_running_in_background" comment="Notification that a keyboard download is still running">Wybrana klawiatura jest już pobierana. Spróbuj ponownie za chwilę!</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_finished" comment="Notification that a keyboard download has finished">Pobieranie klawiatury zostało zakończone!</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_start_in_background" comment="Notification that a dictionary download has started">Pobieranie słownika rozpoczęte w tle</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_is_running_in_background" comment="Notification that a dictionary download is still running">Wybrany słownik jest już pobierany. Spróbuj ponownie za chwilę!</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_finished" comment="Notification that a dictionary download has finished">Pobieranie słownika zostało zakończone.</string>
<!-- Context: Background download messages -->
<string name="download_failed" comment="Notification that a download failed">Pobieranie nie powiodło się</string>
<!-- Context: Background download messages -->
<string name="failed_to_retrieve_file" comment="Failed to retrieve downloaded file">Nie udało się odzyskać pobranego pliku</string>
<!-- Context: General Updates -->
<string name="update_check_unavailable" comment="Error message when a Keyman server can't be reached">Nie udało się uzyskać dostępu do serwera!</string>
<!-- Context: General Updates -->
<string name="update_check_current" comment="Notification that all resources are up to date">"Wszystkie zasoby są aktualne!"</string>
<!-- Context: General Updates -->
<string name="update_failed" comment="Notification that a resource update failed">Nie udało się zaktualizować jednego lub więcej zasobów!</string>
<!-- Context: General Updates -->
<string name="update_success" comment="Notification that a resource update successfully updated">Zasoby pomyślnie zaktualizowane!</string>
<!-- Context: Model Info -->
<string name="model_version" comment="Title for a dictionary version">Wersja słownika</string>
<!-- Context: Model Info -->
<string name="uninstall_model" comment="Label to uninstall a dictionary">Odinstaluj słownik</string>
<!-- Context: Model Info -->
<string name="confirm_delete_model" comment="Confirmation to delete a dictionary">Czy chcesz usunąć ten słownik?</string>
<!-- Context: Model Deleted -->
<string name="model_deleted" comment="Notification when a dictionary is deleted">Dictionary deleted</string>
<!-- Context: Language Settings Keyboard install strings -->
<string name="keyboard_install_toast" comment="Notification when a keyboard is installed">%1$s Zainstalowano klawiaturę</string>
<!-- Context: Language Settings Keyboard uninstall strings -->
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">Keyboard deleted</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_corrections" comment="Enable corrections from the suggestion banner">Włącz korekcję</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_predictions" comment="Enable predictions from the suggestion banner">Włącz przewidywania</string>
<!-- Context: Language Settings menu strings -->
<string name="model_label">Słownik</string>
<plurals name="model_count">
<item quantity="one">Dictionary</item>
<item quantity="few">Dictionaries</item>
<item quantity="many">Dictionaries</item>
<item quantity="other">Dictionaries</item>
</plurals>
<!-- Context: Language Settings menu substring - Check for available dictionary -->
<string name="check_available_model" comment="Check for available dictionary">Sprawdź dostępne słowniki</string>
<string name="check_model_online" comment="Check for dictionaries online">Check for dictionaries online</string>
<!-- Context: Language Settings menu strings -->
<string name="model_info_header" comment="Dictionary name">Słownik: %1$s</string>
<!-- Context: Language Settings menu strings -->
<string name="model_picker_header" comment="Dictionaries for a specified language">%1$s słowniki</string>
<!-- Context: Language Settings menu strings -->
<!-- Context: Language Settings menu strings -->
<string name="model_install_toast" comment="Notification when a dictionary is installed">Słownik zainstalowany</string>
<!-- Context: Language Settings menu strings -->
<plurals name="keyboard_count">
<item quantity="one">(%1$d klawiatura)</item>
<item quantity="few">(%1$d klawiatur)</item>
<item quantity="many">(%1$d klawiatur)</item>
<item quantity="other">(%1$d klawiatur)</item>
</plurals>
<!-- Context: "Change Display Language" menu -->
<string name="default_locale" comment="Use the device's current locale">Domyślne ustawienia regionalne</string>
<!-- Context: Content descriptions -->
<!-- Context: Content descriptions -->
<!-- Context: Popup menu labels -->
<string name="label_delete" comment="Confirmation to delete an item">Usuń</string>
<!-- Context: Shared preferences name -->
<!-- Context: Other strings -->
<string name="help_bubble_text">Dotknij tutaj, aby zmienić klawiaturę</string>
</resources>

View file

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Device type -->
<!-- Application name (Keyman Engine for Android) -->
<!-- Context: Title for list -->
<plurals name="title_keyboards">
<item quantity="one">Teclado</item>
<item quantity="other">Teclados</item>
</plurals>
<!-- Context: Title for list -->
<plurals name="title_other_input_methods">
<item quantity="one">Outro Método de Entrada</item>
<item quantity="other">Outros Métodos de Entrada</item>
</plurals>
<!-- Context: Title for list -->
<string name="title_add_keyboard" comment="Add a new keyboard">Adicionar novo teclado</string>
<!-- Context: Title for list -->
<string name="title_languages_settings" comment="List of installed languages">Idiomas instalados</string>
<!-- Context: Title for list -->
<string name="title_language_settings" comment="Keyman Settings for a language">Configurações de %1$s</string>
<!-- Context: Button label -->
<string name="label_add" comment="Button to add an item">Adicionar</string>
<!-- Context: Button label -->
<string name="label_back" comment="Button to go back">Voltar</string>
<!-- Context: Button label -->
<string name="label_cancel" comment="Button to cancel an action">Instalar Mais Tarde</string>
<!-- Context: Button label -->
<string name="label_close" comment="Close a dialog">Fechar</string>
<!-- Context: Button label. Removed in Keyman 15 -->
<string name="label_close_keyman" comment="Close the Keyman application">Fechar keyman</string>
<!-- Context: Button label -->
<string name="label_forward" comment="Button to go forward">Avançar</string>
<!-- Context: Button label -->
<string name="label_next_input_method" comment="Switch to next input method (replaces label_close_keyman)">Próximo método de entrada</string>
<!-- Context: Button label -->
<string name="label_download" comment="Button to confirm downloading an item">BAIXAR</string>
<!-- Context: Button label -->
<string name="label_install" comment="Confirmation to install a package">Instalar</string>
<!-- Context: Button label -->
<string name="label_later" comment="Do an action at a later time">Mais tarde</string>
<!-- Context: Button label -->
<string name="label_next" comment="Go to the next screen">Próximo</string>
<!-- Context: Button label -->
<string name="label_ok" comment="Button to acknowledge a dialog">OK</string>
<!-- Context: Button label -->
<string name="label_update" comment="Dialog button to update a resource">Atualizar</string>
<!-- Context: Keyboard Updates -->
<string name="cannot_connect" comment="Error message when network connection fails">Não foi possível conectar ao servidor Keyman!</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_delete_keyboard" comment="Confirmation to delete a keyboard">Gostaria de excluir este teclado?</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_download_keyboard" comment="Confirmation to download a keyboard update">Gostaria de baixar a versão mais recente deste teclado?</string>
<!-- Context: Keyboard Updates -->
<string name="confirm_update" comment="Confirmation to update several resources">Gostaria de atualizar teclados e dicionários agora?</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_updates_channel">Atualizações de Recursos</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_updates_available" comment="Notification when resource updates are available">Atualizações de Recursos Disponíveis</string>
<!-- Context: Keyboard Updates -->
<string name="update_available" comment="Currently installed version of a resource with an available update">%1$s (Atualização Disponível)</string>
<!-- Context: Keyboard Updates -->
<string name="keyboard_update_message" comment="language name: keyboard name"> Atualizações disponíveis para o teclado %1$s: %2$s </string>
<!-- Context: Keyboard Updates -->
<string name="dictionary_update_message">Atualizações disponíveis para o dicionário %1$s: %2$s </string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_version" comment="Label for keyboard version">Versão do teclado</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="help_link" comment="Label for help link">Link de ajuda</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="uninstall_keyboard" comment="Label for uninstalling keyboard">Desinstalar teclado</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_picker_new_keyboard" comment="Mark a language name that's newly installed in keyboard list">[new] %1$s</string>
<!-- Context: Keyboard Info and Keyboard Settings -->
<string name="keyboard_qr_code" comment="QR Code description"> Escaneie este código para carregar este teclado\nem outro dispositivo</string>
<!-- Context: Keyboard Help welcome.htm title -->
<string name="welcome_package" comment="Title to welcome.htm page (name and version)">Bem-vindo(a) ao %1$s</string>
<!-- Context: Keyboard app doesn't include FileProvider library needed to view help file -->
<string name="fileprovider_undefined" comment="FileProvider library needed to view help file"> Biblioteca de FileProvider necessária para ver o arquivo de ajuda: %1$s</string>
<!-- Context: Fatal keyboard error. Will load default keyboard -->
<string name="fatal_keyboard_error" comment="Fatal keyboard error (keyboard ID::packageID for language). Will load default keyboard"> Erro fatal de teclado com %1$s:%2$s para %3$s idioma. Carregando o teclado padrão.</string>
<!-- Context: Fatal keyboard error. -->
<string name="fatal_keyboard_error_short" comment="Error in keyboard (keyboard ID::packageID for language)."> Erro no teclado %1$s:%2$s para %3$s idioma.</string>
<!-- Context: Query for associated dictionary -->
<string name="query_associated_model" comment="Check if there's an available dictionary to download">Verificando o download do dicionário associado</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> Cannot connect to Keyman server to check for associated dictionary to download</string>
<!-- Context: Model Updates -->
<string name="confirm_download_model" comment="Confirmation to download a dictionary update">Gostaria de baixar a versão mais recente deste dicionário?</string>
<!-- Context: No associated dictionary found -->
<string name="no_associated_model" comment="Confirmation there's no available dictionary to download">Nenhum dicionário para baixar</string>
<!-- Context: Model Updates -->
<string name="catalog_unavailable" comment="Notification that the cloud resource catalog can't be updated">O catálogo de recursos está indisponível</string>
<!-- Context: Background download messages-->
<string name="catalog_download_start_in_background" comment="Notification that the resource catalog update will begin">Atualização de catálogo iniciada em segundo plano</string>
<!-- Context: Background download messages-->
<string name="catalog_download_is_running_in_background" comment="Notification that the resource catalog update is still downloading"> O catálogo ainda está baixando; por favor, tente novamente em alguns instantes!</string>
<!-- Context: Background download messages-->
<string name="progress_message_checking_resource_is_running" comment="Progress notification that the check for a resource is still running ">Verificando o recurso</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_start_in_background" comment="Notification that a keyboard download has started">Download do teclado iniciado em segundo plano</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_is_running_in_background" comment="Notification that a keyboard download is still running">O teclado selecionado já está baixando; por favor, tente novamente daqui a pouco!</string>
<!-- Context: Background download messages-->
<string name="keyboard_download_finished" comment="Notification that a keyboard download has finished">O download do teclado terminou!</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_start_in_background" comment="Notification that a dictionary download has started">Download do dicionário iniciado em segundo plano</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_is_running_in_background" comment="Notification that a dictionary download is still running">O dicionário selecionado já está baixando; por favor, tente novamente mais tarde!</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_finished" comment="Notification that a dictionary download has finished">O download do dicionário terminou.</string>
<!-- Context: Background download messages -->
<string name="download_failed" comment="Notification that a download failed">Download falhou</string>
<!-- Context: Background download messages -->
<string name="failed_to_retrieve_file" comment="Failed to retrieve downloaded file">Falha ao recuperar o arquivo baixado</string>
<!-- Context: General Updates -->
<string name="update_check_unavailable" comment="Error message when a Keyman server can't be reached">Falha ao acessar o servidor!</string>
<!-- Context: General Updates -->
<string name="update_check_current" comment="Notification that all resources are up to date">"Todos os recursos estão atualizados!"</string>
<!-- Context: General Updates -->
<string name="update_failed" comment="Notification that a resource update failed">Um ou mais recursos falharam ao atualizar!</string>
<!-- Context: General Updates -->
<string name="update_success" comment="Notification that a resource update successfully updated">Recursos atualizados com sucesso!</string>
<!-- Context: Model Info -->
<string name="model_version" comment="Title for a dictionary version">Versão do dicionário</string>
<!-- Context: Model Info -->
<string name="uninstall_model" comment="Label to uninstall a dictionary">Desinstalar dicionário</string>
<!-- Context: Model Info -->
<string name="confirm_delete_model" comment="Confirmation to delete a dictionary">Você gostaria de excluir este dicionário?</string>
<!-- Context: Language Settings Keyboard install strings -->
<string name="keyboard_install_toast" comment="Notification when a keyboard is installed">Teclado %1$s instalado</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_corrections" comment="Enable corrections from the suggestion banner">Habilitar correções</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_predictions" comment="Enable predictions from the suggestion banner">Habilitar previsões</string>
<!-- Context: Language Settings menu strings -->
<string name="model_label">Dicionário</string>
<plurals name="model_count">
<item quantity="one">Dictionary</item>
<item quantity="other">Dictionaries</item>
</plurals>
<!-- Context: Language Settings menu substring - Check for available dictionary -->
<string name="check_available_model" comment="Check for available dictionary">Verificar dicionário disponível</string>
<string name="check_model_online" comment="Check for dictionaries online">Check for dictionaries online</string>
<!-- Context: Language Settings menu strings -->
<string name="model_info_header" comment="Dictionary name">Dicionário: %1$s</string>
<!-- Context: Language Settings menu strings -->
<string name="model_picker_header" comment="Dictionaries for a specified language">%1$s dicionários</string>
<!-- Context: Language Settings menu strings -->
<!-- Context: Language Settings menu strings -->
<string name="model_install_toast" comment="Notification when a dictionary is installed">Dicionário instalado</string>
<!-- Context: Language Settings menu strings -->
<plurals name="keyboard_count">
<item quantity="one">(%1$d teclado)</item>
<item quantity="other">(%1$d teclados)</item>
</plurals>
<!-- Context: "Change Display Language" menu -->
<string name="default_locale" comment="Use the device's current locale">Idioma padrão</string>
<!-- Context: Content descriptions -->
<!-- Context: Content descriptions -->
<!-- Context: Popup menu labels -->
<string name="label_delete" comment="Confirmation to delete an item">Excluir</string>
<!-- Context: Shared preferences name -->
<!-- Context: Other strings -->
<string name="help_bubble_text">Toque aqui para alterar o teclado</string>
</resources>

View file

@ -68,6 +68,8 @@
<!-- Context: Button label -->
<string name="label_update" comment="Dialog button to update a resource">Update</string>
<!-- Context: No internet for updates -->
<string name="no_internet_connection" comment="Internet connection missing">No internet connection</string>
<!-- Context: Keyboard Updates -->
<string name="cannot_connect" comment="Error message when network connection fails">Cannot connect to Keyman server!</string>
@ -200,10 +202,15 @@
<!-- Context: Model Info -->
<string name="confirm_delete_model" comment="Confirmation to delete a dictionary">Would you like to delete this dictionary?</string>
<!-- Context: Model Deleted -->
<string name="model_deleted" comment="Notification when a dictionary is deleted">Dictionary deleted</string>
<!-- Context: Language Settings Keyboard install strings -->
<string name="keyboard_install_toast" comment="Notification when a keyboard is installed">%1$s keyboard installed</string>
<!-- Context: Language Settings Keyboard uninstall strings -->
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">Keyboard deleted</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_corrections" comment="Enable corrections from the suggestion banner">Enable corrections</string>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -47,6 +47,9 @@ Click on this to [adjust the keyboard height](adjust-keyboard-height).
## Spacebar Caption
Click on this to [change the displayed keyboard name](spacebar-caption) on the spacebar.
## Vibrate When Typing
When enabled, the Keyman keyboard will provide haptic feedback (vibrate) when the user presses a key and generates output. The default preference is off.
## Always show banner
This toggle is reserved for future features. When off, the text suggestion banner is only displayed when
the dictionary is enabled. The language associated with the keyboard must match the language associated with

View file

@ -103,8 +103,9 @@ rem ----------------------------------
rem Standalone build, so we'll make the environment available to the caller
rem Also setup
rem Note: Visual Studio 2022 doesn't provide vcvarsall.bat, so we'll have to find a different solution
endlocal
for /f "usebackq tokens=*" %%i in (`..\..\..\resources\build\vswhere -latest -requires Microsoft.Component.MSBuild -find **\vcvarsall.bat`) do (
for /f "usebackq tokens=*" %%i in (`..\..\..\resources\build\vswhere -version [15^,17^) -latest -requires Microsoft.Component.MSBuild -find **\vcvarsall.bat`) do (
set VCVARSALL="%%i"
)
%VCVARSALL% %1

View file

@ -1,4 +1,4 @@
# Copyright: © 2018-2020 SIL International.
# Copyright: © 2018-2022 SIL International.
# Description: Cross platform build script to compile libkmnkbp, documentation
# and tests.
# Create Date: 2 Oct 2018
@ -10,20 +10,28 @@ project('keyboardprocessor', 'cpp', 'c',
license: 'MIT',
default_options : ['buildtype=release',
'cpp_std=c++14',
'b_vscrt=static_from_buildtype'])
'b_vscrt=static_from_buildtype',
'warning_level=2'],
meson_version: '>=0.45.0')
message('meson.project_version(): ' + meson.project_version() + '\n')
compiler = meson.get_compiler('cpp')
lib_version = '0.0.0'
if meson.version().version_compare('>=0.46')
py = import('python')
python = py.find_installation()
else
py = import('python3')
python = py.find_python()
endif
# Once we can assume meson 0.60 we can delete this
# (https://mesonbuild.com/Release-notes-for-0-60-0.html#msvc-compiler-now-assumes-utf8-source-code-by-default)
if compiler.get_id() == 'msvc'
add_global_arguments('/source-charset:utf-8', language: ['c', 'cpp'])
endif
py = import('python3')
python = py.find_python()
message('host_machine.system(): ' + host_machine.system())
message('compiler.get_id(): ' + compiler.get_id())

View file

@ -47,13 +47,13 @@ void debug_items::assert_push_entry() {
inline
void debug_items::push_begin(km_kbp_state_debug_key_info *key_info, uint32_t flags) {
assert_push_entry();
emplace_back(km_kbp_state_debug_item{ KM_KBP_DEBUG_BEGIN, flags, {*key_info, } });
emplace_back(km_kbp_state_debug_item{ KM_KBP_DEBUG_BEGIN, flags, {*key_info, }, { }});
}
inline
void debug_items::push_end(uint16_t first_action, uint32_t flags) {
assert_push_entry();
emplace_back(km_kbp_state_debug_item{ KM_KBP_DEBUG_END, flags, { }, { u"", nullptr, nullptr, { }, first_action } });
emplace_back(km_kbp_state_debug_item{ KM_KBP_DEBUG_END, flags, { }, { u"", nullptr, nullptr, { }, first_action, {} } });
}
inline

View file

@ -21,8 +21,8 @@ void KMX_Context::Add(KMX_WCHAR ch)
if(pos == MAXCONTEXT - 1)
{
auto p = incxstr(CurContext);
auto n = p - CurContext;
memmove(CurContext, p, (MAXCONTEXT - n) * 2);
auto n = (int)(p - CurContext);
memmove(CurContext, p, (MAXCONTEXT - n) * sizeof(KMX_WCHAR));
pos -= n;
}

View file

@ -83,14 +83,14 @@ const unsigned long CRCTable[256] = {
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
};
/*
* This routine calculates the CRC for a block of data using the
* table lookup method. It accepts an original value for the crc,
* and returns the updated value.
*/
static unsigned long CalculateBufferCRC(unsigned long count, KMX_BYTE *p)
static unsigned long CalculateBufferCRC(size_t count, KMX_BYTE *p)
{
unsigned long temp1;
unsigned long temp2;

View file

@ -43,7 +43,7 @@ private:
kmx::KMX_DebugItems *m_debug_items;
INTKEYBOARDINFO m_keyboard = { 0 };
INTKEYBOARDINFO m_keyboard = { 0, {}, {}, {} };
KMX_DWORD m_modifiers = 0;
/* File loading */

View file

@ -12,8 +12,8 @@ namespace kmx {
#define Uni_SurrogateToUTF32(ch, cl) (((ch) - 0xD800) * 0x400 + ((cl) - 0xDC00) + 0x10000)
#define Uni_UTF32ToSurrogate1(ch) (((ch) - 0x10000) / 0x400 + 0xD800)
#define Uni_UTF32ToSurrogate2(ch) (((ch) - 0x10000) % 0x400 + 0xDC00)
#define Uni_UTF32ToSurrogate1(ch) (char16_t)(((ch) - 0x10000) / 0x400 + 0xD800)
#define Uni_UTF32ToSurrogate2(ch) (char16_t)(((ch) - 0x10000) % 0x400 + 0xDC00)
PKMX_WCHAR incxstr(PKMX_WCHAR p);
PKMX_WCHAR decxstr(PKMX_WCHAR p, PKMX_WCHAR pStart);

View file

@ -1,4 +1,4 @@
# Copyright: © 2018 SIL International.
# Copyright: © 2018-2022 SIL International.
# Description: Cross platform build script to compile libkmnkbp.
# Create Date: 2 Oct 2018
# Authors: Tim Eves (TSE)
@ -9,11 +9,9 @@ version_res = []
if compiler.get_id() == 'gcc' or compiler.get_id() == 'clang'
warns = [
'-Wall',
'-Wctor-dtor-privacy',
'-Wdouble-promotion',
'-Wendif-labels',
'-Wextra',
'-Wno-unknown-pragmas',
'-Wno-missing-field-initializers',
'-Wnon-virtual-dtor',

View file

@ -84,7 +84,7 @@ void actions::push_alert() {
inline
void actions::push_backspace(km_kbp_backspace_type expected_type, uintptr_t expected_value) {
assert(empty() || (!empty() && back().type != KM_KBP_IT_END));
km_kbp_action_item item = {KM_KBP_IT_BACK};
km_kbp_action_item item = {KM_KBP_IT_BACK, {}, {}};
item.backspace.expected_type = expected_type;
item.backspace.expected_value = expected_value;
emplace_back(item);

View file

@ -217,7 +217,8 @@ public:
_utf_iterator & operator ++ () { cp += abs(sl); return *this; }
bool operator == (const _utf_iterator & rhs) const throw() { sz = std::min(ptrdiff_t(rhs.cp - cp),ptrdiff_t(127)); return 0 >= sz; }
bool operator == (const _utf_iterator & rhs) const throw() { sz = (int8_t)std::min(ptrdiff_t(rhs.cp - cp),ptrdiff_t(127)); return 0 >= sz;
}
bool operator != (const _utf_iterator & rhs) const throw() { return !operator==(rhs); }
reference operator * () const throw() { return *this; }

View file

@ -89,7 +89,7 @@ bool action_items(
auto act = km_kbp_state_action_items(state, &n);
for (auto &rhs: expected) {
if(--n < 0) {
if ((int)--n < 0) {
std::cout << "expected longer than actual" << std::endl;
print_action_item("next expected item:", rhs);
return false;

View file

@ -61,7 +61,7 @@ void setup(const char *keyboard) {
// Ensure the pre-run debug item state is not empty
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_END}
km_kbp_state_debug_item{KM_KBP_DEBUG_END, {}, {}, {}}
}));
try_status(km_kbp_context_set(km_kbp_state_context(test_state), citems));

View file

@ -171,7 +171,7 @@ bool debug_items(
auto act = km_kbp_state_debug_items(state, &n);
for (auto &rhs: expected) {
if(--n < 0) {
if ((int)--n < 0) {
std::cout << "expected longer than actual" << std::endl;
print_debug_item("next expected item:", rhs);
return false;

View file

@ -4,6 +4,15 @@
# Authors: Tim Eves (TSE)
#
if compiler.get_id() == 'gcc' or compiler.get_id() == 'clang'
warns = [
'-Wno-missing-field-initializers',
'-Wno-unused-parameter'
]
else
warns = []
endif
defns=['-DKMN_KBP_STATIC']
tests = [
['context-api', 'context_api.cpp'],
@ -17,7 +26,7 @@ tests = [
foreach t : tests
bin = executable(t[0], t[1],
cpp_args: defns,
cpp_args: defns + warns,
include_directories: [inc, libsrc],
link_args: links,
objects: lib.extract_all_objects())

View file

@ -17,6 +17,18 @@
#include "../test_assert.h"
#if defined(__GNUC__) || defined(__clang__)
#define PRAGMA(X) _Pragma(#X)
#define DISABLE_WARNING_PUSH PRAGMA(GCC diagnostic push)
#define DISABLE_WARNING_POP PRAGMA(GCC diagnostic pop)
#define DISABLE_WARNING(W) PRAGMA(GCC diagnostic ignored #W)
#define DISABLE_WARNING_TYPE_LIMITS DISABLE_WARNING(-Wtype-limits)
#else
#define DISABLE_WARNING_PUSH
#define DISABLE_WARNING_POP
#define DISABLE_WARNING_TYPE_LIMITS
#endif
namespace
{
std::string get_json_doc(km_kbp_state const& state)
@ -134,10 +146,14 @@ int main(int argc, char * argv[])
// Test the engine
auto attrs = km_kbp_get_engine_attrs(test_state);
DISABLE_WARNING_PUSH
DISABLE_WARNING_TYPE_LIMITS
// Check the lib supplies our required interface.
if (attrs->current - attrs->age > KM_KBP_LIB_CURRENT
|| attrs->current < KM_KBP_LIB_CURRENT) return __LINE__;
if (attrs->max_context < 16) return __LINE__;
DISABLE_WARNING_POP
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_S,
KM_KBP_MODIFIER_SHIFT, 1));

View file

@ -20,7 +20,7 @@ using namespace std;
#define U_1F609_WINKING_FACE u"\U0001F609"
PKMX_WCHAR find_ptr_to_last_character(PKMX_WCHAR p_first) {
int length = std::u16string(p_first).length();
auto length = std::u16string(p_first).length();
if (length > 0)
return p_first + length - 1;
else

View file

@ -82,7 +82,7 @@ apply_action(
text_store.push_back(Uni_UTF32ToSurrogate1(act.character));
text_store.push_back(Uni_UTF32ToSurrogate2(act.character));
} else {
text_store.push_back(act.character);
text_store.push_back((char16_t)act.character);
}
// std::cout << "char(" << act.character << ") size=" << cp->size() << std::endl;
break;

View file

@ -208,7 +208,7 @@ KmxTestSource::get_keyboard_options(kmx_options options) {
key_event
KmxTestSource::char_to_event(char ch) {
assert(ch >= 32 && ch <= 127);
assert(ch >= 32);
return {
km::kbp::kmx::s_char_to_vkey[(int)ch - 32].vk,
(uint16_t)(km::kbp::kmx::s_char_to_vkey[(int)ch - 32].shifted ? KM_KBP_MODIFIER_SHIFT : 0)};

View file

@ -5,6 +5,16 @@
# History: 19 Oct 2018 - TSE - Added test for context API functions.
#
if compiler.get_id() == 'gcc' or compiler.get_id() == 'clang'
warns = [
'-Wno-missing-field-initializers',
'-Wno-unused-parameter'
]
else
warns = []
endif
if compiler.get_id() == 'emscripten'
tests_flags = ['--embed-file', join_paths(meson.current_source_dir(),'@/')]
source_path = '/'
@ -18,7 +28,7 @@ endif
kmx = executable('kmx',
'kmx.cpp',
'kmx_test_source.cpp',
cpp_args: defns,
cpp_args: defns + warns,
include_directories: [inc, libsrc],
link_args: links + tests_flags,
objects: lib.extract_all_objects())
@ -205,7 +215,8 @@ endif
# test for km_kbp_keyboard_get_key_list
key_e = executable('key_list', 'kmx_key_list.cpp',
cpp_args: defns,include_directories: [inc, libsrc],
cpp_args: defns + warns,
include_directories: [inc, libsrc],
link_args: links,
objects: lib.extract_all_objects())
test_kbd = 'kmx_key_list'
@ -217,7 +228,7 @@ if kmcomp.found()
input: kbd_src,
command: kmcomp_cmd + ['-s', '-d', '@INPUT@', kbd_obj, '@OUTPUT@']
)
test('key_list', key_e, depends: kbd_log, args: [kbd_obj] )
test('key_list', key_e, depends: kbd_log, args: [kbd_obj] )
else
kbd_obj = join_paths(meson.current_source_dir(), test_kbd) + '.kmx'
test('key_list', key_e, args: [kbd_obj] )
@ -226,7 +237,8 @@ endif
# test for imx list
imx_e = executable('imx_list', 'kmx_imx.cpp',
cpp_args: defns,include_directories: [inc, libsrc],
cpp_args: defns + warns,
include_directories: [inc, libsrc],
link_args: links,
objects: lib.extract_all_objects())

View file

@ -40,7 +40,7 @@ int run_tests(char const *prog_name, test<UTF> const (&tests)[N])
for (auto const & test: tests)
{
auto const test_num = &test - &tests[0] + 1;
auto const test_num = (int)(&test - &tests[0] + 1);
size_t res = count_unicode_characters<UTF>(test.str, error);
if (test.error >= 0)
{

View file

@ -33,6 +33,45 @@ namespace models {
let leftSpans = wordBreaker(context.left || '') || [];
let rightSpans = wordBreaker(context.right || '') || [];
let leftTail: Span;
if(leftSpans.length > 0) {
leftTail = leftSpans[leftSpans.length - 1];
}
// Handle any desired special handling for directly-pre-caret scenarios - where for this
// _specific_ context, we should not make a token division where one normally would exist otherwise.
//
// One notable example: word-final apostrophe is tokenized separate from preceding text, but
// word-internal apostrophe is treated as part of the same word (i.e, English contractions).
// But, if the user is editing text and the caret is directly after a caret, there's a notable
// chance they may in the middle of typing a contraction. Refer to
// https://github.com/keymanapp/keyman/issues/6572.
if(leftSpans.length > 1) {
const leftTailBase = leftSpans[leftSpans.length - 2];
// If the final two pre-caret spans are adjacent - without intervening whitespace...
if(leftTailBase.end == leftTail.start) {
// Ideal: if(leftTailBase is standard-char-class && leftTail is single-quote-class)
// But we don't have character class access here; it's all wordbreaker-function internal.
// Upon inspection of the wordbreaker data definitions... the single-quote-class is ONLY "'".
// So... we'll just be lazy for now and append the `'`.
if(leftTail.text == "'") {
let mergedSpan: Span = {
text: leftTailBase.text + leftTail.text,
start: leftTailBase.start,
end: leftTail.end,
length: leftTailBase.length + leftTail.length
};
leftSpans.pop(); // leftTail
leftSpans.pop(); // leftTailBase
leftSpans.push(mergedSpan);
leftTail = mergedSpan; // don't forget to update the `leftTail` Span!
}
}
}
// With any 'detokenization' cases already handled, we may now begin to build the return object.
let tokenization: Tokenization = {
left: leftSpans.map(span => span.text),
right: rightSpans.map(span => span.text),
@ -43,7 +82,6 @@ namespace models {
// Now the hard part - determining whether or not the caret caused a token split.
if(leftSpans.length > 0 && rightSpans.length > 0) {
let leftTail = leftSpans[leftSpans.length - 1];
let rightHead = rightSpans[0];
// If tokenization includes all characters on each side of the caret,

View file

@ -0,0 +1,6 @@
Issue 6005 Test Keyboard Change History
====================
1.0 (2022-04-11)
----------------
* Created by SIL Int'l

View file

@ -0,0 +1,21 @@
The MIT License (MIT)
© 2022 SIL Int'l
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,30 @@
Issue 6005 test keyboard - model interactions with unmatched final group
==============
Version 1.0
Description
-----------
Generated from template
Links
-----
Copyright
---------
See [LICENSE.md](LICENSE.md)
Supported Platforms
-------------------
* Windows
* macOS
* Linux
* Web
* iPhone
* iPad
* Android phone
* Android tablet
* Mobile devices
* Desktop devices
* Tablet devices

View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Issue 6005 Test Keyboard</title>
<style type="text/css">
p { font: 10pt Tahoma; }
h1 { font: bold 16pt Tahoma; color: #4444cc; margin-bottom: 2px }
h2 { font: bold 12pt Tahoma; color: #4444cc; }
</style>
</head>
<body>
<h1>Issue 6005 Test Keyboard</h1>
<p>
Issue 6005 Test Keyboard 1.0 generated from template.
</p>
<p>
Designed as a test keyboard for specialized cases where an early rule matches but a later-applied keyboard rule on the same keypress does not.
Only tolerates two continguous vowels at most; will not emit a third vowel in a row. Does not interfere with consonants or the semi-vowel 'y'.
</p>
<p>©2022 SIL Int'l</p>
</body>
</html>

View file

@ -0,0 +1,52 @@
c unmatched_final_group_model_interactions_6005 generated from template at 2022-04-11 11:51:48
c with name "Vowel Hater"
c
c This test-oriented keyboard "hates" words with more than two consecutive vowels.
c In order to test within-word applications of non-final rule matching with final rule non-matching,
c Vowels are NOT emitted by keyboard rule; only by 'default' behavior.
c
c For test coverage, also really likes duplicating 'y' and 'Y'.
store(&VERSION) '10.0'
store(&NAME) 'Issue 6005 - "Vowel Hater"'
store(&COPYRIGHT) '© SIL Int' U+0027 'l'
store(&KEYBOARDVERSION) '1.0'
store(&TARGETS) 'any'
store(&VISUALKEYBOARD) 'unmatched_final_group_model_interactions_6005.kvks'
store(&LAYOUTFILE) 'unmatched_final_group_model_interactions_6005.keyman-touch-layout'
store(vowels) 'aeiouAEIOU' c Doesn't hate 'y' or 'Y'.
store(vowel_keys) [K_A] [K_E] [K_I] [K_O] [K_U] \
[SHIFT K_A] [SHIFT K_E] [SHIFT K_I] [SHIFT K_O] [SHIFT K_U]
store(cons) 'bcdfghjklmn' \
'pqrstvwxz' \
'BCDFGHJKLMN' \
'PQRSTVWXZ'
store(cons_keys) [K_B] [K_C] [K_D] [K_F] [K_G] [K_H] \
[K_J] [K_K] [K_L] [K_M] [K_N] \
[K_P] [K_Q] [K_R] [K_S] [K_T] [K_V] \
[K_W] [K_X] [K_Z] \
[SHIFT K_B] [SHIFT K_C] [SHIFT K_D] [SHIFT K_F] [SHIFT K_G] [SHIFT K_H] \
[SHIFT K_J] [SHIFT K_K] [SHIFT K_L] [SHIFT K_M] [SHIFT K_N] \
[SHIFT K_P] [SHIFT K_Q] [SHIFT K_R] [SHIFT K_S] [SHIFT K_T] [SHIFT K_V] \
[SHIFT K_W] [SHIFT K_X] [SHIFT K_Z]
begin Unicode > use(main)
group(main) using keys
+ any(cons_keys) > index(cons, 1)
c Vowel-hating pass 1
+ any(vowel_keys) > use(vowel_tolerance)
c Semi-vowel love (to test context manip early-match with no-match on later group)
+ [K_Y] > 'y' use(vowel_tolerance)
+ [SHIFT K_Y] > 'Y' use(vowel_tolerance)
c Vowel-hating pass 2
group(vowel_tolerance) using keys
c By matching a contiguous vowel pair, further contiguous vowels will be blocked.
c Note that 'tolerated' vowels are only emitted due to default behavior.
any(vowels) any(vowels) + any(vowel_keys) > context

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<Package>
<System>
<KeymanDeveloperVersion>15.0.231.0</KeymanDeveloperVersion>
<FileVersion>7.0</FileVersion>
</System>
<Options>
<ExecuteProgram></ExecuteProgram>
<ReadMeFile>readme.htm</ReadMeFile>
<MSIFileName></MSIFileName>
<MSIOptions></MSIOptions>
<FollowKeyboardVersion/>
</Options>
<StartMenu>
<Folder></Folder>
<Items/>
</StartMenu>
<Info>
<Name URL="">Issue 6005 - "Vowel Hater"</Name>
<Copyright URL="">© SIL Int'l</Copyright>
<Author URL="">SIL Int'l</Author>
<Version URL=""></Version>
</Info>
<Files>
<File>
<Name>..\build\unmatched_final_group_model_interactions_6005.kmx</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.kmx</FileType>
</File>
<File>
<Name>..\build\unmatched_final_group_model_interactions_6005.js</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.js</FileType>
</File>
<File>
<Name>..\build\unmatched_final_group_model_interactions_6005.kvk</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.kvk</FileType>
</File>
<File>
<Name>welcome.htm</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.htm</FileType>
</File>
<File>
<Name>readme.htm</Name>
<Description></Description>
<CopyLocation>0</CopyLocation>
<FileType>.htm</FileType>
</File>
</Files>
<Keyboards>
<Keyboard>
<Name>Issue 6005 - "Vowel Hater"</Name>
<ID>unmatched_final_group_model_interactions_6005</ID>
<Version>1.0</Version>
<Languages>
<Language ID="en">English</Language>
</Languages>
</Keyboard>
</Keyboards>
<Strings/>
</Package>

View file

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<visualkeyboard>
<header>
<version>10.0</version>
<kbdname>unmatched_final_group_model_interactions_6005</kbdname>
<flags/>
</header>
<encoding name="unicode" fontname="Arial" fontsize="-12">
<layer shift="">
<key vkey="K_BKQUOTE">`</key>
<key vkey="K_1">1</key>
<key vkey="K_2">2</key>
<key vkey="K_3">3</key>
<key vkey="K_4">4</key>
<key vkey="K_5">5</key>
<key vkey="K_6">6</key>
<key vkey="K_7">7</key>
<key vkey="K_8">8</key>
<key vkey="K_9">9</key>
<key vkey="K_0">0</key>
<key vkey="K_HYPHEN">-</key>
<key vkey="K_EQUAL">=</key>
<key vkey="K_Q">q</key>
<key vkey="K_W">w</key>
<key vkey="K_E">e</key>
<key vkey="K_R">r</key>
<key vkey="K_T">t</key>
<key vkey="K_Y">y</key>
<key vkey="K_U">u</key>
<key vkey="K_I">i</key>
<key vkey="K_O">o</key>
<key vkey="K_P">p</key>
<key vkey="K_LBRKT">[</key>
<key vkey="K_RBRKT">]</key>
<key vkey="K_BKSLASH">\</key>
<key vkey="K_A">a</key>
<key vkey="K_S">s</key>
<key vkey="K_D">d</key>
<key vkey="K_F">f</key>
<key vkey="K_G">g</key>
<key vkey="K_H">h</key>
<key vkey="K_J">j</key>
<key vkey="K_K">k</key>
<key vkey="K_L">l</key>
<key vkey="K_COLON">;</key>
<key vkey="K_QUOTE">'</key>
<key vkey="K_oE2">\</key>
<key vkey="K_Z">z</key>
<key vkey="K_X">x</key>
<key vkey="K_C">c</key>
<key vkey="K_V">v</key>
<key vkey="K_B">b</key>
<key vkey="K_N">n</key>
<key vkey="K_M">m</key>
<key vkey="K_COMMA">,</key>
<key vkey="K_PERIOD">.</key>
<key vkey="K_SLASH">/</key>
</layer>
<layer shift="S">
<key vkey="K_BKQUOTE">~</key>
<key vkey="K_1">!</key>
<key vkey="K_2">@</key>
<key vkey="K_3">#</key>
<key vkey="K_4">$</key>
<key vkey="K_5">%</key>
<key vkey="K_6">^</key>
<key vkey="K_7">&amp;</key>
<key vkey="K_8">*</key>
<key vkey="K_9">(</key>
<key vkey="K_0">)</key>
<key vkey="K_HYPHEN">_</key>
<key vkey="K_EQUAL">+</key>
<key vkey="K_Q">Q</key>
<key vkey="K_W">W</key>
<key vkey="K_E">E</key>
<key vkey="K_R">R</key>
<key vkey="K_T">T</key>
<key vkey="K_Y">Y</key>
<key vkey="K_U">U</key>
<key vkey="K_I">I</key>
<key vkey="K_O">O</key>
<key vkey="K_P">P</key>
<key vkey="K_LBRKT">{</key>
<key vkey="K_RBRKT">}</key>
<key vkey="K_BKSLASH">|</key>
<key vkey="K_A">A</key>
<key vkey="K_S">S</key>
<key vkey="K_D">D</key>
<key vkey="K_F">F</key>
<key vkey="K_G">G</key>
<key vkey="K_H">H</key>
<key vkey="K_J">J</key>
<key vkey="K_K">K</key>
<key vkey="K_L">L</key>
<key vkey="K_COLON">:</key>
<key vkey="K_QUOTE">"</key>
<key vkey="K_oE2">|</key>
<key vkey="K_Z">Z</key>
<key vkey="K_X">X</key>
<key vkey="K_C">C</key>
<key vkey="K_V">V</key>
<key vkey="K_B">B</key>
<key vkey="K_N">N</key>
<key vkey="K_M">M</key>
<key vkey="K_COMMA">&lt;</key>
<key vkey="K_PERIOD">&gt;</key>
<key vkey="K_SLASH">?</key>
</layer>
</encoding>
</visualkeyboard>

View file

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Start Using This (Issue 6005) Test Keyboard</title>
<style type="text/css">
p { font: 10pt Tahoma; }
h1 { font: bold 16pt Tahoma; color: #4444cc; margin-bottom: 2px }
h2 { font: bold 12pt Tahoma; color: #4444cc; }
</style>
</head>
<body>
<h1>Start Using This (Issue 6005) Test Keyboard</h1>
<p>
This keyboard will automatically prevent production of vowels
immediately following two consecutive vowels by use of rule groupings
designed to test issue 6005 for output keys.
</p>
<p>
It will also automatically duplicate any typed 'y' keys, providing
behavior useful to test another angle of the same issue.
</p>
<h1>Keyboard Layout</h1>
<!-- Insert Keyboard Layout Images or HTML here -->
<p>Follows the standard US QWERTY layout.</p>
</body>
</html>

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<KeymanDeveloperProject>
<Options>
<BuildPath>$PROJECTPATH\build</BuildPath>
<CompilerWarningsAsErrors>True</CompilerWarningsAsErrors>
<WarnDeprecatedCode>True</WarnDeprecatedCode>
<CheckFilenameConventions>True</CheckFilenameConventions>
<ProjectType>keyboard</ProjectType>
</Options>
<Files>
<File>
<ID>id_4f5496a37662e0a9f4c58a8fa7f278fe</ID>
<Filename>unmatched_final_group_model_interactions_6005.kmn</Filename>
<Filepath>source\unmatched_final_group_model_interactions_6005.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
<Details>
<Name>Issue 6005 - "Vowel Hater"</Name>
<Copyright>© SIL Int'l</Copyright>
</Details>
</File>
<File>
<ID>id_662849508b9a7885735a354908c0a3bb</ID>
<Filename>unmatched_final_group_model_interactions_6005.kps</Filename>
<Filepath>source\unmatched_final_group_model_interactions_6005.kps</Filepath>
<FileVersion></FileVersion>
<FileType>.kps</FileType>
<Details>
<Name>Issue 6005 - "Vowel Hater"</Name>
<Copyright>© SIL Int'l</Copyright>
</Details>
</File>
<File>
<ID>id_ede98e4633e239f933cbfd1f4e1b766c</ID>
<Filename>HISTORY.md</Filename>
<Filepath>HISTORY.md</Filepath>
<FileVersion></FileVersion>
<FileType>.md</FileType>
</File>
<File>
<ID>id_53e892b8b41cc4caece1cfd5ef21d6e7</ID>
<Filename>LICENSE.md</Filename>
<Filepath>LICENSE.md</Filepath>
<FileVersion></FileVersion>
<FileType>.md</FileType>
</File>
<File>
<ID>id_0730bb7c2e8f9ea2438b52e419dd86c9</ID>
<Filename>README.md</Filename>
<Filepath>README.md</Filepath>
<FileVersion></FileVersion>
<FileType>.md</FileType>
</File>
<File>
<ID>id_d84c8aa5318b9595b931fb2cd35a7527</ID>
<Filename>unmatched_final_group_model_interactions_6005.kmx</Filename>
<Filepath>source\..\build\unmatched_final_group_model_interactions_6005.kmx</Filepath>
<FileVersion></FileVersion>
<FileType>.kmx</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
<File>
<ID>id_48f335f84e3dab5d9e453b8239624b48</ID>
<Filename>unmatched_final_group_model_interactions_6005.js</Filename>
<Filepath>source\..\build\unmatched_final_group_model_interactions_6005.js</Filepath>
<FileVersion></FileVersion>
<FileType>.js</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
<File>
<ID>id_880465e1da554f209ca7c05243823415</ID>
<Filename>unmatched_final_group_model_interactions_6005.kvk</Filename>
<Filepath>source\..\build\unmatched_final_group_model_interactions_6005.kvk</Filepath>
<FileVersion></FileVersion>
<FileType>.kvk</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
<File>
<ID>id_356e5d149c1e539356d72698c1e401a6</ID>
<Filename>welcome.htm</Filename>
<Filepath>source\welcome.htm</Filepath>
<FileVersion></FileVersion>
<FileType>.htm</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
<File>
<ID>id_8da344c4cea6f467013357fe099006f5</ID>
<Filename>readme.htm</Filename>
<Filepath>source\readme.htm</Filepath>
<FileVersion></FileVersion>
<FileType>.htm</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
</Files>
</KeymanDeveloperProject>

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<KeymanDeveloperProject>
<Options>
<BuildPath>$PROJECTPATH\build</BuildPath>
<CompilerWarningsAsErrors>True</CompilerWarningsAsErrors>
<WarnDeprecatedCode>True</WarnDeprecatedCode>
<CheckFilenameConventions>True</CheckFilenameConventions>
<ProjectType>keyboard</ProjectType>
</Options>
<Files>
<File>
<ID>id_4f5496a37662e0a9f4c58a8fa7f278fe</ID>
<Filename>unmatched_final_group_model_interactions_6005.kmn</Filename>
<Filepath>source\unmatched_final_group_model_interactions_6005.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
<Details>
<Name>Issue 6005 - "Vowel Hater"</Name>
<Copyright>© SIL Int'l</Copyright>
</Details>
</File>
<File>
<ID>id_662849508b9a7885735a354908c0a3bb</ID>
<Filename>unmatched_final_group_model_interactions_6005.kps</Filename>
<Filepath>source\unmatched_final_group_model_interactions_6005.kps</Filepath>
<FileVersion></FileVersion>
<FileType>.kps</FileType>
<Details>
<Name>Issue 6005 - "Vowel Hater"</Name>
<Copyright>© SIL Int'l</Copyright>
</Details>
</File>
<File>
<ID>id_ede98e4633e239f933cbfd1f4e1b766c</ID>
<Filename>HISTORY.md</Filename>
<Filepath>HISTORY.md</Filepath>
<FileVersion></FileVersion>
<FileType>.md</FileType>
</File>
<File>
<ID>id_53e892b8b41cc4caece1cfd5ef21d6e7</ID>
<Filename>LICENSE.md</Filename>
<Filepath>LICENSE.md</Filepath>
<FileVersion></FileVersion>
<FileType>.md</FileType>
</File>
<File>
<ID>id_0730bb7c2e8f9ea2438b52e419dd86c9</ID>
<Filename>README.md</Filename>
<Filepath>README.md</Filepath>
<FileVersion></FileVersion>
<FileType>.md</FileType>
</File>
<File>
<ID>id_e85e92b4c5fbf57dc8ae85f00ce5a068</ID>
<Filename>unmatched_final_group_model_interactions_6005.kmx</Filename>
<Filepath>source\..\build\unmatched_final_group_model_interactions_6005.kmx</Filepath>
<FileVersion></FileVersion>
<FileType>.kmx</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
<File>
<ID>id_80197977032e3d5266b571033e0f0ff4</ID>
<Filename>unmatched_final_group_model_interactions_6005.js</Filename>
<Filepath>source\..\build\unmatched_final_group_model_interactions_6005.js</Filepath>
<FileVersion></FileVersion>
<FileType>.js</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
<File>
<ID>id_4e56168448a8471df8611394620e7775</ID>
<Filename>unmatched_final_group_model_interactions_6005.kvk</Filename>
<Filepath>source\..\build\unmatched_final_group_model_interactions_6005.kvk</Filepath>
<FileVersion></FileVersion>
<FileType>.kvk</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
<File>
<ID>id_356e5d149c1e539356d72698c1e401a6</ID>
<Filename>welcome.htm</Filename>
<Filepath>source\welcome.htm</Filepath>
<FileVersion></FileVersion>
<FileType>.htm</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
<File>
<ID>id_8da344c4cea6f467013357fe099006f5</ID>
<Filename>readme.htm</Filename>
<Filepath>source\readme.htm</Filepath>
<FileVersion></FileVersion>
<FileType>.htm</FileType>
<ParentFileID>id_662849508b9a7885735a354908c0a3bb</ParentFileID>
</File>
</Files>
</KeymanDeveloperProject>

View file

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<KeymanDeveloperProjectUser>
<ViewState>
<tab>1</tab>
<showhelp>1</showhelp>
<path>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\unmatched_final_group_model_interactions_6005.kpj</path>
<file ID="id_ce4234903ee2da9404650af1baaeff37" Expanded="1"/>
<file ID="id_662849508b9a7885735a354908c0a3bb" Expanded="1"/>
</ViewState>
<FileStates>
<FileState>
<ID>id_4f5496a37662e0a9f4c58a8fa7f278fe</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\source\unmatched_final_group_model_interactions_6005.kmn</FullPath>
<IDEState>
<LayoutDisplay102Key>0</LayoutDisplay102Key>
<DebugDefaultFont>1</DebugDefaultFont>
<DebugFont>Consolas|-9| |0</DebugFont>
<CodeFont>Consolas|-9| |0</CodeFont>
<CharFont>Consolas|-9| |0</CharFont>
</IDEState>
<Debug>False</Debug>
</FileState>
<FileState>
<ID>id_662849508b9a7885735a354908c0a3bb</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\source\unmatched_final_group_model_interactions_6005.kps</FullPath>
</FileState>
<FileState>
<ID>id_ede98e4633e239f933cbfd1f4e1b766c</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\HISTORY.md</FullPath>
</FileState>
<FileState>
<ID>id_53e892b8b41cc4caece1cfd5ef21d6e7</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\LICENSE.md</FullPath>
</FileState>
<FileState>
<ID>id_0730bb7c2e8f9ea2438b52e419dd86c9</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\README.md</FullPath>
</FileState>
<FileState>
<ID>id_e85e92b4c5fbf57dc8ae85f00ce5a068</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\source\..\build\unmatched_final_group_model_interactions_6005.kmx</FullPath>
</FileState>
<FileState>
<ID>id_80197977032e3d5266b571033e0f0ff4</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\source\..\build\unmatched_final_group_model_interactions_6005.js</FullPath>
</FileState>
<FileState>
<ID>id_4e56168448a8471df8611394620e7775</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\source\..\build\unmatched_final_group_model_interactions_6005.kvk</FullPath>
</FileState>
<FileState>
<ID>id_356e5d149c1e539356d72698c1e401a6</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\source\welcome.htm</FullPath>
</FileState>
<FileState>
<ID>id_8da344c4cea6f467013357fe099006f5</ID>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\source\readme.htm</FullPath>
</FileState>
</FileStates>
<MRU>
<File>
<ID>id_MRU0</ID>
<Filename>unmatched_final_group_model_interactions_6005.kmn</Filename>
<FileType>.kmn</FileType>
<FullPath>C:\keymanapp\keyman\common\test\keyboards\unmatched_final_group_model_interactions_6005\source\unmatched_final_group_model_interactions_6005.kmn</FullPath>
</File>
</MRU>
</KeymanDeveloperProjectUser>

View file

@ -139,9 +139,28 @@ namespace com.keyman.text {
this.keyboardProcessor.selectLayer(keyEvent);
}
// If it's a key that we 'optimize out' of our fat-finger correction algorithm,
// we MUST NOT trigger it for this keystroke.
let isOnlyLayerShift = text.Codes.isKnownOSKModifierKey(keyEvent.kName);
// Best-guess stopgap for possible custom modifier keys.
// If a key (1) does not affect the context and (2) shifts the active layer,
// we assume it's a modifier key. (Touch keyboards may define custom modifier keys.)
//
// Note: this could cause an issue in the niche scenario where:
// 1. Keypress does not alter the actual context
// 2. It DOES emit a deadkey with an earlier processing rule.
// 3. The FINAL processing rule does not match.
// 4. The key ALSO signals a layer shift.
// If any of the four above conditions aren't met - no problem!
// So it's a pretty niche scenario.
if((ruleBehavior.transcription?.transform as TextTransform).isNoOp() && keyEvent.kNextLayer) {
isOnlyLayerShift = true;
}
const keepRuleBehavior = ruleBehavior != null;
// Should we swallow any further processing of keystroke events for this keydown-keypress sequence?
if(keepRuleBehavior) {
if(keepRuleBehavior && !isOnlyLayerShift) {
let alternates = this.buildAlternates(ruleBehavior, keyEvent, preInputMock);
// Now that we've done all the keystroke processing needed, ensure any extra effects triggered
@ -154,7 +173,7 @@ namespace com.keyman.text {
if(alternates && alternates.length > 0) {
ruleBehavior.transcription.alternates = alternates;
}
} else {
} else if(ruleBehavior == null) {
// We need a dummy RuleBehavior for keys which have no output (e.g. Shift)
ruleBehavior = new RuleBehavior();
ruleBehavior.transcription = outputTarget.buildTranscriptionFrom(outputTarget, null, false);

View file

@ -7,6 +7,7 @@
"declaration": true,
"inlineSources": true,
"sourceMap": true,
"sourceRoot": "keyman/",
"target": "es5",
"types": ["node"],
"lib": ["es6"],

View file

@ -57,7 +57,7 @@ fi
# Ensures that the lexical model compiler has been built locally.
echo_heading "Preparing Lexical Model Compiler for test use"
pushd "$KEYMAN_ROOT/developer/js/"
npm run build
./build.sh
popd
test-headless ( ) {

View file

@ -548,22 +548,8 @@ namespace com.keyman.keyboards {
} else {
// Attempt to filter out known non-output keys.
// Results in a more optimized distribution.
switch(key.baseKeyID) {
case 'K_SHIFT':
case 'K_LOPT':
case 'K_ROPT':
case 'K_NUMLOCK': // Often used for numeric layers.
case 'K_CAPS':
// As these aren't output keys, they shouldn't be possible fat-finger targets.
return;
default:
// Refer to text/codes.ts - these are Keyman-custom "keycodes" used for
// layer shifting keys. To be safe, we currently let K_TABBACK and
// K_TABFWD through, though we might be able to drop them too.
let code = com.keyman.text.Codes[key.baseKeyID];
if(code > 50000 && code < 50011) {
return;
}
if(text.Codes.isKnownOSKModifierKey(key.baseKeyID)) {
return;
}
}
// These represent the within-key distance of the touch from the key's center.

View file

@ -74,6 +74,27 @@ namespace com.keyman.text {
codesUS: [
['0123456789',';=,-./`', '[\\]\''],
[')!@#$%^&*(',':+<_>?~', '{|}"']
]
],
isKnownOSKModifierKey(keyID: string): boolean {
switch(keyID) {
case 'K_SHIFT':
case 'K_LOPT':
case 'K_ROPT':
case 'K_NUMLOCK': // Often used for numeric layers.
case 'K_CAPS':
return true;
default:
// Refer to text/codes.ts - these are Keyman-custom "keycodes" used for
// layer shifting keys. To be safe, we currently let K_TABBACK and
// K_TABFWD through, though we might be able to drop them too.
let code = com.keyman.text.Codes[keyID];
if(code > 50000 && code < 50011) {
return true;
}
}
return false;
}
}
}

View file

@ -272,10 +272,7 @@ namespace com.keyman.text {
matchBehavior.mergeInDefaults(defaultBehavior);
}
matchBehavior.triggerKeyDefault = false; // We've triggered it successfully.
} else {
// If null, we must rely on something else (like the browser, in DOM-aware code) to fulfill the default.
matchBehavior = null;
}
} // If null, we must rely on something else (like the browser, in DOM-aware code) to fulfill the default.
this.keyboardInterface.activeTargetOutput = null;
}

View file

@ -20,6 +20,10 @@ namespace com.keyman.text {
}
public static readonly nil = new TextTransform('', 0, 0);
public isNoOp(): boolean {
return this.insert === '' && this.deleteLeft === 0 && this.deleteRight === 0;
}
}
export class Transcription {

View file

@ -7,6 +7,7 @@
"declaration": true,
"inlineSources": true,
"sourceMap": true,
"sourceRoot": "keyman/",
"target": "es5",
"types": ["node"],
"lib": ["es6"],

View file

@ -334,6 +334,16 @@ namespace correction {
ignorePenultimateMatch = true;
}
// Can happen for the first text input after backspace deletes a wordbreaking character,
// thus the new input continues a previous word while dropping the empty word after
// that prior wordbreaking character.
//
// We can't handle it reliably from this match state, but a previous entry (without the empty token)
// should still be in the cache and will be reliable for this example case.
if(tailIndex > 0 && editPath[tailIndex-1] == 'delete' && editPath[tailIndex] == 'substitute') {
return null;
}
// Now to check everything in-between: should be exclusively 'match'es.
for(let index = 1; index < editPath.length - (ignorePenultimateMatch ? 2 : 1); index++) {
if(editPath[index] != 'match') {

View file

@ -8,7 +8,7 @@ namespace correction {
traversal: LexiconTraversal
}
export const QUEUE_NODE_COMPARATOR: any /*models.Comparator<SearchNode>*/ = function(arg1, arg2) { // @ts-ignore
export const QUEUE_NODE_COMPARATOR: models.Comparator<SearchNode> = function(arg1, arg2) {
return arg1.currentCost - arg2.currentCost;
}

View file

@ -383,7 +383,7 @@ class LMLayerWorker {
*
* @param scope A global scope to install upon.
*/
static install(scope: any /* DedicatedWorkerGlobalScope */): LMLayerWorker { // @ts-ignore
static install(scope: DedicatedWorkerGlobalScope): LMLayerWorker {
let worker = new LMLayerWorker({ postMessage: scope.postMessage, importScripts: scope.importScripts.bind(scope) });
scope.onmessage = worker.onMessage.bind(worker);
worker.self = scope;

View file

@ -31,8 +31,8 @@
/**
* The signature of self.postMessage(), so that unit tests can mock it.
*/
type PostMessage = any; //typeof DedicatedWorkerGlobalScope.prototype.postMessage; // @ts-ignore
type ImportScripts = any; //typeof DedicatedWorkerGlobalScope.prototype.importScripts; // @ts-ignore
type PostMessage = typeof DedicatedWorkerGlobalScope.prototype.postMessage;
type ImportScripts = typeof DedicatedWorkerGlobalScope.prototype.importScripts;
/**

View file

@ -99,13 +99,15 @@ namespace com.keyman {
// Sanitizes the event object (in-place) to remove sensitive information
// from the breadcrumbs and url
sanitizeEvent(event: any) {
event.breadcrumbs.forEach((b: any) => {
if (b.category == 'navigation') {
let NAVIGATION_PATTERN = /(.*)?(keyboard\.html#[^-]+)-.*/;
b.data.from = b.data.from.replace(NAVIGATION_PATTERN, '$1$2');
b.data.to = b.data.to.replace(NAVIGATION_PATTERN, '$1$2');
}
});
if (event && event.breadcrumbs) {
event.breadcrumbs.forEach((b: any) => {
if (b.category == 'navigation') {
let NAVIGATION_PATTERN = /(.*)?(keyboard\.html#[^-]+)-.*/;
b.data.from = b.data.from.replace(NAVIGATION_PATTERN, '$1$2');
b.data.to = b.data.to.replace(NAVIGATION_PATTERN, '$1$2');
}
});
}
if (event.request.url) {
let URL_PATTERN = /#.*$/;

View file

@ -74,18 +74,30 @@ files:
- source: /ios/engine/KMEI/KeymanEngine/Classes/en.lproj/ResourceInfoView.strings
dest: /ios/engine/ResourceInfoView.strings
translation: /ios/engine/KMEI/KeymanEngine/Classes/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
- source: /ios/engine/KMEI/KeymanEngine/en.lproj/Localizable.strings
dest: /ios/engine/Localizable.strings
translation: /ios/engine/KMEI/KeymanEngine/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
- source: /ios/engine/KMEI/KeymanEngine/en.lproj/Localizable.stringsdict
dest: /ios/engine/Localizable.stringsdict
translation: /ios/engine/KMEI/KeymanEngine/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
- source: /ios/keyman/Keyman/Keyman/en.lproj/Localizable.strings
dest: /ios/app/Localizable.strings
translation: /ios/keyman/Keyman/Keyman/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
# Linux files
@ -94,32 +106,54 @@ files:
translation: /linux/keyman-config/locale/%locale_with_underscore%.po
type: gettext
update_option: update_as_unapproved
languages_mapping:
locale_with_underscore:
shu-latn-n: shu@latin
ha: ha
# macOS files
- source: /mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/en.lproj/KMAboutWindowController.strings
dest: /mac/app/KMAboutWindowController.strings
translation: /mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
- source: /mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/en.lproj/preferences.strings
dest: /mac/app/preferences.strings
translation: /mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
- source: /mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/en.lproj/KMInfoWindowController.strings
dest: /mac/app/KMInfoWindowController.strings
translation: /mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
- source: /mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/en.lproj/KMKeyboardHelpWindowController.strings
dest: /mac/app/KMKeyboardHelpWindowController.strings
translation: /mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
- source: /mac/Keyman4MacIM/Keyman4MacIM/en.lproj/Localizable.strings
dest: /mac/app/Localizable.strings
translation: /mac/Keyman4MacIM/Keyman4MacIM/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
- source: /mac/Keyman4MacIM/Keyman4MacIM/en.lproj/MainMenu.strings
dest: /mac/app/MainMenu.strings
translation: /mac/Keyman4MacIM/Keyman4MacIM/%osx_code%/%original_file_name%
languages_mapping:
osx_code:
pt-PT: pt-PT.lproj
# crowdin parameters descriptions:

View file

@ -108,7 +108,6 @@ mv kmtypes.tgz "$KEYMAN_WIX_TEMP_MODELCOMPILER"
cd "$KEYMAN_WIX_TEMP_MODELCOMPILER"
# package-lock.json wasn't bundled; this is needed to keep dependency versions
# consistent.
# cp "$KEYMAN_MODELCOMPILER_TEMP/package-lock.json" "$KEYMAN_WIX_TEMP_MODELCOMPILER/"
# as of npm v8.x, even though we are only working with `dependencies`,
# `devDependencies` is still checked, and as these modules are present in

View file

@ -68,7 +68,10 @@
"args": [
"CPPFLAGS=\"-DG_MESSAGES_DEBUG -I${workspaceFolder}/common/core/desktop/build/arch/debug/include/ -I${workspaceFolder}/common/core/desktop/include/\"",
"CFLAGS=\"-g -O0\"",
"CXXFLAGS=\"-g -O0\""
"CXXFLAGS=\"-g -O0\"",
"KEYMAN_PROC_LIBS=\"-L${workspaceFolder}/common/core/desktop/build/arch/debug/src -lkmnkbp0\"",
"KEYMAN_PROC_CFLAGS=\"-I${workspaceFolder}/common/core/desktop/build/arch/debug/include -I${workspaceFolder}/common/core/desktop/include\"",
"PKG_CONFIG_PATH=${workspaceFolder}/common/core/desktop/build/arch/debug/meson-private"
],
"options": {
"cwd": "${workspaceFolder}/linux/ibus-keyman"

View file

@ -308,6 +308,15 @@
2949146F2738DA6700400732 /* ff-NG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ff-NG"; path = "ff-NG.lproj/ResourceInfoView.strings"; sourceTree = "<group>"; };
294914702738DD7400400732 /* ff-NG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ff-NG"; path = "ff-NG.lproj/Localizable.strings"; sourceTree = "<group>"; };
294914712738DD9700400732 /* ff-NG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "ff-NG"; path = "ff-NG.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
29BFA75E28293287009FCCC3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/ResourceInfoView.strings; sourceTree = "<group>"; };
29BFA75F282934B4009FCCC3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
29BFA760282934BB009FCCC3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = it; path = it.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
29BFA76A28294746009FCCC3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/ResourceInfoView.strings; sourceTree = "<group>"; };
29BFA76B28294813009FCCC3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = "<group>"; };
29BFA76C28294833009FCCC3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = pl; path = pl.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
29C1E17128001F7600759EDE /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/ResourceInfoView.strings"; sourceTree = "<group>"; };
29C1E17228001F8800759EDE /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
29C1E17328001FA200759EDE /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "pt-PT"; path = "pt-PT.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
377D10DD26846B8900467431 /* SpacebarTextViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpacebarTextViewController.swift; sourceTree = "<group>"; };
6C0A140E151EA930007FA4AD /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
6C0A140F151EA930007FA4AD /* Keyman.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; lineEnding = 0; path = Keyman.xcconfig; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.xcconfig; };
@ -1179,6 +1188,9 @@
"zh-Hans",
ha,
"ff-NG",
"pt-PT",
it,
pl
);
mainGroup = F243887314BBD43000A3E055;
productRefGroup = F243887F14BBD43000A3E055 /* Products */;
@ -1568,6 +1580,9 @@
CEEC467E26F2F777009A5B7D /* zh-Hans */,
293EA3DD270596B700545EED /* ha */,
294914712738DD9700400732 /* ff-NG */,
29C1E17328001FA200759EDE /* pt-PT */,
29BFA760282934BB009FCCC3 /* it */,
29BFA76C28294833009FCCC3 /* pl */
);
name = Localizable.stringsdict;
sourceTree = "<group>";
@ -1586,6 +1601,9 @@
CEEC467D26F2F76E009A5B7D /* zh-Hans */,
293EA3DC2705964200545EED /* ha */,
294914702738DD7400400732 /* ff-NG */,
29C1E17228001F8800759EDE /* pt-PT */,
29BFA75F282934B4009FCCC3 /* it */,
29BFA76B28294813009FCCC3 /* pl */
);
name = Localizable.strings;
sourceTree = "<group>";
@ -1605,6 +1623,9 @@
CEEC467526F2F5EE009A5B7D /* zh-Hans */,
293EA3DB2705955300545EED /* ha */,
2949146F2738DA6700400732 /* ff-NG */,
29C1E17128001F7600759EDE /* pt-PT */,
29BFA75E28293287009FCCC3 /* it */,
29BFA76A28294746009FCCC3 /* pl */
);
name = ResourceInfoView.xib;
sourceTree = "<group>";

View file

@ -38,6 +38,8 @@ class KeymanWebViewController: UIViewController {
let storage: Storage
weak var delegate: KeymanWebDelegate?
private var useSpecialFont = false
private var userContentController = WKUserContentController()
private let keymanWebViewName: String = "keyman"
// Views
var webView: KeymanWebView?
@ -120,11 +122,8 @@ class KeymanWebViewController: UIViewController {
prefs.javaScriptEnabled = true
config.preferences = prefs
config.suppressesIncrementalRendering = false
let userContentController = WKUserContentController()
userContentController.add(self, name: "keyman")
config.userContentController = userContentController
config.userContentController = self.userContentController
webView = KeymanWebView(frame: CGRect(origin: .zero, size: keyboardSize), configuration: config)
webView!.isOpaque = false
webView!.translatesAutoresizingMaskIntoConstraints = false
@ -150,6 +149,7 @@ class KeymanWebViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.userContentController.add(self, name: keymanWebViewName)
}
// Very useful for immediately adjusting the WebView's properties upon loading.
@ -160,6 +160,10 @@ class KeymanWebViewController: UIViewController {
// keyboard's width will be set at this stage, but not in viewWillAppear.
keyboardSize = view.bounds.size
}
override func viewWillDisappear(_ animated: Bool) {
self.userContentController.removeScriptMessageHandler(forName: keymanWebViewName)
}
}
// MARK: - JavaScript functions

View file

@ -0,0 +1,2 @@
/* Class = "UILabel"; text = "Scan this code to load this keyboard on another device"; ObjectID = "z2O-MT-IoV"; */
"z2O-MT-IoV.text" = "Scansiona questo codice per caricare questa tastiera su un altro dispositivo";

View file

@ -0,0 +1,2 @@
/* Class = "UILabel"; text = "Scan this code to load this keyboard on another device"; ObjectID = "z2O-MT-IoV"; */
"z2O-MT-IoV.text" = "Zeskanuj ten kod, aby załadować klawiaturę na innym urządzeniu";

View file

@ -0,0 +1,2 @@
/* Class = "UILabel"; text = "Scan this code to load this keyboard on another device"; ObjectID = "z2O-MT-IoV"; */
"z2O-MT-IoV.text" = "Digitalize este código para carregar este teclado em outro dispositivo";

View file

@ -49,6 +49,12 @@
/* Confirmation text to display before uninstalling a lexical model */
"command-uninstall-lexical-model-confirm" = "Aɗa yiɗnoo aaftude ndee saggitorde?";
/* Text for error when a keyboard cannot load properly */
"error-loading-keyboard" = "Horiima loowde tappirde ɗaɓɓaande ndee";
/* Text for error when a lexical model cannot load properly */
"error-loading-lexical-model" = "Horiima loowde saggitorde ɗaɓɓaande ndee";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file" = "Fiilde waɗɗiinde horaama yiyteede.";
@ -112,12 +118,21 @@
/* Error opening a Keyman package - package is not valid */
"kmp-error-invalid" = "Fiilde haɓɓere ndee ko ñokkolinnde.";
/* Error opening a Keyman package - it does not exist / the specified location is wrong */
"kmp-error-missing" = "Haɓɓere joofaande ndee woodaani.";
/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */
"kmp-error-missing-resource" = "Haɓɓere ndee alaa tappirde walla saggitorde ɗaɓɓitaande ndee.";
/* Error installing a Keyman package with a version of Keyman that does not support it */
"kmp-error-unsupported-keyman-version" = "Ndee haɓɓere ena naamndii yamre Keyman hesere.";
/* Error opening a Keyman package - cannot parse contents */
"kmp-error-no-metadata" = "Haɓɓere ndee mahiraaka no haanirta - loowdi anndaaka.";
/* Error opening a Keyman package - package's contents are for desktop platforms only */
"kmp-error-unsupported" = "Ndee haɓɓere jaaɓdaani e kaɓirgol maa.";
/* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */
"kmp-error-wrong-type" = "Ndee heɓɓere alaa fannu jogaaɗe tijjaaɗo oo.";
@ -181,6 +196,36 @@
/* Title for the main Settings menu */
"menu-settings-title" = "Teelte Keyman";
/* Secondary text showing current setting for spacebar caption - blank */
"menu-settings-spacebar-hint-blank" = "Hoto hollu cifol e palal boowe";
/* Secondary text showing current setting for spacebar caption - keyboard */
"menu-settings-spacebar-hint-keyboard" = "Hollu innde tappirde e palal boowe";
/* Secondary text showing current setting for spacebar caption - language */
"menu-settings-spacebar-hint-language" = "Hollu innde ɗemngal e palal boowe";
/* Secondary text showing current setting for spacebar caption - language + keyboard */
"menu-settings-spacebar-hint-languageKeyboard" = "Hollu innde ɗemngal e tappirɗe e palal boowe";
/* Label for the "Spacebar Caption" item on the main settings screen */
"menu-settings-spacebar-text" = "Cifol Palal Boowe";
/* Title for the "Spacebar Caption" settings screen */
"menu-settings-spacebar-title" = "Cifol Palal Boowe";
/* Text showing name of spacebar caption - blank */
"menu-settings-spacebar-item-blank" = "Mehum";
/* Text showing name of spacebar caption - keyboard */
"menu-settings-spacebar-item-keyboard" = "Tappirde";
/* Text showing name of spacebar caption - language */
"menu-settings-spacebar-item-language" = "Ɗemngal";
/* Text showing name of spacebar caption - language + keyboard */
"menu-settings-spacebar-item-languageKeyboard" = "Ɗemngal e tappirde";
/* Short text for notification: download failure for keyboard */
"notification-download-failure-keyboard" = "Aawtagol tappirde woorii";

View file

@ -0,0 +1,257 @@
/* A descriptive message used for errors when the app is already busy downloading */
"alert-download-error-busy" = "Già occupato a scaricare.";
/* A descriptive message used when a download fails */
"alert-download-error-detail" = "Si è verificato un errore durante il download o l'installazione.";
/* Title for a "download failed" alert */
"alert-download-error-title" = "Errore di download";
/* Title for a general alert about errors */
"alert-error-title" = "Errore";
/* A descriptive message used when no internet connection is detected */
"alert-no-connection-detail" = "Impossibile raggiungere il server Keyman. Riprova più tardi.";
/* Title for a "no connection" alert */
"alert-no-connection-title" = "Errore Di Connessione";
/* Short text for a 'back' navigational command. Used to return to the previous screen */
"command-back" = "Indietro";
/* Short text for a 'cancel' command. Used to back out of a menu or install process without making changes */
"command-cancel" = "Annulla";
/* Short text for a 'done' command. Used to back out of settings menus after changes have been made */
"command-done" = "Fatto";
/* Short text for an 'install' command. Used to confirm installation of a package. */
"command-install" = "Installa";
/* Short text for a 'next' navigational command. Used to advance to the next screen */
"command-next" = "Successivo";
/* Short text for an 'OK' command. Used for some error alerts */
"command-ok" = "OK";
/* Short text for confirmining 'uninstall' commands. */
"command-uninstall" = "Disinstalla";
/* Text for the command to uninstall a keyboard */
"command-uninstall-keyboard" = "Disinstalla tastiera";
/* Confirmation text to display before uninstalling a keyboard */
"command-uninstall-keyboard-confirm" = "Vuoi disinstallare questa tastiera?";
/* Text for the command to uninstall a lexical model */
"command-uninstall-lexical-model" = "Disinstalla dizionario";
/* Confirmation text to display before uninstalling a lexical model */
"command-uninstall-lexical-model-confirm" = "Vuoi disinstallare questo dizionario?";
/* Text for error when a keyboard cannot load properly */
"error-loading-keyboard" = "Impossibile caricare la tastiera richiesta";
/* Text for error when a lexical model cannot load properly */
"error-loading-lexical-model" = "Impossibile caricare il dizionario richiesto";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file" = "Impossibile trovare un file richiesto.";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file-critical" = "Impossibile trovare un file critico. Prova a reinstallare l'app.";
/* Text for errors in data received from search queries */
"error-query-decoding" = "Il server sta attualmente attraversando difficoltà tecniche";
/* A descriptive message used when a download fails */
"error-query-general" = "Errore di comunicazione con il server";
/* Text for error when a search query is unexpectedly empty */
"error-query-no-data" = "Il server non ha risposto";
/* Text for general errors where not much information is known */
"error-unknown" = "Si è verificato un errore inatteso";
/* Text for error when updating a resource: cannot download because no source is available */
"error-update-no-link" = "Nessuna fonte per gli aggiornamenti è disponibile per questo pacchetto";
/* Text for error when updating a resource: Keyman does not know how to update the resource */
"error-update-not-managed" = "Impossibile aggiornare la risorsa non gestita dal motore Keyman";
/* Text for the command to open the help page of a keyboard, as shown on resource information views */
"info-command-help-keyboard" = "Aiuto tastiera";
/* Text for the command to open the help page of a lexical model, as shown on resource information views */
"info-command-help-lexical-model" = "Aiuto dizionario";
/* Text label for displaying a keyboard's version, as shown on resource information views */
"info-label-version-keyboard" = "Versione tastiera";
/* Text label for displaying a lexical model's version, as shown on resource information views */
"info-label-version-lexical-model" = "Versione dizionario";
/* Label used for the "package info" / readme tab with the package installation prompt on phones. */
"installer-label-package-info" = "Info Pacchetto";
/* Label used for the language-selection tab with the package installation prompt on phones. */
"installer-label-select-languages" = "Seleziona Lingua(e)";
/* Label used with a package's version, as seen within the package installation prompt. Example: "Version: 14.0.0" */
"installer-label-version" = "Versione: %@";
/* Section header for languages supported by a package, as seen within the package installation prompt */
"installer-section-available-languages" = "Lingue Disponibili";
/* Text for the help popup for changing keyboards with the globe key */
"keyboard-help-change" = "Tocca qui per cambiare la tastiera";
/* Text for the command to exit the Keyman keyboard in favor of other keyboards installed on the system */
"keyboard-menu-exit" = "Chiudi %@";
/* Error installing a Keyman package - could not allocate a location to install it */
"kmp-error-file-system" = "Errore nell'installazione del pacchetto - errore del file-system";
/* Error installing a Keyman package - could not copy package files */
"kmp-error-file-copying" = "Errore durante l'installazione del pacchetto - impossibile copiare i file richiesti";
/* Error opening a Keyman package - package is not valid */
"kmp-error-invalid" = "Il file del pacchetto è danneggiato.";
/* Error opening a Keyman package - it does not exist / the specified location is wrong */
"kmp-error-missing" = "Il pacchetto specificato non esiste.";
/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */
"kmp-error-missing-resource" = "Questo pacchetto non contiene la tastiera o il dizionario richiesto.";
/* Error installing a Keyman package with a version of Keyman that does not support it */
"kmp-error-unsupported-keyman-version" = "This package requires a newer version of Keyman.";
/* Error opening a Keyman package - cannot parse contents */
"kmp-error-no-metadata" = "Questo pacchetto non è stato costruito correttamente - contenuti sconosciuti.";
/* Error opening a Keyman package - package's contents are for desktop platforms only */
"kmp-error-unsupported" = "Questo pacchetto non include il supporto per il tuo dispositivo.";
/* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */
"kmp-error-wrong-type" = "Questo pacchetto non contiene il tipo di risorsa previsto.";
/* Title for the Installed Languages menu */
"menu-installed-languages-title" = "Lingue Installate";
/* Section header for lexical models within a language-specific settings menu */
"menu-langsettings-label-lexical-models" = "Dizionari";
/* Section header for keyboards within a language-specific settings menu */
"menu-langsettings-section-keyboards" = "Tastiere";
/* Section header for the settings toggles within a language-specific settings menu */
"menu-langsettings-section-settings" = "Impostazioni Lingua";
/* Title for the language-specific settings menus */
"menu-langsettings-title" = "Impostazioni %@";
/* Label for the toggle that enables corrections that is displayed within a language-specific settings menu */
"menu-langsettings-toggle-correct" = "Abilita correzioni";
/* Label for the toggle that enables predictions that is displayed within a language-specific settings menu */
"menu-langsettings-toggle-predict" = "Abilita previsioni";
/* Help message for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */
"menu-lexical-model-install-message" = "Vuoi installare questo dizionario?";
/* Title for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */
"menu-lexical-model-install-title" = "%1$@: %2$@";
/* Text for an info alert indicating that no lexical models are available */
"menu-lexical-model-none-message" = "Nessun dizionario disponibile";
/* Title for the lexical model menu, a submenu of the language-specific settings menus */
"menu-lexical-model-title" = "%@ Dizionari";
/* Title for the keyboard picker */
"menu-picker-title" = "Tastiere";
/* Primary text for the Settings menu option to report keyboard crashes */
"menu-settings-error-report" = "Consenti Segnalazione Errori";
/* Secondary text for the Settings menu option to report keyboard crashes */
"menu-settings-error-report-description" = "Può richiedere \"pieno accesso\"";
/* Primary text for the Settings menu local-file package installation option */
"menu-settings-install-from-file" = "Installa Da File";
/* Secondary text for the Settings menu local-file package installation option */
"menu-settings-install-from-file-description" = "Esplora i file .kmp";
/* Primary text for the Settings menu option that displays the iOS system menu options for the app's keyboard */
"menu-settings-system-keyboard-menu" = "Impostazioni Tastiera Di Sistema";
/* Label for the "Show Banner" toggle on the main settings screen */
"menu-settings-show-banner" = "Mostra Banner";
/* Label for the "Get Started" automatic display toggle seen in the Settings menu */
"menu-settings-startup-get-started" = "Mostra 'Inizia' all'avvio";
/* Title for the main Settings menu */
"menu-settings-title" = "Impostazioni Keyman";
/* Secondary text showing current setting for spacebar caption - blank */
"menu-settings-spacebar-hint-blank" = "Non mostrare la didascalia sulla barra spaziatrice";
/* Secondary text showing current setting for spacebar caption - keyboard */
"menu-settings-spacebar-hint-keyboard" = "Mostra il nome della tastiera nella barra spaziatrice";
/* Secondary text showing current setting for spacebar caption - language */
"menu-settings-spacebar-hint-language" = "Mostra il nome della lingua nella barra spaziatrice";
/* Secondary text showing current setting for spacebar caption - language + keyboard */
"menu-settings-spacebar-hint-languageKeyboard" = "Mostra la lingua e il nome della tastiera nella barra spaziatrice";
/* Label for the "Spacebar Caption" item on the main settings screen */
"menu-settings-spacebar-text" = "Didascalia Barra Spaziale";
/* Title for the "Spacebar Caption" settings screen */
"menu-settings-spacebar-title" = "Didascalia Barra Spaziale";
/* Text showing name of spacebar caption - blank */
"menu-settings-spacebar-item-blank" = "Vuoto";
/* Text showing name of spacebar caption - keyboard */
"menu-settings-spacebar-item-keyboard" = "Keyboard";
/* Text showing name of spacebar caption - language */
"menu-settings-spacebar-item-language" = "Lingua";
/* Text showing name of spacebar caption - language + keyboard */
"menu-settings-spacebar-item-languageKeyboard" = "Lingua e tastiera";
/* Short text for notification: download failure for keyboard */
"notification-download-failure-keyboard" = "Download tastiera non riuscito";
/* Short text for notification: download failure for lexical model */
"notification-download-failure-lexical-model" = "Download del dizionario non riuscito";
/* Short text for notification: download success for keyboard */
"notification-download-success-keyboard" = "Tastiera scaricata con successo";
/* Short text for notification: download success for lexical model */
"notification-download-success-lexical-model" = "Modello lessicale scaricato con successo";
/* Short text for notification: downloading a keyboard */
"notification-downloading-keyboard" = "Scaricamento tastiera\U2026";
/* Short text for notification: downloading a lexical model */
"notification-downloading-lexical-model" = "Scaricamento dizionario\U2026";
/* Short text for notification: an update is available */
"notification-update-available" = "Aggiornamento Disponibile";
/* Short text for notification: currently updating */
"notification-update-processing" = "Aggiornamento\U2026";
/* Text indicating success at installing new keyboards or dictionaries */
"success-install" = "Installato con successo.";
/* A title to use in alerts indicating 'success' at whatever task the user requested */
"success-title" = "Successo";

View file

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>menu-langsettings-lexical-model-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u dizionario installato</string>
<key>other</key>
<string>%u dizionari installati</string>
</dict>
</dict>
<key>notification-update-failed</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u aggiornamento non riuscito</string>
<key>other</key>
<string>%u aggiornamenti falliti</string>
</dict>
</dict>
<key>notification-update-success</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u aggiornamento riuscito</string>
<key>other</key>
<string>%u aggiornamenti riusciti</string>
</dict>
</dict>
<key>settings-keyboards-installed-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u tastiera installata</string>
<key>other</key>
<string>%u tastiera installata</string>
</dict>
</dict>
<key>settings-languages-installed-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u lingua installata</string>
<key>other</key>
<string>%u lingue installate</string>
</dict>
</dict>
<key>package-default-found-keyboards</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>Trovato %u tastiera nel pacchetto:</string>
<key>other</key>
<string>Trovate %u tastiere nel pacchetto:</string>
</dict>
</dict>
<key>package-default-found-lexical-models</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>Trovato %u dizionario nel pacchetto:</string>
<key>other</key>
<string>Trovati %u dizionari nel pacchetto:</string>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,257 @@
/* A descriptive message used for errors when the app is already busy downloading */
"alert-download-error-busy" = "Zajęty pobieraniem.";
/* A descriptive message used when a download fails */
"alert-download-error-detail" = "Wystąpił błąd podczas pobierania lub instalacji.";
/* Title for a "download failed" alert */
"alert-download-error-title" = "Błąd pobierania";
/* Title for a general alert about errors */
"alert-error-title" = "Błąd";
/* A descriptive message used when no internet connection is detected */
"alert-no-connection-detail" = "Nie udało się połączyć z serwerem Keyman. Spróbuj ponownie później.";
/* Title for a "no connection" alert */
"alert-no-connection-title" = "Błąd połączenia";
/* Short text for a 'back' navigational command. Used to return to the previous screen */
"command-back" = "Wstecz";
/* Short text for a 'cancel' command. Used to back out of a menu or install process without making changes */
"command-cancel" = "Anuluj";
/* Short text for a 'done' command. Used to back out of settings menus after changes have been made */
"command-done" = "Gotowe";
/* Short text for an 'install' command. Used to confirm installation of a package. */
"command-install" = "Zainstaluj";
/* Short text for a 'next' navigational command. Used to advance to the next screen */
"command-next" = "Następny";
/* Short text for an 'OK' command. Used for some error alerts */
"command-ok" = "OK";
/* Short text for confirmining 'uninstall' commands. */
"command-uninstall" = "Odinstaluj";
/* Text for the command to uninstall a keyboard */
"command-uninstall-keyboard" = "Odinstaluj klawiaturę";
/* Confirmation text to display before uninstalling a keyboard */
"command-uninstall-keyboard-confirm" = "Czy chcesz odinstalować tę klawiaturę?";
/* Text for the command to uninstall a lexical model */
"command-uninstall-lexical-model" = "Odinstaluj słownik";
/* Confirmation text to display before uninstalling a lexical model */
"command-uninstall-lexical-model-confirm" = "Czy chcesz odinstalować ten słownik?";
/* Text for error when a keyboard cannot load properly */
"error-loading-keyboard" = "Nie można załadować żądanej klawiatury";
/* Text for error when a lexical model cannot load properly */
"error-loading-lexical-model" = "Nie można załadować żądanego słownika";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file" = "Nie znaleziono wymaganego pliku.";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file-critical" = "Nie znaleziono pliku krytycznego. Spróbuj ponownie zainstalować aplikację.";
/* Text for errors in data received from search queries */
"error-query-decoding" = "Serwer ma problemy techniczne";
/* A descriptive message used when a download fails */
"error-query-general" = "Błąd komunikacji z serwerem";
/* Text for error when a search query is unexpectedly empty */
"error-query-no-data" = "Serwer nie odpowiedział";
/* Text for general errors where not much information is known */
"error-unknown" = "Wystąpił nieoczekiwany błąd";
/* Text for error when updating a resource: cannot download because no source is available */
"error-update-no-link" = "Brak dostępnych źródeł aktualizacji dla tego pakietu";
/* Text for error when updating a resource: Keyman does not know how to update the resource */
"error-update-not-managed" = "Nie można zaktualizować zasobu nie zarządzanego przez Keyman";
/* Text for the command to open the help page of a keyboard, as shown on resource information views */
"info-command-help-keyboard" = "Pomoc klawiatury";
/* Text for the command to open the help page of a lexical model, as shown on resource information views */
"info-command-help-lexical-model" = "Pomoc słownika";
/* Text label for displaying a keyboard's version, as shown on resource information views */
"info-label-version-keyboard" = "Wersja klawiatury";
/* Text label for displaying a lexical model's version, as shown on resource information views */
"info-label-version-lexical-model" = "Wersja słownika";
/* Label used for the "package info" / readme tab with the package installation prompt on phones. */
"installer-label-package-info" = "Informacje o pakiecie";
/* Label used for the language-selection tab with the package installation prompt on phones. */
"installer-label-select-languages" = "Wybierz język(i)";
/* Label used with a package's version, as seen within the package installation prompt. Example: "Version: 14.0.0" */
"installer-label-version" = "Wersja: %@";
/* Section header for languages supported by a package, as seen within the package installation prompt */
"installer-section-available-languages" = "Dostępne języki";
/* Text for the help popup for changing keyboards with the globe key */
"keyboard-help-change" = "Dotknij tutaj, aby zmienić klawiaturę";
/* Text for the command to exit the Keyman keyboard in favor of other keyboards installed on the system */
"keyboard-menu-exit" = "Zamknij %@";
/* Error installing a Keyman package - could not allocate a location to install it */
"kmp-error-file-system" = "Błąd instalacji pakietu - błąd systemu plików";
/* Error installing a Keyman package - could not copy package files */
"kmp-error-file-copying" = "Błąd instalacji pakietu - nie można skopiować wymaganych plików";
/* Error opening a Keyman package - package is not valid */
"kmp-error-invalid" = "Plik pakietu jest uszkodzony.";
/* Error opening a Keyman package - it does not exist / the specified location is wrong */
"kmp-error-missing" = "Podany pakiet nie istnieje.";
/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */
"kmp-error-missing-resource" = "Ten pakiet nie zawiera żądanej klawiatury ani słownika.";
/* Error installing a Keyman package with a version of Keyman that does not support it */
"kmp-error-unsupported-keyman-version" = "This package requires a newer version of Keyman.";
/* Error opening a Keyman package - cannot parse contents */
"kmp-error-no-metadata" = "Ten pakiet nie został prawidłowo zbudowany - zawartość nieznana.";
/* Error opening a Keyman package - package's contents are for desktop platforms only */
"kmp-error-unsupported" = "Ten pakiet nie zawiera wsparcia dla Twojego urządzenia.";
/* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */
"kmp-error-wrong-type" = "Ten pakiet nie zawiera oczekiwanego typu zasobów.";
/* Title for the Installed Languages menu */
"menu-installed-languages-title" = "Zainstalowane języki";
/* Section header for lexical models within a language-specific settings menu */
"menu-langsettings-label-lexical-models" = "Słowniki";
/* Section header for keyboards within a language-specific settings menu */
"menu-langsettings-section-keyboards" = "Klawiatury";
/* Section header for the settings toggles within a language-specific settings menu */
"menu-langsettings-section-settings" = "Ustawienia języka";
/* Title for the language-specific settings menus */
"menu-langsettings-title" = "%@ Ustawieni as";
/* Label for the toggle that enables corrections that is displayed within a language-specific settings menu */
"menu-langsettings-toggle-correct" = "Włącz korekcję";
/* Label for the toggle that enables predictions that is displayed within a language-specific settings menu */
"menu-langsettings-toggle-predict" = "Włącz przewidywania";
/* Help message for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */
"menu-lexical-model-install-message" = "Czy chcesz zainstalować ten słownik?";
/* Title for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */
"menu-lexical-model-install-title" = "%1$@:%2$@";
/* Text for an info alert indicating that no lexical models are available */
"menu-lexical-model-none-message" = "Brak dostępnych słowników";
/* Title for the lexical model menu, a submenu of the language-specific settings menus */
"menu-lexical-model-title" = "%@ Słowniki";
/* Title for the keyboard picker */
"menu-picker-title" = "Klawiatury";
/* Primary text for the Settings menu option to report keyboard crashes */
"menu-settings-error-report" = "Zezwalaj na raportowanie błędów";
/* Secondary text for the Settings menu option to report keyboard crashes */
"menu-settings-error-report-description" = "Może wymagać \"pełnego dostępu\"";
/* Primary text for the Settings menu local-file package installation option */
"menu-settings-install-from-file" = "Zainstaluj z pliku";
/* Secondary text for the Settings menu local-file package installation option */
"menu-settings-install-from-file-description" = "Przeglądaj pliki .kmp";
/* Primary text for the Settings menu option that displays the iOS system menu options for the app's keyboard */
"menu-settings-system-keyboard-menu" = "Ustawienia klawiatury systemowej";
/* Label for the "Show Banner" toggle on the main settings screen */
"menu-settings-show-banner" = "Pokaż baner";
/* Label for the "Get Started" automatic display toggle seen in the Settings menu */
"menu-settings-startup-get-started" = "Pokaż 'Rozpocznij' przy starcie";
/* Title for the main Settings menu */
"menu-settings-title" = "Ustawienia Keyman";
/* Secondary text showing current setting for spacebar caption - blank */
"menu-settings-spacebar-hint-blank" = "Nie pokazuj podpisu na spacji";
/* Secondary text showing current setting for spacebar caption - keyboard */
"menu-settings-spacebar-hint-keyboard" = "Pokaż nazwę klawiatury na spacji";
/* Secondary text showing current setting for spacebar caption - language */
"menu-settings-spacebar-hint-language" = "Pokaż nazwę języka na spacji";
/* Secondary text showing current setting for spacebar caption - language + keyboard */
"menu-settings-spacebar-hint-languageKeyboard" = "Pokaż język i nazwę klawiatury na spacji";
/* Label for the "Spacebar Caption" item on the main settings screen */
"menu-settings-spacebar-text" = "Podpis paska spacji";
/* Title for the "Spacebar Caption" settings screen */
"menu-settings-spacebar-title" = "Podpis paska spacji";
/* Text showing name of spacebar caption - blank */
"menu-settings-spacebar-item-blank" = "Puste";
/* Text showing name of spacebar caption - keyboard */
"menu-settings-spacebar-item-keyboard" = "Keyboard";
/* Text showing name of spacebar caption - language */
"menu-settings-spacebar-item-language" = "Język";
/* Text showing name of spacebar caption - language + keyboard */
"menu-settings-spacebar-item-languageKeyboard" = "Język i klawiatura";
/* Short text for notification: download failure for keyboard */
"notification-download-failure-keyboard" = "Pobieranie klawiatury nie powiodło się";
/* Short text for notification: download failure for lexical model */
"notification-download-failure-lexical-model" = "Pobieranie słownika nie powiodło się";
/* Short text for notification: download success for keyboard */
"notification-download-success-keyboard" = "Pomyślnie pobrano klawiaturę";
/* Short text for notification: download success for lexical model */
"notification-download-success-lexical-model" = "Model Lexical został pomyślnie pobrany";
/* Short text for notification: downloading a keyboard */
"notification-downloading-keyboard" = "Pobieranie klawiatury\U2026";
/* Short text for notification: downloading a lexical model */
"notification-downloading-lexical-model" = "Pobieranie słownika\U2026";
/* Short text for notification: an update is available */
"notification-update-available" = "Aktualizacja dostępna";
/* Short text for notification: currently updating */
"notification-update-processing" = "Aktualizowanie\U2026";
/* Text indicating success at installing new keyboards or dictionaries */
"success-install" = "Pomyślnie zainstalowany.";
/* A title to use in alerts indicating 'success' at whatever task the user requested */
"success-title" = "Sukces";

View file

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>menu-langsettings-lexical-model-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u słownik zainstalowany</string>
<key>few</key>
<string>%u słowniki zainstalowane</string>
<key>many</key>
<string>%u słowników zainstalowano</string>
<key>other</key>
<string>%u słowników zainstalowano</string>
</dict>
</dict>
<key>notification-update-failed</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u aktualizacja nieudana</string>
<key>few</key>
<string>%u Aktualizacje nieudane</string>
<key>many</key>
<string>%u Aktualizacje nieudane</string>
<key>other</key>
<string>%u Aktualizacje nieudane</string>
</dict>
</dict>
<key>notification-update-success</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u Aktualizacja powiodła się</string>
<key>few</key>
<string>%u Aktualizacje powiodły się</string>
<key>many</key>
<string>%u Aktualizacji powiodło się</string>
<key>other</key>
<string>%u Aktualizacje powiodły się</string>
</dict>
</dict>
<key>settings-keyboards-installed-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u klawiatura zainstalowana</string>
<key>few</key>
<string>%u klawiatur zainstalowanych</string>
<key>many</key>
<string>%u klawiatur zainstalowanych</string>
<key>other</key>
<string>%u klawiatur zainstalowanych</string>
</dict>
</dict>
<key>settings-languages-installed-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u język zainstalowany</string>
<key>few</key>
<string>%u języki zainstalowane</string>
<key>many</key>
<string>%u języki zainstalowane</string>
<key>other</key>
<string>%u języki zainstalowane</string>
</dict>
</dict>
<key>package-default-found-keyboards</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>Znaleziono %u klawiaturę w pakiecie:</string>
<key>few</key>
<string>Znaleziono %u klawiatury w pakiecie:</string>
<key>many</key>
<string>Znaleziono %u klawiatury w pakiecie:</string>
<key>other</key>
<string>Znaleziono %u klawiatury w pakiecie:</string>
</dict>
</dict>
<key>package-default-found-lexical-models</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>Znaleziono %u słownik w pakiecie:</string>
<key>few</key>
<string>Znaleziono %u słowniki w pakiecie:</string>
<key>many</key>
<string>Znaleziono %u słowniki w pakiecie:</string>
<key>other</key>
<string>Znaleziono %u słowniki w pakiecie:</string>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,254 @@
/* A descriptive message used for errors when the app is already busy downloading */
"alert-download-error-busy" = "Baixando já ocupado.";
/* A descriptive message used when a download fails */
"alert-download-error-detail" = "Ocorreu um erro durante o download ou instalação.";
/* Title for a "download failed" alert */
"alert-download-error-title" = "Erro no download";
/* Title for a general alert about errors */
"alert-error-title" = "Erro";
/* A descriptive message used when no internet connection is detected */
"alert-no-connection-detail" = "Não foi possível acessar o servidor Keyman. Por favor, tente novamente mais tarde.";
/* Title for a "no connection" alert */
"alert-no-connection-title" = "Erro de conexão";
/* Short text for a 'back' navigational command. Used to return to the previous screen */
"command-back" = "Voltar";
/* Short text for a 'cancel' command. Used to back out of a menu or install process without making changes */
"command-cancel" = "Instalar Mais Tarde";
/* Short text for a 'done' command. Used to back out of settings menus after changes have been made */
"command-done" = "Concluído";
/* Short text for an 'install' command. Used to confirm installation of a package. */
"command-install" = "Instalar";
/* Short text for a 'next' navigational command. Used to advance to the next screen */
"command-next" = "Próximo";
/* Short text for an 'OK' command. Used for some error alerts */
"command-ok" = "OK";
/* Short text for confirmining 'uninstall' commands. */
"command-uninstall" = "Desinstalar";
/* Text for the command to uninstall a keyboard */
"command-uninstall-keyboard" = "Desinstalar teclado";
/* Confirmation text to display before uninstalling a keyboard */
"command-uninstall-keyboard-confirm" = "Gostaria de desinstalar este teclado?";
/* Text for the command to uninstall a lexical model */
"command-uninstall-lexical-model" = "Desinstalar dicionário";
/* Confirmation text to display before uninstalling a lexical model */
"command-uninstall-lexical-model-confirm" = "Gostaria de desinstalar este dicionário?";
/* Text for error when a keyboard cannot load properly */
"error-loading-keyboard" = "Não foi possível carregar o teclado solicitado";
/* Text for error when a lexical model cannot load properly */
"error-loading-lexical-model" = "Não foi possível carregar o dicionário solicitado";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file" = "Não foi possível encontrar um arquivo obrigatório.";
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file-critical" = "Não foi possível encontrar um arquivo crítico. Por favor, tente reinstalar o aplicativo.";
/* Text for errors in data received from search queries */
"error-query-decoding" = "O servidor está atualmente passando por dificuldades técnicas";
/* A descriptive message used when a download fails */
"error-query-general" = "Erro de comunicação com o servidor";
/* Text for error when a search query is unexpectedly empty */
"error-query-no-data" = "O servidor não conseguiu responder";
/* Text for general errors where not much information is known */
"error-unknown" = "Ocorreu um erro inesperado";
/* Text for error when updating a resource: cannot download because no source is available */
"error-update-no-link" = "Nenhuma fonte para atualizações está disponível para este pacote";
/* Text for error when updating a resource: Keyman does not know how to update the resource */
"error-update-not-managed" = "Não é possível atualizar o recurso não gerenciado pelo motor Keyman";
/* Text for the command to open the help page of a keyboard, as shown on resource information views */
"info-command-help-keyboard" = "Ajuda do teclado";
/* Text for the command to open the help page of a lexical model, as shown on resource information views */
"info-command-help-lexical-model" = "Ajuda do dicionário";
/* Text label for displaying a keyboard's version, as shown on resource information views */
"info-label-version-keyboard" = "Versão do teclado";
/* Text label for displaying a lexical model's version, as shown on resource information views */
"info-label-version-lexical-model" = "Versão do dicionário";
/* Label used for the "package info" / readme tab with the package installation prompt on phones. */
"installer-label-package-info" = "Informações do pacote";
/* Label used for the language-selection tab with the package installation prompt on phones. */
"installer-label-select-languages" = "Selecione Idioma(s)";
/* Label used with a package's version, as seen within the package installation prompt. Example: "Version: 14.0.0" */
"installer-label-version" = "Versão: %@";
/* Section header for languages supported by a package, as seen within the package installation prompt */
"installer-section-available-languages" = "Idiomas Disponíveis";
/* Text for the help popup for changing keyboards with the globe key */
"keyboard-help-change" = "Toque aqui para alterar o teclado";
/* Text for the command to exit the Keyman keyboard in favor of other keyboards installed on the system */
"keyboard-menu-exit" = "Fechar %@";
/* Error installing a Keyman package - could not allocate a location to install it */
"kmp-error-file-system" = "Erro ao instalar pacote - erro de arquivo-sistema";
/* Error installing a Keyman package - could not copy package files */
"kmp-error-file-copying" = "Erro ao instalar o pacote - não foi possível copiar os arquivos necessários";
/* Error opening a Keyman package - package is not valid */
"kmp-error-invalid" = "O arquivo do pacote está corrompido.";
/* Error opening a Keyman package - it does not exist / the specified location is wrong */
"kmp-error-missing" = "O pacote especificado não existe.";
/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */
"kmp-error-missing-resource" = "Este pacote não contém o teclado ou dicionário solicitados.";
/* Error opening a Keyman package - cannot parse contents */
"kmp-error-no-metadata" = "Este pacote não foi construído corretamente - conteúdo desconhecido.";
/* Error opening a Keyman package - package's contents are for desktop platforms only */
"kmp-error-unsupported" = "Este pacote não inclui suporte para o seu dispositivo.";
/* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */
"kmp-error-wrong-type" = "Este pacote não contém o tipo de recurso esperado.";
/* Title for the Installed Languages menu */
"menu-installed-languages-title" = "Idiomas instalados";
/* Section header for lexical models within a language-specific settings menu */
"menu-langsettings-label-lexical-models" = "Dicionários";
/* Section header for keyboards within a language-specific settings menu */
"menu-langsettings-section-keyboards" = "Teclados";
/* Section header for the settings toggles within a language-specific settings menu */
"menu-langsettings-section-settings" = "Configurações de idioma";
/* Title for the language-specific settings menus */
"menu-langsettings-title" = "Configurações de %@";
/* Label for the toggle that enables corrections that is displayed within a language-specific settings menu */
"menu-langsettings-toggle-correct" = "Habilitar correções";
/* Label for the toggle that enables predictions that is displayed within a language-specific settings menu */
"menu-langsettings-toggle-predict" = "Habilitar previsões";
/* Help message for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */
"menu-lexical-model-install-message" = "Gostaria de instalar este dicionário?";
/* Title for a prompt that appears for confirming a lexical model download: language (1): lexical model (dictionary) name (2) */
"menu-lexical-model-install-title" = "%1$@: %2$@";
/* Text for an info alert indicating that no lexical models are available */
"menu-lexical-model-none-message" = "Nenhum dicionário disponível";
/* Title for the lexical model menu, a submenu of the language-specific settings menus */
"menu-lexical-model-title" = "%@ Dicionários";
/* Title for the keyboard picker */
"menu-picker-title" = "Teclados";
/* Primary text for the Settings menu option to report keyboard crashes */
"menu-settings-error-report" = "Permitir Relatório de Erros";
/* Secondary text for the Settings menu option to report keyboard crashes */
"menu-settings-error-report-description" = "Pode exigir \"acesso total\"";
/* Primary text for the Settings menu local-file package installation option */
"menu-settings-install-from-file" = "Instalar do arquivo";
/* Secondary text for the Settings menu local-file package installation option */
"menu-settings-install-from-file-description" = "Procurar por arquivos .kmp";
/* Primary text for the Settings menu option that displays the iOS system menu options for the app's keyboard */
"menu-settings-system-keyboard-menu" = "Configurações do teclado";
/* Label for the "Show Banner" toggle on the main settings screen */
"menu-settings-show-banner" = "Mostrar banner";
/* Label for the "Get Started" automatic display toggle seen in the Settings menu */
"menu-settings-startup-get-started" = "Mostrar 'Começar' na inicialização";
/* Title for the main Settings menu */
"menu-settings-title" = "Configurações do Keyman";
/* Secondary text showing current setting for spacebar caption - blank */
"menu-settings-spacebar-hint-blank" = "Não mostrar legenda na barra de espaço";
/* Secondary text showing current setting for spacebar caption - keyboard */
"menu-settings-spacebar-hint-keyboard" = "Mostrar o nome do teclado na barra de espaço";
/* Secondary text showing current setting for spacebar caption - language */
"menu-settings-spacebar-hint-language" = "Mostrar nome do idioma na barra de espaço";
/* Secondary text showing current setting for spacebar caption - language + keyboard */
"menu-settings-spacebar-hint-languageKeyboard" = "Mostrar idioma e nome do teclado na barra de espaço";
/* Label for the "Spacebar Caption" item on the main settings screen */
"menu-settings-spacebar-text" = "Barra de espaço";
/* Title for the "Spacebar Caption" settings screen */
"menu-settings-spacebar-title" = "Barra de espaço";
/* Text showing name of spacebar caption - blank */
"menu-settings-spacebar-item-blank" = "Vazio";
/* Text showing name of spacebar caption - keyboard */
"menu-settings-spacebar-item-keyboard" = "Teclado";
/* Text showing name of spacebar caption - language */
"menu-settings-spacebar-item-language" = "Idioma";
/* Text showing name of spacebar caption - language + keyboard */
"menu-settings-spacebar-item-languageKeyboard" = "Idioma e teclado";
/* Short text for notification: download failure for keyboard */
"notification-download-failure-keyboard" = "Download do teclado falhou";
/* Short text for notification: download failure for lexical model */
"notification-download-failure-lexical-model" = "Download do dicionário falhou";
/* Short text for notification: download success for keyboard */
"notification-download-success-keyboard" = "Teclado baixado com sucesso";
/* Short text for notification: download success for lexical model */
"notification-download-success-lexical-model" = "Modelo Léxico baixado com sucesso";
/* Short text for notification: downloading a keyboard */
"notification-downloading-keyboard" = "Baixando teclado\U2026";
/* Short text for notification: downloading a lexical model */
"notification-downloading-lexical-model" = "Baixando o dicionário\U2026";
/* Short text for notification: an update is available */
"notification-update-available" = "Atualização disponível";
/* Short text for notification: currently updating */
"notification-update-processing" = "Atualizando\U2026";
/* Text indicating success at installing new keyboards or dictionaries */
"success-install" = "Instalado com sucesso.";
/* A title to use in alerts indicating 'success' at whatever task the user requested */
"success-title" = "Sucesso";

View file

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>menu-langsettings-lexical-model-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u dicionário instalado</string>
<key>other</key>
<string>%u dicionários instalados</string>
</dict>
</dict>
<key>notification-update-failed</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u falha na atualização</string>
<key>other</key>
<string>%u atualizações falharam</string>
</dict>
</dict>
<key>notification-update-success</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u atualização concluída</string>
<key>other</key>
<string>%u atualizações com sucesso</string>
</dict>
</dict>
<key>settings-keyboards-installed-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u teclado instalado</string>
<key>other</key>
<string>%u teclados instalados</string>
</dict>
</dict>
<key>settings-languages-installed-count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u idioma instalado</string>
<key>other</key>
<string>%u idiomas instalados</string>
</dict>
</dict>
<key>package-default-found-keyboards</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>Encontrado %u teclado no pacote:</string>
<key>other</key>
<string>Encontrado %u teclados no pacote:</string>
</dict>
</dict>
<key>package-default-found-lexical-models</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u dicionário encontrado no pacote:</string>
<key>other</key>
<string>%u dicionários encontrados no pacote:</string>
</dict>
</dict>
</dict>
</plist>

View file

@ -29,6 +29,12 @@ sentryManager.init();
window.addEventListener('load', init, false);
function init() {
// As of iOS 15, Safari WebViews will try to avoid letting us use the "safe area"
// at the bottom of iPhone X style devices. While `-webkit-fill-available` will partly
// counteract this... it's only a "partly". Fortunately, we can manually force the
// page to our desired size.
document.body.style.height = window.outerHeight;
var kmw=window['keyman'];
// We could convert to relying on the promise, but the underlying input element
// tends to show a bit due to the delay when we do so.

View file

@ -10,7 +10,7 @@
body {background-color: rgb(210,214,220);}
</style>
</head>
<body class="kmw-embedded keyman-app">
<body class="kmw-embedded keyman-app" style="height: -webkit-fill-available">
<textarea id="ta" cols="1" rows="1" style="visibility:hidden;" disabled></textarea>
</body>
</html>

View file

@ -205,6 +205,9 @@
16A9229D20325253003CC98E /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Keyman/Info.plist; sourceTree = SOURCE_ROOT; };
293EA3E027059C6900545EED /* ha */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ha; path = ha.lproj/Localizable.strings; sourceTree = "<group>"; };
294914742738DF7700400732 /* ff-NG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ff-NG"; path = "ff-NG.lproj/Localizable.strings"; sourceTree = "<group>"; };
29BFA75D282931F8009FCCC3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
29BFA769282946EC009FCCC3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = "<group>"; };
29C1E17028001EC200759EDE /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
37378F4222C9AA610043F22B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainViewController_iPad.xib; sourceTree = "<group>"; };
37378F4322C9AA630043F22B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainViewController_iPhone.xib; sourceTree = "<group>"; };
9815725018E4F0930014DF0C /* 702-share.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "702-share.png"; path = "Keyman Icons/702-share.png"; sourceTree = "<group>"; };
@ -786,6 +789,9 @@
"zh-Hans",
ha,
"ff-NG",
"pt-PT",
it,
pl
);
mainGroup = 98ABADA7176935E400B62590;
productRefGroup = 98ABADB1176935E400B62590 /* Products */;
@ -1089,6 +1095,9 @@
CEEC468226F2F7BA009A5B7D /* zh-Hans */,
293EA3E027059C6900545EED /* ha */,
294914742738DF7700400732 /* ff-NG */,
29C1E17028001EC200759EDE /* pt-PT */,
29BFA75D282931F8009FCCC3 /* it */,
29BFA769282946EC009FCCC3 /* pl */
);
name = Localizable.strings;
sourceTree = "<group>";

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