CMake 生成带有本地化的 xcode 项目

Posted

技术标签:

【中文标题】CMake 生成带有本地化的 xcode 项目【英文标题】:CMake generate xcode project with localizations 【发布时间】:2015-04-08 14:18:59 【问题描述】:

我们正在使用 cMake 作为创建 Xcode 项目的工具来开发我们的 OSX 项目。

然而,事实证明我们现在需要一些本地化,为此我们需要英语和德语的 .xib 文件(或 .strings 来生成它们,这不是重要的一点)。

我们将文件放在正确的位置并正确创建,但是当 cMake 生成项目时,这些文件作为两个完全独立且独立的文件插入到 Xcode 项目中,例如:

Foo.xib foo.xib

而不是两个同名的“子文件”:

Foo.xib - Foo.xib(英文) - Foo.xib(德语)

如果我将 en.lproj 和 sv.lproj 中的 xib 直接拖放到项目资源管理器中的资源文件夹: Xcode 会自动检测到这是同一 UI 的一些不同语言,因此这些语言会自动添加到项目设置中。 此外,xib 在项目浏览器 3 中有一个 MainMenu.xib 组,由两种语言组成。

我尝试通过 cmake 将本地化的 xib 添加到项目中。它们被添加到资源文件夹中,但不是已识别的本地化,我在项目资源管理器中只得到了两个 xib,三个没有本地化,它们之间没有联系。

如何通过 cmake 生成使本地化工作?

set(CEFCLIENT_RESOURCES_MAC_ENGLISH_LPROJ_SRCS_MACOSX
  mac/en.lproj/MainMenu.xib
  )

  set(CEFCLIENT_RESOURCES_MAC_SWEDISH_LPROJ_SRCS_MACOSX
  mac/sv.lproj/MainMenu.xib
  )

set(CEFCLIENT_RESOURCES_SRCS
  $CEFCLIENT_RESOURCES_MAC_SRCS
  $CEFCLIENT_RESOURCES_MAC_ENGLISH_LPROJ_SRCS
  $CEFCLIENT_RESOURCES_MAC_SWEDISH_LPROJ_SRCS
  $CEFCLIENT_RESOURCES_RES_SRCS
  )

有没有办法通过 cmake 生成 Xcode 项目并且 .lproj 包工作?

【问题讨论】:

您找到解决方案了吗?我也在为 I18N 和 L17N 苦苦挣扎。 最终改用我们自己的语言处理,在运行时替换应用中的文本... 你有没有想过使用构建阶段来做到这一点?我写了一个本地化系统来做到这一点。虽然我们的 XIB 本身没有本地化(我们选择通过代码更新需要本地化的字符串)。 @MobileBen 你如何在 CMake 中做到这一点? 【参考方案1】:

这是我们自己做的。不幸的是,解决方案并不漂亮。我最终使用mod_pbxproj 编写了我自己的python 脚本来在cmake 生成它之后修改xcode 项目。如果您可以摆脱使用常规 xcode 项目而不是 cmake 生成的项目,我认为您会更好。要让 XCode 将一组文件识别为本地化文件,您必须做的事情非常复杂。

【讨论】:

【参考方案2】:

您可以在此处找到为 Xcode 项目处理 xib 文件的示例:https://github.com/open-eid/updater/blob/master/CMakeLists.txt。

总结:可以使用自定义命令 + 在结果 nib 上设置 MACOSX_PACKAGE_LOCATION 属性:

add_custom_command( OUTPUT MainMenu.nib
    COMMAND ibtool --errors --warnings --notices --output-format human-readable-text
        --compile MainMenu.nib $CMAKE_CURRENT_SOURCE_DIR/mac/en.lproj/MainMenu.xib
)
set_source_files_properties( MainMenu.nib
    PROPERTIES MACOSX_PACKAGE_LOCATION Resources/en.lproj )

【讨论】:

以上是关于CMake 生成带有本地化的 xcode 项目的主要内容,如果未能解决你的问题,请参考以下文章

从本地 HTML Xcode 加载本地图像

如何让 CMake 创建一个 xcode 项目,其中警告在系统标头中被抑制?

Xcode自动补全不适用于通过CMake包含的C ++库

在 Xcode 5 中修改故事板后如何同步本地化故事板的字符串

XCode 5 - 无法访问本地 git 存储库

在 Xcode 5 中禁用基本本地化后找不到 MainMenu.xib