我正在创建快速的应用程序。它包含Localizable.strings文件中的一些字符串。每当我想使用它时,我需要通过它的id来获取它。一开始我用它们创建了一个枚举,但每次添加新文本时手动添加它都有点烦人。 我试图简化这个过程,并在xcode构建阶段添加新的脚本阶段。这个脚本为我创建字符串扩展类,然后逐行读取可本地化的文件,在引号之间查找单词并将其转换为字符串变量。一般来说,它看起来如下:
echo "
import Foundation
extension String {
" > Classes/Constants/StringId.swift
while IFS= read -r line;do
PREFIX="static var"
VAR_NAME=`echo $line| awk -F \" '{print $2}'`
SUFFIX_1=": String {
get {
return String.from(core: \"$VAR_NAME\")
}}"
SUFFIX_2="\""
if [ -z "$VAR_NAME" ]
then
echo "empty"
else
echo "$PREFIX lib_$VAR_NAME $SUFFIX_1" >> Classes/Constants/StringId.swift
fi
done < Resources/Base.lproj/Localizable.strings
其中String.from ...是从正确的资源文件中获取字符串的内部方法(如通用字符串,可访问性字符串或可品牌字符串)。
结果我有一个具有以下结构的类:
import Foundation
extension String {
static var lib_author_website : String {
get {
return String.from(core: "author_website")
}}
static var lib_author_name : String {
get {
return String.from(core: "author_name")
}}
static var lib_app_name : String {
get {
return String.from(core: "app_name")
}}
}
最后我可以调用字符串:
label.text = String.lib_app_name
这只是我的想法,但我需要自己制作所有这些,所以我只是好奇是否有更好或更受欢迎的解决方案呢?我打算对资产名称和故事板做同样的事情,但也许有更好的方法来处理这个问题?
答案 0 :(得分:2)
dr_barto是对的。您需要使用pod:https://github.com/SwiftGen/SwiftGen
我的例子
xCode 9.0.1,Swift 4
Podfile
target 'stackoverflow-46981208' do
use_frameworks!
pod 'SwiftGen'
end
运行脚本
TemplatePath=$PODS_ROOT/SwiftGen/templates
LocalizablePath=$PROJECT_DIR/stackoverflow-46981208/Localization
$PODS_ROOT/SwiftGen/bin/swiftgen strings "$LocalizablePath/en.lproj/Localizable.strings" -p $TemplatePath/strings/flat-swift4.stencil --output "$LocalizablePath/GeneratedStrings.swift";
Localizable.strings
"Hello" = "Hello";
print(L10n.hello)
答案 1 :(得分:0)
您可以使用SwiftGen自动生成代码,以便对各种项目资源进行类型安全访问,其中包括localizable strings。它甚至支持字符串中的占位符。该工具可以在命令行上独立运行,也可以集成到项目的构建过程中,这样每次编译时都可以获得更新的本地化代码。