4
votes

L'étiquette dans le storyboard ne prend pas la bonne valeur de localisation

J'ai créé une application et il est maintenant temps de la traduire dans différentes langues. Mais certaines étiquettes que je pense avoir localisées ne s'affichent pas dans différentes langues avec des valeurs différentes.

Première image: j'ai d'abord ajouté la langue suédoise à l'intérieur

"Projet -> Localisations"

 img1

Ensuite, je suis entré dans le "LaunchScreen.storyboard" et j'ai édité le fichier. Celui-là: img2

Modifié à ceci: second

Après cela, je me suis assuré que mon écran de lancement prend en charge la langue comme celle-ci: this

Et pour la dernière étape ... j'ai modifié la langue de l'application en suédois comme ceci: entrez la description de l'image ici


Mais lorsque je l'exécute sur le simulateur, le texte n'est pas traduit. Il reste toujours le même texte et je ne sais pas comment le résoudre. Le faites vous? N'hésitez pas à m'aider, je l'apprécierais vraiment!

Donc, je ne sais pas si je dois ajouter du code ou quoi que ce soit pour que cela fonctionne, mais j'ai suivi un guide, et ils ne le font pas. C'est l'une des raisons pour lesquelles je suis si confus. Et merci d'avance!

AVANT DE CONTACTER: donnez-moi au moins une raison pour que je puisse l'améliorer à l'avenir!


9 commentaires

C'est votre travail de faire la traduction pour la langue que vous avez choisie. L'application ne fera pas automatiquement le travail de traduction pour vous.


@ElTomato Nono, bien sûr. Mais comme vous le voyez, j'ai ajouté "123123123123" juste pour l'essayer, mais lorsque j'entre dans l'application avec la langue correcte, cela change. Cela reste la chaîne normale.


Oh je vois. Désolé pour ça. Cependant, ne rendez pas le storyboard localisable. Utilisez un fichier de chaîne localisable.


@ElTomato Comment puis-je faire ça?


Créez un fichier intitulé Localizable. Modifiez ensuite le type de fichier en chaînes. Mettez-y toutes les chaînes de traduction.


@ElTomato Voulez-vous dire comme ceci: imgur.com/a/kF7ipJE ?


Oui. Ça semble bien.


@ElTomato imgur.com/a/CI5yXsi -> Maintenant j'ai ceci. Dois-je ajouter du code supplémentaire ou quelque chose pour le faire fonctionner? Parce que quand je l'ai couru, c'était toujours la même


Vous devez donner une chaîne localisable à chaque contrôle qui a une étiquette de texte. (UILabel, UISegmentControl, UIButton ...) Par exemple, myLabel.text = NSLocalizedString ("8wr-FC-Rkg.text", comment: "") Si vous avez besoin de plus d'assistance, demandez à Google.


3 Réponses :


5
votes

Étant donné que les identifiants des éléments de storyboards changent et qu'ils ne peuvent pas être utilisés comme "clés" dans votre paire "clé-valeur" localisée, une meilleure solution lors de la localisation des éléments de storyboards (UI) pourrait être de fournir un User Define personnalisé Attribut défini comme une Clé de paramètres régionaux à utiliser pour cet UIView .

Vous pouvez ensuite définir dans votre Inspecteur d'attributs de storyboard pour une interface utilisateur spécifique Affichez un champ de saisie qui sera rempli avec la clé localisée définie dans vos fichiers Localizable.strings (un pour l'anglais, l'autre sera pour le suédois, les deux devraient avoir les mêmes clés mais avec des valeurs différentes - en anglais on aura des traductions anglaises dans les valeurs, et en suédois le contraire.

1) Par exemple, puisque vous voulez localiser une vue d'interface utilisateur UILabel que vous pouvez avoir ceci dans un fichier rapide Localizable.swift par exemple (le code rend possible:

// MARK: Special protocol to localizaze UI's placeholder
public protocol UIPlaceholderXIBLocalizable {
    var localePlaceholderKey: String? { get set }
}

extension UITextField: UIPlaceholderXIBLocalizable {

    @IBInspectable public var localePlaceholderKey: String? {
        get { return nil }
        set(key) {
            placeholder = key?.localized
        }
    }

}

extension UISearchBar: UIPlaceholderXIBLocalizable {

    @IBInspectable public var localePlaceholderKey: String? {
        get { return nil }
        set(key) {
            placeholder = key?.localized
        }
    }

}

2) Vous pouvez décochez votre storyboard trans donc vous finirez par avoir 1 storyboard sans dupliquer le storyboard en plusieurs versions traduites.

3) Vous pouvez maintenant créer un fichier Localizable.strings contenant vos clés et traductions et localiser ce fichier afin d'avoir vos traductions (comme vous l'avez fait avec le storyboard, mais au lieu de localiser le storyboard en plusieurs versions traduites, vous localiserez le fichier Localizable.strings (vous verrez donc deux fichiers après avoir localisé que dans les deux langues, l'un s'appellera Localizable.strings (anglais) et l'autre Localizable.strings (suédois) .

Votre Localizable.strings (anglais) pourrait ressembler à ceci, par exemple:

extension UIButton: XIBLocalizable {
    @IBInspectable public var localeKey: String? {
        get { return nil }
        set(key) {
            setTitle(key?.localized, for: .normal)
        }
    }
}

Votre Localizable.strings (Swedish) code > pourrait ressembler à ceci par exemple:

"main_page_title_label" = "Huvudsida Titel på engelska";

4) Maintenant, allez sur votre LaunchScreen.storyboard que vous devriez avoir non localisé donc vous n'en avez qu'une seule version et non deux comme dans vos exemples d'images (anglais, suédois). Recherchez le UILabel que vous souhaitez localiser et sous Attribute Inspector , vous verrez un nouveau champ de saisie appelé Locale Key ici que vous pouvez mettre comme valeur main_page_title_label code>. Et maintenant, vous venez de localiser un UILabel dans votre storyboard. entrez la description de l'image ici

5) Pour le tester depuis le simulateur, vous devez changer la langue dans Modifier le schéma> Exécuter> Options> Langue de l'application et après l'avoir enregistré, vous pouvez maintenant exécuter l'application dans le simulateur et elle simulera que votre système OS de simulateur sera défini sur la langue suédoise, de sorte que l'étiquette définie avec cette clé affichera la valeur suédoise pour cette clé. entrez la description de l'image ici

Prise en charge de plus de vues d'interface utilisateur (UIButton, UITextField, UISearchBar ..)

Si vous le souhaitez être en mesure de localiser plus de vues d'interface utilisateur, et pas seulement de vues d'interface utilisateur de type UILabel , que vous ne pouvez ajouter plus de prise en charge au fichier Localizable.swift .

Si vous voulez être en mesure de localiser également une vue d'interface utilisateur de type Button, vous pouvez l'ajouter à Localizable.swift:

"main_page_title_label" = "Main Page Title in English";

Pour prendre en charge la localisation dans les storyboards pour UITextField et UISearchBar texte d'espace réservé ajoutez ceci à votre Localizable.swift :

import UIKit

// MARK: Localizable
public protocol Localizable {
    var localized: String { get }
}

extension String: Localizable {
    public var localized: String {
        return NSLocalizedString(self, comment: "")
    }
}

// MARK: XIBLocalizable
public protocol XIBLocalizable {
    var localeKey: String? { get set }
}

extension UILabel: XIBLocalizable {
    @IBInspectable public var localeKey: String? {
        get { return nil }
        set(key) {
            text = key?.localized
        }
    }
}


4 commentaires

J'essaierai ça un peu plus tard aujourd'hui, merci beaucoup pour vos efforts. Une seule question: Dois-je parcourir toutes les étiquettes. (Puisqu'il y a un loooooot) et ajoutez comme: label1.text = NSLocalizedstring ("", "") etc? ou puis-je tout exécuter en utilisant une page d'une manière ou d'une autre? Ou dois-je ajouter manuellement la chaîne NS à toutes les étiquettes et boutons? Merci!


La réponse que j'ai donnée doit être utilisée pour localiser les chaînes codées en dur qui sont destinées à être utilisées dans les storyboards (UI) et vous devez ajouter manuellement la clé locale via le champ de saisie Inspecteur d'attributs> Clé locale pour chaque texte codé en dur dans votre interface utilisateur. Vue. Pour les chaînes / textes codés en dur que vous définissez par programmation via swift avec myview.text = .. , vous pouvez utiliser comme vous l'avez dit NSLocalizedString ("your_key", "") pour chaque chaîne codée en dur que vous souhaitez localisez dans plusieurs langues et ajoutez également chaque clé différente dans toutes vos versions Localizable.strings avec leur valeur traduite respective


@Putte Pouvez-vous accepter ma réponse au cas où vous la trouveriez pertinente par rapport à la question que vous avez posée?


Quelle réponse fabuleuse! Détaillé et vraiment utile. Merci!



1
votes

J'aime la solution de denis_lor, mais je pensais que je voulais d'abord travailler sur ce qui devrait déjà fonctionner (traduction du storyboard avec un simple fichier de chaînes) sans avoir à réimplémenter cette fonctionnalité de la même manière.

Mon problème était similaire à ce qui est décrit dans la question. Les traductions fonctionnaient déjà jusqu'à un certain point, mais ajoutées manuellement et certaines traductions modifiées n'ont pas du tout été traduites.

La solution que j'ai trouvée consistait à recréer le fichier de chaînes en utilisant ibtool:

mv tmp.strings AppName/de.lproj/Main.strings

Après avoir sauvegardé mon fichier Main.strings actuel (qui fonctionne juste en partie) (AppName / de.lproj / Main.strings), je l'ai écrasé avec le tmp.strings nouvellement généré

ibtool AppName/Base.lproj/Main.storyboard --generate-strings-file tmp.strings

Et puis j'ai changé manuellement les valeurs de ce fichier pour les valeurs sauvegardées.

Maintenant, tout est à nouveau traduit correctement. Je pense que le problème pourrait avoir quelque chose à voir avec des problèmes d'encodage, car les fichiers de chaînes sont encodés en UTF16.


0 commentaires

0
votes

Selon la documentation Apple, le LaunchScreen.storyboard est statique et ne devrait pas contenir de texte car ces textes ne seront pas localisés.

Évitez d'inclure du texte sur votre écran de lancement. Les écrans de lancement étant statiques, tout texte affiché ne sera pas localisé.

source: https: //developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/launch-screen/


0 commentaires