如何本地化 Images.xcassets 中的图像?

Posted

技术标签:

【中文标题】如何本地化 Images.xcassets 中的图像?【英文标题】:How to localize the images in 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 错误报告器中提出很好的功能请求。 【参考方案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。看看这个帖子:***.com/a/19452251/2754218 @JeanLebrument 您可能没有真正尝试过,因为在撰写本文时该方法不起作用。 不使用 xcassets 会影响应用切片的一项重要功能【参考方案5】:

我找到了另一种方式:

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

【讨论】:

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

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

【讨论】:

以上是关于如何本地化 Images.xcassets 中的图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中

如何将 Images.xcassets 中的图像加载到 UIImage 中

如何获得images.xcassets 中图片的路径?

从Images.xcassets加载图像

检查字符串名称是不是与 images.xcassets 中的资产匹配

在 Storyboard 的 UIImageView 中使用 Images.xcassets 中的启动图像?