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?
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.
Même Problème, résolu en utilisant le nom du fichier: localisable.chaînes de caractères
Modifier .strings
nom du fichier Localizable.strings
, ça a marché pour moi.
Testé l'application sur un périphérique réel et cela a fonctionné
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 T
TITLE
. 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.
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.
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.
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")
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'
renommer L'InfoPlist.fichier de chaînes à localisable.cordes (double clic) et vous obtiendrez la bonne chaîne pour cette clé.
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.
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é.
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 ';;'
si vous avez un point-virgule supplémentaire dans votre fichier strings, il ne localise pas.
Mettre un ; à la fin des lignes dans le Localizable.les chaînes de fichiers.
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.
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
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";
la première ligne du fichier de localisation doit contenir un mappage, sinon le SDK ne lira pas le fichier.
la remise en état des réglages du simulateur a fonctionné pour moi.
simulateur iOS > Réinitialiser le contenu et les paramètres...
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");
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.
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 ;)
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: "")
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.
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)
avez-vous essayé de nettoyer et de reconstruire le projet?