Sur iPhone NSLocalizedString
renvoie la chaîne dans la langue de l'iPhone. Est-il possible de forcer NSLocalizedString
à utiliser une langue spécifique pour que l'application soit dans une langue différente de celle de l'appareil?
263
Réponses:
NSLocalizedString()
(et ses variantes) accédez à la clé "AppleLanguages"NSUserDefaults
pour déterminer quels sont les paramètres de l'utilisateur pour les langues préférées. Cela renvoie un tableau de codes de langue, le premier étant celui défini par l'utilisateur pour son téléphone, et les suivants utilisés comme solutions de rechange si une ressource n'est pas disponible dans la langue préférée. (sur le bureau, l'utilisateur peut spécifier plusieurs langues avec une commande personnalisée dans les Préférences Système)Vous pouvez remplacer le paramètre global de votre propre application si vous le souhaitez en utilisant la méthode setObject: forKey: pour définir votre propre liste de langues. Cela aura priorité sur la valeur définie globalement et sera renvoyé à tout code de votre application qui effectue la localisation. Le code pour cela ressemblerait à quelque chose comme:
Cela ferait de l'allemand la langue préférée pour votre application, avec l'anglais et le français comme solutions de rechange. Vous voudriez l'appeler quelque temps au début du démarrage de votre application. Vous pouvez en savoir plus sur les préférences de langue / paramètres régionaux ici: Rubriques de programmation d'internationalisation: obtenir la langue et les paramètres régionaux actuels
la source
J'ai eu le même problème récemment et je ne voulais pas démarrer et corriger l'intégralité de ma NSLocalizedString ni forcer l'application à redémarrer pour que la nouvelle langue fonctionne. Je voulais que tout fonctionne tel quel.
Ma solution était de changer dynamiquement la classe du bundle principal et d'y charger le bundle approprié:
En tête de fichier
la mise en oeuvre
Donc, fondamentalement, lorsque votre application démarre et avant de charger votre premier contrôleur, appelez simplement:
Lorsque votre utilisateur change sa langue préférée dans votre écran de configuration, il vous suffit de l'appeler à nouveau:
Pour rétablir les valeurs par défaut du système, passez simplement nil:
Prendre plaisir...
Pour ceux qui ont besoin d'une version Swift:
la source
Je fais généralement cela de cette façon, mais vous DEVEZ avoir tous les fichiers de localisation dans votre projet.
la source
Ne l'utilisez pas sur iOS 9. Cela renvoie zéro pour toutes les chaînes qui y sont passées.
J'ai trouvé une autre solution qui vous permet de mettre à jour les chaînes de langue, sans redémarrer l'application et compatible avec genstrings:
Mettez cette macro dans Prefix.pch:
et partout où vous avez besoin d'une utilisation de chaîne localisée:
Pour définir l'utilisation de la langue:
Fonctionne même avec un saut de langue consécutif comme:
la source
Comme dit précédemment, faites simplement:
Mais pour éviter d'avoir à redémarrer l'application, mettez la ligne dans la méthode principale de
main.m
, juste avantUIApplicationMain
(...).la source
NSAutoreleasePool * pool ..
Cela peut sembler évident pour les non-débutants, mais vous devez insérer cette ligne après ou quelques objets libérés automatiquement fuiront.[[NSBundle mainBundle] URLForResource:withExtension:]
avant.L'astuce pour utiliser une langue spécifique en la sélectionnant dans l'application consiste à forcer l'
NSLocalizedString
utilisation d'un ensemble spécifique en fonction de la langue sélectionnée,voici le post que j'ai écrit pour cette localisation avancée de l'apprentissage dans les applications ios
et voici le code d'un exemple de localisation avancée de l' application dans les applications ios
la source
Que pensez-vous de cette solution pour Swift 3?
Utilisation simple:
la source
Comme le mentionne Brian Webster, la langue doit être définie "quelque temps au début du démarrage de votre application". J'ai pensé que
applicationDidFinishLaunching:
leAppDelegate
devrait être un endroit approprié pour le faire, car c'est là que je fais toutes les autres initialisations.Mais comme William Denniss le mentionne, cela ne semble avoir d'effet qu'après le redémarrage de l'application, ce qui est en quelque sorte inutile.
Cela semble bien fonctionner si je mets le code dans la fonction principale, cependant:
J'apprécierais tout commentaire à ce sujet.
la source
[[NSUserDefaults standardUserDefaults] synchronize];
après avoir appelésetObject:forKey:
J'aime mieux la méthode de Mauro Delrio. J'ai également ajouté ce qui suit dans mon Project_Prefix.pch
Donc, si vous souhaitez utiliser la méthode standard (qui utilise NSLocalizedString), vous pouvez effectuer une substitution de syntaxe rapide dans tous les fichiers.
la source
NSLocalizedString()
lit la valeur de la clé àAppleLanguages
partir des valeurs par défaut de l'utilisateur standard ([NSUserDefaults standardUserDefaults]
). Il utilise cette valeur pour choisir une localisation appropriée parmi toutes les localisations existantes au moment de l'exécution. Quand Apple crée le dictionnaire des valeurs par défaut de l'utilisateur au lancement de l'application, il recherche la clé de langue préférée dans les préférences système et copie la valeur à partir de là. Cela explique également par exemple pourquoi la modification des paramètres de langue dans OS X n'a aucun effet sur l'exécution des applications, uniquement sur les applications démarrées par la suite. Une fois copiée, la valeur n'est pas mise à jour simplement parce que les paramètres changent. C'est pourquoi iOS redémarre toutes les applications si vous changez de langue.Cependant, toutes les valeurs du dictionnaire par défaut de l'utilisateur peuvent être remplacées par des arguments de ligne de commande. Voir la
NSUserDefaults
documentation sur leNSArgumentDomain
. Cela inclut même les valeurs chargées à partir du fichier de préférences de l'application (.plist). C'est vraiment bon de savoir si vous voulez changer une valeur une seule fois pour le tester .Donc, si vous voulez changer la langue juste pour les tests, vous ne voudrez probablement pas modifier votre code (si vous oubliez de supprimer ce code plus tard ...), dites plutôt à Xcode de démarrer votre application avec des paramètres de ligne de commande ( par exemple utiliser la localisation espagnole):
Pas besoin de toucher à votre code. Il suffit de créer différents schémas pour différentes langues et vous pouvez rapidement démarrer l'application une fois dans une langue et une fois dans une autre en changeant simplement le schéma.
la source
Options
comme dans les versions Xcode plus récentes qu'Apple propose ainsi que.J'ai trouvé une solution qui vous permet d'utiliser
NSLocalizedString
. Je crée une catégorie d'NSBundle
appelNSBundle+RunTimeLanguage
. L'interface est comme ça.L'implémentation est comme ça.
Ensuite, ajoutez simplement l'importation
NSBundle+RunTimeLanguage.h
dans les fichiers qui utilisentNSLocalizedString
.Comme vous pouvez le voir, je stocke mon languageCode dans une propriété de
AppDelegate
. Cela pourrait être stocké où vous le souhaitez.Cette seule chose que je n'aime pas, c'est un avertissement que
NSLocalizedString
marco a redéfini. Peut-être que quelqu'un pourrait m'aider à réparer cette partie.la source
#undef NSLocalizedString
juste avant#define
pour désactiver l'avertissementVersion rapide:
la source
En un mot :
Localisez votre application
C'est la première chose que vous devez faire est de localiser votre application avec au moins deux langues (anglais et français dans cet exemple).
Remplacer NSLocalizedString
Dans votre code, au lieu d'utiliser
NSLocalizedString(key, comment)
, utilisez une macroMYLocalizedString(key, comment)
définie comme ceci:#define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];
Ce
MYLocalizationSystem
singleton:Définir la langue de l'utilisateur
Lorsque l'utilisateur a changé la langue de l'application en français, appelez
[[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];
Dans cet exemple, cette méthode définit le bundle localisé sur fr.lproj
Retourne une chaîne localisée
Une fois que vous avez défini le bundle localisé, vous pourrez obtenir la bonne chaîne localisée de lui avec cette méthode:
J'espère que ceci vous aidera.
Vous trouverez plus de détails dans cet article de NSWinery.io
la source
Extensions Swift 3:
Usage:
la source
Dans le fichier .pch à définir:
la source
Vous devriez peut-être compléter avec ceci (sur le fichier .pch après #import):
la source
Solution Swift 3:
Donné quelques exemples de codes de langue qui peuvent être utilisés. J'espère que cela t'aides
la source
Vous pouvez créer un sous-ensemble avec l'ensemble de chaînes localisées avec lesquelles vous souhaitez effectuer cette opération, puis les utiliser
NSLocalizedStringFromTableInBundle()
pour les charger. (Je suppose qu'il s'agit d'un contenu distinct de la localisation normale de l'interface utilisateur que vous effectuez sur l'application.)la source
pour mon cas j'ai deux fichiers localisés, ja et en
et je voudrais le forcer à en si la langue préférée dans le système n'est ni en ni ja
je vais éditer le fichier main.m
je vais vérifier si la première préférence est en ou ja, sinon je changerai la deuxième langue préférée en en.
la source
Vous pouvez faire quelque chose comme ça:
la source
Basé sur la réponse de Tudorizer pour changer de langue sans quitter ni redémarrer l'application.
Au lieu d'une macro, utilisez une classe pour accéder à la langue préférée afin de vérifier si un code de langue spécifique est présent.
Vous trouverez ci-dessous une classe utilisée pour obtenir le pack de langue actuel qui fonctionne pour iOS 9:
Utilisez la classe ci-dessus pour référencer un fichier de chaîne / image / vidéo / etc:
Modifiez la langue en ligne comme ci-dessous ou mettez à jour la méthode "changeCurrentLanguage" dans la classe ci-dessus pour prendre un paramètre de chaîne référençant la nouvelle langue.
la source
Dans swift 4, je l'ai résolu sans avoir besoin de redémarrer ou d'utiliser des bibliothèques.
Après avoir essayé de nombreuses options, j'ai trouvé cette fonction, où vous passez la chaîneToLocalize (de Localizable.String, le fichier de chaînes) que vous souhaitez traduire, et la langue dans laquelle vous souhaitez la traduire, et ce qu'elle renvoie est la valeur de cette chaîne que vous avez dans le fichier Strings:
Compte tenu de cette fonction, j'ai créé cette fonction dans un fichier Swift:
Pour accéder à partir de l'application entière, et dans chaque chaîne du reste de ViewControllers, au lieu de mettre:
Je l'ai remplacé par
Je ne sais pas si c'est le meilleur moyen, mais je l'ai trouvé très simple, et ça marche pour moi, j'espère que ça vous aide!
la source
Cette fonction essaiera d'obtenir une chaîne localisée pour la langue actuelle et si elle n'est pas trouvée, elle l'obtiendra en utilisant la langue anglaise.
la source
Je voulais ajouter la prise en charge d'une langue qui n'est pas officiellement prise en charge par iOS (non répertoriée dans la section Langue sous les paramètres système). En suivant le tutoriel d'internationalisation d'Apple et quelques conseils ici de Brian Webster et geon, j'ai trouvé ce morceau de code (mettez-le dans main.m):
Cela fonctionne bien pour le code Storyboard et NSLocalizedString. Le code suppose que l'utilisateur aura la possibilité de changer manuellement la langue dans l'application ultérieurement.
Bien sûr, n'oubliez pas d'ajouter les traductions de Storyboard et les traductions de Localizable.strings appropriées (voir le lien vers la page Apple ci-dessus pour savoir comment faire).
la source
Voici une solution décente à ce problème, et elle ne nécessite pas de redémarrage de l'application.
https://github.com/cmaftuleac/BundleLocalization
Cette implémentation fonctionne en modifiant l'intérieur de NSBundle. L'idée est que vous remplacez la méthode localizedStringForKey sur l'instance de l'objet NSBundle, puis appelez cette méthode sur un bundle différent avec un langage différent. Simple et élégant entièrement compatible avec tous les types de ressources.
la source
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
quoi que vous fassiez tous, la meilleure façon est de prendre le short_name pour la langue spécifiée, c'est-à-dire: fr, en, nl, de, it, etc ... et de l'attribuer à une valeur globale.
faire apparaître une vue de sélecteur comme un menu déroulant (combinaison d'un bouton au clic duquel une vue de sélecteur apparaît ci-dessous avec une liste de langues) et sélectionner la langue souhaitée. laissez le nom court être stocké en interne. créez un fichier .h + .m nommé LocalisedString.
Définissez la valeur globale de short_name pour qu'elle soit égale à la valeur obtenue dans LocalisedString.m Lorsque la langue requise est sélectionnée, affectez NSBundlePath pour créer des sous-répertoires de projet pour la langue requise. par exemple, nl.proj, en.proj.
Lorsque le dossier proj particulier est sélectionné, appelez la chaîne localisée pour la langue respective et changez la langue dynamiquement.
pas de règles enfreintes.
la source
Pour Swift, vous pouvez remplacer le
main.swift
fichier et y définir la chaîne UserDefaults avant l'exécution de l'application. De cette façon, vous n'avez pas à redémarrer l'application pour voir l'effet souhaité.jumelé avec la suppression de
@UIApplicationMain
dans votreAppDelegate.swift
fichier.la source