当app-name在InfoPlist.strings中本地化时,不同的app-name取决于配置

时间:2014-08-27 13:22:10

标签: ios configuration localization info-plist cfbundledisplayname

我们为每种配置使用具有不同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?

2 个答案:

答案 0 :(得分:7)

更好的解决方案

  1. 修改 Info.plist ,将CFBundleDisplayName的值设置为名为$(MY_DISPLAY_NAME)
  2. 的变量

    enter image description here

    1. 打开项目目标'构建设置'标签,在用户下添加名为MY_DISPLAY_NAME的密钥-Defined 部分(您需要滚动到底部才能找到此部分),然后只需展开新添加的密钥,并根据需要为每个配置设置任何名称。
    2. enter image description here

      构建项目时,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
      

      enter image description here

      步骤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.stringsde.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 中的用户定义设置,在我的例子中是 TAEC

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

enter image description here

附注: 我假设您在目标目录中已经有一个 InfoPlist.strings 文件。如果没有,只需添加一个新的 Strings File 并将其命名为 InfoPlist.strings 并在其中添加此值:

CFBundleDisplayName = "My Localized Widget";

希望对大家有所帮助!