MS Edge: Sprache ändern

UPDATE: Das u.g. gilt nicht mehr für den neuen, Chrome-basierten Edge!

Die Sprache lässt sich in Edge wirklich ausgesprochen einfach ändern:

  1. Systemsteuerung → Internetoptionen → Allgemein → Darstellung → Sprachen → Spracheinstellungen festlegen → Bevorzugte Sprachen → Sprache hinzufügen → Sprache wählen, “Weiter” → “Sprachfeatures” werden “installiert”
  2. “Als meine Windows-Anzeigesprache festlegen” ggf. deaktivieren, “Installieren” (WTF, wurde das nicht im letzten Schritt grad installiert?)
  3. warten… ⏳
  4. Googlen, warum die Sprache nicht herunterlädt, Language Packs manuell herunterladen
    • UPDATE: Offenbar lädt er doch herunter, allerdings ist der Fortschrittsbalken extrem schlecht (selbst für Windows), und es dauert extrem lange, siehe auch 5.3
  5. Googlen, wie man manuell heruntergeladene Language Packs installiert:
    1. Startmenü, “Lpksetup” (case-sensitiv ausschreiben, sonst hat er es bei mir nicht gefunden, WTF)
    2. “Anzeigesprache installieren” → Datei auswählen → Weiter, Lizenz zustimmen (WTF, wer hält denn die Rechte an ITALIENISCH?)
    3. deutlich zweistellig Minuten warten… ⌛
    4. wiederholen für jede Sprachdatei 🤮
  6. Dialog aus 2. schließen, neu öffnen, Sprache sollte jetzt dort sein
  7. Googlen, warum man die neu installierte Sprache nicht ganz nach oben verschieben kann: Alle Sprachen entfernen und in der gewünschten Reihenfolge wieder hinzufügen (WTF, wozu gibt es die entsprechenden Buttons) oder mehr als zwei Sprachen installieren 🤦🏼‍♂️ Ja: Die Reihenfolge von genau zwei Sprachen ließ sich nicht ändern.
  8. Leider schickt der Edge weiterhin de-de als Accept-Language? (Und das möchte ich an dieser Stelle betonen: Es geht ausschließlich darum, einen HTTP-Request-Header zu ändern)

regedit hilft (hier am Beispiel en-US):

🚮

JS: navigator.language im Chrome

Chrome ist der neue Internet Explorer:

Stellt sich raus: navigator.language ist im Chrome die Sprache des UI, nichtAccept-Language” m(

navigator.languages funktioniert dafür auch im FF und liefert alle akzeptierten Sprachen.

Symfony: Übersetzungen nachträglich setzen

Mehrsprachigkeit läuft in Symfony intern so ab, dass alle Texte separiert nach Sprache (bzw. pro “Locale”, dieselbe Sprache kann in mehreren Ländern gesprochen werden) von einer Translator-Klasse “geladen” werden. “Geladen” heißt: Diese Texte können auch aus einem Array kommen, das muss keine Datei sein.

Und man kann die Texte auch nachträglich laden: Dazu gibt es die Funktion addResource, der man die Art der Daten (Array, CSV, …), die Daten an sich, die Locale und die Domain übergibt:

Nun ist es aber so, dass addResource erst mal nur die Daten “bekannt” macht, indem es sie intern in ein “resources”-Array schreibt. Die Daten werden nicht fixiert, und insbesondere nicht in den Symfony-Cache geschrieben. Man kann das allerdings erzwingen, indem man eine (nicht zwingend existente) Übersetzung für diese (neue!) Locale anfragt:

Die letzte Zeile ist wichtig, sonst passiert es unter bestimmten Umständen, dass man mit “leeren” Übersetzungen dasteht!

Für die Akten, diese Umstände sind folgende:

Meine Anwendung unterstützt de_COM und en_COM. en_COM ist default_locale und Fallback für de_COM. Beide Sprachen werden initial (d.h., wenn sie lokal noch nicht vorliegen) von extern geholt. Der Fehler tritt nun auf, wenn ich erst de_COM aufrufe. Dann wird en_COM als Fallback in die catalogue.de_COM.php geschrieben – aber als leeres Array, denn en_COM liegt lokal noch nicht vor. Rufe ich jetzt (erst) en_COM auf, wird die catalogue.en_COM.php nicht auf Basis der externen Daten geschrieben, sondern auf Basis des leeres Arrays aus catalogue.de_COM.php. Dabei liegen die Daten für en_COM durchaus vor, sie werden/wurden nur nicht in eine lokale Datei geschrieben, und deshalb beim Schreiben der catalogue.de_COM.php nicht berücksichtigt. Die o.g. Zeile erzwingt das Schreiben der Datei und alles ist tutti.

So: Das war das erste Problem 🙂 Das zweite ist, dass ein mal gecachte “Catalogue”-Dateien nicht aktualisiert werden, wenn sich die Quelle dazu ändert. Die Doku sagt, man muss den Cache dann leeren. Falls das nicht gewünscht wird (etwa, weil man im Zuge eines automatisierten Preview-Prozesses dynamisch Änderungen veröffentlichen können muss), bleibt einem nur das Deaktivieren des Translation-Caches.

Dazu bietet Symfony\Bundle\FrameworkBundle\Translation\Translator die Option “cache_dir”. Auf null gesetzt ist der Cache deaktiviert. Leider kann man diese Option nicht von außen setzen m( Aber man kann seine eigene Translator-Klasse als default definieren, und dort die Option setzen – im Folgenden direkt konfigurierbar implementiert:

config.yml:

Acme\ProjectBundle\DependencyInjection:

Acme\ProjectBundle\Translation\AcmeTranslator:

HTH