From 63860c94af05f91b6a0dea6f60188257ef1ad27d Mon Sep 17 00:00:00 2001 From: miteruzo Date: Sun, 18 Oct 2026 00:07:07 +0900 Subject: [PATCH] #428 --- frontend/src/components/SortHeader.tsx | 4 +- frontend/src/components/TagLink.tsx | 14 ++- frontend/src/components/TranslatedText.tsx | 13 +- frontend/src/components/common/Pagination.tsx | 18 ++- frontend/src/lib/i18n.ts | 42 ++++++- frontend/src/lib/useUITranslation.ts | 16 +++ frontend/src/lib/utils.ts | 20 +++ frontend/src/locales/ain-Kana/common.json | 38 ++++++ frontend/src/locales/ain-Kana/tags.json | 17 +++ frontend/src/locales/ja/common.json | 33 +++++ frontend/src/locales/ja/tags.json | 13 ++ frontend/src/pages/tags/TagListPage.tsx | 118 +++++++++++------- 12 files changed, 280 insertions(+), 66 deletions(-) create mode 100644 frontend/src/lib/useUITranslation.ts create mode 100644 frontend/src/locales/ain-Kana/common.json create mode 100644 frontend/src/locales/ain-Kana/tags.json create mode 100644 frontend/src/locales/ja/common.json create mode 100644 frontend/src/locales/ja/tags.json diff --git a/frontend/src/components/SortHeader.tsx b/frontend/src/components/SortHeader.tsx index 35239af..2a9bf3f 100644 --- a/frontend/src/components/SortHeader.tsx +++ b/frontend/src/components/SortHeader.tsx @@ -2,10 +2,12 @@ import { useLocation } from 'react-router-dom' import PrefetchLink from '@/components/PrefetchLink' +import type { ReactNode } from 'react' + export default ({ by, label, currentOrder, defaultDirection }: { by: T - label: string + label: ReactNode currentOrder: `${ T }:${ 'asc' | 'desc' }` defaultDirection: Record }) => { const [fld, dir] = currentOrder.split (':') diff --git a/frontend/src/components/TagLink.tsx b/frontend/src/components/TagLink.tsx index 04328c2..cded9f3 100644 --- a/frontend/src/components/TagLink.tsx +++ b/frontend/src/components/TagLink.tsx @@ -1,5 +1,6 @@ import PrefetchLink from '@/components/PrefetchLink' import ResponsiveMarqueeText from '@/components/ResponsiveMarqueeText' +import { useUITranslation } from '@/lib/useUITranslation' import { cn } from '@/lib/utils' import type { ComponentProps, CSSProperties, FC, HTMLAttributes } from 'react' @@ -67,6 +68,10 @@ const TagLink: FC = ({ tag, style, title, ...props }) => { + const { message } = useUITranslation () + const missingMaterial = message ('tagLink.missingMaterial', { name: tag.name }) + const missingDeerjikist = message ('tagLink.missingDeerjikist', { name: tag.name }) + const missingWiki = message ('tagLink.missingWiki', { name: tag.name }) const colourStyle = { '--tag-link-colour': `var(--tag-colour-${ tag.category })`, '--tag-link-hover-colour': `var(--tag-colour-${ tag.category }-hover)`, @@ -121,7 +126,8 @@ const TagLink: FC = ({ tag, to={`/materials/new?tag=${ encodeURIComponent (tag.name) }`} className="animate-[wiki-blink_.25s_steps(2,end)_infinite] dark:animate-[wiki-blink-dark_.25s_steps(2,end)_infinite]" - title={`${ tag.name } 素材情報が存在しません.`}> + lang={missingMaterial.language} + title={missingMaterial.text}> ! ) : ( @@ -131,7 +137,8 @@ const TagLink: FC = ({ tag, to={`/tags/${ tag.id }/deerjikists`} className="animate-[wiki-blink_.25s_steps(2,end)_infinite] dark:animate-[wiki-blink-dark_.25s_steps(2,end)_infinite]" - title={`${ tag.name } に関する情報が存在しません.`}> + lang={missingDeerjikist.language} + title={missingDeerjikist.text}> ! ) : ( @@ -139,7 +146,8 @@ const TagLink: FC = ({ tag, to={`/wiki/${ encodeURIComponent (tag.name) }`} className="animate-[wiki-blink_.25s_steps(2,end)_infinite] dark:animate-[wiki-blink-dark_.25s_steps(2,end)_infinite]" - title={`${ tag.name } Wiki が存在しません.`}> + lang={missingWiki.language} + title={missingWiki.text}> ! )))} )} diff --git a/frontend/src/components/TranslatedText.tsx b/frontend/src/components/TranslatedText.tsx index 1b1303e..2942c04 100644 --- a/frontend/src/components/TranslatedText.tsx +++ b/frontend/src/components/TranslatedText.tsx @@ -1,7 +1,5 @@ -import { useTranslation } from 'react-i18next' - import LocalisedText from '@/components/LocalisedText' -import { useLocale } from '@/lib/useLocale' +import { useUITranslation } from '@/lib/useUITranslation' type Props = { messageKey: string @@ -13,12 +11,11 @@ type Props = { const TranslatedText = ( { messageKey, namespace = 'navigation', values, className }: Props, ) => { - const locale = useLocale () - const { t } = useTranslation (namespace, { lng: locale }) - const result = t (messageKey, { ...values, returnDetails: true }) + const { message } = useUITranslation (namespace) + const result = message (messageKey, values) return ( - - {result.res} + + {result.text} ) } diff --git a/frontend/src/components/common/Pagination.tsx b/frontend/src/components/common/Pagination.tsx index 763b77c..47c54e1 100644 --- a/frontend/src/components/common/Pagination.tsx +++ b/frontend/src/components/common/Pagination.tsx @@ -1,6 +1,7 @@ import { useLocation } from 'react-router-dom' import PrefetchLink from '@/components/PrefetchLink' +import { useUITranslation } from '@/lib/useUITranslation' import type { FC } from 'react' @@ -49,6 +50,7 @@ const getPages = ( const Pagination: FC = ({ page, totalPages, siblingCount = 3 }) => { const location = useLocation () + const { message } = useUITranslation () const buildTo = (p: number) => { const qs = new URLSearchParams (location.search) @@ -59,7 +61,9 @@ const Pagination: FC = ({ page, totalPages, siblingCount = 3 }) => { const pages = getPages (page, totalPages, siblingCount) return ( -