Add languages to translation UI

This commit is contained in:
vlOd2 2025-12-26 04:40:10 +02:00
parent 6bc4907399
commit f72c6214e8
4 changed files with 90 additions and 6 deletions

View file

@ -837,7 +837,10 @@
"useNativeSubtitles": "Native video subtitles", "useNativeSubtitles": "Native video subtitles",
"useNativeSubtitlesDescription": "Broadcast subtitles for native fullscreen and PiP", "useNativeSubtitlesDescription": "Broadcast subtitles for native fullscreen and PiP",
"delayLate": "Heard audio", "delayLate": "Heard audio",
"delayEarly": "Saw caption" "delayEarly": "Saw caption",
"translate": {
"title": "Translate from {{language}}"
}
}, },
"watchparty": { "watchparty": {
"watchpartyItem": "Watch Party", "watchpartyItem": "Watch Party",

View file

@ -36,6 +36,7 @@ export interface CaptionOptionProps {
onClick?: () => void; onClick?: () => void;
error?: React.ReactNode; error?: React.ReactNode;
flag?: boolean; flag?: boolean;
translatable?: boolean;
subtitleUrl?: string; subtitleUrl?: string;
subtitleType?: string; subtitleType?: string;
// subtitle details from wyzie // subtitle details from wyzie
@ -55,7 +56,7 @@ function CaptionOptionRightSide(props: CaptionOptionProps) {
function translateBtn(margin: boolean) { function translateBtn(margin: boolean) {
return ( return (
props.countryCode && ( props.translatable && (
<span <span
className={classNames( className={classNames(
"text-buttons-secondaryText px-2 py-1 rounded bg-opacity-0", "text-buttons-secondaryText px-2 py-1 rounded bg-opacity-0",

View file

@ -142,6 +142,7 @@ export function LanguageSubtitlesView({
}} }}
onDoubleClick={handleDoubleClick} onDoubleClick={handleDoubleClick}
flag flag
translatable
subtitleUrl={v.url} subtitleUrl={v.url}
subtitleType={v.type} subtitleType={v.type}
subtitleSource={v.source} subtitleSource={v.source}

View file

@ -4,6 +4,69 @@ import { FlagIcon } from "@/components/FlagIcon";
import { Menu } from "@/components/player/internals/ContextMenu"; import { Menu } from "@/components/player/internals/ContextMenu";
import { useOverlayRouter } from "@/hooks/useOverlayRouter"; import { useOverlayRouter } from "@/hooks/useOverlayRouter";
import { CaptionListItem } from "@/stores/player/slices/source"; import { CaptionListItem } from "@/stores/player/slices/source";
import { getPrettyLanguageNameFromLocale } from "@/utils/language";
import { CaptionOption } from "./CaptionsView";
// https://developers.google.com/workspace/admin/directory/v1/languages
const availableLanguages: string[] = [
"am",
"ar",
"eu",
"bn",
"en-GB",
"pt-BR",
"bg",
"ca",
"chr",
"hr",
"cs",
"da",
"nl",
"en",
"et",
"fil",
"fi",
"fr",
"de",
"el",
"gu",
"iw",
"hi",
"hu",
"is",
"id",
"it",
"ja",
"kn",
"ko",
"lv",
"lt",
"ms",
"ml",
"mr",
"no",
"pl",
"pt-PT",
"ro",
"ru",
"sr",
"zh-CN",
"sk",
"sl",
"es",
"sw",
"sv",
"ta",
"te",
"th",
"zh-TW",
"tr",
"ur",
"uk",
"vi",
"cy",
];
export interface LanguageSubtitlesViewProps { export interface LanguageSubtitlesViewProps {
id: string; id: string;
@ -19,6 +82,16 @@ export function TranslateSubtitleView({
const { t } = useTranslation(); const { t } = useTranslation();
const router = useOverlayRouter(id); const router = useOverlayRouter(id);
function renderTargetLang(langCode: string) {
const friendlyName = getPrettyLanguageNameFromLocale(langCode);
return (
<CaptionOption countryCode={langCode} flag>
{friendlyName}
</CaptionOption>
);
}
return ( return (
<> <>
<Menu.BackLink <Menu.BackLink
@ -32,14 +105,20 @@ export function TranslateSubtitleView({
> >
<span className="flex items-center"> <span className="flex items-center">
<FlagIcon langCode={caption.language} /> <FlagIcon langCode={caption.language} />
<span className="ml-3">Translate from {caption.id}</span> <span className="ml-3">
{t("player.menus.subtitles.translate.title", {
replace: {
language:
getPrettyLanguageNameFromLocale(caption.language) ??
caption.language,
},
})}
</span>
</span> </span>
</Menu.BackLink> </Menu.BackLink>
<div className="!pt-1 mt-2 pb-3"> <div className="!pt-1 mt-2 pb-3">
<div className="text-center text-video-context-type-secondary py-2"> {availableLanguages.map(renderTargetLang)}
{t("player.menus.subtitles.notFound")}
</div>
</div> </div>
</> </>
); );