跳到主要内容

多语言

XinAdmin 的前端与后端都提供了多语言的支持,并且已经配置了菜单、文本和部分 message 的多语言,在 Server 中,你可以在 config/app.php 中配置 locale 来设置默认语言, 在前端中,通过管理后台的语言设置来设置页面的语言。

WEB 端

XinAdmin 使用的 @umi/max 内置了国际化插件,它可以轻松地将国际化功能集成到你的应用程序之中。

国际化插件采用约定式目录结构,我们约定在 src/locales 目录下引入多语言文件。

在前端项目根目录的 locales 文件夹中,你可以看到 en-US.tszh-CN.ts 等文件,分别对应英文和中文的多语言文件,多语言文件的命名需遵循此规范: <lang><separator><COUNTRY>.(js|json|ts)。其中,<separator> 为分隔符,默认为 -,可以通过 baseSeparator 项配置。

- locales
- zh-CN ---> 中文语言文件目录
- menu.ts
- en-US ---> 英文语言文件目录
- menu.ts
- zh-CN.ts
- en-US.ts
pages

添加多语言

现在,添加您的第一条多语言内容:

// src/locales/zh-CN.ts
export default {
welcome: '欢迎光临 Umi 的世界!',
};

// src/locales/en-US.ts
export default {
welcome: "Welcome to Umi's world!",
};

使用多语言

一切就绪,现在您可以在 前端项目 中使用多语言内容。使用 <FormattedMessage /> 组件,只需要将前面的 welcome 作为参数 id 的值传入即可:

import { FormattedMessage } from 'umi';

export default function Page() {
return (
<div>
<FormattedMessage id="welcome" />
</div>
);
}

渲染的结果如下:

<!-- zh-CN -->
<div>欢迎光临 Umi 的世界!</div>

<!-- en-US -->
<div>Welcome to Umi's world!</div>

在组件的参数中使用

在某些情况下,您需要将多语言内容作为参数传递给某个组件。可以通过 intl 对象来实现:

import { Alert } from 'antd';
import { useIntl } from 'umi';

export default function Page() {
const intl = useIntl();
const msg = intl.formatMessage({
id: 'welcome',
});

return <Alert message={msg} type="success" />;
}

在底层,国际化插件基于 react-intl 封装,并支持它的所有接口,详情可见此文档

在上面的代码中,我们就运用到了 react-intl 提供的 useIntl() 接口来初始化 intl 对象,并调用此对象的 formatMessage() 方法来格式化字符串。

格式化字符串

您可能想要在多语言翻译中动态插值,那么可以像这样编写多语言内容:

// src/locales/zh-CN.ts
export default {
user: {
welcome: '{name},今天也是美好的一天!',
},
};
// src/locales/en-US.ts
export default {
user: {
welcome: '{name}, what a nice day!',
},
};

在上面,我们编写了特殊的语法 {name},这允许我们在运行时动态赋值:

import { FormattedMessage } from 'umi';

export default function Page() {
return (
<p>
<FormattedMessage id="user.welcome" values={{ name: '张三' }} />
</p>
);
}

如果您希望通过 intl 对象来实现,那么可以这样对它赋值:

import { useIntl } from 'umi';

export default function Page() {
const intl = useIntl();
const msg = intl.formatMessage(
{
id: 'user.welcome',
},
{
name: '张三',
},
);

return <p>{msg}</p>;
}

注意,用于赋值的键值对对象应当作为 formatMessage() 方法的第二个参数传递。

渲染的结果如下:

<!-- zh-CN -->
<p>张三,今天也是美好的一天!</p>

<!-- en-US -->
<p>张三, what a nice day!</p>

其它配置

你可以参考 UmiJs 的 多语言获取更多其它的用法和设置,UmiJs 多语言

Server 端

Laravel 的本地化功能提供了一种便捷的方式来检索各种语言的字符串,使您可以轻松地在应用程序中支持多种语言。

Laravel 提供了两种管理翻译字符串的方法。首先,语言字符串可以存储在应用程序目录中的 lang 文件中。在此目录中,应用程序支持的每种语言可能都有子目录。这是 Laravel 用来管理内置 Laravel 功能(例如验证错误消息)的翻译字符串的方法:

/lang
/en
messages.php
/zh
messages.php

lang 目录下创建子目录,然后创建 多语言文件,并添加您的翻译字符串

使用多语言

在应用程序中,您可以使用 __() 函数来检索翻译字符串。例如,假设您有一个名为 welcome 的翻译字符串,则可以使用以下代码来检索翻译字符串:

# 多语言文件数组
[
'welcome' => 'Welcome',
]

# 使用 __() 函数
echo __('welcome');

# 输出:Welcome

格式化字符串

您可以在翻译字符串中定义占位符。所有占位符都以 : 开始,后跟占位符名称。 例如,假设您有一个名为 welcome 的翻译字符串,该字符串包含一个占位符 :name,则可以使用以下代码来检索翻译字符串并替换占位符:

# 多语言文件数组
[
'welcome' => 'Welcome :name',
]

# 使用 __() 函数
echo __('welcome', ['name' => 'John']);

# 输出:Welcome, John

其它配置

更多配置和使用方法,请参考 Laravel 的 多语言