Nils Rudolph
Dem Ingeniör ist nichts zu schwör! - Daniel Düsentrieb
Über mich

Language Tags mit privater Extension

17. Februar 2024

Bei einem Projekt haben wir in der Software “Entwickler” Sprachen für Deutsch und Englisch eingesetzt. Erst später kamen dann die professionell übersetzen Sprachen hinzu. Die Übersetzungen wurden während des Projektes regelmäßig von den Übersetzern in unser Repository gepusht und auf einem Demosystem mit Muttersprachlern Probe gelesen.

Die Systemtests basierten aber auf den “Entwickler” Sprachen, da die nicht rot werden sollten, wenn ein Übersetzungstext sich ändert.

Welchen Language Tag sollten die Entwicklersprachen haben? “de-DE” und “en-US” waren für die echten Übersetzungen vorgesehen und nicht existierende Tag wie z.B.: “de-DEV” können zu Problemen führen, wenn Teile der Software eine validen und standardkonformen Tag erwartet.

So funktioniert z.B. in Java Locale::forLanguageTag und Locale::toLanguageTag nicht wie erwartet mit den nicht standardkonformen Tags.

So schlägt hier z.B. der zweite Test fehl:

package de.nilsrudolph.blog;

import org.junit.jupiter.api.Test;

import java.util.Locale;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class LanguageTag {

    @Test
    public void testValidLanguageTag() {
        String validTag = "de-DE";
        assertEquals(Locale.forLanguageTag(validTag).toLanguageTag(), validTag);
    }

    @Test //This one will fail
    public void testInvalidLanguageTag() {
        String invalidTag = "de-DEV";
        assertEquals(Locale.forLanguageTag(invalidTag).toLanguageTag(), invalidTag);
    }
}

Besser ist es, Language Tags mit einer privaten Extension zu verwenden. Private Extensions sind Teil des Standards und werden mit dem Suffix “-x” eingeleitet. Damit hatten wir dann sie Entwicklersprachen “de-DE-x-dev” und “en-US-x-dev”.

Die werden dann auch korrekt verarbeitet:

package de.nilsrudolph.blog;

import org.junit.jupiter.api.Test;

import java.util.Locale;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class LanguageTag {

    @Test
    public void testValidLanguageTagWithPrivateExtension() {
        String validTag = "de-DE-x-dev";
        assertEquals(Locale.forLanguageTag(validTag).toLanguageTag(), validTag);
    }
}