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

Sam*_*hen 53 localization ios

我们可以在File Inspector使用中本地化图像,Localize...如下所示:

在此输入图像描述

然后我们可以得到这个:

在此输入图像描述

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

cc.*_*cc. 92

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

UIImage *img = [UIImage imageNamed:NSLocalizedString(@"MAIN_MENU_IMAGE", nil)];
Run Code Online (Sandbox Code Playgroud)

  • 来自@WangYudong的建议非常好!请注意,您实际上不需要本地化图像名称.您可以滥用本地化系统来生成密钥,例如德语版本的"logo"="logo-de"`和英语的""logo"="logo-en"`. (5认同)
  • 不知道为什么Apple没有想到这一点,但这个解决方案确实是一个非常好的解决方法! (2认同)

Vla*_*rov 12

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

在此处输入图片说明


Cod*_*der 8

当Apple给你柠檬,做柠檬水,或者在这种情况下,lemonade_en,lemonade_es或任何适合你需要的东西.

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

在此输入图像描述

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

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

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

        return supportedLanguageCodes.contains(languageCode) ? languageCode : "en"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

let languageCode = UIApplication.shared.languageCode
let image = UIImage(named: "access_\(languageCode)")
Run Code Online (Sandbox Code Playgroud)


joh*_*nMa 7

在互联网上进行一些搜索后,我认为此功能目前不是由xcassets提供的.所以只是不要使用xcassets来管理您的本地化图像.

  • @JeanLebrument你可能没有真正尝试过,因为这个方法在写这个时刻不起作用. (4认同)

Ugo*_*ico 5

我找到了另一种方法:

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