このコミットが含まれているのは:
2026-10-18 01:09:31 +09:00
コミット 0c1f459d4e
13個のファイルの変更、133行の追加、89行の削除
+5 -7
ファイルの表示
@@ -87,10 +87,10 @@ export const getHelpArticle = async (identifier: string): Promise<ArticleMeta |
export const resolveHelpLanguage = ( export const resolveHelpLanguage = (
article: ArticleMeta | null | undefined, article: ArticleMeta | null | undefined,
requestedLanguage: string, requestedLanguage: string,
): string => ): string | null =>
article?.languages[requestedLanguage] != null article?.languages[requestedLanguage] != null
? requestedLanguage ? requestedLanguage
: article?.canonicalLanguage ?? 'ja' : null
export const getHelpEditions = async ( export const getHelpEditions = async (
@@ -155,8 +155,7 @@ export const getHelpSearchEntries = async (
language: string, language: string,
): Promise<HelpSearchEntry[]> => { ): Promise<HelpSearchEntry[]> => {
const { default: search } = await import ('virtual:help/search') const { default: search } = await import ('virtual:help/search')
const contentLanguage = search[language] != null ? language : 'ja' return (search[language] ?? []).map (entry => ({ ...entry, language }))
return (search[contentLanguage] ?? []).map (entry => ({ ...entry, language: contentLanguage }))
} }
@@ -175,14 +174,13 @@ export const getHelpEditionContent = async (
export const getHelpChanges = async (language: string): Promise<HelpChange[]> => { export const getHelpChanges = async (language: string): Promise<HelpChange[]> => {
const { default: changes } = await import ('virtual:help/changes') const { default: changes } = await import ('virtual:help/changes')
const contentLanguage = changes[language] != null ? language : 'ja' return (changes[language] ?? []).map (entry => ({ ...entry, language }))
return (changes[contentLanguage] ?? []).map (entry => ({ ...entry, language: contentLanguage }))
} }
export const getHelpTitleIndex = async (language: string): Promise<HelpTitleIndex> => { export const getHelpTitleIndex = async (language: string): Promise<HelpTitleIndex> => {
const { default: titles } = await import ('virtual:help/titles') const { default: titles } = await import ('virtual:help/titles')
return titles[language] ?? titles.ja ?? { } return titles[language] ?? { }
} }
+4
ファイルの表示
@@ -50,6 +50,8 @@ const prefetchHelpShow: Prefetcher = async (qc, url, locale) => {
queryFn: () => getHelpArticle (identifier), queryFn: () => getHelpArticle (identifier),
staleTime: Infinity }) staleTime: Infinity })
const language = resolveHelpLanguage (article, localeLanguage (locale)) const language = resolveHelpLanguage (article, localeLanguage (locale))
if (language == null)
return
const edition = url.searchParams.get ('edition') ?? article?.languages[language]?.currentEdition const edition = url.searchParams.get ('edition') ?? article?.languages[language]?.currentEdition
if (edition == null) if (edition == null)
return return
@@ -84,6 +86,8 @@ const prefetchHelpDiff: Prefetcher = async (qc, url, locale) => {
queryFn: () => getHelpArticle (identifier), queryFn: () => getHelpArticle (identifier),
staleTime: Infinity }) staleTime: Infinity })
const language = resolveHelpLanguage (article, localeLanguage (locale)) const language = resolveHelpLanguage (article, localeLanguage (locale))
if (language == null)
return
await qc.prefetchQuery ({ await qc.prefetchQuery ({
queryKey: helpKeys.diff (identifier, language, from, to), queryKey: helpKeys.diff (identifier, language, from, to),
queryFn: () => getHelpDiff (identifier, language, from, to), queryFn: () => getHelpDiff (identifier, language, from, to),
+1 -1
ファイルの表示
@@ -10,7 +10,7 @@
"meme": "MEME", "meme": "MEME",
"character": "イノカ", "character": "イノカ",
"general": "ウサ オルㇱペ", "general": "ウサ オルㇱペ",
"material": "チカㇻペ", "material": "アカㇻペ",
"meta": "タㇰ オルㇱペ タㇰ", "meta": "タㇰ オルㇱペ タㇰ",
"nico": "ニコニコ タㇰ" }, "nico": "ニコニコ タㇰ" },
"pagination": { "label": "ソㇱ", "pagination": { "label": "ソㇱ",
+17 -8
ファイルの表示
@@ -1,8 +1,17 @@
{ { "403": {
"_untranslated": ["*"], "message": "エエイワンケ エアイカㇷ゚",
"403": { "message": "権限ないよ(笑)", "right": "帰れ!", "left": "帰れ!" }, "right": "ホㇱピ ヤン!",
"404": { "message": "ページないよ(笑)", "right": "帰れ!", "left": "帰れ!" }, "left": "ホㇱピ ヤン!" },
"500": { "message": "鯖でエラー出たって(嘲笑)", "right": "管理人に", "left": "聯絡を!" }, "404": {
"503": { "message": "鯖死んでるよ(泣)", "right": "管理人に", "left": "聯絡を!" }, "message": "タン ソㇱ イサㇺ",
"imageAlt": "逃げたギター" "right": "ホㇱピ ヤン!",
} "left": "ホㇱピ ヤン!" },
"500": {
"message": "サーバー オㇿ ハイタ アン",
"right": "カンリニン ウン",
"left": "エイェ ヤン!" },
"503": {
"message": "サーバー アㇱカイ ソモ キ",
"right": "カンリニン ウン",
"left": "エイェ ヤン!" },
"imageAlt": "キタ イクヨ" }
+7 -6
ファイルの表示
@@ -1,6 +1,7 @@
{ { "title": "ヤイカオパㇱ",
"_untranslated": ["*"], "search": "ヤイカオパㇱ イフナラ",
"title": "ヘルプ", "search": "ヘルプ検索", "history": "ヘルプ改定履歴", "history": "ヤイカオパㇱ アシㇼ カㇻ フㇱコアンペ",
"effectiveSince": "有効開始年月日", "empty": "該当する記事がありません.", "effectiveSince": "アㇱカイ ヘㇻパ ト",
"diffTitle": "ヘルプ 差分: {{title}}", "articleTitle": "{{title}} ヘルプ" "empty": "イフナラ ワ ネ ペ イサㇺ。",
} "diffTitle": "ヤイカオパㇱ ウシンナイペ:{{title}}",
"articleTitle": "{{title}} ヤイカオパㇱ" }
+7 -7
ファイルの表示
@@ -1,7 +1,7 @@
{ { "status": {
"_untranslated": ["*"], "ready": "アオ エアㇱカイ",
"status": { "error": "アオ エアイカㇷ゚",
"ready": "登録可能", "error": "登録不可", "warning": "警告", "warning": "イパㇰカㇱヌ",
"skipped": "スキップ", "created": "登録済み", "failed": "登録失敗" "skipped": "スキップ",
} "created": "アオ オケレ",
} "failed": "アオ カ エアイカㇷ゚" } }
+58 -28
ファイルの表示
@@ -1,30 +1,60 @@
{ { "labels": {
"_untranslated": ["*"], "title": "レ",
"labels": { "content": "オルㇱペ",
"title": "タイトル", "content": "内容", "body": "本文", "body": "ヌイェㇷ゚",
"lastUpdated": "最終更新", "thumbnail": "サムネール", "lastUpdated": "イヨッタ アシㇼ アカㇻ ト",
"noThumbnail": "サムネイルなし", "thumbnailMissing": "サムネールなし", "thumbnail": "ポン ノカ",
"parentPosts": "親投稿", "duration": "動画時間", "platform": "プラットフォーム", "noThumbnail": "ポン ノカ イサㇺ",
"code": "コード", "information": "情報", "relations": "関聯", "thumbnailMissing": "ポン ノカ イサㇺ",
"uploadedBy": "耕作者: ", "uploadedAt": "耕作日時: ", "link": "リンク: ", "parentPosts": "オナ アオ ペ",
"originalPostedAt": "オリジナルの投稿日時: ", "originalCreatedAt": "オリジナルの作成日時", "duration": "チモイェノカ トキ",
"brand": "ぼざクリ タグ広場", "since": "以降", "before": "より前", "platform": "プラットフォーム",
"tagSearch": "タグ検索...", "hideTags": "▲▲▲ タグ一覧を閉じる ▲▲▲", "code": "コード",
"showTags": "▼▼▼ タグ一覧を表示 ▼▼▼", "information": "アスㇽソㇱ",
"resultsCount": "{{count}} 件", "menu": "メニュー", "anonymous": "名もなきニジラー", "relations": "ウコテㇷ゚",
"bot": "bot操作", "deprecatedSuffix": "(廃止)", "development": "開発モード" "uploadedBy": "カㇻ クㇽ:",
}, "uploadedAt": "アカㇻ ト:",
"link": "ウコテㇷ゚:",
"originalPostedAt": "ホㇱキ アオ ト:",
"originalCreatedAt": "ホㇱキ アカㇻ ト:",
"brand": "ポチ チャ ロㇰ シクヌㇷ゚ イキㇼ チセ",
"since": "オㇿ ワノ",
"before": "エトコ ウン",
"tagSearch": "タㇰ イフナラ…",
"hideTags": "▲▲▲ タㇰ ソモ ヌカㇻ ▲▲▲",
"showTags": "▼▼▼ タㇰ ヌカㇻ ▼▼▼",
"resultsCount": "{{count}} ペ",
"menu": "メニュー",
"anonymous": "レサㇰ ユㇰ ニチカ ウタㇻ",
"bot": "bot カㇻ",
"deprecatedSuffix": "(エイワンケ ソモ エアㇱカイ)",
"development": "カㇻ コㇿ アン シㇼキ" },
"actions": { "actions": {
"update": "更新", "edit": "編輯", "add": "追加", "reset": "リセット", "update": "アシㇼ カㇻ",
"cancel": "取消", "retry": "再試行", "skip": "スキップ", "random": "ランダム", "edit": "イヌイェㇷ゚",
"old": "< 古", "new": "新 >", "oldest": "(最古)", "latest": "(最新)", "add": "アオ",
"diff": "差分", "restore": "復元", "show": "表示" "reset": "ホㇱキ シㇼ ウン ホㇱピ",
}, "cancel": "ソモ キ",
"retry": "スイ キ",
"skip": "スキップ",
"random": "ランダム",
"old": "< フㇱコ",
"new": "アシㇼ >",
"oldest": "(イヨッタ フㇱコ)",
"latest": "(イヨッタ アシㇼ)",
"diff": "ウシンナイペ",
"restore": "ホㇱピ",
"show": "ヌカㇻ" },
"messages": { "messages": {
"loading": "読み込み中...", "loadingEllipsis": "読込中……", "loading": "アウㇰ コㇿ アン…",
"updated": "更新しました.", "updateFailed": "更新失敗", "failed": "失敗……", "loadingEllipsis": "アウㇰ コㇿ アン……",
"checkInput": "入力を確認してください.", "checkInputModern": "入力を確認してください。", "updated": "アシㇼ アカㇻ!",
"checkInputContent": "入力内容を確認してください.", "reviewInput": "入力を見直してください.", "updateFailed": "アシㇼ カㇻ カ エアイカㇷ゚",
"postSuccess": "投稿成功!", "postFailed": "投稿失敗", "resetChanges": "変更をリセットしますか?" "failed": "エアイカㇷ゚……",
} "checkInput": "エヌイェㇷ゚ エヌカㇻ ヤン!",
} "checkInputModern": "エヌイェㇷ゚ エヌカㇻ ヤン。",
"checkInputContent": "エヌイェ オルㇱペ エヌカㇻ ヤン!",
"reviewInput": "エヌイェㇷ゚ スイ エヌカㇻ ヤン!",
"postSuccess": "アオ オケレ!",
"postFailed": "アオ カ エアイカㇷ゚",
"resetChanges": "エヌイェㇷ゚ ホㇱキ シㇼ ウン ホㇱピ ヤ?" } }
+10 -12
ファイルの表示
@@ -1,13 +1,11 @@
{ "_untranslated": ["name", "postCount", "firstRecordedAt", "definitionUpdatedAt", "aliases", { "title": "タㇰ",
"parents", "firstRecordedColumn", "updatedAt", "empty"], "name": "レ",
"title": "タㇰ", "postCount": "ミンタㇻ アオ ペ チピㇱキㇷ゚",
"name": "名前", "firstRecordedAt": "ホㇱキ アヌイェ ト ヘㇺ トキ",
"postCount": "広場の投稿数", "definitionUpdatedAt": "イタㇰ アシㇼ アカㇻ ト ヘㇺ トキ",
"firstRecordedAt": "はじめて記載された日時", "aliases": "モㇱマ レ",
"definitionUpdatedAt": "定義の更新日時", "parents": "サパ タㇰ",
"aliases": "別名", "firstRecordedColumn": "ホㇱキ アヌイェ ト",
"parents": "上位タグ", "updatedAt": "アシㇼ アカㇻ ト",
"firstRecordedColumn": "最初の記載日時",
"updatedAt": "更新日時",
"history": "フㇱコアンペ", "history": "フㇱコアンペ",
"empty": "結果ないよ(笑)" } "empty": "イフナラ ワ ネ ペ イサㇺ" }
+8 -9
ファイルの表示
@@ -1,9 +1,8 @@
{ { "newPage": "アシㇼ ウィキ ソㇱ",
"_untranslated": ["*"], "editPage": "ウィキ ソㇱ イヌイェㇷ゚",
"newPage": "新規 Wiki ページ", "history": "ウィキ アシㇼ カㇻ フㇱコアンペ",
"editPage": "Wiki ページを編輯", "historyHeading": "ウィキ フㇱコアンペ",
"history": "Wiki 変更履歴", "change": "アシㇼ カㇻ",
"historyHeading": "Wiki 履歴", "change": "変更", "dateTime": "日時", "dateTime": "ト ヘㇺ トキ",
"diffTitle": "Wiki 差分: {{title}}", "diffTitle": "ウィキ ウシンナイペ:{{title}}",
"missingPage": "このページは存在しません。[新規作成してください]({{url}})。" "missingPage": "タン ソㇱ イサㇺ。[アシㇼ カㇻ ヤン]({{url}})。" }
}
+1
ファイルの表示
@@ -34,6 +34,7 @@ const HelpChangesPage: FC = () => {
const { data: changes = [], isLoading, error } = useQuery ({ const { data: changes = [], isLoading, error } = useQuery ({
queryKey: helpKeys.changes (language), queryKey: helpKeys.changes (language),
queryFn: () => getHelpChanges (language), queryFn: () => getHelpChanges (language),
select: entries => entries.filter (entry => entry.language === language),
staleTime: Infinity }) staleTime: Infinity })
const results = useMemo (() => identifier const results = useMemo (() => identifier
+6 -5
ファイルの表示
@@ -31,12 +31,13 @@ const HelpDetailPage: FC = () => {
queryFn: () => getHelpArticle (identifier), queryFn: () => getHelpArticle (identifier),
staleTime: Infinity }) staleTime: Infinity })
const language = resolveHelpLanguage (article, localeLanguage (locale)) const requestedLanguage = localeLanguage (locale)
const language = resolveHelpLanguage (article, requestedLanguage)
const query = new URLSearchParams (location.search) const query = new URLSearchParams (location.search)
const requestedEdition = query.get ('edition') const requestedEdition = query.get ('edition')
const languageMeta = article?.languages[language] const languageMeta = language == null ? null : article?.languages[language]
const edition = requestedEdition ?? languageMeta?.currentEdition const edition = requestedEdition ?? languageMeta?.currentEdition
const editionInfo = parseHelpEdition (edition ?? '') const editionInfo = parseHelpEdition (edition ?? '')
@@ -53,8 +54,8 @@ const HelpDetailPage: FC = () => {
const { data: current, isSuccess, isError } = useQuery ({ const { data: current, isSuccess, isError } = useQuery ({
enabled: edition != null && editionInfo != null && editions.includes (edition), enabled: edition != null && editionInfo != null && editions.includes (edition),
queryKey: helpKeys.edition (identifier, language, edition ?? ''), queryKey: helpKeys.edition (identifier, requestedLanguage, edition ?? ''),
queryFn: () => getHelpEditionContent (identifier, language, edition ?? ''), queryFn: () => getHelpEditionContent (identifier, requestedLanguage, edition ?? ''),
staleTime: Infinity }) staleTime: Infinity })
if (!articleLoading if (!articleLoading
@@ -103,7 +104,7 @@ const HelpDetailPage: FC = () => {
: label ('shared:actions.latest')} : label ('shared:actions.latest')}
</div>)} </div>)}
<article lang={language} className="prose dark:prose-invert mx-auto p-4"> <article lang={requestedLanguage} className="prose dark:prose-invert mx-auto p-4">
{Content ? <Content/> : <div>{label ('common:loading')}</div>} {Content ? <Content/> : <div>{label ('common:loading')}</div>}
</article> </article>
</MainArea>) </MainArea>)
+8 -6
ファイルの表示
@@ -30,17 +30,19 @@ const HelpDiffPage: FC = () => {
queryKey: helpKeys.article (identifier), queryKey: helpKeys.article (identifier),
queryFn: () => getHelpArticle (identifier), queryFn: () => getHelpArticle (identifier),
staleTime: Infinity }) staleTime: Infinity })
const language = resolveHelpLanguage (article, localeLanguage (locale)) const requestedLanguage = localeLanguage (locale)
const language = resolveHelpLanguage (article, requestedLanguage)
const validParams = Boolean (identifier && from && to) const validParams = Boolean (identifier && from && to)
&& searchParams.getAll ('from').length === 1 && searchParams.getAll ('from').length === 1
&& searchParams.getAll ('to').length === 1 && searchParams.getAll ('to').length === 1
const { data: diff, isLoading, isError } = useQuery ({ const { data: diff, isLoading, isError } = useQuery ({
enabled: validParams && article != null, enabled: validParams && language != null,
queryKey: helpKeys.diff (identifier, language, from, to), queryKey: helpKeys.diff (identifier, requestedLanguage, from, to),
queryFn: () => getHelpDiff (identifier, language, from, to), queryFn: () => getHelpDiff (identifier, requestedLanguage, from, to),
staleTime: Infinity }) staleTime: Infinity })
if (!(validParams) || isError || (!(isLoading) && diff == null)) if (!(validParams) || (article != null && language == null)
|| isError || (!(isLoading) && diff == null))
return <NotFound/> return <NotFound/>
const title = `${ diff?.to.title ?? identifier } (${ from } → ${ to })` const title = `${ diff?.to.title ?? identifier } (${ from } → ${ to })`
@@ -65,7 +67,7 @@ const HelpDiffPage: FC = () => {
{diff.to.title} ({to}) {diff.to.title} ({to})
</PrefetchLink> </PrefetchLink>
</div> </div>
<pre lang={language} className="mt-4 overflow-x-auto whitespace-pre"> <pre lang={requestedLanguage} className="mt-4 overflow-x-auto whitespace-pre">
<code> <code>
{diff.lines.map ((line, index) => { {diff.lines.map ((line, index) => {
const colour = cn ( const colour = cn (
+1
ファイルの表示
@@ -56,6 +56,7 @@ const HelpSearchPage: FC = () => {
const { data: entries = [], isLoading: loading, error } = useQuery ({ const { data: entries = [], isLoading: loading, error } = useQuery ({
queryKey: helpKeys.index (language), queryKey: helpKeys.index (language),
queryFn: () => getHelpSearchEntries (language), queryFn: () => getHelpSearchEntries (language),
select: entries => entries.filter (entry => entry.language === language),
staleTime: Infinity }) staleTime: Infinity })
useEffect (() => { useEffect (() => {