11 votes

Peut-on ajouter des fichiers de ressources .strings au moment de l'exécution ?

Je sais que dans les applications Mac, on peut ajouter des fichiers .strings au dossier du projet pour ajouter des localisations.

Existe-t-il un moyen d'ajouter des localisations supplémentaires à une application (iOS ou Mac OS) sans les charger à partir du paquet de ressources au moment de la compilation ? Par exemple, en téléchargeant une localisation supplémentaire et en la stockant dans /Documents sur iOS ?

19voto

Dave DeLong Points 156978

Oui, mais ce n'est pas ce que vous pensez.

Vous pouvez prendre un fichier de chaînes et le charger dans une NSString puis de le transformer en un dictionnaire en utilisant -[NSString propertyListFromStringsFileFormat] .

Cela vous permettra de stocker en mémoire vos chaînes de caractères traduites de manière personnalisée.

Pour ce qui est de l'utilisation effective, vous devrez définir des fonctions de traduction personnalisées. IE, vous ne pouvez pas utiliser NSLocalizedString() et ses amis. Heureusement, genstrings (l'utilitaire utilisé pour générer des fichiers de chaînes de caractères) vous permet de spécifier noms de fonctions personnalisées :

genstrings -s "JPLocalizedString" ...

Cela signifie que dans le code, vous pouvez définir :

NSString* JPLocalizedString(NSString *key, NSString *comment) {
  return [myLoadedStrings objectForKey:key];
}

Ainsi que JPLocalizedStringFromTable() , JPLocalizedStringFromTableInBundle() , JPLocalizedStringWithDefaultValue() . genstrings va ramasser tout ça. (En d'autres termes, ce n'est pas parce que NSLocalizedString est une macro ne signifie pas que votre version doit l'être)

Si vous faites cela et utilisez ces JPLocalizedString variantes, alors genstrings générera toujours vos fichiers de chaînes de caractères pour vous (à condition que vous utilisiez l'option -s drapeau).

Une fois que ces fonctions sont appelées, vous pouvez utiliser le mécanisme de recherche que vous voulez, en revenant par défaut à la fonction NSLocalizedString des versions si vous ne trouvez rien.

1voto

Michael Gray Points 196

Si vous souhaitez mettre en œuvre une autre version de NSLocalizedString() dans votre application, il existe un certain nombre de bonnes stratégies pour cela. Cela vous permettrait de modifier les valeurs utilisées à l'intérieur même de votre application. Mais ces stratégies ne fonctionnent pas lorsqu'il s'agit de notifications push.

Attention toutefois : pour les notifications Push iOS qui utilisent des chaînes localisées, il n'existe pas de méthode d'exécution légale pour modifier les ressources de chaînes intégrées qui sont utilisées pour traduire les arguments localisés envoyés par votre serveur dans la langue maternelle de l'appareil.

Ainsi, si vous voulez utiliser des chaînes localisées dans le cadre des notifications Push, vous devez les envoyer dans l'application lorsque vous la soumettez au magasin. Elles ne peuvent pas être modifiées ultérieurement en chargeant quelque chose depuis le serveur.

0voto

Jens Ayton Points 11566

Vous devriez pouvoir y parvenir en surchargeant la fonction NSBundle Les différents pathForResource: méthodes dans une catégorie. (Je suppose qu'elles passent toutes par -pathForResource:ofType:inDirectory:forLocalization: mais cela n'est pas documenté et vous ne pouvez pas vous y fier, même si cela s'avère être le cas maintenant, vous devriez donc les remplacer tous.)

Je suggère également dépôt d'une demande d amélioration pour une manière propre de remplacer le mécanisme de recherche.

0voto

multitudes Points 1225

J'ai réussi à le faire et j'ai créé un petit dépôt pour montrer comment j'ai procédé :

https://github.com/multitudes/MyLocalisationTestApp

Créez un paquet personnalisé dans le répertoire des documents.

En regardant la documentation d'Apple pour Text : https://developer.apple.com/documentation/swiftui/text

L'initialisateur de la vue texte de SwiftUI accepte un paramètre de regroupement.

1 - J'ai créé un paquet personnalisé dans le répertoire Documents. 2 - J'ai placé programmatiquement les dossiers de langue et les fichiers de chaînes à l'intérieur de celui-ci. 3 - Quand je l'utilise, je passe le bundle personnalisé et le tableName (le nom de l'objet .strings ) vers le Text ainsi que l'initialisateur key .
Comme dans SwiftUI, ce sera : Text(localizedStringKey, tableName: tableName, bundle: bundle)

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