diff --git a/web/source/dom/uiTouchHandlerBase.ts b/web/source/dom/uiTouchHandlerBase.ts
index 78a0e82b10..ed3ac7aaa8 100644
--- a/web/source/dom/uiTouchHandlerBase.ts
+++ b/web/source/dom/uiTouchHandlerBase.ts
@@ -425,7 +425,11 @@ namespace com.keyman.dom {
// Cancel touch if moved up and off keyboard, unless popup keys visible
} else {
let base = this.baseElement;
- let top = (base.offsetParent as HTMLElement).offsetTop + base.offsetTop;
+ let parent = base.parentElement; // parentElement is _Box
+ let top = base.offsetTop;
+ if(parent) {
+ top += parent.offsetTop;
+ }
let height = base.offsetHeight;
let yMin = Math.max(5, top - 0.25 * height);
let yMax = (top + height) + 0.25 * height;
@@ -454,4 +458,4 @@ namespace com.keyman.dom {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/web/source/kmwuibutton.ts b/web/source/kmwuibutton.ts
index aeab80fe38..b395203dc7 100644
--- a/web/source/kmwuibutton.ts
+++ b/web/source/kmwuibutton.ts
@@ -363,7 +363,7 @@ if(!window['keyman']['ui']['name']) {
var _li1 = util['createElement']('li');
_li1.id = 'KMW_ButtonUI_KbdList';
var _a1 = util['createElement']('a');
- _a1.appendChild(document.createTextNode('English'));
+ _a1.appendChild(document.createTextNode('(System keyboard)'));
_a1.onclick = ui._SelectKeyboard;
_a1.href = '#';
diff --git a/web/source/kmwuifloat.ts b/web/source/kmwuifloat.ts
index f5abea7ab1..c98a89cc8a 100644
--- a/web/source/kmwuifloat.ts
+++ b/web/source/kmwuifloat.ts
@@ -126,7 +126,7 @@ if(!window['keyman']['ui']['name']) {
ui.innerDiv.appendChild(ui.KeyboardSelector); //this may need to be moved up....
// Check required interface alignment and default keyboard
- var opt=util['getOption']('ui'),dfltKeyboard='English';
+ var opt=util['getOption']('ui'),dfltKeyboard='(System keyboard)';
if(opt && typeof(opt) == 'object')
{
if(typeof(opt['position']) == 'string' && opt['position'] == 'right')
@@ -237,7 +237,7 @@ if(!window['keyman']['ui']['name']) {
*/
ui.updateMenu = function(kbd,lg)
{
- var i=0,value='English';
+ var i=0;
// This can be called during startup before fully initialized - ignore if so
if(!ui.initialized) return;
diff --git a/web/source/kmwuitoggle.ts b/web/source/kmwuitoggle.ts
index 49214e299e..68a627dd0a 100644
--- a/web/source/kmwuitoggle.ts
+++ b/web/source/kmwuitoggle.ts
@@ -696,7 +696,7 @@ if(!window['keyman']['ui']['name']) {
var _li=util['createElement']('li');
var _a=util['createElement']('a');
- _a.innerHTML='English';
+ _a.innerHTML='(System keyboard)';
_a.href="#";
_a.onclick = function() { return ui.selectKbd(-1); };
_a.id='KMWSel_$';
diff --git a/web/source/osk/oskManager.ts b/web/source/osk/oskManager.ts
index 23b714f632..d0a2d98754 100644
--- a/web/source/osk/oskManager.ts
+++ b/web/source/osk/oskManager.ts
@@ -38,14 +38,17 @@ namespace com.keyman.osk {
// OSK positioning fields
userPositioned: boolean = false;
- width: number;
- height: number;
x: number;
y: number;
noDrag: boolean = false;
dfltX: string;
dfltY: string;
+ // Fields used to store target OSK size when no keyboard has been loaded
+ // If a keyboard has been loaded, the VisualKeyboard values override these.
+ _baseWidth: number;
+ _baseHeight: number;
+
// OSK resizing-event state fields
resizing: boolean;
_VMoveX: number;
@@ -282,6 +285,22 @@ namespace com.keyman.osk {
}
}
+ private get width(): number {
+ if(this.vkbd) {
+ return this.vkbd.width;
+ } else {
+ return this._baseWidth;
+ }
+ }
+
+ private get height(): number {
+ if(this.vkbd) {
+ return this.vkbd.height;
+ } else {
+ return this._baseHeight;
+ }
+ }
+
/**
* Function _GenerateVisualKeyboard
* Scope Private
@@ -587,8 +606,7 @@ namespace com.keyman.osk {
}
var r=this.getRect();
- this.width = r.width;
- this.height = r.height;
+ this.setSize(r.width, r.height, true);
e.cancelBubble = true;
return false;
}.bind(this);
@@ -791,8 +809,7 @@ namespace com.keyman.osk {
}
var r=this.getRect();
- this.width=r.width;
- this.height=r.height;
+ this.setSize(r.width, r.height, true);
this.x = r.left;
this.y = r.top;
e.cancelBubble = true;
@@ -871,14 +888,10 @@ namespace com.keyman.osk {
*
* @return {boolean}
*/
- loadCookie() {
+ loadCookie(): void {
let util = com.keyman.singleton.util;
var c = util.loadCookie('KeymanWeb_OnScreenKeyboard');
- if(typeof(c) == 'undefined' || c == null) {
- this.userPositioned=false;
- return false;
- }
this._Enabled = util.toNumber(c['visible'], 1) == 1;
this.userPositioned = util.toNumber(c['userSet'], 0) == 1;
@@ -924,43 +937,19 @@ namespace com.keyman.osk {
if(this.userPositioned && this._Box) {
this.setPos({'left': this.x, 'top': this.y});
}
-
- return true;
}
- private setSize(width?: number, height?: number) {
+ private setSize(width?: number, height?: number, pending?: boolean) {
if(width && height) {
- this.width = width;
- this.height = height;
+ this._baseWidth = width;
+ this._baseHeight = height;
}
if(this.vkbd) {
- this.vkbd.kbdDiv.style.width=this.width+'px';
- this.vkbd.kbdDiv.style.height=this.height+'px';
- this.vkbd.kbdDiv.style.fontSize=(this.height/8)+'px';
+ this.vkbd.setSize(width, height, pending);
}
}
- getWidthFromCookie(): number {
- let util = com.keyman.singleton.util;
-
- var c = util.loadCookie('KeymanWeb_OnScreenKeyboard');
- if(typeof(c) == 'undefined' || c == null) {
- return screen.width * 0.3;
- }
-
- // Restore OSK size - font size now fixed in relation to OSK height, unless overridden (in em) by keyboard
- var newWidth=util.toNumber(c['width'], 0.3 * screen.width); // Default - 30% of screen's width.
-
- if(newWidth < 0.2*screen.width) {
- newWidth = 0.2*screen.width;
- } else if(newWidth > 0.9*screen.width) {
- newWidth=0.9*screen.width;
- }
-
- return newWidth;
- }
-
/**
* Get the wanted height of the banner (does not include the keyboard)
* @return {number} height in pixels
@@ -1125,7 +1114,7 @@ namespace com.keyman.osk {
w=0.9*screen.width;
}
ds.width=w+'px';
- this.width=w;
+ this.setSize(w, this.height, true);
}
// Set height, but limit to reasonable value
@@ -1141,7 +1130,7 @@ namespace com.keyman.osk {
h=0.5*screen.height;
}
ds.height=h+'px'; ds.fontSize=(h/8)+'px';
- this.height=h;
+ this.setSize(this.width, h, true);
}
// Fix or release user resizing
@@ -1318,9 +1307,8 @@ namespace com.keyman.osk {
}
this._Enabled=true;
this._Visible=true;
- if(this.vkbd && this.vkbd.kbdDiv) {
- this.width=this.vkbd.kbdDiv.offsetWidth;
- this.height=this.vkbd.kbdDiv.offsetHeight;
+ if(this.vkbd) {
+ this.vkbd.refit();
}
this.saveCookie();
@@ -1365,9 +1353,8 @@ namespace com.keyman.osk {
}
// Save current size if visible
- if(this._Box && this._Box.style.display == 'block' && this.vkbd && this.vkbd.kbdDiv) {
- this.width = this.vkbd.kbdDiv.offsetWidth;
- this.height = this.vkbd.kbdDiv.offsetHeight;
+ if(this._Box && this._Box.style.display == 'block' && this.vkbd) {
+ this.vkbd.refit();
}
if(hiddenByUser) {
@@ -1546,4 +1533,4 @@ namespace com.keyman.osk {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/web/source/osk/visualKeyboard.ts b/web/source/osk/visualKeyboard.ts
index 67d376885b..939dcd6065 100644
--- a/web/source/osk/visualKeyboard.ts
+++ b/web/source/osk/visualKeyboard.ts
@@ -133,7 +133,7 @@ namespace com.keyman.osk {
let metrics = OSKKey.getTextMetrics(osk, this.spec.text, style);
let fontSpec = util.getFontSizeStyle(style.fontSize);
- let keyWidth = this.getKeyWidth();
+ let keyWidth = this.getKeyWidth(osk);
const MAX_X_PROPORTION = 0.90;
const MAX_Y_PROPORTION = 0.90;
const X_PADDING = 2;
@@ -169,7 +169,7 @@ namespace com.keyman.osk {
}
}
- getKeyWidth(): number {
+ getKeyWidth(osk: VisualKeyboard): number {
let units = this.objectUnits();
if(units == 'px') {
@@ -178,12 +178,9 @@ namespace com.keyman.osk {
} else if(units == '%') {
// For desktop devices, each key is given a %age of the total OSK width. We'll need to compute an
// approximation for that. `this.kbdDiv` is the element controlling the OSK's width, set in px.
- // ... and since it's null whenever this method would be called during key construction, we simply
- // grab it from the cookie (or its default values) instead.
- let oskWidth = com.keyman.singleton.osk.getWidthFromCookie();
// This is an approximation that tends to be a bit too large, but it's close enough to be useful.
- return Math.floor(oskWidth * this.spec['widthpc'] / 100);
+ return Math.floor(osk.width * this.spec['widthpc'] / 100);
}
}
@@ -608,6 +605,9 @@ namespace com.keyman.osk {
kbdHelpDiv: HTMLDivElement;
styleSheet: HTMLStyleElement;
+ _width: number;
+ _height: number;
+
// Style-related properties
fontFamily: string;
fontSize: string;
@@ -709,6 +709,84 @@ namespace com.keyman.osk {
}
}
+ get width(): number {
+ if(this._width) {
+ return this._width;
+ } else {
+ this.loadSizeFromCookie();
+ return this.width;
+ }
+ }
+
+ get height(): number {
+ if(this._height) {
+ return this._height;
+ } else {
+ this.loadSizeFromCookie();
+ return this.height;
+ }
+ }
+
+ protected loadSizeFromCookie() {
+ let keyman = com.keyman.singleton;
+ let util = keyman.util;
+
+ // If no prior cookie exists, it merely returns an empty object / cookie.
+ var c = util.loadCookie('KeymanWeb_OnScreenKeyboard');
+ var newWidth: number, newHeight: number;
+
+ // Restore OSK size - font size now fixed in relation to OSK height, unless overridden (in em) by keyboard
+ newWidth=util.toNumber(c['width'], 0.333 * screen.width); // Default - 1/3rd of screen's width.
+
+ if(newWidth < 0.2*screen.width) {
+ newWidth = 0.2*screen.width;
+ } else if(newWidth > 0.9*screen.width) {
+ newWidth=0.9*screen.width;
+ }
+
+ // Default height decision made here:
+ // https://github.com/keymanapp/keyman/pull/4279#discussion_r560453929
+ newHeight=util.toNumber(c['height'], 0.333 * newWidth);
+
+ if(newHeight < 0.15*screen.height) {
+ newHeight = 0.15 * screen.height;
+ } else if(newHeight > 0.5*screen.height) {
+ newHeight=0.5*screen.height;
+ }
+
+ this.setSize(newWidth, newHeight);
+ }
+
+ /**
+ * Sets & tracks the size of the VisualKeyboard's primary element.
+ * @param width
+ * @param height
+ * @param pending Set to `true` if called during a resizing interaction
+ */
+ public setSize(width: number, height: number, pending?: boolean) {
+ this._width = width;
+ this._height = height;
+
+ if(!pending && this.kbdDiv) {
+ this.kbdDiv.style.width=this._width+'px';
+ this.kbdDiv.style.height=this._height+'px';
+ this.kbdDiv.style.fontSize=(this._height/8)+'px';
+ }
+ }
+
+ public defaultFontSize(): number {
+ return this.height / 8;
+ }
+
+ /**
+ * Called by OSKManager after resize operations in order to determine the final
+ * size actually used by the visual keyboard.
+ */
+ public refit() {
+ this._width=this.kbdDiv.offsetWidth;
+ this._height=this.kbdDiv.offsetHeight;
+ }
+
/**
* Returns the default properties for a key object, used to construct
* both a base keyboard key and popup keys
@@ -1238,7 +1316,8 @@ namespace com.keyman.osk {
// Cancel touch if moved up and off keyboard, unless popup keys visible
} else {
// _Box has (most of) the useful client values.
- let _Box = this.kbdDiv.offsetParent as HTMLElement; // == osk._Box
+ let keyman = com.keyman.singleton;
+ let _Box = this.kbdDiv.parentElement ? this.kbdDiv.parentElement : keyman.osk._Box;
let height = (this.kbdDiv.firstChild as HTMLElement).offsetHeight; // firstChild == layer-group, has height info.
// We need to adjust the offset properties by any offsets related to the active banner.
@@ -1691,7 +1770,7 @@ namespace com.keyman.osk {
} else if(keyman.getActiveLanguage(true)) {
lgName=keyman.getActiveLanguage(true);
} else {
- lgName='English';
+ lgName='(System keyboard)';
}
try {
@@ -1739,10 +1818,12 @@ namespace com.keyman.osk {
if(usePreview) {
// Previews are not permitted for keys using any of the following CSS styles.
- var excludedClasses = ['kmw-key-shift', // special keys
- 'kmw-key-shift-on', // active special keys (shift, when in shift layer
- 'kmw-spacebar', // space
- 'kmw-key-blank', // Keys that are only used for layout control
+ var excludedClasses = ['kmw-key-shift', // special keys
+ 'kmw-key-shift-on', // active special keys (shift, when in shift layer
+ 'kmw-key-special', // special keys that require the keyboard's OSK font
+ 'kmw-key-special-on', // active special keys requiring the keyboard's OSK font
+ 'kmw-spacebar', // space
+ 'kmw-key-blank', // Keys that are only used for layout control
'kmw-key-hidden'];
for(let c=0; c < excludedClasses.length; c++) {
@@ -1828,7 +1909,7 @@ namespace com.keyman.osk {
let util = keyman.util;
if(this.device.formFactor == 'desktop') {
- let kbdFontSize = this.getFontSizeFromCookie();
+ let kbdFontSize = this.defaultFontSize();
let keySquareScale = 0.8; // Set in kmwosk.css, is relative.
return kbdFontSize * keySquareScale;
} else {
@@ -1852,23 +1933,6 @@ namespace com.keyman.osk {
}
}
- getFontSizeFromCookie(): number {
- let keyman = com.keyman.singleton;
- let util = keyman.util;
-
- var c = util.loadCookie('KeymanWeb_OnScreenKeyboard');
- if(typeof(c) == 'undefined' || c == null) {
- return 16;
- }
-
- var newHeight=util.toNumber(c['height'],0.15*screen.height);
- if(newHeight > 0.5*screen.height) {
- newHeight=0.5*screen.height;
- }
-
- return (newHeight/8);
- }
-
/**
* Set the reference to a special function key for the
* currently visible OSK layer
@@ -2629,14 +2693,14 @@ namespace com.keyman.osk {
let keymanweb = com.keyman.singleton;
let util = keymanweb.util;
- if(typeof(kfd) == 'undefined' && typeof(ofd) == 'undefined') {
- return true;
- }
+ let fontDefined = !!(kfd && kfd['files']);
+ kfd = fontDefined ? kfd : undefined;
- if(typeof(kfd['files']) == 'undefined' && typeof(ofd['files']) == 'undefined') {
- return true;
- }
+ let oskFontDefined = !!(ofd && ofd['files']);
+ ofd = oskFontDefined ? ofd : undefined;
+ // Automatically 'ready' if the descriptor is explicitly `undefined`.
+ // Thus, also covers the case where both are undefined.
var kReady=util.checkFontDescriptor(kfd), oReady=util.checkFontDescriptor(ofd);
if(kReady && oReady) {
return true;
diff --git a/web/testing/unminified - manual.html b/web/testing/unminified - manual.html
index 89975ef118..09e39ca797 100644
--- a/web/testing/unminified - manual.html
+++ b/web/testing/unminified - manual.html
@@ -38,8 +38,10 @@
diff --git a/web/testing/unminified.html b/web/testing/unminified.html
index f83b4ba2cb..0e850a8ce9 100644
--- a/web/testing/unminified.html
+++ b/web/testing/unminified.html
@@ -38,8 +38,10 @@
@@ -48,7 +50,7 @@
-
+
diff --git a/windows/src/desktop/kmshell/locale/de/strings.xml b/windows/src/desktop/kmshell/locale/de/strings.xml
index c831487c5f..bee8aa4ca4 100644
--- a/windows/src/desktop/kmshell/locale/de/strings.xml
+++ b/windows/src/desktop/kmshell/locale/de/strings.xml
@@ -1,309 +1,924 @@
-
+
+
- Bildschirmtastatur schließen
- &Verlassen
- Wenn inaktiv, ausblenden
- &Hilfe
- Sie haben die Bildschirmtastatur geschlossen. Keyman Desktop läuft immer noch. Mit einem Klick auf „Bildschirmtastatur“ in dem Keyman Menü, darfen Sie die Bildschirmtastatur jederzeit wieder öffnen.
- Sind Sie sicher, daß Sie Keyman verlassen wollen? Wenn Sie Ihre Standard-Tastatur benutzen möchten, müssen Sie Keyman nicht verlassen. Mit einem Klick auf „Keyman ausschalten“ in dem Keyman Menü, können Sie Ihre Standard-Tastatur benutzen.
- Die Bildschirmtastatur wird geschlossen
- Keyman Verlassen?
- AltGR mit STRG+Alt simulieren
- Die Bildschirmtastatur wird angezeigt, wenn eine Keyman Tastaturbelegung ausgewählt ist
- Die am geeignetste Ansicht der Bildschirmtastatur wird automatisch gewählt, wenn eine Tastaturbelegung aktiviert wird
- Der Keyman wird wöchentlich automatisch aktualisiert, wenn es Updates gibt
- Fehlersuchen einschalten
- Fortgeschritten
- Üblich
- Bildschirmtastatur
- Start
- Die Tastenkürzel schalten Tastaturbelegungen und Einstellungen ein UND aus
- Umschalt/Strg/Alt/AltGr wird in die Bildschirmtastatur losgelassen, wenn eine Taste geklickt wird
- Benutzer Berechtigungen werden immer in Windows Vista erhöht
- Tipps aktivieren
- Den Startbildschirm anzeigen
- Der Willkommenschirm anzeigen
- Mit Windows starten
- Die Windows Tastaturbelegung wird getauscht, wenn eine Keyman Tastaturbelegung ausgewählt ist
- Als Keyman startet, wird Windows auf widersprüchliche Anwendungen geprüft
- Die Unicode ergänzender Zeichen-Display einschalten (Neustart erforderlich)
- In Windows "unbekannte Sprache" einschalten
- &Bildschirmtastatur
- Hilfe öffnen
- Keyman Konfiguration öffnen
- Drucken...
- Beta Version!
- Abbrechen
- Nach Updates suchen...
- Schließen
- Diagnostik
- Tastaturbelegung herunterladen...
- Tastaturbelegung installieren...
- Einstellungen
- OK
- Tavultesoft Kundenbetreuung...
- Tastaturbelegungspaket Einstellungen
- Proxy-Einstellungen
- Tips zurücksetzen
- Sprache der Oberfläche...
- Urheber:
-
- Urheberrecht:
- Beschreibung:
- Enkodierungen:
- Dateinamen:
- Schriften:
- Erste Schritte
- Hilfe
- Anwendung für:
- Tastaturbelegungen:
- Art von Tastaturbelegung:
- Meldungen:
- Bildschirmtastatur:
- Tastaturbelegungspaket:
- Version:
- Webseite:
- Keyman Konfiguration
- Nur herunterladen, nicht installieren
- Tastaturbelegung von Tavultesoft herunterladen
- Hilfe für
- Tastaturbelegungshilfe
- Hilfe
- Erste Schritte
- Keyman Hilfe
- Die
- Tastaturbelegung aktivieren
- Die
- Sprache aktivieren
- keines
- Keyman Konfiguration öffnen
- Keyman Menü öffnen
- Die Bildschirmtastatur zeigen
- Keyman ausschalten
- Tastenkürzel
- K
- alle Benutzer
- aktueller Benutzer
- Installieren
- Für alle Benutzer installieren
- Details
- Lies mich
- Tastaturbelegung(en) installieren
- Tastaturbelegung
- T
- Keine Tastaturbelegungen sind installiert worden. Klicken Sie auf 'Tastaturbelegung herunterladen', um eine Tastaturbelegung von der Tavultesoft Website zu installieren.
- Wollen Sie, daß diese Aufgaben jetzt vom Keyman Desktop fertiggestellt werden?
- Keyman Desktop hat folgende Einstellungen gefunden, die vervollständigt werden sollen, um
- Skript(e), um auf Ihrem Computer korrekt zu funktionieren
- Weitere Informationen...
- Sprach-Einstellungshinweise
- Microsoft Office-Sprachunterstützung
- Nicht erneut fragen
- Sprache-Konfigurationsaufgaben
- Konfigurieren Sie Ihren Computer für
-
- Installierte Sprache
- Keyman Tastaturbelegung
- (Windows-Tastaturbelegung benutzen)
- Windows-Tastaturbelegung
- Gedächtnishilfe (mnemotechnische Tastatur)
- Feste Position (unveränderliche Tastatur)
- Tastenkürzel verändern...
- Die Spracheinstellungen (auf Kompabilität mit Keyman-Tastaturbelegungen) überprüfen
- Diagnostik
- Bildschirmtastatur installieren
- Tastenkürzel setzen...
- Tastaturbelegungshilfe
- Deinstallieren
- Bildschirmtastatur deinstallieren
- Tastaturbelegungspaket deinstallieren
- Nein
- installierte
- nicht installierte
- Einstellungen
- E
- Paßwort:
- Port:
- Server:
- Proxy-Server-Konfiguration
- Benutzername:
- Keyman
- Keyman
- Unterstützung
- U
- Copyright 1994-2009 Tavultesoft Pty Ltd. Alle Rechte vorbehalten.
- Systemversion
- Version
- Abbrechen
- Jetzt installieren
- Komponenten-Updates
- Dürfen Sie die neue Version herunterladen:
- Möchten Sie jetzt die Webseite besuchen?
- Möchten Sie jetzt den Patch herunterladen und installieren?
- Es gibt Updates für Keyman
- Wählen Sie die Updates, die Sie installieren möchten:
- Alte Version
- Größe
- Keyman Komponenten-Updates Verfügbar
- Keyman Konfiguration
- %Name; Hilfe
- Klicken Sie auf die Schaltflächen unten, um weitere Unterlagen oder die Bildschirmtastatur anzuzeigen.
- Diese Tastaturbelegung hat keine Erste Schritte oder andere Hilfe. Bitte sehen Sie das Startmenü nach, oder wenden Sie Sich an den Entwickler der Tastaturbelegung, um weitere Informationen über die Verwendung dieser Tastaturbelegung zu bekommen.
- Keine Tastaturbelegungen sind gegenwärtig in Keyman aktiviert. Klicken Sie auf eine der Icons im Toolbar oben, um eine Tastaturbelegung auszuwählen.
- Keine Tastaturbelegungen sind zurzeit installiert oder geladen worden. Benutzen Sie Keyman Konfiguration, um eine Tastaturbelegung zu installieren.
- Bildschirmtastatur
- Erste Schritte
- Tastaturbelegungshilfe
- Ja
- Als Webseite speichern...
- Toolbar der Bildschirmtastatur anzeigen
- Segoe UI
- 9
- Wollen Sie $(SKShortApplicationTitle) jetzt online mit der Zulassungsnummer %0:s aktivieren? Wenn Sie auf Nein klicken, können Sie von alternativen Methoden aktivieren.
- Ihre Lizenz wurde erfolgreich aktiviert.
- Für Ihre Sprache(n) wird Microsoft Windows richtig konfiguriert.
- Codepage
- Keyman
- Abbrechen
- Tastenkürzel löschen
- &Herunterladen
- Hilfe
- Nein
- OK
- &Ausdrucken...
- Mehreren Sprachen online suchen...
- Ja
- Keyman Desktop konnte nicht gestartet werden. Bevor Sie fortfahren, überprüfen Sie bitte Ihre Sicherheitseinstellungen, um zu wissen, ob das Programm keyman.exe erlaubt wird. Der erhaltenen Fehler war: %0:s. Wollen Sie versuchen, Keyman Desktop nun wieder zu starten?
- Tastenkürzel verändern
- Die Hilfedatei $(SKOnlineHelpFile) wurde nicht gefunden.
- Die Tastaturbelegung konnte nicht erfolgreich ausgedruckt werden. Bitte speichern Sie sie zu einer Website und manuell ausdrucken.
- <Die Tastaturbelegung wird beschädigt>
- Die Informationen des Keyman Fehlersuchens werden auf dem Desktop in eine Textdatei gespeichert werden, die keymanlog\system.log heißt. Bevor Sie die Textdatei öffnen oder löschen, sollen Sie Keyman verlassen. ACHTUNG: Die Textdatei kann sehr schnell groß wachsen. Wenn Fehlersuchen aktiviert ist, wird Ihr System langsamer sein. Aus diesem Grund, sollten Sie es nur auf Anraten von der Tavultesoft Kundenbetreuung benutzen. DATENSCHUTZ WARNUNG: Bitte beachten Sie, dass die Textdatei des Fehlersuchens alle Ihre Tastatureingaben speichert. Sie sollten diese Option nur anschalten während eines Fehlersuchens oder Diagnosetest, und die Textdatei loschen so bald wie möglich.
- en
- Sprache der Benutzerschnittstelle ändern
- Herunterladen von Dateien
- Aktiviert werden kann der Browser oder email-Programm für dieser URL nicht.
- Alle Tips sind zurückgesetzt worden und werden wieder angezeigt werden.
- Das Tastenkürzel %0:s steht im Widerspruch zu dem ausgewählten Tastenkürzel für die %1:s Tastaturbelegung. Wenn Sie forfahren wird das Tastenkürzel für Keyboard %1:s wird gelösch. Forfahren?
- Sie können Tastaturbelegungen nur als Administrator installieren oder deinstallieren. Benutzen Sie Die Systemsteuerung, um Sprachen für einen normalen Benutzer auszuwählen.
- Eine Tastaturbelegung mit dem Name '%0:s' wurde bereits installiert. Wenn Sie fortfahren würde, wird sie deinstalliert werden, bevor die neue Tastaturbelegung installiert wird. Fortfahren?
- Die Tastaturbelegung '%0:s' ist von dem Tastaturbelegungspaket '%1:s'. Sie müssen die ganzen Tastaturbelegungspaket deinstallieren. Fortfahren?
- %0:s Bearbeitungsunterstützung zu %1:s fügen.
- Microsoft Office 2000
- Microsoft Office 2003
- Microsoft Office 2007
- Microsoft Office XP
- Die Sprache %0:s installieren und mit der Keyman Tastaturbelegung %1:s verknüpfen
- Die Sprache %0:s mit der Keyman Tastaturbelegung %1:s verknüpfen
- deu
- Keine Tastaturbelegungen werden installiert. Bitte öffnen Sie „Konfiguration“, um eine Tastaturbelegung für Ihre Sprache zu installieren.
- KeymanDesktop.chm
- Dieses Betriebssystem ist nicht unterstützt. Für weitere Informationen, wenden Sie Sich bitte an Tavultesoft.
- Ein Tastaturbelegungspaket mit dem Name %0:s wurde bereits installiert. Möchten Sie es deinstallieren, um das neue Tastaturbelegungspaket zu installieren?
- Diese(s) Tastaturbelegungspaket(spaket) '%0:s' hat keine Tastaturbelegungshilfe.
- Es können nicht alle Tastaturen in diesem Packet installiert werden. Sie können maximal %0:d zusätzliche Tastaturen installieren. Bitte wählen Sie aus diesem Packet die Tastaturen, die Sie installieren möchten.
- Wählen Sie Ihre Tastaturbelegungen
- Tastenkürzel setzen
- Das Tastenkürzel der %0:s Tastaturbelegung setzen
- Das Tastenkürzel der %0:s Sprache setzen
- Keyman
- Version %0:s
- Änderung der Surrogates Einstellungen erfordert ein Computer-Neustart. Möchten Sie Windows jetzt neu starten?
- Wählen Sie die Sprache Ihrer Benutzerschnittstelle.
- Deutsch
- Deutsch (German)
- Die Zeichentabelle hat eine Datenbank von Zeichen, die aufgebaut werden muss, bevor man sie benutzen kann. Jetzt aufbauen?
- Die Unicode Zeichen-Datenbank konnte nicht aufgebaut werden und wurde deaktiviert. Der Fehler ist: %0:s
- Die Unicode Zeichen-Datenbank konnte nicht gelöscht werden für einen Wiederaufbau. Der Fehler ist: %0:s
- Die Unicode Zeichen-Datenbank wurde nicht erfolgreich geladen (%0:s). Jetzt wiederaufbauen?
- Unicode
- Sind Sie sicher, daß Sie die Tastaturbelegung %0:s deinstallieren wollen?
- Sind Sie sicher, daß Sie die Bildschirmtastatur für %0:s deinstallieren wollen?
- Sind Sie sicher, daß Sie das Tastaturbelegungspaket %0:s deinstallieren wollen?
- Sie könnten die '%0:s' Tastaturbelegung deinstallieren, nur wenn Sie ein Administrator seien.
- Das Tastenkürzel %0:s steht im Widerspruch zu den Standardtasten. Sie sollten zumindest STRG- oder ALT-Taste benutzen. Möchten dies nun ändern?
- Keyman %0:s
- Die %0:s Tastaturbelegung %1:s
- Die Tavultesoft Webseite ist nicht erreichbar - bitte testen Sie Ihre Internet-Verbindung, und versuchen Sie es erneut.
- Die Tavultesoft Webseite ist nicht erreichbar - bitte testen Sie Ihre Internet-Verbindung, und versuchen Sie es erneut. Der erhaltenen Fehler war: %0:s
- Keyman ausschalten
- Zeichentabelle anzeigen
- Schrift-Helfer anzeigen
- Tastaturbelegungshilfe anzeigen
- Bildschirmtastatur anzeigen
- Keyman
- Apply
- Remind me Later
- Click this icon to select a keyboard
- Keyman is still running. Click this icon to use your language keyboard at any time
- Keep in Touch
- T
- Keyboard version:
- Languages:
- ✕
- Add language
- Custom
- Documentation:
- Installed
- Not installed
- Keyboard options
- Treat hardware deadkeys as plain keys
- Select keyboard layout for all applications
- Base Keyboard...
- Show Keyboard Usage Pane
- Show Font Helper Pane
- Show Character Map Pane
- Open Text Editor
- Open Language Switcher
- General Hotkeys
- Keyboard Layouts
- Upgrade now!
- Send Support Request
- Contact Keyman Support
- If you have any issues using Keyman, just ask a question on the Keyman Community Forum.
- Open Keyman Community Forum
- Useful Links
- Set Base Keyboard
- Select the base Latin script
-keyboard that you use in Windows. Keyman keyboards will adapt automatically to your preferred layout.
- Keyman updates are available
- Click this icon to download and install updates
- View and &install Keyman updates
- E&xit online update check
- Keyman
- Start Keyman
- Exit
- Other tasks
- Configuration
- Show this screen at startup
- Hide this screen at startup
- Display in
- Find other display languages online...
- Help translate the user interface...
- Create a new translation online
- Don't show this hint again
- The following fonts will also be uninstalled: %0:s.
- Microsoft Office 2010
- Please wait while Keyman finds the fonts that will work with
- keyboard.
-
- is not a Unicode keyboard. Fonts cannot be automatically located. Please check the keyboard documentation for font information.
- The following fonts work with
- keyboard:
- The following fonts may also work:
- The following fonts may work with
- keyboard:
- No fonts were found on your system that work with
- . Please check the documentation to find fonts for this keyboard.
- No keyboard layouts are currently installed or loaded. Use Keyman Configuration to install a keyboard layout.
- Please choose a Keyman keyboard to find the fonts that will work with it.
- Hint:
- Resize the On Screen Keyboard by clicking and dragging on the window border
- Move the On Screen Keyboard by clicking and dragging on the "Keyman" title
- Insert any Unicode character into your document with the
- Character Map Tool
- Find out which fonts will work with your language with the
- Font Helper Tool
- Get more help on the keyboard by clicking the
- Keyboard Usage button
+
+
+
+ Keyman
+
+
+
+ Segoe UI
+
+
+
+ 9
+
+
+
+ &Ja
+
+
+
+ &Nein
+
+
+
+ Ok
+
+
+
+ Abbrechen
+
+
+
+ Schließen
+
+
+
+ Ok
+
+
+
+ Abbrechen
+
+
+
+ Klicken Sie auf dieses Symbol, um eine Tastatur auszuwählen
+
+
+
+ Keyman läuft noch. Klicken Sie auf dieses Symbol, um die Tastatur für Ihre Sprache jederzeit zu verwenden
+
+
+
+ Keyman-Einstellungen
+
+
+
+ Hilfe
+
+
+
+ Tastatur-Layouts
+
+
+
+ T
+
+
+
+ Einstellungen
+
+
+
+ E
+
+
+
+ Tastenkürzel
+
+
+
+ K
+
+
+
+ Support
+
+
+
+ S
+
+
+
+ In Kontakt bleiben
+
+
+
+ I
+
+
+
+ Dateinamen:
+
+
+
+ Paketversion:
+
+
+
+ Tastaturversion:
+
+
+
+ Autor:
+
+
+
+ Webseite:
+
+
+
+ Paket:
+
+
+
+ Schriftarten:
+
+
+
+ Tastatur-Layouts:
+
+
+
+ Tastaturbelegung:
+
+
+
+ Tastatursprache:
+
+
+
+ Kodierungen:
+
+
+
+ Art von Tastatur:
+
+
+
+ Feste Position (unveränderliche Tastatur)
+
+
+
+ Mnemonisch (entsprechend der Windows-Tastatur)
+
+
+
+ Sprachen:
+
+
+
+ ✕
+
+
+
+ Sprache hinzufügen
+
+
+
+ Bildschirmtastatur:
+
+
+
+ Benutzerdefiniert
+
+
+
+ Installiert
+
+
+
+ Nicht installiert
+
+
+
+ Dokumentation:
+
+
+
+ Installiert
+
+
+
+ Nicht installiert
+
+
+
+ Meldungen:
+
+
+
+ Copyright:
+
+
+
+ Änderungen werden sofort vorgenommen
+
+
+
+ Tastatur installieren...
+
+
+
+ Tastatur herunterladen...
+
+
+
+ Tastaturoptionen
+
+
+
+ Es sind keine Tastaturen installiert. Klicken Sie auf \'Tastatur herunterladen\', um eine Tastatur von der Keyman-Website zu installieren.
+
+
+
+
+ Sie können die \'%0:s\'-Tastatur nur deinstallieren, wenn Sie ein Administrator sind
+
+
+
+ Tastatur teilen
+
+
+
+ Scannen Sie diesen Code, um diese Tastatur auf einem anderen Gerät zu laden oder
+
+
+
+ online zu teilen
+
+
+
+
+
+
+
+ Allgemein
+
+
+
+ Start
+
+
+
+ Bildschirmtastatur
+
+
+
+ Erweitert
+
+
+
+ Die Tastenkürzel schalten Tastaturen ein UND aus
+
+
+
+ AltGr mit Strg+Alt simulieren
+
+
+
+ Hardware-Deadkeys wie normale Tasten behandeln
+
+
+
+ Hinweise aktivieren
+
+
+
+ Fehler automatisch an keyman.com melden
+
+
+
+ Anonyme Nutzungsstatistiken mit keyman.com teilen
+
+
+
+ Mit Windows starten
+
+
+
+ Den Startbildschirm anzeigen
+
+
+
+ Willkommensbildschirm anzeigen
+
+
+
+ keyman.com wöchentlich auf Updates überprüfen
+
+
+
+ Beim Start von Keyman nach inkompatiblen Anwendungen suchen
+
+
+
+ Umschalt/Strg/Alt auf der Bildschirmtastatur freigeben, nachdem eine Taste geklickt wurde
+
+
+
+ Bildschirmtastatur immer anzeigen wenn eine Keyman-Tastatur ausgewählt ist
+
+
+
+ Bildschirmtastatur bzw. Hilfe automatisch anzeigen, wenn eine Tastatur ausgewählt wird
+
+
+
+ Die Unicode ergänzender Zeichen-Display einschalten (Neustart erforderlich)
+
+
+
+ In Windows \"unbekannte Sprache\" einschalten
+
+
+
+ Fehlersuchen einschalten
+
+
+
+ Windows-Tastatur automatisch wechseln, wenn eine Keyman-Tastatur ausgewählt wird
+
+
+
+ Tastaturlayout für alle Anwendungen auswählen
+
+
+
+ Benutzer Berechtigungen werden immer in Windows Vista erhöht
+
+
+
+ Basis-Tastatur...
+
+
+
+
+
+
+
+
+
+
+
+
+ (keine)
+
+
+
+ Keyman ausschalten
+
+
+
+ Keyman Menü öffnen
+
+
+
+ Bildschirmtastatur anzeigen
+
+
+
+ Keyman Konfiguration öffnen
+
+
+
+ Tastatur-Benutzungshilfe anzeigen
+
+
+
+ Schriftart-Hilfe anzeigen
+
+
+
+ Zeichentabelle anzeigen
+
+
+
+ Texteditor öffnen
+
+
+
+ Sprachumschaltung öffnen
+
+
+
+ Allgemeine Tastenkürzel
+
+
+
+ Tastaturlayouts
+
+
+
+ Wenn Sie Probleme mit Keyman haben, stellen Sie einfach eine Frage im Keyman Community Forum.
+
+
+
+ Keyman Community Forum öffnen
+
+
+
+ Erstellt von SIL International
+
+
+
+ Copyright 1994-2009 Tavultesoft Pty Ltd. Alle Rechte vorbehalten.
+
+
+
+ Version
+
+
+
+ Nützliche Links
+
+
+
+ Tavultesoft Kundenbetreuung...
+
+
+
+ Nach Updates suchen...
+
+
+
+ Proxy-Einstellungen
+
+
+
+ Keyman Systemeinstellungen...
+
+
+
+ Diagnostik
+
+
+
+ Tastatur von keyman.com herunterladen
+
+
+
+ Nicht installieren, nur herunterladen
+
+
+
+
+ Kann Tastatur nicht herunterladen. Fehler %1:d: %0:s
+
+
+
+ < Zurück
+
+
+
+ Tastatur/Paket installieren
+
+
+
+ Details
+
+
+
+ Liesmich
+
+
+
+ Installieren
+
+
+
+ Proxy-Server-Konfiguration
+
+
+
+ Server:
+
+
+
+ Port:
+
+
+
+ Benutzername:
+
+
+
+ Passwort:
+
+
+
+ Basis-Tastatur festlegen
+
+
+
+ Wählen Sie die Tastatur mit lateinischer Schrift, die Sie in Windows verwenden. Keyman-Tastaturen werden automatisch an Ihr bevorzugtes Tastaturlayout angepasst.
+
+
+
+ Tastenkürzel ändern
+
+
+
+
+ Standard-Tastenkürzel selektieren, oder \'Benutzerdefiniert\' auswählen und Strg, Umschalt- und/oder Alt- sowie gewünschte Taste für die Sprache %0:s drücken:
+
+
+
+ Standard-Tastenkürzel selektieren, oder \'Benutzerdefiniert\' auswählen und Strg, Umschalt- und/oder Alt- sowie Taste für das gewünschte Tastaturkürzel drücken:
+
+
+
+
+ Das Tastenkürzel %0:s steht im Konflikt mit der normalen Tastatur. Sie sollten mindestens Strg oder Alt verwenden. Möchten Sie dies jetzt ändern?
+
+
+
+
+ Das Tastenkürzel %0:s steht im Konflikt zu dem ausgewählten Tastenkürzel für die %1:s-Tastatur. Wenn Sie fortfahren wird das Tastenkürzel für %1:s gelöscht. Fortfahren?
+
+
+
+
+ Das Tastenkürzel %0:s steht in Konflikt mit einem anderen Tastenkürzel. Wenn Sie fortfahren, wird das andere Tastenkürzel gelöscht. Fortfahren?
+
+
+
+ Aktualisierte Keyman Komponenten verfügbar
+
+
+
+ Es gibt Updates für Keyman
+
+
+
+ Wählen Sie die Updates, die Sie installieren möchten:
+
+
+
+ Sie können die neue Version herunterladen von:
+
+
+
+ Jetzt installieren
+
+
+
+ Abbrechen
+
+
+
+ Alte Version
+
+
+
+ Aktualisierte Komponente
+
+
+
+ Größe
+
+
+
+
+ Keyman %0:s
+
+
+
+
+ %0:s-Tastatur %1:s
+
+
+
+ Die keyman.com-Webseite ist nicht erreichbar - bitte testen Sie Ihre Internet-Verbindung, und versuchen Sie es erneut.
+
+
+
+
+ Die keyman.com-Webseite ist nicht erreichbar - bitte testen Sie Ihre Internet-Verbindung, und versuchen Sie es erneut. Der Fehler war: %0:s
+
+
+
+ Keyman Updates sind verfügbar
+
+
+
+ Klicken Sie auf dieses Symbol um Updates herunterzuladen und zu installieren
+
+
+
+ Keyman Updates anzeigen und &installieren
+
+
+
+ Update-Überprüfung &beenden
+
+
+
+ Keyman
+
+
+
+ Keyman starten
+
+
+
+ Beenden
+
+
+
+ Konfiguration
+
+
+
+ Diesen Bildschirm beim Start anzeigen
+
+
+
+ Anzeigen in
+
+
+
+ Weitere Anzeigesprachen online finden...
+
+
+
+ Helfen Sie mit, die Benutzeroberfläche zu übersetzen...
+
+
+
+ Deutsch
+
+
+
+ Deutsch (German)
+
+
+
+ de
+
+
+
+ en
+
+
+
+ Keyman
+
+
+
+ Hinweise zurücksetzen
+
+
+
+ Alle Hinweise wurden zurückgesetzt und werden erneut angezeigt.
+
+
+
+
+ Keyman verlassen?
+
+
+
+
+ Sind Sie sicher, dass Sie Keyman verlassen möchten? Ihre Keyman-Tastaturen werden weiterhin in den Windows-Sprachen aufgelistet, werden aber erst dann funktionieren, wenn Sie Keyman neu starten.
+
+
+
+
+ Bildschirmtastatur geschlossen
+
+
+
+
+ Sie haben die Bildschirmtastatur geschlossen. Keyman läuft noch. Sie können die Bildschirmtastatur jederzeit öffnen, indem Sie auf das Tastatur-Symbol klicken und „Bildschirmtastatur“ wählen
+
+
+
+ Diesen Hinweis nicht mehr anzeigen
+
+
+
+ Keyman Hilfe
+
+
+
+ Hilfe-Inhalte
+
+
+
+ Hilfe zu \"
+
+
+
+ \" Tastatur
+
+
+
+ Bildschirmtastatur anzeigen
+
+
+
+ Tastatur-Nutzung anzeigen
+
+
+
+ Schriftarten anzeigen
+
+
+
+ Zeichentabelle anzeigen
+
+
+
+ Keyman Konfiguration öffnen
+
+
+
+ Hilfe öffnen
+
+
+
+ Bildschirmtastatur schließen
+
+
+
+ Keyman &ausschalten
+
+
+
+ &Bildschirmtastatur
+
+
+
+ Tastatur-&Verwendung
+
+
+
+ &Schriftarten-Anzeige
+
+
+
+ &Zeichentabelle
+
+
+
+ &Text-Editor...
+
+
+
+ &Konfiguration...
+
+
+
+ &Hilfe...
+
+
+
+ &Verlassen
+
+
+
+ Bei Inaktivität ausblenden
+
+
+
+ Symbolleiste anzeigen
+
+
+
+ Als Webseite speichern...
+
+
+
+ Drucken...
+
+
+
+ Keyman
+
+
+
+
+ Version %0:s
+
+
+
+ &Drucken...
+
+
+
+
+ Ein Paket mit dem Namen %0:s ist bereits installiert. Möchten Sie es deinstallieren und das neue installieren?
+
+
+
+
+ Eine Tastatur mit dem Name \'%0:s\' ist bereits installiert. Wenn Sie fortfahren, wird sie deinstalliert bevor die neue Tastatur installiert wird. Fortfahren?
+
+
+
+
+ Die Tastatur \'%0:s\' ist Teil des Pakets \'%1:s\'. Sie müssen das gesamte Paket deinstallieren. Fortfahren?
+
+
+
+
+ Das Paket oder die Tastatur \'%0:s\' enthält keine Einführungshilfe.
+
+
+
+ Dieses Betriebssystem wird nicht unterstützt.
+
+
+
+ KeymanDesktop.chm
+
+
+
+ Die Hilfedatei konnte nicht gefunden werden.
+
+
+
+ Codepage
+
+
+
+ Unicode
+
+
+
+ Datei wird heruntergeladen
+
+
+
+
+ Sind Sie sicher, dass Sie die Bildschirmtastatur für %0:s entfernen möchten?
+
+
+
+
+ Sind Sie sicher, dass Sie die Tastatur %0:s deinstallieren wollen?
+
+
+
+
+ Sind Sie sicher, dass Sie das Tastaturbelegungspaket %0:s deinstallieren wollen?
+
+%1:s
+
+
+
+
+ Die folgenden Schriftarten werden ebenfalls deinstalliert: %0:s.
+
+
+
+ Die Zeichentabelle enthält eine Datenbank von Zeichen, die erstellt werden muss, bevor sie verwendet werden kann. Jetzt erstellen?
+
+
+
+
+ Die Unicode Zeichen-Datenbank konnte nicht gelöscht werden für einen Wiederaufbau. Der Fehler ist: %0:s
+
+
+
+
+ Die Unicode Zeichen-Datenbank konnte nicht erstellt werden und wurde deaktiviert. Der Fehler ist: %0:s
+
+
+
+
+ Die Unicode Zeichen-Datenbank konnte nicht geladen werden (%0:s). Jetzt neu erstellen?
+
+
+
+
+ Keyman konnte nicht gestartet werden. Bevor Sie fortfahren überprüfen Sie bitte Ihre Sicherheitseinstellungen, um sicherzustellen, dass das Programm keyman.exe gestartet werden darf. Der gemeldete Fehler ist:
+
+\"%0:s\"
+
+Möchten Sie Keyman erneut starten?
+
+
+
+ Keyman Debug-Informationen werden in einer Protokolldatei mit dem Namen %LOCALAPPDATA%\Keyman\Diag\system#.etl gespeichert (wobei # eine Nummer ist). Sie sollten Keyman beenden, bevor Sie diese Datei löschen.
+
+WARNUNG: Diese Datei kann sehr schnell groß werden. Das Aktivieren der Debug-Protokollierung kann Ihr System verlangsamen und sollte nur auf Anweisung durch den technischen Support erfolgen.
+
+DATENSCHUTZ-HINWEIS: Bitte beachten Sie, dass die Debug-Logdatei alle von Ihnen eingegebenen Tastenanschläge aufzeichnet. Sie sollten das Debug-Log nur für die Dauer einer Debugging- oder Diagnosesitzung aktivieren.
+
+
+
+ Bitte warten Sie, während nach Schriftarten für Tastatur %0:s gesucht wird
+
+
+
+ Tastatur %0:s ist keine Unicode-Tastatur. Schriftarten können nicht automatisch gefunden werden. Bitte überprüfen Sie die Tastaturdokumentation für Schriftarten.
+
+
+
+ Derzeit sind keine Tastaturlayouts installiert oder geladen.
+
+
+
+ Bitte wählen Sie eine Keyman-Tastatur, um unterstützte Schriftarten zu finden.
+
+
+
+ Texteditor - Keyman
diff --git a/windows/src/desktop/kmshell/xml/strings.xml b/windows/src/desktop/kmshell/xml/strings.xml
index f09a01d348..75d0cc9569 100644
--- a/windows/src/desktop/kmshell/xml/strings.xml
+++ b/windows/src/desktop/kmshell/xml/strings.xml
@@ -439,7 +439,7 @@
-
Always elevate user permissions when running in Windows Vista
+
Always elevate user permissions when running in Windows Vista
@@ -471,7 +471,7 @@
-
Open Keyboard Menu
+
Open Keyboard Menu
@@ -1193,7 +1193,7 @@ PRIVACY WARNING: Please note that the debug logfile records all keystrokes that
-
Please wait while searching for releted fonts for keyboard %0:s
+
Please wait while searching for related fonts for keyboard %0:s
diff --git a/windows/src/desktop/setup/locale/de/strings.xml b/windows/src/desktop/setup/locale/de/strings.xml
new file mode 100644
index 0000000000..7622a24850
--- /dev/null
+++ b/windows/src/desktop/setup/locale/de/strings.xml
@@ -0,0 +1,80 @@
+
+
+ Englisch
+ $APPNAME $VERSION Setup
+ Installiere $APPNAME $VERSION
+ $APPNAME $VERSION wurde erfolgreich installiert.
+ Sind Sie sicher, dass Sie die Installation von $APPNAME abbrechen möchten?
+ Entpacke Dateien...
+ Pakete werden überprüft...
+ Prüfe online auf Updates...
+ Installierte Versionen werden überprüft...
+ Fertigstellen...
+
+ • $APPNAME %0:s %1:s
+
+ • %0:s %1:s %2:s
+
+ • %0:s %1:s für %2:s %3:s
+ Es gibt nichts zu installieren.
+
+ (%0:s herunterladen)
+ Setup installiert:
+ $APPNAME $VERSION ist kostenlos und Open Source
+ &Lizenzbedingungen
+ Installati&ons-Einstellungen
+ $APPNAME Einstellungen
+ Ok
+ &Installieren
+ Abbrechen
+ &Beenden
+ Installiere $APPNAME
+ Ältere Versionen entfernen
+ Installation abgeschlossen
+ Sie müssen Windows neu starten, bevor das Setup abgeschlossen werden kann. Wenn Sie Windows neu starten, wird das Setup fortgesetzt.
+
+Jetzt neu starten?
+ Windows konnte nicht automatisch neu gestartet werden. Sie sollten Windows neu starten, bevor Sie $APPNAME starten.
+ Sie müssen Windows neu starten, um die Installation abzuschließen. Wenn Sie Windows neu starten, wird Setup beendet.
+ $APPNAME $VERSION benötigt Windows 7 oder höher, aber Keyman Desktop 7, 8 oder 9 wurde erkannt. Möchten Sie die in diesem Installer enthaltenen Tastaturen in die erkannte Keyman Desktop Version installieren?
+ Diese Version von $APPNAME benötigt Windows 7 oder neuer. Möchten Sie Keyman Desktop 8 herunterladen?
+ Installations-Optionen
+ Installationseinstellungen
+ Standard $APPNAME Einstellungen
+ Zu installierende oder aktualisierende Module
+ Verknüpfte Tastatursprache
+ Zu installierende Version
+ $APPNAME starten, wenn Windows startet
+ $APPNAME starten, wenn die Installation abgeschlossen ist
+ Automatisch nach Aktualisierungen suchen
+ Mit älteren Versionen installierte Tastaturen auf Version $VERSION aktualisieren
+ Anonyme Nutzungsstatistiken mit keyman.com teilen
+
+ Setup-Version: %0:s
+ $APPNAME installieren
+ $APPNAME upgraden
+
+ $APPNAME %0:s ist bereits installiert.
+
+ Version %0:s herunterladen (%1:s)
+
+ Version %0:s
+
+ Installiere %0:s
+
+ Version %0:s herunterladen (%1:s)
+
+ Version %0:s
+
+ Wählen Sie die Sprache aus, die Sie mit der Tastatur %0:s verknüpfen möchten
+ Default-Sprache
+
+ Herunterladen von %0:s
+
+ Herunterladen von %0:s
+ $APPNAME Setup konnte keine Verbindung zu keyman.com herstellen, um zusätzliche Ressourcen herunterzuladen.
+
+Bitte überprüfen Sie, ob Sie online sind, und geben Sie $APPNAME Setup in Ihren Firewall-Einstellungen die Erlaubnis, auf das Internet zuzugreifen.
+
+Klicken Sie auf Abbrechen, um die Einrichtung zu beenden, erneut zu versuchen und Ressourcen erneut herunterzuladen, oder ignorieren Sie, um offline fortzufahren.
+
diff --git a/windows/src/engine/keyman32/globals.h b/windows/src/engine/keyman32/globals.h
index cc048fb3d9..80d90f2fc2 100644
--- a/windows/src/engine/keyman32/globals.h
+++ b/windows/src/engine/keyman32/globals.h
@@ -201,6 +201,7 @@ typedef struct tagKEYMAN64THREADDATA
LPWORD IndexStack;
LPWSTR miniContext;
+ int miniContextIfLen;
KMSTATE state;
diff --git a/windows/src/engine/keyman32/kmprocess.cpp b/windows/src/engine/keyman32/kmprocess.cpp
index 41b8d0b87d..5edda2331f 100644
--- a/windows/src/engine/keyman32/kmprocess.cpp
+++ b/windows/src/engine/keyman32/kmprocess.cpp
@@ -426,6 +426,8 @@ BOOL ProcessGroup(LPGROUP gp)
assert(kkp != NULL);
+ _td->miniContextIfLen = xstrlen(kkp->dpContext) - xstrlen_ignoreifopt(kkp->dpContext);
+
// 11 Aug 2003 - I25(v6) - mcdurdin - CODE_NUL context support
if(*kkp->dpContext == UC_SENTINEL && *(kkp->dpContext+1) == CODE_NUL)
wcsncpy_s(_td->miniContext, GLOBAL_ContextStackSize, _td->app->ContextBuf(xstrlen_ignoreifopt(kkp->dpContext)-1), GLOBAL_ContextStackSize); // I3162 // I3536
@@ -549,18 +551,14 @@ int PostString(PWSTR str, LPMSG mp, LPKEYBOARD lpkb, PWSTR endstr)
_td->app->QueueAction(QIT_BELL, 0);
break;
case CODE_CONTEXT: // copy the context to the output
- for(q = _td->miniContext; *q; q++) {
- _td->app->QueueAction(QIT_CHAR, *q);
- }
- break;
+ PostString(_td->miniContext, mp, lpkb, wcschr(_td->miniContext, 0));
+ break;
case CODE_CONTEXTEX:
p++;
- for(q = _td->miniContext, i = 0; *q && i < *p-1; i++, q=incxstr(q));
+ for(q = _td->miniContext, i = _td->miniContextIfLen; *q && i < *p-1; i++, q=incxstr(q));
if(*q) {
- _td->app->QueueAction(QIT_CHAR, *q);
- if(Uni_IsSurrogate1(*q) && Uni_IsSurrogate2(*(q+1))) {
- _td->app->QueueAction(QIT_CHAR, *(q+1));
- }
+ temp = incxstr(q);
+ PostString(q, mp, lpkb, temp);
}
break;
case CODE_RETURN: // stop processing and start PostAllKeys
diff --git a/windows/src/ext/sentry/Sentry.Client.pas b/windows/src/ext/sentry/Sentry.Client.pas
index 93e177377f..fc823bfaa7 100644
--- a/windows/src/ext/sentry/Sentry.Client.pas
+++ b/windows/src/ext/sentry/Sentry.Client.pas
@@ -55,6 +55,8 @@ type
protected
class var
FInstance: TSentryClient;
+ FEnabled: Boolean;
+ FEnabledInitialised: Boolean;
private
FSentryInit: Boolean;
options: psentry_options_t;
@@ -73,6 +75,7 @@ type
procedure DoTerminate;
function EventIDToString(AGuid: PByte): String;
function ConvertRawStackToSentryStack(wrapWithThread: Boolean): sentry_value_t;
+ class function GetEnabled: Boolean; static;
public
constructor Create(AOptions: TSentryClientOptions; const ALogger: string; AFlags: TSentryClientFlags); virtual;
destructor Destroy; override;
@@ -85,6 +88,8 @@ type
property ReportExceptions: Boolean read FReportExceptions;
property ReportMessages: Boolean read FReportMessages;
+ public
+ class property Enabled: Boolean read GetEnabled;
end;
TSentryClientClass = class of TSentryClient;
@@ -431,6 +436,19 @@ begin
end;
end;
+class function TSentryClient.GetEnabled: Boolean;
+begin
+ if not FEnabledInitialised then
+ begin
+ // WINE is not coping with some of the Sentry/dbghelp calls so disable
+ // sentry on WINE instances.
+ FEnabled := GetProcAddress(GetModuleHandle('ntdll.dll'), 'wine_get_version') = nil;
+ FEnabledInitialised := True;
+ end;
+
+ Exit(FEnabled);
+end;
+
function TSentryClient.MessageEvent(Level: TSentryLevel; const Message: string;
IncludeStack: Boolean): string;
var
@@ -576,6 +594,7 @@ initialization
SymGetModuleBase64 := GetProcAddress(hDbgHelp, 'SymGetModuleBase64');
SymInitialize := GetProcAddress(hDbgHelp, 'SymInitialize');
- if Assigned(SymInitialize) then
- SymInitialize(GetCurrentProcess, nil, True);
+ if TSentryClient.Enabled then
+ if Assigned(SymInitialize) then
+ SymInitialize(GetCurrentProcess, nil, True);
end.
diff --git a/windows/src/global/delphi/general/Keyman.System.KeymanSentryClient.pas b/windows/src/global/delphi/general/Keyman.System.KeymanSentryClient.pas
index 2ae69a9b44..095f94ce84 100644
--- a/windows/src/global/delphi/general/Keyman.System.KeymanSentryClient.pas
+++ b/windows/src/global/delphi/general/Keyman.System.KeymanSentryClient.pas
@@ -27,6 +27,7 @@ type
procedure NestedValidateAccessViolation;
procedure NestedValidateDelphiException;
procedure NestedValidateFloatingPointException;
+ class function GetEnabled: Boolean; static;
public
destructor Destroy; override;
@@ -37,6 +38,7 @@ type
class procedure Start(SentryClientClass: TSentryClientClass; AProject: TKeymanSentryClientProject; const ALogger: string; AFlags: TKeymanSentryClientFlags = [kscfCaptureExceptions, kscfShowUI, kscfTerminate]);
class procedure Stop;
class property Client: TSentryClient read FClient;
+ class property Enabled: Boolean read GetEnabled;
class property Instance: TKeymanSentryClient read FInstance;
class property OnBeforeShutdown: TNotifyEvent read FOnBeforeShutdown write FOnBeforeShutdown;
public
@@ -186,6 +188,9 @@ class procedure TKeymanSentryClient.ReportHandledException(E: Exception;
var
text: string;
begin
+ if not Enabled then
+ Exit;
+
if Message <> ''
then text := Message + ': '
else text := '';
@@ -285,6 +290,9 @@ begin
FProject := AProject;
FFlags := AFlags;
+ if not Enabled then
+ Exit;
+
sentry_set_library_path(FindSentryDLL);
o.Debug := False;
@@ -346,6 +354,11 @@ begin
inherited Destroy;
end;
+class function TKeymanSentryClient.GetEnabled: Boolean;
+begin
+ Result := TSentryClient.Enabled;
+end;
+
class procedure TKeymanSentryClient.Start(SentryClientClass: TSentryClientClass; AProject: TKeymanSentryClientProject; const ALogger: string; AFlags: TKeymanSentryClientFlags);
begin
TKeymanSentryClient.Create(SentryClientClass, AProject, ALogger, AFlags);
@@ -367,6 +380,9 @@ end;
//
class procedure TKeymanSentryClient.Validate(Force: Boolean);
begin
+ if not Enabled then
+ Exit;
+
TKeymanSentryClient.Instance.NestedValidate(Force);
end;
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/.gitignore b/windows/src/test/GH-4275 - contextex-mismatch-with-if/.gitignore
new file mode 100644
index 0000000000..d16386367f
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/.gitignore
@@ -0,0 +1 @@
+build/
\ No newline at end of file
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/HISTORY.md b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/HISTORY.md
new file mode 100644
index 0000000000..aa1753a70b
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/HISTORY.md
@@ -0,0 +1,6 @@
+context_mismatch_with_if Change History
+====================
+
+1.0 (2021-01-18)
+----------------
+* Created by Andrew Cunningham / Marc Durdin
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/LICENSE.md b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/LICENSE.md
new file mode 100644
index 0000000000..9f5de40a84
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+© 2021 SIL International
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/README.md b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/README.md
new file mode 100644
index 0000000000..c80822652a
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/README.md
@@ -0,0 +1,29 @@
+context_mismatch_with_if keyboard
+==============
+
+© 2021 SIL International
+
+Version 1.0
+
+Description
+-----------
+
+See https://github.com/keymanapp/keyman/issues/4275
+
+Links
+-----
+
+Supported Platforms
+-------------------
+ * Windows
+ * macOS
+ * Linux
+ * Web
+ * iPhone
+ * iPad
+ * Android phone
+ * Android tablet
+ * Mobile devices
+ * Desktop devices
+ * Tablet devices
+
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/context_mismatch_with_if.keyboard_info b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/context_mismatch_with_if.keyboard_info
new file mode 100644
index 0000000000..5ce314be00
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/context_mismatch_with_if.keyboard_info
@@ -0,0 +1,7 @@
+{
+ "license": "mit",
+ "languages": [
+ "din-Latn"
+ ],
+ "description": "context_mismatch_with_if generated from template"
+}
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/context_mismatch_with_if.kpj b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/context_mismatch_with_if.kpj
new file mode 100644
index 0000000000..88a7bc90ba
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/context_mismatch_with_if.kpj
@@ -0,0 +1,102 @@
+
+
+
+ $PROJECTPATH\build
+ True
+ True
+ True
+ keyboard
+
+
+
+ id_d4e154080bd02f7d130d0c8150afeed5
+ context_mismatch_with_if.kmn
+ source\context_mismatch_with_if.kmn
+ 1.0
+ .kmn
+
+ context_mismatch_with_if
+ © 2021 Andrew Cunningham / Marc Durdin
+
+
+
+ id_fff45ad33955e3efc776aacdf99d136b
+ context_mismatch_with_if.kps
+ source\context_mismatch_with_if.kps
+
+ .kps
+
+ context_mismatch_with_if
+ ©
+
+
+
+ id_ede98e4633e239f933cbfd1f4e1b766c
+ HISTORY.md
+ HISTORY.md
+
+ .md
+
+
+ id_53e892b8b41cc4caece1cfd5ef21d6e7
+ LICENSE.md
+ LICENSE.md
+
+ .md
+
+
+ id_0730bb7c2e8f9ea2438b52e419dd86c9
+ README.md
+ README.md
+
+ .md
+
+
+ id_1213256b2009e2b32ee7d551a63402c6
+ context_mismatch_with_if.keyboard_info
+ context_mismatch_with_if.keyboard_info
+
+ .keyboard_info
+
+
+ id_ea1380e11b2491a95b183d9ea2bcd813
+ context_mismatch_with_if.kmx
+ source\..\build\context_mismatch_with_if.kmx
+
+ .kmx
+ id_fff45ad33955e3efc776aacdf99d136b
+
+
+ id_d038ab27468705cf4f13a191d3e065a4
+ context_mismatch_with_if.js
+ source\..\build\context_mismatch_with_if.js
+
+ .js
+ id_fff45ad33955e3efc776aacdf99d136b
+
+
+ id_7465a6bfd4f4080c7a939af65ae62ea9
+ context_mismatch_with_if.kvk
+ source\..\build\context_mismatch_with_if.kvk
+
+ .kvk
+ id_fff45ad33955e3efc776aacdf99d136b
+
+
+ id_356e5d149c1e539356d72698c1e401a6
+ welcome.htm
+ source\welcome.htm
+
+ .htm
+ id_fff45ad33955e3efc776aacdf99d136b
+
+
+ id_8da344c4cea6f467013357fe099006f5
+ readme.htm
+ source\readme.htm
+
+ .htm
+ id_fff45ad33955e3efc776aacdf99d136b
+
+
+
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.keyman-touch-layout b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.keyman-touch-layout
new file mode 100644
index 0000000000..149069b062
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.keyman-touch-layout
@@ -0,0 +1,1316 @@
+{
+ "tablet": {
+ "font": "Tahoma",
+ "layer": [
+ {
+ "id": "default",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "q"
+ },
+ {
+ "id": "K_W",
+ "text": "w"
+ },
+ {
+ "id": "K_E",
+ "text": "e"
+ },
+ {
+ "id": "K_R",
+ "text": "r"
+ },
+ {
+ "id": "K_T",
+ "text": "t"
+ },
+ {
+ "id": "K_Y",
+ "text": "y"
+ },
+ {
+ "id": "K_U",
+ "text": "u"
+ },
+ {
+ "id": "K_I",
+ "text": "i"
+ },
+ {
+ "id": "K_O",
+ "text": "o"
+ },
+ {
+ "id": "K_P",
+ "text": "p"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_A",
+ "text": "a",
+ "pad": 70
+ },
+ {
+ "id": "K_S",
+ "text": "s"
+ },
+ {
+ "id": "K_D",
+ "text": "d"
+ },
+ {
+ "id": "K_F",
+ "text": "f"
+ },
+ {
+ "id": "K_G",
+ "text": "g"
+ },
+ {
+ "id": "K_H",
+ "text": "h"
+ },
+ {
+ "id": "K_J",
+ "text": "j"
+ },
+ {
+ "id": "K_K",
+ "text": "k"
+ },
+ {
+ "id": "K_L",
+ "text": "l"
+ },
+ {
+ "sp": "10",
+ "width": "10"
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "width": "110",
+ "sp": "1",
+ "nextlayer": "shift"
+ },
+ {
+ "id": "K_Z",
+ "text": "z"
+ },
+ {
+ "id": "K_X",
+ "text": "x"
+ },
+ {
+ "id": "K_C",
+ "text": "c"
+ },
+ {
+ "id": "K_V",
+ "text": "v"
+ },
+ {
+ "id": "K_B",
+ "text": "b"
+ },
+ {
+ "id": "K_N",
+ "text": "n"
+ },
+ {
+ "id": "K_M",
+ "text": "m"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "90",
+ "sp": "1"
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": "140",
+ "sp": "1",
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": "630",
+ "sp": "0"
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "140",
+ "sp": "1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "shift",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "Q"
+ },
+ {
+ "id": "K_W",
+ "text": "W"
+ },
+ {
+ "id": "K_E",
+ "text": "E"
+ },
+ {
+ "id": "K_R",
+ "text": "R"
+ },
+ {
+ "id": "K_T",
+ "text": "T"
+ },
+ {
+ "id": "K_Y",
+ "text": "Y"
+ },
+ {
+ "id": "K_U",
+ "text": "U"
+ },
+ {
+ "id": "K_I",
+ "text": "I"
+ },
+ {
+ "id": "K_O",
+ "text": "O"
+ },
+ {
+ "id": "K_P",
+ "text": "P"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_A",
+ "text": "A",
+ "pad": 70
+ },
+ {
+ "id": "K_S",
+ "text": "S"
+ },
+ {
+ "id": "K_D",
+ "text": "D"
+ },
+ {
+ "id": "K_F",
+ "text": "F"
+ },
+ {
+ "id": "K_G",
+ "text": "G"
+ },
+ {
+ "id": "K_H",
+ "text": "H"
+ },
+ {
+ "id": "K_J",
+ "text": "J"
+ },
+ {
+ "id": "K_K",
+ "text": "K"
+ },
+ {
+ "id": "K_L",
+ "text": "L"
+ },
+ {
+ "sp": "10",
+ "width": "10"
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "width": "110",
+ "sp": "2",
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_Z",
+ "text": "Z"
+ },
+ {
+ "id": "K_X",
+ "text": "X"
+ },
+ {
+ "id": "K_C",
+ "text": "C"
+ },
+ {
+ "id": "K_V",
+ "text": "V"
+ },
+ {
+ "id": "K_B",
+ "text": "B"
+ },
+ {
+ "id": "K_N",
+ "text": "N"
+ },
+ {
+ "id": "K_M",
+ "text": "M"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "layer": "default",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA",
+ "layer": "default"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE",
+ "layer": "default"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH",
+ "layer": "default"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "90",
+ "sp": "1"
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": "140",
+ "sp": "1",
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": "630",
+ "sp": "0"
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "140",
+ "sp": "1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "numeric",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_1",
+ "text": "1"
+ },
+ {
+ "id": "K_2",
+ "text": "2"
+ },
+ {
+ "id": "K_3",
+ "text": "3"
+ },
+ {
+ "id": "K_4",
+ "text": "4"
+ },
+ {
+ "id": "K_5",
+ "text": "5"
+ },
+ {
+ "id": "K_6",
+ "text": "6"
+ },
+ {
+ "id": "K_7",
+ "text": "7"
+ },
+ {
+ "id": "K_8",
+ "text": "8"
+ },
+ {
+ "id": "K_9",
+ "text": "9"
+ },
+ {
+ "id": "K_0",
+ "text": "0"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_4",
+ "text": "$",
+ "layer": "shift",
+ "pad": 70
+ },
+ {
+ "id": "K_2",
+ "text": "@",
+ "layer": "shift"
+ },
+ {
+ "id": "K_3",
+ "text": "#",
+ "layer": "shift"
+ },
+ {
+ "id": "K_5",
+ "text": "%",
+ "layer": "shift"
+ },
+ {
+ "id": "K_7",
+ "text": "&",
+ "layer": "shift"
+ },
+ {
+ "id": "K_HYPHEN",
+ "text": "_",
+ "layer": "shift"
+ },
+ {
+ "id": "K_EQUAL",
+ "text": "=",
+ "layer": "default"
+ },
+ {
+ "id": "K_BKSLASH",
+ "text": "|",
+ "layer": "shift"
+ },
+ {
+ "id": "K_BKSLASH",
+ "text": "\\",
+ "layer": "default"
+ },
+ {
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "width": "110",
+ "sp": "1"
+ },
+ {
+ "id": "K_LBRKT",
+ "text": "[",
+ "sk": [
+ {
+ "id": "U_00AB",
+ "text": "\u00AB"
+ },
+ {
+ "id": "K_COMMA",
+ "text": "<",
+ "layer": "shift"
+ },
+ {
+ "id": "K_LBRKT",
+ "text": "{",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_9",
+ "text": "(",
+ "layer": "shift"
+ },
+ {
+ "id": "K_0",
+ "text": ")",
+ "layer": "shift"
+ },
+ {
+ "id": "K_RBRKT",
+ "text": "]",
+ "sk": [
+ {
+ "id": "U_00BB",
+ "text": "\u00BB"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ">",
+ "layer": "shift"
+ },
+ {
+ "id": "K_RBRKT",
+ "text": "}",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_EQUAL",
+ "text": "+",
+ "layer": "shift"
+ },
+ {
+ "id": "K_HYPHEN",
+ "text": "-",
+ "layer": "default"
+ },
+ {
+ "id": "K_8",
+ "text": "*",
+ "layer": "shift"
+ },
+ {
+ "id": "K_SLASH",
+ "text": "/",
+ "layer": "default"
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "90",
+ "sp": "1"
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_LOWER",
+ "text": "*abc*",
+ "width": "140",
+ "sp": "1",
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": "630",
+ "sp": "0"
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "140",
+ "sp": "1"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "phone": {
+ "font": "Tahoma",
+ "layer": [
+ {
+ "id": "default",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "q"
+ },
+ {
+ "id": "K_W",
+ "text": "w"
+ },
+ {
+ "id": "K_E",
+ "text": "e"
+ },
+ {
+ "id": "K_R",
+ "text": "r"
+ },
+ {
+ "id": "K_T",
+ "text": "t"
+ },
+ {
+ "id": "K_Y",
+ "text": "y"
+ },
+ {
+ "id": "K_U",
+ "text": "u"
+ },
+ {
+ "id": "K_I",
+ "text": "i"
+ },
+ {
+ "id": "K_O",
+ "text": "o"
+ },
+ {
+ "id": "K_P",
+ "text": "p"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_A",
+ "text": "a",
+ "pad": "50"
+ },
+ {
+ "id": "K_S",
+ "text": "s"
+ },
+ {
+ "id": "K_D",
+ "text": "d"
+ },
+ {
+ "id": "K_F",
+ "text": "f"
+ },
+ {
+ "id": "K_G",
+ "text": "g"
+ },
+ {
+ "id": "K_H",
+ "text": "h"
+ },
+ {
+ "id": "K_J",
+ "text": "j"
+ },
+ {
+ "id": "K_K",
+ "text": "k"
+ },
+ {
+ "id": "K_L",
+ "text": "l"
+ },
+ {
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "sp": "1",
+ "nextlayer": "shift"
+ },
+ {
+ "id": "K_Z",
+ "text": "z"
+ },
+ {
+ "id": "K_X",
+ "text": "x"
+ },
+ {
+ "id": "K_C",
+ "text": "c"
+ },
+ {
+ "id": "K_V",
+ "text": "v"
+ },
+ {
+ "id": "K_B",
+ "text": "b"
+ },
+ {
+ "id": "K_N",
+ "text": "n"
+ },
+ {
+ "id": "K_M",
+ "text": "m"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "100",
+ "sp": "1"
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": "150",
+ "sp": "1",
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": "610",
+ "sp": "0"
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "150",
+ "sp": "1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "shift",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "Q"
+ },
+ {
+ "id": "K_W",
+ "text": "W"
+ },
+ {
+ "id": "K_E",
+ "text": "E"
+ },
+ {
+ "id": "K_R",
+ "text": "R"
+ },
+ {
+ "id": "K_T",
+ "text": "T"
+ },
+ {
+ "id": "K_Y",
+ "text": "Y"
+ },
+ {
+ "id": "K_U",
+ "text": "U"
+ },
+ {
+ "id": "K_I",
+ "text": "I"
+ },
+ {
+ "id": "K_O",
+ "text": "O"
+ },
+ {
+ "id": "K_P",
+ "text": "P"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_A",
+ "text": "A",
+ "pad": "50"
+ },
+ {
+ "id": "K_S",
+ "text": "S"
+ },
+ {
+ "id": "K_D",
+ "text": "D"
+ },
+ {
+ "id": "K_F",
+ "text": "F"
+ },
+ {
+ "id": "K_G",
+ "text": "G"
+ },
+ {
+ "id": "K_H",
+ "text": "H"
+ },
+ {
+ "id": "K_J",
+ "text": "J"
+ },
+ {
+ "id": "K_K",
+ "text": "K"
+ },
+ {
+ "id": "K_L",
+ "text": "L"
+ },
+ {
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "sp": "2",
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_Z",
+ "text": "Z"
+ },
+ {
+ "id": "K_X",
+ "text": "X"
+ },
+ {
+ "id": "K_C",
+ "text": "C"
+ },
+ {
+ "id": "K_V",
+ "text": "V"
+ },
+ {
+ "id": "K_B",
+ "text": "B"
+ },
+ {
+ "id": "K_N",
+ "text": "N"
+ },
+ {
+ "id": "K_M",
+ "text": "M"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "layer": "default",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA",
+ "layer": "default"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE",
+ "layer": "default"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH",
+ "layer": "default"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "sp": "1"
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": "150",
+ "sp": "1",
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": "610",
+ "sp": "0"
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "150",
+ "sp": "1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "numeric",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_1",
+ "text": "1"
+ },
+ {
+ "id": "K_2",
+ "text": "2"
+ },
+ {
+ "id": "K_3",
+ "text": "3"
+ },
+ {
+ "id": "K_4",
+ "text": "4"
+ },
+ {
+ "id": "K_5",
+ "text": "5"
+ },
+ {
+ "id": "K_6",
+ "text": "6"
+ },
+ {
+ "id": "K_7",
+ "text": "7"
+ },
+ {
+ "id": "K_8",
+ "text": "8"
+ },
+ {
+ "id": "K_9",
+ "text": "9"
+ },
+ {
+ "id": "K_0",
+ "text": "0"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_4",
+ "layer": "shift",
+ "text": "$",
+ "pad": "50"
+ },
+ {
+ "id": "K_2",
+ "layer": "shift",
+ "text": "@"
+ },
+ {
+ "id": "K_3",
+ "layer": "shift",
+ "text": "#"
+ },
+ {
+ "id": "K_5",
+ "layer": "shift",
+ "text": "%"
+ },
+ {
+ "id": "K_6",
+ "layer": "shift",
+ "text": "&"
+ },
+ {
+ "id": "K_HYPHEN",
+ "layer": "shift",
+ "text": "_"
+ },
+ {
+ "id": "K_EQUAL",
+ "text": "=",
+ "layer": "default"
+ },
+ {
+ "id": "K_BKSLASH",
+ "layer": "shift",
+ "text": "|"
+ },
+ {
+ "id": "K_BKSLASH",
+ "text": "\\",
+ "layer": "default"
+ },
+ {
+ "text": "",
+ "width": "10",
+ "sp": "10"
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_LBRKT",
+ "text": "[",
+ "pad": "110",
+ "sk": [
+ {
+ "id": "U_00AB",
+ "text": "\u00AB"
+ },
+ {
+ "id": "K_COMMA",
+ "text": "<",
+ "layer": "shift"
+ },
+ {
+ "id": "K_LBRKT",
+ "text": "{",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_9",
+ "layer": "shift",
+ "text": "("
+ },
+ {
+ "id": "K_0",
+ "layer": "shift",
+ "text": ")"
+ },
+ {
+ "id": "K_RBRKT",
+ "text": "]",
+ "sk": [
+ {
+ "id": "U_00BB",
+ "text": "\u00BB"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ">",
+ "layer": "shift"
+ },
+ {
+ "id": "K_RBRKT",
+ "text": "}",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_EQUAL",
+ "layer": "shift",
+ "text": "+"
+ },
+ {
+ "id": "K_HYPHEN",
+ "text": "-"
+ },
+ {
+ "id": "K_8",
+ "layer": "shift",
+ "text": "*"
+ },
+ {
+ "id": "K_SLASH",
+ "text": "/"
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": "100",
+ "sp": "1"
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_LOWER",
+ "text": "*abc*",
+ "width": "150",
+ "sp": "1",
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": "120",
+ "sp": "1"
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": "610",
+ "sp": "0"
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": "150",
+ "sp": "1"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kmn b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kmn
new file mode 100644
index 0000000000..2cd240da8d
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kmn
@@ -0,0 +1,60 @@
+c Tests context(n) together with if() and BKSP, as reported by
+c Andrew Cunningham.
+
+c
+c Tests:
+c
+c 1. [x][BKSP] should result in "a" U+0308
+c -> 14.0.223 gives U+0308 "e"
+c 2. [y][z] should result in '<' dk(1) 'a' dk(2) 'b' dk(3) '>'
+c -> 14.0.223 gives 'ab>' (note the missing initial '<'!)
+c 3. [y][M] should result in '<' dk(1) '>'
+c -> 14.0.223 gives '<' U+FFFF '>'
+c (to test on web, type [y][M][?], which should result in 'correct', as it is
+c difficult to observe deadkeys)
+c
+c Note: all these tests pass on web.
+c
+
+
+store(&VERSION) '10.0'
+store(&NAME) 'context_mismatch_with_if'
+store(©RIGHT) '© 2021 Andrew Cunningham / Marc Durdin'
+store(&TARGETS) 'any'
+
+begin Unicode > use(constraints)
+
+store(nfc) '0' c 1 (default) = Normalisation Form C, 0 = Normalisation Form D
+store(diaeresisBase) U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006F U+004F c a A e E i I o O
+
+group(constraints) using keys
+
+c ########################
+c character position tests
+c ########################
+
+c Setup
+
++ 'x' > 'a' U+0308 'e' U+0308
+
+c Test #1 for if() with context(n)
+
+if(nfc = "0") any(diaeresisBase) U+0308 any(diaeresisBase) U+0308 + [K_BKSP] > context(2) context(3)
+
+c ##########################
+c deadkeys and context tests
+c ##########################
+
+c Setup
+
++ 'y' > dk(1) 'a' dk(2) 'b' dk(3)
+
+c Test #2 for dk(d) and context
+
+dk(1) 'a' dk(2) 'b' dk(3) + 'z' > '<' context '>'
+'<' dk(1) 'a' dk(2) 'b' dk(3) '>' + '?' > 'correct'
+
+c Test #3 for dk(d) and context(n)
+
+dk(1) 'a' dk(2) 'b' dk(3) + 'M' > '<' context(1) '>'
+'<' dk(1) '>' + '?' > 'correct'
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kps b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kps
new file mode 100644
index 0000000000..14b9ff2781
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kps
@@ -0,0 +1,67 @@
+
+
+
+ 13.0.9999.0
+ 7.0
+
+
+
+ readme.htm
+
+
+
+
+
+
+
+
+
+ context_mismatch_with_if
+ ©
+ Andrew Cunningham / Marc Durdin
+
+
+
+
+ ..\build\context_mismatch_with_if.kmx
+
+ 0
+ .kmx
+
+
+ ..\build\context_mismatch_with_if.js
+
+ 0
+ .js
+
+
+ ..\build\context_mismatch_with_if.kvk
+
+ 0
+ .kvk
+
+
+ welcome.htm
+
+ 0
+ .htm
+
+
+ readme.htm
+
+ 0
+ .htm
+
+
+
+
+ context_mismatch_with_if
+ context_mismatch_with_if
+ 1.0
+
+ Dinka
+
+
+
+
+
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kvks b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kvks
new file mode 100644
index 0000000000..c6296b2572
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/context_mismatch_with_if.kvks
@@ -0,0 +1,8 @@
+
+
+
+ 10.0
+ context_mismatch_with_if
+
+
+
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/readme.htm b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/readme.htm
new file mode 100644
index 0000000000..cde2c5da28
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/readme.htm
@@ -0,0 +1,24 @@
+
+
+
+
+
+
context_mismatch_with_if
+
+
+
+
+
context_mismatch_with_if
+
+
+ context_mismatch_with_if 1.0 generated from template.
+
+
+
©
+
+
+
diff --git a/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/welcome.htm b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/welcome.htm
new file mode 100644
index 0000000000..5019a12b42
--- /dev/null
+++ b/windows/src/test/GH-4275 - contextex-mismatch-with-if/context_mismatch_with_if/source/welcome.htm
@@ -0,0 +1,28 @@
+
+
+
+
+
+
Start Using context_mismatch_with_if
+
+
+
+
+
Start Using context_mismatch_with_if
+
+
+ context_mismatch_with_if 1.0 generated from template.
+
+
+
Keyboard Layout
+
+
+
+
©
+
+
+
\ No newline at end of file
diff --git a/windows/src/test/unit-tests/Makefile b/windows/src/test/unit-tests/Makefile
index 9fdacbeb68..86b9790a59 100644
--- a/windows/src/test/unit-tests/Makefile
+++ b/windows/src/test/unit-tests/Makefile
@@ -34,12 +34,6 @@ lexical-model-compiler:
start /wait ./build.sh -test
!endif
-# Revert any local changes to the original source; these changes can break
-# later sub-builds.
- cd $(KEYMAN_ROOT)\developer\js
- git restore package.json
- git restore package-lock.json
-
kmcomp-x64-structures:
cd $(ROOT)\src\test\unit-tests\group-helper-rsp19902
$(MAKE) $(TARGET)