【问题标题】:Different app-name depending on configuration when app-name is localized in InfoPlist.strings当应用程序名称在 InfoPlist.strings 中本地化时,不同的应用程序名称取决于配置
【发布时间】:2014-10-21 02:34:30
【问题描述】:

我们为每种配置使用具有不同 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,我们无法区分不同配置的 app-name。

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

有人知道如何实现本地化和基于配置的应用名称吗?

【问题讨论】:

  • 你有没有解决这个问题,遇到完全相同的问题

标签: ios configuration localization info-plist cfbundledisplayname


【解决方案1】:

更好的解决方案

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

  1. 打开projecttarget'Build Settings'标签,在User-Defined下添加一个名为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 文件。

【讨论】:

  • 我花了很多精力和反复试验,才让这个InfoPlist.strings文件在我们这边工作,但我把它整理好了。 perl -pi -e "s/NameInStringsFile[^\"]*/NameInStringsFile (Extra)/g" "${PROJECT_DIR}/path/to/InfoPlist.strings"
  • 如何本地化 MY_DISPLAY_NAME?
【解决方案2】:

由于文件InfoPlist.strings 不仅仅是一个单个文件,而是分布在多个文件夹和文件中,如下所示: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 步:

  • 从目标的 Copy Bundle Resources 构建阶段中删除 InfoPlist.strings

单击您的项目名称 -> 选择小部件的目标(例如 Today Widget) -> 转到 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 文件夹中的最终文件夹结构:

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

CFBundleDisplayName = "My Localized Widget";

希望对大家有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多