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.