Ниже приведена конфигурация двух списков слов с наиболее полным количеством поддерживаемых полей (не все из них обязательно заполнять каждый раз – обязательные настройки есть в описании).

<List id="dict_list_1">
    <ListType>Dictionary</ListType>
    <isListSorted>YES</isListSorted>
    <isListHasLocalizedEntries>NO</isListHasLocalizedEntries>
    <LanguageCodeFrom>kore</LanguageCodeFrom>
    <LanguageCodeTo>engl</LanguageCodeTo>
    <ListFile>korean_english_hang_list.xml</ListFile>
    <IconFolder>../Source/Images</IconFolder>
    <SoundFolder>../Source/Sounds</SoundFolder>
    <VariantProperty>
        <Number>0</Number>
        <Type>Show</Type>
        <LanguageCode>kore</LanguageCode>
    </VariantProperty>
    <VariantProperty>
        <Number>1</Number>
        <Type>ShowSecondary</Type>
        <LanguageCode>kore</LanguageCode>
    </VariantProperty>
    <AlphabetType>kore_hangul</AlphabetType>
    <SearchRange>CurrentLevel</SearchRange>
    <Strings Language="0000">
        <ListName>Korean dictionary list</ListName>
        <ListNameShort>Korean list</ListNameShort>
        <ListClass>Dictionary</ListClass>
        <ListLanguagePair>Korean-English</ListLanguagePair>
        <ListLanguagePairShort>Ko-En</ListLanguagePairShort>
        <ListLanguageNameFrom>Korean</ListLanguageNameFrom>
        <ListLanguageNameTo>English</ListLanguageNameTo>
    </Strings>
    ...
    <Strings Language="russ">
        <ListName>Корейско-английский словарь</ListName>
        <ListNameShort>Корейский</ListNameShort>
        <ListClass>Словарь</ListClass>
        <ListLanguagePair>Корейско-английское</ListLanguagePair>
        <ListLanguagePairShort>Кор-Анг</ListLanguagePairShort>
        <ListLanguageNameFrom>Корейский</ListLanguageNameFrom>
        <ListLanguageNameTo>Английский</ListLanguageNameTo>
    </Strings>
</List>
...
<List id="WotD">
    <ListType>WordOfTheDay</ListType>
    <LinkOptions>
        <LinkType>ListEntryId</LinkType>
        <AllowSourceListId>list0</AllowSourceListId>
    </LinkOptions>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    <LanguageCodeFrom>engl</LanguageCodeFrom>
    <LanguageCodeTo>engl</LanguageCodeTo>
    <ListFile>WotD.xml</ListFile>
    <VariantProperty>
        <Number>0</Number>
        <Type>Show</Type>
        <LanguageCode>engl</LanguageCode>
    </VariantProperty>
    <VariantProperty>
        <Number>1</Number>
        <Type>ExternalKey</Type>
        <LanguageCode>engl</LanguageCode>
    </VariantProperty>
</List>
...
<List id="FTS_HW">
    <ListType>FullTextSearch_Headword</ListType>
    <FullTextSearchOptions>
        <LinkType>ListEntryId</LinkType>
        <ShiftType>SymbolsFromArticleBegin</ShiftType>
        <Priority>3</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>dict_list_1</AllowSourceListId>
        <MorphologyId>kore</MorphologyId>
    </FullTextSearchOptions>
    <isListSorted>YES</isListSorted>
    <LanguageCodeFrom>kore</LanguageCodeFrom>
    <LanguageCodeTo>kore</LanguageCodeTo>
    <ListFile>korean_headwords.xml</ListFile>
    <Strings Language="0000">
        <ListName>Headwords</ListName>
        <ListNameShort>Headwords</ListNameShort>
        <ListClass>Search</ListClass>
        <ListLanguagePair></ListLanguagePair>
        <ListLanguagePairShort></ListLanguagePairShort>
        <ListLanguageNameFrom></ListLanguageNameFrom>
        <ListLanguageNameTo></ListLanguageNameTo>
    </Strings>
    ...
    <Strings Language="russ">
        <ListName>Headwords</ListName>
        <ListNameShort>Headwords</ListNameShort>
        <ListClass>Search</ListClass>
        <ListLanguagePair></ListLanguagePair>
        <ListLanguagePairShort></ListLanguagePairShort>
        <ListLanguageNameFrom></ListLanguageNameFrom>
        <ListLanguageNameTo></ListLanguageNameTo>
    </Strings>
</List>
  • List id – уникальный текстовый идентификатор списка слов; нужен, когда необходимо описать взаимосвязь списков (например, при генерации полнотекстового поиска мы индексируем содержимое словарного списка и полученную информацию оформляем в виде служебного списка – впоследствии нам необходима информация, какой индекс какому словарному списку соответствует)
  • ListType – тип словарного списка, т.е. какой тематике посвящен список и записи внутри. Например, словарный список (тип “Dictionary”) предназначен для доступа к основному контенту словаря – заголовкам и переводам слов. Соответственно, записи в списке являются переводимыми словами и по нажатию на них в приложении отображается перевод (текст связанной статьи). Если же список имеет тип “AdditionalInfo”, то его записи также отображаются, но обычно это копирайты издательства или вспомогательная словарная информация (таблица фонетических символов с приведенными словами, например). Тип списка (для некоторых типов тип + языковая пара списка From->To) используется для однозначной идентификации нужной части контента словаря. Это поле является обязательным при настройке списка
    Всего типов достаточно большое количество, им посвящена отдельная статья
  • isListSorted – флаг, указывающий, нужно ли будет при сборке словарной базы отсортировать данный список по алфавиту (т.е. это не “является ли контент внутри xml-файла заранее отсортированным самим программистом”). Алфавитная сортировка происходит по значению первого варианта написания, а сам порядок символов алфавита основан на данных из таблицы сортировки.
  • isListHasLocalizedEntries – флаг, указывающий на наличие в списке локализаций для имеющихся записей. Это позволяет при отображении самого списка менять заголовок статьи (по аналогии с переключением строк локализации из описанного ниже <Strings>) – например, в английской локали статья может называться “About Dictionary”, а в китайской – “关于 Dictionary”.
  • LanguageCodeFrom – четырехбуквенный код языка, с которого осуществляется перевод. Т.е. обычно это язык тех слов, которые содержатся в варианте написания с типом Show (в большинстве случаев это можно считать языком переводимого слова). Такая трактовка относится не только к словарным спискам, но и к остальным. К примеру, в англо-русском словаре английские слова могут встречаться как в англо-русском направлении (это будут в первую очередь заголовки и текст примеров), так и в русском-английском (перевод русских примеров). Если мы захотим составить сопоставление вида “в какой статье встречалось то или иное английское слово”, то получится два списка – с LanguageCodeFrom/To = engl/russ и с обратной парой
    Полный список языковых кодов находится здесь
    Это поле является обязательным при настройке списка
  • LanguageCodeTo – четырехбуквенный код языка, на который осуществляется перевод – см. комментарии к LanguageCodeFrom
    Это поле является обязательным при настройке списка
  • ListFile – имя файла (с расширением), содержащего список слов. Может указываться как абсолютным путем, так и относительно расположения самого sproj файла
    Это поле является обязательным при настройке списка
  • IconFolder – путь к папке, содержащей картинки, используемые в списке слов (на картинки в статьях не влияет – для них есть отдельная настройка). Указанные внутри xml-списка имена файлов будут отсчитываться относительно этой папки
  • SoundFolder – путь к папке, содержащей звуки (также это может быть имя SpeexPack-архива с путем к нему). Указанные внутри xml-списка имена файлов будут отсчитываться относительно этой папки. Более детально про подготовку звуковых данных можно узнать отсюда.
  • VariantProperty – описание одной из характеристик записи в списке слов. Т.е. весь список можно рассматривать как таблицу, где строки – записи списка (условно можно сказать, что это леммы словаря), а столбцы (=набор ячеек в строке) – варианты написания, характеристики конкретной леммы, сборная краткая информацию о статье. Эти характеристики, к примеру, могут выглядеть как “заголовок + часть речи + номер омонима + при загрузке текста статьи ее нужно показывать не с начала, а с определенного места, т.е. храним идентификатор placeholder-а”. Подробнее про варианты написания можно почитать в отдельной статье
    • Type – основная характеристика варианта написания, тип текста в соответствующем wl-name’е. К примеру, это может быть “Show” – значит, в wl-name хранится заголовок статьи (распространенный пример – само переводимое слово в словарях), а может быть “PartOfSpeech” (часть речи, описанная в данной статье)
    • Number – порядковый номер варианта. Заполняется в соответствии с порядком следования wl-name’ов. Допустим первым добавлен wl-name с ключом сортировки, а вторым – Show. Тогда первому в тип ставится SortKey, в Number – 0; второму – Show и 1 и т.д
    • LanguageCode – четырехбуквенный код языка текста в данном варианте написания. Полный список языковых кодов находится здесь.
  • AlphabetType – тип алфавита Show-варианта в некоторых азиатских языках. В ряде азиатских языков (в рамках sdc это применимо к японскому, китайскому и корейскому) слова могут быть написаны как с помощью классической письменности, так и с помощью транслитерации. Для того, чтобы была возможность посмотреть/поискать по индексу, отсортированному в каждом из вариантов, в базу может быть добавлено несколько списков слов – у одного основными значениями (ключами) будут являться слова с традиционным написанием, у другого – романизация (написание транслитом). Значение данного поля sproj указывает, какой из алфавитов для show варианта использован в данном списке; возможные значения перечислены здесь.
  • SearchRange – указание границ поиска слов при подмотке в списке. Используется для задания жесткого ограничения (не в процессе работы приложения, а на этапе сборки базы) на перебор слов при поиске. Например, значение “CurrentLevel” указывает на то, что при поиске не нужно проверять какие либо из вложенных или родительских элементов – только слова на текущем уровне вложенности; “FullRecursive” напротив, осуществляет поиск по всем содержащимся в списке словам. Описание возможных значений можно найти тут.
  • Strings – набор строк локализации для конкретного языка. Значения полей внутри (детально описаны ниже) используется приложением для отображения в интерфейсе – на тулбаре, в окне перевода над самим текстом статьи, в качестве подписей к разнообразным иконкам, разделам результатов полнотекстового поиска и т.п. Для того, чтобы эти значения адаптировались при переключении пользователем языка на устройстве (в самой ОС), в словаре предусмотрено несколько наборов строк: как минимум это дефолтный (показывается для всех языков, под которые не нашлось явно прописанной локали) и произвольный набор других локализаций. Например, если в базе есть дефолтный набор + английская + русская локаль, то при выборе на устройстве английского языка будут выбраны английские строки, русского – русские, французского (или любого другого) – дефолтные. Строки дефолтной локали обычно не бывают уникальными – обычно это текст одной из специфицированных локалей (той, которую мы считаем самой универсальной – зачастую, английской). Также нужно учитывать, что раз дефолтная локаль применяется при отсутствии явно указанной, то нет необходимости дублировать ее под разные языки. Например, если есть требование “на всех языках название списка должно быть написано по-немецки”, то можно оставить просто дефолтную локаль с немецким текстом (если точнее – дефолтную с немецким текстом + немецкую с немецким текстом – вспомогательные утилиты, обрабатывающие sproj, на основе этого совпадения смогут определить “основной” язык для словаря).
    При сборке компилятором строки не валидируются, т.е. могут содержать любой текст (предполагается, что необходимые строки нам предоставит паблишер, а неизвестные мы оставим пустыми)
    Единственный атрибут у <Strings> – “Language” содержит четырехбуквенный код языка, для которого предназначен данный набор строк (“0000” для дефолтной локали). Полный список языковых кодов находится здесь:
    • ListName – название списка вида “Slovoed Classic русско-английский”
    • ListNameShort – сокращенное название списка (предполагаем, что используется при органичениях по ширине ui компонента, в который приложение его вписывает) вида “Slovoed Classic рус-анг”
    • ListClass – тематика списка слов. Чаще всего в базах это не уточняется, но это может быть “Толковый словарь” или “Тезаурус”
    • ListLanguagePair – языковая пара. Предполагается, что указанный в этом поле текст можно брать as is – т.е. она не всегда похожа на “%From%-%To%” (“Русский-Английский”), а адаптирована под конкретный язык (“Русско-английский”)
    • ListLanguagePairShort – сокращенная языковая пара (чаще всего – до двух- и трехбуквенных обозначений каждого языка, например, “Ru-En”)
    • ListLanguageNameFrom – название языка, с которого производится перевод – “Английский”, “Deutsch”
    • ListLanguageNameTo – название языка, на который производится перевод
  • FullTextSearchOptions – весь блок относится к настройкам полнотекстового поиска и разобран в собственной статье.
  • LinkOptions – предназначен для настройки взаимосвязей списков (в приведенном примере в словаре требуется добавить некий вспомогательный неотображаемый список со специально подобранными словами, каждое из которых должно ссылаться на оригинальную статью). При необходимости можно настроить цепочку связей A→B→C→…, указывая правильные <id> у записей и прописав <LinkOptions> в нескольких списках, см. статью по линковке списков. Настройки внутри блока совпадают с таковыми для полнотекстового поиска, отдельный тег используется во избежание путаницы (FTS имеет свои правила обработки при сборке базы)

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.