我们为每种配置使用具有不同plist的设置。像这样: Target-Info-Dev.plist,Target-Info-Beta.plist ...
这样我们的配置可以拥有自己的CFBundleDisplayName,我们可以通过设备上的app-name来区分构建。像这样:" DEV Appname"," BETA Appname" ...
但是,现在我们需要本地化app-name。我们通过为每个目标创建本地化的InfoPlist.strings来完成此任务:
"CFBundleDisplayName" = "<localized-appname>";
"CFBundleName" = "<localized-appname>";
但由于CFBundleDisplayName不再来自 Target-Info- [Configuration] .plist ,我们无法区分不同配置的app-name。
应该注意的是,对于同一应用程序的不同品牌,我们也有几个目标,但我们已经通过为每个目标创建单独的InfoPlist.strings来实现这一目标。
任何人都知道如何完成本地化和基于配置的app-name?
答案 0 :(得分:7)
CFBundleDisplayName
的值设置为名为$(MY_DISPLAY_NAME)
MY_DISPLAY_NAME
的密钥-Defined 部分(您需要滚动到底部才能找到此部分),然后只需展开新添加的密钥,并根据需要为每个配置设置任何名称。构建项目时,Info.plist中的每个变量都将替换为其值。
解决方案比原始解决方案简单得多。
我的项目中有相同的要求,然后我找到了你的问题,最后我解决了它。 编辑项目计划,添加操作前和操作后脚本以执行更改。像这样,
步骤1.在Build的预操作中更改应用名称
str=""
if [ "${CONFIGURATION}" == "Debug" ];then
str="dev"
elif [ "${CONFIGURATION}" == "AdhocDevelopment" ];then
str="dev"
elif [ "${CONFIGURATION}" == "AdhocDistribution" ];then
str="adhoc"
elif [ "${CONFIGURATION}" == "DailyBuild" ];then
str="rdm"
fi
perl -pi -e "s/appName[^<]*/appName${str}/g" ${PROJECT_DIR}/smd/Info.plist
步骤2.在Build的后期操作中恢复应用名称
perl -pi -e "s/appName[^<]*/appName/g" ${PROJECT_DIR}/smd/Info.plist
echo ${PROJECT_DIR}/${INFOPLIST_FILE} > ~/tmp.txt; rm -f ~/tmp.txt
需要解释的一点:Debug / AdhocDevelopment / AdhocDistribution / DailyBuild是您项目的配置名称; $ {CONFIGURATION}由Xcode预定义; perl比awk和sed更好,它们都预先安装在每个mac OS X上。
顺便说一句,我所做的是改变Info.plist中的appName,你可以改变你的infoPlist.strings。通过这种方式,您只需要一个Info.plist文件。
答案 1 :(得分:0)
因为文件 InfoPlist.strings
不只是 1 个单个文件,而是分布在多个文件夹和文件中,如下所示:en.lproj/InfoPlist.strings
、de.lproj/InfoPlist.strings
。将它用于不同的方案有点棘手。
以下是我如何本地化由同一目标的 2 种风格/方案共享的 Today Widget 的名称。出于演示目的,我使用了 2 个“口味”:TA
和 EC
。我会在这个答案中提到它们。
第 1 步:
user-defined
方案中的名称命名每个文件夹。复制 InfoPlist.strings
文件。这一步可能很棘手。我做了什么:我在 XCode 中创建了一个新文件夹并将其命名为 TA
。我将我的 InfoPlist.strings
文件拖放到那里,然后在 Finder 中浏览到该文件夹,复制该文件夹,并将其重命名为 EC
。然后,我将它拖放到 XCode 中。不要将它添加到任何目标。不需要。
第 2 步:
InfoPlist.strings
构建阶段移除 Copy Bundle Resources
:单击您的项目名称 -> 选择小部件的目标(例如今天小部件) -> 转到 Build Phases
-> 打开 Copy Bundle Resources
-> 找到文件 InfoPlist.strings
,选择然后按Delete
按钮
第 3 步:
InfoPlist.strings
文件这是我想出的脚本,它将根据您的应用程序正在运行的当前风格/方案复制正确的文件:
for lng in en de es fr it nl pt-PT tr
do
INFO_PLIST_FILE="${PROJECT_DIR}/TodayMatchesWidget/${APP_FLAVOR}/${lng}.lproj/InfoPlist.strings"
BUILD_APP_DIR="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}"
FILE_LOCATION="${BUILD_APP_DIR}/${lng}.lproj/InfoPlist.strings"
cp "${INFO_PLIST_FILE}" "${FILE_LOCATION}"
done
<块引用>
这是一个 for 循环,它遍历我所有的本地化 语言。你只需要把你支持的语言放在那里。 每个语言的缩写都应该用空格隔开,什么都没有 否则。
您需要处理的唯一变量是APP_FLAVOR
,
在我的例子中是项目的 Build Settings
中的用户定义设置,在我的例子中是 TA
或 EC
。
这是 Today Widget 文件夹中的最终文件夹结构:
附注:
我假设您在目标目录中已经有一个 InfoPlist.strings
文件。如果没有,只需添加一个新的 Strings File
并将其命名为 InfoPlist.strings
并在其中添加此值:
CFBundleDisplayName = "My Localized Widget";
希望对大家有所帮助!