[+] Japanese
This commit is contained in:
Vendored
+1
-1
@@ -4,7 +4,7 @@ declare global {
|
||||
namespace App {
|
||||
// interface Error {}
|
||||
interface Locals {
|
||||
lang: 'en' | 'zh'
|
||||
lang: 'en' | 'zh' | 'ja'
|
||||
}
|
||||
// interface PageData {}
|
||||
// interface PageState {}
|
||||
|
||||
+3
-1
@@ -5,7 +5,7 @@ checkAudioSeparator().catch(e => console.error('Audio separator check failed:',
|
||||
|
||||
export const handle: Handle = async ({ event, resolve }) => {
|
||||
const langCookie = event.cookies.get('lang');
|
||||
if (langCookie === 'zh' || langCookie === 'en') {
|
||||
if (langCookie === 'zh' || langCookie === 'en' || langCookie === 'ja') {
|
||||
event.locals.lang = langCookie;
|
||||
} else {
|
||||
const acceptLanguage = event.request.headers.get('accept-language');
|
||||
@@ -14,6 +14,8 @@ export const handle: Handle = async ({ event, resolve }) => {
|
||||
// For now, let's assume if 'zh' is in the header, the user likely understands Chinese.
|
||||
if (acceptLanguage && acceptLanguage.includes('zh')) {
|
||||
event.locals.lang = 'zh';
|
||||
} else if (acceptLanguage && acceptLanguage.includes('ja')) {
|
||||
event.locals.lang = 'ja';
|
||||
} else {
|
||||
event.locals.lang = 'en';
|
||||
}
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
import { getContext, setContext } from 'svelte'
|
||||
import EN from "./en"
|
||||
import ZH from "./zh"
|
||||
import JA from "./ja"
|
||||
|
||||
|
||||
// i18n related files:
|
||||
// src\hooks.server.ts
|
||||
// src\routes\+layout.server.ts
|
||||
|
||||
type Lang = 'en' | 'zh'
|
||||
type Lang = 'en' | 'zh' | 'ja'
|
||||
|
||||
const msgs: Record<Lang, typeof ZH> = {
|
||||
en: EN,
|
||||
zh: ZH
|
||||
zh: ZH,
|
||||
ja: JA
|
||||
}
|
||||
|
||||
const I18N_KEY = Symbol('i18n')
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
export default {
|
||||
home: {
|
||||
titles: {
|
||||
continue: '前回のセッションから続ける',
|
||||
history: '履歴',
|
||||
myPlaylists: 'マイプレイリスト',
|
||||
recPlaylists: 'おすすめプレイリスト'
|
||||
},
|
||||
btn: {
|
||||
importFromNetease: 'NetEaseからインポート'
|
||||
},
|
||||
text: {
|
||||
playlistCreatedBy: '{u} 作成'
|
||||
}
|
||||
},
|
||||
admin: {
|
||||
neteaseLogin: {
|
||||
title: 'NetEaseログイン',
|
||||
scanTitle: 'スキャンしてログイン',
|
||||
scanTip: 'NetEase Musicアプリでスキャンしてください',
|
||||
generating: 'QRコードを生成中...',
|
||||
scanned: 'スキャン完了',
|
||||
confirm: '携帯電話でログインを確認してください',
|
||||
success: 'ログイン成功',
|
||||
errorPrefix: 'エラー: '
|
||||
}
|
||||
},
|
||||
import: {
|
||||
netease: {
|
||||
title: 'NetEaseからインポート',
|
||||
status: {
|
||||
importing: 'インポート中',
|
||||
success: 'インポート完了',
|
||||
error: 'インポート失敗'
|
||||
},
|
||||
songs: '曲',
|
||||
tip: 'NetEase Musicアプリでお気に入りの日本語プレイリストを見つけ、共有をクリックし、リンクをコピーしてここに貼り付けると、インポートを開始できます!',
|
||||
inputLabel: 'NetEaseプレイリストリンク / ID',
|
||||
btnStart: 'インポート開始',
|
||||
btnView: 'プレイリストを表示'
|
||||
}
|
||||
},
|
||||
playlist: {
|
||||
detail: {
|
||||
title: 'プレイリスト詳細',
|
||||
creator: '作成者: ',
|
||||
count: '曲数: ',
|
||||
startPractice: '練習開始',
|
||||
songList: '曲リスト',
|
||||
songs: '曲'
|
||||
},
|
||||
list: {
|
||||
mine: 'マイプレイリスト',
|
||||
rec: 'おすすめプレイリスト',
|
||||
import: 'NetEaseからインポート',
|
||||
created: '{u} 作成',
|
||||
count: '{n} 曲'
|
||||
}
|
||||
},
|
||||
results: {
|
||||
title: '練習結果',
|
||||
fields: {
|
||||
speed: '速度',
|
||||
accuracy: '正確率',
|
||||
realtime: 'リアルタイム率',
|
||||
count: '文字数',
|
||||
time: '時間',
|
||||
duration: '曲の長さ'
|
||||
},
|
||||
units: {
|
||||
cpm: 'CPM',
|
||||
percent: '%',
|
||||
x: 'x',
|
||||
char: '文字'
|
||||
},
|
||||
chart: {
|
||||
speed: '速度 (CPM)',
|
||||
accuracy: '正確率 (%)'
|
||||
},
|
||||
btn: {
|
||||
next: '次の曲',
|
||||
back: 'プレイリストに戻る',
|
||||
retry: 'もう一度'
|
||||
}
|
||||
},
|
||||
song: {
|
||||
mode: {
|
||||
typing: 'タイピングモード',
|
||||
music: '音楽モード'
|
||||
},
|
||||
karaoke: {
|
||||
noVocals: 'ボーカル分離トラックが検出されないため、ボーカル音量を調整できません。まず曲の詳細ページで処理してください。'
|
||||
},
|
||||
play: {
|
||||
speed: '速度: ',
|
||||
accuracy: '正確率: ',
|
||||
stats: {
|
||||
right: '正解:',
|
||||
fuzzy: '曖昧:',
|
||||
wrong: '不正解:',
|
||||
remaining: '残り:'
|
||||
}
|
||||
}
|
||||
},
|
||||
user: {
|
||||
title: 'アカウント管理',
|
||||
loginSuccess: {
|
||||
title: 'ログイン成功',
|
||||
content: 'ログインに成功しました!',
|
||||
jump: '移動'
|
||||
},
|
||||
generateCode: {
|
||||
title: '引き継ぎコード生成',
|
||||
copy: 'コピー',
|
||||
success: '引き継ぎコードが生成されました!コードは:{code}',
|
||||
expiry: 'このコードは使用後、または未使用の場合は7日後に無効になります。'
|
||||
},
|
||||
desc: {
|
||||
intro: 'このアプリは日本のモバイルゲームのように引き継ぎコードシステムを使用しており、メールアドレスやパスワードの登録は不要です。',
|
||||
instruction: '別のデバイスでログインするには、「引き継ぎコード生成」をクリックし、ログインしたいデバイスで「ログイン」をクリックしてください。',
|
||||
loginMode: '現在は「引き継ぎログイン」ページです。別のデバイスで引き継ぎコードを取得し、下の入力欄に入力して「ログイン」をクリックしてください。'
|
||||
},
|
||||
input: '引き継ぎコードを入力',
|
||||
btn: {
|
||||
generate: '引き継ぎコード生成',
|
||||
loginWithCode: '引き継ぎコードでログイン',
|
||||
login: 'ログイン'
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user