diff options
author | plundblad <plundblad@chromium.org> | 2014-09-24 08:47:33 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-24 15:47:42 +0000 |
commit | 9cebaadae0237f7fcf7285cbb74903732ab1c194 (patch) | |
tree | a6f296c037c3a228c476be7d3a5668498ecd1ce8 /third_party | |
parent | c84602a0c635053a14fc0e06d4dd0b8e1ce043fa (diff) | |
download | chromium_src-9cebaadae0237f7fcf7285cbb74903732ab1c194.zip chromium_src-9cebaadae0237f7fcf7285cbb74903732ab1c194.tar.gz chromium_src-9cebaadae0237f7fcf7285cbb74903732ab1c194.tar.bz2 |
Make undefined Unicode characters show up in a nicer way in braille.
Instead of a cryptic Unicode code point, this makes characters that are not
defined by the current braille table show up as dot 8, which should be
a rarely used cell in most or all braille tables.
While it might be nice to give users more information than a single 'unknown
character' dot, this is the only feasable alternative to the hexadecimal
number (\xHHHH).
BUG=321715
Review URL: https://codereview.chromium.org/589133002
Cr-Commit-Position: refs/heads/master@{#296424}
Diffstat (limited to 'third_party')
-rw-r--r-- | third_party/liblouis/README.chromium | 4 | ||||
-rw-r--r-- | third_party/liblouis/cvox-common.cti | 15 | ||||
-rwxr-xr-x | third_party/liblouis/liblouis_list_tables.py | 9 | ||||
-rw-r--r-- | third_party/liblouis/liblouis_nacl.gyp | 2 | ||||
-rw-r--r-- | third_party/liblouis/nacl_wrapper/liblouis_instance.cc | 34 | ||||
-rw-r--r-- | third_party/liblouis/nacl_wrapper/liblouis_instance.h | 4 | ||||
-rw-r--r-- | third_party/liblouis/nacl_wrapper/liblouis_wrapper.cc | 10 | ||||
-rw-r--r-- | third_party/liblouis/nacl_wrapper/liblouis_wrapper.h | 4 | ||||
-rw-r--r-- | third_party/liblouis/nacl_wrapper/translation_params.h | 2 | ||||
-rw-r--r-- | third_party/liblouis/tables.json | 136 |
10 files changed, 121 insertions, 99 deletions
diff --git a/third_party/liblouis/README.chromium b/third_party/liblouis/README.chromium index 63d17d1..a40a4e4 100644 --- a/third_party/liblouis/README.chromium +++ b/third_party/liblouis/README.chromium @@ -19,5 +19,7 @@ Local Modifications: * Add manually created liblouis.h with compiler warning fix. * Add minimal config.h. -* Add tables.json a list of tables with metadata. +* Add tables.json, a list of tables with metadata. +* Add cvox-common.cti with common definitions for all tables mentioned in + tables.json. * Add a wrapper to expose the library in native client. diff --git a/third_party/liblouis/cvox-common.cti b/third_party/liblouis/cvox-common.cti new file mode 100644 index 0000000..b9b2347 --- /dev/null +++ b/third_party/liblouis/cvox-common.cti @@ -0,0 +1,15 @@ +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Common definitions appended to all braille tables used by liblouis +# in ChromeVox. + +# All tables get the Unicode braille patterns. They are included by some +# tables, but not consistently, and adding them again is harmless. +include braille-patterns.cti + +# Use dot 8 to represent undefined Unicode characters. +# While not ideal, this is much preferable to the built-in default of +# the code point value preceded by a backslash. +undefined 8 diff --git a/third_party/liblouis/liblouis_list_tables.py b/third_party/liblouis/liblouis_list_tables.py index e42e5da..9cd3fb8 100755 --- a/third_party/liblouis/liblouis_list_tables.py +++ b/third_party/liblouis/liblouis_list_tables.py @@ -66,7 +66,9 @@ def DoMain(argv): parser.prog = 'liblouis_list_tables' parser.set_usage('usage: %prog [options] listfile') parser.add_option('-D', '--directory', dest='directories', - action='append', help='Where to search for table files') + action='append', help='Where to search for table files') + parser.add_option('-e', '--extra_file', dest='extra_files', action='append', + default=[], help='Extra liblouis table file to process') (options, args) = parser.parse_args(argv) if len(args) != 1: @@ -77,7 +79,10 @@ def DoMain(argv): tables = LoadTablesFile(args[0]) output_set = set() for table in tables: - ProcessFile(output_set, table['fileName'], options.directories) + for name in table['fileNames'].split(','): + ProcessFile(output_set, name, options.directories) + for name in options.extra_files: + ProcessFile(output_set, name, options.directories) return '\n'.join(output_set) diff --git a/third_party/liblouis/liblouis_nacl.gyp b/third_party/liblouis/liblouis_nacl.gyp index e41855b..f7ada94 100644 --- a/third_party/liblouis/liblouis_nacl.gyp +++ b/third_party/liblouis/liblouis_nacl.gyp @@ -7,7 +7,7 @@ 'braille_test_data_dir': '<(PRODUCT_DIR)/chromevox_test_data/braille', 'braille_chromevox_dir': '<(PRODUCT_DIR)/resources/chromeos/chromevox/chromevox/background/braille', 'table_files': [ - '>!@pymod_do_main(liblouis_list_tables -D overrides/tables -D src/tables tables.json)', + '>!@pymod_do_main(liblouis_list_tables -D . -D src/tables -e cvox-common.cti tables.json)', ], }, # x86 targets build both 32 and 64 bit binaries by default. We only need diff --git a/third_party/liblouis/nacl_wrapper/liblouis_instance.cc b/third_party/liblouis/nacl_wrapper/liblouis_instance.cc index e92b9a0..7346a0f 100644 --- a/third_party/liblouis/nacl_wrapper/liblouis_instance.cc +++ b/third_party/liblouis/nacl_wrapper/liblouis_instance.cc @@ -104,7 +104,7 @@ static const char kCommandKey[] = "command"; static const char kMessageIdKey[] = "message_id"; static const char kInReplyToKey[] = "in_reply_to"; static const char kErrorKey[] = "error"; -static const char kTableNameKey[] = "table_name"; +static const char kTableNamesKey[] = "table_names"; static const char kSuccessKey[] = "success"; static const char kTextKey[] = "text"; static const char kCellsKey[] = "cells"; @@ -208,23 +208,23 @@ void LibLouisInstance::PostError(const std::string& error_message, void LibLouisInstance::HandleCheckTable(const Json::Value& message, const std::string& message_id) { - Json::Value table_name = message[kTableNameKey]; - if (!table_name.isString()) { - PostError("expected table_name to be a string", message_id); + Json::Value table_names = message[kTableNamesKey]; + if (!table_names.isString()) { + PostError("expected table_names to be a string", message_id); return; } PostWorkToBackground(cc_factory_.NewCallback( &LibLouisInstance::CheckTableInBackground, - table_name.asString(), message_id)); + table_names.asString(), message_id)); } void LibLouisInstance::CheckTableInBackground(int32_t result, - const std::string& table_name, const std::string& message_id) { + const std::string& table_names, const std::string& message_id) { if (result != PP_OK) { PostError("failed to transfer call to background thread", message_id); return; } - bool success = liblouis_.CheckTable(table_name); + bool success = liblouis_.CheckTable(table_names); Json::Value reply(Json::objectValue); reply[kSuccessKey] = success; PostReply(reply, message_id); @@ -232,11 +232,11 @@ void LibLouisInstance::CheckTableInBackground(int32_t result, void LibLouisInstance::HandleTranslate(const Json::Value& message, const std::string& message_id) { - Json::Value table_name = message[kTableNameKey]; + Json::Value table_names = message[kTableNamesKey]; Json::Value text = message[kTextKey]; Json::Value cursor_position = message[kCursorPositionKey]; - if (!table_name.isString()) { - PostError("expected table_name to be a string", message_id); + if (!table_names.isString()) { + PostError("expected table_names to be a string", message_id); return; } else if (!text.isString()) { PostError("expected text to be a string", message_id); @@ -246,7 +246,7 @@ void LibLouisInstance::HandleTranslate(const Json::Value& message, return; } TranslationParams params; - params.table_name = table_name.asString(); + params.table_names = table_names.asString(); params.text = text.asString(); params.cursor_position = cursor_position.isIntegral() ? cursor_position.asInt() : -1; @@ -284,10 +284,10 @@ void LibLouisInstance::TranslateInBackground(int32_t result, void LibLouisInstance::HandleBackTranslate(const Json::Value& message, const std::string& message_id) { - Json::Value table_name = message[kTableNameKey]; + Json::Value table_names = message[kTableNamesKey]; Json::Value cells = message[kCellsKey]; - if (!table_name.isString()) { - PostError("expected table_name to be a string", message_id); + if (!table_names.isString()) { + PostError("expected table_names to be a string", message_id); return; } else if (!cells.isString()) { PostError("expected cells to be a string", message_id); @@ -300,18 +300,18 @@ void LibLouisInstance::HandleBackTranslate(const Json::Value& message, } PostWorkToBackground(cc_factory_.NewCallback( &LibLouisInstance::BackTranslateInBackground, - table_name.asString(), cells_vector, message_id)); + table_names.asString(), cells_vector, message_id)); } void LibLouisInstance::BackTranslateInBackground(int32_t result, - const std::string& table_name, const std::vector<unsigned char>& cells, + const std::string& table_names, const std::vector<unsigned char>& cells, const std::string& message_id) { if (result != PP_OK) { PostError("failed to transfer call to background thread", message_id); return; } std::string text; - bool success = liblouis_.BackTranslate(table_name, cells, &text); + bool success = liblouis_.BackTranslate(table_names, cells, &text); Json::Value reply(Json::objectValue); reply[kSuccessKey] = success; if (success) { diff --git a/third_party/liblouis/nacl_wrapper/liblouis_instance.h b/third_party/liblouis/nacl_wrapper/liblouis_instance.h index d202a76..e106405 100644 --- a/third_party/liblouis/nacl_wrapper/liblouis_instance.h +++ b/third_party/liblouis/nacl_wrapper/liblouis_instance.h @@ -60,7 +60,7 @@ class LibLouisInstance : public pp::Instance { const std::string& message_id); // Called to check a table on a background thread. - void CheckTableInBackground(int32_t result, const std::string& table_name, + void CheckTableInBackground(int32_t result, const std::string& table_names, const std::string& message_id); // Parses and executes a translation command. @@ -77,7 +77,7 @@ class LibLouisInstance : public pp::Instance { // Called to back-translate text on a background thread. void BackTranslateInBackground(int32_t result, - const std::string& table_name, const std::vector<unsigned char>& cells, + const std::string& table_names, const std::vector<unsigned char>& cells, const std::string& message_id); LibLouisWrapper liblouis_; diff --git a/third_party/liblouis/nacl_wrapper/liblouis_wrapper.cc b/third_party/liblouis/nacl_wrapper/liblouis_wrapper.cc index 2fff14e..e3384a8 100644 --- a/third_party/liblouis/nacl_wrapper/liblouis_wrapper.cc +++ b/third_party/liblouis/nacl_wrapper/liblouis_wrapper.cc @@ -109,8 +109,8 @@ const char* LibLouisWrapper::tables_dir() const { return "/liblouis/tables"; } -bool LibLouisWrapper::CheckTable(const std::string& table_name) { - return lou_getTable(table_name.c_str()) != NULL; +bool LibLouisWrapper::CheckTable(const std::string& table_names) { + return lou_getTable(table_names.c_str()) != NULL; } bool LibLouisWrapper::Translate(const TranslationParams& params, @@ -152,7 +152,7 @@ bool LibLouisWrapper::Translate(const TranslationParams& params, outlen = outalloc; outbuf.resize(outalloc); braille_to_text.resize(outalloc); - int result = lou_translate(params.table_name.c_str(), + int result = lou_translate(params.table_names.c_str(), &inbuf[0], &inlen, &outbuf[0], &outlen, NULL /* typeform */, NULL /* spacing */, &text_to_braille[0], &braille_to_text[0], @@ -188,7 +188,7 @@ bool LibLouisWrapper::Translate(const TranslationParams& params, return true; } -bool LibLouisWrapper::BackTranslate(const std::string& table_name, +bool LibLouisWrapper::BackTranslate(const std::string& table_names, const std::vector<unsigned char>& cells, std::string* out) { std::vector<widechar> inbuf; inbuf.reserve(cells.size()); @@ -215,7 +215,7 @@ bool LibLouisWrapper::BackTranslate(const std::string& table_name, outbuf.resize(outalloc); int result = lou_backTranslateString( - table_name.c_str(), &inbuf[0], &inlen, &outbuf[0], &outlen, + table_names.c_str(), &inbuf[0], &inlen, &outbuf[0], &outlen, NULL /* typeform */, NULL /* spacing */, dotsIO /* mode */); if (result == 0) { // TODO(jbroman): log this diff --git a/third_party/liblouis/nacl_wrapper/liblouis_wrapper.h b/third_party/liblouis/nacl_wrapper/liblouis_wrapper.h index dac2b4a..46c4816 100644 --- a/third_party/liblouis/nacl_wrapper/liblouis_wrapper.h +++ b/third_party/liblouis/nacl_wrapper/liblouis_wrapper.h @@ -40,13 +40,13 @@ class LibLouisWrapper { // Loads, checks, and compiles the requested table. // Returns true on success. - bool CheckTable(const std::string& table_name); + bool CheckTable(const std::string& table_names); // Translates the given text and cursor position into braille. bool Translate(const TranslationParams& params, TranslationResult* out); // Translates the given braille cells into text. - bool BackTranslate(const std::string& table_name, + bool BackTranslate(const std::string& table_names, const std::vector<unsigned char>& cells, std::string* out); private: diff --git a/third_party/liblouis/nacl_wrapper/translation_params.h b/third_party/liblouis/nacl_wrapper/translation_params.h index 3505520..cb1938e 100644 --- a/third_party/liblouis/nacl_wrapper/translation_params.h +++ b/third_party/liblouis/nacl_wrapper/translation_params.h @@ -22,7 +22,7 @@ namespace liblouis_nacl { // Struct containing the parameters of translation. struct TranslationParams { public: - std::string table_name; + std::string table_names; std::string text; int cursor_position; }; diff --git a/third_party/liblouis/tables.json b/third_party/liblouis/tables.json index a93e9ac..0d4ceca 100644 --- a/third_party/liblouis/tables.json +++ b/third_party/liblouis/tables.json @@ -4,128 +4,128 @@ "locale": "ar", "dots": "6", "grade": "1", - "fileName": "ar-ar-g1.utb" + "fileNames": "ar-ar-g1.utb" }, { "id": "bg-comp8", "locale": "bg", "dots": "8", - "fileName": "bg.ctb" + "fileNames": "bg.ctb" }, { "id": "ca-g1", "locale": "ca", "dots": "6", "grade": "1", - "fileName": "ca-g1.ctb" + "fileNames": "ca-g1.ctb" }, { "id": "cs-g1", "locale": "cs", "dots": "6", "grade": "1", - "fileName": "cs-g1.ctb" + "fileNames": "cs-g1.ctb" }, { "id": "da-comp8", "locale": "da", "dots": "8", - "fileName": "da-dk-g18.utb" + "fileNames": "da-dk-g18.utb" }, { "id": "da-g1", "locale": "da", "dots": "6", "grade": 1, - "fileName": "da-dk-g16.utb" + "fileNames": "da-dk-g16.utb" }, { "id": "da-g2", "locale": "da", "dots": "6", "grade": 2, - "fileName": "da-dk-g26.ctb" + "fileNames": "da-dk-g26.ctb" }, { "id": "de-CH-g0", "locale": "de_CH", "dots": "6", "grade": "0", - "fileName": "de-ch-g0.utb" + "fileNames": "de-ch-g0.utb" }, { "id": "de-CH-g1", "locale": "de_CH", "dots": "6", "grade": "1", - "fileName": "de-ch-g1.ctb" + "fileNames": "de-ch-g1.ctb" }, { "id": "de-CH-g2", "locale": "de_CH", "dots": "6", "grade": "2", - "fileName": "de-ch-g2.ctb" + "fileNames": "de-ch-g2.ctb" }, { "id": "de-DE-g0", "locale": "de_DE", "dots": "6", "grade": "0", - "fileName": "de-de-g0.utb" + "fileNames": "de-de-g0.utb" }, { "id": "de-DE-g1", "locale": "de_DE", "dots": "6", "grade": "1", - "fileName": "de-de-g1.ctb" + "fileNames": "de-de-g1.ctb" }, { "id": "de-DE-g2", "locale": "de_DE", "dots": "6", "grade": "2", - "fileName": "de-de-g2.ctb" + "fileNames": "de-de-g2.ctb" }, { "id": "de-comp8", "locale": "de", "dots": "8", - "fileName": "de-de-comp8.ctb" + "fileNames": "de-de-comp8.ctb" }, { "id": "el-g1", "locale": "el", "dots": "6", "grade": "1", - "fileName": "gr-gr-g1.utb" + "fileNames": "gr-gr-g1.utb" }, { "id": "en-CA-comp8", "locale": "en_CA", "dots": "8", - "fileName": "en_CA.ctb" + "fileNames": "en_CA.ctb" }, { "id": "en-GB-comp8", "locale": "en_GB", "dots": "8", - "fileName": "en-gb-comp8.ctb" + "fileNames": "en-gb-comp8.ctb" }, { "id": "en-GB-g1", "locale": "en_GB", "dots": "6", "grade": "1", - "fileName": "en-gb-g1.utb" + "fileNames": "en-gb-g1.utb" }, { "id": "en-GB-g2", "locale": "en_GB", "dots": "6", "grade": "2", - "fileName": "en-GB-g2.ctb" + "fileNames": "en-GB-g2.ctb" }, { "id": "en-UEB-g1", @@ -133,7 +133,7 @@ "variant": "UEB", "dots": "6", "grade": 1, - "fileName": "en-ueb-g1.ctb" + "fileNames": "en-ueb-g1.ctb" }, { "id": "en-UEB-g2", @@ -141,314 +141,314 @@ "variant": "UEB", "dots": "6", "grade": 2, - "fileName": "en-ueb-g2.ctb" + "fileNames": "en-ueb-g2.ctb" }, { "id": "en-US-comp8", "locale": "en_US", "dots": "8", - "fileName": "en-us-comp8.ctb" + "fileNames": "en-us-comp8.ctb" }, { "id": "en-US-g1", "locale": "en_US", "dots": "6", "grade": "1", - "fileName": "en-us-g1.ctb" + "fileNames": "en-us-g1.ctb" }, { "id": "en-US-g2", "locale": "en_US", "dots": "6", "grade": "2", - "fileName": "en-us-g2.ctb" + "fileNames": "en-us-g2.ctb" }, { "id": "es-comp8", "locale": "es", "dots": "8", - "fileName": "Es-Es-G0.utb" + "fileNames": "Es-Es-G0.utb" }, { "id": "es-g1", "locale": "es", "dots": "6", "grade": "1", - "fileName": "es-g1.ctb" + "fileNames": "es-g1.ctb" }, { "id": "et-comp8", "locale": "et", "dots": "8", - "fileName": "et-g0.utb" + "fileNames": "et-g0.utb" }, { "id": "fr-CA-g1", "locale": "fr_CA", "dots": "6", "grade": "1", - "fileName": "fr-ca-g1.utb" + "fileNames": "fr-ca-g1.utb" }, { "id": "fr-CA-g2", "locale": "fr_CA", "dots": "6", "grade": "2", - "fileName": "Fr-Ca-g2.ctb" + "fileNames": "Fr-Ca-g2.ctb" }, { "id": "fr-FR-g1", "locale": "fr_FR", "dots": "6", "grade": "1", - "fileName": "fr-fr-g1.utb" + "fileNames": "fr-fr-g1.utb" }, { "id": "fr-FR-g2", "locale": "fr_FR", "dots": "6", "grade": "2", - "fileName": "Fr-Fr-g2.ctb" + "fileNames": "Fr-Fr-g2.ctb" }, { "id": "fr-comp8", "locale": "fr", "dots": "8", - "fileName": "fr-2007.ctb" + "fileNames": "fr-2007.ctb" }, { "id": "fi-comp8", "locale": "fi", "dots": "8", - "fileName": "fi-fi-8dot.ctb" + "fileNames": "fi-fi-8dot.ctb" }, { "id": "he-comp8", "locale": "he", "dots": "8", - "fileName": "he.ctb" + "fileNames": "he.ctb" }, { "id": "hi-g1", "locale": "hi", "dots": "6", "grade": "1", - "fileName": "hi-in-g1.utb" + "fileNames": "hi-in-g1.utb" }, { "id": "hr-comp8", "locale": "hr", "dots": "8", - "fileName": "hr.ctb" + "fileNames": "hr.ctb" }, { "id": "hu-comp8", "locale": "hu", "dots": "8", - "fileName": "hu-hu-comp8.ctb" + "fileNames": "hu-hu-comp8.ctb" }, { "id": "hu-g1", "locale": "hu", "dots": "6", "grade": "1", - "fileName": "hu-hu-g1.ctb" + "fileNames": "hu-hu-g1.ctb" }, { "id": "is-comp8", "locale": "is", "dots": "8", - "fileName": "is.ctb" + "fileNames": "is.ctb" }, { "id": "it-comp8", "locale": "it", "dots": "8", - "fileName": "it-it-comp8.utb" + "fileNames": "it-it-comp8.utb" }, { "id": "it-g1", "locale": "it", "dots": "6", "grade": "1", - "fileName": "it-it-comp6.utb" + "fileNames": "it-it-comp6.utb" }, { "id": "ko-g1", "locale": "ko", "dots": "6", "grade": 1, - "fileName": "ko-g1.ctb" + "fileNames": "ko-g1.ctb" }, { "id": "ko-g2", "locale": "ko", "dots": "6", "grade": 2, - "fileName": "ko-g2.ctb" + "fileNames": "ko-g2.ctb" }, { "id": "lv-g1", "locale": "lv", "dots": "6", "grade": "1", - "fileName": "Lv-Lv-g1.utb" + "fileNames": "Lv-Lv-g1.utb" }, { "id": "lt-comp8", "locale": "lt", "dots": "8", - "fileName": "lt.ctb" + "fileNames": "lt.ctb" }, { "id": "nb-comp8", "locale": "nb", "dots": "8", - "fileName": "no-no.ctb" + "fileNames": "no-no.ctb" }, { "id": "nb-g0", "locale": "nb", "dots": "6", "grade": "0", - "fileName": "no-no-g0.utb" + "fileNames": "no-no-g0.utb" }, { "id": "nb-g1", "locale": "nb", "dots": "6", "grade": "1", - "fileName": "no-no-g1.ctb" + "fileNames": "no-no-g1.ctb" }, { "id": "nb-g2", "locale": "nb", "dots": "6", "grade": "2", - "fileName": "no-no-g2.ctb" + "fileNames": "no-no-g2.ctb" }, { "id": "nb-g3", "locale": "nb", "dots": "6", "grade": "3", - "fileName": "no-no-g3.ctb" + "fileNames": "no-no-g3.ctb" }, { "id": "nl-g1", "locale": "nl", "dots": "6", "grade": "1", - "fileName": "Nl-Nl-g1.utb" + "fileNames": "Nl-Nl-g1.utb" }, { "id": "pl-g1", "locale": "pl", "dots": "6", "grade": "1", - "fileName": "Pl-Pl-g1.utb" + "fileNames": "Pl-Pl-g1.utb" }, { "id": "pt-comp8", "locale": "pt", "dots": "8", - "fileName": "pt-pt-comp8.ctb" + "fileNames": "pt-pt-comp8.ctb" }, { "id": "pt-g1", "locale": "pt", "dots": "6", "grade": "1", - "fileName": "pt-pt-g1.utb" + "fileNames": "pt-pt-g1.utb" }, { "id": "pt-g2", "locale": "pt", "dots": "6", "grade": "2", - "fileName": "pt-pt-g2.ctb" + "fileNames": "pt-pt-g2.ctb" }, { "id": "ro-comp8", "locale": "ro", "dots": "8", - "fileName": "ro.ctb" + "fileNames": "ro.ctb" }, { "id": "ru-comp8", "locale": "ru", "dots": "8", - "fileName": "ru-compbrl.ctb" + "fileNames": "ru-compbrl.ctb" }, { "id": "ru-g1", "locale": "ru", "dots": "6", "grade": "1", - "fileName": "ru-litbrl.ctb" + "fileNames": "ru-litbrl.ctb" }, { "id": "sk-g1", "locale": "sk", "dots": "6", "grade": "1", - "fileName": "sk-sk-g1.utb" + "fileNames": "sk-sk-g1.utb" }, { "id": "sl-comp8", "locale": "sl", "dots": "8", - "fileName": "sl-si-comp8.ctb" + "fileNames": "sl-si-comp8.ctb" }, { "id": "sl-g1", "locale": "sl", "dots": "6", "grade": "1", - "fileName": "sl-si-g1.utb" + "fileNames": "sl-si-g1.utb" }, { "id": "sr-g1", "locale": "sr", "dots": "6", "grade": "1", - "fileName": "sr-g1.ctb" + "fileNames": "sr-g1.ctb" }, { "id": "sv-comp8", "locale": "sv", "dots": "8", - "fileName": "sv-1996.ctb" + "fileNames": "sv-1996.ctb" }, { "id": "sv-g1", "locale": "sv", "dots": "6", "grade": "1", - "fileName": "Se-Se-g1.utb" + "fileNames": "Se-Se-g1.utb" }, { "id": "tr-comp8", "locale": "tr", "dots": "8", - "fileName": "tr.ctb" + "fileNames": "tr.ctb" }, { "id": "vi-comp8", "locale": "vi", "dots": "8", - "fileName": "vi.ctb" + "fileNames": "vi.ctb" }, { "id": "zh-TW-comp8", "locale": "zh_TW", "dots": "8", - "fileName": "zh-tw.ctb" + "fileNames": "zh-tw.ctb" }, { "id": "zh-comp8", "locale": "zh", "dots": "8", - "fileName": "zh-hk.ctb" + "fileNames": "zh-hk.ctb" } ] |