@je-es/client 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -2
- package/dist/main.cjs +40 -115
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.cts +1169 -292
- package/dist/main.d.ts +1169 -292
- package/dist/main.js +40 -115
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
</div>
|
|
9
9
|
|
|
10
10
|
<div align="center">
|
|
11
|
-
<img src="https://img.shields.io/badge/v-0.1.
|
|
11
|
+
<img src="https://img.shields.io/badge/v-0.1.9-black"/>
|
|
12
12
|
<img src="https://img.shields.io/badge/🔥-@je--es-black"/>
|
|
13
13
|
<br>
|
|
14
14
|
<img src="https://github.com/je-es/client/actions/workflows/ci.yml/badge.svg" alt="CI" />
|
|
15
|
-
<img src="https://img.shields.io/badge/coverage-
|
|
15
|
+
<!-- <img src="https://img.shields.io/badge/coverage-70%25-brightgreen" alt="Test Coverage" /> -->
|
|
16
16
|
<img src="https://img.shields.io/github/issues/je-es/client?style=flat" alt="Github Repo Issues" />
|
|
17
17
|
<img src="https://img.shields.io/github/stars/je-es/client?style=social" alt="GitHub Repo stars" />
|
|
18
18
|
</div>
|
|
@@ -415,6 +415,153 @@
|
|
|
415
415
|
|
|
416
416
|
<div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
|
|
417
417
|
|
|
418
|
+
- ### Internationalization (i18n)
|
|
419
|
+
|
|
420
|
+
**Setup in App Initialization:**
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
import { setupI18n, t } from '@je-es/client';
|
|
424
|
+
|
|
425
|
+
// In your app initialization (browser.ts or similar)
|
|
426
|
+
async function initializeApp() {
|
|
427
|
+
// 1. Setup i18n - loads the currently selected language
|
|
428
|
+
// (from localStorage if user visited before, otherwise default)
|
|
429
|
+
await setupI18n({
|
|
430
|
+
defaultLanguage: 'en',
|
|
431
|
+
supportedLanguages: ['en', 'ar'],
|
|
432
|
+
staticPath: 'static/i18n'
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
// 2. Now safe to use t() and render components
|
|
436
|
+
const app = new MyApp();
|
|
437
|
+
await app.init();
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Call when DOM is ready
|
|
441
|
+
if (document.readyState === 'loading') {
|
|
442
|
+
document.addEventListener('DOMContentLoaded', initializeApp);
|
|
443
|
+
} else {
|
|
444
|
+
initializeApp();
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
**Use `t()` Anywhere:**
|
|
449
|
+
|
|
450
|
+
```typescript
|
|
451
|
+
import { t, setLanguage, loadLanguageFile, getCurrentLanguage } from '@je-es/client';
|
|
452
|
+
|
|
453
|
+
// After setupI18n() resolves, you can use t() directly everywhere!
|
|
454
|
+
console.log(t('hello')); // Works in current language!
|
|
455
|
+
console.log(t('welcome', { app_name: 'MyApp' }));
|
|
456
|
+
|
|
457
|
+
// Switch language with lazy-loading (loads file only when needed)
|
|
458
|
+
async function selectLanguage(lang: string) {
|
|
459
|
+
await loadLanguageFile(lang); // Load language on-demand
|
|
460
|
+
setLanguage(lang);
|
|
461
|
+
console.log(getCurrentLanguage()); // New language
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**Lazy-Loading Languages for Performance:**
|
|
466
|
+
|
|
467
|
+
`setupI18n()` loads the **currently selected language** on page load:
|
|
468
|
+
- **First visit**: Loads default language (e.g., en.json)
|
|
469
|
+
- **After switching**: Loads new language on-demand
|
|
470
|
+
- **Returning user**: Loads their previously selected language from localStorage
|
|
471
|
+
|
|
472
|
+
```typescript
|
|
473
|
+
// Returning user who previously selected Arabic
|
|
474
|
+
// Page loads with ar.json (their choice) - fast! ⚡
|
|
475
|
+
await setupI18n({
|
|
476
|
+
defaultLanguage: 'en',
|
|
477
|
+
supportedLanguages: ['en', 'ar', 'fr'],
|
|
478
|
+
staticPath: 'static/i18n'
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
// User clicks to switch language
|
|
482
|
+
await loadLanguageFile('fr'); // Load only when needed
|
|
483
|
+
setLanguage('fr');
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
**In Components:**
|
|
487
|
+
|
|
488
|
+
```typescript
|
|
489
|
+
import { Component, html } from '@je-es/client';
|
|
490
|
+
import { t, setLanguage, loadLanguageFile, createTranslator } from '@je-es/client';
|
|
491
|
+
|
|
492
|
+
class MultiLanguageComponent extends Component {
|
|
493
|
+
render() {
|
|
494
|
+
return html`
|
|
495
|
+
<div>
|
|
496
|
+
<h1>${t('welcome', { app_name: 'JE-ES' })}</h1>
|
|
497
|
+
<button onclick=${() => this.switchLang('en')}>
|
|
498
|
+
English
|
|
499
|
+
</button>
|
|
500
|
+
<button onclick=${() => this.switchLang('ar')}>
|
|
501
|
+
العربية
|
|
502
|
+
</button>
|
|
503
|
+
</div>
|
|
504
|
+
`;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
async switchLang(lang: string) {
|
|
508
|
+
await loadLanguageFile(lang);
|
|
509
|
+
setLanguage(lang);
|
|
510
|
+
this.refresh();
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
connectedCallback() {
|
|
514
|
+
super.connectedCallback();
|
|
515
|
+
// Subscribe to language changes
|
|
516
|
+
this.unsubscribe = createTranslator(() => this.refresh());
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
disconnectedCallback() {
|
|
520
|
+
super.disconnectedCallback();
|
|
521
|
+
if (this.unsubscribe) {
|
|
522
|
+
this.unsubscribe();
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
**Advanced Usage:**
|
|
529
|
+
|
|
530
|
+
```typescript
|
|
531
|
+
import { t, tLang, loadLanguage, getSupportedLanguages, hasKey } from '@je-es/client';
|
|
532
|
+
|
|
533
|
+
// Translate with specific language temporarily
|
|
534
|
+
console.log(t('hello')); // Current language
|
|
535
|
+
console.log(tLang('hello', 'en')); // Temporarily use English
|
|
536
|
+
|
|
537
|
+
// Load specific language dynamically
|
|
538
|
+
loadLanguage('fr', {
|
|
539
|
+
hello: 'Bonjour',
|
|
540
|
+
welcome: 'Bienvenue dans {app_name}'
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
// Check supported languages
|
|
544
|
+
console.log(getSupportedLanguages()); // ['en', 'ar', 'fr']
|
|
545
|
+
|
|
546
|
+
// Check if key exists
|
|
547
|
+
if (hasKey('custom_key')) {
|
|
548
|
+
console.log(t('custom_key'));
|
|
549
|
+
}
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
> **_Features:_**
|
|
553
|
+
> - **Lazy-loaded languages**: Default language loads on init, others load on-demand
|
|
554
|
+
> - **Fast page load**: Only default language file is downloaded initially
|
|
555
|
+
> - **localStorage support**: Automatically saves language preference
|
|
556
|
+
> - **Parameter replacement**: Replace placeholders with dynamic values
|
|
557
|
+
> - **Nested translations**: Use translation keys as parameter values
|
|
558
|
+
> - **Reactive updates**: Listen to language changes with `createTranslator()`
|
|
559
|
+
> - **Fallback language**: Falls back to configured default language if translation is missing
|
|
560
|
+
> - **Multiple languages**: Support for unlimited languages
|
|
561
|
+
> - **URL loading**: Load translations from remote JSON files or manually with `loadLanguageFile()`
|
|
562
|
+
|
|
563
|
+
<div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
|
|
564
|
+
|
|
418
565
|
- ### API Integration
|
|
419
566
|
|
|
420
567
|
```typescript
|
|
@@ -516,6 +663,8 @@
|
|
|
516
663
|
}
|
|
517
664
|
```
|
|
518
665
|
|
|
666
|
+
> **_Note:_** i18n is now configured directly in your app initialization via `setupI18n()` instead of in the client config. See the [Internationalization section](#internationalization-i18n) for details.
|
|
667
|
+
|
|
519
668
|
<div align="center"> <img src="./assets/img/line.png" alt="line" style="display: block; margin-top:20px;margin-bottom:20px;width:500px;"/> <br> </div>
|
|
520
669
|
|
|
521
670
|
- ### Build Commands
|