web-dev-qa-db-fra.com

Comment localiser les images dans Images.xcassets?

Nous pouvons localiser une image dans le File Inspector en utilisant Localize... comme ça:

enter image description here

Ensuite, nous pouvons obtenir ceci:

enter image description here

Mais maintenant, j'utilise Images.xcassets pour gérer mes images dans mon projet iOS, comment dois-je localiser ces images dans Images.xcassets?

53
SamirChen

Bien qu'il n'y ait (apparemment) actuellement aucun moyen de localiser explicitement le fichier xcassets directement, vous pourriez localiser le nom de l'actif à extraire à l'aide de votre fichier Localizable.strings. Par exemple, supposons que vous ayez un logo graphique pour le menu principal d'un jeu qui doit être localisé. Vous pouvez mettre les traitements de logo localisés dans le fichier d'actifs avec des noms différents, ajouter les noms à votre fichier Localizable.strings, puis récupérer l'image appropriée avec du code comme celui-ci:

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

Lorsque Apple vous donne des citrons, faites de la limonade, ou dans ce cas, lemonade_en, lemonade_es ou tout ce qui convient à vos besoins.

Tout d'abord, je crée une entrée pour chaque langue souhaitée dans mon fichier d'actifs comme suit:

enter image description here

Ensuite, vous devrez obtenir un code de langue pour l'appareil. La chose importante à retenir ici est que l'utilisateur peut avoir une langue non prise en charge, donc si c'est le cas, retournez votre langue par défaut (j'utilise l'anglais).

L'extension suivante de UIApplication gérera tout cela pour vous:

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

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

Cette extension effectue les opérations suivantes:

  • Crée un tableau des langues prises en charge par mon application
  • Obtient le code de langue de l'appareil actuel ou renvoie une valeur par défaut si elle est nulle
  • Enfin, il vérifie si le code actuel est dans ma liste prise en charge. Si c'est le cas, il le renvoie, sinon il retourne mon code par défaut

Maintenant, nous combinons les deux pour obtenir la bonne image:

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

Après quelques recherches sur Internet, je pense que cette fonctionnalité n'est pas fournie par xcassets pour le moment. Par conséquent, n'utilisez pas xcassets pour gérer vos images de localisation.

7
johnMa

J'ai trouvé un autre moyen:

  1. ajoutez en vous asset.xcassets un dossier pour chaque langue (par exemple: en, it, de)
  2. définir l'indicateur "Fournit un espace de noms" à chaque dossier
  3. copier toutes les images et ressources dans ce dossier
  4. Dans votre code, chargez les actifs en appelant
let languageCode = UIApplication.shared.languageCode
let image = UIImage(named: "\(languageCode)\assetname")
3
Ugo Chirico

Pour le moment, je retire les images qui nécessitent une localisation à partir d'Images.xcassets et les place dans le dossier de projet standard. Je laisse les images non localisées dans les .xcassets. J'utilise votre méthode pour les images qui doivent être localisées.

1
ninjaneer

Ce bouton "Localiser ..." est de retour dans Xcode 11! Vous pouvez donc maintenant localiser vos images et ressources dans le catalogue de ressources comme vous vous y attendez:

enter image description here

1
Vladimir Grigorov