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

RedhairHambagu
🔧 🐛
+
+  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: '上に戻る'
+ }
+}