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?
Testé l'application sur un appareil réel et cela a fonctionné
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.
Même problème, résolu en utilisant le nom de fichier: Localizable.strings
Changez votre nom de fichier .strings
en Localizable.strings
, cela a fonctionné pour moi.
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")
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.
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.
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.
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.
Renommez le fichier InfoPlist.strings en Localizable.strings (double clic) et vous obtiendrez la chaîne correcte pour cette clé.
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"
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.
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 ';;'
Si vous avez du point-virgule supplémentaire dans votre fichier de chaînes, il ne sera pas localisé.
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.
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.
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";
Mettre un ; à la fin des lignes dans les fichiers Localizable.strings.
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.
Réinitialiser les paramètres du simulateur a fonctionné pour moi.
simulateur iOS> Réinitialiser le contenu et les paramètres ...
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");
La première ligne du fichier de localisation doit contenir un mappage, sinon le SDK ne lira pas le fichier.
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)
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: "")
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;)
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.
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.
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.