# vue: 使用 SPA translations 开发 URL: https://generaltranslation.com/zh/docs/vue/guides/developing-spa-translations.mdx --- title: 使用 SPA translations 开发 description: 如何预加载 Vue SPA,并在模块作用域中使用 t() 翻译静态字符串。 related: links: - /docs/vue/guides/translating-strings - /docs/vue/guides/managing-locales - /docs/vue/guides/storing-translations - /docs/vue/guides/configuring --- 仅在浏览器端运行的单页应用可在应用模块运行前预加载当前 catalog。这样一来,便可在 Vue 组件外对常量、导航定义和其他字符串同步调用模块级的 [`t()`](/docs/vue/reference/functions/t)。 [`initializeGTSPA()`](/docs/vue/reference/functions/initialize-gt-spa) 是对 [`useGT()`](/docs/vue/reference/composables/use-gt) 的补充,并非替代。对于常规组件内容,以及需要响应式切换区域设置的 Vue 应用或服务器端渲染应用,请使用该组合式函数。 ## 选择 SPA 运行时 [#choose] 仅当以下条件均满足时,才使用 [`initializeGTSPA()`](/docs/vue/reference/functions/initialize-gt-spa): * 应用完全在浏览器中运行。 * 模块必须在求值期间翻译字符串。 * 区域设置更改时可以重新加载页面。 如果应用在服务器端渲染,或需要在不重新加载页面的情况下响应式切换区域设置,请使用 [`createGT()`](/docs/vue/reference/functions/create-gt)。 ## 导入应用前进行引导初始化 [#bootstrap] 初始化代码必须在任何调用 [`t()`](/docs/vue/reference/functions/t) 的模块之前运行。使用一个小型异步引导程序即可兼容默认的 Vite 6 构建目标,无需顶层 `await` 或 `build.target: 'esnext'`。 ### 1. 导出挂载函数 修改常规 Vite 入口模块,使其导出一个接收已初始化 [`GTPlugin`](/docs/vue/reference/types/gt-plugin) 的函数: ```ts title="src/main.ts" import { createApp } from 'vue'; import type { GTPlugin } from 'gt-vue'; import App from './App.vue'; export function mount(gt: GTPlugin) { createApp(App).use(gt).mount('#app'); } ``` ### 2. 初始化并动态导入 创建一个引导模块,等待 [`initializeGTSPA()`](/docs/vue/reference/functions/initialize-gt-spa) 完成初始化后再导入应用,并安装初始化返回的原插件: ```ts title="src/index.ts" import { initializeGTSPA } from 'gt-vue'; import gtConfig from '../gt.config.json'; import loadTranslations from './loadTranslations'; async function bootstrap() { const gt = await initializeGTSPA({ ...gtConfig, loadTranslations, }); const { mount } = await import('./main'); mount(gt); } bootstrap().catch((error) => { console.error('Failed to initialize translations', error); }); ``` 首次调用负责管理页面范围内的 SPA 运行时。并发调用会共享其初始化结果,后续调用则返回同一插件。请勿为已挂载的应用调用 [`createGT()`](/docs/vue/reference/functions/create-gt),否则组件查找和模块级查找会使用不同的状态。 ### 3. 将 Vite 指向引导文件 更新 `index.html` 中的模块脚本,使其加载 `src/index.ts`,而不是 `src/main.ts`: ```html title="index.html" ``` ## 翻译模块级字符串 [#translate] 通过动态应用导入加载的模块可以同步调用 [`t()`](/docs/vue/reference/functions/t): ```ts title="src/navigation.ts" import { t } from 'gt-vue'; export const message = t('Hello World'); export const navigation = [ { label: t('Documentation', { $context: 'primary navigation' }), href: '/docs' }, { label: t('Account settings'), href: '/settings' }, ]; ``` 调用必须使用静态源字符串,也可以传入静态 `$context`。提取器会注册这些字符串,预加载的目录可确保模块运行时查找为同步操作。 [`t()`](/docs/vue/reference/functions/t) 不支持标签模板字面量、ICU 语法、插值、`$format` 或 `$maxChars`。对于包含运行时值的内容,请结合使用 [``](/docs/vue/reference/components/t) 和 [``](/docs/vue/reference/components/var)。 ## 在已初始化的 SPA 中更改区域设置 [#locales] 将 `gt.config.json` 中的 `defaultLocale` 和 `locales` 传递给 [`initializeGTSPA()`](/docs/vue/reference/functions/initialize-gt-spa)。如果已保存的区域设置不受支持,则会在下次初始化时回退到默认区域设置。 当 [`useSetLocale()`](/docs/vue/reference/composables/use-set-locale) 更改区域设置时,SPA 运行时会写入区域设置 cookie 并重新加载页面。在重新加载前,当前页面会有意保持初始化时的区域设置。随后,引导过程会在模块级调用再次执行前预加载新的 catalog。 这一重新加载机制确保模块级常量可以安全使用。如果需要在不进行页面导航的情况下更改区域设置,请改用 [`createGT()`](/docs/vue/reference/functions/create-gt),并在模板或计算属性中调用 [`useGT()`](/docs/vue/reference/composables/use-gt)。 ## Next steps - /docs/vue/guides/translating-strings - /docs/vue/guides/managing-locales - /docs/vue/guides/storing-translations - /docs/vue/guides/configuring