* chore(dev): add local setup state reset target - add a reset-setup make target to clear setup records, root users, and related options. - support both docker dev PostgreSQL and local SQLite development databases. - restart the docker dev backend so setup status is recalculated after reset. * fix(chat): prevent preset menu text overflow - add truncation layout for chat preset names to keep long labels inside the sidebar menu. - prevent loading and external-link icons from shrinking in constrained menu rows. * fix(i18n): translate dashboard granularity options - call t() for granularity option labels in dashboard system settings. - keep localized text consistent between the select trigger and dropdown items. * chore(dev): add backend dev service rebuild target - add a dev-api-rebuild make target to rebuild and start the docker backend service. - reuse DEV_COMPOSE_FILE and DEV_BACKEND_SERVICE variables to avoid repeated compose config literals. * fix(i18n): align interface language option labels - add shared interface language options to keep display names consistent. - reuse the shared options in the header switcher and profile preferences. - normalize language codes so zh-CN and zh_CN resolve to Simplified Chinese. * fix(i18n): add missing frontend translation keys - route channel key prompts, form validation messages, and channel fallback text through i18n. - add missing translations across six locales for channels, rankings, billing, and logs. - update i18n sync reports so literal t() keys are present in the base locale.
42 lines
1.4 KiB
TypeScript
Vendored
42 lines
1.4 KiB
TypeScript
Vendored
/*
|
|
Copyright (C) 2023-2026 QuantumNous
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as
|
|
published by the Free Software Foundation, either version 3 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
For commercial licensing, please contact support@quantumnous.com
|
|
*/
|
|
|
|
export const INTERFACE_LANGUAGE_OPTIONS = [
|
|
{ code: 'zh', label: '简体中文' },
|
|
{ code: 'en', label: 'English' },
|
|
{ code: 'fr', label: 'Français' },
|
|
{ code: 'ru', label: 'Русский' },
|
|
{ code: 'ja', label: '日本語' },
|
|
{ code: 'vi', label: 'Tiếng Việt' },
|
|
] as const
|
|
|
|
export type InterfaceLanguageCode =
|
|
(typeof INTERFACE_LANGUAGE_OPTIONS)[number]['code']
|
|
|
|
export function normalizeInterfaceLanguage(value?: string | null): string {
|
|
if (!value) return 'en'
|
|
|
|
const normalized = value.trim().replace(/_/g, '-').toLowerCase()
|
|
if (normalized.startsWith('zh')) return 'zh'
|
|
|
|
return INTERFACE_LANGUAGE_OPTIONS.some((lang) => lang.code === normalized)
|
|
? normalized
|
|
: 'en'
|
|
}
|