Ich habe eine Safari-Erweiterung entwickelt, die Mehrsprachigkeit unterstützt. Damit ich das in Xcode testen kann, habe ich mich für folgendes Setup entschieden: Anstatt die Sprachen immer manuell umzuschalten, lasse ich Xcode das automatisiert tun: Ein Schema pro Plattform und Sprache, zusätzlich gibt es für den iOS-Simulator ein pre-action script welches den Simulator sauber umschaltet und neu startet.
Die Grundidee
Pro Sprache habe ich zwei Schemata erzeugt:
App (macOS) - DE App (iOS) - DE
App (macOS) - EN App (iOS) - EN
In Xcode kann man das Schema auswählen, Run drücken und die App startet in der ausgewählten Sprache.
Teil 1: Sprache und Region in der Run-Action setzen
Jedes Schema ist eine Kopie des Base-Schemas. Der Unterschied befindet sich in der LaunchAction:
<LaunchAction
buildConfiguration = "Debug"
language = "de"
region = "DE"
...>
Es startet die App mit dem Switch -AppleLanguages (de) und der passenden Region.
Das reicht für MacOS: Die Sprachressourcen für die App und die Safari-Erweiterung werden lokalisiert gestartet und das System bleibt unangetastet.
Teil 2: Konfiguration des iOS-Simulators
Die Schema-Sprache wirkt sich nur auf die Host-App aus, die Safari-Erweiterung wird jedoch innerhalb von Safari geladen und folgt
der Lokalisierung des Simulators.
Also fügt man in den iOS-Schemata pre-actions hinzu, die ausgeführt werden, bevor die App startet.
Dies ist innerhalb des Schemas als ShellScriptAction gespeichert:
<PreActions>
<ExecutionAction ActionType = "...ShellScriptAction">
<ActionContent
title = "Set Simulator Language to German"
scriptText = "..."
shellToInvoke = "/bin/sh">
Das entsprechende Skript sieht wie folgt aus:
LANG="German"; APPLANG="de"; APPLOCALE="de_DE"
exec > "$LOGFILE" 2>&1 # Schreiben des Log-files, da Xcode den Output versteckt.
# 1. Finde den Simulator, den Xcode verwenden wird
UDID="${TARGET_DEVICE_IDENTIFIER:-${SIMULATOR_UDID:-}}"
[ -z "$UDID" ] && UDID=$(simctl list devices booted | awk -F '[()]' '/Booted/{print $2; exit}')
PLIST="$HOME/Library/Developer/CoreSimulator/Devices/$UDID/data/Library/Preferences/.GlobalPreferences.plist"
# 2. Device herunterfahren
simctl shutdown "$UDID" || true; sleep 2
# 3. Sprache und Locale setzen
PlistBuddy -c "Delete :AppleLanguages" "$PLIST" || true
PlistBuddy -c "Add :AppleLanguages array" "$PLIST"
PlistBuddy -c "Add :AppleLanguages:0 string $APPLANG" "$PLIST"
PlistBuddy -c "Set :AppleLocale $APPLOCALE" "$PLIST" || PlistBuddy -c "Add :AppleLocale string $APPLOCALE" "$PLIST"
Xcode startet den Simulator dann in deutscher Sprache, und damit ist auch die Erweiterung in Deutsch testbar.
Michael Hülsen