核心库
虽然 next-intl 主要用于 Next.js 应用,但其核心是无框架依赖的,可以独立使用——无论是在 React 应用还是任何其他 JavaScript 环境中。
React 应用
next-intl 内部使用了一个叫做 use-intl 的库。这个核心库包含了你在 next-intl 中熟悉的大部分功能,但缺少以下 Next.js 特有的功能:
- 路由 API
- 用于服务器动作、元数据和路由处理的可等待 API (/docs/environments/actions-metadata-route-handlers)
- 与
i18n/request.ts配合的 服务器组件集成
如果服务器组件在 Next.js 之外的 React 应用中得到普及,未来服务器组件的支持可能会迁移到核心库中。
相比之下,use-intl 包含了处理普通 React 应用国际化所必需的所有 API:
- 用于翻译消息的
useTranslations - 用于格式化 数字、日期和时间 与 列表 的
useFormatter - 配置 API (不过请注意,
use-intl中NextIntlProvider被称为IntlProvider)
这使得你可以在其他环境中使用与 next-intl 相同的 API:
基本用法:
import {IntlProvider, useTranslations} from 'use-intl';
// 你可以从任何地方获取消息,也可以在组件内部获取消息,
// 然后在拿到消息后再渲染该 Provider 和你的应用。
const messages = {
App: {
hello: 'Hello {username}!'
}
};
function Root() {
return (
<IntlProvider messages={messages} locale="en">
<App user={{name: 'Jane'}} />
</IntlProvider>
);
}
function App({user}) {
const t = useTranslations('App');
return <h1>{t('hello', {username: user.name})}</h1>;
}非 React 应用
除了特定于 React 的 API,use-intl 还导出了两个低级函数,可以在任何 JavaScript 环境中使用:
createTranslator用于翻译消息createFormatter用于格式化数字、日期和时间以及列表
这些 API 直接接收所有相关配置,不依赖全局配置。
你可以这样使用这些 API:
import {createTranslator, createFormatter} from 'use-intl/core';
const messages = {
basic: 'Hello {name}!',
rich: 'Hello <b>{name}</b>!'
};
// 创建与 `useTranslations` 返回的函数相同的函数。
// 由于没有 provider,你可以直接传入通常传递给 provider 的所有属性。
const t = createTranslator({locale: 'en', messages});
// 结果: "Hello world!"
t('basic', {name: 'world'});
// 若要生成 HTML 标记,可以考虑使用 `markup` 函数,
// 它与 `t.rich` 不同,返回的是标记字符串。
t.markup('rich', {
name: 'world',
b: (chunks) => `<b>${chunks}</b>`
});
// 创建与 `useFormatter` 返回的对象相同的对象。
const format = createFormatter({locale: 'en'});
// 结果: "Oct 17, 2022"
format.dateTime(new Date(2022, 9, 17), {dateStyle: 'medium'});