Next.js 应用国际化(i18n)的最佳解决方案
您是否希望将您的 Next.js 应用扩展到新的市场?TacoTranslate 让本地化您的 Next.js 项目变得非常简单,使您能够轻松面向全球受众。
为什么为 Next.js 选择 TacoTranslate?
- 无缝集成:专为 Next.js 应用设计,TacoTranslate 可无缝融入您现有的工作流程。
- 自动字符串收集:无需再手动管理 JSON 文件。TacoTranslate 会自动从您的代码库收集字符串。
- AI 驱动的翻译:利用 AI 的能力提供符合上下文且契合应用语气的准确翻译。
- 即时语言支持:只需点击即可添加对新语言的支持,让您的应用可被全球访问。
工作原理
随着世界日益全球化,网络开发者构建能够满足不同国家和文化用户需求的应用变得越来越重要。实现这一目标的关键方法之一是国际化(i18n),它允许你将应用调整为不同的语言、货币和日期格式。
在本教程中,我们将探讨如何为你的 React Next.js 应用添加国际化支持,并实现服务器端渲染。 TL;DR: 在此查看完整示例。
本指南适用于正在使用 Pages Router 的 Next.js 应用。
如果您正在使用 App Router,请参阅此指南。
第 1 步: 安装 i18n 库
要在你的 Next.js 应用中实现国际化,首先我们将选择一个 i18n 库。有几个流行的库可供选择,其中包括 next-intl. 然而,在本示例中,我们将使用 TacoTranslate.
TacoTranslate 使用最先进的 AI 自动将你的字符串翻译成任何语言,免去了繁琐的 JSON 文件管理。
现在,在终端中使用 npm 安装它:
npm install tacotranslate第2步: 创建一个免费的 TacoTranslate 账户
既然你已经安装了该模块,现在是时候创建你的 TacoTranslate 帐户、一个翻译项目以及相关的 API 密钥了。在此创建帐户。 这是免费的,且无需添加信用卡信息。
在 TacoTranslate 应用程序的 UI 中,创建一个项目,并导航到其 API 密钥选项卡。创建一个 read 密钥和一个 read/write 密钥。我们会将它们保存为环境变量。read 密钥就是我们所说的 public,而 read/write 密钥则是 secret。例如,你可以将它们添加到项目根目录的 .env 文件中。
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010务必不要将机密 read/write API 密钥泄露到客户端生产环境中。
我们还将添加两个环境变量: TACOTRANSLATE_DEFAULT_LOCALE 和 TACOTRANSLATE_ORIGIN.
TACOTRANSLATE_DEFAULT_LOCALE:默认的回退语言/区域代码。在此示例中,我们将其设置为en(英语)。TACOTRANSLATE_ORIGIN:存放字符串的“文件夹”,例如您网站的 URL。 在此处阅读有关来源的更多信息。
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com第 3 步: 设置 TacoTranslate
要将 TacoTranslate 集成到你的应用中,你需要使用之前的 API 密钥创建一个客户端。例如,创建一个名为 /tacotranslate-client.js 的文件。
const {default: createTacoTranslateClient} = require('tacotranslate');
const tacoTranslate = createTacoTranslateClient({
apiKey:
process.env.TACOTRANSLATE_SECRET_API_KEY ??
process.env.TACOTRANSLATE_PUBLIC_API_KEY ??
process.env.TACOTRANSLATE_API_KEY ??
'',
projectLocale: process.env.TACOTRANSLATE_DEFAULT_LOCALE ?? '',
});
module.exports = tacoTranslate;我们会在稍后自动定义 TACOTRANSLATE_API_KEY.
将客户端创建在单独的文件中,便于今后重复使用。现在,使用自定义 /pages/_app.tsx,我们将添加 TacoTranslate 提供程序。
import React from 'react';
import {type AppProps} from 'next/app';
import {type Origin, type Locale, type Localizations} from 'tacotranslate';
import TacoTranslate from 'tacotranslate/react';
import TacoTranslateHead from 'tacotranslate/next/head';
import tacoTranslate from '../tacotranslate-client';
type PageProperties = {
origin: Origin;
locale: Locale;
locales: Locale[];
localizations: Localizations;
};
export default function App({Component, pageProps}: AppProps<PageProperties>) {
const {origin, locale, locales, localizations} = pageProps;
return (
<TacoTranslate
client={tacoTranslate}
origin={origin}
locale={locale}
localizations={localizations}
>
<TacoTranslateHead rootUrl="https://your-website.com" locales={locales} />
<Component {...pageProps} />
</TacoTranslate>
);
}如果您已经有自定义的 pageProps 和 _app.tsx,请将上述属性和代码扩展到现有定义中。
第4步: 实现服务器端渲染
TacoTranslate 允许对翻译内容进行服务器端渲染。这大大改善了用户体验,能立即显示翻译后的内容,避免先短暂显示未翻译的内容。除此之外,由于我们已经拥有所需的全部翻译,客户端可以跳过网络请求。
我们将首先创建或修改 /next.config.js。
const withTacoTranslate = require('tacotranslate/next/config').default;
const tacoTranslateClient = require('./tacotranslate-client');
module.exports = async () => {
const config = {};
return withTacoTranslate(config, {
client: tacoTranslateClient,
isProduction:
process.env.TACOTRANSLATE_ENV === 'production' ||
process.env.VERCEL_ENV === 'production' ||
(!(process.env.TACOTRANSLATE_ENV || process.env.VERCEL_ENV) &&
process.env.NODE_ENV === 'production'),
});
};修改 isProduction 检查以适应您的设置。如果 true,TacoTranslate 将公开公共 API 密钥。如果我们处于本地、测试或暂存环境(isProduction is false),我们将使用秘密的 read/write API 密钥,以确保新的字符串被发送进行翻译。
到目前为止,我们只在 Next.js 应用中设置了受支持语言的列表。下一步,我们将为所有页面获取翻译。为此,您将根据需求使用 getTacoTranslateStaticProps 或 getTacoTranslateServerSideProps.
这些函数接受三个参数:一个 Next.js Static Props Context 对象、TacoTranslate 的配置,以及可选的 Next.js 属性。请注意,revalidate 在 getTacoTranslateStaticProps 上的默认值为 60,以确保你的翻译保持最新。
要在页面中使用任一函数,假设你的页面文件类似于 /pages/hello-world.tsx.
import {Translate} from 'tacotranslate/react';
import getTacoTranslateStaticProps from 'tacotranslate/next/get-static-props';
import tacoTranslateClient from '../tacotranslate-client';
export async function getStaticProps(context) {
return getTacoTranslateStaticProps(context, {client: tacoTranslateClient});
}
export default function Page() {
return <Translate string="Hello, world!"/>;
}现在你应该可以使用 Translate 组件来翻译你所有 React 组件中的字符串。
import {Translate} from 'tacotranslate/react';
function Component() {
return <Translate string="Hello, world!"/>
}第 5 步: 部署并测试!
我们完成了!当您在 Translate 组件中添加任何字符串时,您的 Next.js 应用现在将自动翻译。请注意,只有对 API 密钥具有 read/write 权限的环境才能创建要翻译的新字符串。我们建议拥有一个封闭且安全的预发布(staging)环境,在那里使用具有此类权限的 API 密钥测试您的生产应用,并在上线前添加新的字符串。这样可以防止任何人窃取您的秘密 API 密钥,并可能通过添加新的、无关的字符串使您的翻译项目臃肿。
Be sure to check out the complete example over at our GitHub profile. There, you’ll also find an example of how to do this using the App Router! If you encounter any problems, feel free to reach out, and we’ll be more than happy to help.
TacoTranslate lets you automatically localize your React applications quickly to and from over 75 languages. Get started today!