mirror of
https://github.com/cupcakearmy/svelte-i18n.git
synced 2024-09-28 23:24:44 +02:00
Add svelte, sveltify the code and add some tests
This commit is contained in:
parent
f362bea98f
commit
6584c1375b
6
package-lock.json
generated
6
package-lock.json
generated
@ -9782,6 +9782,12 @@
|
|||||||
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
|
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"svelte": {
|
||||||
|
"version": "2.9.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/svelte/-/svelte-2.9.7.tgz",
|
||||||
|
"integrity": "sha512-+OwyqaGgy25vKBmZOR7usUE4bK1sHnxvv+Q+8IXFZsanvR+acTjIL+GRdRS8XRvoaxfxM47DpwWk1wo4RV0ucg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"symbol-observable": {
|
"symbol-observable": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
|
||||||
|
@ -99,6 +99,7 @@
|
|||||||
"rollup-plugin-sourcemaps": "^0.4.2",
|
"rollup-plugin-sourcemaps": "^0.4.2",
|
||||||
"rollup-plugin-typescript2": "^0.11.1",
|
"rollup-plugin-typescript2": "^0.11.1",
|
||||||
"semantic-release": "^15.0.0",
|
"semantic-release": "^15.0.0",
|
||||||
|
"svelte": "^2.9.7",
|
||||||
"ts-jest": "^22.0.0",
|
"ts-jest": "^22.0.0",
|
||||||
"ts-node": "^6.0.0",
|
"ts-node": "^6.0.0",
|
||||||
"tslint": "^5.8.0",
|
"tslint": "^5.8.0",
|
||||||
|
@ -11,3 +11,20 @@ export interface Sveltei18n {
|
|||||||
upper: TranslationGetter
|
upper: TranslationGetter
|
||||||
lower: TranslationGetter
|
lower: TranslationGetter
|
||||||
}
|
}
|
||||||
|
export interface SvelteEventListener {
|
||||||
|
cancel(): void
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SvelteStore {
|
||||||
|
on: (event: string, callback: Function) => SvelteEventListener
|
||||||
|
set: (newState: Object) => void
|
||||||
|
fire: (event: string, value: any) => void
|
||||||
|
[prop: string]: any
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Locale {
|
||||||
|
[id: string | number]: string
|
||||||
|
}
|
||||||
|
export interface Locales {
|
||||||
|
[locale: string]: Locale
|
||||||
|
}
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
import { InterpolationObj, Sveltei18n } from './interfaces'
|
import { InterpolationObj, Sveltei18n, SvelteStore, Locale, Locales } from './interfaces'
|
||||||
|
import { capitalize, titlelize, upper, lower, getNestedProp } from './utils'
|
||||||
|
|
||||||
export default function() {
|
export default function(store: SvelteStore, locales: Locales) {
|
||||||
const _ = <Sveltei18n>function(str: string, values: InterpolationObj) {
|
store.locale = (locale: string) => store.fire('locale', locale)
|
||||||
return str
|
store.on('locale', function(locale: string) {
|
||||||
}
|
const localeDict: Locale = locales[locale]
|
||||||
|
const _ = <Sveltei18n>function(id, values) {
|
||||||
|
return getNestedProp(localeDict, id) || id
|
||||||
|
}
|
||||||
|
|
||||||
Object.assign(_, {
|
_.capitalize = (id, values) => capitalize(_(id, values))
|
||||||
capitalize: (id: string, values: InterpolationObj) =>
|
_.titlelize = (id, values) => titlelize(_(id, values))
|
||||||
_(id, values).replace(/(^|\s)\S/, l => l.toUpperCase()),
|
_.upper = (id, values) => upper(_(id, values))
|
||||||
titlelize: (id: string, values: InterpolationObj) =>
|
_.lower = (id, values) => lower(_(id, values))
|
||||||
_(id, values).replace(/(^|\s)\S/g, l => l.toUpperCase()),
|
|
||||||
upper: (id: string, values: InterpolationObj) => _(id, values).toLocaleUpperCase(),
|
store.set({ locale, _ })
|
||||||
lower: (id: string, values: InterpolationObj) => _(id, values).toLocaleLowerCase()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return _
|
|
||||||
}
|
}
|
||||||
|
18
src/utils.ts
Normal file
18
src/utils.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
export const capitalize = (str: string) => str.replace(/(^|\s)\S/, l => l.toUpperCase())
|
||||||
|
export const titlelize = (str: string) => str.replace(/(^|\s)\S/g, l => l.toUpperCase())
|
||||||
|
export const upper = (str: string) => str.toLocaleUpperCase()
|
||||||
|
export const lower = (str: string) => str.toLocaleLowerCase()
|
||||||
|
|
||||||
|
export const getNestedProp = (obj: { [prop: string]: any }, path: string) => {
|
||||||
|
try {
|
||||||
|
return path
|
||||||
|
.replace('[', '.')
|
||||||
|
.replace(']', '')
|
||||||
|
.split('.')
|
||||||
|
.reduce(function(o, property) {
|
||||||
|
return o[property]
|
||||||
|
}, obj)
|
||||||
|
} catch (err) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
}
|
@ -1,14 +1,51 @@
|
|||||||
import DummyClass from '../src/svelte-i18n'
|
import i18n from '../src/svelte-i18n'
|
||||||
|
import { Store } from 'svelte/store.umd'
|
||||||
|
import { capitalize, titlelize, upper, lower, getNestedProp } from '../src/utils'
|
||||||
|
|
||||||
|
const store = new Store()
|
||||||
|
const locales = {
|
||||||
|
'pt-br': {
|
||||||
|
test: 'teste',
|
||||||
|
phrase: 'Adoro banana',
|
||||||
|
phrases: ['Frase 1', 'Frase 2']
|
||||||
|
},
|
||||||
|
po: {
|
||||||
|
test: 'prøve',
|
||||||
|
phrase: 'Jeg elsker banan',
|
||||||
|
phrases: ['sætning 1', 'sætning 2']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i18n(store, locales)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dummy test
|
* Dummy test
|
||||||
*/
|
*/
|
||||||
describe('Dummy test', () => {
|
describe('utils', () => {
|
||||||
it('works if true is truthy', () => {
|
it('works', () => {
|
||||||
expect(true).toBeTruthy()
|
expect(getNestedProp(store['pt-br'], 'phrases[3]')).toBe(undefined)
|
||||||
})
|
})
|
||||||
|
})
|
||||||
it('DummyClass is instantiable', () => {
|
describe('Dummy test', () => {
|
||||||
expect(new DummyClass()).toBeInstanceOf(DummyClass)
|
it('works if true is truthy', () => {
|
||||||
|
expect(store.get().locale).toBeFalsy()
|
||||||
|
expect(store.get()._).toBeFalsy()
|
||||||
|
|
||||||
|
store.fire('locale', 'en')
|
||||||
|
expect(store.get().locale).toBe('en')
|
||||||
|
store.locale('pt-br')
|
||||||
|
expect(store.get().locale).toBe('pt-br')
|
||||||
|
expect(store.get()._).toBeInstanceOf(Function)
|
||||||
|
expect(store.get()._('non-existent')).toBe('non-existent')
|
||||||
|
expect(store.get()._('test')).toBe(locales['pt-br'].test)
|
||||||
|
store.fire('locale', 'po')
|
||||||
|
expect(store.get()._('test')).not.toBe(locales['pt-br'].test)
|
||||||
|
expect(store.get()._('test')).toBe(locales.po.test)
|
||||||
|
expect(store.get()._('phrases[1]')).toBe(locales.po.phrases[1])
|
||||||
|
expect(store.get()._('phrases[2]')).toBe('phrases[2]')
|
||||||
|
expect(store.get()._.capitalize('phrase')).toBe(capitalize(locales.po.phrase))
|
||||||
|
expect(store.get()._.titlelize('phrase')).toBe(titlelize(locales.po.phrase))
|
||||||
|
expect(store.get()._.upper('phrase')).toBe(upper(locales.po.phrase))
|
||||||
|
expect(store.get()._.lower('phrase')).toBe(lower(locales.po.phrase))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user