diff --git a/README.md b/README.md index 2505564c..d0e78aeb 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,11 @@ RedhairHambagu
RedhairHambagu

🔧 🐛 + + Allen
Allen

🔧 🐛 + + + diff --git a/lib/lang.js b/lib/lang.js index c56d2c7d..83f867b3 100644 --- a/lib/lang.js +++ b/lib/lang.js @@ -4,47 +4,58 @@ import zhHK from './lang/zh-HK' import zhTW from './lang/zh-TW' import frFR from './lang/fr-FR' import trTR from './lang/tr-TR' +import jaJP from './lang/ja-JP' import cookie from 'react-cookies' import { getQueryVariable, isBrowser, mergeDeep } from './utils' +/** + * 在这里配置所有支持的语言 + * 国家-地区 + */ const lang = { 'en-US': enUS, 'zh-CN': zhCN, 'zh-HK': zhHK, 'zh-TW': zhTW, 'fr-FR': frFR, - 'tr-TR': trTR + 'tr-TR': trTR, + 'ja-JP': jaJP } export default lang /** * 获取当前语言字典 + * 如果匹配到完整的“国家-地区”语言,则显示国家的语言 * @returns 不同语言对应字典 */ export function generateLocaleDict(langString) { - let userLocale = lang['en-US'] + const supportedLocales = Object.keys(lang) + let userLocale - switch (langString.toLowerCase()) { - case 'zh-cn': - case 'zh-sg': - userLocale = lang['zh-CN'] - break - case 'zh-hk': - userLocale = lang['zh-HK'] - break - case 'zh-tw': - userLocale = lang['zh-TW'] - break - case 'fr-fr': - userLocale = lang['fr-FR'] - break - case 'tr-tr': - userLocale = lang['tr-TR'] - break - default: - userLocale = lang['en-US'] + // 将语言字符串拆分为语言和地区代码,例如将 "zh-CN" 拆分为 "zh" 和 "CN" + const [language, region] = langString.split(/[-_]/) + + // 优先匹配语言和地区都匹配的情况 + const specificLocale = `${language}-${region}` + if (supportedLocales.includes(specificLocale)) { + userLocale = lang[specificLocale] } + + // 然后尝试匹配只有语言匹配的情况 + if (!userLocale) { + const languageOnlyLocales = supportedLocales.filter(locale => locale.startsWith(language)) + if (languageOnlyLocales.length > 0) { + userLocale = lang[languageOnlyLocales[0]] + } + } + + // 如果还没匹配到,则返回最接近的语言包 + if (!userLocale) { + const fallbackLocale = supportedLocales.find(locale => locale.startsWith('en')) + userLocale = lang[fallbackLocale] + } + return mergeDeep({}, lang['en-US'], userLocale) } diff --git a/lib/lang/ja-JP.js b/lib/lang/ja-JP.js new file mode 100644 index 00000000..ab0e81f8 --- /dev/null +++ b/lib/lang/ja-JP.js @@ -0,0 +1,59 @@ +export default { + LOCALE: 'ja-JP', + NAV: { + INDEX: 'ホーム', + RSS: '購読', + SEARCH: '検索', + ABOUT: 'このサイトについて', + NAVIGATOR: 'ナビゲーション', + MAIL: 'メール', + ARCHIVE: 'アーカイブ' + }, + COMMON: { + MORE: 'さらに', + NO_MORE: 'それ以上ありません', + LATEST_POSTS: '最新の記事', + TAGS: 'タグ', + NO_TAG: 'タグなし', + CATEGORY: 'カテゴリ', + SHARE: 'シェア', + SCAN_QR_CODE: 'WeChatで共有', + URL_COPIED: 'リンクがコピーされました!', + TABLE_OF_CONTENTS: '目次', + RELATE_POSTS: '関連する記事', + COPYRIGHT: '免責事項', + AUTHOR: '作成者', + URL: 'リンク', + ANALYTICS: '統計', + POSTS: '記事', + ARTICLE: '記事', + VISITORS: '人の訪問者', + VIEWS: '回の閲覧', + COPYRIGHT_NOTICE: 'この記事はCC BY-NC-SA 4.0 ライセンスの下でライセンスされています。転載する場合には出典を明らかにしてください。', + RESULT_OF_SEARCH: '個の検索結果', + ARTICLE_DETAIL: '記事の詳細', + PASSWORD_ERROR: 'パスワードが違います!', + ARTICLE_LOCK_TIPS: 'この記事はロックされています。アクセスパスワードを入力してください。', + SUBMIT: '送信', + POST_TIME: '公開日', + LAST_EDITED_TIME: '最終更新日', + RECENT_COMMENTS: '最近のコメント', + DEBUG_OPEN: 'デバッグをオンにする', + DEBUG_CLOSE: 'デバッグをオフにする', + THEME_SWITCH: 'テーマの切り替え', + ANNOUNCEMENT: 'お知らせ', + START_READING: '読み始める' + }, + PAGINATION: { + PREV: '前のページ', + NEXT: '次のページ' + }, + SEARCH: { + ARTICLES: '記事を検索', + TAGS: 'タグを検索' + }, + POST: { + BACK: '前のページに戻る', + TOP: '上に戻る' + } +}