Flutter i18n 指南指出,iOS 应用程序应在 Info.plist
文件中定义支持的语言环境。然后,该指南继续给出据我所知适用于 Xcode GUI 的说明。然而,我没有 Xcode,甚至没有 Mac,我计划使用 GitHub actions 来生成 iOS 版本。我如何手动执行记录的操作?
通常,iOS 应用程序在内置于应用程序包中的 Info.plist 文件中定义关键应用程序元数据,包括支持的区域设置。要配置您的应用程序支持的区域设置,请使用以下说明:
打开项目的 ios/Runner.xcworkspace Xcode 文件。
- 在项目导航器中,打开 Runner 项目的 Runner 文件夹下的 Info.plist 文件。
- 选择信息属性列表项。然后从编辑器菜单中选择添加项目,然后从弹出菜单中选择本地化。
- 选择并展开新创建的本地化项。对于您的应用程序支持的每个区域设置,添加一个新项目并从“值”字段的弹出菜单中选择要添加的区域设置。此列表应与supportedLocales参数中列出的语言一致。
- 添加所有支持的区域设置后,保存文件。
Info.plist
添加了区域设置列表(在
<dict>
内):
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>it</string>
</array>
InfoPlist.strings
文件夹中创建了一个名为
Runner
的空文件。您可以在此处放置默认字符串;我没有。
Runner/en.lproj
和
Runner/it.lproj
。在每个文件夹中,我创建了另一个
InfoPlist.strings
文件。
InfoPlist.strings
,例如:
CFBundleDisplayName="Guidi Tu";
NSMotionUsageDescription="Due minigiochi usano l'accelerometro.";
project.pbxproj
的文件。棘手的部分现在开始。选择随机 ID:两个用于
Runner/InfoPlist.strings
,一个用于每个本地化
Runner/*.jproj/InfoPlist.strings
文件。
899999999999999999900000
和
999999999999999999900000
用于通用文件;
999999999999999999900001
用于英语本地化;
999999999999999999900002
用于意大利语本地化。
project.pbxproj
的不同部分中既作为“构建文件”又作为“文件引用”链接。 ID 的长度为 24 个字节,您可以对 24 个数字中的每一个使用 [0-9A-F],只要它们是新的且唯一的就可以了。
PXBuildFile
的
project.pbxproj
部分声明了通用文件:
899999999999999999900000 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 999999999999999999900000 /* InfoPlist.strings */; };
PBXFileReference
部分声明了本地化文件:
999999999999999999900001 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
999999999999999999900002 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
fileRef
组中的
PBXGroup
部分中添加了对通用文件的引用(使用
Runner
!):
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
999999999999999999900000 /* InfoPlist.strings */,
);
path = Runner;
sourceTree = "<group>";
};
PBXResourcesBuildPhase
构建阶段中的
Resources
部分中添加了对通用文件的引用(使用另一个 ID!):
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
899999999999999999900000 /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
fileRef
部分中为通用文件创建了一个新的变体组(使用
PBXResourcesBuildPhase
),将所有本地化文件设置为变体:
999999999999999999900000 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
999999999999999999900001 /* en */,
999999999999999999900002 /* it */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
就是这样。现在可以用了。如果您想重现该过程,请仔细检查每个步骤。