Socket
Socket
Sign inDemoInstall

lingui-i18n

Package Overview
Dependencies
Maintainers
1
Versions
36
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

lingui-i18n - npm Package Compare versions

Comparing version 1.0.0-5 to 1.0.0-6

dist/loader.js.flow

1

dist/dev/index.es.js
import _extends from 'babel-runtime/helpers/extends';
import { parse } from 'messageformat-parser';
import _Object$getOwnPropertyNames from 'babel-runtime/core-js/object/get-own-property-names';
import plurals from 'make-plural/umd/plurals';

@@ -4,0 +5,0 @@

@@ -7,2 +7,3 @@ 'use strict';

var messageformatParser = require('messageformat-parser');
var _Object$getOwnPropertyNames = _interopDefault(require('babel-runtime/core-js/object/get-own-property-names'));
var plurals = _interopDefault(require('make-plural/umd/plurals'));

@@ -9,0 +10,0 @@

101

dist/index.es.js

@@ -1,2 +0,1 @@

import _Object$assign from 'babel-runtime/core-js/object/assign';
import _extends from 'babel-runtime/helpers/extends';

@@ -9,2 +8,3 @@ import _Object$keys from 'babel-runtime/core-js/object/keys';

import { date, number } from 'lingui-formats';
import _Object$getOwnPropertyNames from 'babel-runtime/core-js/object/get-own-property-names';

@@ -17,3 +17,12 @@ var isString = function isString(s) {

};
function isEmpty(obj) {
// null and undefined are "empty"
if (obj === null || obj === undefined) return true;
if (obj.length > 0) return false;
if (obj.length === 0) return true;
return !_Object$getOwnPropertyNames(obj).length;
}
var defaultFormats = function defaultFormats(language) {

@@ -161,5 +170,13 @@ var languageData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

function getLanguageData(catalog) {
return (catalog || {}).languageData || {};
}
function getMessages(catalog) {
return (catalog || {}).messages || {};
}
var I18n = function () {
// Messages in all loaded language.
// Message catalogs
function I18n() {

@@ -171,4 +188,3 @@ _classCallCheck(this, I18n);

this._activeMessages = {};
this._messages = {};
this._languageData = {};
this._catalogs = {};

@@ -182,19 +198,35 @@ if (process.env.NODE_ENV !== 'production') {

}
// Messages in active language. This is optimization, so we don't perform
// object lookup _messages[language] for each translation.
// Messages/langauge data in active language.
// This is optimization, so we don't perform object lookup
// _catalogs[language] for each translation.
_createClass(I18n, [{
key: '_cacheActiveLanguage',
value: function _cacheActiveLanguage() {
var activeCatalog = this._catalogs[this.language];
var languageData = getLanguageData(activeCatalog);
if (process.env.NODE_ENV !== 'production') {
// Allow overriding data in development, useful for testing
if (isEmpty(languageData) && this._dev && isFunction(this._dev.loadLanguageData)) {
languageData = this._dev.loadLanguageData(this.language);
}
}
this._activeMessages = getMessages(activeCatalog);
this._activeLanguageData = languageData;
}
}, {
key: 'load',
value: function load(messages) {
value: function load(catalogs) {
var _this = this;
if ((typeof messages === 'undefined' ? 'undefined' : _typeof(messages)) !== 'object') return;
if ((typeof catalogs === 'undefined' ? 'undefined' : _typeof(catalogs)) !== 'object') return;
// deeply merge Catalogs
_Object$keys(_extends({}, this._messages, messages)).forEach(function (language) {
if (!_this._messages[language]) _this._messages[language] = {};
_Object$keys(_extends({}, this._catalogs, catalogs)).forEach(function (language) {
var compiledMessages = getMessages(catalogs[language]);
var compiledMessages = messages[language] || {};
if (process.env.NODE_ENV !== 'production') {

@@ -210,12 +242,11 @@ if (_this._dev && isFunction(_this._dev.compile)) {

_Object$assign(_this._messages[language], compiledMessages);
_this._catalogs[language] = {
messages: _extends({}, getMessages(_this._catalogs[language]), compiledMessages),
languageData: _extends({}, getLanguageData(_this._catalogs[language]), getLanguageData(catalogs[language]))
};
});
this._cacheActiveLanguage();
}
}, {
key: 'loadLanguageData',
value: function loadLanguageData(languageData) {
if (!languageData) return;
_Object$assign(this._languageData, languageData);
}
}, {
key: 'activate',

@@ -232,3 +263,3 @@ value: function activate(language) {

this._language = language;
this._activeMessages = this._messages[this.language] || {};
this._cacheActiveLanguage();
}

@@ -240,4 +271,3 @@ }, {

language: language,
messages: this._messages,
languageData: this._languageData,
catalogs: this._catalogs,
development: this._dev

@@ -275,2 +305,3 @@ });

if (!this.languageData.plurals) return 'other';
return this.languageData.plurals(n, pluralType === 'ordinal');

@@ -286,5 +317,10 @@ }

get: function get() {
return _Object$keys(this._messages);
return _Object$keys(this._catalogs);
}
}, {
key: 'language',
get: function get() {
return this._language;
}
}, {
key: 'messages',

@@ -297,18 +333,4 @@ get: function get() {

get: function get() {
var data = this._languageData[this.language];
if (process.env.NODE_ENV !== 'production') {
// Allow overriding data in development, useful for testing
if (!data) {
return this._dev.loadLanguageData(this.language);
}
}
return data;
return this._activeLanguageData;
}
}, {
key: 'language',
get: function get() {
return this._language;
}
}]);

@@ -328,5 +350,4 @@

if (params.messages) i18n.load(params.messages);
if (params.catalogs) i18n.load(params.catalogs);
if (params.language) i18n.activate(params.language);
if (params.languageData) i18n.loadLanguageData(params.languageData);

@@ -333,0 +354,0 @@ return i18n;

@@ -7,3 +7,2 @@ 'use strict';

var _Object$assign = _interopDefault(require('babel-runtime/core-js/object/assign'));
var _extends = _interopDefault(require('babel-runtime/helpers/extends'));

@@ -16,2 +15,3 @@ var _Object$keys = _interopDefault(require('babel-runtime/core-js/object/keys'));

var linguiFormats = require('lingui-formats');
var _Object$getOwnPropertyNames = _interopDefault(require('babel-runtime/core-js/object/get-own-property-names'));

@@ -24,3 +24,12 @@ var isString = function isString(s) {

};
function isEmpty(obj) {
// null and undefined are "empty"
if (obj === null || obj === undefined) return true;
if (obj.length > 0) return false;
if (obj.length === 0) return true;
return !_Object$getOwnPropertyNames(obj).length;
}
var defaultFormats = function defaultFormats(language) {

@@ -168,5 +177,13 @@ var languageData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

function getLanguageData(catalog) {
return (catalog || {}).languageData || {};
}
function getMessages(catalog) {
return (catalog || {}).messages || {};
}
var I18n = function () {
// Messages in all loaded language.
// Message catalogs
function I18n() {

@@ -178,4 +195,3 @@ _classCallCheck(this, I18n);

this._activeMessages = {};
this._messages = {};
this._languageData = {};
this._catalogs = {};

@@ -189,19 +205,35 @@ if (process.env.NODE_ENV !== 'production') {

}
// Messages in active language. This is optimization, so we don't perform
// object lookup _messages[language] for each translation.
// Messages/langauge data in active language.
// This is optimization, so we don't perform object lookup
// _catalogs[language] for each translation.
_createClass(I18n, [{
key: '_cacheActiveLanguage',
value: function _cacheActiveLanguage() {
var activeCatalog = this._catalogs[this.language];
var languageData = getLanguageData(activeCatalog);
if (process.env.NODE_ENV !== 'production') {
// Allow overriding data in development, useful for testing
if (isEmpty(languageData) && this._dev && isFunction(this._dev.loadLanguageData)) {
languageData = this._dev.loadLanguageData(this.language);
}
}
this._activeMessages = getMessages(activeCatalog);
this._activeLanguageData = languageData;
}
}, {
key: 'load',
value: function load(messages) {
value: function load(catalogs) {
var _this = this;
if ((typeof messages === 'undefined' ? 'undefined' : _typeof(messages)) !== 'object') return;
if ((typeof catalogs === 'undefined' ? 'undefined' : _typeof(catalogs)) !== 'object') return;
// deeply merge Catalogs
_Object$keys(_extends({}, this._messages, messages)).forEach(function (language) {
if (!_this._messages[language]) _this._messages[language] = {};
_Object$keys(_extends({}, this._catalogs, catalogs)).forEach(function (language) {
var compiledMessages = getMessages(catalogs[language]);
var compiledMessages = messages[language] || {};
if (process.env.NODE_ENV !== 'production') {

@@ -217,12 +249,11 @@ if (_this._dev && isFunction(_this._dev.compile)) {

_Object$assign(_this._messages[language], compiledMessages);
_this._catalogs[language] = {
messages: _extends({}, getMessages(_this._catalogs[language]), compiledMessages),
languageData: _extends({}, getLanguageData(_this._catalogs[language]), getLanguageData(catalogs[language]))
};
});
this._cacheActiveLanguage();
}
}, {
key: 'loadLanguageData',
value: function loadLanguageData(languageData) {
if (!languageData) return;
_Object$assign(this._languageData, languageData);
}
}, {
key: 'activate',

@@ -239,3 +270,3 @@ value: function activate(language) {

this._language = language;
this._activeMessages = this._messages[this.language] || {};
this._cacheActiveLanguage();
}

@@ -247,4 +278,3 @@ }, {

language: language,
messages: this._messages,
languageData: this._languageData,
catalogs: this._catalogs,
development: this._dev

@@ -282,2 +312,3 @@ });

if (!this.languageData.plurals) return 'other';
return this.languageData.plurals(n, pluralType === 'ordinal');

@@ -293,5 +324,10 @@ }

get: function get() {
return _Object$keys(this._messages);
return _Object$keys(this._catalogs);
}
}, {
key: 'language',
get: function get() {
return this._language;
}
}, {
key: 'messages',

@@ -304,18 +340,4 @@ get: function get() {

get: function get() {
var data = this._languageData[this.language];
if (process.env.NODE_ENV !== 'production') {
// Allow overriding data in development, useful for testing
if (!data) {
return this._dev.loadLanguageData(this.language);
}
}
return data;
return this._activeLanguageData;
}
}, {
key: 'language',
get: function get() {
return this._language;
}
}]);

@@ -335,5 +357,4 @@

if (params.messages) i18n.load(params.messages);
if (params.catalogs) i18n.load(params.catalogs);
if (params.language) i18n.activate(params.language);
if (params.languageData) i18n.loadLanguageData(params.languageData);

@@ -340,0 +361,0 @@ return i18n;

{
"name": "lingui-i18n",
"version": "1.0.0-5",
"version": "1.0.0-6",
"description": "I18n tools for javascript",

@@ -28,3 +28,3 @@ "main": "index.js",

"babel-runtime": "^6.23.0",
"lingui-formats": "^1.0.0-5",
"lingui-formats": "^1.0.0-6",
"make-plural": "^4.0.1",

@@ -31,0 +31,0 @@ "messageformat-parser": "^1.0.0"

@@ -28,5 +28,7 @@ # lingui-i18n

fr: {
"Hello World!": "Salut le monde!",
"My name is {name}": "Je m'appelle {name}",
"{count, plural, one {# book} other {# books}}": "{count, plural, one {# livre} other {# livres}}"
messages: {
"Hello World!": "Salut le monde!",
"My name is {name}": "Je m'appelle {name}",
"{count, plural, one {# book} other {# books}}": "{count, plural, one {# livre} other {# livres}}"
}
}

@@ -33,0 +35,0 @@ })

@@ -5,1 +5,10 @@ // @flow

export const isFunction = (f: any) => typeof f === 'function'
export function isEmpty (obj: any) {
// null and undefined are "empty"
if (obj === null || obj === undefined) return true
if (obj.length > 0) return false
if (obj.length === 0) return true
return !Object.getOwnPropertyNames(obj).length
}
/* @flow */
import { interpolate } from './context'
import { isString, isFunction } from './essentials'
import { isString, isFunction, isEmpty } from './essentials'
import t from './t'
import { select, plural, selectOrdinal } from './select'
type Catalog = { [key: string]: string | Function }
type Catalogs = { [key: string]: Catalog }
type Message = {|

@@ -17,23 +14,39 @@ defaults?: string,

type LanguageData = {
plurals: Function
plurals?: Function
}
type AllLanguageData = { [key: string]: LanguageData }
type Messages = { [key: string]: string | Function }
type Catalog = {
messages: Messages,
languageData?: LanguageData
}
type Catalogs = { [key: string]: Catalog }
type setupI18nProps = {
language?: string,
messages?: Catalogs,
languageData?: AllLanguageData,
catalogs?: Catalogs,
development?: Object
}
function getLanguageData (catalog) {
return (catalog || {}).languageData || {}
}
function getMessages (catalog) {
return (catalog || {}).messages || {}
}
class I18n {
_language: string
// Messages in all loaded language.
_messages: Catalogs
// Messages in active language. This is optimization, so we don't perform
// object lookup _messages[language] for each translation.
_activeMessages: Catalog
// Message catalogs
_catalogs: Catalogs
_languageData: AllLanguageData
// Messages/langauge data in active language.
// This is optimization, so we don't perform object lookup
// _catalogs[language] for each translation.
_activeMessages: Messages
_activeLanguageData: LanguageData

@@ -51,4 +64,3 @@ _dev: Object

this._activeMessages = {}
this._messages = {}
this._languageData = {}
this._catalogs = {}

@@ -64,6 +76,10 @@ if (process.env.NODE_ENV !== 'production') {

get availableLanguages (): Array<string> {
return Object.keys(this._messages)
return Object.keys(this._catalogs)
}
get messages (): Catalog {
get language (): string {
return this._language
}
get messages (): Messages {
return this._activeMessages

@@ -73,27 +89,27 @@ }

get languageData (): LanguageData {
const data = this._languageData[this.language]
return this._activeLanguageData
}
_cacheActiveLanguage () {
const activeCatalog = this._catalogs[this.language]
let languageData = getLanguageData(activeCatalog)
if (process.env.NODE_ENV !== 'production') {
// Allow overriding data in development, useful for testing
if (!data) {
return this._dev.loadLanguageData(this.language)
if (isEmpty(languageData) && this._dev && isFunction(this._dev.loadLanguageData)) {
languageData = this._dev.loadLanguageData(this.language)
}
}
return data
this._activeMessages = getMessages(activeCatalog)
this._activeLanguageData = languageData
}
get language (): string {
return this._language
}
load (catalogs: Catalogs) {
if (typeof catalogs !== 'object') return
load (messages: Catalogs) {
if (typeof messages !== 'object') return
// deeply merge Catalogs
Object.keys({ ...this._messages, ...messages }).forEach(language => {
if (!this._messages[language]) this._messages[language] = {}
Object.keys({ ...this._catalogs, ...catalogs }).forEach(language => {
let compiledMessages = getMessages(catalogs[language])
let compiledMessages = messages[language] || {}
if (process.env.NODE_ENV !== 'production') {

@@ -109,12 +125,15 @@ if (this._dev && isFunction(this._dev.compile)) {

Object.assign(
this._messages[language],
compiledMessages
)
this._catalogs[language] = {
messages: {
...getMessages(this._catalogs[language]),
...compiledMessages
},
languageData: {
...getLanguageData(this._catalogs[language]),
...getLanguageData(catalogs[language])
}
}
})
}
loadLanguageData (languageData: AllLanguageData) {
if (!languageData) return
Object.assign(this._languageData, languageData)
this._cacheActiveLanguage()
}

@@ -132,3 +151,3 @@

this._language = language
this._activeMessages = this._messages[this.language] || {}
this._cacheActiveLanguage()
}

@@ -139,4 +158,3 @@

language,
messages: this._messages,
languageData: this._languageData,
catalogs: this._catalogs,
development: this._dev

@@ -161,2 +179,3 @@ })

pluralForm (n: number, pluralType?: 'cardinal' | 'ordinal' = 'cardinal'): string {
if (!this.languageData.plurals) return 'other'
return this.languageData.plurals(n, pluralType === 'ordinal')

@@ -177,5 +196,4 @@ }

if (params.messages) i18n.load(params.messages)
if (params.catalogs) i18n.load(params.catalogs)
if (params.language) i18n.activate(params.language)
if (params.languageData) i18n.loadLanguageData(params.languageData)

@@ -187,2 +205,2 @@ return i18n

export { setupI18n }
export type { Message, Catalog, Catalogs, AllLanguageData, LanguageData, I18n }
export type { Message, Catalog, Catalogs, LanguageData, I18n }

@@ -28,5 +28,3 @@ /* @flow */

const messages = {
en: {
'Hello': 'Hello'
}
'Hello': 'Hello'
}

@@ -39,11 +37,11 @@

i18n.load({ en: messages.en })
i18n.load({ en: { messages } })
i18n.activate('en')
expect(i18n.messages).toEqual(messages.en)
expect(i18n.messages).toEqual(messages)
// fr catalog shouldn't affect the english one
i18n.load({ fr: { 'Hello': 'Salut' } })
expect(i18n.messages).toEqual(messages.en)
i18n.load({ fr: { messages: { 'Hello': 'Salut' } } })
expect(i18n.messages).toEqual(messages)
i18n.load({ en: { 'Goodbye': 'Goodbye' } })
i18n.load({ en: { messages: { 'Goodbye': 'Goodbye' } } })
// $FlowIgnore: testing edge case

@@ -59,6 +57,4 @@ i18n.load() // should do nothing

const languageData = {
en: {
plurals: jest.fn(),
code: 'en-US'
}
plurals: jest.fn(),
code: 'en-US'
}

@@ -68,13 +64,29 @@

language: 'en',
languageData,
messages: {en: {}, fr: {}},
catalogs: {
en: {
messages: {},
languageData
},
fr: {
messages: {}
}
}
})
expect(i18n.languageData).toEqual(languageData.en)
expect(i18n.languageData).toEqual(languageData)
// fr catalog shouldn't affect the english one
i18n.loadLanguageData({ fr: { plurals: jest.fn(), code: 'fr-FR' } })
i18n.load({
fr: {
messages: {},
languageData: {
plurals: jest.fn(),
code: 'fr-FR'
}
}
})
expect(i18n.languageData).toEqual(languageData)
// $FlowIgnore: testing edge case
i18n.loadLanguageData() // should do nothing
expect(i18n.languageData).toEqual(languageData.en)
i18n.load() // should do nothing
expect(i18n.languageData).toEqual(languageData)
})

@@ -89,3 +101,6 @@

language: 'en',
messages: { fr: messages, en: {} },
catalogs: {
fr: { messages },
en: { messages: {} }
},
development: linguiDev

@@ -121,8 +136,12 @@ })

it('.use should return new i18n object with switched language', function () {
const messages = {
const catalogs = {
en: {
'Hello': 'Hello'
messages: {
'Hello': 'Hello'
}
},
fr: {
'Hello': 'Salut'
messages: {
'Hello': 'Salut'
}
}

@@ -133,3 +152,3 @@ }

language: 'en',
messages: messages,
catalogs,
development: linguiDev

@@ -155,3 +174,3 @@ })

language: 'fr',
messages: { fr: messages },
catalogs: { fr: { messages } },
development: linguiDev

@@ -186,3 +205,3 @@ })

language: 'fr',
messages: { fr: messages }
catalogs: { fr: { messages } }
})

@@ -189,0 +208,0 @@

/* @flow */
import i18n, { setupI18n } from './i18n'
import type { Catalog, Catalogs, Message, LanguageData, AllLanguageData, I18n } from './i18n'
import type { Catalog, Catalogs, Message, LanguageData, I18n } from './i18n'
export default i18n
export { setupI18n }
export type { Catalog, Catalogs, Message, LanguageData, AllLanguageData, I18n }
export type { Catalog, Catalogs, Message, LanguageData, I18n }
/* @flow */
import { plural, select, selectOrdinal } from './select'
import { setupI18n } from './i18n'
import linguiDev from './dev'
import dev from './dev'

@@ -9,4 +9,8 @@ describe('plural', function () {

language: 'en',
messages: {en: {}},
development: linguiDev
catalogs: {
en: {
messages: {}
}
},
development: dev
})

@@ -41,4 +45,8 @@

language: 'en',
messages: {en: {}},
development: linguiDev
catalogs: {
en: {
messages: {}
}
},
development: dev
})

@@ -82,4 +90,8 @@

language: 'cs',
messages: { cs: {} },
development: linguiDev
catalogs: {
cs: {
messages: {}
}
},
development: dev
})

@@ -86,0 +98,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc