mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-05 00:15:32 +00:00
chore(common): Merge branch 'master' into chore/common/move-common-core-desktop-to-core
This commit is contained in:
commit
f2de89bcc2
50 changed files with 2163 additions and 983 deletions
152
HISTORY.md
152
HISTORY.md
|
|
@ -1,5 +1,15 @@
|
|||
# Keyman Version History
|
||||
|
||||
## 16.0.12 alpha 2022-06-14
|
||||
|
||||
* chore(web): replace lerna with npm workspaces and ts projects (#6525)
|
||||
* fix(common): update increment-version for new tsc, node versions (#6762)
|
||||
|
||||
## 16.0.11 alpha 2022-05-27
|
||||
|
||||
* chore: A16S2 beta to master (#6670)
|
||||
* chore(ios): FV certificate hash (#6674)
|
||||
|
||||
## 16.0.10 alpha 2022-05-15
|
||||
|
||||
* chore: beta to master A16S1 (#6614)
|
||||
|
|
@ -44,6 +54,43 @@
|
|||
|
||||
* chore: move to 16.0 (#6318)
|
||||
|
||||
## 15.0.259 beta 2022-06-10
|
||||
|
||||
* fix(android/engine): Disable haptic feedback on hardware keystrokes (#6671)
|
||||
* fix(windows): Install TIP crash with inconsistent bcp47tag (#6727)
|
||||
* change(web): adjusts minimum distance needed for quick-display of subkeys (#6714)
|
||||
* change(web): browser test timeout tweaks (#6718)
|
||||
|
||||
## 15.0.258 beta 2022-06-06
|
||||
|
||||
* chore: add 14.0 entries to beta HISTORY.md (#6705)
|
||||
* chore(web): switch on additional BrowserStack reporting (#6707)
|
||||
* fix(web): fixes OSK-interaction issues in Float, Toolbar UI modules (#6689)
|
||||
|
||||
## 15.0.257 beta 2022-06-03
|
||||
|
||||
* fix(developer): kmcomp package compiler race condition (#6696)
|
||||
* fix(developer): install keyboard call should quote kmshell.exe path (#6691)
|
||||
|
||||
## 15.0.256 beta 2022-06-01
|
||||
|
||||
* chore(android,ios,mac): Update crowdin strings for Spanish (Latin America) (#6650)
|
||||
|
||||
## 15.0.255 beta 2022-05-31
|
||||
|
||||
* fix(web): osk shrinkage from rounding (#6658)
|
||||
|
||||
## 15.0.254 beta 2022-05-30
|
||||
|
||||
* fix(ios): missed i18n site (#6667)
|
||||
* fix(ios): keyboard height on app load (#6672)
|
||||
* feat(ios): adds back and forward navigation buttons for in-app help (#6654)
|
||||
* change(ios): modernization of the Keyman app main screen's layout logic (#6666)
|
||||
|
||||
## 15.0.253 beta 2022-05-27
|
||||
|
||||
* chore(ios): FV certificate hash (#6673)
|
||||
|
||||
## 15.0.252 beta 2022-05-25
|
||||
|
||||
* fix(ios): fixes OSK mispositioning bug in iOS 15 (#6631)
|
||||
|
|
@ -1500,6 +1547,111 @@
|
|||
|
||||
* chore: prepare 15.0 alpha (#4129)
|
||||
|
||||
## 14.0.292 stable 2022-05-24
|
||||
|
||||
* fix(windows): sentry debuglogging for DoInstall (#6648)
|
||||
|
||||
## 14.0.291 stable 2022-05-07
|
||||
|
||||
* fix(windows): don't log before checking nil when installing keyboard (#6506)
|
||||
* fix(windows): put correct HK_ALT flag for modifier (#6587)
|
||||
|
||||
## 14.0.290 stable 2022-03-31
|
||||
|
||||
* chore(oem/fv/android): Update dependencies (#6452)
|
||||
|
||||
## 14.0.289 stable 2022-03-30
|
||||
|
||||
* chore(linux): Remove versions that are no longer supported (#6388)
|
||||
* chore(windows): move crash metadata to extra (#6398)
|
||||
* fix(android/engine): Test fileVersion during package install (#6423)
|
||||
* fix(mac): invalid keyboard breaks configuration (#6420)
|
||||
* chore(android): Update Play publishing plugin to 3.5.0 and other plugins (#6224)
|
||||
* fix(web): track load error detail (#6443)
|
||||
|
||||
## 14.0.288 stable 2022-03-15
|
||||
|
||||
* chore(linux): Update changelogs for 14.0.287 (#6373)
|
||||
|
||||
## 14.0.287 stable 2022-03-04
|
||||
|
||||
* chore(ios): certificate update (#6210)
|
||||
* fix(windows): create Keyman/Diag folder in redirected profile (#6222)
|
||||
* fix(web): stop masking error (#6332)
|
||||
|
||||
## 14.0.286 stable 2022-01-27
|
||||
|
||||
* chore(linux): Update changelogs for 14.0.284 (#6131)
|
||||
* chore(linux): Revert workaround for Python bug (#6134)
|
||||
* fix: only auto-merge if `auto:` prefix in title (#6148)
|
||||
* fix(developer): work around devDependencies bug in npm (#6142)
|
||||
* chore(ios): certificate update (#6166)
|
||||
* fix(mac): Check for CODE_SETSYSTEMSTORE (#6170)
|
||||
|
||||
## 14.0.285 stable 2022-01-20
|
||||
|
||||
* fix(linux): Fix lintian errors :cherries: (#6107)
|
||||
* fix(linux): Add workaround for Python bug :cherries: (#6125)
|
||||
* fix(web): Use regex to determine display layer and functional layers (#6123)
|
||||
|
||||
## 14.0.284 stable 2022-01-11
|
||||
|
||||
* chore(android,oem/fv/android): Update targetSDKVersion to 30 (#5934)
|
||||
* fix(web): popupBaseKey null check (#5948)
|
||||
* fix(linux): Add test targets to Makefile (#5975)
|
||||
* fix(android/engine): Fix font paths (#5990)
|
||||
* chore(linux): Remove lintian warning (#5993)
|
||||
* chore(linux): Allow to specify debian revision (#5998)
|
||||
* chore(linux): Update changelogs for 14.0.283 :package: (#6007)
|
||||
* fix(linux): fix release version number for Sentry reporting :cherries: (#6053)
|
||||
* chore(common): Check in crowdin strings for Spanish (Latin America) (#6060)
|
||||
* fix(linux): fix release version number for Sentry reporting :cherries: (#6069)
|
||||
* chore(android/samples): Add -no-daemon flag to KMSample2 build script (#6083)
|
||||
* fix(linux): Fix attribute error :cherries: (#6087)
|
||||
|
||||
## 14.0.283 stable 2021-11-17
|
||||
|
||||
* chore(windows): fix broken links in help (#5766)
|
||||
* chore(linux): copy Keyman for Linux 15 reference to 14 (#5764)
|
||||
* fix(linux): Fix debian package script (#5772)
|
||||
* chore(common): Enhance cherry-pick labeling (#5773)
|
||||
* fix(common): Fix cherry-pick labeling (:cherries:) (#5783)
|
||||
* fix(linux): Don't crash displaying keyboard details (#5757)
|
||||
* chore(linux): Update changelog files for 14.0.282 (#5793)
|
||||
* fix(linux): Don't crash with non-keyboard package file (#5754)
|
||||
* chore: sentry.io dsn ️ (#5788)
|
||||
* fix(windows): handle edge cases using default language (#5775)
|
||||
* fix(ios): move sentry settings responsibility to build agent ️ (#5806)
|
||||
* fix(web): remove canvas use for iOS compatibility (#5916)
|
||||
|
||||
## 14.0.282 stable 2021-09-27
|
||||
|
||||
* fix(mac): add support for M1 processor (#5737)
|
||||
* chore(mac): Add help links for installing Keyman and keyboards (#5748)
|
||||
* fix: help.keyman.com script file cleanup (#5750)
|
||||
|
||||
## 14.0.281 stable 2021-09-17
|
||||
|
||||
* fix(common/models): keep/suggestion diacritic sensitivity when de-duping (#5552)
|
||||
* feat(ios): adds option for Simulator-compatible testing artifact (#5569)
|
||||
* chore(ios,windows): Update crowdin strings for Azerbaijani (#5487)
|
||||
* fix(oem/fv/ios): build configuration for 14.0's test-oriented simulator artifact (#5596)
|
||||
* fix(linux): Handle corrupt icon file (#5589)
|
||||
* fix(linux): Check for valid kmp file (#5590)
|
||||
* chore: fixup stable HISTORY.md (#5605)
|
||||
* chore(linux): Improve debian package script (#5624)
|
||||
* chore(linux): Fix uploading to Sentry (#5625)
|
||||
* chore(linux): Update changelog files (#5636)
|
||||
* fix(ios): iOS 13 and 14 only - stuck settings toggles (#5611)
|
||||
* fix(web): Fix layers for embedded longpress keys (#5651)
|
||||
* fix(linux): Use first keyboard language if none given (#5657)
|
||||
* fix(android/engine): Fix backspace on Android 5.0 (#5674)
|
||||
* chore(common): report-history (#5678)
|
||||
* fix(developer): ensure file modified after import from layout (#5677)
|
||||
* test(windows): investigate TIP crash (#5679)
|
||||
* fix(common/core/web): Remove empty rows in OSK (#5703)
|
||||
* fix(windows): fallback to filename if `&name` not set (#5685)
|
||||
|
||||
## 14.0.280 stable 2021-08-02
|
||||
|
||||
* fix(android): displayName for keyboard was not optional (#5492)
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
16.0.11
|
||||
16.0.13
|
||||
|
|
|
|||
|
|
@ -148,6 +148,8 @@ public class SystemKeyboard extends InputMethodService implements OnKeyboardEven
|
|||
SharedPreferences prefs = appContext.getSharedPreferences(appContext.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE);
|
||||
boolean mayPredict = prefs.getBoolean(KMManager.getLanguagePredictionPreferenceKey(langId), true);
|
||||
KMManager.setBannerOptions(mayPredict);
|
||||
} else {
|
||||
KMManager.setBannerOptions(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -87,11 +87,14 @@ public final class LanguageSettingsActivity extends AppCompatActivity {
|
|||
return;
|
||||
}
|
||||
|
||||
// If the active keyboard is for this language, immediately enact the new pref setting.
|
||||
String kbdLgCode = KMManager.getCurrentKeyboardInfo(context).getLanguageID();
|
||||
if (kbdLgCode.equals(lgCode)) {
|
||||
// Not only registers the model but also applies our modeling preferences.
|
||||
KMManager.registerAssociatedLexicalModel(lgCode);
|
||||
Keyboard kbInfo = KMManager.getCurrentKeyboardInfo(context);
|
||||
if(kbInfo != null) {
|
||||
// If the active keyboard is for this language, immediately enact the new pref setting.
|
||||
String kbdLgCode = kbInfo.getLanguageID();
|
||||
if (kbdLgCode.equals(lgCode)) {
|
||||
// Not only registers the model but also applies our modeling preferences.
|
||||
KMManager.registerAssociatedLexicalModel(lgCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,10 @@
|
|||
<string name="action_install_updates" comment="Menu notification that keyboard or dictionary updates available">Instalar actualizaciones</string>
|
||||
<!-- Context: Title -->
|
||||
<string name="title_version" comment="Title of Keyman for Android version">Versión: %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 requiere Chrome versión 57 o posterior.</string>
|
||||
<!-- Context: Button label -->
|
||||
<string name="button_update_chrome" comment="Prompt to upgrade Chrome in the Play Store">Actualizar Chrome</string>
|
||||
<!-- Context: Textfield prompt (… is the ellipsis character "...") -->
|
||||
<string name="textview_hint" comment="Prompt to start typing">Comienza a escribir aquí…</string>
|
||||
<!-- Context: Splash screen (version/copyright info currently disabled -->
|
||||
|
|
@ -50,13 +54,33 @@
|
|||
<string name="keyman_settings" comment="Settings menu title">Configuración</string>
|
||||
<!-- Context: Keyman Settings menu -->
|
||||
<plurals name="installed_languages">
|
||||
<item quantity="one">Installed languages (%1$d)</item>
|
||||
<item quantity="other">Installed languages (%1$d)</item>
|
||||
<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 o diccionario</string>
|
||||
<!-- Context: Keyman Settings menu -->
|
||||
<string name="change_display_language" comment="Menu action to change interface language">Cambiar idioma de interfaz</string>
|
||||
<string name="change_display_language" comment="Menu action to change interface language">Idioma de interfaz</string>
|
||||
<!-- Context: Keyman Settings menu -->
|
||||
<string name="adjust_keyboard_height" comment="Menu action to adjust keyboard height">Ajustar la altura del teclado</string>
|
||||
<!-- Context: Keyman Settings menu -->
|
||||
<string name="spacebar_caption" comment="Menu action to set the spacebar caption">Leyenda de barra espaciadora</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">Vacío</string>
|
||||
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
|
||||
<string name="spacebar_caption_hint_keyboard" comment="Spacebar caption hint - keyboard">Mostrar nombre del teclado en la barra espaciadora</string>
|
||||
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
|
||||
<string name="spacebar_caption_hint_language" comment="Spacebar caption hint - language">Mostrar nombre del idioma en la barra espaciadora</string>
|
||||
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
|
||||
<string name="spacebar_caption_hint_language_keyboard" comment="Spacebar caption hint - language + keyboard">Idioma y teclado en la barra espaciadora</string>
|
||||
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
|
||||
<string name="spacebar_caption_hint_blank" comment="Spacebar caption hint - blank">No mostrar leyenda en la barra espaciadora</string>
|
||||
<!-- Context: Keyman Settings menu -->
|
||||
<string name="show_banner" comment="text suggestions banner">Mostrar siempre el banner</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">Se agregó el 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">Ya están instalados todos los idiomas</string>
|
||||
<!-- Context: Adjust Keyboard Height menu -->
|
||||
<string name="drag_the_keyboard" comment="First line of adjusting keyboard height">Arrastra el teclado para ajustar la altura</string>
|
||||
<!-- Context: Adjust Keyboard Height menu -->
|
||||
<string name="rotate_the_device" comment="Second line of adjusting keyboard height">Rota el dispositivo para ajustar el modo vertical y horizontal</string>
|
||||
<!-- Context: Adjust Keyboard Height menu -->
|
||||
<string name="reset_to_defaults" comment="Button to reset to default heights">Restaurar valores predeterminados</string>
|
||||
<!-- Context: Keyman Web Browser -->
|
||||
<string name="hint_text" comment="Prompt to type in the browser search bar">Buscar o escribir una dirección web</string>
|
||||
<!-- Context: Keyman Web Browser -->
|
||||
|
|
@ -121,4 +151,6 @@
|
|||
<string name="no_associated_languages" comment="Notification when a keyboard package doesn't contain languages">El paquete del teclado no tiene idiomas asociados para instalar</string>
|
||||
<!-- Context: KMP Package strings -->
|
||||
<string name="invalid_metadata" comment="kmp.json metadata file is invalid or missing in package">Metadatos inválidos/ausentes en el paquete</string>
|
||||
<!-- Context: KMP Package strings -->
|
||||
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> El teclado requiere una versión más reciente de Keyman</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -146,6 +146,15 @@ function setSpacebarText(mode) {
|
|||
keyman.correctOSKTextSize();
|
||||
}
|
||||
|
||||
// #6665: we need to know when the user has pressed a hardware key so we don't
|
||||
// generate haptic feedback when text changes are made via insertText. We know
|
||||
// that the executeHardware->insertText process is a non-reentrant
|
||||
// single-threaded sequence so this global flag tracking whether we are
|
||||
// currently executing a hardware keystroke event is safe here. We can't do this
|
||||
// on the Java side, because the Java<-->JS interface is asynchronous, and we
|
||||
// cannot reliably know when each hardware keystroke has completed processing.
|
||||
var executingHardwareKeystroke = false;
|
||||
|
||||
/**
|
||||
* Inserts the selected string <i>s</i>
|
||||
* @param dn Number of pre-caret code points (UTF+8 characters) to delete
|
||||
|
|
@ -156,7 +165,7 @@ function insertText(dn, s, dr) {
|
|||
console_debug('insertText(dn='+dn+',s='+s+',dr='+dr+')');
|
||||
dr = dr || 0; // Sets a default value of zero when dr is undefined
|
||||
//window.console.log('insertText('+ dn +', ' + s +', ' + dr + ');');
|
||||
window.jsInterface.insertText(dn, s, dr);
|
||||
window.jsInterface.insertText(dn, s, dr, executingHardwareKeystroke);
|
||||
}
|
||||
|
||||
function deregisterModel(modelID) {
|
||||
|
|
@ -345,15 +354,16 @@ function executePopupKey(keyID, keyText) {
|
|||
|
||||
function executeHardwareKeystroke(code, shift, lstates, eventModifiers) {
|
||||
console_debug('executeHardwareKeystroke(code='+code+',shift='+shift+',lstates='+lstates+',eventModifiers='+eventModifiers+')');
|
||||
var kmw=window['keyman'];
|
||||
//window.console.log('executeHardwareKeystroke:('+code+', ' + shift + ', ' + lstates + ');');
|
||||
try {
|
||||
if (kmw['executeHardwareKeystroke'](code, shift, lstates)) { // false if matched, true if not
|
||||
executingHardwareKeystroke = true;
|
||||
if (window.keyman.executeHardwareKeystroke(code, shift, lstates)) { // false if matched, true if not
|
||||
// KMW didn't process the key, so have the Android app dispatch the key with the original event modifiers
|
||||
window.jsInterface.dispatchKey(code, eventModifiers);
|
||||
}
|
||||
executingHardwareKeystroke = false;
|
||||
} catch(e) {
|
||||
window.console.log('executeHardwareKeystroke exception: '+e);
|
||||
executingHardwareKeystroke = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -82,5 +82,5 @@ public abstract class KMKeyboardJSHandler {
|
|||
* @param dr Number of post-caret code points to delete.
|
||||
*/
|
||||
@JavascriptInterface
|
||||
public abstract void insertText(final int dn, final String s, final int dr);
|
||||
public abstract void insertText(final int dn, final String s, final int dr, final boolean executingHardwareKeystroke);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -207,7 +207,8 @@ public final class KMManager {
|
|||
protected static String currentBanner = KM_BANNER_STATE_BLANK;
|
||||
|
||||
|
||||
// Special override for when the keyboard may have haptic feedback when typing
|
||||
// Special override for when the keyboard may have haptic feedback when typing.
|
||||
// haptic feedback disabled for hardware keystrokes
|
||||
private static boolean mayHaveHapticFeedback = false;
|
||||
|
||||
// Special override for when keyboard is entering a password text field.
|
||||
|
|
@ -1999,6 +2000,16 @@ public final class KMManager {
|
|||
|
||||
public static Keyboard getCurrentKeyboardInfo(Context context) {
|
||||
int index = getCurrentKeyboardIndex(context);
|
||||
if(index < 0) {
|
||||
// As of 15.0-beta and 15.0-stable, this only appears to occur when
|
||||
// #6703 would trigger. This logging may help us better identify the
|
||||
// root cause.
|
||||
String key = KMKeyboard.currentKeyboard();
|
||||
// Even if it's null, it's still a notable error. This function shouldn't
|
||||
// be reachable in execution (15.0) at a time this variable would be set to `null`.
|
||||
KMLog.LogError(TAG, "Failed getCurrentKeyboardIndex check for keyboard: " + key);
|
||||
return null;
|
||||
}
|
||||
return KeyboardController.getInstance().getKeyboardInfo(index);
|
||||
}
|
||||
|
||||
|
|
@ -2707,7 +2718,7 @@ public final class KMManager {
|
|||
|
||||
// This annotation is required in Jelly Bean and later:
|
||||
@JavascriptInterface
|
||||
public void insertText(final int dn, final String s, final int dr) {
|
||||
public void insertText(final int dn, final String s, final int dr, final boolean executingHardwareKeystroke) {
|
||||
if(dr != 0) {
|
||||
Log.d(TAG, "Right deletions requested but are not presently supported by the in-app keyboard.");
|
||||
}
|
||||
|
|
@ -2815,7 +2826,7 @@ public final class KMManager {
|
|||
// Collapse the selection
|
||||
textView.setSelection(start + s.length());
|
||||
textView.endBatchEdit();
|
||||
if (mayHaveHapticFeedback) {
|
||||
if (mayHaveHapticFeedback && !executingHardwareKeystroke) {
|
||||
textView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
|
||||
}
|
||||
}
|
||||
|
|
@ -2869,7 +2880,7 @@ public final class KMManager {
|
|||
|
||||
// This annotation is required in Jelly Bean and later:
|
||||
@JavascriptInterface
|
||||
public void insertText(final int dn, final String s, final int dr) {
|
||||
public void insertText(final int dn, final String s, final int dr, final boolean executingHardwareKeystroke) {
|
||||
// TODO: Unify in-app and system insertText
|
||||
Handler mainLoop = new Handler(Looper.getMainLooper());
|
||||
mainLoop.post(new Runnable() {
|
||||
|
|
@ -2960,7 +2971,7 @@ public final class KMManager {
|
|||
|
||||
ic.endBatchEdit();
|
||||
ViewGroup parent = (ViewGroup) SystemKeyboard.getParent();
|
||||
if (parent != null && mayHaveHapticFeedback) {
|
||||
if (parent != null && mayHaveHapticFeedback && !executingHardwareKeystroke) {
|
||||
parent.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -209,9 +209,12 @@ public final class ModelPickerActivity extends BaseActivity {
|
|||
if(immediateRegister) {
|
||||
// Register associated lexical model if it matches the active keyboard's language code;
|
||||
// it's safe since we're on the same thread. Needs to be called AFTER deinstalling the old one.
|
||||
String kbdLgCode = KMManager.getCurrentKeyboardInfo(context).getLanguageID();
|
||||
if(BCP47.languageEquals(kbdLgCode, languageID)) {
|
||||
KMManager.registerAssociatedLexicalModel(languageID);
|
||||
com.tavultesoft.kmea.data.Keyboard kbInfo = KMManager.getCurrentKeyboardInfo(context);
|
||||
if(kbInfo != null) {
|
||||
String kbdLgCode = kbInfo.getLanguageID();
|
||||
if(BCP47.languageEquals(kbdLgCode, languageID)) {
|
||||
KMManager.registerAssociatedLexicalModel(languageID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -207,7 +207,7 @@ public class KeyboardController {
|
|||
}
|
||||
}
|
||||
|
||||
Log.w(TAG, "getKeyboardIndex failed for key " + key);
|
||||
KMLog.LogError(TAG, "getKeyboardIndex failed for key " + key);
|
||||
return index;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,11 @@
|
|||
<item quantity="other">Teclados</item>
|
||||
</plurals>
|
||||
<!-- Context: Title for list -->
|
||||
<plurals name="title_other_input_methods">
|
||||
<item quantity="one">Otro método de entrada</item>
|
||||
<item quantity="other">Otros métodos de entrada</item>
|
||||
</plurals>
|
||||
<!-- Context: Title for list -->
|
||||
<string name="title_add_keyboard" comment="Add a new keyboard">Agregar teclado nuevo</string>
|
||||
<!-- Context: Title for list -->
|
||||
<string name="title_languages_settings" comment="List of installed languages">Idiomas instalados</string>
|
||||
|
|
@ -21,9 +26,13 @@
|
|||
<string name="label_cancel" comment="Button to cancel an action">Cancelar</string>
|
||||
<!-- Context: Button label -->
|
||||
<string name="label_close" comment="Close a dialog">Cerrar</string>
|
||||
<!-- Context: Button label -->
|
||||
<!-- Context: Button label. Removed in Keyman 15 -->
|
||||
<string name="label_close_keyman" comment="Close the Keyman application">Cerrar Keyman</string>
|
||||
<!-- Context: Button label -->
|
||||
<string name="label_forward" comment="Button to go forward">Adelante</string>
|
||||
<!-- Context: Button label -->
|
||||
<string name="label_next_input_method" comment="Switch to next input method (replaces label_close_keyman)">Siguiente método de entrada</string>
|
||||
<!-- Context: Button label -->
|
||||
<string name="label_download" comment="Button to confirm downloading an item">Descargar</string>
|
||||
<!-- Context: Button label -->
|
||||
<string name="label_install" comment="Confirmation to install a package">Instalar</string>
|
||||
|
|
@ -35,6 +44,8 @@
|
|||
<string name="label_ok" comment="Button to acknowledge a dialog">Aceptar</string>
|
||||
<!-- Context: Button label -->
|
||||
<string name="label_update" comment="Dialog button to update a resource">Actualizar</string>
|
||||
<!-- Context: No internet for updates -->
|
||||
<string name="no_internet_connection" comment="Internet connection missing">No hay conexión a Internet</string>
|
||||
<!-- Context: Keyboard Updates -->
|
||||
<string name="cannot_connect" comment="Error message when network connection fails">¡No se puede conectar con el servidor Keyman!</string>
|
||||
<!-- Context: Keyboard Updates -->
|
||||
|
|
@ -69,8 +80,11 @@
|
|||
<string name="fileprovider_undefined" comment="FileProvider library needed to view help file"> Se necesita la librería FileProvider para ver el archivo de ayuda: %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"> Error fatal del teclado con %1$s:%2$s para el idioma %3$s. Cargando teclado predeterminado.</string>
|
||||
<!-- Context: Fatal keyboard error. -->
|
||||
<string name="fatal_keyboard_error_short" comment="Error in keyboard (keyboard ID::packageID for language)."> Error en el teclado %1$s:%2$s para el idioma %3$s.</string>
|
||||
<!-- Context: Query for associated dictionary -->
|
||||
<string name="query_associated_model" comment="Check if there's an available dictionary to download">Buscando diccionario asociado para descargar</string>
|
||||
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> No se pudo conectar al servidor de Keyman para buscar un diccionario asociado para descargar</string>
|
||||
<!-- Context: Model Updates -->
|
||||
<string name="confirm_download_model" comment="Confirmation to download a dictionary update">¿Quieres descargar la última versión de este diccionario?</string>
|
||||
<!-- Context: No associated dictionary found -->
|
||||
|
|
@ -113,16 +127,25 @@
|
|||
<string name="uninstall_model" comment="Label to uninstall a dictionary">Desinstalar diccionario</string>
|
||||
<!-- Context: Model Info -->
|
||||
<string name="confirm_delete_model" comment="Confirmation to delete a dictionary">¿Quieres eliminar este diccionario?</string>
|
||||
<!-- Context: Model Deleted -->
|
||||
<string name="model_deleted" comment="Notification when a dictionary is deleted">Diccionario borrado</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 Keyboard uninstall strings -->
|
||||
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">Teclado borrado</string>
|
||||
<!-- Context: Language Settings menu strings -->
|
||||
<string name="enable_corrections" comment="Enable corrections from the suggestion banner">Habilitar correcciones</string>
|
||||
<!-- Context: Language Settings menu strings -->
|
||||
<string name="enable_predictions" comment="Enable predictions from the suggestion banner">Habilitar predicciones</string>
|
||||
<!-- Context: Language Settings menu strings -->
|
||||
<string name="model_label">Diccionario</string>
|
||||
<plurals name="model_count">
|
||||
<item quantity="one">Diccionario</item>
|
||||
<item quantity="other">Diccionarios</item>
|
||||
</plurals>
|
||||
<!-- Context: Language Settings menu substring - Check for available dictionary -->
|
||||
<string name="check_available_model" comment="Check for available dictionary">Buscar diccionario disponible</string>
|
||||
<string name="check_model_online" comment="Check for dictionaries online">Buscar diccionarios en línea</string>
|
||||
<!-- Context: Language Settings menu strings -->
|
||||
<string name="model_info_header" comment="Dictionary name">Diccionario: %1$s</string>
|
||||
<!-- Context: Language Settings menu strings -->
|
||||
|
|
|
|||
|
|
@ -133,18 +133,18 @@ module.exports = function(config) {
|
|||
var specifics = {
|
||||
// BrowserStack configuration options
|
||||
browserStack: {
|
||||
video: false,
|
||||
browserDisconnectTimeout: 3e5,
|
||||
retryLimit: 1, // 0 is ignored.
|
||||
video: true,
|
||||
browserDisconnectTimeout: 6e4, // 1 minute (60s => 60,000ms)
|
||||
retryLimit: 3, // 0 is ignored.
|
||||
startTunnel: true,
|
||||
},
|
||||
|
||||
// Attempts to avoid generating a 'fail' exit code if one of our selected browsers on BrowserStack goes poof.
|
||||
failOnEmptyTestSuite: false,
|
||||
|
||||
captureTimeout: 6e5, // in milliseconds
|
||||
browserNoActivityTimeout: 3e5,
|
||||
browserDisconnectTimeout: 3e5,
|
||||
captureTimeout: 1.2e5, // in milliseconds
|
||||
browserNoActivityTimeout: 6e4,
|
||||
browserDisconnectTimeout: 6e4,
|
||||
browserDisconnectTolerance: 3,
|
||||
|
||||
// Avoids generating a 'fail' exit code if one of our selected browsers on BrowserStack goes poof.
|
||||
|
|
@ -153,7 +153,7 @@ module.exports = function(config) {
|
|||
// test results reporter to use
|
||||
// possible values: 'dots', 'progress'
|
||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||
reporters: ['teamcity'],
|
||||
reporters: ['teamcity', 'BrowserStack'],
|
||||
|
||||
// level of logging
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
|
|
|
|||
|
|
@ -39,14 +39,14 @@ test-headless ( ) {
|
|||
test-browsers ( ) {
|
||||
_FLAGS=$FLAGS
|
||||
if (( CI_REPORTING )); then
|
||||
_FLAGS="$_FLAGS -CI -reporter teamcity"
|
||||
_FLAGS="$_FLAGS -CI -reporter teamcity,BrowserStack"
|
||||
fi
|
||||
|
||||
$SCRIPT_ROOT/in_browser/browser-test.sh $os_id $_FLAGS
|
||||
}
|
||||
|
||||
# Defaults
|
||||
get_builder_OS # return: os_id="linux"|"mac"|"win"
|
||||
get_builder_OS # return: os_id="linux"|"mac"|"win"
|
||||
|
||||
FLAGS="--require ./unit_tests/helpers"
|
||||
CI_REPORTING=0
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ display_usage ( ) {
|
|||
FLAGS=
|
||||
CI_REPORTING=0
|
||||
FETCH_DEPS=true
|
||||
CHAINING_FLAGS=-skip-package-install
|
||||
|
||||
# Parse args
|
||||
while [[ $# -gt 0 ]] ; do
|
||||
|
|
@ -42,6 +43,7 @@ while [[ $# -gt 0 ]] ; do
|
|||
;;
|
||||
-CI)
|
||||
CI_REPORTING=1
|
||||
CHAINING_FLAGS="$CHAINING_FLAGS -CI"
|
||||
;;
|
||||
-skip-package-install|-S)
|
||||
FETCH_DEPS=false
|
||||
|
|
@ -50,6 +52,10 @@ while [[ $# -gt 0 ]] ; do
|
|||
shift # past argument
|
||||
done
|
||||
|
||||
if (( CI_REPORTING )); then
|
||||
FLAGS="$FLAGS --reporter mocha-teamcity-reporter"
|
||||
fi
|
||||
|
||||
if [ $FETCH_DEPS = true ]; then
|
||||
verify_npm_setup
|
||||
fi
|
||||
|
|
@ -61,25 +67,21 @@ pushd "$KEYMAN_ROOT/developer/js/"
|
|||
popd
|
||||
|
||||
test-headless ( ) {
|
||||
if (( CI_REPORTING )); then
|
||||
FLAGS="$FLAGS --reporter mocha-teamcity-reporter"
|
||||
fi
|
||||
|
||||
npm run mocha -- --recursive $FLAGS ./tests/cases/
|
||||
}
|
||||
|
||||
if [ $FETCH_DEPS = true ]; then
|
||||
# First, run tests on the keyboard processor.
|
||||
pushd "$KEYMAN_ROOT/common/web/keyboard-processor"
|
||||
./test.sh -skip-package-install || fail "Tests failed by dependencies; aborting integration tests."
|
||||
popd
|
||||
|
||||
# Next, build the lm-worker in its proper, wrapped form
|
||||
pushd "$KEYMAN_ROOT/common/web/lm-worker"
|
||||
./build.sh
|
||||
popd
|
||||
fi
|
||||
|
||||
# First, run tests on the keyboard processor.
|
||||
pushd "$KEYMAN_ROOT/common/web/keyboard-processor"
|
||||
./test.sh $CHAINING_FLAGS || fail "Tests failed by dependencies; aborting integration tests."
|
||||
popd
|
||||
|
||||
# Build the leaf-style, bundled version of input-processor for use in testing.
|
||||
npm run tsc -- -b src/tsconfig.bundled.json || fail "Failed to compile the core/web/input-processor module."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ c expected: \U0001F601yx
|
|||
c context:
|
||||
|
||||
store(&version) '10.0'
|
||||
store(&name) '028smp'
|
||||
|
||||
begin Unicode > use(Main)
|
||||
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ tests = [
|
|||
]
|
||||
|
||||
if build_machine.system() == 'windows'
|
||||
kmcomp = find_program('kmcomp.exe', required: false)
|
||||
kmcomp = find_program(join_paths(meson.source_root(),'..','..','..','windows','bin','developer','kmcomp.exe'), 'kmcomp.exe', required: false)
|
||||
kmcomp_cmd = [kmcomp]
|
||||
copy_cmd = [find_program('cmd.exe', required: true), '/c', 'copy']
|
||||
cat_cmd = [find_program('cmd.exe', required: true), '/c', 'type']
|
||||
|
|
|
|||
|
|
@ -55,10 +55,10 @@ class KeymanWebViewController: UIViewController {
|
|||
private var subKeys: [UIButton] = []
|
||||
|
||||
private var subKeyAnchor = CGRect.zero
|
||||
|
||||
|
||||
/// Stores the keyboard view's current size.
|
||||
private var kbSize: CGSize = CGSize.zero
|
||||
|
||||
|
||||
/// Stores the current image for use by the Banner
|
||||
/// when predictive text is not active
|
||||
private var bannerImgPath: String = ""
|
||||
|
|
@ -72,14 +72,14 @@ class KeymanWebViewController: UIViewController {
|
|||
init(storage: Storage) {
|
||||
self.storage = storage
|
||||
super.init(nibName: nil, bundle: nil)
|
||||
|
||||
|
||||
_ = view
|
||||
}
|
||||
|
||||
required init?(coder aDecoder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
|
||||
@objc func fixLayout() {
|
||||
view.setNeedsLayout()
|
||||
view.layoutIfNeeded()
|
||||
|
|
@ -97,7 +97,7 @@ class KeymanWebViewController: UIViewController {
|
|||
|
||||
keyboardSize = view.bounds.size
|
||||
}
|
||||
|
||||
|
||||
open override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
|
||||
super.viewWillTransition(to: size, with: coordinator)
|
||||
|
||||
|
|
@ -123,14 +123,14 @@ class KeymanWebViewController: UIViewController {
|
|||
config.preferences = prefs
|
||||
config.suppressesIncrementalRendering = false
|
||||
config.userContentController = self.userContentController
|
||||
|
||||
|
||||
webView = KeymanWebView(frame: CGRect(origin: .zero, size: keyboardSize), configuration: config)
|
||||
webView!.isOpaque = false
|
||||
webView!.translatesAutoresizingMaskIntoConstraints = false
|
||||
webView!.backgroundColor = UIColor.clear
|
||||
webView!.navigationDelegate = self
|
||||
webView!.scrollView.isScrollEnabled = false
|
||||
|
||||
|
||||
view = webView
|
||||
|
||||
// Set UILongPressGestureRecognizer to show sub keys
|
||||
|
|
@ -151,7 +151,7 @@ class KeymanWebViewController: UIViewController {
|
|||
super.viewWillAppear(animated)
|
||||
self.userContentController.add(self, name: keymanWebViewName)
|
||||
}
|
||||
|
||||
|
||||
// Very useful for immediately adjusting the WebView's properties upon loading.
|
||||
override func viewDidAppear(_ animated: Bool) {
|
||||
fixLayout()
|
||||
|
|
@ -160,7 +160,7 @@ 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)
|
||||
}
|
||||
|
|
@ -191,7 +191,7 @@ extension KeymanWebViewController {
|
|||
let start = jsonString.index(jsonString.startIndex, offsetBy: 2)
|
||||
let end = jsonString.index(jsonString.endIndex, offsetBy: -2)
|
||||
let escapedText = jsonString[start..<end]
|
||||
|
||||
|
||||
let cmd = "executePopupKey(\"\(id)\",\"\(escapedText)\");"
|
||||
webView!.evaluateJavaScript(cmd, completionHandler: nil)
|
||||
} catch {
|
||||
|
|
@ -211,11 +211,11 @@ extension KeymanWebViewController {
|
|||
func setPopupVisible(_ visible: Bool) {
|
||||
webView!.evaluateJavaScript("popupVisible(\(visible));", completionHandler: nil)
|
||||
}
|
||||
|
||||
|
||||
private func setSpacebarText(_ mode: SpacebarText) {
|
||||
webView!.evaluateJavaScript("setSpacebarText('\(mode.rawValue)');", completionHandler: nil);
|
||||
}
|
||||
|
||||
|
||||
func updateSpacebarText() {
|
||||
let userData = Storage.active.userDefaults
|
||||
setSpacebarText(userData.optSpacebarText)
|
||||
|
|
@ -249,7 +249,7 @@ extension KeymanWebViewController {
|
|||
SentryManager.captureAndLog(error.localizedDescription)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func resetContext() {
|
||||
webView!.evaluateJavaScript("doResetContext();", completionHandler: nil)
|
||||
}
|
||||
|
|
@ -292,11 +292,11 @@ extension KeymanWebViewController {
|
|||
if let packageID = keyboard.packageID {
|
||||
stub["KP"] = packageID
|
||||
}
|
||||
|
||||
|
||||
if let displayName = keyboard.displayName {
|
||||
stub["displayName"] = displayName
|
||||
}
|
||||
|
||||
|
||||
// Warning: without special handling, any `guard` that fails here can trigger an
|
||||
// infinite keyboard reload, as the keyboard page itself will note that the keyboard
|
||||
// failed to initialize properly.
|
||||
|
|
@ -348,7 +348,7 @@ extension KeymanWebViewController {
|
|||
log.info("Keyboard stub: \(stubString)")
|
||||
webView!.evaluateJavaScript("setKeymanLanguage(\(stubString));", completionHandler: nil)
|
||||
}
|
||||
|
||||
|
||||
func deregisterLexicalModel(_ lexicalModel: InstallableLexicalModel) {
|
||||
webView!.evaluateJavaScript("keyman.modelManager.deregister(\"\(lexicalModel.id)\")")
|
||||
}
|
||||
|
|
@ -371,7 +371,7 @@ extension KeymanWebViewController {
|
|||
SentryManager.captureAndLog(event)
|
||||
throw KeyboardError.fileMissing
|
||||
}
|
||||
|
||||
|
||||
let data: Data
|
||||
do {
|
||||
data = try JSONSerialization.data(withJSONObject: stub, options: [])
|
||||
|
|
@ -400,12 +400,12 @@ extension KeymanWebViewController {
|
|||
if lexicalModel.languageID == Manager.shared.currentKeyboardID?.languageID {
|
||||
// We're registering a lexical model for the now-current keyboard.
|
||||
// Enact any appropriate language-modeling settings!
|
||||
|
||||
|
||||
let userDefaults = Storage.active.userDefaults
|
||||
|
||||
|
||||
let predict = userDefaults.predictSettingForLanguage(languageID: lexicalModel.languageID)
|
||||
let correct = userDefaults.correctSettingForLanguage(languageID: lexicalModel.languageID)
|
||||
|
||||
|
||||
// Pass these off to KMW!
|
||||
// We do these first so that they're automatically set for the to-be-registered model in advance.
|
||||
webView!.evaluateJavaScript("enableSuggestions(\(stubString), \(predict), \(correct))")
|
||||
|
|
@ -416,12 +416,12 @@ extension KeymanWebViewController {
|
|||
|
||||
setBannerHeight(to: Int(InputViewController.topBarHeight))
|
||||
}
|
||||
|
||||
|
||||
func showBanner(_ display: Bool) {
|
||||
SentryManager.breadcrumbAndLog("Changing banner's alwaysShow property to \(display).", category: "engine", sentryLevel: .debug)
|
||||
webView?.evaluateJavaScript("showBanner(\(display ? "true" : "false"))", completionHandler: nil)
|
||||
}
|
||||
|
||||
|
||||
func setBannerImage(to path: String) {
|
||||
bannerImgPath = path // Save the path in case delayed initializaiton is needed.
|
||||
var logString: String
|
||||
|
|
@ -433,7 +433,7 @@ extension KeymanWebViewController {
|
|||
log.debug("Banner image path: '\(logString).'")
|
||||
webView?.evaluateJavaScript("setBannerImage(\"\(path)\");", completionHandler: nil)
|
||||
}
|
||||
|
||||
|
||||
func setBannerHeight(to height: Int) {
|
||||
webView?.evaluateJavaScript("setBannerHeight(\(height));", completionHandler: nil)
|
||||
}
|
||||
|
|
@ -573,17 +573,17 @@ extension KeymanWebViewController: WKScriptMessageHandler {
|
|||
} else if fragment.hasPrefix("#suggestPopup"){
|
||||
let cmdKey = fragment.range(of: "+cmd=")!
|
||||
let cmdStr = fragment[cmdKey.upperBound..<fragment.endIndex]
|
||||
|
||||
|
||||
let cmdData = cmdStr.data(using: .utf16)
|
||||
let decoder = JSONDecoder()
|
||||
|
||||
|
||||
do {
|
||||
let cmd = try decoder.decode(SuggestionPopup.self, from: cmdData!)
|
||||
log.verbose("Longpress detected on suggestion: \"\(cmd.suggestion.displayAs)\".")
|
||||
} catch {
|
||||
SentryManager.captureAndLog(error, message: "Unexpected JSON parse error: \(error).")
|
||||
}
|
||||
|
||||
|
||||
// Will need processing upon extraction from the resulting object.
|
||||
// let frameComponents = baseFrame.components(separatedBy: ",")
|
||||
// let x = CGFloat(Float(frameComponents[0])!)
|
||||
|
|
@ -591,7 +591,7 @@ extension KeymanWebViewController: WKScriptMessageHandler {
|
|||
// let w = CGFloat(Float(frameComponents[2])!)
|
||||
// let h = CGFloat(Float(frameComponents[3])!)
|
||||
// let frame = KeymanWebViewController.keyFrame(x: x, y: y, w: w, h: h)
|
||||
|
||||
|
||||
} else {
|
||||
SentryManager.captureAndLog("Unexpected KMW event: \(fragment)")
|
||||
}
|
||||
|
|
@ -600,7 +600,7 @@ extension KeymanWebViewController: WKScriptMessageHandler {
|
|||
private static func keyFrame(x: CGFloat, y: CGFloat, w: CGFloat, h: CGFloat) -> CGRect {
|
||||
return CGRect(x: x - (w/2), y: y, width: w, height: h)
|
||||
}
|
||||
|
||||
|
||||
public func beep(_ keymanWeb: KeymanWebViewController) {
|
||||
let vibrationSupport = Manager.shared.vibrationSupportLevel
|
||||
let kSystemSoundID_MediumVibrate: SystemSoundID = 1520
|
||||
|
|
@ -720,10 +720,13 @@ extension KeymanWebViewController: KeymanWebDelegate {
|
|||
setBannerImage(to: bannerImgPath)
|
||||
// Reset the keyboard's size.
|
||||
keyboardSize = kbSize
|
||||
|
||||
|
||||
fixLayout()
|
||||
|
||||
// Will trigger Manager's `keyboardLoaded` method.
|
||||
NotificationCenter.default.post(name: Notifications.keyboardLoaded, object: self, value: newKb!)
|
||||
|
||||
// "Should reload" the keyboard assets. (Not the host page.)
|
||||
if shouldReload {
|
||||
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(self.resetKeyboard), object: nil)
|
||||
perform(#selector(self.resetKeyboard), with: nil, afterDelay: 0.25)
|
||||
|
|
@ -740,7 +743,7 @@ extension KeymanWebViewController: KeymanWebDelegate {
|
|||
showBanner(alwaysShow)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func insertText(_ view: KeymanWebViewController, numCharsToDelete: Int, newText: String) {
|
||||
dismissHelpBubble()
|
||||
Manager.shared.isKeymanHelpOn = false
|
||||
|
|
@ -944,7 +947,7 @@ extension KeymanWebViewController: UIGestureRecognizerDelegate {
|
|||
// Detect the text width for subkeys. The 'as Any' silences an inappropriate warning from Swift.
|
||||
let textSize = subKeyText.size(withAttributes: [NSAttributedString.Key.font: button.titleLabel?.font! as Any])
|
||||
var displayText = subKeyText
|
||||
|
||||
|
||||
if textSize.width <= 0 && subKeyText.count > 0 {
|
||||
// It's probably a diacritic in need of a combining character!
|
||||
// Also check if the language is RTL!
|
||||
|
|
@ -1006,7 +1009,7 @@ extension KeymanWebViewController {
|
|||
var keyboardWidth: CGFloat {
|
||||
return keyboardSize.width
|
||||
}
|
||||
|
||||
|
||||
func initKeyboardSize() {
|
||||
var width: CGFloat
|
||||
var height: CGFloat
|
||||
|
|
@ -1020,13 +1023,13 @@ extension KeymanWebViewController {
|
|||
|
||||
keyboardSize = CGSize(width: width, height: height)
|
||||
}
|
||||
|
||||
|
||||
var keyboardSize: CGSize {
|
||||
get {
|
||||
if kbSize.equalTo(CGSize.zero) {
|
||||
initKeyboardSize()
|
||||
}
|
||||
|
||||
|
||||
return kbSize
|
||||
}
|
||||
set(size) {
|
||||
|
|
@ -1065,14 +1068,14 @@ extension KeymanWebViewController {
|
|||
setOskWidth(Int(kbSize.width))
|
||||
setOskHeight(Int(kbSize.height))
|
||||
}
|
||||
|
||||
|
||||
func resetKeyboardState() {
|
||||
dismissSubKeys()
|
||||
dismissKeyPreview()
|
||||
dismissKeyboardMenu()
|
||||
resizeKeyboard()
|
||||
}
|
||||
|
||||
|
||||
// Used for a selector; keep @objc!
|
||||
@objc func resetKeyboard() {
|
||||
let keyboard = Manager.shared.currentKeyboard
|
||||
|
|
|
|||
|
|
@ -49,6 +49,12 @@
|
|||
/* Confirmation text to display before uninstalling a lexical model */
|
||||
"command-uninstall-lexical-model-confirm" = "¿Quieres desinstalar este diccionario?";
|
||||
|
||||
/* Text for error when a keyboard cannot load properly */
|
||||
"error-loading-keyboard" = "No se puede cargar el teclado solicitado";
|
||||
|
||||
/* Text for error when a lexical model cannot load properly */
|
||||
"error-loading-lexical-model" = "No se puede cargar el diccionario solicitado";
|
||||
|
||||
/* Text for error when an installed file is unexpectedly missing */
|
||||
"error-missing-file" = "No se pudo encontrar un archivo requerido.";
|
||||
|
||||
|
|
@ -112,12 +118,21 @@
|
|||
/* Error opening a Keyman package - package is not valid */
|
||||
"kmp-error-invalid" = "El archivo del paquete está corrupto.";
|
||||
|
||||
/* Error opening a Keyman package - it does not exist / the specified location is wrong */
|
||||
"kmp-error-missing" = "El paquete especificado no existe.";
|
||||
|
||||
/* Error installing a Keyman package - expected resource (keyboard or dictionary) is missing */
|
||||
"kmp-error-missing-resource" = "Este paquete no contiene el teclado o el diccionario solicitado.";
|
||||
|
||||
/* Error installing a Keyman package with a version of Keyman that does not support it */
|
||||
"kmp-error-unsupported-keyman-version" = "Este paquete requiere una versión más reciente de Keyman.";
|
||||
|
||||
/* Error opening a Keyman package - cannot parse contents */
|
||||
"kmp-error-no-metadata" = "Este paquete no fue compilado correctamente - contenidos desconocidos.";
|
||||
|
||||
/* Error opening a Keyman package - package's contents are for desktop platforms only */
|
||||
"kmp-error-unsupported" = "Este paquete no incluye soporte para su dispositivo.";
|
||||
|
||||
/* Error opening a Keyman package - package contains unexpected resource (keyboard or dictionary) type */
|
||||
"kmp-error-wrong-type" = "Este paquete no contiene el tipo de recurso esperado.";
|
||||
|
||||
|
|
@ -181,6 +196,36 @@
|
|||
/* Title for the main Settings menu */
|
||||
"menu-settings-title" = "Configuración de Keyman";
|
||||
|
||||
/* Secondary text showing current setting for spacebar caption - blank */
|
||||
"menu-settings-spacebar-hint-blank" = "No mostrar leyenda en la barra espaciadora";
|
||||
|
||||
/* Secondary text showing current setting for spacebar caption - keyboard */
|
||||
"menu-settings-spacebar-hint-keyboard" = "Mostrar nombre del teclado en la barra espaciadora";
|
||||
|
||||
/* Secondary text showing current setting for spacebar caption - language */
|
||||
"menu-settings-spacebar-hint-language" = "Mostrar nombre del idioma en la barra espaciadora";
|
||||
|
||||
/* Secondary text showing current setting for spacebar caption - language + keyboard */
|
||||
"menu-settings-spacebar-hint-languageKeyboard" = "Mostrar nombre de idioma y teclado en la barra espaciadora";
|
||||
|
||||
/* Label for the "Spacebar Caption" item on the main settings screen */
|
||||
"menu-settings-spacebar-text" = "Leyenda de Barra Espaciadora";
|
||||
|
||||
/* Title for the "Spacebar Caption" settings screen */
|
||||
"menu-settings-spacebar-title" = "Leyenda de Barra Espaciadora";
|
||||
|
||||
/* Text showing name of spacebar caption - blank */
|
||||
"menu-settings-spacebar-item-blank" = "Vacío";
|
||||
|
||||
/* 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 y teclado";
|
||||
|
||||
/* Short text for notification: download failure for keyboard */
|
||||
"notification-download-failure-keyboard" = "Error al descargar el teclado";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@
|
|||
title: Welcome to Keyman
|
||||
---
|
||||
|
||||
Thank you for installing Keyman for iPhone and iPad. Whether you're a new or returning user,
|
||||
Thank you for installing Keyman for iPhone and iPad. Whether you're a new or returning user,
|
||||
we believe you will appreciate the significant enhancements in this latest version of Keyman for iPhone and iPad.
|
||||
|
||||
## What is Keyman for iPhone and iPad?
|
||||
Keyman for iPhone and iPad lets you type in over 600 languages on Apple iPhones and iPads.
|
||||
|
||||
[Click here](../start) to get started
|
||||
[Click here](../start/) to get started
|
||||
|
|
|
|||
|
|
@ -13,14 +13,21 @@ import Reachability
|
|||
class InfoViewController: UIViewController, UIWebViewDelegate {
|
||||
@IBOutlet var webView: UIWebView!
|
||||
|
||||
@IBOutlet var backButton: UIBarButtonItem!
|
||||
@IBOutlet var forwardButton: UIBarButtonItem!
|
||||
|
||||
private var networkReachable: Reachability?
|
||||
|
||||
convenience init() {
|
||||
private var exitClosure: (() -> Void)? = nil;
|
||||
|
||||
convenience init(exitClosure: @escaping () -> Void) {
|
||||
if UIDevice.current.userInterfaceIdiom == .phone {
|
||||
self.init(nibName: "InfoViewController_iPhone", bundle: nil)
|
||||
} else {
|
||||
self.init(nibName: "InfoViewController_iPad", bundle: nil)
|
||||
}
|
||||
|
||||
self.exitClosure = exitClosure
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
|
|
@ -42,6 +49,39 @@ class InfoViewController: UIViewController, UIWebViewDelegate {
|
|||
reloadKeymanHelp()
|
||||
}
|
||||
|
||||
private func updateButtons() {
|
||||
backButton.isEnabled = webView.canGoBack
|
||||
forwardButton.isEnabled = webView.canGoForward
|
||||
}
|
||||
|
||||
func webViewDidStartLoad(_ webView: UIWebView) {
|
||||
UIApplication.shared.isNetworkActivityIndicatorVisible = true
|
||||
updateButtons()
|
||||
}
|
||||
|
||||
func webViewDidFinishLoad(_ webView: UIWebView) {
|
||||
UIApplication.shared.isNetworkActivityIndicatorVisible = false
|
||||
updateButtons()
|
||||
}
|
||||
|
||||
func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
|
||||
UIApplication.shared.isNetworkActivityIndicatorVisible = false
|
||||
updateButtons()
|
||||
log.debug(error)
|
||||
}
|
||||
|
||||
@IBAction func back(_ sender: Any) {
|
||||
webView.goBack()
|
||||
}
|
||||
|
||||
@IBAction func forward(_ sender: Any) {
|
||||
webView.goForward()
|
||||
}
|
||||
|
||||
@objc func close(_ sender: Any?) {
|
||||
self.exitClosure?()
|
||||
}
|
||||
|
||||
func reloadKeymanHelp() {
|
||||
loadFromLocal()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,39 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="ipad9_7" orientation="portrait" layout="fullscreen" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="InfoViewController">
|
||||
<connections>
|
||||
<outlet property="backButton" destination="TLs-g2-xbM" id="jNT-EB-krs"/>
|
||||
<outlet property="forwardButton" destination="QUu-pQ-ATm" id="hlc-dV-pzs"/>
|
||||
<outlet property="view" destination="1" id="26"/>
|
||||
<outlet property="webView" destination="46" id="47"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view contentMode="scaleToFill" id="1">
|
||||
<rect key="frame" x="0.0" y="64" width="768" height="960"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="768" height="974"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="768" height="960"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<webView contentMode="scaleToFill" id="46">
|
||||
<rect key="frame" x="0.0" y="0.0" width="768" height="960"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</webView>
|
||||
</subviews>
|
||||
</scrollView>
|
||||
<webView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="46">
|
||||
<rect key="frame" x="0.0" y="0.0" width="768" height="924"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</webView>
|
||||
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fsh-gd-wpz">
|
||||
<rect key="frame" x="0.0" y="924" width="768" height="50"/>
|
||||
<items>
|
||||
<barButtonItem image="chevron.left" catalog="system" id="TLs-g2-xbM">
|
||||
<connections>
|
||||
<action selector="back:" destination="-1" id="QxZ-wD-p3z"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
<barButtonItem width="42" style="plain" systemItem="fixedSpace" id="aOV-hW-Vog"/>
|
||||
<barButtonItem image="chevron.right" catalog="system" id="QUu-pQ-ATm">
|
||||
<connections>
|
||||
<action selector="forward:" destination="-1" id="nek-4k-IZn"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
<barButtonItem systemItem="flexibleSpace" id="5kj-Re-lwh"/>
|
||||
<barButtonItem image="UIAccessoryButtonX.png" id="tui-2v-Hnv">
|
||||
<connections>
|
||||
<action selector="close:" destination="-1" id="Z6P-DT-vrW"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
</items>
|
||||
</toolbar>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<viewLayoutGuide key="safeArea" id="4Nv-Di-iZ0"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="4Nv-Di-iZ0" firstAttribute="bottom" secondItem="fsh-gd-wpz" secondAttribute="bottom" id="DeX-v1-YPt"/>
|
||||
<constraint firstItem="46" firstAttribute="leading" secondItem="1" secondAttribute="leading" id="JKp-EJ-WRW"/>
|
||||
<constraint firstAttribute="trailing" secondItem="46" secondAttribute="trailing" id="S6m-BM-jgq"/>
|
||||
<constraint firstItem="fsh-gd-wpz" firstAttribute="trailing" secondItem="4Nv-Di-iZ0" secondAttribute="trailing" id="Umy-Nq-soY"/>
|
||||
<constraint firstItem="fsh-gd-wpz" firstAttribute="top" secondItem="46" secondAttribute="bottom" id="ask-9d-0a8"/>
|
||||
<constraint firstItem="fsh-gd-wpz" firstAttribute="leading" secondItem="4Nv-Di-iZ0" secondAttribute="leading" id="bQX-03-Vyz"/>
|
||||
<constraint firstItem="46" firstAttribute="top" secondItem="1" secondAttribute="top" id="yQr-5s-ut4"/>
|
||||
</constraints>
|
||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
|
||||
<point key="canvasLocation" x="-166.40625" y="69.7265625"/>
|
||||
</view>
|
||||
</objects>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
<simulatedScreenMetrics key="destination"/>
|
||||
</simulatedMetricsContainer>
|
||||
<resources>
|
||||
<image name="UIAccessoryButtonX.png" width="22" height="22"/>
|
||||
<image name="chevron.left" catalog="system" width="96" height="128"/>
|
||||
<image name="chevron.right" catalog="system" width="96" height="128"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
|
|
|||
|
|
@ -1,40 +1,83 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6254" systemVersion="13F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="InfoViewController">
|
||||
<connections>
|
||||
<outlet property="backButton" destination="ptS-kA-9Tw" id="55r-w8-dlm"/>
|
||||
<outlet property="forwardButton" destination="OvI-rz-OW9" id="WmO-fp-gXG"/>
|
||||
<outlet property="view" destination="1" id="40"/>
|
||||
<outlet property="webView" destination="38" id="41"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view contentMode="scaleToFill" id="1">
|
||||
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="428" height="838"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="4">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="416"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<webView contentMode="scaleToFill" id="38">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="416"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</webView>
|
||||
</subviews>
|
||||
</scrollView>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="q0q-mp-JYD">
|
||||
<rect key="frame" x="0.0" y="804" width="428" height="34"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||
</view>
|
||||
<webView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="38">
|
||||
<rect key="frame" x="0.0" y="0.0" width="428" height="755"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</webView>
|
||||
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DPl-QD-inD">
|
||||
<rect key="frame" x="0.0" y="755" width="428" height="49"/>
|
||||
<items>
|
||||
<barButtonItem image="chevron.left" catalog="system" id="ptS-kA-9Tw">
|
||||
<connections>
|
||||
<action selector="back:" destination="-1" id="2rM-Md-H8q"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
<barButtonItem width="42" style="plain" systemItem="fixedSpace" id="fLB-0C-ctw"/>
|
||||
<barButtonItem image="chevron.right" catalog="system" id="OvI-rz-OW9">
|
||||
<connections>
|
||||
<action selector="forward:" destination="-1" id="bYZ-fr-4LT"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
<barButtonItem systemItem="flexibleSpace" id="pdo-sP-gkn"/>
|
||||
<barButtonItem image="UIAccessoryButtonX.png" id="Etw-CW-3uh">
|
||||
<connections>
|
||||
<action selector="close:" destination="-1" id="Or7-qh-Vf6"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
</items>
|
||||
</toolbar>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<viewLayoutGuide key="safeArea" id="TI6-wh-wgp"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="q0q-mp-JYD" firstAttribute="leading" secondItem="1" secondAttribute="leading" id="DuX-dg-5mP"/>
|
||||
<constraint firstItem="q0q-mp-JYD" firstAttribute="top" secondItem="TI6-wh-wgp" secondAttribute="bottom" id="EGB-3c-vKb"/>
|
||||
<constraint firstItem="q0q-mp-JYD" firstAttribute="bottom" secondItem="1" secondAttribute="bottom" id="L2a-LF-e0z"/>
|
||||
<constraint firstItem="q0q-mp-JYD" firstAttribute="trailing" secondItem="1" secondAttribute="trailing" id="MR2-Kw-FFc"/>
|
||||
<constraint firstItem="DPl-QD-inD" firstAttribute="top" secondItem="38" secondAttribute="bottom" id="N05-AY-Vks"/>
|
||||
<constraint firstItem="DPl-QD-inD" firstAttribute="leading" secondItem="1" secondAttribute="leading" id="Uyx-jL-nrb"/>
|
||||
<constraint firstItem="38" firstAttribute="top" secondItem="TI6-wh-wgp" secondAttribute="top" id="a6J-fg-ykX"/>
|
||||
<constraint firstItem="38" firstAttribute="leading" secondItem="TI6-wh-wgp" secondAttribute="leading" id="k6F-H4-Dgi"/>
|
||||
<constraint firstItem="38" firstAttribute="trailing" secondItem="TI6-wh-wgp" secondAttribute="trailing" id="udC-CP-YSS"/>
|
||||
<constraint firstItem="DPl-QD-inD" firstAttribute="trailing" secondItem="1" secondAttribute="trailing" id="wiY-98-IhB"/>
|
||||
<constraint firstItem="q0q-mp-JYD" firstAttribute="top" secondItem="DPl-QD-inD" secondAttribute="bottom" id="y3E-wq-FHx"/>
|
||||
</constraints>
|
||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
|
||||
<simulatedScreenMetrics key="simulatedDestinationMetrics"/>
|
||||
<point key="canvasLocation" x="-72.89719626168224" y="79.049676025917933"/>
|
||||
</view>
|
||||
</objects>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
<simulatedScreenMetrics key="destination" type="retina4"/>
|
||||
</simulatedMetricsContainer>
|
||||
<resources>
|
||||
<image name="UIAccessoryButtonX.png" width="22" height="22"/>
|
||||
<image name="chevron.left" catalog="system" width="96" height="128"/>
|
||||
<image name="chevron.right" catalog="system" width="96" height="128"/>
|
||||
<systemColor name="systemBackgroundColor">
|
||||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</systemColor>
|
||||
</resources>
|
||||
</document>
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<device id="retina4_0" orientation="portrait" appearance="light"/>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
|
|
|
|||
|
|
@ -126,6 +126,72 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg
|
|||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
private func constructAndAddHostedViews() {
|
||||
self.constructAndAddMainTextView()
|
||||
self.constructAndAddInfoView()
|
||||
self.constructAndAddTextSizeController()
|
||||
resizeViews(withKeyboardVisible: textView.isFirstResponder)
|
||||
}
|
||||
|
||||
private func constructAndAddMainTextView() {
|
||||
// Setup Keyman TextView
|
||||
textSize = 16.0
|
||||
textView = TextView(frame: view.frame)
|
||||
textView.translatesAutoresizingMaskIntoConstraints = false
|
||||
textView.setKeymanDelegate(self)
|
||||
textView.viewController = self
|
||||
textView.backgroundColor = UIColor(named: "InputBackground")!
|
||||
textView.isScrollEnabled = true
|
||||
textView.isUserInteractionEnabled = true
|
||||
textView.font = textView.font?.withSize(textSize)
|
||||
view?.addSubview(textView!)
|
||||
|
||||
textView.topAnchor.constraint (equalTo: view.safeAreaLayoutGuide.topAnchor ).isActive = true
|
||||
textView.leftAnchor.constraint (equalTo: view.safeAreaLayoutGuide.leftAnchor ).isActive = true
|
||||
textView.rightAnchor.constraint (equalTo: view.safeAreaLayoutGuide.rightAnchor ).isActive = true
|
||||
textView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
|
||||
|
||||
if UIDevice.current.userInterfaceIdiom != .phone {
|
||||
textSize *= 2
|
||||
textView.font = textView?.font?.withSize(textSize)
|
||||
}
|
||||
}
|
||||
|
||||
private func constructAndAddInfoView() {
|
||||
// Setup Info View
|
||||
infoView = InfoViewController {
|
||||
self.infoButtonClick(nil)
|
||||
}
|
||||
|
||||
infoView.view?.translatesAutoresizingMaskIntoConstraints = false
|
||||
infoView.view?.isHidden = true
|
||||
infoView.view?.backgroundColor = UIColor(named: "InputBackground")!
|
||||
view?.addSubview(infoView!.view)
|
||||
|
||||
// Don't forget to add the child view's controller, too!
|
||||
// Its safe area layout guide won't work correctly without this!
|
||||
self.addChild(infoView)
|
||||
|
||||
infoView.view?.topAnchor.constraint (equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
|
||||
infoView.view?.leftAnchor.constraint (equalTo: view.leftAnchor ).isActive = true
|
||||
infoView.view?.rightAnchor.constraint (equalTo: view.rightAnchor ).isActive = true
|
||||
infoView.view?.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
||||
}
|
||||
|
||||
private func constructAndAddTextSizeController() {
|
||||
// Setup Text Size Controller
|
||||
textSizeController = UISlider()
|
||||
textSizeController.frame = CGRect.zero
|
||||
textSizeController.minimumValue = 0.0
|
||||
textSizeController.maximumValue = Float(maxTextSize - minTextSize)
|
||||
textSizeController.value = Float(textSize - minTextSize)
|
||||
let textSizeUp = #imageLiteral(resourceName: "textsize_up.png").resize(to: CGSize(width: 20, height: 20))
|
||||
textSizeController.maximumValueImage = textSizeUp
|
||||
let textSizeDown = #imageLiteral(resourceName: "textsize_up.png").resize(to: CGSize(width: 15, height: 15))
|
||||
textSizeController.minimumValueImage = textSizeDown
|
||||
textSizeController.addTarget(self, action: #selector(self.sliderValueChanged), for: .valueChanged)
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
|
|
@ -180,41 +246,7 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg
|
|||
navbarBackground.setOrientation(UIApplication.shared.statusBarOrientation)
|
||||
}
|
||||
|
||||
// Setup Keyman TextView
|
||||
textSize = 16.0
|
||||
textView = TextView(frame: view.frame)
|
||||
textView.setKeymanDelegate(self)
|
||||
textView.viewController = self
|
||||
textView.backgroundColor = UIColor(named: "InputBackground")!
|
||||
textView.isScrollEnabled = true
|
||||
textView.isUserInteractionEnabled = true
|
||||
textView.font = textView.font?.withSize(textSize)
|
||||
view?.addSubview(textView!)
|
||||
|
||||
// Setup Info View
|
||||
infoView = InfoViewController()
|
||||
if UIDevice.current.userInterfaceIdiom != .phone {
|
||||
textSize *= 2
|
||||
textView.font = textView?.font?.withSize(textSize)
|
||||
}
|
||||
|
||||
infoView.view?.isHidden = true
|
||||
infoView.view?.backgroundColor = UIColor(named: "InputBackground")!
|
||||
view?.addSubview(infoView!.view)
|
||||
|
||||
resizeViews(withKeyboardVisible: textView.isFirstResponder)
|
||||
|
||||
// Setup Text Size Controller
|
||||
textSizeController = UISlider()
|
||||
textSizeController.frame = CGRect.zero
|
||||
textSizeController.minimumValue = 0.0
|
||||
textSizeController.maximumValue = Float(maxTextSize - minTextSize)
|
||||
textSizeController.value = Float(textSize - minTextSize)
|
||||
let textSizeUp = #imageLiteral(resourceName: "textsize_up.png").resize(to: CGSize(width: 20, height: 20))
|
||||
textSizeController.maximumValueImage = textSizeUp
|
||||
let textSizeDown = #imageLiteral(resourceName: "textsize_up.png").resize(to: CGSize(width: 15, height: 15))
|
||||
textSizeController.minimumValueImage = textSizeDown
|
||||
textSizeController.addTarget(self, action: #selector(self.sliderValueChanged), for: .valueChanged)
|
||||
self.constructAndAddHostedViews()
|
||||
|
||||
setNavBarButtons()
|
||||
loadSavedUserText()
|
||||
|
|
@ -368,17 +400,23 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg
|
|||
}
|
||||
|
||||
private func resizeViews(withKeyboardVisible keyboardVisible: Bool) {
|
||||
// Resize textView and infoView
|
||||
let mainScreen: CGRect = UIScreen.main.bounds
|
||||
let margin: CGFloat = 2.0
|
||||
let barHeights: CGFloat = AppDelegate.statusBarHeight() + navBarHeight()
|
||||
let kbHeight: CGFloat = keyboardVisible ? textView.inputView?.frame.height ?? 0 : 0
|
||||
let width: CGFloat = mainScreen.size.width
|
||||
let height: CGFloat = mainScreen.size.height - barHeights - kbHeight
|
||||
guard let window = UIApplication.shared.windows.first else {
|
||||
return
|
||||
}
|
||||
|
||||
textView.frame = CGRect(x: margin, y: barHeights + margin,
|
||||
width: width - 2 * margin, height: height - 2 * margin)
|
||||
infoView?.view?.frame = CGRect(x: 0, y: barHeights, width: width, height: height + kbHeight)
|
||||
// As the keyboard isn't naturally part of the safe area, we must
|
||||
// adjust the safe area's size when it appears.
|
||||
let kbHeight: CGFloat = keyboardVisible ? textView.inputView?.frame.height ?? 0 : 0
|
||||
|
||||
let bottomPadding = window.safeAreaInsets.bottom
|
||||
|
||||
var kbdSafeArea = UIEdgeInsets()
|
||||
if keyboardVisible {
|
||||
// The keyboard also contains the safe area when visible, and we only want
|
||||
// to add the _additional_ height.
|
||||
kbdSafeArea.bottom += kbHeight - bottomPadding
|
||||
}
|
||||
self.additionalSafeAreaInsets = kbdSafeArea
|
||||
}
|
||||
|
||||
private func navBarWidth() -> CGFloat {
|
||||
|
|
@ -409,7 +447,13 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg
|
|||
private func keyboardLoaded() {
|
||||
didKeyboardLoad = true
|
||||
dismissActivityIndicator()
|
||||
textView.becomeFirstResponder()
|
||||
|
||||
// Defer display of the keyboard until the current "message" on the main dispatch
|
||||
// queue is complete. There are still ongoing calculations - including within the
|
||||
// keyboard's WebView itself! (This function's call is actually triggered _by_ it!)
|
||||
DispatchQueue.main.async {
|
||||
self.textView.becomeFirstResponder()
|
||||
}
|
||||
if shouldShowGetStarted {
|
||||
perform(#selector(self.showGetStartedView), with: nil, afterDelay: 1.0)
|
||||
}
|
||||
|
|
@ -464,11 +508,10 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg
|
|||
navigationItem.titleView = nil
|
||||
navigationItem.rightBarButtonItem = nil
|
||||
setNavBarButtons()
|
||||
if wasKeyboardVisible {
|
||||
perform(#selector(self.displayKeyboard), with: nil, afterDelay: 0.75)
|
||||
}
|
||||
if shouldShowGetStarted {
|
||||
perform(#selector(self.showGetStartedView), with: nil, afterDelay: 0.75)
|
||||
} else if wasKeyboardVisible {
|
||||
perform(#selector(self.displayKeyboard), with: nil, afterDelay: 0.75)
|
||||
}
|
||||
} else {
|
||||
_ = dismissDropDownMenu()
|
||||
|
|
@ -480,7 +523,8 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg
|
|||
let vAdjPort: CGFloat = UIScreen.main.scale == 2.0 ? -3.6 : -2.6
|
||||
let vAdjLscpe: CGFloat = -1.6
|
||||
|
||||
let infoDoneButton = UIBarButtonItem(title: "Done", style: .plain, target: self,
|
||||
let doneString = NSLocalizedString("command-done", bundle: Bundle(for: Manager.self), comment: "")
|
||||
let infoDoneButton = UIBarButtonItem(title: doneString, style: .plain, target: self,
|
||||
action: #selector(self.infoButtonClick))
|
||||
infoDoneButton.setBackgroundVerticalPositionAdjustment(vAdjPort, for: UIBarMetrics.default)
|
||||
infoDoneButton.setBackgroundVerticalPositionAdjustment(vAdjLscpe, for: UIBarMetrics.compact)
|
||||
|
|
@ -596,7 +640,8 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg
|
|||
let doneButton = UIButton(type: .roundedRect)
|
||||
doneButton.addTarget(self, action: #selector(self.dismissTextSizeVC), for: .touchUpInside)
|
||||
|
||||
doneButton.setTitle("Done", for: .normal)
|
||||
let doneString = NSLocalizedString("command-done", bundle: Bundle(for: Manager.self), comment: "")
|
||||
doneButton.setTitle(doneString, for: .normal)
|
||||
doneButton.titleLabel?.font = doneButton.titleLabel?.font?.withSize(21.0)
|
||||
doneButton.setTitleColor(UIColor(red: 0.0, green: 0.5, blue: 1.0, alpha: 1.0), for: .normal)
|
||||
doneButton.layer.cornerRadius = 4.0
|
||||
|
|
|
|||
|
|
@ -160,6 +160,12 @@
|
|||
29B5BC0628169A6500B86A17 /* ff */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ff; path = ff.lproj/KMKeyboardHelpWindowController.strings; sourceTree = "<group>"; };
|
||||
29B5BC0728169A6600B86A17 /* ff */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ff; path = ff.lproj/MainMenu.strings; sourceTree = "<group>"; };
|
||||
29B5BC0828169A8600B86A17 /* ff */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ff; path = ff.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
29B70A23283CB6680086B580 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/KMAboutWindowController.strings"; sourceTree = "<group>"; };
|
||||
29B70A24283CB6690086B580 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/preferences.strings"; sourceTree = "<group>"; };
|
||||
29B70A25283CB66A0086B580 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/KMInfoWindowController.strings"; sourceTree = "<group>"; };
|
||||
29B70A26283CB66B0086B580 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/KMKeyboardHelpWindowController.strings"; sourceTree = "<group>"; };
|
||||
29B70A27283CB66C0086B580 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/MainMenu.strings"; sourceTree = "<group>"; };
|
||||
29B70A28283CB6900086B580 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
29BFA761282936D4009FCCC3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/KMAboutWindowController.strings; sourceTree = "<group>"; };
|
||||
29BFA762282936D5009FCCC3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/preferences.strings; sourceTree = "<group>"; };
|
||||
29BFA763282936D5009FCCC3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/KMInfoWindowController.strings; sourceTree = "<group>"; };
|
||||
|
|
@ -692,7 +698,8 @@
|
|||
"pt-PT",
|
||||
ff,
|
||||
it,
|
||||
pl
|
||||
pl,
|
||||
"es-419",
|
||||
);
|
||||
mainGroup = 989C9BFF1A7876DE00A20425;
|
||||
productRefGroup = 989C9C091A7876DE00A20425 /* Products */;
|
||||
|
|
@ -930,7 +937,8 @@
|
|||
29C1E1742800227500759EDE /* pt-PT */,
|
||||
29B5BC0328169A6300B86A17 /* ff */,
|
||||
29BFA761282936D4009FCCC3 /* it */,
|
||||
29BFA76D282948BD009FCCC3 /* pl */
|
||||
29BFA76D282948BD009FCCC3 /* pl */,
|
||||
29B70A23283CB6680086B580 /* es-419 */,
|
||||
);
|
||||
name = KMAboutWindowController.xib;
|
||||
sourceTree = "<group>";
|
||||
|
|
@ -946,7 +954,8 @@
|
|||
29C1E1752800227600759EDE /* pt-PT */,
|
||||
29B5BC0428169A6400B86A17 /* ff */,
|
||||
29BFA762282936D5009FCCC3 /* it */,
|
||||
29BFA76E282948BE009FCCC3 /* pl */
|
||||
29BFA76E282948BE009FCCC3 /* pl */,
|
||||
29B70A24283CB6690086B580 /* es-419 */,
|
||||
);
|
||||
name = preferences.xib;
|
||||
path = Keyman4MacIM/KMConfiguration;
|
||||
|
|
@ -962,7 +971,8 @@
|
|||
29C1E179280025A900759EDE /* pt-PT */,
|
||||
29B5BC0828169A8600B86A17 /* ff */,
|
||||
29BFA76628293760009FCCC3 /* it */,
|
||||
29BFA7722829490A009FCCC3 /* pl */
|
||||
29BFA7722829490A009FCCC3 /* pl */,
|
||||
29B70A28283CB6900086B580 /* es-419 */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
|
|
@ -978,7 +988,8 @@
|
|||
29C1E1762800227700759EDE /* pt-PT */,
|
||||
29B5BC0528169A6400B86A17 /* ff */,
|
||||
29BFA763282936D5009FCCC3 /* it */,
|
||||
29BFA76F282948BE009FCCC3 /* pl */
|
||||
29BFA76F282948BE009FCCC3 /* pl */,
|
||||
29B70A25283CB66A0086B580 /* es-419 */,
|
||||
);
|
||||
name = KMInfoWindowController.xib;
|
||||
path = Keyman4MacIM/KMInfoWindow;
|
||||
|
|
@ -995,7 +1006,8 @@
|
|||
29C1E1772800227700759EDE /* pt-PT */,
|
||||
29B5BC0628169A6500B86A17 /* ff */,
|
||||
29BFA764282936D6009FCCC3 /* it */,
|
||||
29BFA770282948BF009FCCC3 /* pl */
|
||||
29BFA770282948BF009FCCC3 /* pl */,
|
||||
29B70A26283CB66B0086B580 /* es-419 */,
|
||||
);
|
||||
name = KMKeyboardHelpWindowController.xib;
|
||||
path = Keyman4MacIM/KMKeyboardHelpWindow;
|
||||
|
|
@ -1012,7 +1024,8 @@
|
|||
29C1E1782800227800759EDE /* pt-PT */,
|
||||
29B5BC0728169A6600B86A17 /* ff */,
|
||||
29BFA765282936D7009FCCC3 /* it */,
|
||||
29BFA771282948C0009FCCC3 /* pl */
|
||||
29BFA771282948C0009FCCC3 /* pl */,
|
||||
29B70A27283CB66C0086B580 /* es-419 */,
|
||||
);
|
||||
name = MainMenu.xib;
|
||||
sourceTree = "<group>";
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
/* button text to close the About window */
|
||||
"Kab-Up-fYH.title" = "Cerrar";
|
||||
|
||||
/* text of link to the license agreement */
|
||||
"hYC-Bx-aoP.title" = "Acuerdo de Licencia";
|
||||
|
||||
/* button text to open Configuration window */
|
||||
"vkh-b5-vO7.title" = "Configuración...";
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/* Checkbox text to always show on-screen keyboard */
|
||||
"4UX-80-0Vo.title" = "Mostrar siempre el teclado en pantalla";
|
||||
|
||||
/* Checkbox text to enable verbose Console logging */
|
||||
"7J6-zy-R20.title" = "Usar registro detallado";
|
||||
|
||||
/* Support button text */
|
||||
"93O-x6-RLF.label" = "Soporte";
|
||||
|
||||
/* Download Keyboard button text */
|
||||
"CTw-kf-WNS.title" = "Descargar teclado...";
|
||||
|
||||
/* Keyman Configuration window title */
|
||||
"F0z-JX-Cv5.title" = "Configuración de Keyman";
|
||||
|
||||
/* button text to go back to previous page */
|
||||
"JOK-JV-n8w.title" = "Atrás";
|
||||
|
||||
/* Keyboards button text */
|
||||
"MPN-9N-wWc.label" = "Teclados";
|
||||
|
||||
/* text to explain verbose Console logging option */
|
||||
"MrI-GM-7d6.title" = "Cuando la opción de registro detallado está activada, Keyman registrará acciones que podrían ayudar a Keyman Support diagnosticar un problema. La aplicación de consola puede ser usada para ver un registro de mensajes de Keyman. En la aplicación de consola, puede filtrar para mostrar todos los mensajes del proceso \"Keyman\". Este registro puede ser exportado y enviado al soporte de Keyman si es necesario.";
|
||||
|
||||
/* button text to move forward to the next page */
|
||||
"eXr-8V-h1g.title" = "Siguiente";
|
||||
|
||||
/* button text to return to the home help page */
|
||||
"fXS-aC-CMH.title" = "Inicio";
|
||||
|
||||
/* Options button text */
|
||||
"frd-No-seV.label" = "Opciones";
|
||||
|
||||
/* Installed Keyboard column heading */
|
||||
"jex-Nd-Qzg.headerCell.title" = "Teclado instalado";
|
||||
|
||||
/* Verbose logging tooltip text */
|
||||
"uWx-3J-U0D.ibShadowedToolTip" = "Active esta opción si tiene problemas con un teclado específico o con Keyman en general.";
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
/* Package Information window title */
|
||||
"F0z-JX-Cv5.title" = "Información del paquete";
|
||||
|
||||
/* button text to show Details */
|
||||
"Fvy-XJ-s38.label" = "Detalles";
|
||||
|
||||
/* button text to show Read Me */
|
||||
"waA-IW-Qyn.label" = "Léame";
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
/* Keyboard Help window title */
|
||||
"F0z-JX-Cv5.title" = "Ayuda para teclado";
|
||||
|
||||
/* OK button text */
|
||||
"Zla-QF-m0K.title" = "Aceptar";
|
||||
|
||||
/* Print button text */
|
||||
"fYY-Uj-y4S.title" = "Imprimir...";
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
/* Message displayed to confirm delete of the Keyman keyboard selected by the user from the keyboard list */
|
||||
"message-confirm-delete-keyboard" = "¿Estás seguro de que deseas eliminar el teclado '%@'?";
|
||||
|
||||
/* Delete keyboard confirmation info indicating that the delete action cannot be undone */
|
||||
"info-cannot-undo-delete-keyboard" = "No puedes deshacer esta acción.";
|
||||
|
||||
/* Button text to cancel delete of the specified installed Keyman keyboard */
|
||||
"button-cancel-delete-keyboard" = "Cancelar";
|
||||
|
||||
/* Button text to confirm delete of the specified installed Keyman keyboard */
|
||||
"button-delete-keyboard" = "Eliminar";
|
||||
|
||||
/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */
|
||||
"message-confirm-install-keyboard" = "¿Instalar teclado de Keyman?";
|
||||
|
||||
/* Message displayed to confirm installation of a keyboard from the specifed .kmp file double-clicked by the user */
|
||||
"info-install-keyboard-filename" = "¿Desea que Keyman instale el teclado desde el archivo '%@'?";
|
||||
|
||||
/* Button text to cancel installation of the double-clicked Keyman file */
|
||||
"button-cancel-install-keyboard" = "Cancelar";
|
||||
|
||||
/* Button text to confirm installation of the double-clicked Keyman file */
|
||||
"button-install-keyboard" = "Instalar";
|
||||
|
||||
/* Message displayed to inform user that .kmp file could not be read/unzipped */
|
||||
"message-keyboard-file-unreadable" = "No se pudo leer el archivo de Keyman '%@'.";
|
||||
|
||||
/* Message displayed in Configuration window when keyboard cannot be loaded */
|
||||
"message-error-loading-keyboard" = "(error al cargar el teclado)";
|
||||
|
||||
/* Message displayed in Configuration window when keyboard metadata cannot be loaded */
|
||||
"message-error-unknown-metadata" = "desconocido";
|
||||
|
||||
/* Button text to acknowledge that .kmp file could not be read */
|
||||
"button-keyboard-file-unreadable" = "Aceptar";
|
||||
|
||||
/* label text to identify Keyman version */
|
||||
"version-label-text" = "Versión: %@";
|
||||
|
||||
/* Status text for keyboard downloading */
|
||||
"message-keyboard-downloading" = "Descargando...";
|
||||
|
||||
/* Status text for keyboard download complete */
|
||||
"message-keyboard-download-complete" = "Descarga finalizada.";
|
||||
|
||||
/* Button text to cancel downloading keyboard */
|
||||
"button-cancel-downloading" = "Cancelar";
|
||||
|
||||
/* Button text keyboard download complete */
|
||||
"button-download-complete" = "Hecho";
|
||||
|
||||
/* keyboards label in the Package Information window */
|
||||
"keyboards-label" = "Teclados:";
|
||||
|
||||
/* fonts label in the Package Information window */
|
||||
"fonts-label" = "Fuentes:";
|
||||
|
||||
/* package version label in the Package Information window */
|
||||
"package-version-label" = "Versión del paquete:";
|
||||
|
||||
/* author label in the Package Information window */
|
||||
"author-label" = "Autor:";
|
||||
|
||||
/* website label in the Package Information window */
|
||||
"website-label" = "Página web:";
|
||||
|
||||
/* copyright label in the Package Information window */
|
||||
"copyright-label" = "Derechos de autor:";
|
||||
14
mac/Keyman4MacIM/Keyman4MacIM/es-419.lproj/MainMenu.strings
Normal file
14
mac/Keyman4MacIM/Keyman4MacIM/es-419.lproj/MainMenu.strings
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/* Configuration window menu text */
|
||||
"P1b-lE-yFw.title" = "Configuración...";
|
||||
|
||||
/* Keyboards menu text */
|
||||
"bQa-j9-nHe.title" = "Teclados";
|
||||
|
||||
/* Keyboards menu text */
|
||||
"goP-aK-3WB.title" = "Teclados";
|
||||
|
||||
/* About menu text */
|
||||
"kb2-ww-RS3.title" = "Acerca de";
|
||||
|
||||
/* On-Screen Keyboard menu text */
|
||||
"s96-JI-YDh.title" = "Teclado en pantalla";
|
||||
1305
package-lock.json
generated
1305
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -11,6 +11,7 @@
|
|||
"scripts": {},
|
||||
"workspaces": [
|
||||
"resources/gosh",
|
||||
"resources/build/version",
|
||||
"developer/js",
|
||||
"developer/server",
|
||||
"common/models/*",
|
||||
|
|
|
|||
|
|
@ -31,10 +31,12 @@ gitbranch=`git branch --show-current`
|
|||
FORCE=0
|
||||
HISTORY_FORCE=
|
||||
|
||||
if [[ "$1" == "-f" ]]; then
|
||||
FORCE=1
|
||||
HISTORY_FORCE=--force
|
||||
shift
|
||||
if [[ $# -gt 0 ]]; then
|
||||
if [[ "$1" == "-f" ]]; then
|
||||
FORCE=1
|
||||
HISTORY_FORCE=--force
|
||||
shift
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $# -gt 0 ]]; then
|
||||
|
|
@ -75,18 +77,23 @@ fi
|
|||
|
||||
# Let's ensure our base is up to date with GitHub to
|
||||
# avoid transient errors
|
||||
echo "increment-version.sh: updating branch $base from GitHub"
|
||||
git pull origin $base
|
||||
|
||||
#
|
||||
# Run the increment + history refresh
|
||||
#
|
||||
|
||||
pushd "$KEYMAN_ROOT/resources/build/version" > /dev/null
|
||||
npm install
|
||||
npm run build:ts
|
||||
popd > /dev/null
|
||||
echo "increment-version.sh: building resources/build/version"
|
||||
pushd "$KEYMAN_ROOT"
|
||||
npm ci
|
||||
|
||||
pushd "$KEYMAN_ROOT" > /dev/null
|
||||
pushd "$KEYMAN_ROOT/resources/build/version"
|
||||
npm run build:ts
|
||||
popd
|
||||
|
||||
echo "increment-version.sh: running resources/build/version"
|
||||
pushd "$KEYMAN_ROOT"
|
||||
ABORT=0
|
||||
node resources/build/version/lib/index.js history version -t "$GITHUB_TOKEN" -b "$base" $HISTORY_FORCE || ABORT=$?
|
||||
|
||||
|
|
@ -112,6 +119,7 @@ popd > /dev/null
|
|||
#
|
||||
|
||||
if [ "$action" == "commit" ]; then
|
||||
echo "increment-version.sh: committing to repository and tagging release version $VERSION_WITH_TAG"
|
||||
VERSION_MD="$KEYMAN_ROOT/VERSION.md"
|
||||
NEWVERSION=`cat $VERSION_MD | tr -d "[:space:]"`
|
||||
|
||||
|
|
@ -122,16 +130,6 @@ if [ "$action" == "commit" ]; then
|
|||
git checkout -b "$branch"
|
||||
git add VERSION.md HISTORY.md
|
||||
|
||||
# Also updates package versions, committing those changes
|
||||
# Uses the 'version' run script defined in the base package.json.
|
||||
npm install
|
||||
|
||||
npm run version -- "$NEWVERSION"
|
||||
|
||||
# Version info will be updated in package.json and all workspace package.json files.
|
||||
git add package.json package-lock.json
|
||||
npm add **/package.json **/package-lock.json
|
||||
|
||||
# Now that all version-related changes are ready and git-added, it's time to commit.
|
||||
git commit -m "$message"
|
||||
git push --tags origin "$branch"
|
||||
|
|
|
|||
667
resources/build/version/package-lock.json
generated
667
resources/build/version/package-lock.json
generated
|
|
@ -1,667 +0,0 @@
|
|||
{
|
||||
"name": "@keymanapp/auto-history-action",
|
||||
"version": "1.1.3",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@actions/core": {
|
||||
"version": "1.2.6",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz",
|
||||
"integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA=="
|
||||
},
|
||||
"@actions/github": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/github/-/github-2.1.0.tgz",
|
||||
"integrity": "sha512-G4ncMlh4pLLAvNgHUYUtpWQ1zPf/VYqmRH9oshxLabdaOOnp7i1hgSgzr2xne2YUaSND3uqemd3YYTIsm2f/KQ==",
|
||||
"requires": {
|
||||
"@actions/http-client": "^1.0.3",
|
||||
"@octokit/graphql": "^4.3.1",
|
||||
"@octokit/rest": "^16.15.0"
|
||||
}
|
||||
},
|
||||
"@actions/http-client": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.8.tgz",
|
||||
"integrity": "sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA==",
|
||||
"requires": {
|
||||
"tunnel": "0.0.6"
|
||||
}
|
||||
},
|
||||
"@octokit/auth-token": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz",
|
||||
"integrity": "sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==",
|
||||
"requires": {
|
||||
"@octokit/types": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/endpoint": {
|
||||
"version": "5.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.2.tgz",
|
||||
"integrity": "sha512-ICDcRA0C2vtTZZGud1nXRrBLXZqFayodXAKZfo3dkdcLNqcHsgaz3YSTupbURusYeucSVRjjG+RTcQhx6HPPcg==",
|
||||
"requires": {
|
||||
"@octokit/types": "^2.0.0",
|
||||
"is-plain-object": "^3.0.0",
|
||||
"universal-user-agent": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/graphql": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.3.1.tgz",
|
||||
"integrity": "sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA==",
|
||||
"requires": {
|
||||
"@octokit/request": "^5.3.0",
|
||||
"@octokit/types": "^2.0.0",
|
||||
"universal-user-agent": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/plugin-paginate-rest": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.1.tgz",
|
||||
"integrity": "sha512-Kf0bnNoOXK9EQLkc3rtXfPnu/bwiiUJ1nH3l7tmXYwdDJ7tk/Od2auFU9b86xxKZunPkV9SO1oeojT707q1l7A==",
|
||||
"requires": {
|
||||
"@octokit/types": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"@octokit/plugin-request-log": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz",
|
||||
"integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw=="
|
||||
},
|
||||
"@octokit/plugin-rest-endpoint-methods": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.2.0.tgz",
|
||||
"integrity": "sha512-/Es7P4roLJls+4JaUUouZ25dqvXdrLJ80vvRoZzzR0EBCTlaU2ESRjXgH50mUpmR1MKPwJS3Ew5iFj3U3Q8UfQ==",
|
||||
"requires": {
|
||||
"@octokit/types": "^2.0.1",
|
||||
"deprecation": "^2.3.1"
|
||||
}
|
||||
},
|
||||
"@octokit/request": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.1.tgz",
|
||||
"integrity": "sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg==",
|
||||
"requires": {
|
||||
"@octokit/endpoint": "^5.5.0",
|
||||
"@octokit/request-error": "^1.0.1",
|
||||
"@octokit/types": "^2.0.0",
|
||||
"deprecation": "^2.0.0",
|
||||
"is-plain-object": "^3.0.0",
|
||||
"node-fetch": "^2.3.0",
|
||||
"once": "^1.4.0",
|
||||
"universal-user-agent": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/request-error": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz",
|
||||
"integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==",
|
||||
"requires": {
|
||||
"@octokit/types": "^2.0.0",
|
||||
"deprecation": "^2.0.0",
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
},
|
||||
"@octokit/rest": {
|
||||
"version": "16.41.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.41.1.tgz",
|
||||
"integrity": "sha512-C97cb2cwxakAxZ+5oIAhmd9a1lqJ48n9TN3ooRuuifRMVQZGJCIFsb7uQV76YjDsB1agjhhDokAOSKq5F2+HYw==",
|
||||
"requires": {
|
||||
"@octokit/auth-token": "^2.4.0",
|
||||
"@octokit/plugin-paginate-rest": "^1.1.1",
|
||||
"@octokit/plugin-request-log": "^1.0.0",
|
||||
"@octokit/plugin-rest-endpoint-methods": "2.2.0",
|
||||
"@octokit/request": "^5.2.0",
|
||||
"@octokit/request-error": "^1.0.2",
|
||||
"atob-lite": "^2.0.0",
|
||||
"before-after-hook": "^2.0.0",
|
||||
"btoa-lite": "^1.0.0",
|
||||
"deprecation": "^2.0.0",
|
||||
"lodash.get": "^4.4.2",
|
||||
"lodash.set": "^4.3.2",
|
||||
"lodash.uniq": "^4.5.0",
|
||||
"octokit-pagination-methods": "^1.1.0",
|
||||
"once": "^1.4.0",
|
||||
"universal-user-agent": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/types": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.1.1.tgz",
|
||||
"integrity": "sha512-89LOYH+d/vsbDX785NOfLxTW88GjNd0lWRz1DVPVsZgg9Yett5O+3MOvwo7iHgvUwbFz0mf/yPIjBkUbs4kxoQ==",
|
||||
"requires": {
|
||||
"@types/node": ">= 8"
|
||||
}
|
||||
},
|
||||
"@types/color-name": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
||||
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "13.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz",
|
||||
"integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ=="
|
||||
},
|
||||
"@types/semver": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.1.0.tgz",
|
||||
"integrity": "sha512-pOKLaubrAEMUItGNpgwl0HMFPrSAFic8oSVIvfu1UwcgGNmNyK9gyhBHKmBnUTwwVvpZfkzUC0GaMgnL6P86uA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@zeit/ncc": {
|
||||
"version": "0.21.0",
|
||||
"resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.21.0.tgz",
|
||||
"integrity": "sha512-RUMdvVK/w78oo+yBjruZltt0kJXYar2un/1bYQ2LuHG7GmFVm+QjxzEmySwREctaJdEnBvlMdUNWd9hXHxEI3g==",
|
||||
"dev": true
|
||||
},
|
||||
"ansi-regex": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
|
||||
},
|
||||
"ansi-styles": {
|
||||
"version": "4.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
|
||||
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
|
||||
"requires": {
|
||||
"@types/color-name": "^1.1.1",
|
||||
"color-convert": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"arg": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz",
|
||||
"integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==",
|
||||
"dev": true
|
||||
},
|
||||
"atob-lite": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz",
|
||||
"integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY="
|
||||
},
|
||||
"before-after-hook": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz",
|
||||
"integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A=="
|
||||
},
|
||||
"btoa-lite": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz",
|
||||
"integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc="
|
||||
},
|
||||
"buffer-from": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
|
||||
"dev": true
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
|
||||
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
|
||||
},
|
||||
"cliui": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
|
||||
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
|
||||
"requires": {
|
||||
"string-width": "^4.2.0",
|
||||
"strip-ansi": "^6.0.0",
|
||||
"wrap-ansi": "^6.2.0"
|
||||
}
|
||||
},
|
||||
"color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"requires": {
|
||||
"color-name": "~1.1.4"
|
||||
}
|
||||
},
|
||||
"color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||
},
|
||||
"cross-spawn": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
|
||||
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
|
||||
"requires": {
|
||||
"nice-try": "^1.0.4",
|
||||
"path-key": "^2.0.1",
|
||||
"semver": "^5.5.0",
|
||||
"shebang-command": "^1.2.0",
|
||||
"which": "^1.2.9"
|
||||
},
|
||||
"dependencies": {
|
||||
"semver": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"decamelize": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
|
||||
},
|
||||
"deprecation": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
|
||||
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
|
||||
},
|
||||
"diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"dev": true
|
||||
},
|
||||
"emoji-regex": {
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
|
||||
},
|
||||
"end-of-stream": {
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
||||
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
|
||||
"requires": {
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
},
|
||||
"execa": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
|
||||
"integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
|
||||
"requires": {
|
||||
"cross-spawn": "^6.0.0",
|
||||
"get-stream": "^4.0.0",
|
||||
"is-stream": "^1.1.0",
|
||||
"npm-run-path": "^2.0.0",
|
||||
"p-finally": "^1.0.0",
|
||||
"signal-exit": "^3.0.0",
|
||||
"strip-eof": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"find-up": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
|
||||
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
|
||||
"requires": {
|
||||
"locate-path": "^5.0.0",
|
||||
"path-exists": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"get-caller-file": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
||||
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
|
||||
},
|
||||
"get-stream": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
|
||||
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
|
||||
"requires": {
|
||||
"pump": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"is-fullwidth-code-point": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
||||
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
|
||||
},
|
||||
"is-plain-object": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz",
|
||||
"integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==",
|
||||
"requires": {
|
||||
"isobject": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"is-stream": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
|
||||
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
|
||||
},
|
||||
"isexe": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
||||
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
|
||||
},
|
||||
"isobject": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz",
|
||||
"integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA=="
|
||||
},
|
||||
"locate-path": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
|
||||
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
|
||||
"requires": {
|
||||
"p-locate": "^4.1.0"
|
||||
}
|
||||
},
|
||||
"lodash.get": {
|
||||
"version": "4.4.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
|
||||
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
|
||||
},
|
||||
"lodash.set": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
|
||||
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
|
||||
},
|
||||
"lodash.uniq": {
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
|
||||
"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
|
||||
},
|
||||
"macos-release": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz",
|
||||
"integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA=="
|
||||
},
|
||||
"make-error": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
|
||||
"integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
|
||||
"dev": true
|
||||
},
|
||||
"nice-try": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
|
||||
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.6.7",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
|
||||
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
|
||||
"requires": {
|
||||
"whatwg-url": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"npm-run-path": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
|
||||
"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
|
||||
"requires": {
|
||||
"path-key": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"octokit-pagination-methods": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz",
|
||||
"integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ=="
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"os-name": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz",
|
||||
"integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==",
|
||||
"requires": {
|
||||
"macos-release": "^2.2.0",
|
||||
"windows-release": "^3.1.0"
|
||||
}
|
||||
},
|
||||
"p-finally": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
|
||||
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
|
||||
},
|
||||
"p-limit": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
|
||||
"integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
|
||||
"requires": {
|
||||
"p-try": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"p-locate": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
|
||||
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
|
||||
"requires": {
|
||||
"p-limit": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"p-try": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
|
||||
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
|
||||
},
|
||||
"path-exists": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
||||
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
|
||||
},
|
||||
"path-key": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
|
||||
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
|
||||
},
|
||||
"pump": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
|
||||
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
|
||||
"requires": {
|
||||
"end-of-stream": "^1.1.0",
|
||||
"once": "^1.3.1"
|
||||
}
|
||||
},
|
||||
"require-directory": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
||||
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
|
||||
},
|
||||
"require-main-filename": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
|
||||
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
|
||||
},
|
||||
"semver": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.1.2.tgz",
|
||||
"integrity": "sha512-BJs9T/H8sEVHbeigqzIEo57Iu/3DG6c4QoqTfbQB3BPA4zgzAomh/Fk9E7QtjWQ8mx2dgA9YCfSF4y9k9bHNpQ==",
|
||||
"dev": true
|
||||
},
|
||||
"set-blocking": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
||||
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
|
||||
},
|
||||
"shebang-command": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
|
||||
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
|
||||
"requires": {
|
||||
"shebang-regex": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"shebang-regex": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
|
||||
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
|
||||
},
|
||||
"signal-exit": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.16",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
|
||||
"integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"source-map": "^0.6.0"
|
||||
}
|
||||
},
|
||||
"string-width": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
|
||||
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
|
||||
"requires": {
|
||||
"emoji-regex": "^8.0.0",
|
||||
"is-fullwidth-code-point": "^3.0.0",
|
||||
"strip-ansi": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
|
||||
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
|
||||
"requires": {
|
||||
"ansi-regex": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"strip-eof": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
|
||||
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
|
||||
},
|
||||
"tr46": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||
"integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "8.6.2",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
|
||||
"integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arg": "^4.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
"yn": "3.1.1"
|
||||
}
|
||||
},
|
||||
"tunnel": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
||||
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.7.5",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz",
|
||||
"integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw=="
|
||||
},
|
||||
"universal-user-agent": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.0.tgz",
|
||||
"integrity": "sha512-eM8knLpev67iBDizr/YtqkJsF3GK8gzDc6st/WKzrTuPtcsOKW/0IdL4cnMBsU69pOx0otavLWBDGTwg+dB0aA==",
|
||||
"requires": {
|
||||
"os-name": "^3.1.0"
|
||||
}
|
||||
},
|
||||
"webidl-conversions": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||
"integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
|
||||
},
|
||||
"whatwg-url": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||
"integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
|
||||
"requires": {
|
||||
"tr46": "~0.0.3",
|
||||
"webidl-conversions": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"which": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
|
||||
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
|
||||
"requires": {
|
||||
"isexe": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"which-module": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
|
||||
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
|
||||
},
|
||||
"windows-release": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz",
|
||||
"integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==",
|
||||
"requires": {
|
||||
"execa": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"wrap-ansi": {
|
||||
"version": "6.2.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
|
||||
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
|
||||
"requires": {
|
||||
"ansi-styles": "^4.0.0",
|
||||
"string-width": "^4.1.0",
|
||||
"strip-ansi": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||
},
|
||||
"y18n": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
|
||||
"integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
|
||||
},
|
||||
"yargs": {
|
||||
"version": "15.4.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
|
||||
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
|
||||
"requires": {
|
||||
"cliui": "^6.0.0",
|
||||
"decamelize": "^1.2.0",
|
||||
"find-up": "^4.1.0",
|
||||
"get-caller-file": "^2.0.1",
|
||||
"require-directory": "^2.1.1",
|
||||
"require-main-filename": "^2.0.0",
|
||||
"set-blocking": "^2.0.0",
|
||||
"string-width": "^4.2.0",
|
||||
"which-module": "^2.0.0",
|
||||
"y18n": "^4.0.0",
|
||||
"yargs-parser": "^18.1.2"
|
||||
}
|
||||
},
|
||||
"yargs-parser": {
|
||||
"version": "18.1.3",
|
||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
|
||||
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
|
||||
"requires": {
|
||||
"camelcase": "^5.0.0",
|
||||
"decamelize": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"yn": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
|
||||
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
"ts-node": "^8.6.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "12"
|
||||
"node": "16"
|
||||
},
|
||||
"files": [
|
||||
"dist",
|
||||
|
|
@ -23,8 +23,7 @@
|
|||
"license": "MIT",
|
||||
"main": "dist/index.js",
|
||||
"name": "@keymanapp/auto-history-action",
|
||||
"private": false,
|
||||
"repository": "https://github.com/keymanapp/auto-history-action",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "npm run clean:dist; npm run build:dist",
|
||||
"build:dist": "ncc build src/index.ts --minify --source-map --v8-cache",
|
||||
|
|
|
|||
|
|
@ -195,7 +195,7 @@ export const fixupHistory = async (
|
|||
try {
|
||||
pulls = await reportHistory(octokit, base, force, true);
|
||||
} catch(e) {
|
||||
logWarning(e);
|
||||
logWarning(String(e));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ const getPullRequestInformation = async (
|
|||
}
|
||||
]
|
||||
}
|
||||
} = response;
|
||||
}: any = response;
|
||||
|
||||
return commit_id;
|
||||
};
|
||||
|
|
@ -47,7 +47,7 @@ const getAssociatedPRInformation = async (
|
|||
{ sha: commit_id }
|
||||
);
|
||||
|
||||
if (response === null || response.repository.commit === null) {
|
||||
if (response === null || (<any>response).repository.commit === null) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
|
|
@ -65,7 +65,7 @@ const getAssociatedPRInformation = async (
|
|||
}
|
||||
}
|
||||
}
|
||||
} = response;
|
||||
}: any = response;
|
||||
|
||||
const node = nodes.find(node => node.state == 'MERGED');
|
||||
return node ? { title: node.title, number: node.number } : undefined;
|
||||
|
|
|
|||
|
|
@ -54,13 +54,15 @@ if(!window['keyman']['ui']['name']) {
|
|||
*/
|
||||
ui.toggleOSK = function()
|
||||
{
|
||||
let osk = keymanweb.osk;
|
||||
keymanweb['focusLastActiveElement']();
|
||||
keymanweb['activatingUI'](true);
|
||||
let osk = keymanweb['osk'];
|
||||
if(osk && osk['show'])
|
||||
{
|
||||
if(osk['isEnabled']()) osk['hide'](); else osk['show'](true);
|
||||
}
|
||||
if(window.event) window.event.returnValue=false;
|
||||
keymanweb['focusLastActiveElement']();
|
||||
keymanweb['activatingUI'](false);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -327,7 +329,7 @@ if(!window['keyman']['ui']['name']) {
|
|||
ui.addButtonOSK();
|
||||
});
|
||||
|
||||
let osk = keymanweb.osk;
|
||||
let osk = keymanweb['osk'];
|
||||
if(!osk) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -393,6 +395,7 @@ if(!window['keyman']['ui']['name']) {
|
|||
*/
|
||||
ui.SelectKeyboardChange = function(e)
|
||||
{
|
||||
keymanweb['activatingUI'](true);
|
||||
if(ui.KeyboardSelector.value != '-')
|
||||
{
|
||||
var i=ui.KeyboardSelector.selectedIndex;
|
||||
|
|
@ -404,6 +407,7 @@ if(!window['keyman']['ui']['name']) {
|
|||
|
||||
//if(osk['show']) osk['show'](osk['isEnabled']()); handled by keyboard change event???
|
||||
keymanweb['focusLastActiveElement']();
|
||||
keymanweb['activatingUI'](false);
|
||||
ui.selecting = true;
|
||||
}
|
||||
|
||||
|
|
@ -477,8 +481,9 @@ if(!window['keyman']['ui']['name']) {
|
|||
else
|
||||
{
|
||||
ui.oskButton.style.display = 'block';
|
||||
if(keymanweb.osk) {
|
||||
ui.oskButtonState(keymanweb.osk['isEnabled']());
|
||||
let osk = keymanweb['osk'];
|
||||
if(osk) {
|
||||
ui.oskButtonState(osk['isEnabled']());
|
||||
} else {
|
||||
ui.oskButtonState(false);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -253,6 +253,9 @@ if(!window['keyman']['ui']['name']) {
|
|||
aNode = ui.createNode('a', null, 'kmw_button_a');
|
||||
aNode.href = '#';
|
||||
aNode.onclick = ui.showOSK;
|
||||
aNode.onmousedown = function() {
|
||||
keymanweb['activatingUI'](true);
|
||||
};
|
||||
aNode.title = ui.ToolBar_Text.ShowOSK;
|
||||
aNode.appendChild(ui.createNode('div', 'kmw_img_osk', 'kmw_img'));
|
||||
//aNode.appendChild(ui.createNode('div', null, 'kmw_a', 'On Screen Keyboard'));
|
||||
|
|
@ -667,6 +670,7 @@ if(!window['keyman']['ui']['name']) {
|
|||
* @return {boolean}
|
||||
**/
|
||||
ui.selectKeyboard = function(event,lang,kbd,updateKeyman:boolean) {
|
||||
keymanweb['activatingUI'](true);
|
||||
if(ui.selectedLanguage) {
|
||||
var found = ui.findListedKeyboard(ui.selectedLanguage);
|
||||
if(found != null) {
|
||||
|
|
@ -694,6 +698,7 @@ if(!window['keyman']['ui']['name']) {
|
|||
// Always save current state when selecting a keyboard
|
||||
ui.saveCookie();
|
||||
ui.enableControls();
|
||||
keymanweb['activatingUI'](false);
|
||||
return ui.hideKeyboardsPopup(event) || ui.hideKeyboardsForLanguage(event);
|
||||
}
|
||||
|
||||
|
|
@ -751,17 +756,18 @@ if(!window['keyman']['ui']['name']) {
|
|||
**/
|
||||
ui.showOSK = function(event)
|
||||
{
|
||||
let osk = keymanweb.osk;
|
||||
|
||||
let osk = keymanweb['osk'];
|
||||
if(!osk) {
|
||||
return;
|
||||
}
|
||||
keymanweb['activatingUI'](true);
|
||||
//Toggle OSK on or off
|
||||
if(osk && keymanweb['getActiveKeyboard']() != '')
|
||||
{
|
||||
if(osk['isEnabled']()) osk['hide'](); else osk['show'](true);
|
||||
}
|
||||
ui.setLastFocus();
|
||||
keymanweb['activatingUI'](false);
|
||||
return ui.eventCapture(event);
|
||||
}
|
||||
|
||||
|
|
@ -914,7 +920,7 @@ if(!window['keyman']['ui']['name']) {
|
|||
}
|
||||
else
|
||||
{
|
||||
let osk = keymanweb.osk;
|
||||
let osk = keymanweb['osk'];
|
||||
ui.oskButtonNode.className = (osk && osk['isEnabled']()) ? 'kmw_button_selected' : 'kmw_button';
|
||||
}
|
||||
}
|
||||
|
|
@ -1013,7 +1019,7 @@ if(!window['keyman']['ui']['name']) {
|
|||
|
||||
|
||||
ui.registerEvents = function() {
|
||||
let osk = keymanweb.osk;
|
||||
let osk = keymanweb['osk'];
|
||||
if(!osk) {
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ namespace com.keyman.osk {
|
|||
protected postKeyboardLoad() {
|
||||
// Initializes the size of a touch keyboard.
|
||||
if(this.vkbd && this.device.touchable) {
|
||||
let targetOSKHeight = this.vkbd.computedAdjustedOskHeight(this.getDefaultKeyboardHeight());
|
||||
let targetOSKHeight = this.getDefaultKeyboardHeight();
|
||||
this.setSize(this.getDefaultWidth(), targetOSKHeight + this.banner.height);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -555,6 +555,11 @@ namespace com.keyman.osk {
|
|||
}
|
||||
}
|
||||
|
||||
['show'](bShow: boolean) {
|
||||
super['show'](bShow);
|
||||
this.saveCookie();
|
||||
}
|
||||
|
||||
/**
|
||||
* Function userPositioned
|
||||
* Scope Public
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ namespace com.keyman.osk {
|
|||
|
||||
if(vkbd.usesFixedHeightScaling) {
|
||||
// Matches its row's height.
|
||||
this.square.style.height = vkbd.layoutHeight.scaledBy(this.row.heightFraction).styleString;
|
||||
this.square.style.height = vkbd.internalHeight.scaledBy(this.row.heightFraction).styleString;
|
||||
} else {
|
||||
this.square.style.height = '100%'; // use the full row height
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,12 @@ namespace com.keyman.osk {
|
|||
public readonly numKey: OSKBaseKey;
|
||||
public readonly scrollKey: OSKBaseKey;
|
||||
|
||||
private _rowHeight: number;
|
||||
|
||||
public get rowHeight(): number {
|
||||
return this._rowHeight;
|
||||
}
|
||||
|
||||
public get id(): string {
|
||||
return this.spec.id;
|
||||
}
|
||||
|
|
@ -22,7 +28,7 @@ namespace com.keyman.osk {
|
|||
layout: keyboards.ActiveLayout,
|
||||
layer: keyboards.ActiveLayer) {
|
||||
this.spec = layer;
|
||||
|
||||
|
||||
const gDiv = this.element = document.createElement('div');
|
||||
const gs=gDiv.style;
|
||||
gDiv.className='kmw-key-layer';
|
||||
|
|
@ -38,7 +44,7 @@ namespace com.keyman.osk {
|
|||
this.nextlayer = gDiv['layer'] = layer['id'];
|
||||
if(typeof layer['nextlayer'] == 'string') {
|
||||
// The gDiv['nextLayer'] is no longer referenced in KMW 15.0+, but is
|
||||
// maintained for partial back-compat in case any site devs actually
|
||||
// maintained for partial back-compat in case any site devs actually
|
||||
// relied on its value from prior versions.
|
||||
//
|
||||
// We won't pay attention to any mutations to the gDiv copy, though.
|
||||
|
|
@ -87,23 +93,23 @@ namespace com.keyman.osk {
|
|||
return null;
|
||||
}
|
||||
|
||||
public refreshLayout(vkbd: VisualKeyboard, paddedHeight: number, trueHeight: number) {
|
||||
public refreshLayout(vkbd: VisualKeyboard, layerHeight: number) {
|
||||
// Check the heights of each row, in case different layers have different row counts.
|
||||
let nRows = this.rows.length;
|
||||
let rowHeight = Math.floor(trueHeight/(nRows == 0 ? 1 : nRows));
|
||||
const nRows = this.rows.length;
|
||||
const rowHeight = this._rowHeight = Math.floor(layerHeight/(nRows == 0 ? 1 : nRows));
|
||||
|
||||
if(vkbd.usesFixedHeightScaling) {
|
||||
this.element.style.height=(paddedHeight)+'px';
|
||||
this.element.style.height=(layerHeight)+'px';
|
||||
}
|
||||
|
||||
for(let nRow=0; nRow<nRows; nRow++) {
|
||||
const oskRow = this.rows[nRow];
|
||||
let bottom = (nRows-nRow-1)*rowHeight+1;
|
||||
const bottom = (nRows-nRow-1)*rowHeight+1;
|
||||
|
||||
if(vkbd.usesFixedHeightScaling) {
|
||||
// Calculate the exact vertical coordinate of the row's center.
|
||||
this.spec.row[nRow].proportionalY = ((paddedHeight - bottom) - rowHeight/2) / paddedHeight;
|
||||
|
||||
this.spec.row[nRow].proportionalY = ((layerHeight - bottom) - rowHeight/2) / layerHeight;
|
||||
|
||||
if(nRow == nRows-1) {
|
||||
oskRow.element.style.bottom = '1px';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ namespace com.keyman.osk {
|
|||
public readonly keys: OSKBaseKey[];
|
||||
public readonly heightFraction: number;
|
||||
|
||||
public constructor(vkbd: VisualKeyboard,
|
||||
public constructor(vkbd: VisualKeyboard,
|
||||
layerSpec: keyboards.ActiveLayer,
|
||||
rowSpec: keyboards.ActiveRow) {
|
||||
const rDiv = this.element = document.createElement('div');
|
||||
|
|
@ -30,7 +30,7 @@ namespace com.keyman.osk {
|
|||
for(let j=0; j<keys.length; j++) {
|
||||
const key = keys[j];
|
||||
var keyObj = new OSKBaseKey(key as OSKKeySpec, layerSpec.id, this);
|
||||
|
||||
|
||||
var element = keyObj.construct(vkbd);
|
||||
this.keys.push(keyObj);
|
||||
|
||||
|
|
@ -55,7 +55,7 @@ namespace com.keyman.osk {
|
|||
public refreshLayout(vkbd: VisualKeyboard) {
|
||||
const rs = this.element.style;
|
||||
|
||||
const rowHeight = vkbd.layoutHeight.scaledBy(this.heightFraction);
|
||||
const rowHeight = vkbd.internalHeight.scaledBy(this.heightFraction);
|
||||
if(vkbd.usesFixedHeightScaling) {
|
||||
rs.maxHeight=rs.lineHeight=rs.height=rowHeight.styleString;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -257,6 +257,15 @@ namespace com.keyman.osk {
|
|||
}
|
||||
}
|
||||
|
||||
get internalHeight(): ParsedLengthStyle {
|
||||
if (this.usesFixedHeightScaling) {
|
||||
// Touch OSKs may apply internal padding to prevent row cropping at the edges.
|
||||
return ParsedLengthStyle.inPixels(this.layoutHeight.val - this.getVerticalLayerGroupPadding());
|
||||
} else {
|
||||
return ParsedLengthStyle.forScalar(1);
|
||||
}
|
||||
}
|
||||
|
||||
get fontSize(): ParsedLengthStyle {
|
||||
if (!this._fontSize) {
|
||||
this._fontSize = new ParsedLengthStyle('1em');
|
||||
|
|
@ -366,7 +375,7 @@ namespace com.keyman.osk {
|
|||
* of alternate keystroke sequences.
|
||||
* @param input The input coordinate of the event that led to use of this function
|
||||
* @param keySpec The spec of the key directly triggered by the input event. May be for a subkey.
|
||||
* @returns
|
||||
* @returns
|
||||
*/
|
||||
getTouchProbabilities(input: InputEventCoordinate, keySpec?: keyboards.ActiveKey): text.KeyDistribution {
|
||||
let keyman = com.keyman.singleton;
|
||||
|
|
@ -1235,9 +1244,9 @@ namespace com.keyman.osk {
|
|||
let b = this.layerGroup.element as HTMLElement;
|
||||
let gs = this.kbdDiv.style;
|
||||
let bs = b.style;
|
||||
if (this.usesFixedHeightScaling) {
|
||||
if (this.usesFixedHeightScaling && this.height) {
|
||||
// Sets the layer group to the correct height.
|
||||
gs.height = gs.maxHeight = paddedHeight + 'px';
|
||||
gs.height = gs.maxHeight = this.height + 'px';
|
||||
}
|
||||
|
||||
// The font-scaling applied on the layer group.
|
||||
|
|
@ -1275,10 +1284,16 @@ namespace com.keyman.osk {
|
|||
|
||||
// Needs the refreshed layout info to work correctly.
|
||||
if(this.currentLayer) {
|
||||
this.currentLayer.refreshLayout(this, paddedHeight, this._computedHeight);
|
||||
this.currentLayer.refreshLayout(this, this._computedHeight - this.getVerticalLayerGroupPadding());
|
||||
}
|
||||
}
|
||||
|
||||
private getVerticalLayerGroupPadding(): number {
|
||||
// For touch-based OSK layouts, kmwosk.css may include top & bottom padding on the layer-group element.
|
||||
const computedGroupStyle = getComputedStyle(this.layerGroup.element);
|
||||
return parseInt(computedGroupStyle.paddingTop, 10) + parseInt(computedGroupStyle.paddingBottom, 10);
|
||||
}
|
||||
|
||||
/*private*/ computedAdjustedOskHeight(allottedHeight: number): number {
|
||||
if (!this.layerGroup) {
|
||||
return allottedHeight;
|
||||
|
|
@ -1620,9 +1635,11 @@ namespace com.keyman.osk {
|
|||
// If popup is visible, need to move over popup, not over main keyboard
|
||||
// Could be turned into a browser-longpress specific implementation within browser.PendingLongpress?
|
||||
if (key1 && key1['subKeys'] != null && this.initTouchCoord) {
|
||||
// Show popup keys immediately if touch moved up towards key array (KMEW-100, Build 353)
|
||||
if ((this.initTouchCoord.y - input.y > 5) && this.pendingSubkey && this.pendingSubkey instanceof browser.PendingLongpress) {
|
||||
this.pendingSubkey.resolve();
|
||||
if(this.pendingSubkey && this.pendingSubkey instanceof browser.PendingLongpress) {
|
||||
// Show popup keys immediately if touch moved up towards key array (KMEW-100, Build 353)
|
||||
if (this.initTouchCoord.y - input.y > this.getLongpressFlickThreshold()) {
|
||||
this.pendingSubkey.resolve();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1635,6 +1652,16 @@ namespace com.keyman.osk {
|
|||
return false;
|
||||
}
|
||||
|
||||
private getLongpressFlickThreshold(): number {
|
||||
const rowHeight = this.currentLayer.rowHeight;
|
||||
|
||||
// If larger than 5 (and it likely is), new threshold = 1/4 the std. key height.
|
||||
const proportionalThreshold = rowHeight / 4;
|
||||
|
||||
// 5 - the longpress-flick triggering threshold before 15.0.
|
||||
return Math.max(proportionalThreshold, 5);
|
||||
}
|
||||
|
||||
optionKey(e: KeyElement, keyName: string, keyDown: boolean) {
|
||||
let keyman = com.keyman.singleton;
|
||||
let oskManager = keyman.osk;
|
||||
|
|
|
|||
|
|
@ -124,18 +124,18 @@ module.exports = function(config) {
|
|||
var specifics = {
|
||||
// BrowserStack configuration options
|
||||
browserStack: {
|
||||
video: false,
|
||||
browserDisconnectTimeout: 3e5,
|
||||
retryLimit: 1, // 0 is ignored.
|
||||
video: true,
|
||||
browserDisconnectTimeout: 6e4, // 1 minute (60s => 60,000ms)
|
||||
retryLimit: 3, // 0 is ignored.
|
||||
startTunnel: true,
|
||||
},
|
||||
|
||||
// Attempts to avoid generating a 'fail' exit code if one of our selected browsers on BrowserStack goes poof.
|
||||
failOnEmptyTestSuite: false,
|
||||
|
||||
captureTimeout: 6e5, // in milliseconds
|
||||
browserNoActivityTimeout: 3e5,
|
||||
browserDisconnectTimeout: 3e5,
|
||||
captureTimeout: 1.2e5, // in milliseconds
|
||||
browserNoActivityTimeout: 6e4,
|
||||
browserDisconnectTimeout: 6e4,
|
||||
browserDisconnectTolerance: 3,
|
||||
|
||||
// Avoids generating a 'fail' exit code if one of our selected browsers on BrowserStack goes poof.
|
||||
|
|
@ -144,7 +144,7 @@ module.exports = function(config) {
|
|||
// test results reporter to use
|
||||
// possible values: 'dots', 'progress'
|
||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||
reporters: ['teamcity'],
|
||||
reporters: ['teamcity', 'BrowserStack'],
|
||||
|
||||
// level of logging
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
|
|
|
|||
|
|
@ -32,13 +32,15 @@ type
|
|||
class function GetFirstLanguage(Keyboard: IKeymanKeyboardInstalled): string; overload;
|
||||
class function GetFirstLanguage(Keyboard: IKeymanKeyboardFile): string; overload;
|
||||
|
||||
/// <summary>Get the BCP47 tag for the user's default language</summary>
|
||||
/// <summary>Get the canonicalized BCP47 tag for the user's default language</summary>
|
||||
class function GetUserDefaultLanguage: string; overload; static;
|
||||
class procedure GetUserDefaultLanguage(var BCP47: string; var LangID: Integer); overload; static;
|
||||
|
||||
/// <summary>Get the -default-lang parameter string for kmshell</summary>
|
||||
/// <summary>Get the canonicalized -default-lang parameter string for kmshell</summary>
|
||||
class function GetUserDefaultLangParameterString: string; static;
|
||||
private
|
||||
// Get the IKeymanKeyboardLanguageInstalled Object corresponding to the BCBP47Tag or **Add** it if not found for the supplied KeyboardID.
|
||||
// Returns Nil if no Keyboard is found with the supplied KeyboardID.
|
||||
class function GetKeyboardLanguage(const KeyboardID,
|
||||
BCP47Tag: string): IKeymanKeyboardLanguageInstalled; static;
|
||||
end;
|
||||
|
|
@ -342,7 +344,7 @@ begin
|
|||
if r.OpenKeyReadOnly('\' + SRegKey_ControlPanelInternationalUserProfile + '\' + key) and
|
||||
r.ValueExists(v) then
|
||||
begin
|
||||
BCP47 := key;
|
||||
BCP47 := (kmcom as IKeymanBCP47Canonicalization).GetCanonicalTag(key);
|
||||
LangID := GetLangIDFromValueName;
|
||||
Break;
|
||||
end;
|
||||
|
|
@ -359,7 +361,7 @@ begin
|
|||
r.ReadMultiString(SRegValue_CPIUP_Languages, tags);
|
||||
if tags.Count > 0 then
|
||||
begin
|
||||
BCP47 := tags[0].Trim;
|
||||
BCP47 := (kmcom as IKeymanBCP47Canonicalization).GetCanonicalTag(tags[0].Trim);
|
||||
if r.OpenKeyReadOnly('\' + SRegKey_ControlPanelInternationalUserProfile + '\' + BCP47) then
|
||||
LangID := GetLangIDFromValueName;
|
||||
end;
|
||||
|
|
|
|||
|
|
@ -305,7 +305,7 @@ begin
|
|||
if not GetKMShellPath(kmshell) then // I3655
|
||||
Exit;
|
||||
|
||||
if not TUtilExecute.WaitForProcess(kmshell+' -i "'+nm+'"', ExtractFilePath(nm)) then // I3475
|
||||
if not TUtilExecute.WaitForProcess('"'+kmshell+'" -i "'+nm+'"', ExtractFilePath(nm)) then // I3475
|
||||
ShowMessage('Failed to install keyboard');
|
||||
end;
|
||||
|
||||
|
|
|
|||
|
|
@ -159,6 +159,7 @@ function TCompilePackage.Compile: Boolean;
|
|||
var
|
||||
buf: array[0..260] of Char;
|
||||
n: Integer;
|
||||
b: Boolean;
|
||||
f: TSearchRec;
|
||||
begin
|
||||
Result := False;
|
||||
|
|
@ -187,10 +188,15 @@ begin
|
|||
FTempPath := buf;
|
||||
|
||||
GetTempFileName(PChar(FTempPath), 'kmn', 0, buf);
|
||||
FTempPath := buf;
|
||||
if FileExists(FTempPath) then DeleteFile(FTempPath);
|
||||
FTempPath := buf + '.dir';
|
||||
b := CreateDir(FTempPath);
|
||||
if not b then
|
||||
begin
|
||||
FatalMessage('Unable to create temp folder '+FTempPath);
|
||||
if FileExists(buf) then DeleteFile(buf);
|
||||
Exit;
|
||||
end;
|
||||
|
||||
CreateDir(FTempPath);
|
||||
try
|
||||
Result := BuildKMP;
|
||||
finally
|
||||
|
|
@ -205,6 +211,7 @@ begin
|
|||
FindClose(f);
|
||||
end;
|
||||
RemoveDirectory(PChar(FTempPath));
|
||||
if FileExists(buf) then DeleteFile(buf);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue