localizedStringForKey: .....

tabliertablier Membre
juillet 2014 modifié dans Objective-C, Swift, C, C++ #1

J'ai écris la macro suivante:



#define localize(laklef) [[NSBundle mainBundle] localizedStringForKey:laklef value:nil table:@Localizable]



Ce qui me permet de localiser en écrivant  localize(@phrase a localiser). C'est nettement plus court, ça marche très bien et ça économise mes petits doigts vu le nombre de fois ou je l'utilise. Petit problème, chaque fois que j'utilise cette macro, le compilateur m'envoie le warning:



Format string is not a string literal (potentially insecure)


! Expanded from macro localize



Je comprends ce que me dit ce ☯ɷɝ☎⻣↯ de compilateur, mais je ne trouve pas comment me débarrasser de ce warning en gardant la fonctionnalité.


 


Comment dois-je faire?


 


Osx 10.9.3 et Xcode 5.1.1


Réponses

  • AliGatorAliGator Membre, Modérateur
    juillet 2014 modifié #2
    Heu non ce n'est pas normal d'avoir ce warning.


    Ce warning est présent quand tu utilises des méthodes type "stringWithFormat:" et que tu passes comme format en premier paramètre une variable au lieu d'une chaà®ne littérale. En effet si tu passes une variable le compilo ne sait pas ce qu'elle va contenir au runtime et il te met ce warning pour te dire qu'il ne peut pas contrôler pour toi si les paramètres que tu passes après le "format" sont bien du bon type (NSObject pour quand il voit un %@ dans le format, int pour quand il voit un %i ou %d, etc... et vérifier si t'as pas mis un int là  où le format attend un %@ donc un objet). Alors qu'avec une chaà®ne littérale il sait analyser la chaà®ne de format et voir si tu admis un mauvais type et te le signaler par un warning (et même te suggérer la correction adéquate)


    Donc :

    1) Tu dis que tu as ce warning à  chaque fois que tu utilises cette macro, ce n'est pas normal. Tu ne devrais l'avoir que quand tu utilises cette macro en premier paramètre de stringWithFormat genre [NSString stringWithFormat: localize(@toto), x, y, z] mais pas quand tu l'utilises toute seule genre label.text = localize("nom") c'est pas normal d'avoir le warning dans ce cas


    2) Et pour le cas où tu utilises [NSString stringWithFormat:...] tu as alors le même cas que tu utilises NSLocalizedString ou ta macro localize. Dans les 2 cas tu passes à  stringWithFormat une chaà®ne qui n'est pas littérale donc qu'il ne connaà®t pas à  la compilation. Il n'y a pas de raison d'y avoir de différence... sauf si le compilo fait une exception quand il rencontre NSLocalizedString parce qu'il considèrerait ce cas comme un cas particulier.


    Du coup c'est quoi ton cas ? Tu as vraiment ton warning a chaque fois que tu utilises ta macro, avec ou sans stringWithFormat ?!

    - Si c'est vraiment dans tous les cas comme tu le dis, alors il y'a un problème c'est pas normal ni logique.

    - Si c'est uniquement quand tu utilises stringWithFormat:, alors transforme ta macro pour qu'elle appelle NSLocalizableString ou NSLocalizableStringFromTable plutôt que directement le [NSBundle localizableStringForKey:value:table:] Pour voir... car peut être que le compilo fait un cas particulier quand il rencontre ces macros NSLocalizableString*
  • Ok, il faut que je regarde plus précisément! Je verrai ça après le match ou demain matin.  Merci!


  • Ok, c'est exactement ce que tu décris!  J'utilise cette macro dans les méthodes du genre alertWithMessageText: Comme la phrase localisée n'a pas d'argument, je l'ai mise à  la place du format! 


  • Pourquoi tu n'utilise pas la macro NSLocalizedString tout simplement ?


  • AliGatorAliGator Membre, Modérateur
    Oui je trouve ça dommage aussi.


    Moi ma macro de commodité " je l'avais déjà  donnée dans un autre post " c'est
    #define _T(x) NSLocalizedString(x,nil)
    tout simplement

  • Pourquoi tu n'utilise pas la macro NSLocalizedString tout simplement ?



    Encore une fois, vous avez raison! Je ne l'utilise pas parce que je ne l'avais pas trouvée jusqu'à  présent! J'avais suivi les explications sur la localisation dans la doc et j'ai du sauter l'épisode. Puisque vous l'indiquez je vais l'utiliser, ou plutôt je vais utiliser la macro d'AliGator.


Connectez-vous ou Inscrivez-vous pour répondre.