logo hsb.horse
← Zur Snippets-Übersicht

Snippets

Build-Zeit-Nachrichten-ID-Hash-Store

Eine TypeScript-Funktion, die Nachrichten-IDs und Kontexte zur Build-Zeit hasht und kürzt. Nützlich, wenn eine Zielplattform erlaubte Übersetzungsschlüssel einschränkt.

Veröffentlicht: Aktualisiert:

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.