diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2020-12-26 15:13:25 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2020-12-26 15:13:25 +0900 |
| commit | 84b488a91260fa982124e3c234839302df353038 (patch) | |
| tree | 70481cec7172b5fb0e451735f0b7b119da14a85c /src/server | |
| parent | Fix service worker generation (diff) | |
| download | misskey-84b488a91260fa982124e3c234839302df353038.tar.gz misskey-84b488a91260fa982124e3c234839302df353038.tar.bz2 misskey-84b488a91260fa982124e3c234839302df353038.zip | |
翻訳ファイルをランタイムで読み込み
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/web/boot.js | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/server/web/boot.js b/src/server/web/boot.js index 5eff81a3ec..8b1fd9a619 100644 --- a/src/server/web/boot.js +++ b/src/server/web/boot.js @@ -1,7 +1,8 @@ /** * BOOT LOADER * サーバーからレスポンスされるHTMLに埋め込まれるスクリプトで、以下の役割を持ちます。 - * - バージョンやユーザーの言語に基づいて適切なメインスクリプトを読み込む。 + * - 翻訳ファイルをフェッチする。 + * - バージョンに基づいて適切なメインスクリプトを読み込む。 * - キャッシュされたコンパイル済みテーマを適用する。 * - クライアントの設定値に基づいて対応するHTMLクラス等を設定する。 * テーマをこの段階で設定するのは、メインスクリプトが読み込まれる間もテーマを適用したいためです。 @@ -10,27 +11,34 @@ 'use strict'; -// ブロックの中に入れないと、定義した変数がブラウザのグローバルスコープに登録されてしまい邪魔 -{ - //#region Script +// ブロックの中に入れないと、定義した変数がブラウザのグローバルスコープに登録されてしまい邪魔なので +(async () => { + const v = localStorage.getItem('v') || VERSION; - //#region Detect language - const supportedLangs = LANGS; - let lang = localStorage.getItem('lang'); - if (lang == null || !supportedLangs.includes(lang)) { - if (supportedLangs.includes(navigator.language)) { - lang = navigator.language; - } else { - lang = supportedLangs.find(x => x.split('-')[0] === navigator.language); + //#region Detect language & fetch translations + if (localStorage.hasOwnProperty('locale')) { + // TODO: 非同期でlocaleの更新処理をする + } else { + const supportedLangs = LANGS; + let lang = localStorage.getItem('lang'); + if (lang == null || !supportedLangs.includes(lang)) { + if (supportedLangs.includes(navigator.language)) { + lang = navigator.language; + } else { + lang = supportedLangs.find(x => x.split('-')[0] === navigator.language); - // Fallback - if (lang == null) lang = 'en-US'; + // Fallback + if (lang == null) lang = 'en-US'; + } } + + const res = await fetch(`/assets/locales/${lang}.${v}.json`); + const json = await res.json(); + localStorage.setItem('locale', JSON.stringify(json)); } //#endregion - const ver = localStorage.getItem('v') || VERSION; - + //#region Script const salt = localStorage.getItem('salt') ? `?salt=${localStorage.getItem('salt')}` : ''; @@ -38,7 +46,7 @@ const head = document.getElementsByTagName('head')[0]; const script = document.createElement('script'); - script.setAttribute('src', `/assets/app.${ver}.${lang}.js${salt}`); + script.setAttribute('src', `/assets/app.${v}.js${salt}`); script.setAttribute('async', 'true'); script.setAttribute('defer', 'true'); head.appendChild(script); @@ -56,7 +64,7 @@ const meta = await res.json(); - if (meta.version != ver) { + if (meta.version != v) { localStorage.setItem('v', meta.version); alert( 'Misskeyの新しいバージョンがあります。ページを再度読み込みします。' + @@ -113,4 +121,4 @@ location.reload(); } -} +})(); |