Manche Übersetzungsplattformen schränken den Zeichensatz oder die Länge von Übersetzungsschlüsseln ein. IDs wie user.profile.edit.title werden dabei möglicherweise nicht akzeptiert. Durch das Hashen und Kürzen von IDs zur Build-Zeit lassen sich diese Einschränkungen umgehen.
Code
function toHex(buffer: ArrayBuffer): string { return [...new Uint8Array(buffer)] .map((b) => b.toString(16).padStart(2, '0')) .join('')}
export function createHashStore(alg: string = 'SHA-256') { const contextHash = new Map<string, string>() const msgIdHash = new Map<string, string>()
async function digestContext(context: string): Promise<string> { const data = new TextEncoder().encode(context) const buf = await crypto.subtle.digest(alg, data) return toHex(buf).slice(0, 7) }
async function digestMsgId(msgId: string): Promise<string> { const data = new TextEncoder().encode(msgId) const buf = await crypto.subtle.digest(alg, data) return toHex(buf).slice(0, 10) }
async function saveContext(context: string): Promise<string> { const cached = contextHash.get(context) if (cached) return cached const hash = await digestContext(context) contextHash.set(context, hash) return hash }
async function saveMsgId(msgId: string): Promise<string> { const cached = msgIdHash.get(msgId) if (cached) return cached const hash = await digestMsgId(msgId) msgIdHash.set(msgId, hash) return hash }
return { contextHash, msgIdHash, saveContext, saveMsgId }}Die Web Crypto API (crypto.subtle.digest) macht die Implementierung universell — sie läuft in Browsern, Node.js, Deno und Bun ohne Anpassung. Gültige Werte für alg sind 'SHA-1', 'SHA-256', 'SHA-384' und 'SHA-512'.
Funktionsweise
saveContext und saveMsgId geben Hashes zurück und cachen die Ergebnisse in einer Map. Für dieselbe Eingabe wird der Hash nur einmal berechnet. Kontexte (Namespaces) werden auf die ersten 7 Zeichen gekürzt, Nachrichten-IDs auf 10. Kontexte sind in der Regel weniger zahlreich und haben ein geringeres Kollisionsrisiko, daher reicht ein kürzerer Prefix.
Einsatz in der Praxis
In ein Build-Plugin (Vite-Plugin, eigene Code-Transformation) einbinden, um Nachrichten-IDs im Quellcode durch ihre Hashes zu ersetzen. Zur Laufzeit wird die Übersetzungstabelle anhand des Hashes statt der ursprünglichen Zeichenkette abgefragt.
Den Hashing-Algorithmus ändert man durch Übergabe eines anderen alg-Werts an createHashStore. Die Kürzungslänge lässt sich über das Argument von slice anpassen.
hsb.horse