node.js i18n - Невозможно прочитать свойство 'toLowerCase' из неопределенного - PullRequest
0 голосов
/ 31 октября 2018

Я всегда получаю следующую ошибку при вызове i18n.__n('..'):

TypeError: Cannot read property 'toLowerCase' of undefined
at Object.i18nTranslatePlural [as __n] (/home/runner/node_modules/i18n/i18n.js:367:31)
at evalmachine.<anonymous>:14:18
at Script.runInContext (vm.js:74:29)
at Object.runInContext (vm.js:182:6)
at evaluate (/run_dir/repl.js:133:14)
at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
at ReadStream.emit (events.js:180:13)
at addChunk (_stream_readable.js:274:12)
at readableAddChunk (_stream_readable.js:261:11)
at ReadStream.Readable.push (_stream_readable.js:218:10)

Кстати, i18n.__('..') работает как шарм!

Вот код:

index.js

var i18n = require("i18n");
var path = require('path');

var __dirname = path.resolve();

i18n.configure({
    locales:['en', 'de'],
    directory: __dirname + '/locales',
    defaultLocale: 'de',
});

console.log(i18n.__('test'));

console.log(i18n.__n('%s horse', 3)); 

локали / de.json

{
  "test": "Das ist ein Test",
  "%s horse" : {
    "one": "%s Pferd",
    "other": "%s Pferde"
  }
}

локали / en.json

{
  "test": "This is a test",
  "%s horse" : {
    "one": "%s horse",
    "other": "%s horses"
  }
}

Надеюсь, что некоторые могут дать мне совет, что я сделал не так или как я могу решить проблему. Я запустил код на своей MacBook и на https://repl.it/languages/nodejs. Тот же результат.

1 Ответ

0 голосов
/ 01 ноября 2018

Кажется, что библиотека находится в затруднительном положении при поиске правильной локали при вызове __n. Просто установите i18n.setLocale('de'), и это работает. Код, показанный ниже, выведет

Das ist ein Test
1 Pferd
3 Pferde

Я ожидал, что defaultLocale будет достаточно, но, похоже, нет. Надеюсь, этот ответ поможет!

var i18n = require("i18n");
var path = require('path');

var __dirname = path.resolve();

i18n.configure({
    locales:['en', 'de'],
    directory: __dirname + '/locales',
    defaultLocale: 'de'

});

i18n.setLocale('de')
console.log(i18n.__('test'));
console.log(i18n.__n("%s horse", 1));
console.log(i18n.__n("%s horse", 3));

Просто для вашей информации, я отладил его, зарегистрировав некоторые функции отладки, подобные этой, в configure() вызове

logDebugFn: console.log,
logWarnFn: console.log,
logErrorFn: console.log

Тогда без звонка setLocale() я получил это WARN: No locale found - check the context of the call to __(). Using de as current locale. Форсирование текущей локали на объекте i18n решило эту проблему.

...