Skip to main content

expo开发安卓app,多语言名称显示这样做,还能更优雅点吗?

被证明不可行的方法,但还是提一下

网上有都市传说,在app.config.js中做相应配置,就可以不必在安卓原生目录下进行繁琐的xml配置,而实现安卓app名称的多语言显示了,具体配置大体如下:

const withAndroidStrings = (config) => {
return {
...config,
android: {
...config.android,
strings: {
app_name: {
'zh-rCN': '功过格',
'ja': '功過格',
'en': 'Gong Guo Ge'
}
}
}
};

export default ({ config }) => {
return withAndroidStrings(config);
};

现在是2024年10月下旬,expo SDK 51,实测证明上述说法无效。

如果将js改成ts,查看类型语法报错,就知道expo根本不支持上述配置中的strings字段。 然后强制运行,打包均宣告无效,app的名称永远是app.json中配置的那个expo - name。

目前唯一可行的办法

只能在android原生目录下(没错,prebuild后的),app/src/main/res下,找到values目录下面的strings.xml文件,修改默认语言名称(<string name="app_name">YOUR_APP_NAME</string>),然后在res目录下新建多个values目录,格式是values-国家语言缩写,如values-zh-rCNvalues-ja, values-fr等等,各自下面拷贝刚才的strings.xml并相应修改app_name值即可。 strings.xml大体长这样:

<resources>
<string name="app_name">iChingLife</string>
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
<string name="expo_system_ui_user_interface_style" translatable="false">automatic</string>
<string name="expo_runtime_version">1.0.0</string>
</resources>

顺便说说iOS怎么做

如果不想在xcode配置,要用更优雅的方法(也就是直接在expo项目代码中配置),方法如下:

  1. 建立locale文件 目录所在地自己设计,我是在项目根目录下面建立locale目录,把所有多语言文本相关内容放在里面,比如名称类的元数据我就放在其下的meta中。

  2. 配置app names 各语言建一个json文件,如日文叫jp.json。 CFBundleDisplayName就是iOS app显示名称的字段,NSContactsUsageDescription是描述,可以不管。

{
"CFBundleDisplayName": "学易",
"NSContactsUsageDescription": "日本語のこれらの言葉"
}
  1. 配置app.json 在expo项下建立locales项如下,各语言项指向其对应文件:
"locales": {
"zh-Hans": "./locale/meta/zh-Hans.json",
"zh-Hant": "./locale/meta/zh-Hant.json",
"ja": "./locale/meta/jp.json",
"en": "./locale/meta/en.json"
...
},

// 别忘了还要加一个在expo - ios - infoPlist中。
"ios": {
...
"infoPlist": {
...
"CFBundleAllowMixedLocalizations": true
},
}

毕竟亲儿子,iOS的配置要优雅很多。