update
This commit is contained in:
@@ -21,7 +21,7 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 确保默认语言在支持列表中,如果目录扫描失败则添加
|
// 确保默认语言在支持列表中,如果目录扫描失败则添加
|
||||||
export const defaultLng = 'en';
|
export const defaultLng = 'en-US'; // 更新为 en-US
|
||||||
if (!dynamicSupportedLngs.includes(defaultLng)) {
|
if (!dynamicSupportedLngs.includes(defaultLng)) {
|
||||||
dynamicSupportedLngs.push(defaultLng);
|
dynamicSupportedLngs.push(defaultLng);
|
||||||
console.warn(`[i18next] Default language '${defaultLng}' not found in detected directories, adding it to supported list.`);
|
console.warn(`[i18next] Default language '${defaultLng}' not found in detected directories, adding it to supported list.`);
|
||||||
|
|||||||
@@ -27,23 +27,37 @@ if (availableLocales.length === 0) {
|
|||||||
// 如果没有加载到文件,则使用空对象作为 fallback,避免运行时错误
|
// 如果没有加载到文件,则使用空对象作为 fallback,避免运行时错误
|
||||||
type MessageSchema = typeof messages[availableLocales[0]] | {};
|
type MessageSchema = typeof messages[availableLocales[0]] | {};
|
||||||
|
|
||||||
// 定义默认语言 (优先使用 'en',如果不存在则使用第一个找到的语言)
|
// 定义默认语言 (优先使用 'en-US',如果不存在则使用第一个找到的语言)
|
||||||
export const defaultLng = availableLocales.includes('en') ? 'en' : availableLocales[0] || 'en'; // 添加 'en' 作为最终 fallback
|
export const defaultLng = availableLocales.includes('en-US') ? 'en-US' : availableLocales[0] || 'en-US'; // 更新为 en-US
|
||||||
const localStorageKey = 'user-locale';
|
const localStorageKey = 'user-locale';
|
||||||
|
|
||||||
// 尝试从 localStorage 获取语言,否则回退
|
// 尝试从 localStorage 获取语言,否则回退
|
||||||
const getInitialLocale = (): string => {
|
const getInitialLocale = (): string => {
|
||||||
const storedLocale = localStorage.getItem(localStorageKey);
|
const storedLocale = localStorage.getItem(localStorageKey);
|
||||||
// 检查存储的 locale 是否在当前可用的语言列表中
|
// 1. 检查 localStorage 中存储的完整 locale 是否可用
|
||||||
if (storedLocale && availableLocales.includes(storedLocale)) {
|
if (storedLocale && availableLocales.includes(storedLocale)) {
|
||||||
|
console.log(`[i18n] Using locale from localStorage: ${storedLocale}`);
|
||||||
return storedLocale;
|
return storedLocale;
|
||||||
}
|
}
|
||||||
// 回退逻辑:检查浏览器语言是否可用
|
|
||||||
const navigatorLang = navigator.language?.split('-')[0];
|
// 2. 回退逻辑:检查浏览器提供的完整区域代码 (e.g., 'zh-CN') 是否可用
|
||||||
if (navigatorLang && availableLocales.includes(navigatorLang)) {
|
const navigatorLocale = navigator.language; // 获取完整代码,如 'zh-CN'
|
||||||
return navigatorLang;
|
if (navigatorLocale && availableLocales.includes(navigatorLocale)) {
|
||||||
|
console.log(`[i18n] Using locale from navigator.language: ${navigatorLocale}`);
|
||||||
|
return navigatorLocale;
|
||||||
}
|
}
|
||||||
// 最后回退到默认语言
|
|
||||||
|
// 3. (可选,但更健壮) 检查浏览器语言的主语言部分 (e.g., 'zh') 是否可用
|
||||||
|
// 这在只有 'zh-CN' 但浏览器是 'zh-TW' 时可能有用,如果想回退到 'en' 而不是 'zh-CN'
|
||||||
|
// 或者如果我们未来添加了通用的 'zh' 文件
|
||||||
|
const navigatorLangPart = navigatorLocale?.split('-')[0];
|
||||||
|
if (navigatorLangPart && availableLocales.includes(navigatorLangPart)) {
|
||||||
|
console.log(`[i18n] Using locale based on navigator language part: ${navigatorLangPart}`);
|
||||||
|
return navigatorLangPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 最后回退到默认语言
|
||||||
|
console.log(`[i18n] Falling back to default locale: ${defaultLng}`);
|
||||||
return defaultLng;
|
return defaultLng;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -628,8 +628,22 @@
|
|||||||
"error": {
|
"error": {
|
||||||
"saveFailed": "保存 CAPTCHA 设置失败。"
|
"saveFailed": "保存 CAPTCHA 设置失败。"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"commandInputSync": {
|
||||||
|
"title": "命令输入同步",
|
||||||
|
"selectLabel": "同步目标:",
|
||||||
|
"targetNone": "无",
|
||||||
|
"targetQuickCommands": "快捷指令",
|
||||||
|
"targetCommandHistory": "命令历史",
|
||||||
|
"description": "将命令输入栏的内容实时同步到所选面板的搜索框。",
|
||||||
|
"success": {
|
||||||
|
"saved": "同步目标已保存。"
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"saveFailed": "保存同步目标失败。"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
"loading": "加载中...",
|
"loading": "加载中...",
|
||||||
"cancel": "取消",
|
"cancel": "取消",
|
||||||
@@ -210,17 +210,23 @@ export const useSettingsStore = defineStore('settings', () => {
|
|||||||
// --- 语言设置 ---
|
// --- 语言设置 ---
|
||||||
const langFromSettings = settings.value.language;
|
const langFromSettings = settings.value.language;
|
||||||
console.log(`[SettingsStore] Language from fetched settings: ${langFromSettings}`); // <-- 添加日志
|
console.log(`[SettingsStore] Language from fetched settings: ${langFromSettings}`); // <-- 添加日志
|
||||||
// 检查从设置加载的语言是否在可用语言列表中
|
// 检查从设置加载的语言 (完整区域代码) 是否在可用语言列表中
|
||||||
if (langFromSettings && availableLocales.includes(langFromSettings)) {
|
if (langFromSettings && availableLocales.includes(langFromSettings)) {
|
||||||
determinedLang = langFromSettings;
|
determinedLang = langFromSettings;
|
||||||
} else {
|
} else {
|
||||||
// 如果设置中的语言无效或缺失,尝试浏览器语言
|
// 如果设置中的语言无效或缺失,尝试浏览器提供的完整区域代码
|
||||||
const navigatorLang = navigator.language?.split('-')[0];
|
const navigatorLocale = navigator.language;
|
||||||
if (navigatorLang && availableLocales.includes(navigatorLang)) {
|
if (navigatorLocale && availableLocales.includes(navigatorLocale)) {
|
||||||
determinedLang = navigatorLang;
|
determinedLang = navigatorLocale;
|
||||||
} else {
|
} else {
|
||||||
// 最后回退到 i18n 配置的默认语言
|
// (可选) 尝试浏览器语言的主语言部分
|
||||||
determinedLang = defaultLng;
|
const navigatorLangPart = navigatorLocale?.split('-')[0];
|
||||||
|
if (navigatorLangPart && availableLocales.includes(navigatorLangPart)) {
|
||||||
|
determinedLang = navigatorLangPart;
|
||||||
|
} else {
|
||||||
|
// 最后回退到 i18n 配置的默认语言
|
||||||
|
determinedLang = defaultLng;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
console.warn(`[SettingsStore] Invalid or missing language setting ('${langFromSettings}') received from backend. Falling back to '${determinedLang}'.`);
|
console.warn(`[SettingsStore] Invalid or missing language setting ('${langFromSettings}') received from backend. Falling back to '${determinedLang}'.`);
|
||||||
// Optionally save the fallback language back
|
// Optionally save the fallback language back
|
||||||
@@ -242,8 +248,15 @@ export const useSettingsStore = defineStore('settings', () => {
|
|||||||
error.value = err.response?.data?.message || err.message || 'Failed to load settings';
|
error.value = err.response?.data?.message || err.message || 'Failed to load settings';
|
||||||
// 出错时(例如未登录),根据浏览器语言设置回退语言
|
// 出错时(例如未登录),根据浏览器语言设置回退语言
|
||||||
const navigatorLang = navigator.language?.split('-')[0];
|
const navigatorLang = navigator.language?.split('-')[0];
|
||||||
// 错误时也检查浏览器语言是否可用
|
// 错误时也尝试浏览器完整区域代码,然后主语言部分,最后默认
|
||||||
const fallbackLang = (navigatorLang && availableLocales.includes(navigatorLang)) ? navigatorLang : defaultLng;
|
const navigatorLocale = navigator.language;
|
||||||
|
const navigatorLangPart = navigatorLocale?.split('-')[0];
|
||||||
|
let fallbackLang = defaultLng; // Start with default
|
||||||
|
if (navigatorLocale && availableLocales.includes(navigatorLocale)) {
|
||||||
|
fallbackLang = navigatorLocale;
|
||||||
|
} else if (navigatorLangPart && availableLocales.includes(navigatorLangPart)) {
|
||||||
|
fallbackLang = navigatorLangPart;
|
||||||
|
}
|
||||||
console.log(`[SettingsStore] Error loading settings. Falling back to language: ${fallbackLang}. Calling setLocale...`); // <-- 添加日志
|
console.log(`[SettingsStore] Error loading settings. Falling back to language: ${fallbackLang}. Calling setLocale...`); // <-- 添加日志
|
||||||
setLocale(fallbackLang);
|
setLocale(fallbackLang);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -466,6 +479,7 @@ export const useSettingsStore = defineStore('settings', () => {
|
|||||||
// 移除外观相关 actions: saveCustomThemes, resetCustomThemes, toggleStyleCustomizer
|
// 移除外观相关 actions: saveCustomThemes, resetCustomThemes, toggleStyleCustomizer
|
||||||
|
|
||||||
// --- Getters ---
|
// --- Getters ---
|
||||||
|
// Use defaultLng (which is now 'en-US' or the first available) from i18n.ts as the final fallback
|
||||||
const language = computed(() => settings.value.language || defaultLng);
|
const language = computed(() => settings.value.language || defaultLng);
|
||||||
|
|
||||||
// Getter for the popup editor setting, returning boolean
|
// Getter for the popup editor setting, returning boolean
|
||||||
|
|||||||
@@ -542,9 +542,9 @@ const ipWhitelistInput = ref('');
|
|||||||
const selectedLanguage = ref<string>(storeLanguage.value); // 改为 string 类型以支持动态语言
|
const selectedLanguage = ref<string>(storeLanguage.value); // 改为 string 类型以支持动态语言
|
||||||
// 可选:创建一个语言名称映射
|
// 可选:创建一个语言名称映射
|
||||||
const languageNames: Record<string, string> = {
|
const languageNames: Record<string, string> = {
|
||||||
en: 'English',
|
'en-US': 'English', // 更新为 en-US
|
||||||
zh: '中文',
|
'zh-CN': '中文',
|
||||||
jp: '日本語', // 添加日语或其他语言
|
'ja-JP': '日本語', // 更新为 ja-JP (如果您的文件名是 ja-JP.json)
|
||||||
// Add more languages here as needed
|
// Add more languages here as needed
|
||||||
};
|
};
|
||||||
const blacklistSettingsForm = reactive({ // Renamed to avoid conflict with store state name
|
const blacklistSettingsForm = reactive({ // Renamed to avoid conflict with store state name
|
||||||
|
|||||||
Reference in New Issue
Block a user