
lingui.js 提供了多种方式来实现国际化:
当 t 宏在 React 组件中不生效时,通常是因为该组件没有“订阅”到 Lingui 的 i18n 上下文。这意味着组件无法感知到当前语言环境的变化,也无法获取到翻译函数。
为了解决 t 宏不生效的问题,我们有两种主要的策略:
如果一个组件需要直接使用 t 宏进行翻译,或者需要访问 i18n 实例来执行更复杂的翻译逻辑,那么它必须通过 useLingui() 钩子来订阅 i18n 上下文。useLingui() 钩子会返回当前的 i18n 实例,以及一个 language 属性,确保组件在语言变化时能够重新渲染。
示例:在 DataComponent 中使用 useLingui 进行翻译
假设我们有一个 DataComponent,它接收一个消息描述符并需要将其翻译后显示。
// src/components/DataComponent.tsx
import { MessageDescriptor } from "@lingui/core";
import { useLingui } from "@lingui/react";
import React from "react";
type Props = {
data: MessageDescriptor; // 接收一个消息描述符
};
export const DataComponent: React.FC<Props> = ({ data }) => {
const { i18n } = useLingui(); // 使用 useLingui 钩子订阅 i18n 上下文
// 使用 i18n._ 方法翻译消息描述符
return <p>{i18n._(data)}</p>;
};在这个例子中,DataComponent 通过 useLingui() 获得了 i18n 实例,然后使用 i18n._(data) 来翻译传入的 MessageDescriptor。这样,无论语言何时切换,DataComponent 都能正确地重新渲染并显示翻译后的文本。
当您希望在组件外部(例如在 index.tsx 的根组件中,或者在不直接订阅 i18n 上下文的纯函数中)定义一个可翻译的字符串,并将其传递给其他组件进行翻译时,msg 宏就非常有用。msg 宏不会立即翻译文本,而是生成一个 MessageDescriptor 对象,该对象可以被传递并稍后通过 i18n._() 方法进行翻译。
示例:在 index.tsx 中使用 msg 宏并传递给 DataComponent
// src/index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import reportWebVitals from './reportWebVitals';
import { StoreProvider } from './components/store-provider';
import createStore from './store';
import { LanguageProvider } from './components/language-provider';
import { LangSwitcher } from './components/lang-switcher';
import { DataComponent } from './components/DataComponent';
import { Trans, msg } from '@lingui/macro'; // 导入 msg 宏
const store = createStore();
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
<React.StrictMode>
<StoreProvider store={store}>
<LanguageProvider>
<LangSwitcher />
<p>
<Trans>hello world</Trans> {/* <Trans> 组件直接翻译 */}
</p>
{/* 使用 msg 宏创建 MessageDescriptor,并将其作为 prop 传递 */}
<DataComponent data={msg`hello react`} />
</LanguageProvider>
</StoreProvider>
</React.StrictMode>
);
reportWebVitals();在这里,index.tsx 使用 msg 宏创建了 hello react 的消息描述符,并将其作为 data prop 传递给了 DataComponent。DataComponent 内部再使用 useLingui() 钩子获取 i18n 实例,并调用 i18n._(data) 进行实际的翻译。
通过理解这些不同的翻译机制及其适用场景,可以更有效地在 React 应用中利用 Lingui.js 实现全面的国际化。确保 lingui extract 和 lingui compile 命令在开发流程中正确执行,以生成和编译翻译文件。
以上就是Lingui.js 在 React 中 t 宏不生效的解决方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号