Existe-t-il un équivalent Swift de NSLocalizedString(...)
? Dans Objective-C
, nous utilisons généralement:
NSString *string = NSLocalizedString(@"key", @"comment");
Comment puis-je réaliser la même chose dans Swift? J'ai trouvé une fonction:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
Cependant, c'est très long et pas du tout pratique.
NSLocalizedString("Cancel", comment: "Cancel button title")
en profitant des valeurs par défaut. C'est pratique je pense.Réponses:
J'utilise la solution suivante:
1) créer une extension:
2) dans le fichier Localizable.strings :
3) exemple d'utilisation:
prendre plaisir! ;)
--upd: -
pour le cas avec des commentaires, vous pouvez utiliser cette solution:
1) Extension:
2) dans le fichier .strings:
3) en utilisant:
la source
genstrings
utilitaire pour générer vos fichiers .strings.func localized(comment: String = "") -> String
qu'il devienne plus petit et avec des commentaires facultatifs :)genstrings
avec ça?genstrings
ne fonctionne que sur les chaînes littérales transmises à NSLocalizedString. Avec cette solution de contournement intelligente, vous perdez la possibilité de mettre à jour vos fichiers .strings à l'aide de l'genstrings
outil, et au moins pour moi, cela signifie que je ne pourrai pas utiliser cette approche simplifiée.Le
NSLocalizedString
existe aussi dans le monde du Swift.La
tableName
,bundle
et lesvalue
paramètres sont marqués avec undefault
mot - clé qui signifie que nous pouvons omettre ces paramètres tout en appelant la fonction. Dans ce cas, leurs valeurs par défaut seront utilisées.Cela conduit à la conclusion que l'appel de méthode peut être simplifié pour:
Swift 5 - pas de changement, fonctionne toujours comme ça.
la source
Wrap in NSLocalizedString
option qui rend les choses vraiment faciles en surlignant simplement le texte, en cliquant avec le bouton droit et en sélectionnant l'élément de menu.Une variation des réponses existantes:
Swift 5.1:
Vous pouvez ensuite simplement l'utiliser avec ou sans commentaire:
Veuillez noter que
genstrings
cela ne fonctionnera pas avec cette solution.la source
En utilisant de cette façon, il est possible de créer une implémentation différente pour différents types (par exemple, des classes Int ou personnalisées comme CurrencyUnit, ...). Il est également possible de rechercher cette méthode à l'aide de l'utilitaire genstrings. Ajoutez simplement l'indicateur de routine à la commande
extension:
usage:
la source
Version Swift 3:) ...
la source
En fait, vous pouvez utiliser deux phases pour traduire vos textes dans des projets Swift:
1) La première phase utilise l'ancienne méthode pour créer toutes vos chaînes traduisibles:
1.1) Ensuite, vous devez utiliser genstrings pour générer Localizable.strings:
2) Ensuite, vous devez utiliser cette réponse .
2.1) Utilisez votre option XCode "Rechercher et remplacer" basée sur l'expression régulière. Comme pour l'exemple donné (si vous n'avez pas de commentaires), l'expression régulière sera:
et remplacez-le par
ou (si vous avez des commentaires)
et remplacez-le par
Vous êtes libre de jouer avec regex et différentes combinaisons d'extensions comme vous le souhaitez. La manière générale consiste à diviser l'ensemble du processus en deux phases. J'espère que cela pourra aider.
la source
NSLocalizedString("Cancel", comment: "Cancel button title")
?NSLocalizedString
semble moins rapide que cela ne devrait l'être.String.localized
d'autre part, semble plus Swifty mais vous ne pouvez pas utiliser l'gesntrings
utilitaire qui est couramment utilisé pour faciliter votre travail avec l'internationalisation. Mon point est qu'il est assez facile de mélanger les deux approches. C'est donc principalement une question de lisibilité.genstrings
? Remplacez-vous tous.localized
parNSLocalizedString
?Création d'une petite méthode d'aide pour les cas, où "commentaire" est toujours ignoré. Moins de code est plus facile à lire:
Mettez-le n'importe où (en dehors d'une classe) et Xcode trouvera cette méthode globale.
la source
La meilleure façon est probablement celle-ci ici .
et
vous pouvez ensuite l'utiliser comme ça
pour moi c'est le meilleur parce que
la source
static var Hello: String = { return NSLocalizedString("Hello") }
Lorsque vous développez un SDK. Vous avez besoin d'une opération supplémentaire.
1) créer des chaînes localisables comme d'habitude dans YourLocalizeDemoSDK.
2) créer les mêmes chaînes Localizable.strings chaînes YourLocalizeDemo.
3) Trouvez votre chemin de bundle de bundle de YourLocalizeDemoSDK.
Swift4 :
Bundle(for: type(of: self))
vous aide à trouver l'ensemble dans YourLocalizeDemoSDK. Si tu utilisesBundle.main
place, vous obtiendrez une valeur incorrecte (en fait, ce sera la même chaîne avec la clé).Mais si vous souhaitez utiliser l'extension String mentionnée par dr OX . Vous devez en faire plus. L'extension d'origine ressemble à ceci.
Comme nous le savons, nous développons un SDK,
Bundle.main
obtiendra le bundle du bundle de YourLocalizeDemo. Ce n'est pas ce que nous voulons. Nous avons besoin du bundle dans YourLocalizeDemoSDK. C'est une astuce pour le trouver rapidement.Exécutez le code ci-dessous dans une instance NSObject dans YourLocalizeDemoSDK. Et vous obtiendrez l'URL de YourLocalizeDemoSDK.
Imprimez les deux URL, vous constaterez que nous pouvons construire la base bundleURLofSDK sur mainBundleURL. Dans ce cas, ce sera:
Et l'extension String sera:
J'espère que ça aide.
la source
J'ai créé ma propre sorte d'outil genstrings pour extraire les chaînes en utilisant une fonction de traduction personnalisée
https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c
Il analysera tous vos fichiers rapides et exportera les chaînes et les commentaires de votre code vers un fichier .strings.
Probablement pas la façon la plus simple de le faire, mais c'est possible.
la source
Bien que cela ne réponde pas au problème de raccourcissement, mais cela m'a aidé à organiser les messages, j'ai créé une structure pour les messages d'erreur comme ci-dessous
De cette façon, vous pouvez organiser les messages et faire fonctionner les chaînes de caractères.
Et ceci est la commande genstrings utilisée
la source
Utile pour une utilisation dans les tests unitaires:
Il s'agit d'une version simple qui peut être étendue à différents cas d'utilisation (par exemple avec l'utilisation de tableNames).
Utilisez-le comme ceci:
Ou comme ça avec un commentaire:
la source
Il s'agit d'une amélioration de l'approche ".localized". Commencez par ajouter l'extension de classe, car cela vous aidera avec toutes les chaînes que vous définissez par programme:
Exemple d'utilisation des chaînes que vous définissez par programme:
Les fichiers de traduction du storyboard de Xcode rendent le gestionnaire de fichiers désordonné et ne gèrent pas non plus correctement les mises à jour du storyboard. Une meilleure approche consiste à créer une nouvelle classe d'étiquettes de base et à l'attribuer à toutes vos étiquettes de storyboard:
Désormais, chaque étiquette que vous ajoutez et fournissez par défaut dans le storyboard sera automatiquement traduite, en supposant que vous en ayez fourni une traduction.
Vous pouvez faire de même pour UIButton:
la source
Lorsque vous traduisez, par exemple de l'anglais, où une phrase est la même, vers une autre langue où elle est différente (en raison du sexe, de la conjugaison ou de la déclinaison), la forme NSString la plus simple dans Swift qui fonctionne dans tous les cas est les trois arguments. . Par exemple, l'expression anglaise "précédente était" est traduite différemment en russe pour le cas de "poids" ("предыдущ ий был") et pour "taille" ("предыдущ ая был а ").
Dans ce cas, vous avez besoin de deux traductions différentes pour une seule source (en termes d'outil XLIFF recommandé dans la WWDC 2018). Vous ne pouvez pas y parvenir avec deux arguments NSLocalizedString, où "précédent était" sera le même pour la "clé" et la traduction anglaise (c'est-à-dire pour la valeur). La seule façon est d'utiliser la forme à trois arguments
où les clés ("previousWasFeminine" et "previousWasMasculine") sont différentes.
Je sais que le conseil général est de traduire la phrase dans son ensemble, cependant, parfois trop longue et peu pratique.
la source
Localisation avec langue par défaut:
la source