【问题标题】:Can .strings resource files be added at runtime?.strings 资源文件可以在运行时添加吗?
【发布时间】:2011-05-20 16:50:07
【问题描述】:

我知道在 Mac 应用程序中可以将 .strings 文件添加到项目文件夹以添加本地化。

有没有什么方法可以将额外的本地化添加到应用程序(iOS 或 Mac OS),而无需在编译时从资源包中加载它们。比如说,下载一个额外的本地化文件并将其存储在 iOS 上的 /Documents 中?

【问题讨论】:

  • 5 年后出现了一个产品。 lokalise.co "不再需要重新提交您的应用以供审核。使用 Lokalise iOS 和 Android SDK 只需几行代码即可更新字符串和翻译。"

标签: objective-c ios cocoa macos localization


【解决方案1】:

是的,但不是你想的那样。

您可以获取一个字符串文件并将其加载到NSString,然后使用-[NSString propertyListFromStringsFileFormat] 将其转换为字典。

这将为您提供一种将自定义翻译的字符串存储在内存中的方法。

至于实际使用它,您必须定义自定义翻译函数。 IE,你不能再使用NSLocalizedString()和朋友了。幸运的是,genstrings(用于生成字符串文件的实用程序)允许您指定custom function names

genstrings -s "JPLocalizedString" ...

这意味着在代码中,你可以定义:

NSString* JPLocalizedString(NSString *key, NSString *comment) {
  return [myLoadedStrings objectForKey:key];
}

还有JPLocalizedStringFromTable()JPLocalizedStringFromTableInBundle()JPLocalizedStringWithDefaultValue()genstrings 将接收所有这些。 (换句话说,仅仅因为NSLocalizedString 是一个宏并不意味着你的版本必须是)

如果您这样做并使用这些JPLocalizedString 变体,那么genstrings 仍会为您生成字符串文件(前提是您使用-s 标志)。

调用这些函数后,您可以使用任何您想要的查找机制,如果找不到任何内容,则默认返回 NSLocalizedString 版本。

【讨论】:

  • 谢谢,这更像是一个理论问题,我没有计划实施。
【解决方案2】:

如果您想在应用程序中实现 NSLocalizedString() 的替代版本,有很多好的策略。这将允许您修改应用程序本身内部使用的值。但在推送通知方面,这些都行不通。

警告:对于使用本地化字符串的 iOS 推送通知,没有合法的运行时方法可以修改用于将服务器发送的本地化参数转换为设备本地语言的内置字符串资源。

因此,如果您想将本地化字符串用作推送通知的一部分,则必须在提交到商店时将它们发送到应用程序中。以后无法通过从服务器加载某些内容来修改它们。

【讨论】:

    【解决方案3】:

    您应该能够通过在一个类别中覆盖 NSBundle 的各种 pathForResource:... 方法来实现这一点。 (我会假设他们都通过-pathForResource:ofType:inDirectory:forLocalization:,但这没有记录,所以即使现在证明是这样,你也不能依赖它,所以你应该覆盖所有这些。)

    我还建议filing an enhancement request 以一种简洁的方式覆盖查找机制。

    【讨论】:

    • 哎呀,坏主意。实现此功能的唯一方法是调出 -[NSBundle localizedStringForKey:value:table:] 方法,这是一个非常糟糕的主意。
    • 好吧,我收回了。您可以使用NSBundle 的子类,覆盖方法中的逻辑,并在必要时调用super您必须始终使用@987654328 @ 或 NSLocalizedStringWithDefaultValue() 宏来指定您的自定义包。
    【解决方案4】:

    我设法做到了,并创建了一个小型仓库来展示我是如何做到的:

    https://github.com/multitudes/MyLocalisationTestApp

    在文档目录中创建一个自定义包。

    查看 Apple 文档中的文本:https://developer.apple.com/documentation/swiftui/text

    SwiftUI 文本视图初始化程序接受一个捆绑参数。

    1 - 我在 Documents 目录中创建了一个自定义包。 2 - 我以编程方式将语言文件夹和字符串文件放在其中。 3 - 使用它时,我将自定义包和 tableName(.strings 文件的名称)与 key 一起传递给 Text 初始化程序。
    就像在 SwiftUI 中一样:Text(localizedStringKey, tableName: tableName, bundle: bundle)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多