Skip to content

Commit

Permalink
feat: use logger pattern for translator (#145)
Browse files Browse the repository at this point in the history
* feat: implement factory pattern for translator WIP

* test: remove componentsjs from crypto service test

* fix: eslint error

* chore: remove old translator from dgt-components

* test: fixed tests in dgt-components

* test: update coverage

* chore: remove old i18n exports from index.ts

* chore: add demo for translator

* chore: removed label, refactored getTranslatorFor

* chore: remove console.log

Co-authored-by: Arthur Joppart <[email protected]>
  • Loading branch information
lem-onade and BelgianNoise authored Feb 18, 2022
1 parent 03f52f6 commit 9f4520a
Show file tree
Hide file tree
Showing 30 changed files with 391 additions and 316 deletions.
20 changes: 20 additions & 0 deletions packages/dgt-components/demo/demo.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { FormValidator } from '../lib/components/forms/form-validator';
import { FormElementComponent } from '../lib/components/forms/form-element.component';
import { define } from '../lib/util/define';
import { hydrate } from '../lib/util/hydrate';
import { getTranslator, getTranslatorFor, MemoryTranslatorFactory, setTranslator, setTranslatorFactory, TRANSLATIONS_LOADED, Translator } from '@digita-ai/dgt-utils';


const emailValidator: FormValidator<{ email: string }> = async (context, event) => {
Expand Down Expand Up @@ -49,6 +50,8 @@ export class DemoComponent extends RxLitElement {
// eslint-disable-next-line max-len
private formActor: Interpreter<FormContext<{ email: string }>, FormStateSchema<{ email: string }>, FormEvent, FormState<{ email: string }>>;

private translator: Translator;

constructor() {
super();

Expand All @@ -65,6 +68,21 @@ export class DemoComponent extends RxLitElement {
define('checkbox-component', CheckboxComponent);
define('form-element', hydrate(FormElementComponent)(this.formActor));

// create single translator
setTranslatorFactory(new MemoryTranslatorFactory);

}

async connectedCallback(): Promise<void> {

this.translator = await getTranslatorFor(navigator.language);
// set global translator
setTranslator(this.translator);
// to use in other components:
this.translator = getTranslator();

super.connectedCallback();

}

private onCheckboxClicked = (e: Event) => {
Expand All @@ -84,6 +102,8 @@ export class DemoComponent extends RxLitElement {
render() {

return html`
<h1>translator</h1>
<p>${this.translator.translate('example-translation')}</p>
<h1>checkbox component</h1>
<form>
<checkbox-component @change="${this.onCheckboxClicked}">I agree</checkbox-component>
Expand Down
3 changes: 3 additions & 0 deletions packages/dgt-components/demo/public/en-US.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"example-translation": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut lacinia arcu vel aliquam interdum. Aliquam bibendum vitae magna id molestie."
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { ArgumentError } from '@digita-ai/dgt-utils';
import { MockTranslator } from '../../services/i18n/mock-translator';
import { Alert } from './alert';
import { AlertComponent } from './alert.component';

Expand All @@ -11,6 +10,10 @@ describe('AlertComponent', () => {

component = window.document.createElement('alert-component') as AlertComponent;

(component.translator as unknown) = {
translate: (key: string) => key,
};

});

afterEach(() => {
Expand Down Expand Up @@ -48,8 +51,6 @@ describe('AlertComponent', () => {
message: 'foo',
};

component.translator = new MockTranslator('en-GB');

window.document.body.appendChild(component);
await component.updateComplete;

Expand All @@ -66,8 +67,6 @@ describe('AlertComponent', () => {
message: 'foo',
};

component.translator = new MockTranslator('en-GB');

window.document.body.appendChild(component);
await component.updateComplete;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import { from } from 'rxjs';
import { map } from 'rxjs/operators';
import { Theme, DigitaBlue } from '@digita-ai/dgt-theme';
import { SolidService } from '@digita-ai/inrupt-solid-service';
import { Translator } from '@digita-ai/dgt-utils';
import { Issuer } from '../../models/issuer.model';
import { ProviderListComponent } from '../provider/provider-list.component';
import { SeparatorComponent } from '../separator/separator.component';
import { LoadingComponent } from '../loading/loading.component';
import { define } from '../../util/define';
import { Translator } from '../../services/i18n/translator';
import { WebIdComponent } from './webid.component';
import { AuthenticateContext, AuthenticateEvent, AuthenticateEvents, authenticateMachine, AuthenticateState, AuthenticateStates, AuthenticateStateSchema, ClickedLoginEvent, SelectedIssuerEvent, WebIdEnteredEvent, WebIdValidator } from './authenticate.machine';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import { RxLitElement } from 'rx-lit';
import { Theme } from '@digita-ai/dgt-theme';
import { debounce } from 'debounce';
import { unsafeSVG } from 'lit-html/directives/unsafe-svg';
import { Translator } from '@digita-ai/dgt-utils';
import { define } from '../../util/define';
import { AlertComponent } from '../alerts/alert.component';
import { Translator } from '../../services/i18n/translator';

export class WebIdComponent extends RxLitElement {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { define } from '../../util/define';
import { SourceListComponent } from './source-list.component';

describe('SourceListComponent', () => {

let component: SourceListComponent;
const tag = 'source-list-component';

beforeEach(() => {

define(tag, SourceListComponent);
component = document.createElement(tag) as SourceListComponent;

});

it('should instantiate', async () => {

window.document.body.appendChild(component);
await component.updateComplete;

expect(component).toBeTruthy();
expect(component).toBeInstanceOf(SourceListComponent);

});

});
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { define } from '../../util/define';
import { SourceComponent } from './source.component';

describe('SourceComponent', () => {

let component: SourceComponent;
const tag = 'source-component';

beforeEach(() => {

define(tag, SourceComponent);
component = document.createElement(tag) as SourceComponent;

});

it('should instantiate', async () => {

window.document.body.appendChild(component);
await component.updateComplete;

expect(component).toBeTruthy();
expect(component).toBeInstanceOf(SourceComponent);

});

});
3 changes: 0 additions & 3 deletions packages/dgt-components/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,5 @@ export * from './models/purpose.model';
export * from './models/session.model';
export * from './models/source.model';
export * from './models/triple.model';
export * from './services/i18n/memory-translator';
export * from './services/i18n/mock-translator';
export * from './services/i18n/translator';
export * from './util/define';
export * from './util/hydrate';
56 changes: 0 additions & 56 deletions packages/dgt-components/lib/services/i18n/mock-translator.spec.ts

This file was deleted.

35 changes: 0 additions & 35 deletions packages/dgt-components/lib/services/i18n/mock-translator.ts

This file was deleted.

8 changes: 4 additions & 4 deletions packages/dgt-components/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,10 @@
],
"coverageThreshold": {
"global": {
"branches": 72.26,
"functions": 71.03,
"lines": 84.57,
"statements": 84.09
"branches": 75,
"functions": 72.94,
"lines": 89.15,
"statements": 88.69
}
},
"coveragePathIgnorePatterns": [
Expand Down
4 changes: 3 additions & 1 deletion packages/dgt-utils/.componentsignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@
"ArgumentError",
"HttpError",
"HttpClient",
"EventObject"
"EventObject",
"EventTarget",
"CustomEvent"
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/* eslint-disable @typescript-eslint/dot-notation */
import fetchMock from 'jest-fetch-mock';
import { CachedTranslatorFactory } from './cached-translator-factory';

describe('', () => {

let factory: CachedTranslatorFactory;

beforeEach(() => {

factory = new CachedTranslatorFactory();

});

it('should create translator with correct language', async () => {

const translator = await factory.createTranslator('en');
expect(translator.getLang()).toEqual('en');

});

it('should set translations when creating translator', async () => {

expect(factory['translations']).toBeUndefined();
await factory.createTranslator('en');
expect(factory['translations']).toBeTruthy();

});

it('should only fetch translations once', async () => {

fetchMock.resetMocks();
fetchMock.mockIf(/.*\.json$/, '{}');

expect(factory['translations']).toBeUndefined();

for (let i = 0; i < 10; i++) {

await factory.createTranslator('en');

}

expect(fetchMock.mock.calls.length).toEqual(1);

});

});
23 changes: 23 additions & 0 deletions packages/dgt-utils/lib/i18n/factories/cached-translator-factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { MemoryTranslator } from '../translators/memory-translator';
import { TranslatorFactory } from '../models/translator-factory';

/**
* Creates {@link Translator } instances for the given language tag.
*/
export class CachedTranslatorFactory implements TranslatorFactory {

private translations: { [key: string]: string };

async createTranslator(language: string): Promise<MemoryTranslator> {

if (!this.translations) {

this.translations = await (await fetch(`${window.location.origin}/${language}.json`)).json();

}

return new MemoryTranslator(language, this.translations);

}

}
15 changes: 15 additions & 0 deletions packages/dgt-utils/lib/i18n/factories/memory-translator-factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { MemoryTranslator } from '../translators/memory-translator';
import { TranslatorFactory } from '../models/translator-factory';

/**
* Creates {@link Translator } instances for the given language tag.
*/
export class MemoryTranslatorFactory implements TranslatorFactory {

createTranslator(language: string): MemoryTranslator {

return new MemoryTranslator(language);

}

}
Loading

0 comments on commit 9f4520a

Please sign in to comment.