12

我们为每种配置使用具有不同 plist 的设置。像这样: Target-Info-Dev.plist、Target-Info-Beta.plist...

这样我们的配置可以有自己的 CFBundleDisplayName,我们可以通过设备上的 app-name 来区分构建。像这样:“DEV Appname”,“BETA Appname”...

但是,现在我们需要本地化应用程序名称。我们通过为每个目标创建一个本地化的 InfoPlist.strings 来做到这一点:

"CFBundleDisplayName" = "<localized-appname>";
"CFBundleName" = "<localized-appname>";

但由于 CFBundleDisplayName 不再派生自Target-Info-[Configuration].plist,我们无法区分不同配置的应用名称。

应该注意的是,对于同一个应用程序的不同品牌,我们也有多个目标,但我们已经通过为每个目标设置一个单独的 InfoPlist.strings 来实现这一点。

任何人都知道如何完成本地化和基于配置的应用程序名称?

4

2 回答 2

11

更好的解决方案

  1. 编辑Info.plist,将CFBundleDisplayName's value 设置为名为类似的变量$(MY_DISPLAY_NAME)

在此处输入图像描述

  1. 打开项目目标的“构建设置”选项卡,在用户定义部分下添加一个名为的键(您需要滚动到底部才能找到该部分),然后只需展开新添加的键,并为每个配置设置任何名称如你所愿。MY_DISPLAY_NAME

在此处输入图像描述

在构建项目时,Info.plist 中的每个变量都将被替换为其值。

该解决方案比原来的解决方案简单得多。

原始解决方案

我的项目中有同样的需求,然后我找到了你的问题,最后我解决了。 编辑您的项目方案,添加操作前和操作后脚本以执行您的更改。像这样,

步骤 1. 在 Build 的 Pre-actions 中更改应用名称

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 的 Post-actions 中恢复应用名称

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 文件。

于 2016-05-06T08:36:36.237 回答
2

由于该文件InfoPlist.strings不仅仅是 1 个单个文件,而是分布在多个文件夹和文件中,如下所示:en.lproj/InfoPlist.strings, de.lproj/InfoPlist.strings. 将它用于不同的方案有点棘手。以下是我如何本地化由同一目标的 2 个风格/方案共享的 Today Widget 的名称。出于演示目的,我使用了 2 种“口味”:TAEC. 我将在此答案中提及它们。

步骤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,在我的情况下将是TAor 或EC

这是 Today Widget 文件夹中的最终文件夹结构:

在此处输入图像描述

PS: 我假设您已经InfoPlist.strings在目标目录中有一个文件。如果没有,只需添加一个新的Strings File并调用它InfoPlist.strings并在其中添加此值:

CFBundleDisplayName = "My Localized Widget";

我希望它可以帮助那里的任何人!

于 2021-04-23T13:54:59.817 回答