diff options
15 files changed, 162 insertions, 122 deletions
diff --git a/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_background.js b/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_background.js index 05865f1..9c49711 100644 --- a/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_background.js +++ b/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_background.js @@ -145,13 +145,13 @@ cvox.BrailleBackground.prototype.refreshTranslator = function() { var uncontractedTable = cvox.BrailleTable.getUncontracted( tables, table8Dot ? table8Dot : table); - this.liblouis_.getTranslator(table.fileName, goog.bind( + this.liblouis_.getTranslator(table.fileNames, goog.bind( function(translator) { if (uncontractedTable.id === table.id) { this.displayManager_.setTranslator(translator); this.inputHandler_.setTranslator(translator); } else { - this.liblouis_.getTranslator(uncontractedTable.fileName, goog.bind( + this.liblouis_.getTranslator(uncontractedTable.fileNames, goog.bind( function(uncontractedTranslator) { this.displayManager_.setTranslator( translator, uncontractedTranslator); diff --git a/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_table.js b/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_table.js index e368900..a03e136 100644 --- a/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_table.js +++ b/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_table.js @@ -16,7 +16,7 @@ goog.provide('cvox.BrailleTable'); * id:string, * grade:(string|undefined), * variant:(string|undefined), - * fileName:string + * fileNames:string * }} */ cvox.BrailleTable.Table; @@ -29,10 +29,24 @@ cvox.BrailleTable.TABLE_PATH = 'chromevox/background/braille/tables.json'; /** + * @const {string} + * @private + */ +cvox.BrailleTable.COMMON_DEFS_FILENAME_ = 'cvox-common.cti'; + + +/** * Retrieves a list of all available braille tables. * @param {function(!Array.<cvox.BrailleTable.Table>)} callback */ cvox.BrailleTable.getAll = function(callback) { + function appendCommonFilename(tables) { + // Append the common definitions to all table filenames. + tables.forEach(function(table) { + table.fileNames += (',' + cvox.BrailleTable.COMMON_DEFS_FILENAME_); + }); + return tables; + } var url = chrome.extension.getURL(cvox.BrailleTable.TABLE_PATH); if (!url) { throw 'Invalid path: ' + cvox.BrailleTable.TABLE_PATH; @@ -43,8 +57,10 @@ cvox.BrailleTable.getAll = function(callback) { xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { - callback(/** @type {!Array.<cvox.BrailleTable.Table>} */ ( - JSON.parse(xhr.responseText))); + callback( + appendCommonFilename( + /** @type {!Array.<cvox.BrailleTable.Table>} */ ( + JSON.parse(xhr.responseText)))); } } }; diff --git a/chrome/browser/resources/chromeos/chromevox/liblouis_nacl/liblouis.js b/chrome/browser/resources/chromeos/chromevox/liblouis_nacl/liblouis.js index d82562d..3bd2397 100644 --- a/chrome/browser/resources/chromeos/chromevox/liblouis_nacl/liblouis.js +++ b/chrome/browser/resources/chromeos/chromevox/liblouis_nacl/liblouis.js @@ -132,27 +132,28 @@ cvox.LibLouis.prototype.isAttached = function() { /** * Returns a translator for the desired table, asynchronously. - * @param {string} tableName Braille table name for liblouis. + * @param {string} tableNames Comma separated list of braille table names for + * liblouis. * @param {function(cvox.LibLouis.Translator)} callback * Callback which will receive the translator, or {@code null} on failure. */ cvox.LibLouis.prototype.getTranslator = - function(tableName, callback) { + function(tableNames, callback) { switch (this.instanceState_) { case cvox.LibLouis.InstanceState.NOT_LOADED: case cvox.LibLouis.InstanceState.LOADING: this.pendingTranslators_.push( - { tableName: tableName, callback: callback }); + { tableNames: tableNames, callback: callback }); return; case cvox.LibLouis.InstanceState.ERROR: callback(null /* translator */); return; case cvox.LibLouis.InstanceState.LOADED: - this.rpc_('CheckTable', { 'table_name': tableName }, + this.rpc_('CheckTable', { 'table_names': tableNames }, goog.bind(function(reply) { if (reply['success']) { var translator = new cvox.LibLouis.Translator( - this, tableName); + this, tableNames); callback(translator); } else { callback(null /* translator */); @@ -198,7 +199,7 @@ cvox.LibLouis.prototype.onInstanceLoad_ = function(e) { window.console.info('loaded liblouis Native Client instance'); this.instanceState_ = cvox.LibLouis.InstanceState.LOADED; this.pendingTranslators_.forEach(goog.bind(function(record) { - this.getTranslator(record.tableName, record.callback); + this.getTranslator(record.tableNames, record.callback); }, this)); this.pendingTranslators_.length = 0; }; @@ -213,7 +214,7 @@ cvox.LibLouis.prototype.onInstanceError_ = function(e) { window.console.error('failed to load liblouis Native Client instance'); this.instanceState_ = cvox.LibLouis.InstanceState.ERROR; this.pendingTranslators_.forEach(goog.bind(function(record) { - this.getTranslator(record.tableName, record.callback); + this.getTranslator(record.tableNames, record.callback); }, this)); this.pendingTranslators_.length = 0; }; @@ -250,9 +251,10 @@ cvox.LibLouis.prototype.onInstanceMessage_ = function(e) { * Braille translator which uses a Native Client instance of liblouis. * @constructor * @param {!cvox.LibLouis} instance The instance wrapper. - * @param {string} tableName The table name to be passed to liblouis. + * @param {string} tableNames Comma separated list of Table names to be passed + * to liblouis. */ -cvox.LibLouis.Translator = function(instance, tableName) { +cvox.LibLouis.Translator = function(instance, tableNames) { /** * The instance wrapper. * @private {!cvox.LibLouis} @@ -263,7 +265,7 @@ cvox.LibLouis.Translator = function(instance, tableName) { * The table name. * @private {string} */ - this.tableName_ = tableName; + this.tableNames_ = tableNames; }; @@ -277,7 +279,7 @@ cvox.LibLouis.Translator = function(instance, tableName) { * {@code null}. */ cvox.LibLouis.Translator.prototype.translate = function(text, callback) { - var message = { 'table_name': this.tableName_, 'text': text }; + var message = { 'table_names': this.tableNames_, 'text': text }; this.instance_.rpc_('Translate', message, function(reply) { var cells = null; var textToBraille = null; @@ -314,7 +316,7 @@ cvox.LibLouis.Translator.prototype.backTranslate = return; } var message = { - 'table_name': this.tableName_, + 'table_names': this.tableNames_, 'cells': cvox.LibLouis.Translator.encodeHexString_(cells) }; this.instance_.rpc_('BackTranslate', message, function(reply) { diff --git a/chrome/browser/resources/chromeos/chromevox/liblouis_nacl/liblouis_test.extjs b/chrome/browser/resources/chromeos/chromevox/liblouis_nacl/liblouis_test.extjs index b5b7a58..3946e4d 100644 --- a/chrome/browser/resources/chromeos/chromevox/liblouis_nacl/liblouis_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/liblouis_nacl/liblouis_test.extjs @@ -43,7 +43,7 @@ TEST_F('CvoxLibLouisTest', 'checkAllTables', function() { var checkNextTable = function() { var table = all_tables[i++]; if (table) { - this.instance.getTranslator(table.fileName, function(translator) { + this.instance.getTranslator(table.fileNames, function(translator) { assertNotEquals(null, translator, 'Table ' + table + ' should be valid'); checkNextTable(); diff --git a/chrome/test/data/chromeos/liblouis_nacl/test.js b/chrome/test/data/chromeos/liblouis_nacl/test.js index 275f29e..142773b 100644 --- a/chrome/test/data/chromeos/liblouis_nacl/test.js +++ b/chrome/test/data/chromeos/liblouis_nacl/test.js @@ -66,12 +66,12 @@ function expectSuccessReply(callback) { loadLibrary(function() { chrome.test.runTests([ function testGetTranslator() { - rpc('CheckTable', { 'table_name': TABLE_NAME}, + rpc('CheckTable', { 'table_names': TABLE_NAME}, pass(expectSuccessReply())); }, function testTranslateString() { - rpc('Translate', { 'table_name': TABLE_NAME, 'text': TEXT}, + rpc('Translate', { 'table_names': TABLE_NAME, 'text': TEXT}, pass(expectSuccessReply(function(reply) { chrome.test.assertEq(CELLS, reply['cells']); }))); @@ -82,14 +82,14 @@ loadLibrary(function() { // letter 'T' should be translated to 3 cells in US English grade 2 // braille (dots 56, 6, 2345). function testTranslateGrade2SingleCapital() { - rpc('Translate', { 'table_name': CONTRACTED_TABLE_NAME, 'text': 'T'}, + rpc('Translate', { 'table_names': CONTRACTED_TABLE_NAME, 'text': 'T'}, pass(expectSuccessReply(function(reply) { chrome.test.assertEq('30201e', reply['cells']); }))); }, function testBackTranslateString() { - rpc('BackTranslate', { 'table_name': TABLE_NAME, 'cells': CELLS}, + rpc('BackTranslate', { 'table_names': TABLE_NAME, 'cells': CELLS}, pass(expectSuccessReply(function(reply) { chrome.test.assertEq(TEXT, reply['text']); }))); @@ -98,7 +98,7 @@ loadLibrary(function() { // Backtranslate a one-letter contraction that expands to a much larger // string (k->knowledge). function testBackTranslateContracted() { - rpc('BackTranslate', { 'table_name': CONTRACTED_TABLE_NAME, + rpc('BackTranslate', { 'table_names': CONTRACTED_TABLE_NAME, 'cells': '05'}, // dots 1 and 3 pass(expectSuccessReply(function(reply) { chrome.test.assertEq('knowledge', reply['text']); 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" } ] |