[Update] Plugins: Add localization system.
This commit is contained in:
@@ -1,9 +1,11 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
import * as reactI18next from "react-i18next";
|
||||||
|
|
||||||
if (typeof window !== "undefined") {
|
if (typeof window !== "undefined") {
|
||||||
window.React = React;
|
window.React = React;
|
||||||
window.clsx = clsx;
|
window.clsx = clsx;
|
||||||
|
window.reactI18next = reactI18next;
|
||||||
}
|
}
|
||||||
|
|
||||||
import { LoadPluginsController } from "./plugins_controllers/LoadPluginsController";
|
import { LoadPluginsController } from "./plugins_controllers/LoadPluginsController";
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ export const usePlugins = () => {
|
|||||||
const { asyncTauriFetchGithub } = useFetch();
|
const { asyncTauriFetchGithub } = useFetch();
|
||||||
|
|
||||||
|
|
||||||
|
const { i18n } = useTranslation();
|
||||||
|
|
||||||
const generatePluginContext = (downloaded_plugin_info) => {
|
const generatePluginContext = (downloaded_plugin_info) => {
|
||||||
const plugin_context = {
|
const plugin_context = {
|
||||||
@@ -69,7 +70,8 @@ export const usePlugins = () => {
|
|||||||
|
|
||||||
},
|
},
|
||||||
createAtomWithHook: (...args) => createAtomWithHook(...args),
|
createAtomWithHook: (...args) => createAtomWithHook(...args),
|
||||||
logics: { ...logics_common, ...logics_configs, ...logics_main }
|
logics: { ...logics_common, ...logics_configs, ...logics_main },
|
||||||
|
i18n: i18n,
|
||||||
};
|
};
|
||||||
return plugin_context;
|
return plugin_context;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
import { initStore, StoreContext } from "@plugin_store";
|
import { initStore, StoreContext } from "@plugin_store";
|
||||||
|
import { initI18n } from "@initI18n";
|
||||||
import { SubtitleSystemContainer } from "./subtitle_system_container/SubtitleSystemContainer";
|
import { SubtitleSystemContainer } from "./subtitle_system_container/SubtitleSystemContainer";
|
||||||
import { SubtitlesController } from "./subtitle_system_container/_controllers/SubtitlesController.jsx";
|
import { SubtitlesController } from "./subtitle_system_container/_controllers/SubtitlesController.jsx";
|
||||||
|
|
||||||
export const init = (plugin_context) => {
|
export const init = (plugin_context) => {
|
||||||
initStore(plugin_context.createAtomWithHook);
|
const { createAtomWithHook, i18n, logics } = plugin_context;
|
||||||
const { logics } = plugin_context;
|
|
||||||
|
initStore(createAtomWithHook);
|
||||||
|
initI18n(i18n);
|
||||||
|
|
||||||
const EntryComponents = () => {
|
const EntryComponents = () => {
|
||||||
return (
|
return (
|
||||||
|
|||||||
2
src-ui/plugins/dev_plugin_subtitles/locales/en.yml
Normal file
2
src-ui/plugins/dev_plugin_subtitles/locales/en.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
main_page:
|
||||||
|
title: "VRCT Subtitles"
|
||||||
14
src-ui/plugins/dev_plugin_subtitles/locales/initI18n.js
Normal file
14
src-ui/plugins/dev_plugin_subtitles/locales/initI18n.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import en from "./en.yml";
|
||||||
|
import ja from "./ja.yml";
|
||||||
|
import plugin_info from "../plugin_info.json";
|
||||||
|
|
||||||
|
export const initI18n = (i18n) => {
|
||||||
|
const ns = plugin_info.plugin_id;
|
||||||
|
// parse once
|
||||||
|
const en_res = en;
|
||||||
|
const ja_res = ja;
|
||||||
|
|
||||||
|
// addResourceBundle will merge into i18n’s store
|
||||||
|
i18n.addResourceBundle("en", ns, en_res, /* deep = */ true, /* overwrite = */ true);
|
||||||
|
i18n.addResourceBundle("ja", ns, ja_res, /* deep = */ true, /* overwrite = */ true);
|
||||||
|
};
|
||||||
2
src-ui/plugins/dev_plugin_subtitles/locales/ja.yml
Normal file
2
src-ui/plugins/dev_plugin_subtitles/locales/ja.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
main_page:
|
||||||
|
title: "字幕プレイヤー"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import plugin_info from "../plugin_info.json";
|
||||||
|
|
||||||
|
export const usePluginTranslation = () => {
|
||||||
|
const ns = plugin_info.plugin_id;
|
||||||
|
return useTranslation(ns);
|
||||||
|
};
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
export const configs = {
|
export const configs = {
|
||||||
alias: {
|
alias: {
|
||||||
"@plugin_store": "store/store.js",
|
"@plugin_store": "store/store.js",
|
||||||
|
"@initI18n": "locales/initI18n.js",
|
||||||
|
"@usePluginTranslation": "locales/usePluginTranslation.jsx",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
"plugin_id": "vrct_plugin_subtitles",
|
"plugin_id": "vrct_plugin_subtitles",
|
||||||
"asset_name": "vrct_plugin_subtitles.zip",
|
"asset_name": "vrct_plugin_subtitles.zip",
|
||||||
"location": "main_section",
|
"location": "main_section",
|
||||||
"plugin_version": "0.0.0",
|
"plugin_version": "0.0.4",
|
||||||
"min_supported_vrct_version": "3.0.4",
|
"min_supported_vrct_version": "3.0.5",
|
||||||
"max_supported_vrct_version": "3.0.6"
|
"max_supported_vrct_version": "3.0.5"
|
||||||
}
|
}
|
||||||
@@ -4,8 +4,10 @@ import { ModeSelectorContainer } from "./mode_selector_container/ModeSelectorCon
|
|||||||
import { PlayControlContainer } from "./play_control_container/PlayControlContainer";
|
import { PlayControlContainer } from "./play_control_container/PlayControlContainer";
|
||||||
import { CountdownContainer } from "./countdown_container/CountdownContainer";
|
import { CountdownContainer } from "./countdown_container/CountdownContainer";
|
||||||
import { SubtitlesListContainer } from "./subtitles_list_container/SubtitlesListContainer";
|
import { SubtitlesListContainer } from "./subtitles_list_container/SubtitlesListContainer";
|
||||||
|
import { usePluginTranslation } from "@usePluginTranslation";
|
||||||
|
|
||||||
export const SubtitleSystemContainer = () => {
|
export const SubtitleSystemContainer = () => {
|
||||||
|
const { t } = usePluginTranslation();
|
||||||
// const [srtContent, setSrtContent] = useState("");
|
// const [srtContent, setSrtContent] = useState("");
|
||||||
// const [cues, setCues] = useState([]);
|
// const [cues, setCues] = useState([]);
|
||||||
// const [isPlaying, setIsPlaying] = useState(false);
|
// const [isPlaying, setIsPlaying] = useState(false);
|
||||||
@@ -31,9 +33,11 @@ export const SubtitleSystemContainer = () => {
|
|||||||
// // カウントダウンタイマー専用の ref
|
// // カウントダウンタイマー専用の ref
|
||||||
// const countdownIntervalRef = useRef(null);
|
// const countdownIntervalRef = useRef(null);
|
||||||
|
|
||||||
|
console.log(t("main_page.title"));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<h1 className={styles.title}>字幕プレイヤー</h1>
|
<h1 className={styles.title}>{t("main_page.title")}</h1>
|
||||||
<InputFileContainer />
|
<InputFileContainer />
|
||||||
<ModeSelectorContainer />
|
<ModeSelectorContainer />
|
||||||
<PlayControlContainer />
|
<PlayControlContainer />
|
||||||
|
|||||||
Reference in New Issue
Block a user