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

j'ai créé un fichier de chaînes nommé "localisable.les chaînes", et a ajouté deux langues, comme:

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

j'ai aussi converti les fichiers en Unicode UTF-8 Cependant, quand je crée une vue UIAlertView comme ceci:

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

la vue alerte montre seulement le texte clé, pas la valeur. Cela fonctionne si, par exemple, je mets un texte UITextviews sur NSLocalizedString(@"CONNECTIONERROR",nil), mais la vue d'alerte n'affiche que la clé. Quelqu'un sait quel est le problème?

33
demandé sur Smiden 2012-02-12 21:59:42

27 réponses

Dans mon cas, c'était parce que j'avais tort, nommé le fichier "Localisation.strings " et n'avait pas remarqué (il doit être nommé localisable.chaîne.) Comme expliqué précédemment, le symptôme est parce que le compilateur ne trouve pas la chaîne. Autrement, la cause pourrait être n'importe quel nombre de choses, mais habituellement c'est un point ou une Guillemette manquant. Ceux-ci sont difficiles à trouver quand vous faites beaucoup de localisations à la fois. La leçon apprise est de commencer à construire votre fichier de localisation tôt dans votre processus de développement et de construire comme vous allez, de sorte qu'ils sont plus faciles à repérer.

86
répondu Jim Rota 2013-03-08 00:51:16

Même Problème, résolu en utilisant le nom du fichier: localisable.chaînes de caractères

24
répondu Pelanes 2014-03-20 15:15:08

Modifier .strings nom du fichier Localizable.strings, ça a marché pour moi.

10
répondu alicanozkara 2017-06-22 07:34:16

Testé l'application sur un périphérique réel et cela a fonctionné

9
répondu Smiden 2012-04-20 17:08:25

cela se produit lorsque l'exécution ne peut pas trouver la clé spécifiée, pour quelque raison que ce soit. Dans votre cas, c'est probablement dû à une faute de frappe: CONNECTIONERRORITLE manque un TTITLE. Faites également attention aux avertissements / erreurs lors de la compilation concernant le Localizable.strings fichier: si il y a des déséquilibrés " ou manquant ; le fichier ne peut pas être compilé/lire correctement.

8
répondu DarkDust 2012-02-12 18:02:54

j'avais des problèmes avec ça sur le simulateur iOS. J'ai fini par supprimer la localisation.fichier de chaînes dans le simulateur répertoire

( /Users/(moi)/Bibliothèque/Application Support/iPhone Simulateur/5.0/Applications/( ... )/(projet)/(application.app)

cd et supprimer toutes les copies de la Localisation.des ficelles trouvées là.

Pour une raison que l'habitude de caoutchouc de poulet vaudou de construire propre, quitter le Simulateur iOS, quittez XCode, etc ça ne marchait pas, mais ça oui. Au moins pour moi, aujourd'hui.

8
répondu Andrew Lewis 2012-10-11 12:12:28

vérifiez que le localisable.les chaînes de fichier est ajouté à

Objectifs> BuildPhases -> Copier Ressources De Module

il n'avait pas été ajouté automatiquement pour moi.

8
répondu virsunen 2014-09-02 16:36:58

j'ai cherché la solution pendant 5 heures, j'ai essayé tout ce que j'ai pu pour faire fonctionner ma localisation d'application.

le problème était que l'un des modules de mon projet avait un localisable.fichier strings (en fait, c'était Pod Parse qui ne l'avait pas renommé). Donc, mon localisable.les chaînes de fichier n'a pas été reconnu par mon application.

j'ai corrigé le problème en changeant le nom du fichier en "Myappnamelocalisable.strings" et en utilisant NSLocalizedString ce façon:

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
7
répondu aiwis31 2015-08-19 11:54:00

L'utilisation de NSLocalizedString signifie que vous avez besoin du cas EXACT et de l'orthographe de votre clé afin d'obtenir le contenu à partir de celui-ci. Vous remarquerez que celui-ci dit

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

quand il doit être

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

si vous regardez la dernière partie de la première, elle dit 'Ille', pas 'TITLE'

6
répondu CodaFi 2012-02-12 18:03:01

renommer L'InfoPlist.fichier de chaînes à localisable.cordes (double clic) et vous obtiendrez la bonne chaîne pour cette clé.

6
répondu Pelanes 2014-07-07 19:47:18

changez le nom du fichier en localisable.cordes, assurez-vous que la cible de l'inspecteur de fichiers est définie. Pour éviter les erreurs de syntaxe, faites un clic droit sur localisable.strings Fichier- > Ouvrir as->liste de propriétés ASCII De plus, le nettoyage du projet et du bâtiment m'a encore aidé dans mon cas.

6
répondu Nick Greg 2015-07-02 08:11:50

pour savoir si le localisable.les chaînes de fichier est trouvé, vérifiez le contenu de votre .app build et vous pouvez aussi le faire en code:

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

si le chemin est nul, cela signifie que le fichier n'est pas trouvé.

4
répondu Komposr 2013-07-24 17:06:28

si vous avez écrit un double point-virgule à la fin d'une ligne, Nslocalisation ne fonctionne pas. Vous devriez vérifier localisable.les chaînes de fichier si il n'existe ';;'

3
répondu BurtK 2015-10-03 09:45:02

si vous avez un point-virgule supplémentaire dans votre fichier strings, il ne localise pas.

2
répondu Teja Nandamuri 2015-10-07 18:48:37

Mettre un ; à la fin des lignes dans le Localizable.les chaînes de fichiers.

1
répondu Vincent 2014-02-04 11:11:36

dans mon cas, j'ai essayé clean project et supprimer les données dérivées ne fonctionne toujours pas. Je supprime plusieurs ruptures de ligne dans le fichier strings et puis Xcode retrouve les chaînes.

1
répondu BillChan 2014-12-08 13:24:17

Aucune des solutions proposées a fonctionné pour moi, mais j'ai résolu le problème en supprimant le .application fichier dans les Produits

1
répondu Matthew 2015-08-19 19:55:28

j'ai fait face à un problème similaire, soudainement mes cordes localisables n'ont pas fonctionné du tout. Ensuite, j'ai utilisé le fichier-comparer avec l'ancien .j'ai enfin trouvé que j'avais accidentellement effacé une clé.

donc certainement si le format est erroné Xcode ne lira pas les chaînes pour vous.

C'est le format qu'il s'attend à ce "Touche" = "Valeur";

1
répondu sandyios 2016-01-18 11:49:31

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

0
répondu Clint Johnson 2013-12-22 03:53:53

la remise en état des réglages du simulateur a fonctionné pour moi.

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

0
répondu clocksmith 2014-09-04 20:50:22

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

@"key" = @"value";

Il doit être juste:

"key" = "value";

' @ ' ne va en face de la clé lors de l'accès:

NSWebLocalizedString(@"key", @"label for coder");
0
répondu craned 2014-10-02 18:54:38

tout fonctionnait quand soudain la localisation a cessé de traduire des cordes. Cela signifie que le fichier est en quelque sorte illisible à Xcode.

Ce qui m'était arrivé parce que j'avais collé un mauvais personnage dans le Localized.strings fichier. Lorsque j'ai supprimé les quelques lignes avec le caractère fautif (non caractères unicode? de mauvaises citations? Ne pouvais pas le dire) tout s'est passé le retour à la normale.

pour trouver les lignes offensantes j'ai fait un point de rupture, et traduit manuellement les chaînes dans mon fichier dans le débogueur, jusqu'à ce que je touche le premier qui ne traduit pas.

0
répondu Eran Goldin 2015-07-10 21:43:01

pour xcode 9.2 supprimer " localisable.strings " les fichiers des simulateurs pour le projet en utilisant la console résolu pour moi. Voici les commandes pour les paresseux comme moi ;)

N'oubliez pas de remplacer YOUR_APP_NAME_HERE avec 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, il va travailler dans le simulateur ;)

0
répondu ergunkocak 2018-03-14 08:38:28

Swift 4:

Si vous utilisez plus d'un bundle comme vous l'utiliser dans un cadre externe:

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
0
répondu Ahmed Lotfy 2018-05-22 09:24:04

lorsque vous développez un SDK. Tu as besoin d'une opération supplémentaire.

1) créer localisable.chaînes de caractères comme d'habitude dans Votrelocalizedemosdk.

2) créer le même localisable.chaînes de caractères dans Votrelocalizedemo.

3) Trouvez votre Chemin De Faisceau 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 Votrelocalizedemosdk. Si vous utilisez Bundle.main au lieu de cela, vous obtiendrez une valeur incorrecte(en fait ce sera la même chaîne avec la clé).

mais si vous voulez utiliser l'extension de chaîne mentionnée par dr OX. Vous avez besoin de faire un peu 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 obtiendra le paquet du paquet de votre Localizedemo. Ce n'est pas ce que nous voulons. On a besoin du paquet Dans ton portable. C'est une astuce pour le trouver rapidement.

exécutez le code ci-dessous dans une instance NSObject dans Votrelocalizedemosdk. Et vous obtiendrez L'URL de Votrelocalizedemosdk.

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

imprimer les deux url, vous trouverez que nous pouvons construire la base bundleURLofSDK sur mainBundleURL. Dans ce cas, ce sera:

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

Et la Chaîne de l'extension 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
répondu Liam 2018-07-05 02:08:21

j'ai résolu en utilisant cette approche.

localize le fichier a été créé avec le nom de main.Strings. Ensuite, j'ai ouvert le main.Strings fichiers (pour chaque langue) et j'ai renommé manuellement avec le nom localize.strings et les ajouter un par un à mon projet, aussi j'ai supprimé le main.strings.

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

Et vous pouvez l'utilisation de swift 4:

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)
0
répondu MrMins 2018-09-14 00:32:49

avez-vous essayé de nettoyer et de reconstruire le projet?

-1
répondu ChrisVollo 2016-03-24 13:27:19