i18next
i18next 是一个功能齐全的 i18n javascript 库,用于翻译您的 Web 应用程序。
查看更多相关内容
如何模拟 i18next ?
### 理解 i18next
首先,要模拟 i18next,我们需要理解其基本功能和机制。i18next 是一个国际化(i18n)框架,用于管理应用程序中的多语言支持。它允许开发人员通过使用键值对来本地化应用程序,其中键保持不变,而值根据选定的语言而变化。
### 模拟策略
为了模拟 i18next,我们可以采用以下步骤:
1. **定义语言资源**:创建一个简单的对象来存储不同语言的翻译。例如:
```javascript
const resources = {
en: {
translation: {
greeting: "Hello",
farewell: "Goodbye"
}
},
fr: {
translation: {
greeting: "Bonjour",
farewell: "Au revoir"
}
}
};
```
2. **模拟切换语言**:实现一个功能来切换当前语言,并根据当前语言获取相应的翻译。
```javascript
let currentLanguage = "en"; // 默认语言
function changeLanguage(lang) {
currentLanguage = lang;
}
function t(key) {
return resources[currentLanguage].translation[key];
}
```
3. **使用模拟**:在应用程序中使用这个模拟的 i18next 功能。
```javascript
console.log(t("greeting")); // 输出: Hello
changeLanguage("fr");
console.log(t("greeting")); // 输出: Bonjour
```
### 例子:模拟在 React 中的应用
假设我们在一个 React 应用中使用这种简化的模拟 i18next。我们可以利用 React 的状态和上下文来处理语言更换,确保界面在语言切换时能实时更新。
```javascript
import React, { useState, useContext, createContext } from 'react';
// 创建语言上下文
const LanguageContext = createContext();
// 语言提供者组件
const LanguageProvider = ({ children }) => {
const [language, setLanguage] = useState('en');
const changeLanguage = (lang) => {
setLanguage(lang);
};
return (
<LanguageContext.Provider value={{ language, changeLanguage }}>
{children}
</LanguageContext.Provider>
);
};
// 使用语言资源
const Greeting = () => {
const { language } = useContext(LanguageContext);
const greetings = {
en: "Hello",
fr: "Bonjour"
};
return <h1>{greetings[language]}</h1>;
};
// 应用组件
const App = () => {
const { changeLanguage } = useContext(LanguageContext);
return (
<div>
<Greeting />
<button onClick={() => changeLanguage('fr')}>Switch to French</button>
</div>
);
};
// 在 index.js 中渲染 App
// ReactDOM.render(<LanguageProvider><App /></LanguageProvider>, document.getElementById('root'));
```
通过这种方式,我们可以在不依赖外部 i18next 库的情况下,模拟出多语言切换的基本功能。这对于理解应用内部的国际化机制非常有帮助,也有助于在初期开发阶段快速原型制作和测试。
阅读 14 · 8月13日 23:25
如何在react i18next中设置onChange处理程序以更改语言
在React项目中使用`react-i18next`库进行国际化时,我们可以通过`i18n`实例来更改应用的当前语言。这通常通过一个事件处理函数来实现,该函数响应例如下拉选择框或按钮点击事件的用户交互。
以下是一个简单的例子,展示如何在React组件中使用`onChange`处理程序来更改语言:
首先,确保你已经安装并设置了`react-i18next`。可以通过以下命令来安装:
```bash
npm install react-i18next i18next
```
然后,你可以创建一个语言选择器组件,如下所示:
```jsx
import React from 'react';
import { useTranslation } from 'react-i18next';
function LanguageSelector() {
const { i18n } = useTranslation();
const handleChangeLanguage = (event) => {
i18n.changeLanguage(event.target.value);
};
return (
<select onChange={handleChangeLanguage}>
<option value="en">English</option>
<option value="de">Deutsch</option>
<option value="fr">Français</option>
</select>
);
}
export default LanguageSelector;
```
在这个组件中,我们首先从`react-i18next`中导入`useTranslation`钩子,这允许我们访问`i18n`对象。`i18n`对象有一个方法`changeLanguage`,它可以用来动态更改应用的当前语言。
我们将`handleChangeLanguage`函数绑定到`select`元素的`onChange`事件。当用户选择不同的选项时,这个函数会被触发,并获取新的语言代码(从`event.target.value`),然后调用`i18n.changeLanguage`来更新语言。
这种方法简洁有效,能够让用户在运行时轻松地切换语言,从而提供更好的用户体验。此外,由于`react-i18next`会自动重新渲染所有依赖于当前语言的组件,这种更改会立即反映在整个应用中。
阅读 13 · 8月13日 23:25
如何在 React 应用中迭代 i18n 对象数组?
在React项目中实现国际化(i18n)通常涉及到多种语言的内容切换。如果要迭代i18n对象数组,我们可以使用一些流行的国际化库,如 `react-intl` 或 `i18next`。这里,我将用 `react-intl` 作为例子来说明如何在React应用程序中迭代i18n对象数组。
### 步骤 1: 安装和设置 `react-intl`
首先,你需要在你的React项目中安装 `react-intl`:
```bash
npm install react-intl
```
接下来,在你的应用程序中配置 `IntlProvider`,这是 `react-intl` 提供的一个组件,用于包裹应用的根组件,以便可以在整个应用中使用国际化功能:
```jsx
import { IntlProvider } from 'react-intl';
import App from './App';
import messages from './messages'; // 假设这是你的多语言文件
const locale = 'en'; // 你可以根据浏览器语言或用户选择设置
ReactDOM.render(
<IntlProvider locale={locale} messages={messages[locale]}>
<App />
</IntlProvider>,
document.getElementById('root')
);
```
### 步骤 2: 准备国际化内容
我们假设有一个对象数组,每个对象都包含一些需要国际化的文本。例如:
```javascript
const data = [
{ id: 'welcome', defaultMessage: 'Welcome' },
{ id: 'thank_you', defaultMessage: 'Thank you' },
{ id: 'goodbye', defaultMessage: 'Goodbye' },
];
```
### 步骤 3: 迭代并使用国际化文本
在React组件中,你可以使用 `react-intl` 的 `FormattedMessage` 组件来迭代并显示这些文本:
```jsx
import { FormattedMessage } from 'react-intl';
function MyComponent() {
return (
<div>
{data.map(item => (
<p key={item.id}>
<FormattedMessage id={item.id} defaultMessage={item.defaultMessage} />
</p>
))}
</div>
);
}
```
每个 `FormattedMessage` 组件都接受 `id` 和 `defaultMessage` 属性。`id` 用于标识消息,在不同的语言文件中你可以为这些 `id` 提供不同的翻译。`defaultMessage` 是一个备用文本,当没有找到对应语言的翻译时会显示。
### 总结
这种方法允许你在React应用程序中迭代i18n对象数组,并根据用户的语言偏好显示相应的文本。你可以扩展这个例子,根据实际需要在迭代过程中加入更复杂的逻辑或样式处理。通过使用 `react-intl`,你可以很方便地管理和维护你的多语言内容,使你的应用可以吸引和服务于更广泛的全球用户群。
阅读 22 · 8月13日 23:25
如何使用i18next在嵌套翻译中应用格式化程序
在使用i18next进行国际化处理时,处理嵌套翻译和使用格式化程序是一个常见的需求。以下是如何在i18next中使用嵌套翻译和格式化程序的步骤和示例。
### 步骤 1: 初始化i18next配置
首先,确保i18next已正确初始化,并且已加载所需的语言资源和插件。例如,我们需要安装并配置`i18next`和`react-i18next`(如果在React环境中)。
```javascript
import i18next from 'i18next';
import { initReactI18next } from 'react-i18next';
i18next
.use(initReactI18next)
.init({
resources: {
en: {
translation: {
greeting: "Hello, {{name}}!",
invitation: "You have {{count}} new messages.",
nestedExample: "This is a nested translation: $t(greeting)"
}
}
},
lng: 'en',
interpolation: {
escapeValue: false
}
});
```
### 步骤 2: 嵌套翻译和格式化
在上面的例子中,我们已经设置了一些基本的翻译字符串,其中`nestedExample`是一个嵌套翻译的例子。在i18next中,使用`$t(key)`可以嵌套另一个翻译。
为了应用格式化,我们可以在翻译字符串中使用变量,如`{{name}}`和`{{count}}`,并在使用翻译时传递这些变量。
### 示例: 使用嵌套翻译和格式化
让我们来看一个实际的例子,假设我们需要格式化时间并在嵌套翻译中使用它。
```javascript
i18next.addResources('en', 'translation', {
timeMessage: "The current time is {{time, HH:mm:ss}}",
detailedMessage: "Hello {{name}}, $t(timeMessage)"
});
// 使用自定义格式化函数
i18next.init({
interpolation: {
format: function(value, format, lng) {
if (format === 'HH:mm:ss' && value instanceof Date) {
return value.toISOString().substring(11, 19);
}
return value;
}
}
});
const message = i18next.t('detailedMessage', { name: 'John', time: new Date() });
console.log(message); // 输出:"Hello John, The current time is 14:25:30"
```
在这个例子中,`detailedMessage`使用了嵌套翻译`timeMessage`,并且两者都使用了格式化。由于`timeMessage`需要一个时间格式,我们在初始化时添加了一个格式化函数,它检查格式并相应地返回处理过的时间格式。
### 总结
通过利用i18next的嵌套翻译功能和灵活的格式化选项,我们可以创建复杂和动态的国际化应用。在实际开发中,这种技术可以帮助我们处理各种语言和格式的需求,提升应用的国际化水平和用户体验。
阅读 9 · 8月13日 23:24
如何使用React js和 i18next 将使用区域设置添加到路径中?
当您想在React应用程序中实现国际化和本地化时,`i18next` 是一个非常流行和强大的库。为了将区域设置添加到路径中,您可以使用 `react-router` 与 `i18next` 结合。以下是一步一步的方法:
### 步骤 1: 安装必要的库
首先,确保您的项目中安装了 `react-router-dom` 和 `i18next` 相关库。
```bash
npm install react-router-dom i18next react-i18next i18next-http-backend i18next-browser-languagedetector
```
### 步骤 2: 配置 i18next
在您的项目中配置 `i18next`。这通常是在一个单独的配置文件中完成的,例如 `i18n.js`。
```javascript
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import HttpBackend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
i18n
.use(HttpBackend) // 加载翻译文件
.use(LanguageDetector) // 自动检测用户语言
.use(initReactI18next) // pass the i18n instance to react-i18next.
.init({
fallbackLng: 'en', // 使用英语作为备选语言
debug: true,
detection: {
order: ['path', 'cookie', 'header'],
lookupFromPathIndex: 0
},
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json', // 路径为语言和命名空间
},
});
export default i18n;
```
### 步骤 3: 设置路由
配置 `react-router`,使其可以在URL中捕捉到语言代码,并据此渲染对应的组件。
```javascript
import React from 'react';
import { BrowserRouter as Router, Route, Switch, Redirect } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import HomePage from './HomePage';
import AboutPage from './AboutPage';
function App() {
const { i18n } = useTranslation();
return (
<Router>
<Switch>
<Route path="/:lng" children={<Header />} />
<Route path="/:lng/home" render={() => <HomePage />} />
<Route path="/:lng/about" render={() => <AboutPage />} />
<Redirect from="/" to={`/${i18n.language}`} />
</Switch>
</Router>
);
}
export default App;
```
### 步骤 4: 修改语言
在您的应用中,提供一种方式让用户能够切换语言。
```javascript
import { useTranslation } from 'react-i18next';
function LanguageSwitcher() {
const { i18n } = useTranslation();
const changeLanguage = (language) => {
i18n.changeLanguage(language);
};
return (
<div>
<button onClick={() => changeLanguage('en')}>English</button>
<button onClick={() => changeLanguage('zh')}>中文</button>
</div>
);
}
export default LanguageSwitcher;
```
### 总结
通过以上步骤,您可以在React应用程序中使用`i18next`和`react-router`实现带语言切换的国际化。这不仅增强了用户体验,而且也有助于应用的全球化。通过这种方式,URL中的每个不同语言版本都能直接访问,也有利于SEO优化。
阅读 25 · 8月13日 23:24
如何强制useTranslation中的react-i18next t函数推断语言?
在使用 `react-i18next` 的 `useTranslation` 钩子中,强制 `t` 函数推断特定语言可以通过几种方式实现。主要的方法是使用 `i18next` 的 `changeLanguage` 函数来动态改变当前语言环境,或者在调用 `t` 函数时明确指定语言。
### 方法一:使用 `changeLanguage` 函数
`changeLanguage` 函数允许你动态地改变当前的语言环境。这个方法是全局的,会影响整个应用的语言设置。
```javascript
import React from 'react';
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t, i18n } = useTranslation();
const handleClick = (language) => {
i18n.changeLanguage(language);
};
return (
<div>
<button onClick={() => handleClick('en')}>English</button>
<button onClick={() => handleClick('fr')}>French</button>
<p>{t('welcome_message')}</p>
</div>
);
}
```
在这个例子中,点击按钮会改变应用的当前语言,并且 `t` 函数会根据新的语言环境返回相应的翻译。
### 方法二:在调用 `t` 函数时指定语言
如果你不想改变全局的语言环境,而只是想对特定的翻译调用使用不同的语言,可以在调用 `t` 函数时直接指定语言。
```javascript
import React from 'react';
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation();
return (
<div>
{/* 默认语言 */}
<p>{t('welcome_message')}</p>
{/* 指定语言为法语 */}
<p>{t('welcome_message', { lng: 'fr' })}</p>
</div>
);
}
```
在这个例子中,第一个 `t` 调用使用的是应用的默认语言,而第二个 `t` 调用则明确指定使用法语进行翻译。
### 总结
这两种方法各有利弊。使用 `changeLanguage` 可以全局更改语言,适合用于语言切换功能的实现。而在 `t` 函数中直接指定语言则更灵活,适用于只需部分文本使用不同语言的情况。根据你的具体需求选择合适的方法。
阅读 15 · 8月13日 23:23
如何在react-i18next语言环境中使用html标签?
在使用 `react-i18next` 库进行国际化时,有时我们需要在翻译文本中嵌入 HTML 标签来实现一些格式化。例如,可能需要在一段文本中对某些单词进行强调,或者添加链接等。`react-i18next` 提供了几种方法来实现这一点,确保既可以进行国际化又可以安全地渲染 HTML。
### 方法1: 使用 `Trans` 组件
`Trans` 组件是 `react-i18next` 提供的一个方式,用于处理复杂的翻译场景,如插入 HTML 标签或组件。使用 `Trans` 组件时,你可以直接在你的翻译资源文件中加入 HTML 标签。
假设你有如下的翻译资源:
```json
{
"welcome": "<strong>Welcome</strong> to our website, <a href='/about'>learn more</a> about us."
}
```
然后在 React 组件中这样使用:
```jsx
import React from 'react';
import { Trans, useTranslation } from 'react-i18next';
function MyApp() {
const { t } = useTranslation();
return (
<div>
<Trans i18nKey="welcome">
<strong>Welcome</strong> to our website, <a href="/about">learn more</a> about us.
</Trans>
</div>
);
}
export default MyApp;
```
在这个例子中,`Trans` 组件会安全地渲染 HTML,并保持翻译文本中的 HTML 结构。
### 方法2: 使用 `dangerouslySetInnerHTML`
如果你不想使用 `Trans` 组件,另一个选择是利用 React 的 `dangerouslySetInnerHTML` 属性。这种方法应当谨慎使用,因为它可能会导致 XSS(跨站脚本攻击)安全问题。
首先,确保你的翻译字符串是安全的,然后这样使用:
```jsx
import React from 'react';
import { useTranslation } from 'react-i18next';
function MyApp() {
const { t } = useTranslation();
return (
<div>
<p dangerouslySetInnerHTML={{ __html: t('welcome') }}></p>
</div>
);
}
export default MyApp;
```
### 安全注意事项
- 当使用 `dangerouslySetInnerHTML` 时,务必确保翻译字符串来源是安全的,避免 XSS 攻击。
- 尽量使用 `Trans` 组件,因为它提供了更安全、更灵活的方式来处理 HTML 和组件。
通过上述方法,你可以在 `react-i18next` 中灵活地使用 HTML 标签,同时确保应用的国际化和多语言支持。
阅读 12 · 8月13日 23:23
如何使用i18n在react native中使用多语言进行插值
在React Native项目中使用i18n进行多语言支持和插值的过程可以分为几个步骤。我将逐步展示如何实现这一功能,包括一些实际的代码示例。
### 步骤1:安装依赖项
首先,我们需要安装`react-native-i18n`或者`i18next`以及`react-i18next`库。这里以`i18next`和`react-i18next`为例,因为它们支持更复杂的功能如插值、复数、上下文等。
```bash
npm install i18next react-i18next
```
### 步骤2:配置i18n
创建一个`i18n.js`文件用来配置`i18next`。在这个文件中,我们会初始化`i18next`并定义我们的语言包。
```javascript
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
const resources = {
en: {
translation: {
"welcome": "Welcome, {{name}}!"
}
},
zh: {
translation: {
"welcome": "欢迎, {{name}}!"
}
}
};
i18n
.use(initReactI18next)
.init({
resources,
lng: "en", // 可以设置为默认语言
interpolation: {
escapeValue: false
}
});
export default i18n;
```
### 步骤3:在React组件中使用
在React组件中,我们可以使用`useTranslation` Hook来加载翻译函数,并使用它来插值。
```javascript
import React from 'react';
import { useTranslation } from 'react-i18next';
function WelcomeComponent() {
const { t } = useTranslation();
const name = "John";
return <h1>{t('welcome', { name })}</h1>;
}
```
在上面的例子中,`{{name}}`将被传入的`name`变量的值(这里是"John")替换,从而根据当前语言显示相应的问候语。
### 步骤4:切换语言
如果你需要在应用中切换语言,可以使用`i18next.changeLanguage`方法。
```javascript
import { i18n } from './i18n';
function changeLanguage(language) {
i18n.changeLanguage(language);
}
```
调用`changeLanguage('zh')`就可以切换到中文。
### 总结
通过这种方式,我们可以在React Native应用中轻松地实现多语言功能,并且支持动态插值,这对于需要根据用户输入或动态数据显示文本的应用来说非常有用。以上的设置也支持事先定义好的翻译文本,确保文本内容的国际化和本地化。
阅读 19 · 8月13日 23:22
如何在React上集成保存为JSONB数据并与REST API获取的i18n翻译资源?
### 解决方案步骤
#### 1. 设计数据模型和API
首先,您需要设计后端的数据模型,以及相应的REST API。这些API将处理JSONB数据的保存与查询,并且提供接口用来访问和更新i18n资源。
- **数据模型**: 假设您使用的是一个支持JSONB的数据库(如PostgreSQL),您可以创建一个模型,该模型包含一个JSONB字段专门用来存储多语言相关数据。
- **REST API**: 设计REST API来接受JSONB数据并存储在数据库中。同时,设计API以便能够查询和更新i18n翻译资源。
#### 2. 集成数据库和API到后端应用
使用您选择的后端技术(如Node.js, Python等),集成数据库操作。确保API能够正确处理JSONB格式的数据,并提供必要的端点来管理i18n资源。
#### 3. 使用React来构建前端
在React应用中,您需要构建用户界面来与这些API交互。
- **数据保存**: 创建表单或界面,允许用户输入数据,然后通过API发送JSONB格式的数据到后端存储。
- **国际化**: 使用如 `react-i18next`之类的库来集成i18n。配置这个库从您的REST API获取翻译资源。
#### 4. 使用Axios或Fetch来与REST API通信
在React中,您可以使用 `axios`或 `fetch`来处理与REST API的交互。这包括发送数据以及请求翻译资源。
- **发送数据**: 当用户提交数据时,使用 `axios.post`或者 `fetch`的POST方法将数据发送到您的API。
- **获取翻译资源**: 在应用启动或用户更改语言时,从API获取最新的翻译资源。
#### 5. 测试和优化
在集成全部组件后,进行彻底的测试来确保所有部分都能正常工作。检查数据是否能正确保存为JSONB,以及翻译是否根据用户的语言偏好正确加载。
### 示例
假设您有一个用于收集用户反馈的表单,您希望这些数据以JSONB的格式保存,并且表单支持多语言。
**后端 (Node.js + Express + PostgreSQL):**
```javascript
const express = require('express');
const bodyParser = require('body-parser');
const { Pool } = require('pg');
const pool = new Pool({
connectionString: '您的数据库连接字符串'
});
const app = express();
app.use(bodyParser.json());
app.post('/api/feedback', async (req, res) => {
const { feedback, language } = req.body;
const query = 'INSERT INTO feedbacks(data) VALUES($1) RETURNING *';
const values = [{ feedback, language }];
try {
const { rows } = await pool.query(query, [values]);
res.status(201).json(rows[0]);
} catch (err) {
res.status(500).json({ error: 'Internal Server Error' });
}
});
app.listen(3000, () => console.log('Server running on port 3000'));
```
**前端 (React + Axios):**
```javascript
import React, { useState } from 'react';
import axios from 'axios';
import { useTranslation } from 'react-i18next';
function FeedbackForm() {
const { t, i18n } = useTranslation();
const [feedback, setFeedback] = useState('');
const handleFeedbackChange = (event) => {
setFeedback(event.target.value);
};
const handleSubmit = async (event) => {
event.preventDefault();
try {
const response = await axios.post('/api/feedback', { feedback, language: i18n.language });
console.log('Saved:', response.data);
} catch (error) {
console.error('Error saving feedback:', error);
}
};
return (
<form onSubmit={handleSubmit}>
<label>
{t('feedbackLabel')}
<textarea value={feedback} onChange={handleFeedbackChange} />
</label>
<button type="submit">{t('submit')}</button>
</form>
);
}
export default FeedbackForm;
```
在这个例子中,我们设计了一个简单的后端来接收和存储JSONB数据,和一个React前端表单来提交这些数据同时支持多语言。
阅读 11 · 8月13日 23:22
React Native 如何在 i18next 中设置默认语言?
在React Native项目中使用i18next来实现国际化时,设置默认语言是一个常见需求。i18next是一个强大的国际化框架,它让你能够轻松地在应用程序中切换和维护多种语言。下面我将详细介绍如何在React Native项目中使用i18next设置默认语言。
### 步骤 1: 安装必要的库
首先,确保你已经安装了`i18next`和`react-i18next`。如果还没有安装,可以通过npm或yarn来安装这些库:
```bash
npm install i18next react-i18next
```
或者使用yarn:
```bash
yarn add i18next react-i18next
```
### 步骤 2: 配置i18next
接下来,需要配置i18next。通常,这一步会在一个单独的配置文件中完成,例如 `i18n.js`。在这个文件中,你将初始化i18next并设定默认语言。
```javascript
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
// 引入语言资源文件
import en from './locales/en.json';
import zh from './locales/zh.json';
i18n
// 使用initReactI18next插件来传递i18n实例给React
.use(initReactI18next)
.init({
resources: {
en: {
translation: en
},
zh: {
translation: zh
}
},
lng: "en", // 设置默认语言为英语
fallbackLng: "en", // 当当前语言没有相应翻译时的后备语言
interpolation: {
escapeValue: false // react已经安全地处理了XSS
}
});
export default i18n;
```
### 步骤 3: 在React组件中使用i18next
配置完i18next后,可以在React Native组件中使用它。通过`useTranslation` Hook,可以获取到`t`函数,用于获取当前语言的翻译文本。
```javascript
import React from 'react';
import { Text, View } from 'react-native';
import { useTranslation } from 'react-i18next';
function WelcomeScreen() {
const { t } = useTranslation();
return (
<View>
<Text>{t('welcome')}</Text>
</View>
);
}
export default WelcomeScreen;
```
在这个例子中,`t('welcome')`会根据当前的语言环境返回相应的翻译文本。
### 步骤 4: 动态更改语言
如果需要在应用中允许用户更改语言,可以使用i18next的`changeLanguage`方法来实现。
```javascript
import { Button } from 'react-native';
function ChangeLanguageButton() {
const { i18n } = useTranslation();
return (
<Button
title="Change to Chinese"
onPress={() => i18n.changeLanguage('zh')}
/>
);
}
```
这个按钮组件使用户能够通过点击来切换到中文界面。
### 总结
通过以上步骤,你可以在React Native项目中使用i18next设置默认语言,并根据需要轻松切换语言。这种方式不仅可以增强用户体验,还可以提高应用程序的国际化水平。
阅读 23 · 8月13日 23:22