如何本地化 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 中