1

Я нахожу, что некоторыеNSPredicateEditor/NSPredicateEditorRowTemplate значения локализуется автоматически OS X.Почему NSPredicateEditor автоматически локализует некоторые строки выражений? Как отключить?

Это легко наблюдать в отображении операторов: .equalTo в строку is.

Но я только заметил, что строки UTI сопоставляются с удобочитаемой версией этого UTI.

Ниже приведено значение "public.image", но оно отображается как "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) 
} 

Только некоторые действительны ИМП отображаются таким образом. Я не знаю, предоставляются ли в других форматах за пределами операторов и UTI автоматические локализованные строки.

Это проблема, потому что я хочу localize my NSPredicateEditor and Row Templates.

Процесс локализации предиката включает в себя сопоставление ключа с локализованным значением.

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

Проблема заключается в том, что значения в ключе должны соответствовать строкам , показанных в пользовательском интерфейсе. Не строки, первоначально установленные в левом и правом выражениях шаблона Row Template.

Итак, я не могу локализовать с помощью "public.image" в ключе. UI по какой-то причине уже локализует это до "image". Если я хочу локализовать шаблон Row, я должен использовать строку "image". И я не знаю, как и почему эта строка "image" выбрана.

Я мог бы определить эти строки с помощью тестирования, а затем написать таблицу, которая отображает выражение в локализованную строку. Но я предпочел бы иметь решение, которое отключает эту автоматическую локализацию, поэтому мне не нужно беспокоиться о строках, которые я не тестировал.

Почему UTI локализованы автоматически? Получают ли другие ценности одинаковое лечение?

Есть ли способ отключить автоматическую локализацию строк UTI и/или всего редактора предикатов?

+0

Я открыл rdar: // 30468110 для Apple, чтобы добавить эти частные словари перевода в общедоступный API. – pkamb

ответ

1

Не ответ, но информация: NSPredicateEditorRowTemplate переводит строки в _displayValueForConstantValue:. Он использует словарь:

{ 
    "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; 
} 

Б.Т.:

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

Edit:

_displayValueForKeyPath: использует этот словарь:

{ 
    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: и _displayValueForCompoundPredicateType: перевести перечислений в строки.

Это должно быть задокументировано, но это не так. Я поставил точку останова на _displayValueForConstantValue:, и я посмотрел, что произошло. Словари жестко закодированы и могут отличаться в других версиях macOS.

+0

Вау, это здорово. Спасибо. Является ли источник для этого доступным где-то? Являются ли эти * все * записей в словаре значений отображения? Любая идея, в которой происходит перевод «.equalTo'-to-' »? – pkamb

+0

Похоже, что это будут методы '_displayValueForPredicateOperator:', '_displayValueForCompoundPredicateType:', '_displayValueForConstantValue:', '_displayValueForKeyPath:' ... какие-нибудь подсказки о том, где найти импликацию или ключи/значения? – pkamb

+0

Я отредактировал свой ответ. – Willeke