【问题标题】:How to localize the images in Images.xcassets?如何本地化 Images.xcassets 中的图像?
【发布时间】:2014-01-23 14:22:40
【问题描述】:

我们可以像这样使用Localize... 定位File Inspector 中的图像:

那么我们可以得到这个:

但是现在,我在 iOS 项目中使用 Images.xcassets 来管理我的图像,我应该如何在 Images.xcassets 中本地化这些图像?

【问题讨论】:

  • 嗯?如何准确定位图像?
  • @Ohnomycoco 抱歉问题描述不明确,我编辑了它。我将图像本地化为问题中的描述。实际上,我有两个“go_register”的图像:英文版将存储在en.lproj文件夹中,中文版将在我本地化后存储在zh-Hans.lproj文件夹中。但是现在,我使用 Images.xcassets 来管理图像,我不知道该怎么做。
  • 做不到。这将在 Apple 错误报告器中提出很好的功能请求。

标签: ios localization


【解决方案1】:

如果您使用的是资产目录:

资产目录元素现在可以本地化。在资产的信息面板中,有一个“本地化”部分列出了您在项目设置中为项目设置的所有语言。如果您不选择其中任何一个,您的图像将被视为“通用”(即,它们将采用默认行为)。如果您选择其中一个或多个,您将能够为“通用”和任何替代语言选择不同的图像。

例如,如果您的基本语言是英语,并且您想要西班牙语替代语言,请仅选择“西班牙语”并将替代版本拖入西班牙语井中,并将英语版本保留为通用。然后,在运行时,如果选择的语言是西班牙语,那么西班牙语图像将被拉出。否则,它将拉取英文版本。 (或者,如果您想要与“其他所有”都不同的特定英语和西班牙语版本,也请选中英语并拖入相应的英语和通用图像。)

如果您需要在运行时确定本地化图像而不使用资产目录:

虽然目前有 (显然)不是 直接显式本地化 xcassets 文件的方法,但您可以改为使用 Localizable.strings 文件本地化要提取的资产名称。例如,假设您对需要本地化的游戏主菜单进行了图形徽标处理。您可以将本地化徽标处理放在具有不同名称的资产文件中,将名称添加到 Localizable.strings 文件中,然后使用如下代码获取适当的图像:

UIImage *img = [UIImage imageNamed:NSLocalizedString(@"MAIN_MENU_IMAGE", nil)];

【讨论】:

  • 不知道为什么 Apple 没有考虑到这一点,但这个解决方案确实是一个非常好的解决方法!
  • 对于新手(像我一样)的参考,如果您不知道将本地化字符串放在哪里,请阅读关于 NSLocalizedString 的说明以获取提示。你需要自己创建一个Localizable.strings,然后本地化。然后,您就有了正确的本地化文件来列出不同语言的图像名称。
  • @WangYudong 的建议非常有效!请注意,您实际上并不需要本地化图像名称。您可以滥用本地化系统来生成密钥,例如"logo" = "logo-de" 用于德语版本,"logo" = "logo-en" 用于英语。
  • 这是一个绝妙的建议。我将使用它来检索本地化的按需资源 - 使用特定于支持的语言环境的资源名称。
【解决方案2】:

“本地化...”按钮又回到了 Xcode 11 中!因此,现在您可以按预期本地化资产目录中的图像和资产:

【讨论】:

  • 2021正确答案!!!
【解决方案3】:

当 Apple 给您柠檬时,请制作柠檬水,或者在本例中,制作柠檬水_en、柠檬水_es 或任何适合您需要的东西。

首先,我在资产文件中为每种所需语言创建一个条目,如下所示:

接下来,您需要获取设备的语言代码。这里要记住的重要一点是,用户可能使用了不受支持的语言,所以如果是这种情况,请返回您的默认设置(我使用英语)。

UIApplication 的以下扩展将为您处理所有这些:

extension UIApplication {
    var languageCode: String {
        let supportedLanguageCodes = ["en", "es", "fr"]
        let languageCode = Locale.current.languageCode ?? "en"

        return supportedLanguageCodes.contains(languageCode) ? languageCode : "en"
    }
}

此扩展程序执行以下操作:

  • 创建我的应用支持的语言数组
  • 获取当前设备的语言代码,如果为 nil,则返回默认值
  • 最后,它会检查当前代码是否在我的支持列表中。如果是,则返回,否则返回我的默认代码

现在,我们将两者结合起来得到正确的图像:

let languageCode = UIApplication.shared.languageCode
let image = UIImage(named: "access_\(languageCode)")

【讨论】:

  • 很好,但最好不要硬编码supportedLanguageCodes。
【解决方案4】:

在网上搜索了一番,我认为现在 xcassets 没有提供这个功能。因此,不要使用 xcassets 来管理您的本地化图像。

【讨论】:

  • 是的,你本地化了 xcassets。看看这个帖子:stackoverflow.com/a/19452251/2754218
  • @JeanLebrument 您可能没有真正尝试过,因为在撰写本文时该方法不起作用。
  • 不使用 xcassets 会影响应用切片的一项重要功能
【解决方案5】:

我找到了另一种方式:

  1. 在您的asset.xcassets 中为每种语言添加一个文件夹(例如:en,it,de)
  2. 为每个文件夹设置“提供命名空间”标志
  3. 复制该文件夹中的所有图像和资源
  4. 在您的代码中通过调用
  5. 加载资产
let languageCode = UIApplication.shared.languageCode
let image = UIImage(named: "\(languageCode)\assetname")

【讨论】:

  • 适用于 iOS11 和 iOS13。新的 Xcode11“方式”不适用于 iOS11。
【解决方案6】:

目前,我从Images.xcassets中取出需要本地化的图片,放到标准项目文件夹中。我将非本地化图像保留在 .xcassets 中。对于需要本地化的图片,我使用你的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-14
    • 2014-06-27
    • 2015-11-06
    • 1970-01-01
    • 2014-01-18
    • 2014-08-04
    • 2022-08-12
    • 1970-01-01
    相关资源
    最近更新 更多