Je développe une application pour un client en Europe. Je suis anglophone aux États-Unis. Notre application va prendre en charge un certain nombre de langues, mais pas l'anglais. J'ai toutes les chaînes de notre application dans des fichiers traduits Localized.strings, configurées correctement pour les différentes langues, et elles fonctionnent toutes correctement lorsque l'appareil est défini 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é sur l'anglais. Nous voulons que le téléphone retombe en allemand dans des cas comme celui-ci, mais cela ne se produit pas. Ce que nous voyons, c'est que le téléphone utilise la langue qui apparaît le plus haut dans la liste Langue dans la section International de Settings.app. Pour mon téléphone, la langue non anglaise la plus élevée de la liste est le français, donc lorsque je lance l'application, elle est localisée pour le français. Si je change mon téléphone en allemand, puis de nouveau en anglais (ce qui change l'ordre dans la liste des langues), l'application localise alors en allemand.
Comment puis-je m'assurer que l'application utilise par défaut l'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 des paramètres régionaux "anglais" par défaut qui sont créés lors de la première localisation d'un fichier. Dans le dossier de projet, j'ai ajouté:
developmentRegion = de;
De plus, dans l'Info.plist, j'ai
<key>CFBundleDevelopmentRegion</key>
<string>de</string>
Sans succès.
Toute idée serait appréciée!
Par défaut, vous ne devez pas vous efforcer de choisir une langue particulière. Supposons qu'un utilisateur japonais vivant en France et parlant couramment le français ait son téléphone réglé sur japonais. Votre application par défaut serait l'allemand, bien qu'elle ait une traduction française; Je suppose que ce n'est pas ce que vous voulez et ce n'est certainement pas ce que veut l'utilisateur.
Pour cette raison, je suggère de respecter la priorité des langues définie par l'utilisateur.
Puisque vous ne voulez pas prendre en charge l'anglais mais que vous avez développé l'application en anglais, la chose la plus simple que vous pouvez faire est de simplement vous débarrasser de en.lproj
juste après la compilation. Cela ne laissera l'application qu'avec les langues que vous prévoyez de prendre en charge, et l'iPhone choisira la langue la plus adaptée à l'utilisateur, telle que définie dans les valeurs par défaut de l'iPhone.
Il existe une solution assez simple pour suppression d'une localisation spécifique:
Laissez Xcode construire l'application avec toutes les localisations actuelles et juste avant de lancer la signature de code pour supprimer le en.lproj
dossier et tous les fichiers localisés pour cette langue ont disparu. Vous pouvez facilement le faire en ajoutant une phase de génération 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 de code intervient toujours une fois toutes les phases de construction terminées, alors mettez cette phase de construction à la fin de vos phases actuelles.
Remarque que cela augmente le temps de construction car Xcode recrée tous les fichiers anglais, vous pouvez donc désactiver cette étape pendant le test.
J'espère que c'est une solution viable pour vous.
Concernant "l'application doit retomber en allemand dans le cas où une localisation appropriée n'existe pas" :
La question est quoi 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 retomber l'application en 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 descend la liste des langues des utilisateurs, 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 par défaut sont l'anglais et non l'allemand est simplement parce que l'anglais apparaît dans la plupart des listes de langues utilisateur au-dessus de l'allemand. Il n'y a aucune préférence linguistique inhérente au système. Si vous supprimez la traduction anglaise, seules les langues que vous souhaitez prendre en charge sont présentes et, parmi ces langues, la plus élevée de la liste des utilisateurs est prise.
Je n'aime pas poster cette réponse car elle s'exécute contre Apples Human Interface Guidelines. Les localisations sont quelque chose que l'utilisateur doit définir, pas quelque chose que la direction doit décider, donc les gestionnaires qui ont besoin d'une certaine langue par défaut ne comprennent rien et doivent changer d'activité.
Cela étant dit, il existe un moyen de forcer iOS à utiliser certaines langues dans un certain ordre. Je l'utilise principalement pour déboguer des localisations sans avoir à définir la langue de l'appareil sur autre chose, s'il est possible de l'utiliser pour résoudre le problème inexistant dans cette question, je ne peux pas le dire.
Il y a une clé AppleLanguages
dans les valeurs par défaut de l'utilisateur qui dicte l'ordre des langues à utiliser, normalement définie dans l'ordre défini par l'utilisateur dans les préférences d'iOS. Si vous modifiez cet ordre, l'application essaiera d'abord de trouver les localisations dans cet ordre. Ce que vous pourriez faire, c'est lire les préférences linguistiques actuelles et décider de passer par défaut à l'allemand comme suit:
NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil];
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"];
Notez que vous devez le faire dans main.m
avant UIApplicationMain
, sinon vous devez redémarrer l'application pour que cette modification prenne effet.
Je ne peux pas affirmer assez que personne ne devrait le faire dans une vraie application, à moins que vous n'alliez jusqu'au bout et implémentiez un paramètre de préférence qui permet à l'utilisateur de changer la langue manuellement. Si vous venez par défaut d'une langue donnée, l'utilisateur n'a pas la possibilité de changer votre choix.
Pour faire de la langue par défaut une langue particulière, ce code suivant fonctionne comme un charme déjà décrit dans cette page. Voici la version Swift: (Swift 4.2)
let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")