组合式函数
defineI18nLocale
defineI18nLocale() 组合式函数用于定义一个函数,以动态加载用于懒加载翻译的本地化消息。
defineI18nLocale() 组合式函数用于定义一个函数,以动态加载用于懒加载翻译的本地化消息。
加载器函数需要返回一个解析为消息对象的 Promise。
类型
declare function defineI18nLocale<Messages = LocaleMessages<DefineLocaleMessage>, Locales = Locale>(
loader: (locale: Locales) => Messages | Promise<Messages>
): (locale: Locales) => Messages | Promise<Messages>
参数
loader
一个动态加载本地化消息的函数,具有以下参数:
locale
类型:Locale
目标 locale,由 nuxt i18n 模块传入。当 locale 在以下情况切换时传入:- 当你使用
setLocale()切换 locale 时。 - 当通过
<NuxtLink>切换 locale 时。例如,通过useSwitchLocalePath()或$switchLocalePath()解析的路由路径。
- 当你使用
使用
使用 fetch 请求加载本地化消息的加载器函数示例:
export default defineI18nLocale(locale => {
return $fetch(`https://your-company-product/api/${locale}`)
})
加载器运行的位置
加载器会在服务器以及浏览器中运行。在生产构建中,服务器会在 Nuxt 应用之外运行它——这正是其消息能够从消息端点提供的原因——因此它只能使用两处都存在的 API,例如 $fetch() 和 useRuntimeConfig()。Nitro 专用 API(h3 工具、useStorage())在浏览器中不可用;在开发环境中也不可用,因为加载器始终在 Nuxt 应用中运行。
Nuxt 应用组合式函数(useNuxtApp()、useState()、useCookie()、useRequestHeaders() 等)是例外:调用其中任意一个的语言文件会使其加载器改为在 Nuxt 应用中运行,并在服务器和客户端上都在那里加载。这是在构建时通过读取语言文件自身所进行的调用来决定的。通过导入的辅助函数调用的组合式函数不会被检测到,并且服务器加载该语言环境时会失败——请在语言文件中直接调用它,以便系统检测到。
i18n/locales/en.ts
export default defineI18nLocale(async locale => {
// 在 Nuxt 应用中加载,而不是通过消息端点加载
const { $tenant } = useNuxtApp()
return $fetch(`/api/messages/${$tenant.id}/${locale}`)
})
此类语言环境的消息会在 SSR 期间按请求生成,并在浏览器中再次生成,同时语言文件也会随客户端 bundle 一起发布。读取仅限服务器端资源(数据库、内部服务)的加载器不得使用这些组合式函数——请确保它能够由服务器加载。