web-dev-qa-db-fra.com

NSLocalizedString ne récupère que la clé, pas la valeur dans Localizable.strings (IOS)

J'ai créé un fichier de chaînes nommé "Localizable.strings" et y ai ajouté deux langues, comme suit:

"CONNECTIONERROR" = "Check that you have a working internet connection.";
"CONNECTIONERRORTITLE" = "Network error";

J'ai également converti les fichiers au format Unicode UTF-8 Cependant, lorsque je crée un UIAlertView comme celui-ci:

 UIAlertView *myAlert = [[UIAlertView alloc]
 initWithTitle:NSLocalizedString(@"CONNECTIONERRORITLE",nil)
 message:NSLocalizedString(@"CONNECTIONERROR",nil)                    
 delegate:self
 cancelButtonTitle:@"Ok"
 otherButtonTitles:nil];

la vue d'alerte affiche uniquement le texte de la clé, pas la valeur. Cela fonctionne si, par exemple, je mets un texte UITextviews à NSLocalizedString (@ "CONNECTIONERROR", nil), mais que la vue des alertes affiche uniquement la clé. Quelqu'un sait ce qui ne va pas?

37
Smiden

Testé l'application sur un appareil réel et cela a fonctionné

10
Smiden

Dans mon cas, c'était parce que j'avais nommé par erreur le fichier "Localization.strings" et que je n'avais pas remarqué (il devait s'appeler Localizable.strings). Comme expliqué précédemment, le symptôme est dû au fait que le compilateur ne peut pas trouver la chaîne. Sinon, la cause pourrait être un certain nombre de choses, mais il s'agit généralement d'un point-virgule ou d'un guillemet manquant. Celles-ci sont difficiles à trouver lorsque vous effectuez plusieurs localisations à la fois. La leçon à retenir est de commencer à créer votre fichier de localisation dès le début de votre processus de développement et de le construire au fur et à mesure, de manière à ce qu'il soit plus facile à repérer.

92
Jim Rota

Même problème, résolu en utilisant le nom de fichier: Localizable.strings

24
Pelanes

Changez votre nom de fichier .strings en Localizable.strings, cela a fonctionné pour moi.

11
alicanozkara

Je cherchais la solution depuis 5 heures et j'ai tout essayé pour que la localisation de mon application fonctionne.

Le problème était qu'un des pods de mon projet contenait un fichier Localizable.strings (en fait, c'était le pod Parse qui ne l'avait pas renommé). Par conséquent, mon fichier Localizable.strings n'a pas été reconnu par mon application. 

J'ai résolu le problème en changeant le nom du fichier en "MyappnameLocalizable.strings" et en utilisant NSLocalizedString de cette façon:

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
9
aiwis31

Vérifiez que le fichier Localizable.strings est ajouté à

Cibles -> BuildPhases -> Copier les ressources de l'ensemble

Il n'a pas été ajouté automatiquement pour moi.

9
virsunen

Cela se produit lorsque le moteur d'exécution ne peut pas trouver la clé spécifiée, pour une raison quelconque. Dans votre cas, c'est probablement dû à une faute de frappe: CONNECTIONERRORITLE manque une T pour TITLE. Faites également attention aux avertissements/erreurs lors de la compilation concernant le fichier Localizable.strings: s'il y a " non équilibré ou ; manquant, le fichier ne peut pas être compilé/lu correctement.

8
DarkDust

J'avais des problèmes avec cela sur le simulateur iOS. J'ai fini par supprimer le fichier Localization.strings dans le répertoire du simulateur

(/ Users/(me))/Bibliothèque/Application Support/iPhone Simulator/5.0/Applications/(etc)/(projet)/(application.app)

allez dans cd et supprimez toutes les copies de Localization.strings qui s'y trouvent.

Pour une raison quelconque, le voodoo de poulet en caoutchouc habituel de génération propre, quitte iOS Simulator, XCode, etc. ne fonctionnait pas, mais cela fonctionnait. Au moins pour moi, aujourd'hui.

8
Andrew Lewis

Changez le nom du fichier en Localizable.strings, assurez-vous que la cible dans l'inspecteur de fichier est définie. Pour éviter les erreurs de syntaxe, cliquez avec le bouton droit de la souris sur le fichier Localizable.strings-> ouvrir en tant que-> liste des propriétés ASCII De plus, le nettoyage du projet et la construction ont de nouveau aidé dans mon cas.

7
Nick Greg

Renommez le fichier InfoPlist.strings en Localizable.strings (double clic) et vous obtiendrez la chaîne correcte pour cette clé.

6
Pelanes

L'utilisation de NSLocalizedString signifie que vous avez besoin de la casse exacte et de l'orthographe de votre clé pour en extraire le contenu. Vous remarquerez que celui-ci dit 

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

quand cela devrait être

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

Si vous regardez la dernière partie de la première, il est écrit "ITLE", pas "TITLE"

6
CodaFi

Pour savoir si le fichier Localizable.strings a été trouvé, vérifiez le contenu de votre version .app. Vous pouvez également le faire dans le code:

// en est pour l'anglais par exemple, spécifiez le vôtre ici NSString * path = [[NSBundle mainBundle] pathForResource: @ "en" ofType: @ "lproj"];

Si path est NULL, cela signifie que le fichier est introuvable.

4
Komposr

Si vous avez écrit deux points-virgules à la fin d'une ligne, la localisation ne fonctionne pas ..___. Vous devez vérifier le fichier Localizable.strings s'il existe un ';;' 

3
BurtK

Si vous avez du point-virgule supplémentaire dans votre fichier de chaînes, il ne sera pas localisé.

2
Teja Nandamuri

Aucune des solutions suggérées n'a fonctionné pour moi, mais j'ai résolu le problème en supprimant le fichier .app dans Products.

1
Matthew

Dans mon cas, j'ai essayé le projet propre et supprimer les données dérivées ne fonctionne toujours pas. Je supprime plusieurs sauts de ligne dans le fichier de chaînes, puis Xcode recherche à nouveau les chaînes.

1
BillChan

J'ai rencontré un problème similaire, tout à coup, mes chaînes localisables ne fonctionnaient plus du tout. Ensuite, j'ai utilisé fichier-compare avec l'ancienne copie .strings, et j'ai enfin découvert que j'avais accidentellement supprimé une clé de celle-ci. 

Donc, si le format est incorrect, Xcode ne lira pas les chaînes pour vous. 

C'est le format auquel il s'attend "Key" = "Value";  

1
sandyios

Mettre un ; à la fin des lignes dans les fichiers Localizable.strings.

1
Vincent

J'ai eu le problème quand une langue fonctionnait correctement et l'autre langue fonctionnait la moitié du temps et une autre fois, je recevais la clé, au lieu de la version localisée de cette clé. 

Le problème dans mon cas était qu'après la fusion manuelle du conflit de contrôle de version, il restait une ligne supplémentaire de '>>>>>', le projet ne se plaignait pas (pas comme lorsque vous manquez le point-virgule, il se plaint) et qu'il se construisait correctement, donc toutes les clés antérieures à '>>>>>' étaient en cours de traduction et toutes les clés après, pas. 

Si des solutions plus simples échouent, vous devrez peut-être parcourir toutes les lignes et rechercher des caractères supplémentaires (pas uniquement '>>>>>', mais également d'autres caractères supplémentaires), ou si vous utilisez le contrôle de version Localizable.strings et passer manuellement à travers les modifications et ajouter des commits ultérieurs.

0
sabius

Réinitialiser les paramètres du simulateur a fonctionné pour moi.

simulateur iOS> Réinitialiser le contenu et les paramètres ...

0
clocksmith

Assurez-vous de ne pas mettre '@' devant votre key ou value comme ceci:

@"key" = @"value";

Cela devrait être juste:

"key" = "value";

Le '@' ne se trouve devant la clé que lorsque vous y accédez:

NSWebLocalizedString(@"key", @"label for coder");
0
craned

La première ligne du fichier de localisation doit contenir un mappage, sinon le SDK ne lira pas le fichier.

0
Clint Johnson

Je l'ai résolu en utilisant cette approche.

Le fichier localize a été créé avec le nom main.Strings. Ensuite, j'ai ouvert les fichiers main.Strings (pour chaque langue ajoutée) et je les ai renommés manuellement avec le nom localize.strings et les ai ajoutés un par un à mon projet. J'ai également supprimé le main.strings.

La deuxième chose à évaluer est: check. Dans votre fichier, tous les keys doivent se terminer par ; et assurez-vous que tous les quotes sont correctement ouverts et fermés.

Et vous pouvez utiliser dans Swift 4 :

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)
0
MrMins

Swift 4:

Si vous utilisez plusieurs ensembles tels que vous les utilisez dans un cadre externe:

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
0
Ahmed Lotfy

Pour xcode 9.2, supprimer les fichiers "Localizable.strings" des simulateurs du projet à l’aide de la console s’était résolu pour moi. Voici les commandes pour les paresseux comme moi;) 

N'oubliez pas de remplacer YOUR_APP_NAME_HERE par votre nom de projet

Script shell:

cd
cd Library/Developer/CoreSimulator/Devices/
find . -name "Localizable.strings" | grep "YOUR_APP_NAME_HERE.app" | xargs rm

Si vous rencontrez le problème avec les tests unitaires, cela fonctionnera dans le simulateur;)

0
ergunkocak

Lorsque vous développez un SDK. Vous avez besoin d'une opération supplémentaire.

1) créez Localizable.strings comme d'habitude dans YourLocalizeDemoSDK.

2) créez le même Localizable.strings dans YourLocalizeDemo.

3) trouvez votre chemin Bundle de YourLocalizeDemoSDK.

Swift4:

// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")

Bundle(for: type(of: self)) vous aide à trouver le paquet dans YourLocalizeDemoSDK. Si vous utilisez plutôt Bundle.main, vous obtiendrez une valeur incorrecte (en fait, ce sera la même chaîne avec la clé).

Mais si vous voulez utiliser l’extension String mentionnée par dr OX . Vous devez en faire plus. L'extension Origin ressemble à ceci.

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

Comme nous le savons, nous développons un SDK, Bundle.main recevra le paquet du paquet YourLocalizeDemo. Ce n'est pas ce que nous voulons. Nous avons besoin du paquet dans YourLocalizeDemoSDK. C'est un truc pour le trouver rapidement.

Exécutez le code ci-dessous dans une instance de NSObject dans YourLocalizeDemoSDK. Et vous obtiendrez l'URL de YourLocalizeDemoSDK.

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL

Imprimez les deux URL, vous constaterez que nous pouvons créer une base bundleURLofSDK sur mainBundleURL. Dans ce cas, ce sera:

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main

Et l'extension de chaîne sera:

extension String {
    var localized: String {
        let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
        return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
    }
}

J'espère que ça aide.

0
Liam

Tout fonctionnait lorsque, tout à coup, la localisation a cessé de traduire les chaînes. Cela signifie que le fichier est en quelque sorte illisible pour Xcode.

Cela m’était arrivé parce que j’avais collé un mauvais caractère dans le fichier Localized.strings. Lorsque j'ai supprimé les quelques lignes contenant le caractère incriminé (caractère non unicode? Mauvais guillemets? Impossible à dire), tout est revenu à la normale.

Pour trouver les lignes incriminées, j'ai créé un point d'arrêt et traduit manuellement les chaînes de mon fichier dans le débogueur, jusqu'à ce que je frappe la première qui ne traduise pas.

0
Eran Goldin

Parce que je suis tombé sur cela en cherchant la réponse à un problème similaire, je laisse ma solution ici:

Si votre clé contient "\ u2028" à la place de "\ n", elle renverra toujours uniquement la clé et non la valeur. Semble être un bug avec la localisation.

0
Luke