@konce-pt/i18n 0.12.0 → 0.14.0
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 +7 -7
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -2
- package/dist/intl.d.ts +12 -2
- package/dist/intl.js +31 -5
- package/dist/messages.d.ts +65 -23
- package/dist/messages.js +102 -34
- package/dist/translate.js +1 -1
- package/dist/types.d.ts +4 -4
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://ui.konce.pt/images/koncept_ui_lib.png" alt="Koncept UI
|
|
2
|
+
<img src="https://ui.konce.pt/images/koncept_ui_lib.png" alt="Koncept UI - Angular component library" width="100%" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
# @konce-pt/i18n
|
|
6
6
|
|
|
7
7
|
Kontrakt tłumaczeń i słowniki bazowe (EN, PL) dla [Koncept UI](https://gitlab.com/konce-pt/koncept-ui).
|
|
8
|
-
Czysty TypeScript, **zero zależności runtime**, bez wiązania z frameworkiem
|
|
8
|
+
Czysty TypeScript, **zero zależności runtime**, bez wiązania z frameworkiem - jedno źródło prawdy
|
|
9
9
|
dla `@konce-pt/angular` i `@konce-pt/react`.
|
|
10
10
|
|
|
11
11
|
Zwykle nie instalujesz tego pakietu samodzielnie: biblioteki komponentów re-eksportują jego API
|
|
@@ -20,10 +20,10 @@ npm i @konce-pt/i18n
|
|
|
20
20
|
import { KPT_MESSAGES_PL, translate } from '@konce-pt/i18n';
|
|
21
21
|
|
|
22
22
|
translate(KPT_MESSAGES_PL, 'paginator.range', { start: 1, end: 10, total: 42 });
|
|
23
|
-
// '1
|
|
23
|
+
// '1-10 z 42'
|
|
24
24
|
|
|
25
25
|
translate(KPT_MESSAGES_PL, 'nope.missing');
|
|
26
|
-
// 'nope.missing'
|
|
26
|
+
// 'nope.missing' - brak klucza spada na EN, a potem na sam klucz
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
## API
|
|
@@ -31,16 +31,16 @@ translate(KPT_MESSAGES_PL, 'nope.missing');
|
|
|
31
31
|
| Eksport | Typ | Opis |
|
|
32
32
|
|---|---|---|
|
|
33
33
|
| `KptMessages` | `interface` | Kontrakt wszystkich etykiet UI biblioteki |
|
|
34
|
-
| `KptLocale` | `type` | `'en' \| 'pl' \| (string & {})`
|
|
34
|
+
| `KptLocale` | `type` | `'en' \| 'pl' \| (string & {})` - otwarty kod języka |
|
|
35
35
|
| `KPT_MESSAGES_EN` / `KPT_MESSAGES_PL` | `KptMessages` | Słowniki bazowe |
|
|
36
|
-
| `translate(dict, key, params?)` | `string` | Klucz kropkowy + interpolacja `{name}`, fallback
|
|
36
|
+
| `translate(dict, key, params?)` | `string` | Klucz kropkowy + interpolacja `{name}`, fallback -> EN -> klucz |
|
|
37
37
|
| `lookup(dict, key)` | `string \| undefined` | Surowa wartość spod klucza kropkowego |
|
|
38
38
|
| `deepMerge(base, patch)` | `T` | Nakłada częściowy słownik na pełny |
|
|
39
39
|
| `weekdayNames(locale)` | `string[]` | Skrócone nazwy dni, od poniedziałku |
|
|
40
40
|
| `monthNames(locale)` | `string[]` | Pełne nazwy miesięcy |
|
|
41
41
|
| `DeepPartial<T>`, `KptI18nConfig` | `type` | Typy używane przez wiązania frameworkowe |
|
|
42
42
|
|
|
43
|
-
Nazw dni i miesięcy nie ma w słowniku
|
|
43
|
+
Nazw dni i miesięcy nie ma w słowniku - wyliczają się z `Intl` dla aktywnego locale, więc
|
|
44
44
|
kalendarze działają także w języku, którego nikt nie tłumaczył ręcznie.
|
|
45
45
|
|
|
46
46
|
Pełny opis: [`llms.txt`](https://ui.konce.pt/llms/i18n/llms.txt) (EN)
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { KPT_MESSAGES_EN, KPT_MESSAGES_PL } from './messages.ts';
|
|
|
2
2
|
export type { KptLocale, KptMessages } from './messages.ts';
|
|
3
3
|
export { deepMerge, lookup, translate } from './translate.ts';
|
|
4
4
|
export type { DeepPartial, KptI18nConfig, KptMessageKey } from './types.ts';
|
|
5
|
-
export { monthNames, weekdayNames } from './intl.ts';
|
|
5
|
+
export { byteUnitOf, formatBytes, monthNames, weekdayNames } from './intl.ts';
|
|
6
|
+
export type { KptByteUnit } from './intl.ts';
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* @konce-pt/i18n
|
|
2
|
+
* @konce-pt/i18n - kontrakt tłumaczeń i słowniki bazowe Koncept UI.
|
|
3
3
|
*
|
|
4
4
|
* Czysty TypeScript, zero zależności runtime. Współdzielony przez
|
|
5
5
|
* `@konce-pt/angular` (serwis na sygnałach) i `@konce-pt/react` (Context + hook),
|
|
@@ -7,4 +7,4 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export { KPT_MESSAGES_EN, KPT_MESSAGES_PL } from "./messages.js";
|
|
9
9
|
export { deepMerge, lookup, translate } from "./translate.js";
|
|
10
|
-
export { monthNames, weekdayNames } from "./intl.js";
|
|
10
|
+
export { byteUnitOf, formatBytes, monthNames, weekdayNames } from "./intl.js";
|
package/dist/intl.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
/** Krótkie nazwy dni tygodnia, zaczynając od poniedziałku (Pn
|
|
1
|
+
/** Krótkie nazwy dni tygodnia, zaczynając od poniedziałku (Pn...Nd). */
|
|
2
2
|
export declare function weekdayNames(locale: string): string[];
|
|
3
|
-
/** Pełne nazwy miesięcy (stycze
|
|
3
|
+
/** Pełne nazwy miesięcy (styczeń...grudzień / January...December). */
|
|
4
4
|
export declare function monthNames(locale: string): string[];
|
|
5
|
+
/** Jednostka rozmiaru pliku w `formatBytes`. */
|
|
6
|
+
export type KptByteUnit = 'byte' | 'kilobyte' | 'megabyte' | 'gigabyte';
|
|
7
|
+
/** Największa jednostka, w której `bytes` ma co najmniej 1 (podstawa 1024, jak w `kpt-file-upload`). */
|
|
8
|
+
export declare function byteUnitOf(bytes: number): KptByteUnit;
|
|
9
|
+
/**
|
|
10
|
+
* Rozmiar w bajtach jako napis w języku interfejsu ("12.3 MB", "12,3 MB"). `unit` wymusza
|
|
11
|
+
* jednostkę - postęp pobierania pisze pobrane w jednostce całości ("0,4 MB z 24 MB", nie "410 kB").
|
|
12
|
+
* `fixed` trzyma jedno miejsce po przecinku, więc licznik w trakcie pobierania nie skacze szerokością.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatBytes(bytes: number, locale: string, unit?: KptByteUnit, fixed?: boolean): string;
|
package/dist/intl.js
CHANGED
|
@@ -1,21 +1,47 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Pomocniki nazw dni/miesięcy wyliczane z `Intl`
|
|
2
|
+
* Pomocniki nazw dni/miesięcy wyliczane z `Intl` - sterowane bieżącym locale i18n.
|
|
3
3
|
* Dzięki temu kalendarze (`kpt-datepicker`, `kpt-date-range`) nie trzymają
|
|
4
4
|
* zaszytych tablic nazw i działają dla dowolnego języka.
|
|
5
5
|
*
|
|
6
6
|
* Daty wzorcowe powstają jako północ UTC, więc formatter też musi liczyć w UTC. Bez
|
|
7
7
|
* `timeZone: 'UTC'` formatuje w strefie przeglądarki, a na zachód od Greenwich północ UTC
|
|
8
|
-
* to jeszcze poprzedni dzień: w Nowym Jorku tydzień zaczynał się od
|
|
9
|
-
* był podpisany
|
|
8
|
+
* to jeszcze poprzedni dzień: w Nowym Jorku tydzień zaczynał się od "Sun", a styczeń
|
|
9
|
+
* był podpisany "December".
|
|
10
10
|
*/
|
|
11
|
-
/** Krótkie nazwy dni tygodnia, zaczynając od poniedziałku (Pn
|
|
11
|
+
/** Krótkie nazwy dni tygodnia, zaczynając od poniedziałku (Pn...Nd). */
|
|
12
12
|
export function weekdayNames(locale) {
|
|
13
13
|
const fmt = new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' });
|
|
14
14
|
// 2024-01-01 (UTC) to poniedziałek.
|
|
15
15
|
return Array.from({ length: 7 }, (_, i) => fmt.format(new Date(Date.UTC(2024, 0, 1 + i))));
|
|
16
16
|
}
|
|
17
|
-
/** Pełne nazwy miesięcy (stycze
|
|
17
|
+
/** Pełne nazwy miesięcy (styczeń...grudzień / January...December). */
|
|
18
18
|
export function monthNames(locale) {
|
|
19
19
|
const fmt = new Intl.DateTimeFormat(locale, { month: 'long', timeZone: 'UTC' });
|
|
20
20
|
return Array.from({ length: 12 }, (_, i) => fmt.format(new Date(Date.UTC(2024, i, 1))));
|
|
21
21
|
}
|
|
22
|
+
const BYTE_UNITS = ['byte', 'kilobyte', 'megabyte', 'gigabyte'];
|
|
23
|
+
/** Największa jednostka, w której `bytes` ma co najmniej 1 (podstawa 1024, jak w `kpt-file-upload`). */
|
|
24
|
+
export function byteUnitOf(bytes) {
|
|
25
|
+
let i = 0;
|
|
26
|
+
for (let v = Math.abs(bytes); v >= 1024 && i < BYTE_UNITS.length - 1; v /= 1024)
|
|
27
|
+
i++;
|
|
28
|
+
return BYTE_UNITS[i];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Rozmiar w bajtach jako napis w języku interfejsu ("12.3 MB", "12,3 MB"). `unit` wymusza
|
|
32
|
+
* jednostkę - postęp pobierania pisze pobrane w jednostce całości ("0,4 MB z 24 MB", nie "410 kB").
|
|
33
|
+
* `fixed` trzyma jedno miejsce po przecinku, więc licznik w trakcie pobierania nie skacze szerokością.
|
|
34
|
+
*/
|
|
35
|
+
export function formatBytes(bytes, locale, unit = byteUnitOf(bytes), fixed = false) {
|
|
36
|
+
const value = bytes / Math.pow(1024, BYTE_UNITS.indexOf(unit));
|
|
37
|
+
// Krótki zapis bajtów w `Intl` to "900 byte" (en) - zostajemy przy symbolu B jak w innych jednostkach.
|
|
38
|
+
if (unit === 'byte')
|
|
39
|
+
return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 0 }).format(value)} B`;
|
|
40
|
+
return new Intl.NumberFormat(locale, {
|
|
41
|
+
style: 'unit',
|
|
42
|
+
unit,
|
|
43
|
+
unitDisplay: 'short',
|
|
44
|
+
minimumFractionDigits: fixed ? 1 : 0,
|
|
45
|
+
maximumFractionDigits: 1,
|
|
46
|
+
}).format(value);
|
|
47
|
+
}
|
package/dist/messages.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Kod języka. Otwarty string
|
|
1
|
+
/** Kod języka. Otwarty string - EN/PL mają podpowiedzi, ale dozwolony dowolny. */
|
|
2
2
|
export type KptLocale = 'en' | 'pl' | (string & {});
|
|
3
3
|
/** Pełny słownik etykiet UI używanych przez komponenty biblioteki. */
|
|
4
4
|
export interface KptMessages {
|
|
@@ -39,7 +39,7 @@ export interface KptMessages {
|
|
|
39
39
|
};
|
|
40
40
|
roadmap: {
|
|
41
41
|
empty: string;
|
|
42
|
-
/** Prefiks numeru tygodnia na osi, np.
|
|
42
|
+
/** Prefiks numeru tygodnia na osi, np. "W" w "W35". */
|
|
43
43
|
week: string;
|
|
44
44
|
today: string;
|
|
45
45
|
milestone: string;
|
|
@@ -107,7 +107,7 @@ export interface KptMessages {
|
|
|
107
107
|
search: {
|
|
108
108
|
/** Podpowiedź w pustym polu. */
|
|
109
109
|
placeholder: string;
|
|
110
|
-
/** Nazwa dostępna pola
|
|
110
|
+
/** Nazwa dostępna pola - nie ma przy nim widocznej etykiety. */
|
|
111
111
|
label: string;
|
|
112
112
|
/** Etykieta listy podpowiedzi dla czytnika ekranu. */
|
|
113
113
|
results: string;
|
|
@@ -119,7 +119,7 @@ export interface KptMessages {
|
|
|
119
119
|
/** Liczba znalezionych podpowiedzi dla czytnika. Interpolacja: {count}. */
|
|
120
120
|
found: string;
|
|
121
121
|
};
|
|
122
|
-
/** Pola formularza
|
|
122
|
+
/** Pola formularza "dodaj lokalizację" poza wspólnymi komunikatami. */
|
|
123
123
|
field: {
|
|
124
124
|
invalidEmail: string;
|
|
125
125
|
invalidUrl: string;
|
|
@@ -157,9 +157,9 @@ export interface KptMessages {
|
|
|
157
157
|
dateRange: string;
|
|
158
158
|
min: string;
|
|
159
159
|
max: string;
|
|
160
|
-
/** Interpolacja: {column}. Opis edytowalnej komórki (`aria-describedby`)
|
|
160
|
+
/** Interpolacja: {column}. Opis edytowalnej komórki (`aria-describedby`) - nazwą zostaje jej wartość. */
|
|
161
161
|
editCell: string;
|
|
162
|
-
/** Interpolacja: {column}. Nazwa uchwytu przestawiania kolumny (strzałki
|
|
162
|
+
/** Interpolacja: {column}. Nazwa uchwytu przestawiania kolumny (strzałki <- ->). */
|
|
163
163
|
moveColumn: string;
|
|
164
164
|
/** Interpolacja: {column}, {position}, {count}. Ogłoszenie po przestawieniu kolumny. */
|
|
165
165
|
columnMoved: string;
|
|
@@ -173,11 +173,11 @@ export interface KptMessages {
|
|
|
173
173
|
};
|
|
174
174
|
fileUpload: {
|
|
175
175
|
/**
|
|
176
|
-
* Interpolacja: {action}
|
|
176
|
+
* Interpolacja: {action} - w to miejsce trafia `hintAction` pogrubione. Zwykły tekst, bez HTML:
|
|
177
177
|
* słowniki bywają z CMS-a albo od tłumaczy, więc nie mogą wstrzykiwać znaczników.
|
|
178
178
|
*/
|
|
179
179
|
hint: string;
|
|
180
|
-
/** Pogrubiona część podpowiedzi (
|
|
180
|
+
/** Pogrubiona część podpowiedzi ("Kliknij"). */
|
|
181
181
|
hintAction: string;
|
|
182
182
|
/** Nazwa przycisku usunięcia; komponent dokleja nazwę pliku. */
|
|
183
183
|
remove: string;
|
|
@@ -211,7 +211,7 @@ export interface KptMessages {
|
|
|
211
211
|
rangeEnd: string;
|
|
212
212
|
/** Interpolacja: {date}. Nazwa dnia wewnątrz zakresu. */
|
|
213
213
|
inRange: string;
|
|
214
|
-
/** Interpolacja: {date}. Komunikat po wyborze początku
|
|
214
|
+
/** Interpolacja: {date}. Komunikat po wyborze początku - czeka na koniec. */
|
|
215
215
|
pickEnd: string;
|
|
216
216
|
/** Interpolacja: {start}, {end}. Komunikat po wyborze całego zakresu. */
|
|
217
217
|
picked: string;
|
|
@@ -275,7 +275,7 @@ export interface KptMessages {
|
|
|
275
275
|
password: {
|
|
276
276
|
show: string;
|
|
277
277
|
hide: string;
|
|
278
|
-
/** Etykiety miernika siły (indeksy 0
|
|
278
|
+
/** Etykiety miernika siły (indeksy 0-4). */
|
|
279
279
|
strength: [string, string, string, string, string];
|
|
280
280
|
};
|
|
281
281
|
rating: {
|
|
@@ -314,6 +314,25 @@ export interface KptMessages {
|
|
|
314
314
|
spinner: {
|
|
315
315
|
label: string;
|
|
316
316
|
};
|
|
317
|
+
/** `kpt-loader`: nazwa pętli i wyniku (region statusu, napis w kapsule `bridge`). */
|
|
318
|
+
loader: {
|
|
319
|
+
label: string;
|
|
320
|
+
success: string;
|
|
321
|
+
error: string;
|
|
322
|
+
};
|
|
323
|
+
/** `kpt-update`: stan pobierania i etykiety akcji. */
|
|
324
|
+
update: {
|
|
325
|
+
pending: string;
|
|
326
|
+
downloading: string;
|
|
327
|
+
/** Interpolacja: {loaded}, {total} (sformatowane bajty). */
|
|
328
|
+
size: string;
|
|
329
|
+
success: string;
|
|
330
|
+
error: string;
|
|
331
|
+
update: string;
|
|
332
|
+
cancel: string;
|
|
333
|
+
open: string;
|
|
334
|
+
retry: string;
|
|
335
|
+
};
|
|
317
336
|
progress: {
|
|
318
337
|
/** Interpolacja: {value}. */
|
|
319
338
|
percent: string;
|
|
@@ -370,7 +389,7 @@ export interface KptMessages {
|
|
|
370
389
|
label: string;
|
|
371
390
|
/** Nazwa slajdu. Interpolacja: {index}, {total}. */
|
|
372
391
|
slideOf: string;
|
|
373
|
-
/** `aria-roledescription` regionu
|
|
392
|
+
/** `aria-roledescription` regionu - czytnik mówi "karuzela" zamiast "region". */
|
|
374
393
|
roleCarousel: string;
|
|
375
394
|
/** `aria-roledescription` slajdu. */
|
|
376
395
|
roleSlide: string;
|
|
@@ -386,7 +405,7 @@ export interface KptMessages {
|
|
|
386
405
|
region: string;
|
|
387
406
|
};
|
|
388
407
|
avatarGroup: {
|
|
389
|
-
/** Nazwa licznika
|
|
408
|
+
/** Nazwa licznika "+N". Interpolacja: {count}. */
|
|
390
409
|
more: string;
|
|
391
410
|
};
|
|
392
411
|
meterGroup: {
|
|
@@ -418,7 +437,7 @@ export interface KptMessages {
|
|
|
418
437
|
table: string;
|
|
419
438
|
clear: string;
|
|
420
439
|
html: string;
|
|
421
|
-
/** Styl bloku
|
|
440
|
+
/** Styl bloku "Normalny" (select). */
|
|
422
441
|
styleNormal: string;
|
|
423
442
|
/** Interpolacja: {level}. */
|
|
424
443
|
styleHeading: string;
|
|
@@ -426,7 +445,7 @@ export interface KptMessages {
|
|
|
426
445
|
htmlSource: string;
|
|
427
446
|
/** Etykieta listy podpowiedzi wzmianek (`@`). */
|
|
428
447
|
mentions: string;
|
|
429
|
-
/** Etykieta
|
|
448
|
+
/** Etykieta "Własny..." przy pickerze koloru. */
|
|
430
449
|
paletteCustom: string;
|
|
431
450
|
/** Przycisk zatwierdzający adres w okienku linku. */
|
|
432
451
|
linkApply: string;
|
|
@@ -492,7 +511,7 @@ export interface KptMessages {
|
|
|
492
511
|
email: string;
|
|
493
512
|
emailPlaceholder: string;
|
|
494
513
|
password: string;
|
|
495
|
-
/** Interpolacja: {min}
|
|
514
|
+
/** Interpolacja: {min} - minimalna długość hasła. */
|
|
496
515
|
passwordHint: string;
|
|
497
516
|
confirmPassword: string;
|
|
498
517
|
remember: string;
|
|
@@ -503,7 +522,7 @@ export interface KptMessages {
|
|
|
503
522
|
signUpSubmit: string;
|
|
504
523
|
resetSubmit: string;
|
|
505
524
|
orContinueWith: string;
|
|
506
|
-
/** Interpolacja: {provider}
|
|
525
|
+
/** Interpolacja: {provider} - nazwa dostawcy (etykieta przycisku). */
|
|
507
526
|
continueWith: string;
|
|
508
527
|
noAccount: string;
|
|
509
528
|
haveAccount: string;
|
|
@@ -515,7 +534,7 @@ export interface KptMessages {
|
|
|
515
534
|
errorMinLength: string;
|
|
516
535
|
errorMismatch: string;
|
|
517
536
|
errorInvalid: string;
|
|
518
|
-
/** Treść panelu promocyjnego
|
|
537
|
+
/** Treść panelu promocyjnego - zachęca do trybu przeciwnego niż bieżący. */
|
|
519
538
|
promo: {
|
|
520
539
|
signInTitle: string;
|
|
521
540
|
signInText: string;
|
|
@@ -528,9 +547,9 @@ export interface KptMessages {
|
|
|
528
547
|
/** Separator dnia. Nazwy dni tygodnia i pełne daty daje `Intl`, nie słownik. */
|
|
529
548
|
today: string;
|
|
530
549
|
yesterday: string;
|
|
531
|
-
/** Interpolacja: {name}
|
|
550
|
+
/** Interpolacja: {name} - pisze jedna osoba. */
|
|
532
551
|
typing: string;
|
|
533
|
-
/** Interpolacja: {count}
|
|
552
|
+
/** Interpolacja: {count} - piszą co najmniej dwie osoby. */
|
|
534
553
|
typingMany: string;
|
|
535
554
|
sending: string;
|
|
536
555
|
sent: string;
|
|
@@ -539,7 +558,7 @@ export interface KptMessages {
|
|
|
539
558
|
failed: string;
|
|
540
559
|
retry: string;
|
|
541
560
|
offline: string;
|
|
542
|
-
/** Interpolacja: {count}
|
|
561
|
+
/** Interpolacja: {count} - wiadomości czekające na wysłanie. */
|
|
543
562
|
pending: string;
|
|
544
563
|
queue: string;
|
|
545
564
|
/** Interpolacja: {count}. */
|
|
@@ -552,11 +571,11 @@ export interface KptMessages {
|
|
|
552
571
|
placeholder: string;
|
|
553
572
|
attach: string;
|
|
554
573
|
removeAttachment: string;
|
|
555
|
-
/** Interpolacja: {author}
|
|
574
|
+
/** Interpolacja: {author} - autor cytowanej wiadomości. */
|
|
556
575
|
replyTo: string;
|
|
557
576
|
cancelReply: string;
|
|
558
577
|
react: string;
|
|
559
|
-
/** Etykiety wybieraka reakcji
|
|
578
|
+
/** Etykiety wybieraka reakcji - kolejność jak w `KPT_CHAT_REACTIONS`. */
|
|
560
579
|
reactLike: string;
|
|
561
580
|
reactLove: string;
|
|
562
581
|
reactSmile: string;
|
|
@@ -564,9 +583,32 @@ export interface KptMessages {
|
|
|
564
583
|
reactSad: string;
|
|
565
584
|
open: string;
|
|
566
585
|
close: string;
|
|
567
|
-
/** Interpolacja: {count}
|
|
586
|
+
/** Interpolacja: {count} - plakietka nieprzeczytanych na docku. */
|
|
568
587
|
unreadBadge: string;
|
|
569
588
|
};
|
|
589
|
+
/** Dyktowanie (kpt-speech-button i mikrofony wbudowane w pola). */
|
|
590
|
+
speech: {
|
|
591
|
+
/** Stała nazwa przycisku mikrofonu - stan niesie `aria-pressed`, nie zmiana etykiety. */
|
|
592
|
+
dictate: string;
|
|
593
|
+
/** Komunikaty regionu `aria-live`: start i koniec nasłuchu. */
|
|
594
|
+
listening: string;
|
|
595
|
+
stopped: string;
|
|
596
|
+
/** iOS: restart bez gestu użytkownika jest zawodny - prosimy o ponowne dotknięcie. */
|
|
597
|
+
tapToContinue: string;
|
|
598
|
+
/** Komunikaty błędów - klucze z `speechErrorMessageKey()` w `@konce-pt/speech`. */
|
|
599
|
+
errors: {
|
|
600
|
+
notAllowed: string;
|
|
601
|
+
serviceNotAllowed: string;
|
|
602
|
+
noSpeech: string;
|
|
603
|
+
audioCapture: string;
|
|
604
|
+
network: string;
|
|
605
|
+
languageNotSupported: string;
|
|
606
|
+
aborted: string;
|
|
607
|
+
unsupported: string;
|
|
608
|
+
insecureContext: string;
|
|
609
|
+
unknown: string;
|
|
610
|
+
};
|
|
611
|
+
};
|
|
570
612
|
}
|
|
571
613
|
export declare const KPT_MESSAGES_EN: KptMessages;
|
|
572
614
|
export declare const KPT_MESSAGES_PL: KptMessages;
|
package/dist/messages.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Kontrakt tłumaczeń Koncept UI + słowniki bazowe (EN, PL).
|
|
3
3
|
*
|
|
4
|
-
* Plik jest celowo wolny od zależności frameworka
|
|
4
|
+
* Plik jest celowo wolny od zależności frameworka - to czysty TypeScript/JSON.
|
|
5
5
|
* Dzięki temu ten sam kontrakt (`KptMessages`) i te same słowniki obsługują
|
|
6
6
|
* `@konce-pt/angular` (serwis na sygnałach) i `@konce-pt/react` (Context + hook).
|
|
7
7
|
*
|
|
@@ -22,17 +22,17 @@ export const KPT_MESSAGES_EN = {
|
|
|
22
22
|
},
|
|
23
23
|
paginator: {
|
|
24
24
|
rowsPerPage: 'Rows:',
|
|
25
|
-
range: '{start}
|
|
25
|
+
range: '{start}-{end} of {total}',
|
|
26
26
|
prevPage: 'Previous page',
|
|
27
27
|
nextPage: 'Next page',
|
|
28
28
|
},
|
|
29
29
|
select: {
|
|
30
|
-
search: 'Search
|
|
30
|
+
search: 'Search...',
|
|
31
31
|
noResults: 'No results',
|
|
32
32
|
removeChip: 'Remove',
|
|
33
33
|
},
|
|
34
34
|
listbox: {
|
|
35
|
-
search: 'Search
|
|
35
|
+
search: 'Search...',
|
|
36
36
|
empty: 'No items',
|
|
37
37
|
},
|
|
38
38
|
dataView: {
|
|
@@ -66,7 +66,7 @@ export const KPT_MESSAGES_EN = {
|
|
|
66
66
|
cluster: 'Group of {count} locations',
|
|
67
67
|
clusterItems: 'Locations in this group',
|
|
68
68
|
fieldRequired: '{label} is required',
|
|
69
|
-
lookingUpAddress: 'Looking up the address
|
|
69
|
+
lookingUpAddress: 'Looking up the address...',
|
|
70
70
|
addressNotFound: 'No address found for this point',
|
|
71
71
|
latitude: 'Latitude',
|
|
72
72
|
longitude: 'Longitude',
|
|
@@ -94,13 +94,13 @@ export const KPT_MESSAGES_EN = {
|
|
|
94
94
|
noPhoto: 'No photo',
|
|
95
95
|
},
|
|
96
96
|
search: {
|
|
97
|
-
placeholder: 'Search for an address
|
|
97
|
+
placeholder: 'Search for an address...',
|
|
98
98
|
label: 'Search for an address',
|
|
99
99
|
results: 'Address suggestions',
|
|
100
100
|
clear: 'Clear the search',
|
|
101
101
|
noResults: 'No matching places',
|
|
102
102
|
minLength: 'Type at least {count} characters',
|
|
103
|
-
searching: 'Searching
|
|
103
|
+
searching: 'Searching...',
|
|
104
104
|
found: '{count} suggestions',
|
|
105
105
|
},
|
|
106
106
|
field: {
|
|
@@ -121,9 +121,9 @@ export const KPT_MESSAGES_EN = {
|
|
|
121
121
|
},
|
|
122
122
|
},
|
|
123
123
|
dataTable: {
|
|
124
|
-
search: 'Search
|
|
124
|
+
search: 'Search...',
|
|
125
125
|
exportCsv: 'Export CSV',
|
|
126
|
-
loading: 'Loading
|
|
126
|
+
loading: 'Loading...',
|
|
127
127
|
empty: 'No data',
|
|
128
128
|
selectAll: 'Select all',
|
|
129
129
|
selectRow: 'Select row',
|
|
@@ -151,7 +151,7 @@ export const KPT_MESSAGES_EN = {
|
|
|
151
151
|
remove: 'Remove',
|
|
152
152
|
},
|
|
153
153
|
chipsInput: {
|
|
154
|
-
placeholder: 'Add and press Enter
|
|
154
|
+
placeholder: 'Add and press Enter...',
|
|
155
155
|
added: 'Added: {value}',
|
|
156
156
|
removed: 'Removed: {value}',
|
|
157
157
|
duplicate: 'Already on the list: {value}',
|
|
@@ -171,7 +171,7 @@ export const KPT_MESSAGES_EN = {
|
|
|
171
171
|
rangeEnd: '{date}, end of range',
|
|
172
172
|
inRange: '{date}, in range',
|
|
173
173
|
pickEnd: 'Start: {date}. Choose the end date.',
|
|
174
|
-
picked: 'Range: {start}
|
|
174
|
+
picked: 'Range: {start} - {end}',
|
|
175
175
|
},
|
|
176
176
|
chart: {
|
|
177
177
|
label: 'Chart',
|
|
@@ -254,6 +254,22 @@ export const KPT_MESSAGES_EN = {
|
|
|
254
254
|
spinner: {
|
|
255
255
|
label: 'Loading',
|
|
256
256
|
},
|
|
257
|
+
loader: {
|
|
258
|
+
label: 'Loading',
|
|
259
|
+
success: 'Done',
|
|
260
|
+
error: 'Something went wrong',
|
|
261
|
+
},
|
|
262
|
+
update: {
|
|
263
|
+
pending: 'Waiting to download',
|
|
264
|
+
downloading: 'Downloading...',
|
|
265
|
+
size: '{loaded} of {total}',
|
|
266
|
+
success: 'Updated',
|
|
267
|
+
error: 'Download interrupted',
|
|
268
|
+
update: 'Update',
|
|
269
|
+
cancel: 'Cancel',
|
|
270
|
+
open: 'Open',
|
|
271
|
+
retry: 'Retry',
|
|
272
|
+
},
|
|
257
273
|
progress: {
|
|
258
274
|
percent: '{value}%',
|
|
259
275
|
fraction: '{value} / {max}',
|
|
@@ -340,7 +356,7 @@ export const KPT_MESSAGES_EN = {
|
|
|
340
356
|
linkPrompt: 'URL:',
|
|
341
357
|
htmlSource: 'HTML source',
|
|
342
358
|
mentions: 'Mention suggestions',
|
|
343
|
-
paletteCustom: 'Custom
|
|
359
|
+
paletteCustom: 'Custom...',
|
|
344
360
|
linkApply: 'Insert link',
|
|
345
361
|
swatches: {
|
|
346
362
|
black: 'Black',
|
|
@@ -376,7 +392,7 @@ export const KPT_MESSAGES_EN = {
|
|
|
376
392
|
alignRight: 'Right',
|
|
377
393
|
mergeCells: 'Merge cells',
|
|
378
394
|
splitCell: 'Split cell',
|
|
379
|
-
border: 'Border
|
|
395
|
+
border: 'Border...',
|
|
380
396
|
deleteTable: 'Delete table',
|
|
381
397
|
},
|
|
382
398
|
border: {
|
|
@@ -386,7 +402,7 @@ export const KPT_MESSAGES_EN = {
|
|
|
386
402
|
thin: 'Thin',
|
|
387
403
|
medium: 'Medium',
|
|
388
404
|
thick: 'Thick',
|
|
389
|
-
customColor: 'Color
|
|
405
|
+
customColor: 'Color...',
|
|
390
406
|
},
|
|
391
407
|
},
|
|
392
408
|
auth: {
|
|
@@ -430,8 +446,8 @@ export const KPT_MESSAGES_EN = {
|
|
|
430
446
|
chat: {
|
|
431
447
|
today: 'Today',
|
|
432
448
|
yesterday: 'Yesterday',
|
|
433
|
-
typing: '{name} is typing
|
|
434
|
-
typingMany: '{count} people are typing
|
|
449
|
+
typing: '{name} is typing...',
|
|
450
|
+
typingMany: '{count} people are typing...',
|
|
435
451
|
sending: 'Sending',
|
|
436
452
|
sent: 'Sent',
|
|
437
453
|
delivered: 'Delivered',
|
|
@@ -446,7 +462,7 @@ export const KPT_MESSAGES_EN = {
|
|
|
446
462
|
empty: 'No messages yet',
|
|
447
463
|
history: 'Conversation history',
|
|
448
464
|
send: 'Send',
|
|
449
|
-
placeholder: 'Write a message
|
|
465
|
+
placeholder: 'Write a message...',
|
|
450
466
|
attach: 'Attach a file',
|
|
451
467
|
removeAttachment: 'Remove attachment',
|
|
452
468
|
replyTo: 'Replying to {author}',
|
|
@@ -461,6 +477,24 @@ export const KPT_MESSAGES_EN = {
|
|
|
461
477
|
close: 'Close chat',
|
|
462
478
|
unreadBadge: '{count} unread messages',
|
|
463
479
|
},
|
|
480
|
+
speech: {
|
|
481
|
+
dictate: 'Dictate',
|
|
482
|
+
listening: 'Listening...',
|
|
483
|
+
stopped: 'Dictation stopped',
|
|
484
|
+
tapToContinue: 'Tap the microphone to continue',
|
|
485
|
+
errors: {
|
|
486
|
+
notAllowed: 'Microphone access was denied. Allow it in the browser settings.',
|
|
487
|
+
serviceNotAllowed: 'Speech recognition is blocked in this browser.',
|
|
488
|
+
noSpeech: 'No speech was detected.',
|
|
489
|
+
audioCapture: 'No microphone was found, or another app is using it.',
|
|
490
|
+
network: 'Speech recognition is unavailable in this browser.',
|
|
491
|
+
languageNotSupported: 'This language is not supported for dictation.',
|
|
492
|
+
aborted: 'Dictation was interrupted.',
|
|
493
|
+
unsupported: 'This browser does not support dictation.',
|
|
494
|
+
insecureContext: 'Dictation requires a secure connection (https).',
|
|
495
|
+
unknown: 'Dictation failed. Try again.',
|
|
496
|
+
},
|
|
497
|
+
},
|
|
464
498
|
};
|
|
465
499
|
export const KPT_MESSAGES_PL = {
|
|
466
500
|
common: {
|
|
@@ -474,17 +508,17 @@ export const KPT_MESSAGES_PL = {
|
|
|
474
508
|
},
|
|
475
509
|
paginator: {
|
|
476
510
|
rowsPerPage: 'Wierszy:',
|
|
477
|
-
range: '{start}
|
|
511
|
+
range: '{start}-{end} z {total}',
|
|
478
512
|
prevPage: 'Poprzednia strona',
|
|
479
513
|
nextPage: 'Następna strona',
|
|
480
514
|
},
|
|
481
515
|
select: {
|
|
482
|
-
search: 'Szukaj
|
|
516
|
+
search: 'Szukaj...',
|
|
483
517
|
noResults: 'Brak wyników',
|
|
484
518
|
removeChip: 'Usuń',
|
|
485
519
|
},
|
|
486
520
|
listbox: {
|
|
487
|
-
search: 'Szukaj
|
|
521
|
+
search: 'Szukaj...',
|
|
488
522
|
empty: 'Brak pozycji',
|
|
489
523
|
},
|
|
490
524
|
dataView: {
|
|
@@ -517,8 +551,8 @@ export const KPT_MESSAGES_PL = {
|
|
|
517
551
|
hideCategory: 'Ukryj: {category}',
|
|
518
552
|
cluster: 'Grupa {count} lokalizacji',
|
|
519
553
|
clusterItems: 'Lokalizacje w tej grupie',
|
|
520
|
-
fieldRequired: 'Pole
|
|
521
|
-
lookingUpAddress: 'Szukam adresu
|
|
554
|
+
fieldRequired: 'Pole "{label}" jest wymagane',
|
|
555
|
+
lookingUpAddress: 'Szukam adresu...',
|
|
522
556
|
addressNotFound: 'Nie znaleziono adresu dla tego punktu',
|
|
523
557
|
latitude: 'Szerokość',
|
|
524
558
|
longitude: 'Długość',
|
|
@@ -546,13 +580,13 @@ export const KPT_MESSAGES_PL = {
|
|
|
546
580
|
noPhoto: 'Brak zdjęcia',
|
|
547
581
|
},
|
|
548
582
|
search: {
|
|
549
|
-
placeholder: 'Szukaj adresu
|
|
583
|
+
placeholder: 'Szukaj adresu...',
|
|
550
584
|
label: 'Szukaj adresu',
|
|
551
585
|
results: 'Podpowiedzi adresów',
|
|
552
586
|
clear: 'Wyczyść wyszukiwanie',
|
|
553
587
|
noResults: 'Brak pasujących miejsc',
|
|
554
588
|
minLength: 'Wpisz więcej znaków (minimum: {count})',
|
|
555
|
-
searching: 'Szukam
|
|
589
|
+
searching: 'Szukam...',
|
|
556
590
|
found: 'Podpowiedzi: {count}',
|
|
557
591
|
},
|
|
558
592
|
field: {
|
|
@@ -573,9 +607,9 @@ export const KPT_MESSAGES_PL = {
|
|
|
573
607
|
},
|
|
574
608
|
},
|
|
575
609
|
dataTable: {
|
|
576
|
-
search: 'Szukaj
|
|
610
|
+
search: 'Szukaj...',
|
|
577
611
|
exportCsv: 'Eksport CSV',
|
|
578
|
-
loading: 'Ładowanie
|
|
612
|
+
loading: 'Ładowanie...',
|
|
579
613
|
empty: 'Brak danych',
|
|
580
614
|
selectAll: 'Zaznacz wszystkie',
|
|
581
615
|
selectRow: 'Zaznacz wiersz',
|
|
@@ -603,7 +637,7 @@ export const KPT_MESSAGES_PL = {
|
|
|
603
637
|
remove: 'Usuń',
|
|
604
638
|
},
|
|
605
639
|
chipsInput: {
|
|
606
|
-
placeholder: 'Dodaj i naciśnij Enter
|
|
640
|
+
placeholder: 'Dodaj i naciśnij Enter...',
|
|
607
641
|
added: 'Dodano: {value}',
|
|
608
642
|
removed: 'Usunięto: {value}',
|
|
609
643
|
duplicate: 'Już jest na liście: {value}',
|
|
@@ -623,7 +657,7 @@ export const KPT_MESSAGES_PL = {
|
|
|
623
657
|
rangeEnd: '{date}, koniec zakresu',
|
|
624
658
|
inRange: '{date}, w zakresie',
|
|
625
659
|
pickEnd: 'Początek: {date}. Wybierz datę końcową.',
|
|
626
|
-
picked: 'Zakres: {start}
|
|
660
|
+
picked: 'Zakres: {start} - {end}',
|
|
627
661
|
},
|
|
628
662
|
chart: {
|
|
629
663
|
label: 'Wykres',
|
|
@@ -706,6 +740,22 @@ export const KPT_MESSAGES_PL = {
|
|
|
706
740
|
spinner: {
|
|
707
741
|
label: 'Ładowanie',
|
|
708
742
|
},
|
|
743
|
+
loader: {
|
|
744
|
+
label: 'Ładowanie',
|
|
745
|
+
success: 'Gotowe',
|
|
746
|
+
error: 'Coś poszło nie tak',
|
|
747
|
+
},
|
|
748
|
+
update: {
|
|
749
|
+
pending: 'Oczekuje na pobranie',
|
|
750
|
+
downloading: 'Pobieranie...',
|
|
751
|
+
size: '{loaded} z {total}',
|
|
752
|
+
success: 'Zaktualizowano',
|
|
753
|
+
error: 'Pobieranie przerwane',
|
|
754
|
+
update: 'Aktualizuj',
|
|
755
|
+
cancel: 'Anuluj',
|
|
756
|
+
open: 'Otwórz',
|
|
757
|
+
retry: 'Ponów',
|
|
758
|
+
},
|
|
709
759
|
progress: {
|
|
710
760
|
percent: '{value}%',
|
|
711
761
|
fraction: '{value} / {max}',
|
|
@@ -792,7 +842,7 @@ export const KPT_MESSAGES_PL = {
|
|
|
792
842
|
linkPrompt: 'Adres URL:',
|
|
793
843
|
htmlSource: 'Źródło HTML',
|
|
794
844
|
mentions: 'Podpowiedzi wzmianek',
|
|
795
|
-
paletteCustom: 'Własny
|
|
845
|
+
paletteCustom: 'Własny...',
|
|
796
846
|
linkApply: 'Wstaw link',
|
|
797
847
|
swatches: {
|
|
798
848
|
black: 'Czarny',
|
|
@@ -828,7 +878,7 @@ export const KPT_MESSAGES_PL = {
|
|
|
828
878
|
alignRight: 'Do prawej',
|
|
829
879
|
mergeCells: 'Scal komórki',
|
|
830
880
|
splitCell: 'Podziel komórkę',
|
|
831
|
-
border: 'Obramowanie
|
|
881
|
+
border: 'Obramowanie...',
|
|
832
882
|
deleteTable: 'Usuń tabelę',
|
|
833
883
|
},
|
|
834
884
|
border: {
|
|
@@ -838,7 +888,7 @@ export const KPT_MESSAGES_PL = {
|
|
|
838
888
|
thin: 'Cienkie',
|
|
839
889
|
medium: 'Średnie',
|
|
840
890
|
thick: 'Grube',
|
|
841
|
-
customColor: 'Kolor
|
|
891
|
+
customColor: 'Kolor...',
|
|
842
892
|
},
|
|
843
893
|
},
|
|
844
894
|
auth: {
|
|
@@ -882,8 +932,8 @@ export const KPT_MESSAGES_PL = {
|
|
|
882
932
|
chat: {
|
|
883
933
|
today: 'Dziś',
|
|
884
934
|
yesterday: 'Wczoraj',
|
|
885
|
-
typing: '{name} pisze
|
|
886
|
-
typingMany: '{count} osoby pisz
|
|
935
|
+
typing: '{name} pisze...',
|
|
936
|
+
typingMany: '{count} osoby piszą...',
|
|
887
937
|
sending: 'Wysyłanie',
|
|
888
938
|
sent: 'Wysłano',
|
|
889
939
|
delivered: 'Dostarczono',
|
|
@@ -898,7 +948,7 @@ export const KPT_MESSAGES_PL = {
|
|
|
898
948
|
empty: 'Brak wiadomości',
|
|
899
949
|
history: 'Historia rozmowy',
|
|
900
950
|
send: 'Wyślij',
|
|
901
|
-
placeholder: 'Napisz wiadomo
|
|
951
|
+
placeholder: 'Napisz wiadomość...',
|
|
902
952
|
attach: 'Dołącz plik',
|
|
903
953
|
removeAttachment: 'Usuń załącznik',
|
|
904
954
|
replyTo: 'Odpowiedź do: {author}',
|
|
@@ -913,4 +963,22 @@ export const KPT_MESSAGES_PL = {
|
|
|
913
963
|
close: 'Zamknij czat',
|
|
914
964
|
unreadBadge: '{count} nieprzeczytanych wiadomości',
|
|
915
965
|
},
|
|
966
|
+
speech: {
|
|
967
|
+
dictate: 'Dyktuj',
|
|
968
|
+
listening: 'Słucham...',
|
|
969
|
+
stopped: 'Dyktowanie zatrzymane',
|
|
970
|
+
tapToContinue: 'Dotknij mikrofonu, aby kontynuować',
|
|
971
|
+
errors: {
|
|
972
|
+
notAllowed: 'Brak dostępu do mikrofonu. Zezwól na niego w ustawieniach przeglądarki.',
|
|
973
|
+
serviceNotAllowed: 'Rozpoznawanie mowy jest zablokowane w tej przeglądarce.',
|
|
974
|
+
noSpeech: 'Nie usłyszano mowy.',
|
|
975
|
+
audioCapture: 'Nie znaleziono mikrofonu albo używa go inna aplikacja.',
|
|
976
|
+
network: 'Rozpoznawanie mowy jest niedostępne w tej przeglądarce.',
|
|
977
|
+
languageNotSupported: 'Ten język nie jest obsługiwany przy dyktowaniu.',
|
|
978
|
+
aborted: 'Dyktowanie zostało przerwane.',
|
|
979
|
+
unsupported: 'Ta przeglądarka nie obsługuje dyktowania.',
|
|
980
|
+
insecureContext: 'Dyktowanie wymaga bezpiecznego połączenia (https).',
|
|
981
|
+
unknown: 'Dyktowanie nie powiodło się. Spróbuj ponownie.',
|
|
982
|
+
},
|
|
983
|
+
},
|
|
916
984
|
};
|
package/dist/translate.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Rdzeń tłumaczeń
|
|
2
|
+
* Rdzeń tłumaczeń - czysty TypeScript, bez zależności od frameworka.
|
|
3
3
|
*
|
|
4
4
|
* Angular owija te funkcje w serwis na sygnałach (`KptI18n`), React w Context
|
|
5
5
|
* i hook (`useKptI18n`). Semantyka wyszukiwania, fallbacku i interpolacji żyje
|
package/dist/types.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { KptLocale, KptMessages } from './messages.ts';
|
|
2
|
-
/** Głęboko-opcjonalna wersja typu
|
|
2
|
+
/** Głęboko-opcjonalna wersja typu - dla nadpisań/częściowych słowników. */
|
|
3
3
|
export type DeepPartial<T> = {
|
|
4
4
|
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
5
5
|
};
|
|
6
|
-
/** Konfiguracja i18n
|
|
6
|
+
/** Konfiguracja i18n - wspólna dla portu Angulara i Reacta. */
|
|
7
7
|
export interface KptI18nConfig {
|
|
8
8
|
/** Język początkowy (domyślnie 'en'). */
|
|
9
9
|
locale?: KptLocale;
|
|
@@ -19,8 +19,8 @@ type LeafPaths<T, Prefix extends string = ''> = {
|
|
|
19
19
|
[K in keyof T & string]: T[K] extends string | readonly string[] ? `${Prefix}${K}` : LeafPaths<T[K], `${Prefix}${K}.`>;
|
|
20
20
|
}[keyof T & string];
|
|
21
21
|
/**
|
|
22
|
-
* Klucz tłumaczenia słownika bazowego (`'paginator.range'`, `'common.close'
|
|
23
|
-
* z podpowiedziami w edytorze, ale nadal też dowolny napis
|
|
22
|
+
* Klucz tłumaczenia słownika bazowego (`'paginator.range'`, `'common.close'`...). `t()` przyjmuje go
|
|
23
|
+
* z podpowiedziami w edytorze, ale nadal też dowolny napis - klucze składane dynamicznie i klucze
|
|
24
24
|
* własnych słowników aplikacji.
|
|
25
25
|
*/
|
|
26
26
|
export type KptMessageKey = LeafPaths<KptMessages>;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@konce-pt/i18n",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Translation contract and base dictionaries (EN, PL) for Koncept UI
|
|
3
|
+
"version": "0.14.0",
|
|
4
|
+
"description": "Translation contract and base dictionaries (EN, PL) for Koncept UI - shared by the Angular and React ports. Pure TypeScript, zero runtime dependencies.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "konce.pt",
|
|
7
7
|
"homepage": "https://ui.konce.pt/",
|