1

Je trouve que quelquesNSPredicateEditor/NSPredicateEditorRowTemplate valeurs sont localisées automatiquement par OS X.Pourquoi NSPredicateEditor localise-t-il automatiquement certaines chaînes d'expression? Comment désactiver?

Ceci est facilement observable dans la cartographie des opérateurs: .equalTo à la chaîne is.

Mais je viens de remarquer que les chaînes UTI sont en cours de mappage vers une version lisible par l'homme de cette UTI. Ci-dessous, j'ai défini "public.image", mais il est alors affiché sous la forme "image".

UTI operators in NSPredicateEditor

func setupPredicateEditor() { 
    let left = [NSExpression(forKeyPath: "Type")] 

    let operators = [NSComparisonPredicate.Operator.equalTo.rawValue as NSNumber] 

    let right = [ 
     NSExpression(forConstantValue: "public.image"), 
     NSExpression(forConstantValue: "public.text"), 
     NSExpression(forConstantValue: "public.fakeUTI"), 
     ]; 

    let rowTemplate = NSPredicateEditorRowTemplate.init(leftExpressions: left, rightExpressions: right, modifier: .all, operators: operators, options: 0) 
    predicateEditor.rowTemplates = [rowTemplate] 

    predicateEditor.addRow(self) 
} 

Seuls certains IVU valides sont mises en correspondance de cette manière. Je ne sais pas si d'autres formats au-delà des opérateurs et des UTI sont donnés des chaînes localisées automatiques.

Ceci est un problème car je veux localize my NSPredicateEditor and Row Templates.

Le processus de localisation du prédicat implique l'appariement d'une clé à une valeur localisée.

KEY: "%[left]@ %[is]@ %[right]@" 
VAL: "%1$[left_display_string]@ %2$[is]@ %3$[right_display_string]@" 

Le problème est que les valeurs de la clé doivent correspondre aux chaînes indiquées dans l'interface utilisateur. Pas les chaînes définies à l'origine pour les expressions gauche et droite du modèle de lignes. Donc, je ne peux pas localiser avec "public.image" dans la clé. L'interface utilisateur est pour une raison déjà localiser cela à "image". Si je veux localiser le modèle de ligne, je dois utiliser la chaîne "image" à la place. Et je ne sais pas comment ou pourquoi cette chaîne "image" est sélectionnée.

Je pourrais déterminer ces chaînes via des tests, puis écrire une table qui mappe l'expression à la chaîne localisée. Mais je préférerais avoir une solution qui désactive cette localisation automatique afin que je n'aie pas à m'inquiéter des chaînes que je n'ai pas testées.

Pourquoi les infections urinaires sont-elles localisées automatiquement? Est-ce que les autres valeurs reçoivent le même traitement?

Existe-t-il un moyen de désactiver la localisation automatique des chaînes UTI et/ou de l'éditeur de prédicat entier?

+0

J'ai ouvert rdar: // 30468110 pour qu'Apple ajoute ces dictionnaires de traduction privés à l'API publique. – pkamb

Répondre

1

Pas une réponse mais quelques informations: NSPredicateEditorRowTemplate traduit les chaînes en _displayValueForConstantValue:. Il utilise un dictionnaire:

{ 
    "com.apple.application" = application; 
    "com.apple.pict" = PICT; 
    "com.apple.protected-mpeg-4-audio" = "purchased music"; 
    "com.apple.rtfd" = RTFD; 
    "com.compuserve.gif" = GIF; 
    "com.microsoft.bmp" = BMP; 
    "public.audio" = music; 
    "public.folder" = folder; 
    "public.html" = HTML; 
    "public.image" = image; 
    "public.jpeg" = JPEG; 
    "public.jpeg-2000" = "JPEG 2000"; 
    "public.mp3" = MP3; 
    "public.mpeg-4-audio" = "MPEG4 audio"; 
    "public.png" = PNG; 
    "public.rtf" = RTF; 
    "public.source-code" = "source code"; 
    "public.text" = text; 
    "public.tiff" = TIFF; 
    "public.xml" = XML; 
} 

bt:

AppKit`-[NSPredicateEditorRowTemplate _displayValueForConstantValue:] + 913 
AppKit`-[NSPredicateEditorRowTemplate _viewFromExpressions:] + 589 
AppKit`-[NSPredicateEditorRowTemplate initWithLeftExpressions:rightExpressions:modifier:operators:options:] + 205 

Edit:

_displayValueForKeyPath: utilise ce dictionnaire:

{ 
    kMDItemContentCreationDate = Created; 
    kMDItemContentModificationDate = "Last modified"; 
    kMDItemContentTypeTree = "File type"; 
    kMDItemDisplayName = "File display name"; 
    kMDItemFSContentChangeDate = "Change date"; 
    kMDItemFSCreationDate = "Creation date"; 
    kMDItemFSName = "File name"; 
    kMDItemFSOwnerGroupID = "Owner group id"; 
    kMDItemFSOwnerUserID = "Owner user ID"; 
    kMDItemFSSize = "File size"; 
    kMDItemLastUsedDate = "Last opened"; 
    kMDItemPath = "File path"; 
} 

_displayValueForPredicateOperator: et _displayValueForCompoundPredicateType: traduisons les énumérations à cordes.

Ceci devrait être documenté mais ce n'est pas le cas. J'ai mis un point d'arrêt sur _displayValueForConstantValue: et j'ai regardé ce qui s'est passé. Les dictionnaires sont codés en dur et peuvent être différents dans d'autres versions de macOS.

+0

Wow, c'est génial. Je vous remercie. Est-ce que la source pour cela est disponible quelque part? Sont ces * toutes * les entrées dans le dictionnaire de valeur d'affichage? Une idée où la traduction '.equalTo'-to-' "est" 'se produit? – pkamb

+0

On dirait qu'ils seront les méthodes '_displayValueForPredicateOperator:', '_displayValueForCompoundPredicateType:', '_displayValueForConstantValue:', '_displayValueForKeyPath:' ... des conseils sur où trouver l'implmentation ou les clés/valeurs? – pkamb

+0

J'ai édité ma réponse. – Willeke