Question Puis-je charger un fichier localizable.strings dans une application iOS en direct


Disons que mon application ne fonctionne qu'en anglais. Mais je ne veux pas sortir une nouvelle version à chaque fois que j'ajoute une nouvelle langue. Ma proposition est de charger ceci localizable.strings Fichier à distance dans mon application.

Mon application a la possibilité de charger des fichiers à partir de sites ftp.

Est-ce que vous pensez qu'il est possible de charger des langues de cette façon? Ou l'application doit-elle compiler le fichier de langue au moment de la compilation?


20
2017-09-10 19:17


origine


Réponses:


Toutes les ressources de chaîne localisées (ainsi que de nombreux autres types de ressources) sont extraites du bundle. En général, une application utilise le "bundle principal" qui est créé par XCode avec votre application. Mais vous pouvez créer séparément n'importe quel autre bundle, à condition que vous obteniez la structure correcte, puis vous pourrez le télécharger dans votre application et extraire une chaîne localisée à l'aide de la fonction NSLocalizedStringFromTableInBundle ().

Alors disons que vous extrayez pour une clé "KEY" la traduction du langage, alors la syntaxe normale serait:

NSString *translated = NSLocalizedStringFromTable(@"key",nil,nil);

mais il existe une variante de cette option qui vous permet de spécifier le bundle:

NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil);

Dans le cas standard, vous remplacez myBundle avec [NSBundle mainBundle] mais si vous souhaitez utiliser un autre bundle, vous pouvez le spécifier de la manière suivante:

NSString *myBundlePath = "the path to the downloaded bundle";
NSBundle *myBundle = [NSBundle bundleWithPath:myBundlePath];
NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil);

La structure complète d'un bundle peut être vue dans le "Guide de programmation de bundle" dans les documents Apple, mais dans votre cas, vous pouvez simplement créer de cette manière:

  • dans votre Mac, créez un répertoire et appelez-le "MyBundle"
  • dans ce répertoire, déplacez votre (vos) chaîne (s) localisée (si vous avez plusieurs langues dans le bundle, le fichier localizable.strings sera dans les répertoires lproj: en.lproj, it.lproj, fr.lproj, ...)
  • puis renommez le répertoire en "MyBundle.bundle"

Vous remarquerez avec la dernière opération que cet objet est maintenant considéré comme un objet autonome, mais en fait c'est un répertoire.

Vous pouvez maintenant choisir une approche multi-bundle ou suivre une technique de bundle unique: dans ce dernier cas, vous pouvez regrouper toutes les langues, puis utiliser le bundle mis à jour unique pour la traduction du langage en utilisant les règles de localisation automatique du système; dans l'autre cas, vous pouvez créer un bundle pour chaque langue, puis, en fonction de la langue sélectionnée, charger le bundle approprié et le choisir pour vos traductions.


33
2017-09-10 20:02