All files / src/utils i18n.ts

0% Statements 0/4
0% Branches 0/3
0% Functions 0/2
0% Lines 0/4

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29                                                         
/**
 * @copyright nhcarrigan
 * @license Naomi's Public License
 * @author Naomi Carrigan
 */
 
import { responses } from "../i18n/responses.js";
 
/**
 * Translates a key to the specified locale, performing
 * interpolation on the string.
 * @param key -- The key to translate.
 * @param locale -- The user's locale.
 * @param interpolation -- An object of keys to replace with values.
 * @returns The translated string.
 */
export const i18n = (
  key: keyof (typeof responses)["en"],
  locale: string,
  interpolation: Record<string, unknown> = {},
): string => {
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- We know the en key exists, but having the loose type helps.
  const string = responses[locale]?.[key] ?? responses.en![key];
  // eslint-disable-next-line unicorn/no-array-reduce -- This is the cleanest way to do it, really.
  return Object.entries(interpolation).reduce((accumulator, [ k, v ]) => {
    return accumulator.replace(`{{${k}}}`, String(v));
  }, string);
};