mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-01 10:22:08 +00:00
fix(i18n): address Monitor and CLI review feedback
This commit is contained in:
+12
-10
@@ -1,17 +1,19 @@
|
||||
import enMessages from "../messages/en/common.json"
|
||||
import skMessages from "../messages/sk/common.json"
|
||||
import { detectBrowserLanguage, LANGUAGE_STORAGE_KEY } from "./i18n/languages"
|
||||
import { MESSAGE_CATALOG } from "./i18n/catalogs"
|
||||
import { detectBrowserLanguage, isSupportedLanguage, LANGUAGE_STORAGE_KEY } from "./i18n/languages"
|
||||
|
||||
type Failure = keyof typeof enMessages.apiErrors
|
||||
type Failure = keyof (typeof import("../messages/en/common.json"))["apiErrors"]
|
||||
|
||||
// fetchApi also runs outside React hooks. Read the provider's current document
|
||||
// language, with its stored/browser preference as a fallback.
|
||||
export function apiFailure(key: Failure, params: Record<string, string | number> = {}): string {
|
||||
let language = typeof document === "undefined" ? "" : document.documentElement?.lang
|
||||
if (!language && typeof window !== "undefined") {
|
||||
try { language = window.localStorage.getItem(LANGUAGE_STORAGE_KEY) || "" } catch { /* private browsing */ }
|
||||
let preference = typeof document === "undefined" ? "" : document.documentElement?.lang
|
||||
if (!isSupportedLanguage(preference) && typeof window !== "undefined") {
|
||||
try { preference = window.localStorage.getItem(LANGUAGE_STORAGE_KEY) || "" } catch { /* private browsing */ }
|
||||
}
|
||||
language ||= detectBrowserLanguage()
|
||||
const messages = language === "sk" ? skMessages.apiErrors : enMessages.apiErrors
|
||||
return messages[key].replace(/\{(\w+)\}/g, (match, name) => params[name] === undefined ? match : String(params[name]))
|
||||
const language = isSupportedLanguage(preference) ? preference : detectBrowserLanguage()
|
||||
const messages = MESSAGE_CATALOG[language].apiErrors
|
||||
const localized = messages && typeof messages === "object" ? (messages as Record<string, unknown>)[key] : undefined
|
||||
const fallback = (MESSAGE_CATALOG.en.apiErrors as Record<Failure, string>)[key]
|
||||
const template = typeof localized === "string" ? localized : fallback
|
||||
return template.replace(/\{(\w+)\}/g, (match, name) => params[name] === undefined ? match : String(params[name]))
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import enMessages from "../../messages/en/common.json"
|
||||
import deMessages from "../../messages/de/common.json"
|
||||
import esMessages from "../../messages/es/common.json"
|
||||
import frMessages from "../../messages/fr/common.json"
|
||||
import itMessages from "../../messages/it/common.json"
|
||||
import ptMessages from "../../messages/pt/common.json"
|
||||
import skMessages from "../../messages/sk/common.json"
|
||||
import svMessages from "../../messages/sv/common.json"
|
||||
import type { LanguageCode } from "./languages"
|
||||
|
||||
type MessageTree = Record<string, unknown>
|
||||
|
||||
// Shared by React translations and error handling outside React hooks.
|
||||
export const MESSAGE_CATALOG: Record<LanguageCode, MessageTree> = {
|
||||
en: enMessages as MessageTree,
|
||||
de: deMessages as MessageTree,
|
||||
es: esMessages as MessageTree,
|
||||
fr: frMessages as MessageTree,
|
||||
it: itMessages as MessageTree,
|
||||
pt: ptMessages as MessageTree,
|
||||
sk: skMessages as MessageTree,
|
||||
sv: svMessages as MessageTree,
|
||||
}
|
||||
@@ -1,14 +1,7 @@
|
||||
"use client"
|
||||
|
||||
import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react"
|
||||
import enMessages from "../../messages/en/common.json"
|
||||
import deMessages from "../../messages/de/common.json"
|
||||
import esMessages from "../../messages/es/common.json"
|
||||
import frMessages from "../../messages/fr/common.json"
|
||||
import itMessages from "../../messages/it/common.json"
|
||||
import ptMessages from "../../messages/pt/common.json"
|
||||
import skMessages from "../../messages/sk/common.json"
|
||||
import svMessages from "../../messages/sv/common.json"
|
||||
import { MESSAGE_CATALOG } from "./catalogs"
|
||||
import {
|
||||
DEFAULT_LANGUAGE,
|
||||
LANGUAGE_STORAGE_KEY,
|
||||
@@ -21,17 +14,6 @@ import {
|
||||
type MessageTree = Record<string, unknown>
|
||||
type TranslationParams = Record<string, string | number>
|
||||
|
||||
const MESSAGE_CATALOG: Record<LanguageCode, MessageTree> = {
|
||||
en: enMessages as MessageTree,
|
||||
de: deMessages as MessageTree,
|
||||
es: esMessages as MessageTree,
|
||||
fr: frMessages as MessageTree,
|
||||
it: itMessages as MessageTree,
|
||||
pt: ptMessages as MessageTree,
|
||||
sk: skMessages as MessageTree,
|
||||
sv: svMessages as MessageTree,
|
||||
}
|
||||
|
||||
interface I18nContextValue {
|
||||
language: LanguageCode
|
||||
setLanguage: (language: LanguageCode) => void
|
||||
|
||||
Reference in New Issue
Block a user