GT JSX Data Format

Referenz für das minimierte General Translation JSX-Datenformat

Das GT JSX-Datenformat ist ein minimiertes Datenformat, das von den General Translation-Bibliotheken verwendet wird, um übersetzte Benutzeroberflächen in Ihrer React-Anwendung darzustellen.

Einführung: JSX-Bäume

React stellt JSX-Bäume als Objekte mit der folgenden Struktur dar:

type Element = {
    type: string;
    props: {
        children: JSXTree[] | JSXTree;
        // ...other props
    };
    // ...other attributes
};
type JSXTree = Element | string;

GT JSX ist eine komprimierte Version dieser JSX-Baumstruktur, die von den General Translation-Bibliotheken verwendet wird, um übersetzte Benutzeroberflächen in Ihrer React-Anwendung darzustellen.

Referenz

type Element = {
    t?: string; // tag name
    c?: (Element | Variable | string)[]; // children
    i?: number; // GT ID of the element
    d?: {
        b?: Record<string, Element | Variable | string>; // branches
        t?: "p" | "b"; // branch transformation type (plural or branch)
        pl?: string; // placeholder
        ti?: string; // title
        alt?: string; // alt
        arl?: string; // aria-label
        arb?: string; // aria-labelledby
        ard?: string; // aria-describedby
        s?: Record<string, string>; // style
    };
}
type Variable = {
    k: string; // key
    v?: "v" | "n" | "c" | "d"; // type
    i?: number; // GT ID
}
type GTJSXTree = Element | Variable | string | (Element | Variable | string)[];

GT JSX: Strings

Die einfachste Form von GT JSX ist ein String, der eine statische Textzeichenkette darstellt.

Zum Beispiel:

<T>Hello, world!</T>

Würde in GT JSX folgendermaßen dargestellt werden:

"Hello, world!"

Arrays von Strings sind ebenfalls gültiges GT JSX:

["Hello, ", "world!"]

GT JSX: Elemente

GT repräsentiert JSX Element Typen auf zwei mögliche Arten.

Variablen

Die erste ist eine Variable, ein einfaches Objekt, das einen Schlüssel und einen optionalen Typ enthält. Dies wird verwendet, um Variablen zu repräsentieren, die sich zur Laufzeit ändern können.

type Variable = {
    k: string; // `k` represents key, the name of the variable
    v?: ( // represents the type of the variable, if left out is assumed as `v`
        "v" | // `v`, a generic variable
        "n" | // `n`, a number variable
        "c" | // `c`, a currency variable
        "d" // `d`, a datetime variable
    );
    i?: number; // GT ID of the variable
}

Beispiel 1: Var

<T>Hello, <Var>{name}</Var>!</T>

Würde in GT JSX wie folgt dargestellt:

["Hello, ", { k: "_gt_var_1", i: 1 }, "!"]

Variablen ohne eine name-Eigenschaft erhalten eindeutige interne Namen basierend auf ihrer GT ID

Beispiel 2: Num

<T>The count is <Num>{count}</Num></T>

Würde in GT JSX wie folgt dargestellt:

["The count is ", { k: "count", v: "n", i: 1 }]

Beispiel 3: Mit Name-Eigenschaft

<T>This product costs <Currency name="cost">{amount}</Currency></T>

Würde in GT JSX wie folgt dargestellt:

["This product costs ", { k: "cost", v: "c", i: 1 }]

Elemente

Elemente, die keine Variablen sind, werden mit der folgenden Datenstruktur dargestellt:

Beachten Sie, dass alle diese Attribute optional sind. Ein leeres Objekt würde ein übersetztes Element an derselben Position wie sein ursprüngliches Gegenstück darstellen, ohne übersetzbare Inhalte unter seinen Nachkommen. In der Praxis ist i immer enthalten.

type Element = {
    t?: string; // tag name
    c?: GTJSXTree | GTJSXTree[]; // children
    i?: number; // GT ID of the element
    d?: { // data-_gt prop
        b?: Record<string, GTJSXTree | GTJSXTree[]>; // branches
        t?: "p" | "b"; // branch transformation type (plural or branch)
        pl?: string; // placeholder
        ti?: string; // title
        alt?: string; // alt
        arl?: string; // aria-label
        arb?: string; // aria-labelledby
        ard?: string; // aria-describedby
        s?: Record<string, string>; // style
    }
}

Beispiel 1: Einfache Tags

<T>Hello, <b>world</b>!</T>

Würde in GT JSX wie folgt dargestellt:

["Hello, ", { c: "world", i: 1 }, "!"]

Beispiel 2: Verschachtelt, mit Variablen

<T><b>Hello</b>, my name is <i><Var>{name}</Var></i></T>

Würde in GT JSX wie folgt dargestellt:

[
    { t: "b", c: "Hello", i: 1 },
    ", my name is ",
    { 
        t: "i",
        c: { k: "_gt_var_3", i: 3 }, 
        i: 2 
    }
]

Beispiel 3: Mit Plural

<T>
    <Plural 
        n={count} 
        one={<>I have <Num>{count}</Num> item</>} 
        other={<>I have <Num>{count}</Num> items</>}
    />
</T>

Würde in GT JSX wie folgt dargestellt:

{ 
    i: 1,
    d: {
        t: "p",
        b: {
            one: {
                c: ["I have", { k: "_gt_num_4", v: "n", i: 3 }, "item"],
                i: 2 
            },
            other: {
                c: ["I have", { k: "_gt_num_4", v: "n", i: 3 }, "items"],
                i: 2 // note the same ID is used for parallel branches
            }
        }
    }
}

GTJSX Typ

type GTJSXTree = Element | Variable | string | (Element | Variable | string)[];

GT IDs

GT IDs werden Elementen und Variablen in einem JSX-Baum tiefenorientiert und sequenziell zugewiesen, beginnend bei 1.

Wenn es Verzweigungskomponenten wie <Branch> oder <Plural> gibt, werden dieselben GT IDs parallelen Zweigen zugewiesen. Dies geschieht, damit Elemente mit den richtigen Props und der richtigen Logik erstellt werden können, auch wenn es in einer Sprache mehr Zweige gibt als in einer anderen (z.B. Sprachen mit mehr Pluralformen).

GT JSX JSON Dateien

Jeder JSX Tree repräsentiert die Kinder einer <T> Komponente. Komponenten werden zusammen in Übersetzungs-JSON-Dateien gespeichert. Der Typ des JSON-Objekts, das in diesen Dateien gespeichert wird, entspricht:

type GTJSXFile = {
    [key: string]: GTJSXTree;
}

Wobei key entweder benutzerdefiniert ist oder der Hash des ursprünglichen GTJSXTree der Sprache, und GTJSXTree der Typ des oben beschriebenen GT JSX Trees ist.

Vollständiges Beispiel

Das geschriebene JSX:

<T>
    <b>Alice's</b> happy <i>customer</i>
</T>

Würde als folgender JSX Tree dargestellt:

[
    {
        type: "b",
        "props": {
            "children": "Alice's"
        }
    },
    " happy ",
    {
        type: "i",
        "props": {
            "children": "customer"
        }
    }
]

Dies würde zu GT JSX minimiert als:

[{ t: "b", c: "Alice's", i: 1 }, " happy ", { t: "i", c: "customer", i: 2 }]

Wenn es ins Spanische übersetzt wird, wäre das GT JSX:

[{ c: "El cliente", i: 2 }, " feliz ", { c: "de Alice", i: 1 }]

Es würde in einer Datei gespeichert, die so aussieht:

{ "abc123": [{ "c": "El cliente", "i": 2 }, " feliz ", { "c": "de Alice", "i": 1 }] }
abc123 ist der Hash des ursprünglichen englischen GT JSX Trees, nicht der spanischen Übersetzung.

Wenn die spanische Übersetzung mit dem ursprünglichen JSX Tree abgeglichen wird, würde folgendes produziert:

[
    {
        type: "i",
        "props": {
            "children": "El cliente"
        }
    },
    " feliz ",
    {
        type: "b",
        "props": {
            "children": "de Alice"
        }
    }
]

Was dann als die beabsichtigte UI angezeigt werden kann:

<><i>El cliente</i> feliz <b>de Alice</b></>

Hashes

Hashing-Algorithmus, Hash-Länge noch zu bestimmen

Hashes zur Laufzeit vermeiden

Um die Berechnung von Hashes zur Laufzeit zu vermeiden, haben die Bibliotheken einen optionalen Fallback-Mechanismus, bei dem der Benutzer eine ID angeben kann.

<T id="example">
    Hello, world
</T>

Wenn die ID in der Übersetzungs-JSON-Datei vorhanden ist, wird sie anstelle des Hashes verwendet.

{ "example": "Hello, world" }

Wie ist dieser Leitfaden?