40 votes

Langue par défaut non anglaise pour l'application iOS ?

Je développe une application pour un client en Europe. Je suis un anglophone aux États-Unis. Notre application prendra en charge plusieurs langues, sauf l'anglais. J'ai toutes les chaînes de caractères de notre application dans des fichiers Localized.strings traduits, configurés correctement pour les différentes langues, et elles fonctionnent toutes correctement lorsque l'appareil est réglé sur la langue correcte (la langue de l'appareil est l'allemand = l'application est correctement localisée pour l'allemand).

Il y a un problème lorsque l'appareil n'est pas réglé sur l'une des langues que nous prenons en charge, par exemple, sur mon téléphone qui est réglé en anglais. Nous voulons que le téléphone passe en allemand dans des cas comme celui-ci, mais cela ne se produit pas. Ce que nous constatons, c'est que le téléphone utilise la langue qui apparaît en premier dans la liste des langues dans la section Internationale de l'application Paramètres. Sur mon téléphone, la langue non anglaise la plus élevée sur la liste est le français, donc lorsque j'exécute l'application, elle est localisée en français. Si je change mon téléphone en allemand puis en anglais (ce qui modifie l'ordre dans la liste des langues), l'application se localise alors en allemand.

Comment puis-je m'assurer que l'application se configure par défaut en allemand pour les langues non prises en charge ? J'ai utilisé ce tutoriel pour configurer les paramètres régionaux du projet. Cela inclut la suppression de l'option locale "Anglais" par défaut qui est créée lorsqu'on localise un fichier pour la première fois. Dans le fichier du projet, j'ai ajouté :

developmentRegion = de;

Aussi, dans l'Info.plist, j'ai

CFBundleDevelopmentRegion
de

Sans succès.

Toute idée serait appréciée !

46voto

Pascal Points 8222

Opter pour une langue particulière par défaut n'est pas ce que vous devriez viser. Supposons qu'un utilisateur japonais vivant en France et parlant couramment le français ait son téléphone réglé sur le japonais. Votre application se mettrait par défaut en allemand, bien qu'elle ait une traduction en français; je suppose que ce n'est pas ce que vous voulez et ce n'est certainement pas ce que l'utilisateur veut.

Pour cette raison, je suggère de respecter la priorisation linguistique définie par l'utilisateur.

Comme vous ne voulez pas prendre en charge l'anglais mais avez développé l'application en anglais, la chose la plus facile à faire est de supprimer simplement le dossier en.lproj juste après la compilation. Cela laissera l'application uniquement avec les langues que vous prévoyez de prendre en charge, et l'iPhone choisira la langue la mieux adaptée pour l'utilisateur, comme défini dans les paramètres de l'iPhone.


Il y a une solution assez simple pour supprimer une localisation spécifique:

Laissez Xcode construire l'application avec toutes les localisations actuelles et juste avant que la signature du code ne commence, supprimez le dossier en.lproj et tous les fichiers localisés de cette langue disparaîtront. Vous pouvez facilement le faire en ajoutant une phase de build de script d'exécution à la cible, contenant cette seule ligne de code (c'est un script Bash) :

rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj"

La signature du code intervient toujours après que toutes les phases de construction ont été terminées, donc placez simplement cette phase de construction à la fin de vos phases actuelles.

Remarque : cela augmente le temps de construction car Xcode recrée tous les fichiers en anglais, donc vous voudrez peut-être désactiver cette étape pendant les tests.

J'espère que c'est une solution viable pour vous.


Concernant "l'application doit revenir à l'allemand dans le cas où aucune localisation appropriée n'existe":

La question est ce qu'est une localisation appropriée? Si le troisième choix de l'utilisateur est le français (après 2 langues non prises en charge), cette solution fera en sorte que l'application revienne au français, ce qui est une localisation appropriée. Plus approprié que de définir manuellement le cinquième choix de l'utilisateur, l'allemand.

Ce qui se passe lors du lancement d'une application est simple : le système d'exploitation parcourt la liste de langues de l'utilisateur, telle que définie dans les préférences, jusqu'à ce qu'il trouve une localisation correspondante, et utilise cette langue. La raison pour laquelle de nombreuses applications se mettent par défaut en anglais et non en allemand est simplement parce que l'anglais apparaît sur la plupart des listes de langues des utilisateurs avant l'allemand. Il n'y a pas de préférence linguistique inhérente au système. Si vous supprimez la traduction en anglais, seules les langues que vous souhaitez prendre en charge seront là, et parmi ces langues, celle qui est plus élevée sur la liste d'un utilisateur est choisie.

0 votes

Pascal a la bonne réponse : L'application reviendra à la localisation la plus raisonnable suivante ; c'est conçu ainsi, et c'est la façon dont toutes les applications sur iOS et Mac OS X sont censées fonctionner. Votre application n'est pas spéciale.

2 votes

Je réfléchis encore à cette réponse. Bien que cela soit évidemment une réponse bien pensée, à la fin de la journée, l'exigence commerciale reste que l'application doit toujours revenir en allemand dans le cas où aucune autre localisation appropriée n'existe ; c'est non négociable avec le client. Ce qui est intéressant, et à quoi je fais allusion dans le titre de ma question, c'est que si le dossier English.lproj est conservé dans le projet, il est utilisé en tant que solution de secours lorsqu'aucune autre localisation n'est disponible. Si je ne trouve rien d'autre, je vais simplement garder ce dossier, et copier les éléments "de" à l'intérieur.

2 votes

Non, l'anglais n'est pas non plus une langue par défaut du système. C'est simple, le système d'exploitation dispose d'une liste de localisations définies dans les préférences. Lors du démarrage d'une application, celle-ci recherche des dossiers *.lproj correspondants et utilise le premier qui correspond à une langue de la liste. C'est pourquoi elle utilise l'anglais lorsqu'il n'y a rien d'autre. ;) Mais je connais un autre astuce, je formulerai une nouvelle réponse...

14voto

Pascal Points 8222

Je n'aime pas publier cette réponse car elle va à l'encontre des directives de l'interface humaine d'Apple. Les localisations sont quelque chose que l'utilisateur devrait définir, et non quelque chose que la direction devrait décider, donc les managers qui exigent une langue par défaut spécifique ne comprennent rien et devraient revoir leur stratégie.

Ceci étant dit, il y a une façon de forcer iOS à utiliser certaines langues dans un certain ordre. J'utilise principalement cela pour déboguer des localisations sans avoir besoin de définir la langue de l'appareil sur autre chose. Je ne peux pas dire s'il est possible d'utiliser cela pour résoudre le problème inexistant de cette question.

Il existe une clé AppleLanguages dans les préférences utilisateur qui dicte l'ordre des langues à utiliser, généralement défini selon l'ordre choisi par l'utilisateur dans les préférences d'iOS. Si vous changez cet ordre, l'application tentera en premier lieu de trouver des localisations dans cet ordre. Ce que vous pourriez faire est de lire les préférences de langue actuelles et de décider de définir l'allemand par défaut comme suit :

NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil];
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"];

Remarquez que vous devez faire ceci dans main.m avant UIApplicationMain, sinon vous devrez redémarrer l'application pour que ce changement prenne effet.

Je ne peux pas insister assez sur le fait que personne ne devrait faire cela dans une véritable application, à moins d'aller jusqu'au bout et de mettre en place un réglage de préférences permettant à l'utilisateur de changer la langue manuellement. Si vous vous contentez de définir une langue donnée par défaut, l'utilisateur n'a pas la possibilité de changer votre choix.

4 votes

Nous avons un exemple concret qui ne viole aucune norme ou autre. De plus, je remercie Pascal d'avoir répondu (bien que ce fut après une excuse). Je déteste quand les gens répondent avec une suggestion/conseil/orientation qui n'est pas pertinente à la question technique : soit vous répondez, soit vous ne répondez pas... quoi qu'il en soit, le cas : nous développons une application pour le marché international (donc, c'est en anglais) mais nous devons fournir une version personnalisée pour un client italien. La base de code est la même, et nous voulons forcer (comme demandé par le client) la version personnalisée en italien. Peu importe les paramètres de l'utilisateur (par exemple sur mon iPad de développement)

1 votes

C'est utile mais si j'ai le lancement de l'écran de démarrage avec internationalisation, cela n'applique pas l'image correcte, même si je mets le code sur main.m, savez-vous comment je peux le corriger? Merci

0 votes

Le HIG est un ensemble de directives (et non de règles) pour une raison. Dans mon cas, l'application est une application d'entreprise Point de Vente et doit effectuer des transactions dans la devise de l'emplacement du magasin. Les prix récupérés à partir d'une base de données serveur sont en euros, dollars américains, yens ou autre. Si l'utilisateur définit le paramètre régional sur autre chose, des problèmes surviennent. Malheureusement, mon application ne peut pas obtenir le paramètre régional du magasin (alias serveur) avant d'être bien au-delà de main.m. Ai-je une autre option que de comparer le paramètre régional de l'appareil à ce que le magasin demande et d'afficher une alerte ?

-1voto

RMH Development Points 19

Voir ma réponse à une question différente : iOS - Pourrais-je changer le contenu de localizable.strings pendant l'exécution ?

Il contient le code pour forcer la localisation dans n'importe quelle langue si besoin.

-1voto

geser Points 1

Essayez ceci dans votre fonction didFinishLaunchingWithOptions()

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
int retVal = UIApplicationMain(argc, argv, nil, nil);

-1voto

Pour définir la langue par défaut comme une langue particulière, ce code suivant fonctionne à merveille, comme indiqué dans cette page. Voici la version en Swift: (Swift 4.2)

let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X