logo hsb.horse
← Retour à l’index des snippets

Snippets

Store de hachage de messages à la compilation

Une fonction TypeScript qui hache et raccourcit les ID de messages et les contextes au moment de la compilation. Utile quand une plateforme cible restreint les clés de traduction autorisées.

Publié: Mis à jour:

Certaines plateformes de traduction imposent des restrictions sur le jeu de caractères ou la longueur des clés de traduction. Des ID comme user.profile.edit.title peuvent ne pas être acceptés tels quels. Hacher et raccourcir les ID à la compilation permet de contourner ces contraintes.

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 }
}

L’utilisation de l’API Web Crypto (crypto.subtle.digest) rend l’implémentation universelle — elle fonctionne dans les navigateurs, Node.js, Deno et Bun sans modification. Les valeurs valides pour alg sont 'SHA-1', 'SHA-256', 'SHA-384' et 'SHA-512'.

Fonctionnement

saveContext et saveMsgId retournent des hachages tout en mettant les résultats en cache dans une Map. Pour une même entrée, le hachage n’est calculé qu’une seule fois. Les contextes (espaces de noms) sont tronqués aux 7 premiers caractères, les ID de messages aux 10 premiers. Les contextes sont généralement moins nombreux et présentent un risque de collision plus faible, un préfixe plus court suffit donc.

Utilisation en pratique

À intégrer dans un plugin de build (plugin Vite, transformation de code personnalisée) pour remplacer les ID de messages dans le code source par leurs hachages. À l’exécution, la table de traduction est indexée par hachage plutôt que par la chaîne d’origine.

Pour changer l’algorithme de hachage, passer un alg différent à createHashStore. La longueur de troncature s’ajuste via l’argument de slice.